@bbearai/react-native 0.9.3 → 0.10.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.
Files changed (3) hide show
  1. package/dist/index.js +901 -381
  2. package/dist/index.mjs +916 -385
  3. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -14085,7 +14085,9 @@ var BugBearClient = class {
14085
14085
  p_tester_id: testerInfo.id,
14086
14086
  p_focus_area: options.focusArea || null,
14087
14087
  p_track: options.track || null,
14088
- p_platform: options.platform || null
14088
+ p_platform: options.platform || null,
14089
+ p_session_type: options.sessionType || "exploratory",
14090
+ p_task_id: options.taskId || null
14089
14091
  });
14090
14092
  if (error) {
14091
14093
  console.error("BugBear: Failed to start session", formatPgError(error));
@@ -14269,6 +14271,45 @@ var BugBearClient = class {
14269
14271
  return { success: false, error: message };
14270
14272
  }
14271
14273
  }
14274
+ // ============================================
14275
+ // QA Tasks (Ad Hoc Testing)
14276
+ // ============================================
14277
+ /**
14278
+ * Get active QA tasks for the project
14279
+ */
14280
+ async getTasks(status = "active") {
14281
+ try {
14282
+ await this.ensureReady();
14283
+ const { data, error } = await this.supabase.rpc("list_qa_tasks", {
14284
+ p_project_id: this.config.projectId,
14285
+ p_status: status
14286
+ });
14287
+ if (error) {
14288
+ console.error("BugBear: Failed to fetch tasks", formatPgError(error));
14289
+ return [];
14290
+ }
14291
+ return (data || []).map((t) => this.transformTask(t));
14292
+ } catch (err) {
14293
+ console.error("BugBear: Error fetching tasks", err);
14294
+ return [];
14295
+ }
14296
+ }
14297
+ /**
14298
+ * Transform database task to QATask type
14299
+ */
14300
+ transformTask(data) {
14301
+ return {
14302
+ id: data.id,
14303
+ projectId: data.project_id,
14304
+ title: data.title,
14305
+ description: data.description || void 0,
14306
+ trackId: data.track_id || void 0,
14307
+ priority: data.priority,
14308
+ status: data.status,
14309
+ createdAt: data.created_at,
14310
+ updatedAt: data.updated_at
14311
+ };
14312
+ }
14272
14313
  /**
14273
14314
  * Transform database session to QASession type
14274
14315
  */
@@ -14280,6 +14321,8 @@ var BugBearClient = class {
14280
14321
  focusArea: data.focus_area,
14281
14322
  track: data.track,
14282
14323
  platform: data.platform,
14324
+ sessionType: data.session_type || "exploratory",
14325
+ taskId: data.task_id || void 0,
14283
14326
  startedAt: data.started_at,
14284
14327
  endedAt: data.ended_at,
14285
14328
  notes: data.notes,
@@ -14861,7 +14904,13 @@ function BugBearProvider({ config, children, appVersion, enabled = true }) {
14861
14904
  }, [client, activeSession]);
14862
14905
  const addFinding = useCallback(async (options) => {
14863
14906
  if (!client || !activeSession) return { success: false, error: "No active session" };
14864
- const result = await client.addFinding(activeSession.id, options);
14907
+ const enhanced = contextCapture.getEnhancedContext();
14908
+ const enriched = {
14909
+ ...options,
14910
+ consoleLogs: options.consoleLogs ?? enhanced.consoleLogs,
14911
+ networkSnapshot: options.networkSnapshot ?? enhanced.networkRequests
14912
+ };
14913
+ const result = await client.addFinding(activeSession.id, enriched);
14865
14914
  if (result.success && result.finding) {
14866
14915
  setSessionFindings((prev) => [...prev, result.finding]);
14867
14916
  setActiveSession((prev) => prev ? { ...prev, findingsCount: prev.findingsCount + 1 } : null);
@@ -15162,21 +15211,21 @@ function BugBearProvider({ config, children, appVersion, enabled = true }) {
15162
15211
  }
15163
15212
 
15164
15213
  // src/BugBearButton.tsx
15165
- import React22, { useState as useState19, useRef as useRef8, useEffect as useEffect13, useMemo as useMemo16, useCallback as useCallback7 } from "react";
15214
+ import React23, { useState as useState20, useRef as useRef9, useEffect as useEffect14, useMemo as useMemo16, useCallback as useCallback8 } from "react";
15166
15215
  import {
15167
- View as View22,
15168
- Text as Text20,
15216
+ View as View23,
15217
+ Text as Text21,
15169
15218
  Image as Image4,
15170
- TouchableOpacity as TouchableOpacity19,
15219
+ TouchableOpacity as TouchableOpacity20,
15171
15220
  ScrollView as ScrollView4,
15172
- StyleSheet as StyleSheet22,
15173
- Dimensions as Dimensions3,
15221
+ StyleSheet as StyleSheet23,
15222
+ Dimensions as Dimensions4,
15174
15223
  KeyboardAvoidingView,
15175
- Platform as Platform6,
15176
- PanResponder as PanResponder2,
15177
- Animated as Animated4,
15224
+ Platform as Platform7,
15225
+ PanResponder as PanResponder3,
15226
+ Animated as Animated5,
15178
15227
  ActivityIndicator as ActivityIndicator3,
15179
- Keyboard as Keyboard4,
15228
+ Keyboard as Keyboard5,
15180
15229
  BackHandler
15181
15230
  } from "react-native";
15182
15231
 
@@ -15322,7 +15371,7 @@ var s = StyleSheet2.create({
15322
15371
  // src/widget/screens/HomeScreen.tsx
15323
15372
  function HomeScreen({ nav }) {
15324
15373
  const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading, activeSession, sessionFindings, refreshSession, widgetMode, widgetColorScheme } = useBugBear();
15325
- const styles6 = useMemo(() => createStyles(), [widgetColorScheme]);
15374
+ const styles7 = useMemo(() => createStyles(), [widgetColorScheme]);
15326
15375
  const [sessionElapsed, setSessionElapsed] = useState2(0);
15327
15376
  const timerRef = useRef3(null);
15328
15377
  useEffect3(() => {
@@ -15351,98 +15400,98 @@ function HomeScreen({ nav }) {
15351
15400
  return /* @__PURE__ */ React3.createElement(View3, null, unreadCount > 0 ? /* @__PURE__ */ React3.createElement(
15352
15401
  TouchableOpacity,
15353
15402
  {
15354
- style: [styles6.heroBanner, styles6.heroBannerMessages],
15403
+ style: [styles7.heroBanner, styles7.heroBannerMessages],
15355
15404
  onPress: () => nav.push({ name: "MESSAGE_LIST" }),
15356
15405
  activeOpacity: 0.8
15357
15406
  },
15358
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroCount }, unreadCount),
15359
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
15360
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroAction }, "View Messages \u2192")
15361
- ) : /* @__PURE__ */ React3.createElement(View3, { style: [styles6.heroBanner, styles6.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearEmoji }, "\u{1F4AC}"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearTitle }, "Help us improve"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearSub }, "Report bugs, share ideas, and track your submissions")), /* @__PURE__ */ React3.createElement(View3, { style: styles6.actionGrid }, /* @__PURE__ */ React3.createElement(
15407
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroCount }, unreadCount),
15408
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
15409
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroAction }, "View Messages \u2192")
15410
+ ) : /* @__PURE__ */ React3.createElement(View3, { style: [styles7.heroBanner, styles7.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearEmoji }, "\u{1F4AC}"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearTitle }, "Help us improve"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearSub }, "Report bugs, share ideas, and track your submissions")), /* @__PURE__ */ React3.createElement(View3, { style: styles7.actionGrid }, /* @__PURE__ */ React3.createElement(
15362
15411
  TouchableOpacity,
15363
15412
  {
15364
- style: styles6.actionCard,
15413
+ style: styles7.actionCard,
15365
15414
  onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
15366
15415
  activeOpacity: 0.7
15367
15416
  },
15368
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F41B}"),
15369
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Report Bug")
15417
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F41B}"),
15418
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Report Bug")
15370
15419
  ), /* @__PURE__ */ React3.createElement(
15371
15420
  TouchableOpacity,
15372
15421
  {
15373
- style: styles6.actionCard,
15422
+ style: styles7.actionCard,
15374
15423
  onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
15375
15424
  activeOpacity: 0.7
15376
15425
  },
15377
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4A1}"),
15378
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Share Feedback")
15426
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4A1}"),
15427
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Share Feedback")
15379
15428
  ), /* @__PURE__ */ React3.createElement(
15380
15429
  TouchableOpacity,
15381
15430
  {
15382
- style: styles6.actionCard,
15431
+ style: styles7.actionCard,
15383
15432
  onPress: () => nav.push({ name: "MESSAGE_LIST" }),
15384
15433
  activeOpacity: 0.7
15385
15434
  },
15386
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4AC}"),
15387
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Messages"),
15388
- unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles6.actionBadge, styles6.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionBadgeText }, unreadCount))
15435
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4AC}"),
15436
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Messages"),
15437
+ unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles7.actionBadge, styles7.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionBadgeText }, unreadCount))
15389
15438
  ), /* @__PURE__ */ React3.createElement(
15390
15439
  TouchableOpacity,
15391
15440
  {
15392
- style: styles6.actionCard,
15441
+ style: styles7.actionCard,
15393
15442
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
15394
15443
  activeOpacity: 0.7
15395
15444
  },
15396
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4CB}"),
15397
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "My Issues"),
15398
- issueCounts.open > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles6.actionBadge, styles6.actionBadgeIssue] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionBadgeText }, issueCounts.open))
15399
- )), /* @__PURE__ */ React3.createElement(View3, { style: styles6.issueGrid }, /* @__PURE__ */ React3.createElement(
15445
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4CB}"),
15446
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "My Issues"),
15447
+ issueCounts.open > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles7.actionBadge, styles7.actionBadgeIssue] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionBadgeText }, issueCounts.open))
15448
+ )), /* @__PURE__ */ React3.createElement(View3, { style: styles7.issueGrid }, /* @__PURE__ */ React3.createElement(
15400
15449
  TouchableOpacity,
15401
15450
  {
15402
- style: [styles6.issueCard, styles6.issueCardOpen],
15451
+ style: [styles7.issueCard, styles7.issueCardOpen],
15403
15452
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
15404
15453
  activeOpacity: 0.7
15405
15454
  },
15406
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountOpen }, issueCounts.open),
15407
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Open")
15455
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountOpen }, issueCounts.open),
15456
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Open")
15408
15457
  ), /* @__PURE__ */ React3.createElement(
15409
15458
  TouchableOpacity,
15410
15459
  {
15411
- style: [styles6.issueCard, styles6.issueCardDone],
15460
+ style: [styles7.issueCard, styles7.issueCardDone],
15412
15461
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
15413
15462
  activeOpacity: 0.7
15414
15463
  },
15415
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountDone }, issueCounts.done),
15416
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Done")
15464
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountDone }, issueCounts.done),
15465
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Done")
15417
15466
  ), /* @__PURE__ */ React3.createElement(
15418
15467
  TouchableOpacity,
15419
15468
  {
15420
- style: [styles6.issueCard, styles6.issueCardReopened],
15469
+ style: [styles7.issueCard, styles7.issueCardReopened],
15421
15470
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
15422
15471
  activeOpacity: 0.7
15423
15472
  },
15424
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountReopened }, issueCounts.reopened),
15425
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Reopened")
15473
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountReopened }, issueCounts.reopened),
15474
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Reopened")
15426
15475
  )), dashboardUrl && /* @__PURE__ */ React3.createElement(
15427
15476
  TouchableOpacity,
15428
15477
  {
15429
- style: styles6.webAppLink,
15478
+ style: styles7.webAppLink,
15430
15479
  onPress: () => Linking.openURL(dashboardUrl),
15431
15480
  activeOpacity: 0.7
15432
15481
  },
15433
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppIcon }, "\u{1F310}"),
15434
- /* @__PURE__ */ React3.createElement(View3, { style: styles6.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppSub }, "View your submissions & updates")),
15435
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppArrow }, "\u2192")
15482
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppIcon }, "\u{1F310}"),
15483
+ /* @__PURE__ */ React3.createElement(View3, { style: styles7.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppSub }, "View your submissions & updates")),
15484
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppArrow }, "\u2192")
15436
15485
  ), /* @__PURE__ */ React3.createElement(
15437
15486
  TouchableOpacity,
15438
15487
  {
15439
- style: styles6.refreshButton,
15488
+ style: styles7.refreshButton,
15440
15489
  onPress: () => {
15441
15490
  refreshThreads();
15442
15491
  refreshIssueCounts();
15443
15492
  }
15444
15493
  },
15445
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.refreshText }, "\u21BB Refresh")
15494
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.refreshText }, "\u21BB Refresh")
15446
15495
  ));
15447
15496
  }
15448
15497
  const formatTimer = (s2) => {
@@ -15459,130 +15508,140 @@ function HomeScreen({ nav }) {
15459
15508
  return /* @__PURE__ */ React3.createElement(View3, null, pendingCount > 0 ? /* @__PURE__ */ React3.createElement(
15460
15509
  TouchableOpacity,
15461
15510
  {
15462
- style: [styles6.heroBanner, styles6.heroBannerTests],
15511
+ style: [styles7.heroBanner, styles7.heroBannerTests],
15463
15512
  onPress: () => nav.push({ name: "TEST_DETAIL" }),
15464
15513
  activeOpacity: 0.8
15465
15514
  },
15466
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroCount }, pendingCount),
15467
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroLabel }, "test", pendingCount !== 1 ? "s" : "", " waiting"),
15468
- retestCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles6.retestPill }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.retestPillText }, "\u{1F504} ", retestCount, " retest", retestCount !== 1 ? "s" : "")),
15469
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroAction }, "Start Testing \u2192")
15515
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroCount }, pendingCount),
15516
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroLabel }, "test", pendingCount !== 1 ? "s" : "", " waiting"),
15517
+ retestCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles7.retestPill }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.retestPillText }, "\u{1F504} ", retestCount, " retest", retestCount !== 1 ? "s" : "")),
15518
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroAction }, "Start Testing \u2192")
15470
15519
  ) : unreadCount > 0 ? /* @__PURE__ */ React3.createElement(
15471
15520
  TouchableOpacity,
15472
15521
  {
15473
- style: [styles6.heroBanner, styles6.heroBannerMessages],
15522
+ style: [styles7.heroBanner, styles7.heroBannerMessages],
15474
15523
  onPress: () => nav.push({ name: "MESSAGE_LIST" }),
15475
15524
  activeOpacity: 0.8
15476
15525
  },
15477
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroCount }, unreadCount),
15478
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
15479
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroAction }, "View Messages \u2192")
15480
- ) : /* @__PURE__ */ React3.createElement(View3, { style: [styles6.heroBanner, styles6.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearEmoji }, "\u2705"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearTitle }, "All caught up!"), totalTests > 0 && /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearSub }, completedCount, "/", totalTests, " tests completed")), activeSession && activeSession.status === "active" ? /* @__PURE__ */ React3.createElement(
15526
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroCount }, unreadCount),
15527
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
15528
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroAction }, "View Messages \u2192")
15529
+ ) : /* @__PURE__ */ React3.createElement(View3, { style: [styles7.heroBanner, styles7.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearEmoji }, "\u2705"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearTitle }, "All caught up!"), totalTests > 0 && /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearSub }, completedCount, "/", totalTests, " tests completed")), activeSession && activeSession.status === "active" ? /* @__PURE__ */ React3.createElement(
15481
15530
  TouchableOpacity,
15482
15531
  {
15483
- style: styles6.sessionCardActive,
15532
+ style: styles7.sessionCardActive,
15484
15533
  onPress: () => nav.push({ name: "SESSION_ACTIVE" }),
15485
15534
  activeOpacity: 0.8
15486
15535
  },
15487
- /* @__PURE__ */ React3.createElement(View3, { style: styles6.sessionDot }),
15488
- /* @__PURE__ */ React3.createElement(View3, { style: styles6.sessionCardContent }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardTitle, numberOfLines: 1 }, activeSession.focusArea || "QA Session"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardMeta }, formatTimer(sessionElapsed), " \xB7 ", sessionFindings.length, " finding", sessionFindings.length !== 1 ? "s" : "")),
15489
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardAction }, "Resume \u2192")
15536
+ /* @__PURE__ */ React3.createElement(View3, { style: styles7.sessionDot }),
15537
+ /* @__PURE__ */ React3.createElement(View3, { style: styles7.sessionCardContent }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardTitle, numberOfLines: 1 }, activeSession.focusArea || "QA Session"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardMeta }, formatTimer(sessionElapsed), " \xB7 ", sessionFindings.length, " finding", sessionFindings.length !== 1 ? "s" : "")),
15538
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardAction }, "Resume \u2192")
15490
15539
  ) : /* @__PURE__ */ React3.createElement(
15491
15540
  TouchableOpacity,
15492
15541
  {
15493
- style: styles6.sessionCardInactive,
15542
+ style: styles7.sessionCardInactive,
15494
15543
  onPress: () => nav.push({ name: "SESSION_START" }),
15495
15544
  activeOpacity: 0.7
15496
15545
  },
15497
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardIcon }, "\u{1F50D}"),
15498
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardLabel }, "Start QA Session"),
15499
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardArrow }, "\u2192")
15500
- ), /* @__PURE__ */ React3.createElement(View3, { style: styles6.actionGrid }, /* @__PURE__ */ React3.createElement(
15546
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardIcon }, "\u{1F50D}"),
15547
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardLabel }, "Start QA Session"),
15548
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardArrow }, "\u2192")
15549
+ ), !activeSession && nav.startAdHoc && /* @__PURE__ */ React3.createElement(
15550
+ TouchableOpacity,
15551
+ {
15552
+ style: styles7.quickTestCard,
15553
+ onPress: () => nav.startAdHoc?.(),
15554
+ activeOpacity: 0.7
15555
+ },
15556
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.quickTestIcon }, "\u26A1"),
15557
+ /* @__PURE__ */ React3.createElement(View3, { style: styles7.quickTestContent }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.quickTestTitle }, "Quick Test"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.quickTestSub }, "Ad hoc explore & report")),
15558
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardArrow }, "\u2192")
15559
+ ), /* @__PURE__ */ React3.createElement(View3, { style: styles7.actionGrid }, /* @__PURE__ */ React3.createElement(
15501
15560
  TouchableOpacity,
15502
15561
  {
15503
- style: styles6.actionCard,
15562
+ style: styles7.actionCard,
15504
15563
  onPress: () => nav.push({ name: "TEST_LIST" }),
15505
15564
  activeOpacity: 0.7
15506
15565
  },
15507
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u2705"),
15508
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Tests"),
15509
- pendingCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles6.actionBadge }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionBadgeText }, pendingCount))
15566
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u2705"),
15567
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Tests"),
15568
+ pendingCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles7.actionBadge }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionBadgeText }, pendingCount))
15510
15569
  ), /* @__PURE__ */ React3.createElement(
15511
15570
  TouchableOpacity,
15512
15571
  {
15513
- style: styles6.actionCard,
15572
+ style: styles7.actionCard,
15514
15573
  onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
15515
15574
  activeOpacity: 0.7
15516
15575
  },
15517
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F41B}"),
15518
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Report Bug")
15576
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F41B}"),
15577
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Report Bug")
15519
15578
  ), /* @__PURE__ */ React3.createElement(
15520
15579
  TouchableOpacity,
15521
15580
  {
15522
- style: styles6.actionCard,
15581
+ style: styles7.actionCard,
15523
15582
  onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
15524
15583
  activeOpacity: 0.7
15525
15584
  },
15526
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4A1}"),
15527
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Feedback")
15585
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4A1}"),
15586
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Feedback")
15528
15587
  ), /* @__PURE__ */ React3.createElement(
15529
15588
  TouchableOpacity,
15530
15589
  {
15531
- style: styles6.actionCard,
15590
+ style: styles7.actionCard,
15532
15591
  onPress: () => nav.push({ name: "MESSAGE_LIST" }),
15533
15592
  activeOpacity: 0.7
15534
15593
  },
15535
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4AC}"),
15536
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Messages"),
15537
- unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles6.actionBadge, styles6.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionBadgeText }, unreadCount))
15538
- )), /* @__PURE__ */ React3.createElement(View3, { style: styles6.issueGrid }, /* @__PURE__ */ React3.createElement(
15594
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4AC}"),
15595
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Messages"),
15596
+ unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles7.actionBadge, styles7.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionBadgeText }, unreadCount))
15597
+ )), /* @__PURE__ */ React3.createElement(View3, { style: styles7.issueGrid }, /* @__PURE__ */ React3.createElement(
15539
15598
  TouchableOpacity,
15540
15599
  {
15541
- style: [styles6.issueCard, styles6.issueCardOpen],
15600
+ style: [styles7.issueCard, styles7.issueCardOpen],
15542
15601
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
15543
15602
  activeOpacity: 0.7
15544
15603
  },
15545
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountOpen }, issueCounts.open),
15546
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Open")
15604
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountOpen }, issueCounts.open),
15605
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Open")
15547
15606
  ), /* @__PURE__ */ React3.createElement(
15548
15607
  TouchableOpacity,
15549
15608
  {
15550
- style: [styles6.issueCard, styles6.issueCardDone],
15609
+ style: [styles7.issueCard, styles7.issueCardDone],
15551
15610
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
15552
15611
  activeOpacity: 0.7
15553
15612
  },
15554
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountDone }, issueCounts.done),
15555
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Done")
15613
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountDone }, issueCounts.done),
15614
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Done")
15556
15615
  ), /* @__PURE__ */ React3.createElement(
15557
15616
  TouchableOpacity,
15558
15617
  {
15559
- style: [styles6.issueCard, styles6.issueCardReopened],
15618
+ style: [styles7.issueCard, styles7.issueCardReopened],
15560
15619
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
15561
15620
  activeOpacity: 0.7
15562
15621
  },
15563
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountReopened }, issueCounts.reopened),
15564
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Reopened")
15565
- )), totalTests > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles6.progressSection }, /* @__PURE__ */ React3.createElement(View3, { style: styles6.progressBar }, /* @__PURE__ */ React3.createElement(View3, { style: [styles6.progressFill, { width: `${Math.round(completedCount / totalTests * 100)}%` }] })), /* @__PURE__ */ React3.createElement(Text, { style: styles6.progressText }, completedCount, "/", totalTests, " tests completed")), dashboardUrl && /* @__PURE__ */ React3.createElement(
15622
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountReopened }, issueCounts.reopened),
15623
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Reopened")
15624
+ )), totalTests > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles7.progressSection }, /* @__PURE__ */ React3.createElement(View3, { style: styles7.progressBar }, /* @__PURE__ */ React3.createElement(View3, { style: [styles7.progressFill, { width: `${Math.round(completedCount / totalTests * 100)}%` }] })), /* @__PURE__ */ React3.createElement(Text, { style: styles7.progressText }, completedCount, "/", totalTests, " tests completed")), dashboardUrl && /* @__PURE__ */ React3.createElement(
15566
15625
  TouchableOpacity,
15567
15626
  {
15568
- style: styles6.webAppLink,
15627
+ style: styles7.webAppLink,
15569
15628
  onPress: () => Linking.openURL(dashboardUrl),
15570
15629
  activeOpacity: 0.7
15571
15630
  },
15572
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppIcon }, "\u{1F310}"),
15573
- /* @__PURE__ */ React3.createElement(View3, { style: styles6.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppSub }, "View analytics, history & more")),
15574
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppArrow }, "\u2192")
15631
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppIcon }, "\u{1F310}"),
15632
+ /* @__PURE__ */ React3.createElement(View3, { style: styles7.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppSub }, "View analytics, history & more")),
15633
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppArrow }, "\u2192")
15575
15634
  ), /* @__PURE__ */ React3.createElement(
15576
15635
  TouchableOpacity,
15577
15636
  {
15578
- style: styles6.refreshButton,
15637
+ style: styles7.refreshButton,
15579
15638
  onPress: () => {
15580
15639
  refreshAssignments();
15581
15640
  refreshThreads();
15582
15641
  refreshIssueCounts();
15583
15642
  }
15584
15643
  },
15585
- /* @__PURE__ */ React3.createElement(Text, { style: styles6.refreshText }, "\u21BB Refresh")
15644
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.refreshText }, "\u21BB Refresh")
15586
15645
  ));
15587
15646
  }
15588
15647
  function createStyles() {
@@ -15871,6 +15930,35 @@ function createStyles() {
15871
15930
  sessionCardArrow: {
15872
15931
  fontSize: 13,
15873
15932
  color: colors.textMuted
15933
+ },
15934
+ // Quick Test card
15935
+ quickTestCard: {
15936
+ flexDirection: "row",
15937
+ alignItems: "center",
15938
+ backgroundColor: colors.card,
15939
+ borderWidth: 1,
15940
+ borderColor: colors.border,
15941
+ borderRadius: 12,
15942
+ padding: 12,
15943
+ paddingHorizontal: 16,
15944
+ gap: 12,
15945
+ marginBottom: 16
15946
+ },
15947
+ quickTestIcon: {
15948
+ fontSize: 22
15949
+ },
15950
+ quickTestContent: {
15951
+ flex: 1
15952
+ },
15953
+ quickTestTitle: {
15954
+ fontSize: 14,
15955
+ fontWeight: "600",
15956
+ color: colors.textPrimary
15957
+ },
15958
+ quickTestSub: {
15959
+ fontSize: 12,
15960
+ color: colors.textMuted,
15961
+ marginTop: 2
15874
15962
  }
15875
15963
  });
15876
15964
  }
@@ -15880,7 +15968,7 @@ import React4, { useState as useState3, useEffect as useEffect4, useCallback as
15880
15968
  import { View as View4, Text as Text2, TouchableOpacity as TouchableOpacity2, StyleSheet as StyleSheet4, Modal, TextInput, Keyboard, Animated as Animated2 } from "react-native";
15881
15969
  function TestDetailScreen({ testId, nav }) {
15882
15970
  const { client, assignments, currentAssignment, refreshAssignments, getDeviceInfo, onNavigate, widgetColorScheme } = useBugBear();
15883
- const styles6 = useMemo2(() => createStyles2(), [widgetColorScheme]);
15971
+ const styles7 = useMemo2(() => createStyles2(), [widgetColorScheme]);
15884
15972
  const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
15885
15973
  const [showSteps, setShowSteps] = useState3(true);
15886
15974
  const [showDetails, setShowDetails] = useState3(false);
@@ -16058,7 +16146,7 @@ function TestDetailScreen({ testId, nav }) {
16058
16146
  const steps = testCase.steps;
16059
16147
  const info = templateInfo[template] || templateInfo.steps;
16060
16148
  const rubricMode = testCase.track?.rubricMode || "pass_fail";
16061
- return /* @__PURE__ */ React4.createElement(View4, { style: styles6.container }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.topRow }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.positionInfo }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.positionText }, "Test ", currentIndex + 1, " of ", allTests.length), displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ React4.createElement(View4, { style: styles6.timerBadge }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.timerText }, formatElapsedTime(assignmentElapsedTime)))), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => nav.push({ name: "TEST_LIST" }) }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.viewAllLink }, "View All \u2192"))), displayedAssignment.isVerification && /* @__PURE__ */ React4.createElement(View4, { style: styles6.retestBanner }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.retestLabel }, "Retest"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.retestSub }, "\u2014 Verify bug fix")), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.testTitle }, testCase.title), testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.testKey }, testCase.key), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowSteps(!showSteps), style: styles6.sectionHeader }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.sectionHeaderText }, showSteps ? "\u25BC" : "\u25B6", " ", info.icon, " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && /* @__PURE__ */ React4.createElement(View4, { style: styles6.templateContent }, template === "steps" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles6.step }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.stepNumber }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.stepNumberText }, step.stepNumber)), /* @__PURE__ */ React4.createElement(View4, { style: styles6.stepBody }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.stepExpected }, "\u2192 ", step.expectedResult)))), template === "checklist" && /* @__PURE__ */ React4.createElement(React4.Fragment, null, steps.map((step, idx) => /* @__PURE__ */ React4.createElement(
16149
+ return /* @__PURE__ */ React4.createElement(View4, { style: styles7.container }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.topRow }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.positionInfo }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.positionText }, "Test ", currentIndex + 1, " of ", allTests.length), displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ React4.createElement(View4, { style: styles7.timerBadge }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.timerText }, formatElapsedTime(assignmentElapsedTime)))), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => nav.push({ name: "TEST_LIST" }) }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.viewAllLink }, "View All \u2192"))), displayedAssignment.isVerification && /* @__PURE__ */ React4.createElement(View4, { style: styles7.retestBanner }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.retestLabel }, "Retest"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.retestSub }, "\u2014 Verify bug fix")), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.testTitle }, testCase.title), testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.testKey }, testCase.key), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowSteps(!showSteps), style: styles7.sectionHeader }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.sectionHeaderText }, showSteps ? "\u25BC" : "\u25B6", " ", info.icon, " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && /* @__PURE__ */ React4.createElement(View4, { style: styles7.templateContent }, template === "steps" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles7.step }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.stepNumber }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.stepNumberText }, step.stepNumber)), /* @__PURE__ */ React4.createElement(View4, { style: styles7.stepBody }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.stepExpected }, "\u2192 ", step.expectedResult)))), template === "checklist" && /* @__PURE__ */ React4.createElement(React4.Fragment, null, steps.map((step, idx) => /* @__PURE__ */ React4.createElement(
16062
16150
  TouchableOpacity2,
16063
16151
  {
16064
16152
  key: idx,
@@ -16068,86 +16156,86 @@ function TestDetailScreen({ testId, nav }) {
16068
16156
  else next[idx] = true;
16069
16157
  return next;
16070
16158
  }),
16071
- style: [styles6.checklistItem, criteriaResults[idx] === true && styles6.checklistItemChecked]
16159
+ style: [styles7.checklistItem, criteriaResults[idx] === true && styles7.checklistItemChecked]
16072
16160
  },
16073
- /* @__PURE__ */ React4.createElement(View4, { style: [styles6.checkbox, criteriaResults[idx] === true && styles6.checkboxChecked] }, criteriaResults[idx] === true && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.checkmark }, "\u2713")),
16074
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.checklistText, criteriaResults[idx] === true && styles6.checklistTextDone] }, step.action)
16075
- )), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setCriteriaResults({}), style: styles6.resetRow }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.resetText }, "\u21BA Reset"))), template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles6.rubricItem }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.rubricTitle }, idx + 1, ". ", step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.rubricExpected }, step.expectedResult), rubricMode === "pass_fail" ? /* @__PURE__ */ React4.createElement(View4, { style: styles6.passFailRow }, /* @__PURE__ */ React4.createElement(
16161
+ /* @__PURE__ */ React4.createElement(View4, { style: [styles7.checkbox, criteriaResults[idx] === true && styles7.checkboxChecked] }, criteriaResults[idx] === true && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.checkmark }, "\u2713")),
16162
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles7.checklistText, criteriaResults[idx] === true && styles7.checklistTextDone] }, step.action)
16163
+ )), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setCriteriaResults({}), style: styles7.resetRow }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.resetText }, "\u21BA Reset"))), template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles7.rubricItem }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.rubricTitle }, idx + 1, ". ", step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.rubricExpected }, step.expectedResult), rubricMode === "pass_fail" ? /* @__PURE__ */ React4.createElement(View4, { style: styles7.passFailRow }, /* @__PURE__ */ React4.createElement(
16076
16164
  TouchableOpacity2,
16077
16165
  {
16078
16166
  onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: true })),
16079
- style: [styles6.pfButton, criteriaResults[idx] === true && styles6.pfButtonPass]
16167
+ style: [styles7.pfButton, criteriaResults[idx] === true && styles7.pfButtonPass]
16080
16168
  },
16081
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.pfButtonText, criteriaResults[idx] === true && styles6.pfButtonTextActive] }, "\u2713 Pass")
16169
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles7.pfButtonText, criteriaResults[idx] === true && styles7.pfButtonTextActive] }, "\u2713 Pass")
16082
16170
  ), /* @__PURE__ */ React4.createElement(
16083
16171
  TouchableOpacity2,
16084
16172
  {
16085
16173
  onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: false })),
16086
- style: [styles6.pfButton, criteriaResults[idx] === false && styles6.pfButtonFail]
16174
+ style: [styles7.pfButton, criteriaResults[idx] === false && styles7.pfButtonFail]
16087
16175
  },
16088
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.pfButtonText, criteriaResults[idx] === false && styles6.pfButtonTextActive] }, "\u2717 Fail")
16089
- )) : /* @__PURE__ */ React4.createElement(View4, { style: styles6.ratingRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React4.createElement(
16176
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles7.pfButtonText, criteriaResults[idx] === false && styles7.pfButtonTextActive] }, "\u2717 Fail")
16177
+ )) : /* @__PURE__ */ React4.createElement(View4, { style: styles7.ratingRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React4.createElement(
16090
16178
  TouchableOpacity2,
16091
16179
  {
16092
16180
  key: n,
16093
16181
  onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: n })),
16094
- style: [styles6.ratingBtn, criteriaResults[idx] === n && styles6.ratingBtnActive]
16182
+ style: [styles7.ratingBtn, criteriaResults[idx] === n && styles7.ratingBtnActive]
16095
16183
  },
16096
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.ratingBtnText, criteriaResults[idx] === n && styles6.ratingBtnTextActive] }, n)
16097
- ))))), template === "freeform" && /* @__PURE__ */ React4.createElement(View4, { style: styles6.freeformBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.freeformText }, "Review the area and note:"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.freeformBullet }, "\u2022 What works well"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.freeformBullet }, "\u2022 Issues or concerns"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.freeformBullet }, "\u2022 Suggestions"))), testCase.expectedResult && /* @__PURE__ */ React4.createElement(View4, { style: styles6.expectedBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.expectedLabel }, "\u2705 Expected Result"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.expectedText }, testCase.expectedResult)), testCase.targetRoute && onNavigate && /* @__PURE__ */ React4.createElement(
16184
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles7.ratingBtnText, criteriaResults[idx] === n && styles7.ratingBtnTextActive] }, n)
16185
+ ))))), template === "freeform" && /* @__PURE__ */ React4.createElement(View4, { style: styles7.freeformBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.freeformText }, "Review the area and note:"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.freeformBullet }, "\u2022 What works well"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.freeformBullet }, "\u2022 Issues or concerns"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.freeformBullet }, "\u2022 Suggestions"))), testCase.expectedResult && /* @__PURE__ */ React4.createElement(View4, { style: styles7.expectedBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.expectedLabel }, "\u2705 Expected Result"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.expectedText }, testCase.expectedResult)), testCase.targetRoute && onNavigate && /* @__PURE__ */ React4.createElement(
16098
16186
  TouchableOpacity2,
16099
16187
  {
16100
- style: styles6.navigateButton,
16188
+ style: styles7.navigateButton,
16101
16189
  onPress: () => {
16102
16190
  Keyboard.dismiss();
16103
16191
  onNavigate(testCase.targetRoute);
16104
16192
  nav.closeWidget?.();
16105
16193
  }
16106
16194
  },
16107
- /* @__PURE__ */ React4.createElement(Text2, { style: styles6.navigateText }, "\u{1F9ED} Go to test location")
16108
- ), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowDetails(!showDetails), style: styles6.detailsToggle }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React4.createElement(View4, { style: styles6.detailsSection }, testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.detailMeta }, testCase.key, " \xB7 ", testCase.priority, " \xB7 ", info.name), testCase.track && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.detailMeta }, testCase.track.icon, " ", testCase.track.name), testCase.description && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.detailDesc }, testCase.description), testCase.group && /* @__PURE__ */ React4.createElement(View4, { style: styles6.folderProgress }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.folderName }, "\u{1F4C1} ", testCase.group.name))), displayedAssignment.status === "in_progress" && nav.startMiniRunner && /* @__PURE__ */ React4.createElement(
16195
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles7.navigateText }, "\u{1F9ED} Go to test location")
16196
+ ), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowDetails(!showDetails), style: styles7.detailsToggle }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React4.createElement(View4, { style: styles7.detailsSection }, testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.detailMeta }, testCase.key, " \xB7 ", testCase.priority, " \xB7 ", info.name), testCase.track && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.detailMeta }, testCase.track.icon, " ", testCase.track.name), testCase.description && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.detailDesc }, testCase.description), testCase.group && /* @__PURE__ */ React4.createElement(View4, { style: styles7.folderProgress }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.folderName }, "\u{1F4C1} ", testCase.group.name))), displayedAssignment.status === "in_progress" && nav.startMiniRunner && /* @__PURE__ */ React4.createElement(
16109
16197
  TouchableOpacity2,
16110
16198
  {
16111
- style: styles6.startTestBtn,
16199
+ style: styles7.startTestBtn,
16112
16200
  onPress: () => nav.startMiniRunner(displayedAssignment.id)
16113
16201
  },
16114
- /* @__PURE__ */ React4.createElement(Text2, { style: styles6.startTestText }, "\u25B6 Start Test")
16202
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles7.startTestText }, "\u25B6 Start Test")
16115
16203
  ), displayedAssignment.status === "passed" || displayedAssignment.status === "failed" || displayedAssignment.status === "skipped" || displayedAssignment.status === "blocked" ? /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(View4, { style: [
16116
- styles6.completedBanner,
16117
- displayedAssignment.status === "passed" && styles6.completedBannerPass,
16118
- displayedAssignment.status === "failed" && styles6.completedBannerFail
16119
- ] }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.completedIcon }, displayedAssignment.status === "passed" ? "\u2705" : displayedAssignment.status === "failed" ? "\u274C" : displayedAssignment.status === "skipped" ? "\u23ED" : "\u{1F6AB}"), /* @__PURE__ */ React4.createElement(Text2, { style: [
16120
- styles6.completedLabel,
16204
+ styles7.completedBanner,
16205
+ displayedAssignment.status === "passed" && styles7.completedBannerPass,
16206
+ displayedAssignment.status === "failed" && styles7.completedBannerFail
16207
+ ] }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.completedIcon }, displayedAssignment.status === "passed" ? "\u2705" : displayedAssignment.status === "failed" ? "\u274C" : displayedAssignment.status === "skipped" ? "\u23ED" : "\u{1F6AB}"), /* @__PURE__ */ React4.createElement(Text2, { style: [
16208
+ styles7.completedLabel,
16121
16209
  displayedAssignment.status === "passed" && { color: colors.green },
16122
16210
  displayedAssignment.status === "failed" && { color: colors.redLight }
16123
- ] }, "Marked as ", displayedAssignment.status.charAt(0).toUpperCase() + displayedAssignment.status.slice(1))), !(displayedAssignment.isVerification && (displayedAssignment.status === "passed" || displayedAssignment.status === "failed")) && /* @__PURE__ */ React4.createElement(View4, { style: [styles6.actionButtons, { marginTop: 4 }] }, /* @__PURE__ */ React4.createElement(
16211
+ ] }, "Marked as ", displayedAssignment.status.charAt(0).toUpperCase() + displayedAssignment.status.slice(1))), !(displayedAssignment.isVerification && (displayedAssignment.status === "passed" || displayedAssignment.status === "failed")) && /* @__PURE__ */ React4.createElement(View4, { style: [styles7.actionButtons, { marginTop: 4 }] }, /* @__PURE__ */ React4.createElement(
16124
16212
  TouchableOpacity2,
16125
16213
  {
16126
- style: [styles6.actionBtn, styles6.reopenBtn, isSubmitting && { opacity: 0.5 }],
16214
+ style: [styles7.actionBtn, styles7.reopenBtn, isSubmitting && { opacity: 0.5 }],
16127
16215
  onPress: handleReopen,
16128
16216
  disabled: isSubmitting
16129
16217
  },
16130
- /* @__PURE__ */ React4.createElement(Text2, { style: styles6.reopenBtnText }, isSubmitting ? "Reopening..." : "\u{1F504} Reopen Test")
16218
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles7.reopenBtnText }, isSubmitting ? "Reopening..." : "\u{1F504} Reopen Test")
16131
16219
  ), displayedAssignment.status === "passed" && /* @__PURE__ */ React4.createElement(
16132
16220
  TouchableOpacity2,
16133
16221
  {
16134
- style: [styles6.actionBtn, styles6.failBtn, isSubmitting && { opacity: 0.5 }],
16222
+ style: [styles7.actionBtn, styles7.failBtn, isSubmitting && { opacity: 0.5 }],
16135
16223
  onPress: () => handleChangeResult("failed"),
16136
16224
  disabled: isSubmitting
16137
16225
  },
16138
- /* @__PURE__ */ React4.createElement(Text2, { style: styles6.failBtnText }, "Change to Fail")
16226
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles7.failBtnText }, "Change to Fail")
16139
16227
  ), displayedAssignment.status === "failed" && /* @__PURE__ */ React4.createElement(
16140
16228
  TouchableOpacity2,
16141
16229
  {
16142
- style: [styles6.actionBtn, styles6.passBtn, isSubmitting && { opacity: 0.5 }],
16230
+ style: [styles7.actionBtn, styles7.passBtn, isSubmitting && { opacity: 0.5 }],
16143
16231
  onPress: () => handleChangeResult("passed"),
16144
16232
  disabled: isSubmitting
16145
16233
  },
16146
- /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passBtnText }, "Change to Pass")
16147
- ))) : /* @__PURE__ */ React4.createElement(View4, { style: styles6.actionButtons }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles6.actionBtn, styles6.failBtn, isSubmitting && { opacity: 0.5 }], onPress: handleFail, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.failBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Reporting..." : "Failing..." : displayedAssignment.isVerification ? "\u2717 Still Broken" : "Fail")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles6.actionBtn, styles6.skipBtn, isSubmitting && { opacity: 0.5 }], onPress: () => setShowSkipModal(true), disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.skipBtnText }, "Skip")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles6.actionBtn, styles6.passBtn, isSubmitting && { opacity: 0.5 }], onPress: handlePass, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Verifying..." : "Passing..." : displayedAssignment.isVerification ? "\u2713 Fix Verified" : "Pass"))), feedbackToastAssignmentId && /* @__PURE__ */ React4.createElement(Animated2.View, { style: [styles6.passToast, { transform: [{ translateY: toastSlideAnim }] }] }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.passToastContent }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passToastIcon }, "\u2705"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passToastText }, "Test passed!")), /* @__PURE__ */ React4.createElement(
16234
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles7.passBtnText }, "Change to Pass")
16235
+ ))) : /* @__PURE__ */ React4.createElement(View4, { style: styles7.actionButtons }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles7.actionBtn, styles7.failBtn, isSubmitting && { opacity: 0.5 }], onPress: handleFail, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.failBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Reporting..." : "Failing..." : displayedAssignment.isVerification ? "\u2717 Still Broken" : "Fail")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles7.actionBtn, styles7.skipBtn, isSubmitting && { opacity: 0.5 }], onPress: () => setShowSkipModal(true), disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.skipBtnText }, "Skip")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles7.actionBtn, styles7.passBtn, isSubmitting && { opacity: 0.5 }], onPress: handlePass, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.passBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Verifying..." : "Passing..." : displayedAssignment.isVerification ? "\u2713 Fix Verified" : "Pass"))), feedbackToastAssignmentId && /* @__PURE__ */ React4.createElement(Animated2.View, { style: [styles7.passToast, { transform: [{ translateY: toastSlideAnim }] }] }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.passToastContent }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.passToastIcon }, "\u2705"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.passToastText }, "Test passed!")), /* @__PURE__ */ React4.createElement(
16148
16236
  TouchableOpacity2,
16149
16237
  {
16150
- style: styles6.passToastButton,
16238
+ style: styles7.passToastButton,
16151
16239
  onPress: () => {
16152
16240
  if (toastTimerRef.current) clearTimeout(toastTimerRef.current);
16153
16241
  const toastId = feedbackToastAssignmentId;
@@ -16155,8 +16243,8 @@ function TestDetailScreen({ testId, nav }) {
16155
16243
  nav.push({ name: "TEST_FEEDBACK", status: "passed", assignmentId: toastId });
16156
16244
  }
16157
16245
  },
16158
- /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passToastButtonText }, "Rate this test")
16159
- )), /* @__PURE__ */ React4.createElement(Modal, { visible: showSkipModal, transparent: true, animationType: "fade" }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.modalOverlay }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.modalContent }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.modalTitle }, "Skip this test?"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.modalSubtitle }, "Select a reason:"), [
16246
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles7.passToastButtonText }, "Rate this test")
16247
+ )), /* @__PURE__ */ React4.createElement(Modal, { visible: showSkipModal, transparent: true, animationType: "fade" }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.modalOverlay }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.modalContent }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.modalTitle }, "Skip this test?"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.modalSubtitle }, "Select a reason:"), [
16160
16248
  { reason: "blocked", label: "\u{1F6AB} Blocked by a bug" },
16161
16249
  { reason: "not_ready", label: "\u{1F6A7} Feature not ready" },
16162
16250
  { reason: "dependency", label: "\u{1F517} Needs another test first" },
@@ -16165,32 +16253,32 @@ function TestDetailScreen({ testId, nav }) {
16165
16253
  TouchableOpacity2,
16166
16254
  {
16167
16255
  key: reason,
16168
- style: [styles6.skipOption, selectedSkipReason === reason && styles6.skipOptionActive],
16256
+ style: [styles7.skipOption, selectedSkipReason === reason && styles7.skipOptionActive],
16169
16257
  onPress: () => setSelectedSkipReason(reason)
16170
16258
  },
16171
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.skipOptionText, selectedSkipReason === reason && styles6.skipOptionTextActive] }, label)
16259
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles7.skipOptionText, selectedSkipReason === reason && styles7.skipOptionTextActive] }, label)
16172
16260
  )), /* @__PURE__ */ React4.createElement(
16173
16261
  TextInput,
16174
16262
  {
16175
- style: styles6.skipNotes,
16263
+ style: styles7.skipNotes,
16176
16264
  value: skipNotes,
16177
16265
  onChangeText: setSkipNotes,
16178
16266
  placeholder: "Additional notes (optional)",
16179
16267
  placeholderTextColor: colors.textMuted,
16180
16268
  multiline: true
16181
16269
  }
16182
- ), /* @__PURE__ */ React4.createElement(View4, { style: styles6.skipActions }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: styles6.skipCancel, onPress: () => {
16270
+ ), /* @__PURE__ */ React4.createElement(View4, { style: styles7.skipActions }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: styles7.skipCancel, onPress: () => {
16183
16271
  setShowSkipModal(false);
16184
16272
  setSelectedSkipReason(null);
16185
16273
  setSkipNotes("");
16186
- } }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.skipCancelText }, "Cancel")), /* @__PURE__ */ React4.createElement(
16274
+ } }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.skipCancelText }, "Cancel")), /* @__PURE__ */ React4.createElement(
16187
16275
  TouchableOpacity2,
16188
16276
  {
16189
- style: [styles6.skipConfirm, !selectedSkipReason && { opacity: 0.4 }],
16277
+ style: [styles7.skipConfirm, !selectedSkipReason && { opacity: 0.4 }],
16190
16278
  onPress: handleSkip,
16191
16279
  disabled: !selectedSkipReason || skipping
16192
16280
  },
16193
- /* @__PURE__ */ React4.createElement(Text2, { style: styles6.skipConfirmText }, skipping ? "Skipping..." : "Skip Test")
16281
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles7.skipConfirmText }, skipping ? "Skipping..." : "Skip Test")
16194
16282
  ))))));
16195
16283
  }
16196
16284
  function createStyles2() {
@@ -16312,7 +16400,7 @@ import React5, { useState as useState4, useMemo as useMemo3, useCallback as useC
16312
16400
  import { View as View5, Text as Text3, TouchableOpacity as TouchableOpacity3, StyleSheet as StyleSheet5, ScrollView, TextInput as TextInput2, Platform as Platform3, Linking as Linking2 } from "react-native";
16313
16401
  function TestListScreen({ nav }) {
16314
16402
  const { assignments, currentAssignment, refreshAssignments, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
16315
- const styles6 = useMemo3(() => createStyles3(), [widgetColorScheme]);
16403
+ const styles7 = useMemo3(() => createStyles3(), [widgetColorScheme]);
16316
16404
  const [filter, setFilter] = useState4("all");
16317
16405
  const [roleFilter, setRoleFilter] = useState4(null);
16318
16406
  const [trackFilter, setTrackFilter] = useState4(null);
@@ -16404,18 +16492,18 @@ function TestListScreen({ nav }) {
16404
16492
  return true;
16405
16493
  }, [platformFilter, roleFilter, trackFilter, searchQuery, filter]);
16406
16494
  if (isLoading) return /* @__PURE__ */ React5.createElement(TestListScreenSkeleton, null);
16407
- return /* @__PURE__ */ React5.createElement(View5, null, /* @__PURE__ */ React5.createElement(View5, { style: styles6.filterBar }, [
16495
+ return /* @__PURE__ */ React5.createElement(View5, null, /* @__PURE__ */ React5.createElement(View5, { style: styles7.filterBar }, [
16408
16496
  { key: "all", label: "All", count: assignments.length },
16409
16497
  { key: "todo", label: "To Do", count: assignments.filter((a) => !a.isVerification && (a.status === "pending" || a.status === "in_progress" || a.status === "failed")).length },
16410
16498
  { key: "retest", label: "Retest", count: assignments.filter((a) => !!a.isVerification && (a.status === "pending" || a.status === "in_progress")).length },
16411
16499
  { key: "done", label: "Done", count: assignments.filter((a) => a.status === "passed" || a.status === "skipped" || a.status === "blocked").length }
16412
- ].map((f) => /* @__PURE__ */ React5.createElement(TouchableOpacity3, { key: f.key, style: [styles6.filterBtn, filter === f.key && styles6.filterBtnActive], onPress: () => setFilter(f.key) }, /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.filterBtnText, filter === f.key && styles6.filterBtnTextActive] }, f.label, " (", f.count, ")")))), availableRoles.length >= 2 && /* @__PURE__ */ React5.createElement(View5, { style: styles6.roleSection }, /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles6.roleBar }, /* @__PURE__ */ React5.createElement(
16500
+ ].map((f) => /* @__PURE__ */ React5.createElement(TouchableOpacity3, { key: f.key, style: [styles7.filterBtn, filter === f.key && styles7.filterBtnActive], onPress: () => setFilter(f.key) }, /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.filterBtnText, filter === f.key && styles7.filterBtnTextActive] }, f.label, " (", f.count, ")")))), availableRoles.length >= 2 && /* @__PURE__ */ React5.createElement(View5, { style: styles7.roleSection }, /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles7.roleBar }, /* @__PURE__ */ React5.createElement(
16413
16501
  TouchableOpacity3,
16414
16502
  {
16415
- style: [styles6.roleBtn, !roleFilter && styles6.roleBtnActive],
16503
+ style: [styles7.roleBtn, !roleFilter && styles7.roleBtnActive],
16416
16504
  onPress: () => setRoleFilter(null)
16417
16505
  },
16418
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.roleBtnText, !roleFilter && styles6.roleBtnTextActive] }, "All Roles")
16506
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.roleBtnText, !roleFilter && styles7.roleBtnTextActive] }, "All Roles")
16419
16507
  ), availableRoles.map((role) => {
16420
16508
  const isActive = roleFilter === role.id;
16421
16509
  return /* @__PURE__ */ React5.createElement(
@@ -16423,30 +16511,30 @@ function TestListScreen({ nav }) {
16423
16511
  {
16424
16512
  key: role.id,
16425
16513
  style: [
16426
- styles6.roleBtn,
16514
+ styles7.roleBtn,
16427
16515
  isActive && { backgroundColor: role.color + "20", borderColor: role.color + "60", borderWidth: 1 }
16428
16516
  ],
16429
16517
  onPress: () => setRoleFilter(isActive ? null : role.id)
16430
16518
  },
16431
- /* @__PURE__ */ React5.createElement(View5, { style: [styles6.roleDot, { backgroundColor: role.color }] }),
16432
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.roleBtnText, isActive && { color: role.color, fontWeight: "600" }] }, role.name)
16519
+ /* @__PURE__ */ React5.createElement(View5, { style: [styles7.roleDot, { backgroundColor: role.color }] }),
16520
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.roleBtnText, isActive && { color: role.color, fontWeight: "600" }] }, role.name)
16433
16521
  );
16434
- })), selectedRole?.loginHint && /* @__PURE__ */ React5.createElement(View5, { style: [styles6.loginHint, { backgroundColor: selectedRole.color + "10", borderColor: selectedRole.color + "30" }] }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.loginHintText }, "Log in as: ", selectedRole.loginHint))), /* @__PURE__ */ React5.createElement(View5, { style: styles6.searchContainer }, /* @__PURE__ */ React5.createElement(
16522
+ })), selectedRole?.loginHint && /* @__PURE__ */ React5.createElement(View5, { style: [styles7.loginHint, { backgroundColor: selectedRole.color + "10", borderColor: selectedRole.color + "30" }] }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.loginHintText }, "Log in as: ", selectedRole.loginHint))), /* @__PURE__ */ React5.createElement(View5, { style: styles7.searchContainer }, /* @__PURE__ */ React5.createElement(
16435
16523
  TextInput2,
16436
16524
  {
16437
16525
  value: searchQuery,
16438
16526
  onChangeText: setSearchQuery,
16439
16527
  placeholder: "Search tests...",
16440
16528
  placeholderTextColor: colors.textMuted,
16441
- style: styles6.searchInput
16529
+ style: styles7.searchInput
16442
16530
  }
16443
- )), /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles6.platformBar }, /* @__PURE__ */ React5.createElement(
16531
+ )), /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles7.platformBar }, /* @__PURE__ */ React5.createElement(
16444
16532
  TouchableOpacity3,
16445
16533
  {
16446
- style: [styles6.platformBtn, !platformFilter && styles6.platformBtnActive],
16534
+ style: [styles7.platformBtn, !platformFilter && styles7.platformBtnActive],
16447
16535
  onPress: () => setPlatformFilter(null)
16448
16536
  },
16449
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.platformBtnText, !platformFilter && styles6.platformBtnTextActive] }, "All")
16537
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.platformBtnText, !platformFilter && styles7.platformBtnTextActive] }, "All")
16450
16538
  ), [
16451
16539
  { key: "web", label: "Web", icon: "\u{1F310}" },
16452
16540
  { key: "ios", label: "iOS", icon: "\u{1F4F1}" },
@@ -16458,32 +16546,32 @@ function TestListScreen({ nav }) {
16458
16546
  {
16459
16547
  key: p.key,
16460
16548
  style: [
16461
- styles6.platformBtn,
16549
+ styles7.platformBtn,
16462
16550
  isActive && { backgroundColor: colors.blue + "20", borderColor: colors.blue + "60", borderWidth: 1 }
16463
16551
  ],
16464
16552
  onPress: () => setPlatformFilter(isActive ? null : p.key)
16465
16553
  },
16466
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.platformBtnText, isActive && { color: colors.blue, fontWeight: "600" }] }, p.icon, " ", p.label)
16554
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.platformBtnText, isActive && { color: colors.blue, fontWeight: "600" }] }, p.icon, " ", p.label)
16467
16555
  );
16468
- })), /* @__PURE__ */ React5.createElement(View5, { style: styles6.trackSortRow }, availableTracks.length >= 2 && /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: { flex: 1 } }, /* @__PURE__ */ React5.createElement(
16556
+ })), /* @__PURE__ */ React5.createElement(View5, { style: styles7.trackSortRow }, availableTracks.length >= 2 && /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: { flex: 1 } }, /* @__PURE__ */ React5.createElement(
16469
16557
  TouchableOpacity3,
16470
16558
  {
16471
- style: [styles6.trackBtn, !trackFilter && styles6.trackBtnActive],
16559
+ style: [styles7.trackBtn, !trackFilter && styles7.trackBtnActive],
16472
16560
  onPress: () => setTrackFilter(null)
16473
16561
  },
16474
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.trackBtnText, !trackFilter && styles6.trackBtnTextActive] }, "All Tracks")
16562
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.trackBtnText, !trackFilter && styles7.trackBtnTextActive] }, "All Tracks")
16475
16563
  ), availableTracks.map((track) => {
16476
16564
  const isActive = trackFilter === track.id;
16477
16565
  return /* @__PURE__ */ React5.createElement(
16478
16566
  TouchableOpacity3,
16479
16567
  {
16480
16568
  key: track.id,
16481
- style: [styles6.trackBtn, isActive && { backgroundColor: track.color + "20", borderColor: track.color + "60", borderWidth: 1 }],
16569
+ style: [styles7.trackBtn, isActive && { backgroundColor: track.color + "20", borderColor: track.color + "60", borderWidth: 1 }],
16482
16570
  onPress: () => setTrackFilter(isActive ? null : track.id)
16483
16571
  },
16484
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.trackBtnText, isActive && { color: track.color, fontWeight: "600" }] }, track.icon, " ", track.name)
16572
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.trackBtnText, isActive && { color: track.color, fontWeight: "600" }] }, track.icon, " ", track.name)
16485
16573
  );
16486
- })), /* @__PURE__ */ React5.createElement(View5, { style: styles6.sortGroup }, [
16574
+ })), /* @__PURE__ */ React5.createElement(View5, { style: styles7.sortGroup }, [
16487
16575
  { key: "priority", label: "\u2195 Priority" },
16488
16576
  { key: "recent", label: "\u{1F550} Recent" },
16489
16577
  { key: "alpha", label: "A-Z" }
@@ -16491,41 +16579,41 @@ function TestListScreen({ nav }) {
16491
16579
  TouchableOpacity3,
16492
16580
  {
16493
16581
  key: s2.key,
16494
- style: [styles6.sortBtn, sortMode === s2.key && styles6.sortBtnActive],
16582
+ style: [styles7.sortBtn, sortMode === s2.key && styles7.sortBtnActive],
16495
16583
  onPress: () => setSortMode(s2.key)
16496
16584
  },
16497
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.sortBtnText, sortMode === s2.key && styles6.sortBtnTextActive] }, s2.label)
16585
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.sortBtnText, sortMode === s2.key && styles7.sortBtnTextActive] }, s2.label)
16498
16586
  )))), groupedAssignments.map((folder) => {
16499
16587
  const folderId = folder.group?.id || "ungrouped";
16500
16588
  const isCollapsed = collapsedFolders.has(folderId);
16501
16589
  const filtered = folder.assignments.filter(filterAssignment);
16502
16590
  if (filtered.length === 0 && filter !== "all") return null;
16503
- return /* @__PURE__ */ React5.createElement(View5, { key: folderId, style: styles6.folder }, /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles6.folderHeader, onPress: () => toggleFolder(folderId) }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.folderToggle }, isCollapsed ? "\u25B6" : "\u25BC"), /* @__PURE__ */ React5.createElement(Text3, { style: styles6.folderName, numberOfLines: 1 }, folder.group?.name || "Ungrouped"), /* @__PURE__ */ React5.createElement(View5, { style: styles6.folderProgress }, /* @__PURE__ */ React5.createElement(View5, { style: [styles6.folderProgressFill, { width: `${folder.stats.total > 0 ? Math.round((folder.stats.passed + folder.stats.failed) / folder.stats.total * 100) : 0}%` }] })), /* @__PURE__ */ React5.createElement(Text3, { style: styles6.folderCount }, folder.stats.passed + folder.stats.failed, "/", folder.stats.total)), !isCollapsed && filtered.map((assignment) => {
16591
+ return /* @__PURE__ */ React5.createElement(View5, { key: folderId, style: styles7.folder }, /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles7.folderHeader, onPress: () => toggleFolder(folderId) }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.folderToggle }, isCollapsed ? "\u25B6" : "\u25BC"), /* @__PURE__ */ React5.createElement(Text3, { style: styles7.folderName, numberOfLines: 1 }, folder.group?.name || "Ungrouped"), /* @__PURE__ */ React5.createElement(View5, { style: styles7.folderProgress }, /* @__PURE__ */ React5.createElement(View5, { style: [styles7.folderProgressFill, { width: `${folder.stats.total > 0 ? Math.round((folder.stats.passed + folder.stats.failed) / folder.stats.total * 100) : 0}%` }] })), /* @__PURE__ */ React5.createElement(Text3, { style: styles7.folderCount }, folder.stats.passed + folder.stats.failed, "/", folder.stats.total)), !isCollapsed && filtered.map((assignment) => {
16504
16592
  const badge = getStatusBadge(assignment.status);
16505
16593
  const isCurrent = currentAssignment?.id === assignment.id;
16506
16594
  return /* @__PURE__ */ React5.createElement(
16507
16595
  TouchableOpacity3,
16508
16596
  {
16509
16597
  key: assignment.id,
16510
- style: [styles6.testItem, isCurrent && styles6.testItemCurrent],
16598
+ style: [styles7.testItem, isCurrent && styles7.testItemCurrent],
16511
16599
  onPress: () => nav.push({ name: "TEST_DETAIL", testId: assignment.id })
16512
16600
  },
16513
- /* @__PURE__ */ React5.createElement(Text3, { style: styles6.testBadge }, badge.icon),
16514
- /* @__PURE__ */ React5.createElement(View5, { style: styles6.testInfo }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.testTitle, numberOfLines: 1 }, assignment.testCase.title), /* @__PURE__ */ React5.createElement(View5, { style: styles6.testMetaRow }, assignment.isVerification && /* @__PURE__ */ React5.createElement(View5, { style: [
16515
- styles6.retestTag,
16601
+ /* @__PURE__ */ React5.createElement(Text3, { style: styles7.testBadge }, badge.icon),
16602
+ /* @__PURE__ */ React5.createElement(View5, { style: styles7.testInfo }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.testTitle, numberOfLines: 1 }, assignment.testCase.title), /* @__PURE__ */ React5.createElement(View5, { style: styles7.testMetaRow }, assignment.isVerification && /* @__PURE__ */ React5.createElement(View5, { style: [
16603
+ styles7.retestTag,
16516
16604
  assignment.status === "passed" && { backgroundColor: colors.greenDark, borderColor: colors.greenBorder }
16517
16605
  ] }, /* @__PURE__ */ React5.createElement(Text3, { style: [
16518
- styles6.retestTagText,
16606
+ styles7.retestTagText,
16519
16607
  assignment.status === "passed" && { color: colors.greenLight }
16520
- ] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ React5.createElement(Text3, { style: styles6.testMeta }, assignment.testCase.testKey, " \xB7 ", assignment.testCase.priority), assignment.testCase.role && /* @__PURE__ */ React5.createElement(View5, { style: styles6.roleBadgeRow }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.testMeta }, " \xB7 "), /* @__PURE__ */ React5.createElement(View5, { style: [styles6.roleBadgeDot, { backgroundColor: assignment.testCase.role.color }] }), /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.testMeta, { color: assignment.testCase.role.color, fontWeight: "500" }] }, assignment.testCase.role.name)))),
16608
+ ] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ React5.createElement(Text3, { style: styles7.testMeta }, assignment.testCase.testKey, " \xB7 ", assignment.testCase.priority), assignment.testCase.role && /* @__PURE__ */ React5.createElement(View5, { style: styles7.roleBadgeRow }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.testMeta }, " \xB7 "), /* @__PURE__ */ React5.createElement(View5, { style: [styles7.roleBadgeDot, { backgroundColor: assignment.testCase.role.color }] }), /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.testMeta, { color: assignment.testCase.role.color, fontWeight: "500" }] }, assignment.testCase.role.name)))),
16521
16609
  /* @__PURE__ */ React5.createElement(View5, { style: [
16522
- styles6.statusPill,
16610
+ styles7.statusPill,
16523
16611
  {
16524
16612
  backgroundColor: assignment.status === "passed" ? colors.greenDark : assignment.status === "failed" ? colors.redSurface : assignment.status === "in_progress" ? colors.blueSurface : colors.card,
16525
16613
  borderColor: assignment.status === "passed" ? colors.greenBorder : assignment.status === "failed" ? colors.redDark : assignment.status === "in_progress" ? colors.blueDark : colors.border
16526
16614
  }
16527
16615
  ] }, /* @__PURE__ */ React5.createElement(Text3, { style: [
16528
- styles6.statusPillText,
16616
+ styles7.statusPillText,
16529
16617
  {
16530
16618
  color: assignment.status === "passed" ? colors.greenMed : assignment.status === "failed" ? colors.redMed : assignment.status === "in_progress" ? colors.blueLight : colors.zincLight
16531
16619
  }
@@ -16535,12 +16623,12 @@ function TestListScreen({ nav }) {
16535
16623
  }), dashboardUrl && /* @__PURE__ */ React5.createElement(
16536
16624
  TouchableOpacity3,
16537
16625
  {
16538
- style: styles6.dashboardLink,
16626
+ style: styles7.dashboardLink,
16539
16627
  onPress: () => Linking2.openURL(`${dashboardUrl}/test-cases`),
16540
16628
  activeOpacity: 0.7
16541
16629
  },
16542
- /* @__PURE__ */ React5.createElement(Text3, { style: styles6.dashboardLinkText }, "\u{1F310}", " Manage on Dashboard ", "\u2192")
16543
- ), /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles6.refreshBtn, onPress: refreshAssignments }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.refreshText }, "\u21BB", " Refresh")));
16630
+ /* @__PURE__ */ React5.createElement(Text3, { style: styles7.dashboardLinkText }, "\u{1F310}", " Manage on Dashboard ", "\u2192")
16631
+ ), /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles7.refreshBtn, onPress: refreshAssignments }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.refreshText }, "\u21BB", " Refresh")));
16544
16632
  }
16545
16633
  function createStyles3() {
16546
16634
  return StyleSheet5.create({
@@ -16860,7 +16948,7 @@ var styles2 = StyleSheet7.create({
16860
16948
  // src/widget/screens/TestFeedbackScreen.tsx
16861
16949
  function TestFeedbackScreen({ status, assignmentId, nav }) {
16862
16950
  const { client, assignments, refreshAssignments, uploadImage, widgetColorScheme } = useBugBear();
16863
- const styles6 = useMemo4(() => createStyles4(), [widgetColorScheme]);
16951
+ const styles7 = useMemo4(() => createStyles4(), [widgetColorScheme]);
16864
16952
  const images = useImageAttachments(uploadImage, 3, "screenshots");
16865
16953
  const [rating, setRating] = useState6(5);
16866
16954
  const [note, setNote] = useState6("");
@@ -16920,7 +17008,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
16920
17008
  }
16921
17009
  }
16922
17010
  };
16923
- return /* @__PURE__ */ React8.createElement(View8, { style: styles6.container }, /* @__PURE__ */ React8.createElement(Text6, { style: styles6.header }, status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed"), /* @__PURE__ */ React8.createElement(Text6, { style: styles6.subheader }, "Rate this test case"), /* @__PURE__ */ React8.createElement(View8, { style: styles6.starRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React8.createElement(TouchableOpacity6, { key: n, onPress: () => setRating(n), style: styles6.starButton }, /* @__PURE__ */ React8.createElement(Text6, { style: [styles6.star, n <= rating && styles6.starActive] }, n <= rating ? "\u2605" : "\u2606")))), showFlags && /* @__PURE__ */ React8.createElement(View8, { style: styles6.flagsSection }, /* @__PURE__ */ React8.createElement(Text6, { style: styles6.flagsLabel }, "What could be improved?"), [
17011
+ return /* @__PURE__ */ React8.createElement(View8, { style: styles7.container }, /* @__PURE__ */ React8.createElement(Text6, { style: styles7.header }, status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed"), /* @__PURE__ */ React8.createElement(Text6, { style: styles7.subheader }, "Rate this test case"), /* @__PURE__ */ React8.createElement(View8, { style: styles7.starRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React8.createElement(TouchableOpacity6, { key: n, onPress: () => setRating(n), style: styles7.starButton }, /* @__PURE__ */ React8.createElement(Text6, { style: [styles7.star, n <= rating && styles7.starActive] }, n <= rating ? "\u2605" : "\u2606")))), showFlags && /* @__PURE__ */ React8.createElement(View8, { style: styles7.flagsSection }, /* @__PURE__ */ React8.createElement(Text6, { style: styles7.flagsLabel }, "What could be improved?"), [
16924
17012
  { key: "isOutdated", label: "Test is outdated" },
16925
17013
  { key: "needsMoreDetail", label: "Needs more detail" },
16926
17014
  { key: "stepsUnclear", label: "Steps are unclear" },
@@ -16929,15 +17017,15 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
16929
17017
  TouchableOpacity6,
16930
17018
  {
16931
17019
  key,
16932
- style: [styles6.flagItem, flags[key] && styles6.flagItemActive],
17020
+ style: [styles7.flagItem, flags[key] && styles7.flagItemActive],
16933
17021
  onPress: () => setFlags((prev) => ({ ...prev, [key]: !prev[key] }))
16934
17022
  },
16935
- /* @__PURE__ */ React8.createElement(View8, { style: [styles6.flagCheck, flags[key] && styles6.flagCheckActive] }, flags[key] && /* @__PURE__ */ React8.createElement(Text6, { style: styles6.flagCheckmark }, "\u2713")),
16936
- /* @__PURE__ */ React8.createElement(Text6, { style: [styles6.flagText, flags[key] && styles6.flagTextActive] }, label)
17023
+ /* @__PURE__ */ React8.createElement(View8, { style: [styles7.flagCheck, flags[key] && styles7.flagCheckActive] }, flags[key] && /* @__PURE__ */ React8.createElement(Text6, { style: styles7.flagCheckmark }, "\u2713")),
17024
+ /* @__PURE__ */ React8.createElement(Text6, { style: [styles7.flagText, flags[key] && styles7.flagTextActive] }, label)
16937
17025
  ))), /* @__PURE__ */ React8.createElement(
16938
17026
  TextInput3,
16939
17027
  {
16940
- style: styles6.noteInput,
17028
+ style: styles7.noteInput,
16941
17029
  value: note,
16942
17030
  onChangeText: setNote,
16943
17031
  placeholder: "Add a note (optional)",
@@ -16954,7 +17042,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
16954
17042
  onRemove: images.removeImage,
16955
17043
  label: "Screenshots (optional)"
16956
17044
  }
16957
- ), /* @__PURE__ */ React8.createElement(View8, { style: styles6.actions }, /* @__PURE__ */ React8.createElement(TouchableOpacity6, { style: styles6.skipButton, onPress: handleSkip }, /* @__PURE__ */ React8.createElement(Text6, { style: styles6.skipText }, "Skip")), /* @__PURE__ */ React8.createElement(TouchableOpacity6, { style: [shared.primaryButton, { flex: 2, opacity: submitting || images.isUploading ? 0.5 : 1 }], onPress: handleSubmit, disabled: submitting || images.isUploading }, /* @__PURE__ */ React8.createElement(Text6, { style: shared.primaryButtonText }, images.isUploading ? "Uploading..." : submitting ? "Submitting..." : "Submit"))));
17045
+ ), /* @__PURE__ */ React8.createElement(View8, { style: styles7.actions }, /* @__PURE__ */ React8.createElement(TouchableOpacity6, { style: styles7.skipButton, onPress: handleSkip }, /* @__PURE__ */ React8.createElement(Text6, { style: styles7.skipText }, "Skip")), /* @__PURE__ */ React8.createElement(TouchableOpacity6, { style: [shared.primaryButton, { flex: 2, opacity: submitting || images.isUploading ? 0.5 : 1 }], onPress: handleSubmit, disabled: submitting || images.isUploading }, /* @__PURE__ */ React8.createElement(Text6, { style: shared.primaryButtonText }, images.isUploading ? "Uploading..." : submitting ? "Submitting..." : "Submit"))));
16958
17046
  }
16959
17047
  function createStyles4() {
16960
17048
  return StyleSheet8.create({
@@ -17143,7 +17231,7 @@ var styles3 = StyleSheet9.create({
17143
17231
  // src/widget/screens/ReportScreen.tsx
17144
17232
  function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17145
17233
  const { client, getDeviceInfo, uploadImage, refreshAssignments, widgetColorScheme } = useBugBear();
17146
- const styles6 = useMemo5(() => createStyles5(), [widgetColorScheme]);
17234
+ const styles7 = useMemo5(() => createStyles5(), [widgetColorScheme]);
17147
17235
  const [reportType, setReportType] = useState8(prefill?.type || "bug");
17148
17236
  const [severity, setSeverity] = useState8("medium");
17149
17237
  const [category, setCategory] = useState8(null);
@@ -17249,7 +17337,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17249
17337
  submittingRef.current = false;
17250
17338
  }
17251
17339
  };
17252
- return /* @__PURE__ */ React10.createElement(View10, null, isRetestFailure ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(View10, { style: styles6.retestBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles6.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React10.createElement(View10, null, /* @__PURE__ */ React10.createElement(Text8, { style: styles6.retestTitle }, "Bug Still Present"), /* @__PURE__ */ React10.createElement(Text8, { style: styles6.retestSubtitle }, "The fix did not resolve this issue"))), /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles6.severityRow }, [
17340
+ return /* @__PURE__ */ React10.createElement(View10, null, isRetestFailure ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(View10, { style: styles7.retestBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles7.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React10.createElement(View10, null, /* @__PURE__ */ React10.createElement(Text8, { style: styles7.retestTitle }, "Bug Still Present"), /* @__PURE__ */ React10.createElement(Text8, { style: styles7.retestSubtitle }, "The fix did not resolve this issue"))), /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles7.severityRow }, [
17253
17341
  { sev: "critical", color: colors.red },
17254
17342
  { sev: "high", color: colors.orange },
17255
17343
  { sev: "medium", color: colors.yellow },
@@ -17258,14 +17346,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17258
17346
  TouchableOpacity8,
17259
17347
  {
17260
17348
  key: sev,
17261
- style: [styles6.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
17349
+ style: [styles7.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
17262
17350
  onPress: () => setSeverity(sev)
17263
17351
  },
17264
- /* @__PURE__ */ React10.createElement(Text8, { style: [styles6.sevText, severity === sev && { color }] }, sev)
17265
- )))), /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ React10.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What went wrong?"), /* @__PURE__ */ React10.createElement(
17352
+ /* @__PURE__ */ React10.createElement(Text8, { style: [styles7.sevText, severity === sev && { color }] }, sev)
17353
+ )))), /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ React10.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What went wrong?"), /* @__PURE__ */ React10.createElement(
17266
17354
  TextInput4,
17267
17355
  {
17268
- style: styles6.descInput,
17356
+ style: styles7.descInput,
17269
17357
  value: description,
17270
17358
  onChangeText: setDescription,
17271
17359
  placeholder: "Describe what you observed. What still doesn't work?",
@@ -17318,15 +17406,15 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17318
17406
  onRemove: images.removeImage,
17319
17407
  label: "Attachments (optional)"
17320
17408
  }
17321
- ), error && /* @__PURE__ */ React10.createElement(View10, { style: styles6.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles6.errorText }, error)), /* @__PURE__ */ React10.createElement(
17409
+ ), error && /* @__PURE__ */ React10.createElement(View10, { style: styles7.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles7.errorText }, error)), /* @__PURE__ */ React10.createElement(
17322
17410
  TouchableOpacity8,
17323
17411
  {
17324
- style: [shared.primaryButton, styles6.retestSubmitButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
17412
+ style: [shared.primaryButton, styles7.retestSubmitButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
17325
17413
  onPress: handleSubmit,
17326
17414
  disabled: !description.trim() || submitting || images.isUploading
17327
17415
  },
17328
17416
  /* @__PURE__ */ React10.createElement(Text8, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest")
17329
- )) : /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ React10.createElement(View10, { style: styles6.typeRow }, [
17417
+ )) : /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ React10.createElement(View10, { style: styles7.typeRow }, [
17330
17418
  { type: "bug", label: "Bug", icon: "\u{1F41B}" },
17331
17419
  { type: "feedback", label: "Feedback", icon: "\u{1F4A1}" },
17332
17420
  { type: "suggestion", label: "Idea", icon: "\u2728" }
@@ -17334,12 +17422,12 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17334
17422
  TouchableOpacity8,
17335
17423
  {
17336
17424
  key: type,
17337
- style: [styles6.typeCard, reportType === type && styles6.typeCardActive],
17425
+ style: [styles7.typeCard, reportType === type && styles7.typeCardActive],
17338
17426
  onPress: () => setReportType(type)
17339
17427
  },
17340
- /* @__PURE__ */ React10.createElement(Text8, { style: styles6.typeIcon }, icon),
17341
- /* @__PURE__ */ React10.createElement(Text8, { style: [styles6.typeLabel, reportType === type && styles6.typeLabelActive] }, label)
17342
- ))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles6.severityRow }, [
17428
+ /* @__PURE__ */ React10.createElement(Text8, { style: styles7.typeIcon }, icon),
17429
+ /* @__PURE__ */ React10.createElement(Text8, { style: [styles7.typeLabel, reportType === type && styles7.typeLabelActive] }, label)
17430
+ ))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles7.severityRow }, [
17343
17431
  { sev: "critical", color: colors.red },
17344
17432
  { sev: "high", color: colors.orange },
17345
17433
  { sev: "medium", color: colors.yellow },
@@ -17348,14 +17436,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17348
17436
  TouchableOpacity8,
17349
17437
  {
17350
17438
  key: sev,
17351
- style: [styles6.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
17439
+ style: [styles7.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
17352
17440
  onPress: () => setSeverity(sev)
17353
17441
  },
17354
- /* @__PURE__ */ React10.createElement(Text8, { style: [styles6.sevText, severity === sev && { color }] }, sev)
17355
- )))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ React10.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What happened?"), /* @__PURE__ */ React10.createElement(
17442
+ /* @__PURE__ */ React10.createElement(Text8, { style: [styles7.sevText, severity === sev && { color }] }, sev)
17443
+ )))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ React10.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What happened?"), /* @__PURE__ */ React10.createElement(
17356
17444
  TextInput4,
17357
17445
  {
17358
- style: styles6.descInput,
17446
+ style: styles7.descInput,
17359
17447
  value: description,
17360
17448
  onChangeText: setDescription,
17361
17449
  placeholder: "Describe the issue...",
@@ -17398,16 +17486,16 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17398
17486
  issue.title
17399
17487
  ),
17400
17488
  /* @__PURE__ */ React10.createElement(Text8, { style: { fontSize: 11, color: colors.textMuted } }, issue.status)
17401
- )))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Which screen?"), /* @__PURE__ */ React10.createElement(
17489
+ )))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Which screen?"), /* @__PURE__ */ React10.createElement(
17402
17490
  TextInput4,
17403
17491
  {
17404
- style: styles6.screenInput,
17492
+ style: styles7.screenInput,
17405
17493
  value: affectedScreen,
17406
17494
  onChangeText: setAffectedScreen,
17407
17495
  placeholder: "e.g. Reservations, Settings...",
17408
17496
  placeholderTextColor: colors.textMuted
17409
17497
  }
17410
- ), /* @__PURE__ */ React10.createElement(Text8, { style: styles6.screenHint }, "Which screen or area was the bug on? (optional)")), /* @__PURE__ */ React10.createElement(
17498
+ ), /* @__PURE__ */ React10.createElement(Text8, { style: styles7.screenHint }, "Which screen or area was the bug on? (optional)")), /* @__PURE__ */ React10.createElement(
17411
17499
  ImagePickerButtons,
17412
17500
  {
17413
17501
  images: images.images,
@@ -17417,7 +17505,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17417
17505
  onRemove: images.removeImage,
17418
17506
  label: "Screenshots (optional)"
17419
17507
  }
17420
- ), error && /* @__PURE__ */ React10.createElement(View10, { style: styles6.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles6.errorText }, error)), /* @__PURE__ */ React10.createElement(
17508
+ ), error && /* @__PURE__ */ React10.createElement(View10, { style: styles7.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles7.errorText }, error)), /* @__PURE__ */ React10.createElement(
17421
17509
  TouchableOpacity8,
17422
17510
  {
17423
17511
  style: [shared.primaryButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
@@ -17457,12 +17545,12 @@ import React11, { useEffect as useEffect7, useMemo as useMemo6 } from "react";
17457
17545
  import { View as View11, Text as Text9, StyleSheet as StyleSheet11 } from "react-native";
17458
17546
  function ReportSuccessScreen({ nav }) {
17459
17547
  const { widgetColorScheme } = useBugBear();
17460
- const styles6 = useMemo6(() => createStyles6(), [widgetColorScheme]);
17548
+ const styles7 = useMemo6(() => createStyles6(), [widgetColorScheme]);
17461
17549
  useEffect7(() => {
17462
17550
  const timer = setTimeout(() => nav.reset(), 2e3);
17463
17551
  return () => clearTimeout(timer);
17464
17552
  }, [nav]);
17465
- return /* @__PURE__ */ React11.createElement(View11, { style: styles6.container }, /* @__PURE__ */ React11.createElement(Text9, { style: styles6.emoji }, "\u{1F389}"), /* @__PURE__ */ React11.createElement(Text9, { style: styles6.title }, "Report submitted!"), /* @__PURE__ */ React11.createElement(Text9, { style: styles6.subtitle }, "Thank you for your feedback"));
17553
+ return /* @__PURE__ */ React11.createElement(View11, { style: styles7.container }, /* @__PURE__ */ React11.createElement(Text9, { style: styles7.emoji }, "\u{1F389}"), /* @__PURE__ */ React11.createElement(Text9, { style: styles7.title }, "Report submitted!"), /* @__PURE__ */ React11.createElement(Text9, { style: styles7.subtitle }, "Thank you for your feedback"));
17466
17554
  }
17467
17555
  function createStyles6() {
17468
17556
  return StyleSheet11.create({
@@ -17478,7 +17566,7 @@ import React12, { useMemo as useMemo7, useState as useState9 } from "react";
17478
17566
  import { View as View12, Text as Text10, TouchableOpacity as TouchableOpacity9, ScrollView as ScrollView3, StyleSheet as StyleSheet12, Linking as Linking3 } from "react-native";
17479
17567
  function MessageListScreen({ nav }) {
17480
17568
  const { threads, unreadCount, refreshThreads, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
17481
- const styles6 = useMemo7(() => createStyles7(), [widgetColorScheme]);
17569
+ const styles7 = useMemo7(() => createStyles7(), [widgetColorScheme]);
17482
17570
  const [activeFilter, setActiveFilter] = useState9("all");
17483
17571
  const filteredThreads = threads.filter((thread) => {
17484
17572
  if (activeFilter === "all") return true;
@@ -17496,10 +17584,10 @@ function MessageListScreen({ nav }) {
17496
17584
  return /* @__PURE__ */ React12.createElement(View12, null, /* @__PURE__ */ React12.createElement(
17497
17585
  TouchableOpacity9,
17498
17586
  {
17499
- style: styles6.newMsgButton,
17587
+ style: styles7.newMsgButton,
17500
17588
  onPress: () => nav.push({ name: "COMPOSE_MESSAGE" })
17501
17589
  },
17502
- /* @__PURE__ */ React12.createElement(Text10, { style: styles6.newMsgText }, "\u2709\uFE0F New Message")
17590
+ /* @__PURE__ */ React12.createElement(Text10, { style: styles7.newMsgText }, "\u2709\uFE0F New Message")
17503
17591
  ), /* @__PURE__ */ React12.createElement(
17504
17592
  ScrollView3,
17505
17593
  {
@@ -17544,20 +17632,20 @@ function MessageListScreen({ nav }) {
17544
17632
  TouchableOpacity9,
17545
17633
  {
17546
17634
  key: thread.id,
17547
- style: [styles6.threadItem, thread.unreadCount > 0 && styles6.threadItemUnread],
17635
+ style: [styles7.threadItem, thread.unreadCount > 0 && styles7.threadItemUnread],
17548
17636
  onPress: () => nav.push({ name: "THREAD_DETAIL", thread })
17549
17637
  },
17550
- /* @__PURE__ */ React12.createElement(View12, { style: styles6.threadLeft }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.threadIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React12.createElement(View12, { style: styles6.threadInfo }, /* @__PURE__ */ React12.createElement(View12, { style: styles6.threadTitleRow }, thread.isPinned && /* @__PURE__ */ React12.createElement(Text10, { style: styles6.pinIcon }, "\u{1F4CC}"), /* @__PURE__ */ React12.createElement(Text10, { style: styles6.threadSubject, numberOfLines: 1 }, thread.subject || "No subject")), thread.threadType === "report" && thread.reporterName && /* @__PURE__ */ React12.createElement(Text10, { style: { fontSize: 11, color: colors.textMuted } }, "Reported by: ", thread.reporterName), thread.lastMessage && /* @__PURE__ */ React12.createElement(Text10, { style: styles6.threadPreview, numberOfLines: 1 }, thread.lastMessage.senderName, ": ", thread.lastMessage.content))),
17551
- /* @__PURE__ */ React12.createElement(View12, { style: styles6.threadRight }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.threadTime }, formatRelativeTime(thread.lastMessageAt)), thread.unreadCount > 0 && /* @__PURE__ */ React12.createElement(View12, { style: styles6.unreadBadge }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.unreadText }, thread.unreadCount)), thread.priority !== "normal" && /* @__PURE__ */ React12.createElement(View12, { style: [styles6.priorityDot, { backgroundColor: getPriorityColor(thread.priority) }] }))
17638
+ /* @__PURE__ */ React12.createElement(View12, { style: styles7.threadLeft }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.threadIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React12.createElement(View12, { style: styles7.threadInfo }, /* @__PURE__ */ React12.createElement(View12, { style: styles7.threadTitleRow }, thread.isPinned && /* @__PURE__ */ React12.createElement(Text10, { style: styles7.pinIcon }, "\u{1F4CC}"), /* @__PURE__ */ React12.createElement(Text10, { style: styles7.threadSubject, numberOfLines: 1 }, thread.subject || "No subject")), thread.threadType === "report" && thread.reporterName && /* @__PURE__ */ React12.createElement(Text10, { style: { fontSize: 11, color: colors.textMuted } }, "Reported by: ", thread.reporterName), thread.lastMessage && /* @__PURE__ */ React12.createElement(Text10, { style: styles7.threadPreview, numberOfLines: 1 }, thread.lastMessage.senderName, ": ", thread.lastMessage.content))),
17639
+ /* @__PURE__ */ React12.createElement(View12, { style: styles7.threadRight }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.threadTime }, formatRelativeTime(thread.lastMessageAt)), thread.unreadCount > 0 && /* @__PURE__ */ React12.createElement(View12, { style: styles7.unreadBadge }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.unreadText }, thread.unreadCount)), thread.priority !== "normal" && /* @__PURE__ */ React12.createElement(View12, { style: [styles7.priorityDot, { backgroundColor: getPriorityColor(thread.priority) }] }))
17552
17640
  ))), dashboardUrl && /* @__PURE__ */ React12.createElement(
17553
17641
  TouchableOpacity9,
17554
17642
  {
17555
- style: styles6.dashboardLink,
17643
+ style: styles7.dashboardLink,
17556
17644
  onPress: () => Linking3.openURL(`${dashboardUrl}/discussions`),
17557
17645
  activeOpacity: 0.7
17558
17646
  },
17559
- /* @__PURE__ */ React12.createElement(Text10, { style: styles6.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
17560
- ), /* @__PURE__ */ React12.createElement(View12, { style: styles6.footer }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.footerText }, filteredThreads.length, " thread", filteredThreads.length !== 1 ? "s" : "", " \xB7 ", unreadCount, " unread"), /* @__PURE__ */ React12.createElement(TouchableOpacity9, { onPress: refreshThreads }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.refreshText }, "\u21BB Refresh"))));
17647
+ /* @__PURE__ */ React12.createElement(Text10, { style: styles7.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
17648
+ ), /* @__PURE__ */ React12.createElement(View12, { style: styles7.footer }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.footerText }, filteredThreads.length, " thread", filteredThreads.length !== 1 ? "s" : "", " \xB7 ", unreadCount, " unread"), /* @__PURE__ */ React12.createElement(TouchableOpacity9, { onPress: refreshThreads }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.refreshText }, "\u21BB Refresh"))));
17561
17649
  }
17562
17650
  function createStyles7() {
17563
17651
  return StyleSheet12.create({
@@ -17590,7 +17678,7 @@ import React13, { useState as useState10, useEffect as useEffect8, useMemo as us
17590
17678
  import { View as View13, Text as Text11, TouchableOpacity as TouchableOpacity10, TextInput as TextInput5, StyleSheet as StyleSheet13, Image as Image2 } from "react-native";
17591
17679
  function ThreadDetailScreen({ thread, nav }) {
17592
17680
  const { getThreadMessages, sendMessage, markAsRead, uploadImage, widgetColorScheme } = useBugBear();
17593
- const styles6 = useMemo8(() => createStyles8(), [widgetColorScheme]);
17681
+ const styles7 = useMemo8(() => createStyles8(), [widgetColorScheme]);
17594
17682
  const [messages, setMessages] = useState10([]);
17595
17683
  const [loading, setLoading] = useState10(true);
17596
17684
  const [replyText, setReplyText] = useState10("");
@@ -17642,20 +17730,20 @@ function ThreadDetailScreen({ thread, nav }) {
17642
17730
  }
17643
17731
  setSending(false);
17644
17732
  };
17645
- return /* @__PURE__ */ React13.createElement(View13, { style: styles6.container }, /* @__PURE__ */ React13.createElement(View13, { style: styles6.header }, /* @__PURE__ */ React13.createElement(Text11, { style: styles6.headerIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React13.createElement(Text11, { style: styles6.headerSubject, numberOfLines: 2 }, thread.subject || "No subject")), loading ? /* @__PURE__ */ React13.createElement(View13, { style: styles6.loadingContainer }, /* @__PURE__ */ React13.createElement(Text11, { style: styles6.loadingText }, "Loading messages...")) : /* @__PURE__ */ React13.createElement(View13, { style: styles6.messagesContainer }, messages.map((msg) => /* @__PURE__ */ React13.createElement(
17733
+ return /* @__PURE__ */ React13.createElement(View13, { style: styles7.container }, /* @__PURE__ */ React13.createElement(View13, { style: styles7.header }, /* @__PURE__ */ React13.createElement(Text11, { style: styles7.headerIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React13.createElement(Text11, { style: styles7.headerSubject, numberOfLines: 2 }, thread.subject || "No subject")), loading ? /* @__PURE__ */ React13.createElement(View13, { style: styles7.loadingContainer }, /* @__PURE__ */ React13.createElement(Text11, { style: styles7.loadingText }, "Loading messages...")) : /* @__PURE__ */ React13.createElement(View13, { style: styles7.messagesContainer }, messages.map((msg) => /* @__PURE__ */ React13.createElement(
17646
17734
  View13,
17647
17735
  {
17648
17736
  key: msg.id,
17649
- style: [styles6.bubble, msg.senderType === "tester" ? styles6.bubbleTester : styles6.bubbleAdmin]
17737
+ style: [styles7.bubble, msg.senderType === "tester" ? styles7.bubbleTester : styles7.bubbleAdmin]
17650
17738
  },
17651
- /* @__PURE__ */ React13.createElement(Text11, { style: [styles6.sender, msg.senderType === "tester" && styles6.senderTester] }, msg.senderType === "tester" ? "You" : msg.senderName),
17652
- /* @__PURE__ */ React13.createElement(Text11, { style: [styles6.content, msg.senderType === "tester" && styles6.contentTester] }, msg.content),
17653
- msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles6.attachments }, msg.attachments.filter((a) => a.type === "image").map((att, idx) => /* @__PURE__ */ React13.createElement(Image2, { key: idx, source: { uri: att.url }, style: styles6.attachmentImage, resizeMode: "cover" }))),
17654
- /* @__PURE__ */ React13.createElement(Text11, { style: [styles6.time, msg.senderType === "tester" && styles6.timeTester] }, formatMessageTime(msg.createdAt))
17655
- ))), sendError && /* @__PURE__ */ React13.createElement(View13, { style: styles6.errorBar }, /* @__PURE__ */ React13.createElement(Text11, { style: styles6.errorText }, "Failed to send. Tap Send to retry.")), replyImages.images.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles6.replyPreview }, /* @__PURE__ */ React13.createElement(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage })), /* @__PURE__ */ React13.createElement(View13, { style: styles6.composer }, IMAGE_PICKER_AVAILABLE && /* @__PURE__ */ React13.createElement(TouchableOpacity10, { style: styles6.attachBtn, onPress: replyImages.pickFromGallery, disabled: replyImages.images.length >= 3 }, /* @__PURE__ */ React13.createElement(Text11, { style: styles6.attachBtnText }, "\u{1F4CE}")), /* @__PURE__ */ React13.createElement(
17739
+ /* @__PURE__ */ React13.createElement(Text11, { style: [styles7.sender, msg.senderType === "tester" && styles7.senderTester] }, msg.senderType === "tester" ? "You" : msg.senderName),
17740
+ /* @__PURE__ */ React13.createElement(Text11, { style: [styles7.content, msg.senderType === "tester" && styles7.contentTester] }, msg.content),
17741
+ msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles7.attachments }, msg.attachments.filter((a) => a.type === "image").map((att, idx) => /* @__PURE__ */ React13.createElement(Image2, { key: idx, source: { uri: att.url }, style: styles7.attachmentImage, resizeMode: "cover" }))),
17742
+ /* @__PURE__ */ React13.createElement(Text11, { style: [styles7.time, msg.senderType === "tester" && styles7.timeTester] }, formatMessageTime(msg.createdAt))
17743
+ ))), sendError && /* @__PURE__ */ React13.createElement(View13, { style: styles7.errorBar }, /* @__PURE__ */ React13.createElement(Text11, { style: styles7.errorText }, "Failed to send. Tap Send to retry.")), replyImages.images.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles7.replyPreview }, /* @__PURE__ */ React13.createElement(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage })), /* @__PURE__ */ React13.createElement(View13, { style: styles7.composer }, IMAGE_PICKER_AVAILABLE && /* @__PURE__ */ React13.createElement(TouchableOpacity10, { style: styles7.attachBtn, onPress: replyImages.pickFromGallery, disabled: replyImages.images.length >= 3 }, /* @__PURE__ */ React13.createElement(Text11, { style: styles7.attachBtnText }, "\u{1F4CE}")), /* @__PURE__ */ React13.createElement(
17656
17744
  TextInput5,
17657
17745
  {
17658
- style: styles6.replyInput,
17746
+ style: styles7.replyInput,
17659
17747
  value: replyText,
17660
17748
  onChangeText: setReplyText,
17661
17749
  placeholder: "Type a reply...",
@@ -17666,11 +17754,11 @@ function ThreadDetailScreen({ thread, nav }) {
17666
17754
  ), /* @__PURE__ */ React13.createElement(
17667
17755
  TouchableOpacity10,
17668
17756
  {
17669
- style: [styles6.sendBtn, (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) && styles6.sendBtnDisabled],
17757
+ style: [styles7.sendBtn, (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) && styles7.sendBtnDisabled],
17670
17758
  onPress: handleSend,
17671
17759
  disabled: !replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading
17672
17760
  },
17673
- /* @__PURE__ */ React13.createElement(Text11, { style: styles6.sendBtnText }, sending ? "..." : "Send")
17761
+ /* @__PURE__ */ React13.createElement(Text11, { style: styles7.sendBtnText }, sending ? "..." : "Send")
17674
17762
  )));
17675
17763
  }
17676
17764
  function createStyles8() {
@@ -17711,7 +17799,7 @@ import React14, { useState as useState11, useMemo as useMemo9 } from "react";
17711
17799
  import { View as View14, Text as Text12, TextInput as TextInput6, TouchableOpacity as TouchableOpacity11, StyleSheet as StyleSheet14 } from "react-native";
17712
17800
  function ComposeMessageScreen({ nav }) {
17713
17801
  const { createThread, uploadImage, widgetColorScheme } = useBugBear();
17714
- const styles6 = useMemo9(() => createStyles9(), [widgetColorScheme]);
17802
+ const styles7 = useMemo9(() => createStyles9(), [widgetColorScheme]);
17715
17803
  const [subject, setSubject] = useState11("");
17716
17804
  const [message, setMessage] = useState11("");
17717
17805
  const [sending, setSending] = useState11(false);
@@ -17730,10 +17818,10 @@ function ComposeMessageScreen({ nav }) {
17730
17818
  nav.pop();
17731
17819
  }
17732
17820
  };
17733
- return /* @__PURE__ */ React14.createElement(View14, null, /* @__PURE__ */ React14.createElement(View14, { style: styles6.header }, /* @__PURE__ */ React14.createElement(Text12, { style: styles6.title }, "New Message"), /* @__PURE__ */ React14.createElement(Text12, { style: styles6.subtitle }, "Send a message to the QA team")), /* @__PURE__ */ React14.createElement(View14, { style: styles6.form }, /* @__PURE__ */ React14.createElement(Text12, { style: shared.label }, "Subject"), /* @__PURE__ */ React14.createElement(
17821
+ return /* @__PURE__ */ React14.createElement(View14, null, /* @__PURE__ */ React14.createElement(View14, { style: styles7.header }, /* @__PURE__ */ React14.createElement(Text12, { style: styles7.title }, "New Message"), /* @__PURE__ */ React14.createElement(Text12, { style: styles7.subtitle }, "Send a message to the QA team")), /* @__PURE__ */ React14.createElement(View14, { style: styles7.form }, /* @__PURE__ */ React14.createElement(Text12, { style: shared.label }, "Subject"), /* @__PURE__ */ React14.createElement(
17734
17822
  TextInput6,
17735
17823
  {
17736
- style: styles6.subjectInput,
17824
+ style: styles7.subjectInput,
17737
17825
  value: subject,
17738
17826
  onChangeText: setSubject,
17739
17827
  placeholder: "What's this about?",
@@ -17743,7 +17831,7 @@ function ComposeMessageScreen({ nav }) {
17743
17831
  ), /* @__PURE__ */ React14.createElement(Text12, { style: [shared.label, { marginTop: 16 }] }, "Message"), /* @__PURE__ */ React14.createElement(
17744
17832
  TextInput6,
17745
17833
  {
17746
- style: styles6.messageInput,
17834
+ style: styles7.messageInput,
17747
17835
  value: message,
17748
17836
  onChangeText: setMessage,
17749
17837
  placeholder: "Write your message...",
@@ -17788,7 +17876,7 @@ import React15, { useState as useState12, useEffect as useEffect9, useMemo as us
17788
17876
  import { View as View15, Text as Text13, TouchableOpacity as TouchableOpacity12, TextInput as TextInput7, StyleSheet as StyleSheet15 } from "react-native";
17789
17877
  function ProfileScreen({ nav }) {
17790
17878
  const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo, widgetColorScheme } = useBugBear();
17791
- const styles6 = useMemo10(() => createStyles10(), [widgetColorScheme]);
17879
+ const styles7 = useMemo10(() => createStyles10(), [widgetColorScheme]);
17792
17880
  const [editing, setEditing] = useState12(false);
17793
17881
  const [name, setName] = useState12(testerInfo?.name || "");
17794
17882
  const [additionalEmails, setAdditionalEmails] = useState12(testerInfo?.additionalEmails || []);
@@ -17839,13 +17927,13 @@ function ProfileScreen({ nav }) {
17839
17927
  return /* @__PURE__ */ React15.createElement(View15, { style: shared.emptyState }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.emptyEmoji }, "\u{1F464}"), /* @__PURE__ */ React15.createElement(Text13, { style: shared.emptyTitle }, "No profile found"));
17840
17928
  }
17841
17929
  if (editing) {
17842
- return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles6.editHeader }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.editTitle }, "Edit Profile"), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => {
17930
+ return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles7.editHeader }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.editTitle }, "Edit Profile"), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => {
17843
17931
  setEditing(false);
17844
17932
  setNewEmailInput("");
17845
- } }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.cancelText }, "Cancel"))), /* @__PURE__ */ React15.createElement(View15, { style: styles6.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Name"), /* @__PURE__ */ React15.createElement(TextInput7, { style: styles6.input, value: name, onChangeText: setName, placeholder: "Your name", placeholderTextColor: colors.textMuted })), /* @__PURE__ */ React15.createElement(View15, { style: styles6.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Primary Email"), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.emailFixed }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles6.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Additional Emails"), additionalEmails.map((email) => /* @__PURE__ */ React15.createElement(View15, { key: email, style: styles6.emailRow }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.emailText }, email), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setAdditionalEmails(additionalEmails.filter((e) => e !== email)) }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.removeEmail }, "\u2715")))), /* @__PURE__ */ React15.createElement(View15, { style: styles6.addEmailRow }, /* @__PURE__ */ React15.createElement(
17933
+ } }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.cancelText }, "Cancel"))), /* @__PURE__ */ React15.createElement(View15, { style: styles7.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Name"), /* @__PURE__ */ React15.createElement(TextInput7, { style: styles7.input, value: name, onChangeText: setName, placeholder: "Your name", placeholderTextColor: colors.textMuted })), /* @__PURE__ */ React15.createElement(View15, { style: styles7.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Primary Email"), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.emailFixed }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles7.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Additional Emails"), additionalEmails.map((email) => /* @__PURE__ */ React15.createElement(View15, { key: email, style: styles7.emailRow }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.emailText }, email), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setAdditionalEmails(additionalEmails.filter((e) => e !== email)) }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.removeEmail }, "\u2715")))), /* @__PURE__ */ React15.createElement(View15, { style: styles7.addEmailRow }, /* @__PURE__ */ React15.createElement(
17846
17934
  TextInput7,
17847
17935
  {
17848
- style: [styles6.input, { flex: 1, marginRight: 8 }],
17936
+ style: [styles7.input, { flex: 1, marginRight: 8 }],
17849
17937
  value: newEmailInput,
17850
17938
  onChangeText: setNewEmailInput,
17851
17939
  placeholder: "Add email",
@@ -17853,17 +17941,17 @@ function ProfileScreen({ nav }) {
17853
17941
  keyboardType: "email-address",
17854
17942
  autoCapitalize: "none"
17855
17943
  }
17856
- ), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { style: styles6.addButton, onPress: handleAddEmail }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.addButtonText }, "Add")))), /* @__PURE__ */ React15.createElement(View15, { style: styles6.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Testing Platforms"), /* @__PURE__ */ React15.createElement(View15, { style: styles6.platformRow }, [{ key: "ios", label: "\u{1F4F1} iOS" }, { key: "android", label: "\u{1F916} Android" }, { key: "web", label: "\u{1F310} Web" }].map(({ key, label }) => /* @__PURE__ */ React15.createElement(
17944
+ ), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { style: styles7.addButton, onPress: handleAddEmail }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.addButtonText }, "Add")))), /* @__PURE__ */ React15.createElement(View15, { style: styles7.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Testing Platforms"), /* @__PURE__ */ React15.createElement(View15, { style: styles7.platformRow }, [{ key: "ios", label: "\u{1F4F1} iOS" }, { key: "android", label: "\u{1F916} Android" }, { key: "web", label: "\u{1F310} Web" }].map(({ key, label }) => /* @__PURE__ */ React15.createElement(
17857
17945
  TouchableOpacity12,
17858
17946
  {
17859
17947
  key,
17860
- style: [styles6.platformBtn, platforms.includes(key) && styles6.platformBtnActive],
17948
+ style: [styles7.platformBtn, platforms.includes(key) && styles7.platformBtnActive],
17861
17949
  onPress: () => setPlatforms((prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key])
17862
17950
  },
17863
- /* @__PURE__ */ React15.createElement(Text13, { style: [styles6.platformText, platforms.includes(key) && styles6.platformTextActive] }, label)
17951
+ /* @__PURE__ */ React15.createElement(Text13, { style: [styles7.platformText, platforms.includes(key) && styles7.platformTextActive] }, label)
17864
17952
  )))), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { style: [shared.primaryButton, { marginTop: 20 }], onPress: handleSave, disabled: saving }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.primaryButtonText }, saving ? "Saving..." : "Save Profile")));
17865
17953
  }
17866
- return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles6.profileCard }, /* @__PURE__ */ React15.createElement(View15, { style: styles6.avatar }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.avatarText }, testerInfo.name.charAt(0).toUpperCase())), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.profileName }, testerInfo.name), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.profileEmail }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles6.statsRow }, /* @__PURE__ */ React15.createElement(View15, { style: styles6.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.statNumber }, completedCount), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.statLabel }, "Completed")), /* @__PURE__ */ React15.createElement(View15, { style: styles6.statDivider }), /* @__PURE__ */ React15.createElement(View15, { style: styles6.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.statNumber }, assignments.length), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.statLabel }, "Total Assigned"))), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setShowDetails(!showDetails), style: styles6.detailsToggle }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React15.createElement(View15, { style: styles6.detailsSection }, additionalEmails.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles6.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.detailLabel }, "Additional Emails"), additionalEmails.map((e) => /* @__PURE__ */ React15.createElement(Text13, { key: e, style: styles6.detailValue }, e))), platforms.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles6.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.detailLabel }, "Platforms"), /* @__PURE__ */ React15.createElement(View15, { style: styles6.platformTags }, platforms.map((p) => /* @__PURE__ */ React15.createElement(View15, { key: p, style: styles6.platformTag }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.platformTagText }, p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web")))))), /* @__PURE__ */ React15.createElement(
17954
+ return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles7.profileCard }, /* @__PURE__ */ React15.createElement(View15, { style: styles7.avatar }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.avatarText }, testerInfo.name.charAt(0).toUpperCase())), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.profileName }, testerInfo.name), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.profileEmail }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles7.statsRow }, /* @__PURE__ */ React15.createElement(View15, { style: styles7.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.statNumber }, completedCount), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.statLabel }, "Completed")), /* @__PURE__ */ React15.createElement(View15, { style: styles7.statDivider }), /* @__PURE__ */ React15.createElement(View15, { style: styles7.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.statNumber }, assignments.length), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.statLabel }, "Total Assigned"))), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setShowDetails(!showDetails), style: styles7.detailsToggle }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React15.createElement(View15, { style: styles7.detailsSection }, additionalEmails.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles7.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.detailLabel }, "Additional Emails"), additionalEmails.map((e) => /* @__PURE__ */ React15.createElement(Text13, { key: e, style: styles7.detailValue }, e))), platforms.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles7.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.detailLabel }, "Platforms"), /* @__PURE__ */ React15.createElement(View15, { style: styles7.platformTags }, platforms.map((p) => /* @__PURE__ */ React15.createElement(View15, { key: p, style: styles7.platformTag }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.platformTagText }, p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web")))))), /* @__PURE__ */ React15.createElement(
17867
17955
  TouchableOpacity12,
17868
17956
  {
17869
17957
  style: [shared.primaryButton, { marginTop: 20 }],
@@ -17921,7 +18009,7 @@ var CATEGORIES = ["open", "done", "reopened"];
17921
18009
  var SEVERITY_ORDER2 = { critical: 0, high: 1, medium: 2, low: 3 };
17922
18010
  function IssueListScreen({ nav, category }) {
17923
18011
  const { client, widgetColorScheme } = useBugBear();
17924
- const styles6 = useMemo11(() => createStyles11(), [widgetColorScheme]);
18012
+ const styles7 = useMemo11(() => createStyles11(), [widgetColorScheme]);
17925
18013
  const CATEGORY_CONFIG = useMemo11(() => ({
17926
18014
  open: { label: "Open", accent: colors.orange, emptyIcon: "\u2705", emptyText: "No open issues" },
17927
18015
  done: { label: "Done", accent: colors.green, emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
@@ -17991,7 +18079,7 @@ function IssueListScreen({ nav, category }) {
17991
18079
  const searchFilteredIssues = debouncedQuery ? sortedIssues.filter(
17992
18080
  (issue) => (issue.title || "").toLowerCase().includes(debouncedQuery.toLowerCase()) || (issue.description || "").toLowerCase().includes(debouncedQuery.toLowerCase())
17993
18081
  ) : sortedIssues;
17994
- return /* @__PURE__ */ React16.createElement(View16, null, /* @__PURE__ */ React16.createElement(View16, { style: styles6.tabBar }, CATEGORIES.map((cat) => {
18082
+ return /* @__PURE__ */ React16.createElement(View16, null, /* @__PURE__ */ React16.createElement(View16, { style: styles7.tabBar }, CATEGORIES.map((cat) => {
17995
18083
  const catConfig = CATEGORY_CONFIG[cat];
17996
18084
  const isActive = activeCategory === cat;
17997
18085
  const count = counts?.[cat];
@@ -18000,7 +18088,7 @@ function IssueListScreen({ nav, category }) {
18000
18088
  {
18001
18089
  key: cat,
18002
18090
  style: [
18003
- styles6.tab,
18091
+ styles7.tab,
18004
18092
  { borderBottomColor: isActive ? catConfig.accent : "transparent" }
18005
18093
  ],
18006
18094
  onPress: () => {
@@ -18010,20 +18098,20 @@ function IssueListScreen({ nav, category }) {
18010
18098
  activeOpacity: 0.7
18011
18099
  },
18012
18100
  /* @__PURE__ */ React16.createElement(Text14, { style: [
18013
- styles6.tabLabel,
18101
+ styles7.tabLabel,
18014
18102
  isActive && { fontWeight: "600", color: colors.textPrimary }
18015
18103
  ] }, catConfig.label),
18016
18104
  count !== void 0 && /* @__PURE__ */ React16.createElement(View16, { style: [
18017
- styles6.countBadge,
18105
+ styles7.countBadge,
18018
18106
  {
18019
18107
  backgroundColor: isActive ? catConfig.accent + "18" : colors.card
18020
18108
  }
18021
18109
  ] }, /* @__PURE__ */ React16.createElement(Text14, { style: [
18022
- styles6.countText,
18110
+ styles7.countText,
18023
18111
  { color: isActive ? catConfig.accent : colors.textDim }
18024
18112
  ] }, count))
18025
18113
  );
18026
- })), /* @__PURE__ */ React16.createElement(View16, { style: styles6.sortRow }, [
18114
+ })), /* @__PURE__ */ React16.createElement(View16, { style: styles7.sortRow }, [
18027
18115
  { key: "severity", label: "Severity" },
18028
18116
  { key: "recent", label: "Recent" }
18029
18117
  ].map((s2) => /* @__PURE__ */ React16.createElement(
@@ -18031,14 +18119,14 @@ function IssueListScreen({ nav, category }) {
18031
18119
  {
18032
18120
  key: s2.key,
18033
18121
  style: [
18034
- styles6.sortBtn,
18035
- sortMode === s2.key && styles6.sortBtnActive
18122
+ styles7.sortBtn,
18123
+ sortMode === s2.key && styles7.sortBtnActive
18036
18124
  ],
18037
18125
  onPress: () => setSortMode(s2.key)
18038
18126
  },
18039
18127
  /* @__PURE__ */ React16.createElement(Text14, { style: [
18040
- styles6.sortBtnText,
18041
- sortMode === s2.key && styles6.sortBtnTextActive
18128
+ styles7.sortBtnText,
18129
+ sortMode === s2.key && styles7.sortBtnTextActive
18042
18130
  ] }, s2.label)
18043
18131
  ))), /* @__PURE__ */ React16.createElement(View16, { style: { paddingHorizontal: 16, paddingBottom: 12 } }, /* @__PURE__ */ React16.createElement(
18044
18132
  TextInput8,
@@ -18058,18 +18146,18 @@ function IssueListScreen({ nav, category }) {
18058
18146
  fontSize: 13
18059
18147
  }
18060
18148
  }
18061
- )), loading ? /* @__PURE__ */ React16.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ React16.createElement(View16, { style: styles6.emptyContainer }, /* @__PURE__ */ React16.createElement(Text14, { style: styles6.emptyIcon }, debouncedQuery ? "\u{1F50D}" : config.emptyIcon), /* @__PURE__ */ React16.createElement(Text14, { style: styles6.emptyText }, debouncedQuery ? "No matching issues" : config.emptyText)) : searchFilteredIssues.map((issue) => /* @__PURE__ */ React16.createElement(
18149
+ )), loading ? /* @__PURE__ */ React16.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ React16.createElement(View16, { style: styles7.emptyContainer }, /* @__PURE__ */ React16.createElement(Text14, { style: styles7.emptyIcon }, debouncedQuery ? "\u{1F50D}" : config.emptyIcon), /* @__PURE__ */ React16.createElement(Text14, { style: styles7.emptyText }, debouncedQuery ? "No matching issues" : config.emptyText)) : searchFilteredIssues.map((issue) => /* @__PURE__ */ React16.createElement(
18062
18150
  TouchableOpacity13,
18063
18151
  {
18064
18152
  key: issue.id,
18065
- style: styles6.issueCard,
18153
+ style: styles7.issueCard,
18066
18154
  onPress: () => nav.push({ name: "ISSUE_DETAIL", issue }),
18067
18155
  activeOpacity: 0.7
18068
18156
  },
18069
- /* @__PURE__ */ React16.createElement(View16, { style: styles6.topRow }, issue.severity && /* @__PURE__ */ React16.createElement(View16, { style: [styles6.severityDot, { backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim }] }), /* @__PURE__ */ React16.createElement(Text14, { style: styles6.issueTitle, numberOfLines: 1 }, issue.title)),
18070
- /* @__PURE__ */ React16.createElement(View16, { style: styles6.bottomRow }, issue.route && /* @__PURE__ */ React16.createElement(Text14, { style: styles6.routeText, numberOfLines: 1 }, issue.route), /* @__PURE__ */ React16.createElement(Text14, { style: styles6.timeText }, formatRelativeTime(issue.updatedAt))),
18071
- activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ React16.createElement(View16, { style: styles6.verifiedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles6.verifiedBadgeText }, "\u2714", " Verified by ", issue.verifiedByName)),
18072
- activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ React16.createElement(View16, { style: styles6.reopenedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles6.reopenedBadgeText, numberOfLines: 1 }, "\u{1F504}", " Retest of: ", issue.originalBugTitle))
18157
+ /* @__PURE__ */ React16.createElement(View16, { style: styles7.topRow }, issue.severity && /* @__PURE__ */ React16.createElement(View16, { style: [styles7.severityDot, { backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim }] }), /* @__PURE__ */ React16.createElement(Text14, { style: styles7.issueTitle, numberOfLines: 1 }, issue.title)),
18158
+ /* @__PURE__ */ React16.createElement(View16, { style: styles7.bottomRow }, issue.route && /* @__PURE__ */ React16.createElement(Text14, { style: styles7.routeText, numberOfLines: 1 }, issue.route), /* @__PURE__ */ React16.createElement(Text14, { style: styles7.timeText }, formatRelativeTime(issue.updatedAt))),
18159
+ activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ React16.createElement(View16, { style: styles7.verifiedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles7.verifiedBadgeText }, "\u2714", " Verified by ", issue.verifiedByName)),
18160
+ activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ React16.createElement(View16, { style: styles7.reopenedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles7.reopenedBadgeText, numberOfLines: 1 }, "\u{1F504}", " Retest of: ", issue.originalBugTitle))
18073
18161
  )));
18074
18162
  }
18075
18163
  function createStyles11() {
@@ -18228,7 +18316,7 @@ import { View as View17, Text as Text15, Image as Image3, StyleSheet as StyleShe
18228
18316
  var DONE_STATUSES = ["verified", "resolved", "closed", "reviewed"];
18229
18317
  function IssueDetailScreen({ nav, issue }) {
18230
18318
  const { dashboardUrl, widgetColorScheme, reopenReport } = useBugBear();
18231
- const styles6 = useMemo12(() => createStyles12(), [widgetColorScheme]);
18319
+ const styles7 = useMemo12(() => createStyles12(), [widgetColorScheme]);
18232
18320
  const [showReopenForm, setShowReopenForm] = useState14(false);
18233
18321
  const [reopenReason, setReopenReason] = useState14("");
18234
18322
  const [isSubmitting, setIsSubmitting] = useState14(false);
@@ -18270,44 +18358,44 @@ function IssueDetailScreen({ nav, issue }) {
18270
18358
  setReopenError(result.error || "Failed to reopen");
18271
18359
  }
18272
18360
  }, [reopenReason, reopenReport, issue.id]);
18273
- return /* @__PURE__ */ React17.createElement(View17, null, /* @__PURE__ */ React17.createElement(View17, { style: styles6.badgeRow }, /* @__PURE__ */ React17.createElement(View17, { style: [styles6.badge, { backgroundColor: wasReopened ? colors.yellowDark : statusConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles6.badgeText, { color: wasReopened ? colors.yellowLight : statusConfig.color }] }, wasReopened ? "Reopened" : statusConfig.label)), severityConfig && /* @__PURE__ */ React17.createElement(View17, { style: [styles6.badge, { backgroundColor: severityConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles6.badgeText, { color: severityConfig.color }] }, severityConfig.label))), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.title }, issue.title), issue.route && /* @__PURE__ */ React17.createElement(Text15, { style: styles6.route }, issue.route), issue.description && /* @__PURE__ */ React17.createElement(View17, { style: styles6.descriptionCard }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.descriptionText }, issue.description)), wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles6.reopenedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles6.reopenedRow }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenedIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenedText }, "Issue reopened \u2014 your team has been notified"))), issue.verifiedByName && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles6.verifiedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles6.verifiedHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.verifiedIcon }, "\u2705"), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.verifiedTitle }, "Retesting Proof")), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.verifiedBody }, "Verified by ", issue.verifiedByName, issue.verifiedAt && ` on ${new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })}`)), issue.originalBugTitle && /* @__PURE__ */ React17.createElement(View17, { style: styles6.originalBugCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles6.originalBugHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.originalBugIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.originalBugTitleText }, "Original Bug")), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.originalBugBody }, "Retest of: ", issue.originalBugTitle)), isDone && !wasReopened && !showReopenForm && /* @__PURE__ */ React17.createElement(
18361
+ return /* @__PURE__ */ React17.createElement(View17, null, /* @__PURE__ */ React17.createElement(View17, { style: styles7.badgeRow }, /* @__PURE__ */ React17.createElement(View17, { style: [styles7.badge, { backgroundColor: wasReopened ? colors.yellowDark : statusConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles7.badgeText, { color: wasReopened ? colors.yellowLight : statusConfig.color }] }, wasReopened ? "Reopened" : statusConfig.label)), severityConfig && /* @__PURE__ */ React17.createElement(View17, { style: [styles7.badge, { backgroundColor: severityConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles7.badgeText, { color: severityConfig.color }] }, severityConfig.label))), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.title }, issue.title), issue.route && /* @__PURE__ */ React17.createElement(Text15, { style: styles7.route }, issue.route), issue.description && /* @__PURE__ */ React17.createElement(View17, { style: styles7.descriptionCard }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.descriptionText }, issue.description)), wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles7.reopenedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles7.reopenedRow }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenedIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenedText }, "Issue reopened \u2014 your team has been notified"))), issue.verifiedByName && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles7.verifiedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles7.verifiedHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.verifiedIcon }, "\u2705"), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.verifiedTitle }, "Retesting Proof")), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.verifiedBody }, "Verified by ", issue.verifiedByName, issue.verifiedAt && ` on ${new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })}`)), issue.originalBugTitle && /* @__PURE__ */ React17.createElement(View17, { style: styles7.originalBugCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles7.originalBugHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.originalBugIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.originalBugTitleText }, "Original Bug")), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.originalBugBody }, "Retest of: ", issue.originalBugTitle)), isDone && !wasReopened && !showReopenForm && /* @__PURE__ */ React17.createElement(
18274
18362
  TouchableOpacity14,
18275
18363
  {
18276
- style: styles6.reopenButton,
18364
+ style: styles7.reopenButton,
18277
18365
  onPress: () => setShowReopenForm(true),
18278
18366
  activeOpacity: 0.7
18279
18367
  },
18280
- /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenButtonText }, "\u{1F504}", " Not Fixed \u2014 Reopen Issue")
18281
- ), showReopenForm && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles6.reopenForm }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenFormTitle }, "Why isn't this fixed?"), /* @__PURE__ */ React17.createElement(
18368
+ /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenButtonText }, "\u{1F504}", " Not Fixed \u2014 Reopen Issue")
18369
+ ), showReopenForm && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles7.reopenForm }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenFormTitle }, "Why isn't this fixed?"), /* @__PURE__ */ React17.createElement(
18282
18370
  TextInput9,
18283
18371
  {
18284
18372
  value: reopenReason,
18285
18373
  onChangeText: setReopenReason,
18286
18374
  placeholder: "Describe what you're still seeing...",
18287
18375
  placeholderTextColor: colors.textMuted,
18288
- style: styles6.reopenInput,
18376
+ style: styles7.reopenInput,
18289
18377
  multiline: true,
18290
18378
  autoFocus: true
18291
18379
  }
18292
- ), reopenError && /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenErrorText }, reopenError), /* @__PURE__ */ React17.createElement(View17, { style: styles6.reopenActions }, /* @__PURE__ */ React17.createElement(
18380
+ ), reopenError && /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenErrorText }, reopenError), /* @__PURE__ */ React17.createElement(View17, { style: styles7.reopenActions }, /* @__PURE__ */ React17.createElement(
18293
18381
  TouchableOpacity14,
18294
18382
  {
18295
18383
  style: [
18296
- styles6.reopenSubmitButton,
18297
- (!reopenReason.trim() || isSubmitting) && styles6.reopenSubmitDisabled
18384
+ styles7.reopenSubmitButton,
18385
+ (!reopenReason.trim() || isSubmitting) && styles7.reopenSubmitDisabled
18298
18386
  ],
18299
18387
  onPress: handleReopen,
18300
18388
  disabled: isSubmitting || !reopenReason.trim(),
18301
18389
  activeOpacity: 0.7
18302
18390
  },
18303
18391
  isSubmitting ? /* @__PURE__ */ React17.createElement(ActivityIndicator2, { size: "small", color: "#fff" }) : /* @__PURE__ */ React17.createElement(Text15, { style: [
18304
- styles6.reopenSubmitText,
18305
- !reopenReason.trim() && styles6.reopenSubmitTextDisabled
18392
+ styles7.reopenSubmitText,
18393
+ !reopenReason.trim() && styles7.reopenSubmitTextDisabled
18306
18394
  ] }, "Reopen Issue")
18307
18395
  ), /* @__PURE__ */ React17.createElement(
18308
18396
  TouchableOpacity14,
18309
18397
  {
18310
- style: styles6.reopenCancelButton,
18398
+ style: styles7.reopenCancelButton,
18311
18399
  onPress: () => {
18312
18400
  setShowReopenForm(false);
18313
18401
  setReopenReason("");
@@ -18316,7 +18404,7 @@ function IssueDetailScreen({ nav, issue }) {
18316
18404
  disabled: isSubmitting,
18317
18405
  activeOpacity: 0.7
18318
18406
  },
18319
- /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenCancelText }, "Cancel")
18407
+ /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenCancelText }, "Cancel")
18320
18408
  ))), issue.status === "ready_to_test" && (issue.fixCommitSha || issue.resolutionNotes) && /* @__PURE__ */ React17.createElement(View17, { style: {
18321
18409
  backgroundColor: "rgba(59, 130, 246, 0.1)",
18322
18410
  borderWidth: 1,
@@ -18324,14 +18412,14 @@ function IssueDetailScreen({ nav, issue }) {
18324
18412
  borderRadius: 8,
18325
18413
  padding: 12,
18326
18414
  marginBottom: 12
18327
- } }, /* @__PURE__ */ React17.createElement(View17, { style: { flexDirection: "row", alignItems: "center", gap: 6, marginBottom: 8 } }, /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 13 } }, "\u{1F527}"), /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 12, fontWeight: "600", color: "#60a5fa" } }, "Fix Details")), issue.resolutionNotes ? /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 12, color: colors.textSecondary, marginBottom: 6, lineHeight: 17 } }, issue.resolutionNotes) : null, issue.fixCommitSha ? /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 11, color: colors.textDim, fontFamily: "monospace" } }, "Commit: ", issue.fixCommitSha.slice(0, 7), issue.fixCommitMessage && ` \u2014 ${issue.fixCommitMessage}`) : null, issue.fixFilesChanged && issue.fixFilesChanged.length > 0 ? /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 11, color: colors.textDim, marginTop: 4 } }, issue.fixFilesChanged.length, " file", issue.fixFilesChanged.length > 1 ? "s" : "", " changed") : null), issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ React17.createElement(View17, { style: styles6.screenshotSection }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.screenshotLabel }, "Screenshots (", issue.screenshotUrls.length, ")"), /* @__PURE__ */ React17.createElement(View17, { style: styles6.screenshotRow }, issue.screenshotUrls.map((url, i) => /* @__PURE__ */ React17.createElement(TouchableOpacity14, { key: i, onPress: () => Linking4.openURL(url), activeOpacity: 0.7 }, /* @__PURE__ */ React17.createElement(Image3, { source: { uri: url }, style: styles6.screenshotThumb }))))), /* @__PURE__ */ React17.createElement(View17, { style: styles6.metaSection }, issue.reporterName && /* @__PURE__ */ React17.createElement(Text15, { style: styles6.metaText }, "Reported by ", issue.reporterName), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.metaTextSmall }, "Created ", formatRelativeTime(issue.createdAt), " ", "\xB7", " Updated ", formatRelativeTime(issue.updatedAt))), dashboardUrl && /* @__PURE__ */ React17.createElement(
18415
+ } }, /* @__PURE__ */ React17.createElement(View17, { style: { flexDirection: "row", alignItems: "center", gap: 6, marginBottom: 8 } }, /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 13 } }, "\u{1F527}"), /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 12, fontWeight: "600", color: "#60a5fa" } }, "Fix Details")), issue.resolutionNotes ? /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 12, color: colors.textSecondary, marginBottom: 6, lineHeight: 17 } }, issue.resolutionNotes) : null, issue.fixCommitSha ? /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 11, color: colors.textDim, fontFamily: "monospace" } }, "Commit: ", issue.fixCommitSha.slice(0, 7), issue.fixCommitMessage && ` \u2014 ${issue.fixCommitMessage}`) : null, issue.fixFilesChanged && issue.fixFilesChanged.length > 0 ? /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 11, color: colors.textDim, marginTop: 4 } }, issue.fixFilesChanged.length, " file", issue.fixFilesChanged.length > 1 ? "s" : "", " changed") : null), issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ React17.createElement(View17, { style: styles7.screenshotSection }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.screenshotLabel }, "Screenshots (", issue.screenshotUrls.length, ")"), /* @__PURE__ */ React17.createElement(View17, { style: styles7.screenshotRow }, issue.screenshotUrls.map((url, i) => /* @__PURE__ */ React17.createElement(TouchableOpacity14, { key: i, onPress: () => Linking4.openURL(url), activeOpacity: 0.7 }, /* @__PURE__ */ React17.createElement(Image3, { source: { uri: url }, style: styles7.screenshotThumb }))))), /* @__PURE__ */ React17.createElement(View17, { style: styles7.metaSection }, issue.reporterName && /* @__PURE__ */ React17.createElement(Text15, { style: styles7.metaText }, "Reported by ", issue.reporterName), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.metaTextSmall }, "Created ", formatRelativeTime(issue.createdAt), " ", "\xB7", " Updated ", formatRelativeTime(issue.updatedAt))), dashboardUrl && /* @__PURE__ */ React17.createElement(
18328
18416
  TouchableOpacity14,
18329
18417
  {
18330
- style: styles6.dashboardLink,
18418
+ style: styles7.dashboardLink,
18331
18419
  onPress: () => Linking4.openURL(`${dashboardUrl}/reports`),
18332
18420
  activeOpacity: 0.7
18333
18421
  },
18334
- /* @__PURE__ */ React17.createElement(Text15, { style: styles6.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
18422
+ /* @__PURE__ */ React17.createElement(Text15, { style: styles7.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
18335
18423
  ));
18336
18424
  }
18337
18425
  function createStyles12() {
@@ -18588,7 +18676,7 @@ import React18, { useState as useState15, useMemo as useMemo13 } from "react";
18588
18676
  import { View as View18, Text as Text16, TextInput as TextInput10, TouchableOpacity as TouchableOpacity15, StyleSheet as StyleSheet18, Keyboard as Keyboard2 } from "react-native";
18589
18677
  function SessionStartScreen({ nav }) {
18590
18678
  const { startSession, assignments, widgetColorScheme } = useBugBear();
18591
- const styles6 = useMemo13(() => createStyles13(), [widgetColorScheme]);
18679
+ const styles7 = useMemo13(() => createStyles13(), [widgetColorScheme]);
18592
18680
  const [focusArea, setFocusArea] = useState15("");
18593
18681
  const [isStarting, setIsStarting] = useState15(false);
18594
18682
  const [error, setError] = useState15(null);
@@ -18615,35 +18703,35 @@ function SessionStartScreen({ nav }) {
18615
18703
  setIsStarting(false);
18616
18704
  }
18617
18705
  };
18618
- return /* @__PURE__ */ React18.createElement(View18, null, /* @__PURE__ */ React18.createElement(View18, { style: styles6.header }, /* @__PURE__ */ React18.createElement(Text16, { style: styles6.headerIcon }, "\u{1F50D}"), /* @__PURE__ */ React18.createElement(Text16, { style: styles6.headerDesc }, "Start an exploratory QA session. Log findings as you go \u2014 bugs, concerns, suggestions, or questions.")), /* @__PURE__ */ React18.createElement(View18, { style: styles6.inputSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles6.label }, "What are you testing?"), /* @__PURE__ */ React18.createElement(
18706
+ return /* @__PURE__ */ React18.createElement(View18, null, /* @__PURE__ */ React18.createElement(View18, { style: styles7.header }, /* @__PURE__ */ React18.createElement(Text16, { style: styles7.headerIcon }, "\u{1F50D}"), /* @__PURE__ */ React18.createElement(Text16, { style: styles7.headerDesc }, "Start an exploratory QA session. Log findings as you go \u2014 bugs, concerns, suggestions, or questions.")), /* @__PURE__ */ React18.createElement(View18, { style: styles7.inputSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles7.label }, "What are you testing?"), /* @__PURE__ */ React18.createElement(
18619
18707
  TextInput10,
18620
18708
  {
18621
18709
  value: focusArea,
18622
18710
  onChangeText: setFocusArea,
18623
18711
  placeholder: "e.g. Checkout flow, Settings page...",
18624
18712
  placeholderTextColor: colors.textMuted,
18625
- style: styles6.input,
18713
+ style: styles7.input,
18626
18714
  returnKeyType: "done",
18627
18715
  onSubmitEditing: handleStart
18628
18716
  }
18629
- )), trackNames.length > 0 && /* @__PURE__ */ React18.createElement(View18, { style: styles6.chipsSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles6.chipsLabel }, "Quick pick:"), /* @__PURE__ */ React18.createElement(View18, { style: styles6.chipsRow }, trackNames.map((name) => /* @__PURE__ */ React18.createElement(
18717
+ )), trackNames.length > 0 && /* @__PURE__ */ React18.createElement(View18, { style: styles7.chipsSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles7.chipsLabel }, "Quick pick:"), /* @__PURE__ */ React18.createElement(View18, { style: styles7.chipsRow }, trackNames.map((name) => /* @__PURE__ */ React18.createElement(
18630
18718
  TouchableOpacity15,
18631
18719
  {
18632
18720
  key: name,
18633
- style: [styles6.chip, focusArea === name && styles6.chipActive],
18721
+ style: [styles7.chip, focusArea === name && styles7.chipActive],
18634
18722
  onPress: () => setFocusArea(name),
18635
18723
  activeOpacity: 0.7
18636
18724
  },
18637
- /* @__PURE__ */ React18.createElement(Text16, { style: [styles6.chipText, focusArea === name && styles6.chipTextActive] }, name)
18638
- )))), error && /* @__PURE__ */ React18.createElement(View18, { style: styles6.errorBox }, /* @__PURE__ */ React18.createElement(Text16, { style: styles6.errorText }, error)), /* @__PURE__ */ React18.createElement(
18725
+ /* @__PURE__ */ React18.createElement(Text16, { style: [styles7.chipText, focusArea === name && styles7.chipTextActive] }, name)
18726
+ )))), error && /* @__PURE__ */ React18.createElement(View18, { style: styles7.errorBox }, /* @__PURE__ */ React18.createElement(Text16, { style: styles7.errorText }, error)), /* @__PURE__ */ React18.createElement(
18639
18727
  TouchableOpacity15,
18640
18728
  {
18641
- style: [styles6.startBtn, isStarting && styles6.startBtnDisabled],
18729
+ style: [styles7.startBtn, isStarting && styles7.startBtnDisabled],
18642
18730
  onPress: handleStart,
18643
18731
  disabled: isStarting,
18644
18732
  activeOpacity: 0.8
18645
18733
  },
18646
- /* @__PURE__ */ React18.createElement(Text16, { style: styles6.startBtnText }, isStarting ? "Starting..." : "\u25B6 Start Session")
18734
+ /* @__PURE__ */ React18.createElement(Text16, { style: styles7.startBtnText }, isStarting ? "Starting..." : "\u25B6 Start Session")
18647
18735
  ));
18648
18736
  }
18649
18737
  function createStyles13() {
@@ -18752,7 +18840,7 @@ import React19, { useState as useState16, useEffect as useEffect11, useRef as us
18752
18840
  import { View as View19, Text as Text17, TouchableOpacity as TouchableOpacity16, StyleSheet as StyleSheet19 } from "react-native";
18753
18841
  function SessionActiveScreen({ nav }) {
18754
18842
  const { activeSession, sessionFindings, endSession, refreshSession, widgetColorScheme } = useBugBear();
18755
- const styles6 = useMemo14(() => createStyles14(), [widgetColorScheme]);
18843
+ const styles7 = useMemo14(() => createStyles14(), [widgetColorScheme]);
18756
18844
  const FINDING_TYPE_CONFIG = useMemo14(() => ({
18757
18845
  bug: { icon: "\u{1F41B}", label: "Bug", color: colors.red },
18758
18846
  concern: { icon: "\u26A0\uFE0F", label: "Concern", color: colors.amber },
@@ -18794,30 +18882,38 @@ function SessionActiveScreen({ nav }) {
18794
18882
  }
18795
18883
  };
18796
18884
  if (!activeSession) {
18797
- return /* @__PURE__ */ React19.createElement(View19, { style: styles6.emptyContainer }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.emptyText }, "No active session"), /* @__PURE__ */ React19.createElement(TouchableOpacity16, { onPress: () => nav.replace({ name: "SESSION_START" }) }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.emptyLink }, "Start a new session")));
18885
+ return /* @__PURE__ */ React19.createElement(View19, { style: styles7.emptyContainer }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.emptyText }, "No active session"), /* @__PURE__ */ React19.createElement(TouchableOpacity16, { onPress: () => nav.replace({ name: "SESSION_START" }) }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.emptyLink }, "Start a new session")));
18798
18886
  }
18799
18887
  const renderFinding = (finding) => {
18800
18888
  const config = FINDING_TYPE_CONFIG[finding.type] || FINDING_TYPE_CONFIG.bug;
18801
- return /* @__PURE__ */ React19.createElement(View19, { key: finding.id, style: styles6.findingRow }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.findingIcon }, config.icon), /* @__PURE__ */ React19.createElement(View19, { style: styles6.findingContent }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.findingTitle, numberOfLines: 1 }, finding.title), /* @__PURE__ */ React19.createElement(View19, { style: styles6.findingMeta }, /* @__PURE__ */ React19.createElement(Text17, { style: [styles6.findingType, { color: config.color }] }, config.label), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.findingSeverity }, finding.severity), finding.convertedToBugId && /* @__PURE__ */ React19.createElement(Text17, { style: styles6.findingConverted }, "\u2192 Bug filed"))));
18889
+ return /* @__PURE__ */ React19.createElement(View19, { key: finding.id, style: styles7.findingRow }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.findingIcon }, config.icon), /* @__PURE__ */ React19.createElement(View19, { style: styles7.findingContent }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.findingTitle, numberOfLines: 1 }, finding.title), /* @__PURE__ */ React19.createElement(View19, { style: styles7.findingMeta }, /* @__PURE__ */ React19.createElement(Text17, { style: [styles7.findingType, { color: config.color }] }, config.label), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.findingSeverity }, finding.severity), finding.convertedToBugId && /* @__PURE__ */ React19.createElement(Text17, { style: styles7.findingConverted }, "\u2192 Bug filed"))));
18802
18890
  };
18803
- return /* @__PURE__ */ React19.createElement(View19, null, /* @__PURE__ */ React19.createElement(View19, { style: styles6.timerCard }, /* @__PURE__ */ React19.createElement(View19, { style: styles6.recordingRow }, /* @__PURE__ */ React19.createElement(View19, { style: styles6.recordingDot }), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.recordingLabel }, "Recording")), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.timerText }, formatTimer(elapsed)), activeSession.focusArea ? /* @__PURE__ */ React19.createElement(Text17, { style: styles6.focusArea }, activeSession.focusArea) : null), /* @__PURE__ */ React19.createElement(View19, { style: styles6.actionRow }, /* @__PURE__ */ React19.createElement(
18891
+ return /* @__PURE__ */ React19.createElement(View19, null, /* @__PURE__ */ React19.createElement(View19, { style: styles7.timerCard }, /* @__PURE__ */ React19.createElement(View19, { style: styles7.recordingRow }, /* @__PURE__ */ React19.createElement(View19, { style: styles7.recordingDot }), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.recordingLabel }, "Recording")), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.timerText }, formatTimer(elapsed)), activeSession.focusArea ? /* @__PURE__ */ React19.createElement(Text17, { style: styles7.focusArea }, activeSession.focusArea) : null), /* @__PURE__ */ React19.createElement(View19, { style: styles7.actionRow }, /* @__PURE__ */ React19.createElement(
18804
18892
  TouchableOpacity16,
18805
18893
  {
18806
- style: styles6.addFindingBtn,
18894
+ style: styles7.addFindingBtn,
18807
18895
  onPress: () => nav.push({ name: "SESSION_FINDING" }),
18808
18896
  activeOpacity: 0.8
18809
18897
  },
18810
- /* @__PURE__ */ React19.createElement(Text17, { style: styles6.addFindingText }, "+ Add Finding")
18898
+ /* @__PURE__ */ React19.createElement(Text17, { style: styles7.addFindingText }, "+ Add Finding")
18899
+ ), nav.minimizeToAdHoc && /* @__PURE__ */ React19.createElement(
18900
+ TouchableOpacity16,
18901
+ {
18902
+ style: styles7.minimizeBtn,
18903
+ onPress: nav.minimizeToAdHoc,
18904
+ activeOpacity: 0.8
18905
+ },
18906
+ /* @__PURE__ */ React19.createElement(Text17, { style: styles7.minimizeBtnText }, "\u2199")
18811
18907
  ), /* @__PURE__ */ React19.createElement(
18812
18908
  TouchableOpacity16,
18813
18909
  {
18814
- style: [styles6.endBtn, isEnding && styles6.endBtnDisabled],
18910
+ style: [styles7.endBtn, isEnding && styles7.endBtnDisabled],
18815
18911
  onPress: handleEnd,
18816
18912
  disabled: isEnding,
18817
18913
  activeOpacity: 0.8
18818
18914
  },
18819
- /* @__PURE__ */ React19.createElement(Text17, { style: styles6.endBtnText }, isEnding ? "..." : "End")
18820
- )), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.sectionTitle }, "Findings (", sessionFindings.length, ")"), sessionFindings.length === 0 ? /* @__PURE__ */ React19.createElement(View19, { style: styles6.emptyFindings }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.emptyFindingsIcon }, "\u{1F4CB}"), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.emptyFindingsText }, 'No findings yet. Tap "Add Finding" to log something.')) : /* @__PURE__ */ React19.createElement(View19, { style: styles6.findingsList }, sessionFindings.map(renderFinding)));
18915
+ /* @__PURE__ */ React19.createElement(Text17, { style: styles7.endBtnText }, isEnding ? "..." : "End")
18916
+ )), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.sectionTitle }, "Findings (", sessionFindings.length, ")"), sessionFindings.length === 0 ? /* @__PURE__ */ React19.createElement(View19, { style: styles7.emptyFindings }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.emptyFindingsIcon }, "\u{1F4CB}"), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.emptyFindingsText }, 'No findings yet. Tap "Add Finding" to log something.')) : /* @__PURE__ */ React19.createElement(View19, { style: styles7.findingsList }, sessionFindings.map(renderFinding)));
18821
18917
  }
18822
18918
  function createStyles14() {
18823
18919
  return StyleSheet19.create({
@@ -18894,6 +18990,21 @@ function createStyles14() {
18894
18990
  fontWeight: "600",
18895
18991
  color: colors.blueLight
18896
18992
  },
18993
+ minimizeBtn: {
18994
+ paddingVertical: 12,
18995
+ paddingHorizontal: 16,
18996
+ backgroundColor: colors.card,
18997
+ borderWidth: 1,
18998
+ borderColor: colors.border,
18999
+ borderRadius: 10,
19000
+ alignItems: "center",
19001
+ justifyContent: "center"
19002
+ },
19003
+ minimizeBtnText: {
19004
+ fontSize: 14,
19005
+ fontWeight: "600",
19006
+ color: colors.textSecondary
19007
+ },
18897
19008
  endBtn: {
18898
19009
  paddingVertical: 12,
18899
19010
  paddingHorizontal: 16,
@@ -18995,7 +19106,7 @@ var FINDING_TYPES = [
18995
19106
  ];
18996
19107
  function SessionFindingScreen({ nav }) {
18997
19108
  const { addFinding, widgetColorScheme } = useBugBear();
18998
- const styles6 = useMemo15(() => createStyles15(), [widgetColorScheme]);
19109
+ const styles7 = useMemo15(() => createStyles15(), [widgetColorScheme]);
18999
19110
  const SEVERITIES = useMemo15(() => [
19000
19111
  { value: "critical", label: "Critical", color: colors.red },
19001
19112
  { value: "high", label: "High", color: colors.orange },
@@ -19027,46 +19138,46 @@ function SessionFindingScreen({ nav }) {
19027
19138
  }
19028
19139
  };
19029
19140
  const canSubmit = title.trim().length > 0 && !isSubmitting;
19030
- return /* @__PURE__ */ React20.createElement(View20, null, /* @__PURE__ */ React20.createElement(View20, { style: styles6.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles6.sectionLabel }, "Type"), /* @__PURE__ */ React20.createElement(View20, { style: styles6.typeRow }, FINDING_TYPES.map((ft) => /* @__PURE__ */ React20.createElement(
19141
+ return /* @__PURE__ */ React20.createElement(View20, null, /* @__PURE__ */ React20.createElement(View20, { style: styles7.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles7.sectionLabel }, "Type"), /* @__PURE__ */ React20.createElement(View20, { style: styles7.typeRow }, FINDING_TYPES.map((ft) => /* @__PURE__ */ React20.createElement(
19031
19142
  TouchableOpacity17,
19032
19143
  {
19033
19144
  key: ft.value,
19034
- style: [styles6.typePill, type === ft.value && styles6.typePillActive],
19145
+ style: [styles7.typePill, type === ft.value && styles7.typePillActive],
19035
19146
  onPress: () => setType(ft.value),
19036
19147
  activeOpacity: 0.7
19037
19148
  },
19038
- /* @__PURE__ */ React20.createElement(Text18, { style: styles6.typePillIcon }, ft.icon),
19039
- /* @__PURE__ */ React20.createElement(Text18, { style: [styles6.typePillLabel, type === ft.value && styles6.typePillLabelActive] }, ft.label)
19040
- )))), /* @__PURE__ */ React20.createElement(View20, { style: styles6.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles6.sectionLabel }, "Severity"), /* @__PURE__ */ React20.createElement(View20, { style: styles6.severityRow }, SEVERITIES.map((s2) => /* @__PURE__ */ React20.createElement(
19149
+ /* @__PURE__ */ React20.createElement(Text18, { style: styles7.typePillIcon }, ft.icon),
19150
+ /* @__PURE__ */ React20.createElement(Text18, { style: [styles7.typePillLabel, type === ft.value && styles7.typePillLabelActive] }, ft.label)
19151
+ )))), /* @__PURE__ */ React20.createElement(View20, { style: styles7.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles7.sectionLabel }, "Severity"), /* @__PURE__ */ React20.createElement(View20, { style: styles7.severityRow }, SEVERITIES.map((s2) => /* @__PURE__ */ React20.createElement(
19041
19152
  TouchableOpacity17,
19042
19153
  {
19043
19154
  key: s2.value,
19044
19155
  style: [
19045
- styles6.severityPill,
19156
+ styles7.severityPill,
19046
19157
  severity === s2.value && { backgroundColor: `${s2.color}20`, borderColor: s2.color }
19047
19158
  ],
19048
19159
  onPress: () => setSeverity(s2.value),
19049
19160
  activeOpacity: 0.7
19050
19161
  },
19051
- /* @__PURE__ */ React20.createElement(Text18, { style: [styles6.severityText, severity === s2.value && { color: s2.color }] }, s2.label)
19052
- )))), /* @__PURE__ */ React20.createElement(View20, { style: styles6.inputSection }, /* @__PURE__ */ React20.createElement(
19162
+ /* @__PURE__ */ React20.createElement(Text18, { style: [styles7.severityText, severity === s2.value && { color: s2.color }] }, s2.label)
19163
+ )))), /* @__PURE__ */ React20.createElement(View20, { style: styles7.inputSection }, /* @__PURE__ */ React20.createElement(
19053
19164
  TextInput11,
19054
19165
  {
19055
19166
  value: title,
19056
19167
  onChangeText: setTitle,
19057
19168
  placeholder: "What did you find?",
19058
19169
  placeholderTextColor: colors.textMuted,
19059
- style: styles6.titleInput,
19170
+ style: styles7.titleInput,
19060
19171
  returnKeyType: "next"
19061
19172
  }
19062
- )), /* @__PURE__ */ React20.createElement(View20, { style: styles6.inputSection }, /* @__PURE__ */ React20.createElement(
19173
+ )), /* @__PURE__ */ React20.createElement(View20, { style: styles7.inputSection }, /* @__PURE__ */ React20.createElement(
19063
19174
  TextInput11,
19064
19175
  {
19065
19176
  value: description,
19066
19177
  onChangeText: setDescription,
19067
19178
  placeholder: "Details (optional)",
19068
19179
  placeholderTextColor: colors.textMuted,
19069
- style: styles6.descInput,
19180
+ style: styles7.descInput,
19070
19181
  multiline: true,
19071
19182
  numberOfLines: 3,
19072
19183
  textAlignVertical: "top"
@@ -19074,12 +19185,12 @@ function SessionFindingScreen({ nav }) {
19074
19185
  )), /* @__PURE__ */ React20.createElement(
19075
19186
  TouchableOpacity17,
19076
19187
  {
19077
- style: [styles6.submitBtn, !canSubmit && styles6.submitBtnDisabled],
19188
+ style: [styles7.submitBtn, !canSubmit && styles7.submitBtnDisabled],
19078
19189
  onPress: handleSubmit,
19079
19190
  disabled: !canSubmit,
19080
19191
  activeOpacity: 0.8
19081
19192
  },
19082
- /* @__PURE__ */ React20.createElement(Text18, { style: [styles6.submitBtnText, !canSubmit && styles6.submitBtnTextDisabled] }, isSubmitting ? "Saving..." : "Save Finding")
19193
+ /* @__PURE__ */ React20.createElement(Text18, { style: [styles7.submitBtnText, !canSubmit && styles7.submitBtnTextDisabled] }, isSubmitting ? "Saving..." : "Save Finding")
19083
19194
  ));
19084
19195
  }
19085
19196
  function createStyles15() {
@@ -19464,10 +19575,376 @@ var styles4 = StyleSheet21.create({
19464
19575
  }
19465
19576
  });
19466
19577
 
19467
- // src/BugBearButton.tsx
19578
+ // src/widget/AdHocOverlay.tsx
19579
+ import React22, { useState as useState19, useEffect as useEffect13, useCallback as useCallback7, useRef as useRef8 } from "react";
19580
+ import {
19581
+ View as View22,
19582
+ Text as Text20,
19583
+ TextInput as TextInput12,
19584
+ TouchableOpacity as TouchableOpacity19,
19585
+ StyleSheet as StyleSheet22,
19586
+ Animated as Animated4,
19587
+ PanResponder as PanResponder2,
19588
+ Dimensions as Dimensions3,
19589
+ Platform as Platform6,
19590
+ Keyboard as Keyboard4
19591
+ } from "react-native";
19468
19592
  var screenWidth2 = Dimensions3.get("window").width;
19469
19593
  var screenHeight2 = Dimensions3.get("window").height;
19594
+ var OVERLAY_WIDTH = 280;
19595
+ var OVERLAY_MARGIN = 16;
19596
+ var MIN_Y2 = 80;
19470
19597
  var BOTTOM_SAFE_PADDING2 = Platform6.OS === "ios" ? 34 : 24;
19598
+ var SAFE_MAX_Y2 = screenHeight2 - 200 - BOTTOM_SAFE_PADDING2;
19599
+ function AdHocOverlay({ sessionId, focusArea, startedAt, onExpand, onComplete }) {
19600
+ const { client, addFinding, endSession, activeSession } = useBugBear();
19601
+ const [inputMode, setInputMode] = useState19("closed");
19602
+ const [inputText, setInputText] = useState19("");
19603
+ const [isSubmitting, setIsSubmitting] = useState19(false);
19604
+ const [flashMessage, setFlashMessage] = useState19(null);
19605
+ const [elapsedTime, setElapsedTime] = useState19(0);
19606
+ const inputRef = useRef8(null);
19607
+ const screenshotRef = useRef8(null);
19608
+ const mountAnim = useRef8(new Animated4.Value(0)).current;
19609
+ useEffect13(() => {
19610
+ Animated4.spring(mountAnim, { toValue: 1, useNativeDriver: true, tension: 80, friction: 10 }).start();
19611
+ }, []);
19612
+ const pan = useRef8(new Animated4.ValueXY({
19613
+ x: screenWidth2 - OVERLAY_WIDTH - OVERLAY_MARGIN,
19614
+ y: SAFE_MAX_Y2
19615
+ })).current;
19616
+ const panResponder = useRef8(
19617
+ PanResponder2.create({
19618
+ onStartShouldSetPanResponder: () => true,
19619
+ onMoveShouldSetPanResponder: (_, gs) => Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5,
19620
+ onPanResponderGrant: () => {
19621
+ pan.setOffset({
19622
+ x: Math.max(OVERLAY_MARGIN, Math.min(getAnimatedValue(pan.x), screenWidth2 - OVERLAY_WIDTH - OVERLAY_MARGIN)),
19623
+ y: Math.max(MIN_Y2, Math.min(getAnimatedValue(pan.y), SAFE_MAX_Y2))
19624
+ });
19625
+ pan.setValue({ x: 0, y: 0 });
19626
+ },
19627
+ onPanResponderMove: Animated4.event(
19628
+ [null, { dx: pan.x, dy: pan.y }],
19629
+ { useNativeDriver: false }
19630
+ ),
19631
+ onPanResponderRelease: () => {
19632
+ pan.flattenOffset();
19633
+ const currentX = getAnimatedValue(pan.x);
19634
+ const currentY = getAnimatedValue(pan.y);
19635
+ const snapX = currentX < screenWidth2 / 2 ? OVERLAY_MARGIN : screenWidth2 - OVERLAY_WIDTH - OVERLAY_MARGIN;
19636
+ const snapY = Math.max(MIN_Y2, Math.min(currentY, SAFE_MAX_Y2));
19637
+ Animated4.spring(pan, {
19638
+ toValue: { x: snapX, y: snapY },
19639
+ useNativeDriver: false,
19640
+ friction: 7,
19641
+ tension: 40
19642
+ }).start();
19643
+ }
19644
+ })
19645
+ ).current;
19646
+ useEffect13(() => {
19647
+ const startTime = new Date(startedAt).getTime();
19648
+ setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
19649
+ const interval = setInterval(() => {
19650
+ setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
19651
+ }, 1e3);
19652
+ return () => clearInterval(interval);
19653
+ }, [startedAt]);
19654
+ useEffect13(() => {
19655
+ if (inputMode !== "closed") {
19656
+ setTimeout(() => inputRef.current?.focus(), 50);
19657
+ }
19658
+ }, [inputMode]);
19659
+ const handleOpenInput = useCallback7(async (mode) => {
19660
+ Keyboard4.dismiss();
19661
+ const uri = await captureAppScreen();
19662
+ screenshotRef.current = uri;
19663
+ setInputMode(mode);
19664
+ setInputText("");
19665
+ }, []);
19666
+ const handleCancel = useCallback7(() => {
19667
+ Keyboard4.dismiss();
19668
+ setInputMode("closed");
19669
+ setInputText("");
19670
+ screenshotRef.current = null;
19671
+ }, []);
19672
+ const handleSend = useCallback7(async () => {
19673
+ if (!inputText.trim() || isSubmitting) return;
19674
+ Keyboard4.dismiss();
19675
+ setIsSubmitting(true);
19676
+ try {
19677
+ let screenshotUrl;
19678
+ if (screenshotRef.current && client) {
19679
+ screenshotUrl = await client.uploadImageFromUri(screenshotRef.current) || void 0;
19680
+ }
19681
+ const enhanced = contextCapture.getEnhancedContext();
19682
+ await addFinding({
19683
+ type: inputMode === "bug" ? "bug" : "concern",
19684
+ title: inputText.trim(),
19685
+ severity: inputMode === "bug" ? "medium" : "observation",
19686
+ screenshotUrl,
19687
+ consoleLogs: enhanced.consoleLogs,
19688
+ networkSnapshot: enhanced.networkRequests
19689
+ });
19690
+ setFlashMessage("Saved!");
19691
+ setInputMode("closed");
19692
+ setInputText("");
19693
+ screenshotRef.current = null;
19694
+ setTimeout(() => setFlashMessage(null), 1500);
19695
+ } finally {
19696
+ setIsSubmitting(false);
19697
+ }
19698
+ }, [inputText, isSubmitting, inputMode, client, addFinding]);
19699
+ const handleComplete = useCallback7(async () => {
19700
+ if (isSubmitting) return;
19701
+ Keyboard4.dismiss();
19702
+ setIsSubmitting(true);
19703
+ try {
19704
+ const result = await endSession();
19705
+ if (result.success) {
19706
+ const mins = activeSession?.durationMinutes ?? Math.round(elapsedTime / 60);
19707
+ const findings = activeSession?.findingsCount ?? 0;
19708
+ setFlashMessage(`Session complete! ${mins} min, ${findings} finding${findings !== 1 ? "s" : ""}`);
19709
+ setTimeout(() => {
19710
+ setFlashMessage(null);
19711
+ onComplete();
19712
+ }, 2e3);
19713
+ }
19714
+ } finally {
19715
+ setIsSubmitting(false);
19716
+ }
19717
+ }, [isSubmitting, endSession, activeSession, elapsedTime, onComplete]);
19718
+ return /* @__PURE__ */ React22.createElement(
19719
+ Animated4.View,
19720
+ {
19721
+ style: [
19722
+ styles5.container,
19723
+ {
19724
+ opacity: mountAnim,
19725
+ transform: [
19726
+ ...pan.getTranslateTransform(),
19727
+ { scale: mountAnim.interpolate({ inputRange: [0, 1], outputRange: [0.8, 1] }) }
19728
+ ]
19729
+ }
19730
+ ],
19731
+ ...panResponder.panHandlers
19732
+ },
19733
+ /* @__PURE__ */ React22.createElement(View22, { style: styles5.header }, /* @__PURE__ */ React22.createElement(View22, { style: styles5.headerLeft }, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.headerLabel }, "Ad Hoc"), focusArea ? /* @__PURE__ */ React22.createElement(Text20, { style: styles5.focusText, numberOfLines: 1 }, "\xB7 ", focusArea) : null, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.timer }, formatElapsedTime(elapsedTime))), /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: onExpand, style: styles5.expandButton }, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.expandText }, "\u2197"))),
19734
+ flashMessage ? /* @__PURE__ */ React22.createElement(View22, { style: styles5.flash }, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.flashText }, flashMessage)) : null,
19735
+ inputMode !== "closed" && !flashMessage ? /* @__PURE__ */ React22.createElement(View22, { style: styles5.inputArea }, /* @__PURE__ */ React22.createElement(
19736
+ TextInput12,
19737
+ {
19738
+ ref: inputRef,
19739
+ value: inputText,
19740
+ onChangeText: setInputText,
19741
+ placeholder: inputMode === "bug" ? "What went wrong?" : "What did you notice?",
19742
+ placeholderTextColor: colors.textDim,
19743
+ multiline: true,
19744
+ numberOfLines: 2,
19745
+ style: styles5.textInput
19746
+ }
19747
+ ), /* @__PURE__ */ React22.createElement(View22, { style: styles5.inputActions }, /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: handleCancel }, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.cancelText }, "Cancel")), /* @__PURE__ */ React22.createElement(
19748
+ TouchableOpacity19,
19749
+ {
19750
+ onPress: handleSend,
19751
+ disabled: !inputText.trim() || isSubmitting,
19752
+ style: [
19753
+ styles5.sendBtn,
19754
+ { backgroundColor: inputMode === "bug" ? colors.red : colors.blue },
19755
+ (!inputText.trim() || isSubmitting) && { opacity: 0.5 }
19756
+ ]
19757
+ },
19758
+ /* @__PURE__ */ React22.createElement(Text20, { style: styles5.sendText }, isSubmitting ? "Sending..." : "Send \u2192")
19759
+ ))) : null,
19760
+ inputMode === "closed" && !flashMessage ? /* @__PURE__ */ React22.createElement(View22, { style: styles5.actions }, /* @__PURE__ */ React22.createElement(
19761
+ TouchableOpacity19,
19762
+ {
19763
+ style: [styles5.feedbackBtn, isSubmitting && { opacity: 0.5 }],
19764
+ onPress: () => handleOpenInput("feedback"),
19765
+ disabled: isSubmitting
19766
+ },
19767
+ /* @__PURE__ */ React22.createElement(Text20, { style: styles5.feedbackText }, "Feedback")
19768
+ ), /* @__PURE__ */ React22.createElement(
19769
+ TouchableOpacity19,
19770
+ {
19771
+ style: [styles5.bugBtn, isSubmitting && { opacity: 0.5 }],
19772
+ onPress: () => handleOpenInput("bug"),
19773
+ disabled: isSubmitting
19774
+ },
19775
+ /* @__PURE__ */ React22.createElement(Text20, { style: styles5.bugText }, "Bug")
19776
+ ), /* @__PURE__ */ React22.createElement(
19777
+ TouchableOpacity19,
19778
+ {
19779
+ style: [styles5.completeBtn, isSubmitting && { opacity: 0.5 }],
19780
+ onPress: handleComplete,
19781
+ disabled: isSubmitting
19782
+ },
19783
+ /* @__PURE__ */ React22.createElement(Text20, { style: styles5.completeText }, "Complete")
19784
+ )) : null
19785
+ );
19786
+ }
19787
+ var styles5 = StyleSheet22.create({
19788
+ container: {
19789
+ position: "absolute",
19790
+ width: OVERLAY_WIDTH,
19791
+ zIndex: 9999,
19792
+ backgroundColor: colors.bg,
19793
+ borderRadius: 12,
19794
+ borderWidth: 1,
19795
+ borderColor: colors.border,
19796
+ shadowColor: "#000",
19797
+ shadowOffset: { width: 0, height: 8 },
19798
+ shadowOpacity: 0.4,
19799
+ shadowRadius: 16,
19800
+ elevation: 20,
19801
+ overflow: "hidden"
19802
+ },
19803
+ header: {
19804
+ backgroundColor: colors.bgDarker,
19805
+ paddingVertical: 6,
19806
+ paddingHorizontal: 12,
19807
+ flexDirection: "row",
19808
+ alignItems: "center",
19809
+ justifyContent: "space-between",
19810
+ borderBottomWidth: 1,
19811
+ borderBottomColor: colors.border
19812
+ },
19813
+ headerLeft: {
19814
+ flexDirection: "row",
19815
+ alignItems: "center",
19816
+ gap: 6,
19817
+ flex: 1
19818
+ },
19819
+ headerLabel: {
19820
+ fontSize: 11,
19821
+ color: colors.textMuted,
19822
+ fontWeight: "600"
19823
+ },
19824
+ focusText: {
19825
+ fontSize: 10,
19826
+ color: colors.textDim,
19827
+ maxWidth: 100
19828
+ },
19829
+ timer: {
19830
+ fontSize: 10,
19831
+ color: colors.green,
19832
+ fontWeight: "600",
19833
+ fontVariant: ["tabular-nums"]
19834
+ },
19835
+ expandButton: {
19836
+ paddingVertical: 2,
19837
+ paddingHorizontal: 4
19838
+ },
19839
+ expandText: {
19840
+ fontSize: 12,
19841
+ color: colors.blue,
19842
+ fontWeight: "500"
19843
+ },
19844
+ flash: {
19845
+ paddingVertical: 6,
19846
+ paddingHorizontal: 12,
19847
+ backgroundColor: colors.greenDark,
19848
+ alignItems: "center"
19849
+ },
19850
+ flashText: {
19851
+ fontSize: 12,
19852
+ fontWeight: "600",
19853
+ color: colors.greenLight
19854
+ },
19855
+ inputArea: {
19856
+ padding: 8,
19857
+ paddingHorizontal: 10
19858
+ },
19859
+ textInput: {
19860
+ backgroundColor: colors.card,
19861
+ borderWidth: 1,
19862
+ borderColor: colors.border,
19863
+ borderRadius: 8,
19864
+ padding: 6,
19865
+ paddingHorizontal: 8,
19866
+ color: colors.textPrimary,
19867
+ fontSize: 12,
19868
+ lineHeight: 16,
19869
+ minHeight: 40,
19870
+ textAlignVertical: "top"
19871
+ },
19872
+ inputActions: {
19873
+ flexDirection: "row",
19874
+ justifyContent: "space-between",
19875
+ marginTop: 6
19876
+ },
19877
+ cancelText: {
19878
+ fontSize: 11,
19879
+ color: colors.textMuted,
19880
+ paddingVertical: 4,
19881
+ paddingHorizontal: 8
19882
+ },
19883
+ sendBtn: {
19884
+ paddingVertical: 4,
19885
+ paddingHorizontal: 14,
19886
+ borderRadius: 6
19887
+ },
19888
+ sendText: {
19889
+ fontSize: 11,
19890
+ fontWeight: "600",
19891
+ color: "#fff"
19892
+ },
19893
+ actions: {
19894
+ flexDirection: "row",
19895
+ gap: 6,
19896
+ padding: 8,
19897
+ paddingHorizontal: 10,
19898
+ paddingBottom: 10
19899
+ },
19900
+ feedbackBtn: {
19901
+ flex: 1,
19902
+ paddingVertical: 8,
19903
+ borderRadius: 8,
19904
+ backgroundColor: colors.blueDark,
19905
+ borderWidth: 1,
19906
+ borderColor: `${colors.blue}40`,
19907
+ alignItems: "center"
19908
+ },
19909
+ feedbackText: {
19910
+ fontSize: 11,
19911
+ fontWeight: "600",
19912
+ color: colors.blueLight
19913
+ },
19914
+ bugBtn: {
19915
+ flex: 1,
19916
+ paddingVertical: 8,
19917
+ borderRadius: 8,
19918
+ backgroundColor: colors.redDark,
19919
+ borderWidth: 1,
19920
+ borderColor: colors.red,
19921
+ alignItems: "center"
19922
+ },
19923
+ bugText: {
19924
+ fontSize: 11,
19925
+ fontWeight: "600",
19926
+ color: colors.redLight
19927
+ },
19928
+ completeBtn: {
19929
+ flex: 1,
19930
+ paddingVertical: 8,
19931
+ borderRadius: 8,
19932
+ backgroundColor: colors.greenDark,
19933
+ borderWidth: 1,
19934
+ borderColor: colors.green,
19935
+ alignItems: "center"
19936
+ },
19937
+ completeText: {
19938
+ fontSize: 11,
19939
+ fontWeight: "600",
19940
+ color: colors.greenLight
19941
+ }
19942
+ });
19943
+
19944
+ // src/BugBearButton.tsx
19945
+ var screenWidth3 = Dimensions4.get("window").width;
19946
+ var screenHeight3 = Dimensions4.get("window").height;
19947
+ var BOTTOM_SAFE_PADDING3 = Platform7.OS === "ios" ? 34 : 24;
19471
19948
  function BugBearButton({
19472
19949
  position = "bottom-right",
19473
19950
  buttonStyle,
@@ -19477,20 +19954,20 @@ function BugBearButton({
19477
19954
  minY = 100,
19478
19955
  maxYOffset = 160
19479
19956
  }) {
19480
- const { shouldShowWidget, testerInfo, isLoading, unreadCount, assignments, widgetMode, widgetColorScheme } = useBugBear();
19957
+ const { shouldShowWidget, testerInfo, isLoading, unreadCount, assignments, widgetMode, widgetColorScheme, activeSession, startSession } = useBugBear();
19481
19958
  const { currentScreen, canGoBack, push, pop, replace, reset } = useNavigation();
19482
- const [viewMode, setViewMode] = useState19("closed");
19483
- const [miniRunnerAssignmentId, setMiniRunnerAssignmentId] = useState19(null);
19484
- const panelAnim = useRef8(new Animated4.Value(0)).current;
19485
- const styles6 = useMemo16(() => createStyles16(), [widgetColorScheme]);
19959
+ const [viewMode, setViewMode] = useState20("closed");
19960
+ const [miniRunnerAssignmentId, setMiniRunnerAssignmentId] = useState20(null);
19961
+ const panelAnim = useRef9(new Animated5.Value(0)).current;
19962
+ const styles7 = useMemo16(() => createStyles16(), [widgetColorScheme]);
19486
19963
  const panelVisible = viewMode === "panel";
19487
- const screenCaptureRef = useRef8(null);
19964
+ const screenCaptureRef = useRef9(null);
19488
19965
  const openPanel = () => {
19489
19966
  captureAppScreen().then((uri) => {
19490
19967
  screenCaptureRef.current = uri;
19491
19968
  });
19492
19969
  setViewMode("panel");
19493
- Animated4.spring(panelAnim, {
19970
+ Animated5.spring(panelAnim, {
19494
19971
  toValue: 1,
19495
19972
  useNativeDriver: true,
19496
19973
  friction: 8,
@@ -19498,8 +19975,8 @@ function BugBearButton({
19498
19975
  }).start();
19499
19976
  };
19500
19977
  const closePanel = () => {
19501
- Keyboard4.dismiss();
19502
- Animated4.timing(panelAnim, {
19978
+ Keyboard5.dismiss();
19979
+ Animated5.timing(panelAnim, {
19503
19980
  toValue: 0,
19504
19981
  duration: 250,
19505
19982
  useNativeDriver: true
@@ -19509,26 +19986,26 @@ function BugBearButton({
19509
19986
  };
19510
19987
  const buttonSize = 56;
19511
19988
  const margin = 16;
19512
- const safeMaxY = screenHeight2 - maxYOffset - BOTTOM_SAFE_PADDING2;
19989
+ const safeMaxY = screenHeight3 - maxYOffset - BOTTOM_SAFE_PADDING3;
19513
19990
  const getInitialPosition = () => {
19514
19991
  if (initialX !== void 0 && initialY !== void 0) {
19515
19992
  return { x: initialX, y: initialY };
19516
19993
  }
19517
- const x = position === "bottom-right" ? screenWidth2 - buttonSize - margin : margin;
19518
- const y = screenHeight2 - maxYOffset - BOTTOM_SAFE_PADDING2;
19994
+ const x = position === "bottom-right" ? screenWidth3 - buttonSize - margin : margin;
19995
+ const y = screenHeight3 - maxYOffset - BOTTOM_SAFE_PADDING3;
19519
19996
  return { x, y };
19520
19997
  };
19521
19998
  const initialPos = getInitialPosition();
19522
- const pan = useRef8(new Animated4.ValueXY(initialPos)).current;
19523
- const isDragging = useRef8(false);
19524
- const panResponder = useRef8(
19525
- PanResponder2.create({
19999
+ const pan = useRef9(new Animated5.ValueXY(initialPos)).current;
20000
+ const isDragging = useRef9(false);
20001
+ const panResponder = useRef9(
20002
+ PanResponder3.create({
19526
20003
  onStartShouldSetPanResponder: () => draggable,
19527
20004
  onMoveShouldSetPanResponder: (_, gs) => draggable && (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5),
19528
20005
  onPanResponderGrant: () => {
19529
20006
  isDragging.current = false;
19530
20007
  pan.setOffset({
19531
- x: Math.max(margin, Math.min(getAnimatedValue(pan.x), screenWidth2 - buttonSize - margin)),
20008
+ x: Math.max(margin, Math.min(getAnimatedValue(pan.x), screenWidth3 - buttonSize - margin)),
19532
20009
  y: Math.max(minY, Math.min(getAnimatedValue(pan.y), safeMaxY))
19533
20010
  });
19534
20011
  pan.setValue({ x: 0, y: 0 });
@@ -19537,7 +20014,7 @@ function BugBearButton({
19537
20014
  if (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5) {
19538
20015
  isDragging.current = true;
19539
20016
  }
19540
- Animated4.event(
20017
+ Animated5.event(
19541
20018
  [null, { dx: pan.x, dy: pan.y }],
19542
20019
  { useNativeDriver: false }
19543
20020
  )(_, gs);
@@ -19546,9 +20023,9 @@ function BugBearButton({
19546
20023
  pan.flattenOffset();
19547
20024
  const currentX = getAnimatedValue(pan.x);
19548
20025
  const currentY = getAnimatedValue(pan.y);
19549
- const snapX = currentX < screenWidth2 / 2 ? margin : screenWidth2 - buttonSize - margin;
20026
+ const snapX = currentX < screenWidth3 / 2 ? margin : screenWidth3 - buttonSize - margin;
19550
20027
  const snapY = Math.max(minY, Math.min(currentY, safeMaxY));
19551
- Animated4.spring(pan, {
20028
+ Animated5.spring(pan, {
19552
20029
  toValue: { x: snapX, y: snapY },
19553
20030
  useNativeDriver: false,
19554
20031
  friction: 7,
@@ -19563,11 +20040,11 @@ function BugBearButton({
19563
20040
  ).current;
19564
20041
  const pendingTests = widgetMode === "qa" ? assignments.filter((a) => a.status === "pending" || a.status === "in_progress").length : 0;
19565
20042
  const badgeCount = pendingTests + unreadCount;
19566
- useEffect13(() => {
19567
- if (!panelVisible || Platform6.OS !== "android") return;
20043
+ useEffect14(() => {
20044
+ if (!panelVisible || Platform7.OS !== "android") return;
19568
20045
  const handler = BackHandler.addEventListener("hardwareBackPress", () => {
19569
20046
  if (canGoBack) {
19570
- Keyboard4.dismiss();
20047
+ Keyboard5.dismiss();
19571
20048
  pop();
19572
20049
  } else {
19573
20050
  closePanel();
@@ -19576,9 +20053,9 @@ function BugBearButton({
19576
20053
  });
19577
20054
  return () => handler.remove();
19578
20055
  }, [panelVisible, canGoBack]);
19579
- const startMiniRunner = useCallback7((assignId) => {
19580
- Keyboard4.dismiss();
19581
- Animated4.timing(panelAnim, {
20056
+ const startMiniRunner = useCallback8((assignId) => {
20057
+ Keyboard5.dismiss();
20058
+ Animated5.timing(panelAnim, {
19582
20059
  toValue: 0,
19583
20060
  duration: 200,
19584
20061
  useNativeDriver: true
@@ -19587,40 +20064,83 @@ function BugBearButton({
19587
20064
  setViewMode("mini-runner");
19588
20065
  });
19589
20066
  }, [panelAnim]);
19590
- const expandFromMiniRunner = useCallback7(() => {
20067
+ const expandFromMiniRunner = useCallback8(() => {
19591
20068
  setViewMode("panel");
19592
20069
  if (miniRunnerAssignmentId) {
19593
20070
  replace({ name: "TEST_DETAIL", testId: miniRunnerAssignmentId });
19594
20071
  }
19595
20072
  setMiniRunnerAssignmentId(null);
19596
- Animated4.spring(panelAnim, {
20073
+ Animated5.spring(panelAnim, {
19597
20074
  toValue: 1,
19598
20075
  useNativeDriver: true,
19599
20076
  friction: 8,
19600
20077
  tension: 65
19601
20078
  }).start();
19602
20079
  }, [miniRunnerAssignmentId, replace, panelAnim]);
19603
- const handleMiniRunnerAdvance = useCallback7((nextId) => {
20080
+ const handleMiniRunnerAdvance = useCallback8((nextId) => {
19604
20081
  setMiniRunnerAssignmentId(nextId);
19605
20082
  }, []);
19606
- const handleMiniRunnerComplete = useCallback7(() => {
20083
+ const handleMiniRunnerComplete = useCallback8(() => {
19607
20084
  setMiniRunnerAssignmentId(null);
19608
20085
  setViewMode("closed");
19609
20086
  }, []);
19610
- const handleMiniRunnerReport = useCallback7((assignId, testCaseId) => {
20087
+ const handleMiniRunnerReport = useCallback8((assignId, testCaseId) => {
19611
20088
  setMiniRunnerAssignmentId(null);
19612
20089
  setViewMode("panel");
19613
20090
  replace({
19614
20091
  name: "REPORT",
19615
20092
  prefill: { type: "test_fail", assignmentId: assignId, testCaseId }
19616
20093
  });
19617
- Animated4.spring(panelAnim, {
20094
+ Animated5.spring(panelAnim, {
20095
+ toValue: 1,
20096
+ useNativeDriver: true,
20097
+ friction: 8,
20098
+ tension: 65
20099
+ }).start();
20100
+ }, [replace, panelAnim]);
20101
+ const startAdHoc = useCallback8(async (taskId, focusArea) => {
20102
+ Keyboard5.dismiss();
20103
+ const result = await startSession({
20104
+ sessionType: "ad_hoc",
20105
+ taskId,
20106
+ focusArea,
20107
+ platform: "ios"
20108
+ });
20109
+ if (result.success) {
20110
+ Animated5.timing(panelAnim, {
20111
+ toValue: 0,
20112
+ duration: 200,
20113
+ useNativeDriver: true
20114
+ }).start(() => {
20115
+ setViewMode("ad-hoc");
20116
+ });
20117
+ }
20118
+ }, [startSession, panelAnim]);
20119
+ const expandFromAdHoc = useCallback8(() => {
20120
+ setViewMode("panel");
20121
+ replace({ name: "SESSION_ACTIVE" });
20122
+ Animated5.spring(panelAnim, {
19618
20123
  toValue: 1,
19619
20124
  useNativeDriver: true,
19620
20125
  friction: 8,
19621
20126
  tension: 65
19622
20127
  }).start();
19623
20128
  }, [replace, panelAnim]);
20129
+ const handleAdHocComplete = useCallback8(() => {
20130
+ setViewMode("closed");
20131
+ }, []);
20132
+ const minimizeToAdHoc = useCallback8(() => {
20133
+ if (activeSession?.sessionType === "ad_hoc") {
20134
+ Keyboard5.dismiss();
20135
+ Animated5.timing(panelAnim, {
20136
+ toValue: 0,
20137
+ duration: 200,
20138
+ useNativeDriver: true
20139
+ }).start(() => {
20140
+ setViewMode("ad-hoc");
20141
+ });
20142
+ }
20143
+ }, [activeSession, panelAnim]);
19624
20144
  if (!shouldShowWidget) return null;
19625
20145
  const getHeaderTitle = () => {
19626
20146
  switch (currentScreen.name) {
@@ -19663,41 +20183,43 @@ function BugBearButton({
19663
20183
  };
19664
20184
  const nav = {
19665
20185
  push: (screen) => {
19666
- Keyboard4.dismiss();
20186
+ Keyboard5.dismiss();
19667
20187
  push(screen);
19668
20188
  },
19669
20189
  pop: () => {
19670
- Keyboard4.dismiss();
20190
+ Keyboard5.dismiss();
19671
20191
  pop();
19672
20192
  },
19673
20193
  replace: (screen) => {
19674
- Keyboard4.dismiss();
20194
+ Keyboard5.dismiss();
19675
20195
  replace(screen);
19676
20196
  },
19677
20197
  reset: () => {
19678
- Keyboard4.dismiss();
20198
+ Keyboard5.dismiss();
19679
20199
  reset();
19680
20200
  },
19681
20201
  canGoBack,
19682
20202
  closeWidget: handleClose,
19683
- startMiniRunner
20203
+ startMiniRunner,
20204
+ startAdHoc,
20205
+ minimizeToAdHoc: activeSession?.sessionType === "ad_hoc" ? minimizeToAdHoc : void 0
19684
20206
  };
19685
20207
  const QA_ONLY_SCREENS = ["TEST_DETAIL", "TEST_LIST", "TEST_FEEDBACK", "SESSION_START", "SESSION_ACTIVE", "SESSION_FINDING"];
19686
20208
  const renderScreen = () => {
19687
20209
  if (widgetMode === "feedback" && QA_ONLY_SCREENS.includes(currentScreen.name)) {
19688
- return /* @__PURE__ */ React22.createElement(HomeScreen, { nav });
20210
+ return /* @__PURE__ */ React23.createElement(HomeScreen, { nav });
19689
20211
  }
19690
20212
  switch (currentScreen.name) {
19691
20213
  case "HOME":
19692
- return /* @__PURE__ */ React22.createElement(HomeScreen, { nav });
20214
+ return /* @__PURE__ */ React23.createElement(HomeScreen, { nav });
19693
20215
  case "TEST_DETAIL":
19694
- return /* @__PURE__ */ React22.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
20216
+ return /* @__PURE__ */ React23.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
19695
20217
  case "TEST_LIST":
19696
- return /* @__PURE__ */ React22.createElement(TestListScreen, { nav });
20218
+ return /* @__PURE__ */ React23.createElement(TestListScreen, { nav });
19697
20219
  case "TEST_FEEDBACK":
19698
- return /* @__PURE__ */ React22.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
20220
+ return /* @__PURE__ */ React23.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
19699
20221
  case "REPORT":
19700
- return /* @__PURE__ */ React22.createElement(
20222
+ return /* @__PURE__ */ React23.createElement(
19701
20223
  ReportScreen,
19702
20224
  {
19703
20225
  nav,
@@ -19709,30 +20231,30 @@ function BugBearButton({
19709
20231
  }
19710
20232
  );
19711
20233
  case "REPORT_SUCCESS":
19712
- return /* @__PURE__ */ React22.createElement(ReportSuccessScreen, { nav });
20234
+ return /* @__PURE__ */ React23.createElement(ReportSuccessScreen, { nav });
19713
20235
  case "MESSAGE_LIST":
19714
- return /* @__PURE__ */ React22.createElement(MessageListScreen, { nav });
20236
+ return /* @__PURE__ */ React23.createElement(MessageListScreen, { nav });
19715
20237
  case "THREAD_DETAIL":
19716
- return /* @__PURE__ */ React22.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
20238
+ return /* @__PURE__ */ React23.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
19717
20239
  case "COMPOSE_MESSAGE":
19718
- return /* @__PURE__ */ React22.createElement(ComposeMessageScreen, { nav });
20240
+ return /* @__PURE__ */ React23.createElement(ComposeMessageScreen, { nav });
19719
20241
  case "ISSUE_LIST":
19720
- return /* @__PURE__ */ React22.createElement(IssueListScreen, { nav, category: currentScreen.category });
20242
+ return /* @__PURE__ */ React23.createElement(IssueListScreen, { nav, category: currentScreen.category });
19721
20243
  case "ISSUE_DETAIL":
19722
- return /* @__PURE__ */ React22.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
20244
+ return /* @__PURE__ */ React23.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
19723
20245
  case "PROFILE":
19724
- return /* @__PURE__ */ React22.createElement(ProfileScreen, { nav });
20246
+ return /* @__PURE__ */ React23.createElement(ProfileScreen, { nav });
19725
20247
  case "SESSION_START":
19726
- return /* @__PURE__ */ React22.createElement(SessionStartScreen, { nav });
20248
+ return /* @__PURE__ */ React23.createElement(SessionStartScreen, { nav });
19727
20249
  case "SESSION_ACTIVE":
19728
- return /* @__PURE__ */ React22.createElement(SessionActiveScreen, { nav });
20250
+ return /* @__PURE__ */ React23.createElement(SessionActiveScreen, { nav });
19729
20251
  case "SESSION_FINDING":
19730
- return /* @__PURE__ */ React22.createElement(SessionFindingScreen, { nav });
20252
+ return /* @__PURE__ */ React23.createElement(SessionFindingScreen, { nav });
19731
20253
  default:
19732
- return /* @__PURE__ */ React22.createElement(HomeScreen, { nav });
20254
+ return /* @__PURE__ */ React23.createElement(HomeScreen, { nav });
19733
20255
  }
19734
20256
  };
19735
- return /* @__PURE__ */ React22.createElement(React22.Fragment, null, viewMode === "mini-runner" && miniRunnerAssignmentId && /* @__PURE__ */ React22.createElement(
20257
+ return /* @__PURE__ */ React23.createElement(React23.Fragment, null, viewMode === "mini-runner" && miniRunnerAssignmentId && /* @__PURE__ */ React23.createElement(
19736
20258
  MiniTestRunner,
19737
20259
  {
19738
20260
  assignmentId: miniRunnerAssignmentId,
@@ -19741,61 +20263,70 @@ function BugBearButton({
19741
20263
  onComplete: handleMiniRunnerComplete,
19742
20264
  onNavigateToReport: handleMiniRunnerReport
19743
20265
  }
19744
- ), viewMode === "closed" && /* @__PURE__ */ React22.createElement(
19745
- Animated4.View,
20266
+ ), viewMode === "ad-hoc" && activeSession && /* @__PURE__ */ React23.createElement(
20267
+ AdHocOverlay,
19746
20268
  {
19747
- style: [styles6.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
20269
+ sessionId: activeSession.id,
20270
+ focusArea: activeSession.focusArea,
20271
+ startedAt: activeSession.startedAt,
20272
+ onExpand: expandFromAdHoc,
20273
+ onComplete: handleAdHocComplete
20274
+ }
20275
+ ), viewMode === "closed" && /* @__PURE__ */ React23.createElement(
20276
+ Animated5.View,
20277
+ {
20278
+ style: [styles7.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
19748
20279
  ...panResponder.panHandlers
19749
20280
  },
19750
- /* @__PURE__ */ React22.createElement(
19751
- TouchableOpacity19,
20281
+ /* @__PURE__ */ React23.createElement(
20282
+ TouchableOpacity20,
19752
20283
  {
19753
- style: styles6.fab,
20284
+ style: styles7.fab,
19754
20285
  onPress: openPanel,
19755
20286
  activeOpacity: draggable ? 1 : 0.7
19756
20287
  },
19757
- /* @__PURE__ */ React22.createElement(Image4, { source: { uri: BUGBEAR_LOGO_BASE64 }, style: styles6.fabIcon }),
19758
- badgeCount > 0 && /* @__PURE__ */ React22.createElement(View22, { style: styles6.badge }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.badgeText }, badgeCount > 9 ? "9+" : badgeCount))
20288
+ /* @__PURE__ */ React23.createElement(Image4, { source: { uri: BUGBEAR_LOGO_BASE64 }, style: styles7.fabIcon }),
20289
+ badgeCount > 0 && /* @__PURE__ */ React23.createElement(View23, { style: styles7.badge }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.badgeText }, badgeCount > 9 ? "9+" : badgeCount))
19759
20290
  )
19760
- ), viewMode === "panel" && /* @__PURE__ */ React22.createElement(View22, { style: styles6.panelWrapper, pointerEvents: "box-none" }, /* @__PURE__ */ React22.createElement(
20291
+ ), viewMode === "panel" && /* @__PURE__ */ React23.createElement(View23, { style: styles7.panelWrapper, pointerEvents: "box-none" }, /* @__PURE__ */ React23.createElement(
19761
20292
  KeyboardAvoidingView,
19762
20293
  {
19763
- behavior: Platform6.OS === "ios" ? "padding" : "height",
19764
- style: styles6.panelKeyboardAvoid,
20294
+ behavior: Platform7.OS === "ios" ? "padding" : "height",
20295
+ style: styles7.panelKeyboardAvoid,
19765
20296
  pointerEvents: "box-none"
19766
20297
  },
19767
- /* @__PURE__ */ React22.createElement(
19768
- Animated4.View,
20298
+ /* @__PURE__ */ React23.createElement(
20299
+ Animated5.View,
19769
20300
  {
19770
20301
  style: [
19771
- styles6.panelContainer,
20302
+ styles7.panelContainer,
19772
20303
  {
19773
20304
  transform: [{
19774
20305
  translateY: panelAnim.interpolate({
19775
20306
  inputRange: [0, 1],
19776
- outputRange: [screenHeight2, 0]
20307
+ outputRange: [screenHeight3, 0]
19777
20308
  })
19778
20309
  }]
19779
20310
  }
19780
20311
  ]
19781
20312
  },
19782
- /* @__PURE__ */ React22.createElement(View22, { style: styles6.panelHandle }, /* @__PURE__ */ React22.createElement(View22, { style: styles6.panelHandleBar })),
19783
- /* @__PURE__ */ React22.createElement(View22, { style: styles6.header }, /* @__PURE__ */ React22.createElement(View22, { style: styles6.headerLeft }, canGoBack ? /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: () => nav.pop(), style: styles6.backButton }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.backText }, "\u2190 Back")) : /* @__PURE__ */ React22.createElement(View22, { style: styles6.headerTitleRow }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.headerTitle }, "BugBear"), testerInfo && /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: () => push({ name: "PROFILE" }) }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.headerName }, testerInfo.name, " \u270E")))), getHeaderTitle() ? /* @__PURE__ */ React22.createElement(Text20, { style: styles6.headerScreenTitle, numberOfLines: 1 }, getHeaderTitle()) : null, /* @__PURE__ */ React22.createElement(View22, { style: styles6.headerActions }, currentScreen.name !== "HOME" && /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: () => nav.reset(), style: styles6.homeButton }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.homeIcon }, "\u2302")), /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: handleClose, style: styles6.closeButton }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.closeText }, "\u2715")))),
19784
- /* @__PURE__ */ React22.createElement(
20313
+ /* @__PURE__ */ React23.createElement(View23, { style: styles7.panelHandle }, /* @__PURE__ */ React23.createElement(View23, { style: styles7.panelHandleBar })),
20314
+ /* @__PURE__ */ React23.createElement(View23, { style: styles7.header }, /* @__PURE__ */ React23.createElement(View23, { style: styles7.headerLeft }, canGoBack ? /* @__PURE__ */ React23.createElement(TouchableOpacity20, { onPress: () => nav.pop(), style: styles7.backButton }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.backText }, "\u2190 Back")) : /* @__PURE__ */ React23.createElement(View23, { style: styles7.headerTitleRow }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.headerTitle }, "BugBear"), testerInfo && /* @__PURE__ */ React23.createElement(TouchableOpacity20, { onPress: () => push({ name: "PROFILE" }) }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.headerName }, testerInfo.name, " \u270E")))), getHeaderTitle() ? /* @__PURE__ */ React23.createElement(Text21, { style: styles7.headerScreenTitle, numberOfLines: 1 }, getHeaderTitle()) : null, /* @__PURE__ */ React23.createElement(View23, { style: styles7.headerActions }, currentScreen.name !== "HOME" && /* @__PURE__ */ React23.createElement(TouchableOpacity20, { onPress: () => nav.reset(), style: styles7.homeButton }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.homeIcon }, "\u2302")), /* @__PURE__ */ React23.createElement(TouchableOpacity20, { onPress: handleClose, style: styles7.closeButton }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.closeText }, "\u2715")))),
20315
+ /* @__PURE__ */ React23.createElement(
19785
20316
  ScrollView4,
19786
20317
  {
19787
- style: styles6.content,
19788
- contentContainerStyle: styles6.contentContainer,
20318
+ style: styles7.content,
20319
+ contentContainerStyle: styles7.contentContainer,
19789
20320
  keyboardShouldPersistTaps: "handled",
19790
20321
  showsVerticalScrollIndicator: false
19791
20322
  },
19792
- isLoading ? /* @__PURE__ */ React22.createElement(View22, { style: styles6.loadingContainer }, /* @__PURE__ */ React22.createElement(ActivityIndicator3, { size: "large", color: colors.blue }), /* @__PURE__ */ React22.createElement(Text20, { style: styles6.loadingText }, "Loading...")) : renderScreen()
20323
+ isLoading ? /* @__PURE__ */ React23.createElement(View23, { style: styles7.loadingContainer }, /* @__PURE__ */ React23.createElement(ActivityIndicator3, { size: "large", color: colors.blue }), /* @__PURE__ */ React23.createElement(Text21, { style: styles7.loadingText }, "Loading...")) : renderScreen()
19793
20324
  )
19794
20325
  )
19795
20326
  )));
19796
20327
  }
19797
20328
  function createStyles16() {
19798
- return StyleSheet22.create({
20329
+ return StyleSheet23.create({
19799
20330
  // FAB
19800
20331
  fabContainer: {
19801
20332
  position: "absolute",
@@ -19954,7 +20485,7 @@ function createStyles16() {
19954
20485
  },
19955
20486
  contentContainer: {
19956
20487
  padding: 16,
19957
- paddingBottom: Platform6.OS === "ios" ? 50 : 28
20488
+ paddingBottom: Platform7.OS === "ios" ? 50 : 28
19958
20489
  },
19959
20490
  // Loading
19960
20491
  loadingContainer: {
@@ -19970,8 +20501,8 @@ function createStyles16() {
19970
20501
  }
19971
20502
 
19972
20503
  // src/BugBearErrorBoundary.tsx
19973
- import React23, { Component } from "react";
19974
- import { View as View23, Text as Text21, TouchableOpacity as TouchableOpacity20, StyleSheet as StyleSheet23 } from "react-native";
20504
+ import React24, { Component } from "react";
20505
+ import { View as View24, Text as Text22, TouchableOpacity as TouchableOpacity21, StyleSheet as StyleSheet24 } from "react-native";
19975
20506
  var BugBearErrorBoundary = class extends Component {
19976
20507
  constructor(props) {
19977
20508
  super(props);
@@ -20016,7 +20547,7 @@ var BugBearErrorBoundary = class extends Component {
20016
20547
  if (fallback) {
20017
20548
  return fallback;
20018
20549
  }
20019
- return /* @__PURE__ */ React23.createElement(View23, { style: styles5.container }, /* @__PURE__ */ React23.createElement(Text21, { style: styles5.title }, "Something went wrong"), /* @__PURE__ */ React23.createElement(Text21, { style: styles5.message }, error.message), /* @__PURE__ */ React23.createElement(TouchableOpacity20, { style: styles5.button, onPress: this.reset }, /* @__PURE__ */ React23.createElement(Text21, { style: styles5.buttonText }, "Try Again")), /* @__PURE__ */ React23.createElement(Text21, { style: styles5.caption }, "The error has been captured by BugBear"));
20550
+ return /* @__PURE__ */ React24.createElement(View24, { style: styles6.container }, /* @__PURE__ */ React24.createElement(Text22, { style: styles6.title }, "Something went wrong"), /* @__PURE__ */ React24.createElement(Text22, { style: styles6.message }, error.message), /* @__PURE__ */ React24.createElement(TouchableOpacity21, { style: styles6.button, onPress: this.reset }, /* @__PURE__ */ React24.createElement(Text22, { style: styles6.buttonText }, "Try Again")), /* @__PURE__ */ React24.createElement(Text22, { style: styles6.caption }, "The error has been captured by BugBear"));
20020
20551
  }
20021
20552
  return children;
20022
20553
  }
@@ -20027,7 +20558,7 @@ function useErrorContext() {
20027
20558
  getEnhancedContext: () => contextCapture.getEnhancedContext()
20028
20559
  };
20029
20560
  }
20030
- var styles5 = StyleSheet23.create({
20561
+ var styles6 = StyleSheet24.create({
20031
20562
  container: {
20032
20563
  padding: 20,
20033
20564
  margin: 20,