@bbearai/react-native 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.js +964 -256
  2. package/dist/index.mjs +964 -256
  3. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -11449,7 +11449,16 @@ var BugBearClient = class {
11449
11449
  */
11450
11450
  async submitReport(report) {
11451
11451
  try {
11452
+ const validationError = this.validateReport(report);
11453
+ if (validationError) {
11454
+ return { success: false, error: validationError };
11455
+ }
11452
11456
  const userInfo = await this.getCurrentUserInfo();
11457
+ const rateLimitId = userInfo?.email || this.config.projectId;
11458
+ const rateLimit = await this.checkRateLimit(rateLimitId, "report_submit");
11459
+ if (!rateLimit.allowed) {
11460
+ return { success: false, error: rateLimit.error };
11461
+ }
11453
11462
  if (!userInfo) {
11454
11463
  console.error("BugBear: No user info available, cannot submit report");
11455
11464
  return { success: false, error: "User not authenticated" };
@@ -11500,6 +11509,7 @@ var BugBearClient = class {
11500
11509
  const { data, error } = await this.supabase.from("test_assignments").select(`
11501
11510
  id,
11502
11511
  status,
11512
+ started_at,
11503
11513
  test_case:test_cases(
11504
11514
  id,
11505
11515
  title,
@@ -11527,6 +11537,7 @@ var BugBearClient = class {
11527
11537
  return (data || []).map((item) => ({
11528
11538
  id: item.id,
11529
11539
  status: item.status,
11540
+ startedAt: item.started_at,
11530
11541
  testCase: {
11531
11542
  id: item.test_case.id,
11532
11543
  title: item.test_case.title,
@@ -11552,47 +11563,430 @@ var BugBearClient = class {
11552
11563
  return [];
11553
11564
  }
11554
11565
  }
11566
+ /**
11567
+ * Get assignment by ID with time tracking fields
11568
+ */
11569
+ async getAssignment(assignmentId) {
11570
+ try {
11571
+ const { data, error } = await this.supabase.from("test_assignments").select(`
11572
+ id,
11573
+ status,
11574
+ started_at,
11575
+ completed_at,
11576
+ duration_seconds,
11577
+ test_case:test_cases(
11578
+ id,
11579
+ title,
11580
+ test_key,
11581
+ description,
11582
+ steps,
11583
+ expected_result,
11584
+ priority,
11585
+ target_route,
11586
+ track:qa_tracks(
11587
+ id,
11588
+ name,
11589
+ icon,
11590
+ color,
11591
+ test_template,
11592
+ rubric_mode,
11593
+ description
11594
+ )
11595
+ )
11596
+ `).eq("id", assignmentId).single();
11597
+ if (error || !data) return null;
11598
+ const testCase = data.test_case;
11599
+ if (!testCase) {
11600
+ console.error("BugBear: Assignment returned without test_case");
11601
+ return null;
11602
+ }
11603
+ const track = testCase.track;
11604
+ return {
11605
+ id: data.id,
11606
+ status: data.status,
11607
+ startedAt: data.started_at,
11608
+ durationSeconds: data.duration_seconds,
11609
+ testCase: {
11610
+ id: testCase.id,
11611
+ title: testCase.title,
11612
+ testKey: testCase.test_key,
11613
+ description: testCase.description,
11614
+ steps: testCase.steps,
11615
+ expectedResult: testCase.expected_result,
11616
+ priority: testCase.priority,
11617
+ targetRoute: testCase.target_route,
11618
+ track: track ? {
11619
+ id: track.id,
11620
+ name: track.name,
11621
+ icon: track.icon,
11622
+ color: track.color,
11623
+ testTemplate: track.test_template,
11624
+ rubricMode: track.rubric_mode || "pass_fail",
11625
+ description: track.description
11626
+ } : void 0
11627
+ }
11628
+ };
11629
+ } catch (err) {
11630
+ console.error("BugBear: Error fetching assignment", err);
11631
+ return null;
11632
+ }
11633
+ }
11634
+ /**
11635
+ * Update assignment status with automatic time tracking
11636
+ * - Sets started_at when status changes to 'in_progress'
11637
+ * - Calculates duration_seconds when status changes to 'passed'/'failed'/'blocked'
11638
+ * - Optionally include feedback when completing a test
11639
+ */
11640
+ async updateAssignmentStatus(assignmentId, status, options) {
11641
+ try {
11642
+ const { data: currentAssignment, error: fetchError } = await this.supabase.from("test_assignments").select("status, started_at").eq("id", assignmentId).single();
11643
+ if (fetchError || !currentAssignment) {
11644
+ return { success: false, error: "Assignment not found" };
11645
+ }
11646
+ const updateData = { status };
11647
+ let durationSeconds;
11648
+ if (status === "in_progress" && currentAssignment.status !== "in_progress") {
11649
+ updateData.started_at = (/* @__PURE__ */ new Date()).toISOString();
11650
+ }
11651
+ if (["passed", "failed", "blocked"].includes(status)) {
11652
+ updateData.completed_at = (/* @__PURE__ */ new Date()).toISOString();
11653
+ if (currentAssignment.started_at) {
11654
+ const startedAt = new Date(currentAssignment.started_at);
11655
+ const completedAt = /* @__PURE__ */ new Date();
11656
+ durationSeconds = Math.round((completedAt.getTime() - startedAt.getTime()) / 1e3);
11657
+ updateData.duration_seconds = durationSeconds;
11658
+ }
11659
+ }
11660
+ if (options?.notes) {
11661
+ updateData.notes = options.notes;
11662
+ }
11663
+ if (options?.testResult) {
11664
+ updateData.test_result = options.testResult;
11665
+ }
11666
+ const { error } = await this.supabase.from("test_assignments").update(updateData).eq("id", assignmentId);
11667
+ if (error) {
11668
+ console.error("BugBear: Failed to update assignment status", error);
11669
+ return { success: false, error: error.message };
11670
+ }
11671
+ if (options?.feedback && ["passed", "failed", "blocked"].includes(status)) {
11672
+ const { data: assignmentData, error: fetchError2 } = await this.supabase.from("test_assignments").select("test_case_id").eq("id", assignmentId).single();
11673
+ if (fetchError2) {
11674
+ console.error("BugBear: Failed to fetch assignment for feedback", fetchError2);
11675
+ } else if (assignmentData?.test_case_id) {
11676
+ const feedbackResult = await this.submitTestFeedback({
11677
+ testCaseId: assignmentData.test_case_id,
11678
+ assignmentId,
11679
+ feedback: options.feedback,
11680
+ timeToCompleteSeconds: durationSeconds
11681
+ });
11682
+ if (!feedbackResult.success) {
11683
+ console.error("BugBear: Failed to submit feedback", feedbackResult.error);
11684
+ }
11685
+ }
11686
+ }
11687
+ return { success: true, durationSeconds };
11688
+ } catch (err) {
11689
+ const message = err instanceof Error ? err.message : "Unknown error";
11690
+ console.error("BugBear: Error updating assignment status", err);
11691
+ return { success: false, error: message };
11692
+ }
11693
+ }
11694
+ /**
11695
+ * Submit feedback on a test case to help improve test quality
11696
+ * This empowers testers to shape better tests over time
11697
+ */
11698
+ async submitTestFeedback(options) {
11699
+ try {
11700
+ const testerInfo = await this.getTesterInfo();
11701
+ if (!testerInfo) {
11702
+ return { success: false, error: "Not authenticated as tester" };
11703
+ }
11704
+ const { testCaseId, assignmentId, feedback, timeToCompleteSeconds } = options;
11705
+ if (feedback.rating < 1 || feedback.rating > 5) {
11706
+ return { success: false, error: "Rating must be between 1 and 5" };
11707
+ }
11708
+ const { error: feedbackError } = await this.supabase.from("test_feedback").insert({
11709
+ project_id: this.config.projectId,
11710
+ test_case_id: testCaseId,
11711
+ assignment_id: assignmentId || null,
11712
+ tester_id: testerInfo.id,
11713
+ rating: feedback.rating,
11714
+ clarity_rating: feedback.clarityRating || null,
11715
+ steps_rating: feedback.stepsRating || null,
11716
+ relevance_rating: feedback.relevanceRating || null,
11717
+ feedback_note: feedback.feedbackNote?.trim() || null,
11718
+ suggested_improvement: feedback.suggestedImprovement?.trim() || null,
11719
+ is_outdated: feedback.isOutdated || false,
11720
+ needs_more_detail: feedback.needsMoreDetail || false,
11721
+ steps_unclear: feedback.stepsUnclear || false,
11722
+ expected_result_unclear: feedback.expectedResultUnclear || false,
11723
+ platform: this.getDeviceInfo().platform,
11724
+ time_to_complete_seconds: timeToCompleteSeconds || null
11725
+ });
11726
+ if (feedbackError) {
11727
+ console.error("BugBear: Failed to submit feedback", feedbackError);
11728
+ return { success: false, error: feedbackError.message };
11729
+ }
11730
+ if (assignmentId) {
11731
+ const { error: assignmentError } = await this.supabase.from("test_assignments").update({
11732
+ feedback_rating: feedback.rating,
11733
+ feedback_note: feedback.feedbackNote?.trim() || null,
11734
+ feedback_submitted_at: (/* @__PURE__ */ new Date()).toISOString()
11735
+ }).eq("id", assignmentId);
11736
+ if (assignmentError) {
11737
+ console.error("BugBear: Failed to update assignment feedback fields", assignmentError);
11738
+ }
11739
+ }
11740
+ return { success: true };
11741
+ } catch (err) {
11742
+ const message = err instanceof Error ? err.message : "Unknown error";
11743
+ console.error("BugBear: Error submitting feedback", err);
11744
+ return { success: false, error: message };
11745
+ }
11746
+ }
11747
+ /**
11748
+ * Get the currently active (in_progress) assignment for the tester
11749
+ */
11750
+ async getActiveAssignment() {
11751
+ try {
11752
+ const testerInfo = await this.getTesterInfo();
11753
+ if (!testerInfo) return null;
11754
+ const { data, error } = await this.supabase.from("test_assignments").select(`
11755
+ id,
11756
+ status,
11757
+ started_at,
11758
+ test_case:test_cases(
11759
+ id,
11760
+ title,
11761
+ test_key,
11762
+ description,
11763
+ steps,
11764
+ expected_result,
11765
+ priority,
11766
+ target_route,
11767
+ track:qa_tracks(
11768
+ id,
11769
+ name,
11770
+ icon,
11771
+ color,
11772
+ test_template,
11773
+ rubric_mode,
11774
+ description
11775
+ )
11776
+ )
11777
+ `).eq("project_id", this.config.projectId).eq("tester_id", testerInfo.id).eq("status", "in_progress").order("started_at", { ascending: false }).limit(1).maybeSingle();
11778
+ if (error || !data) return null;
11779
+ const testCase = data.test_case;
11780
+ if (!testCase) {
11781
+ console.error("BugBear: Active assignment returned without test_case");
11782
+ return null;
11783
+ }
11784
+ const track = testCase.track;
11785
+ return {
11786
+ id: data.id,
11787
+ status: data.status,
11788
+ startedAt: data.started_at,
11789
+ testCase: {
11790
+ id: testCase.id,
11791
+ title: testCase.title,
11792
+ testKey: testCase.test_key,
11793
+ description: testCase.description,
11794
+ steps: testCase.steps,
11795
+ expectedResult: testCase.expected_result,
11796
+ priority: testCase.priority,
11797
+ targetRoute: testCase.target_route,
11798
+ track: track ? {
11799
+ id: track.id,
11800
+ name: track.name,
11801
+ icon: track.icon,
11802
+ color: track.color,
11803
+ testTemplate: track.test_template,
11804
+ rubricMode: track.rubric_mode || "pass_fail",
11805
+ description: track.description
11806
+ } : void 0
11807
+ }
11808
+ };
11809
+ } catch (err) {
11810
+ console.error("BugBear: Error fetching active assignment", err);
11811
+ return null;
11812
+ }
11813
+ }
11555
11814
  /**
11556
11815
  * Get current tester info
11557
11816
  * Looks up tester by email from the host app's authenticated user
11817
+ * Checks both primary email AND additional_emails array
11818
+ * Uses parameterized RPC function to prevent SQL injection
11558
11819
  */
11559
11820
  async getTesterInfo() {
11560
11821
  try {
11561
11822
  const userInfo = await this.getCurrentUserInfo();
11562
- if (!userInfo) return null;
11563
- const { data, error } = await this.supabase.from("testers").select("*").eq("project_id", this.config.projectId).eq("email", userInfo.email).eq("status", "active").single();
11823
+ if (!userInfo?.email) return null;
11824
+ if (!this.isValidEmail(userInfo.email)) {
11825
+ console.warn("BugBear: Invalid email format");
11826
+ return null;
11827
+ }
11828
+ const { data, error } = await this.supabase.rpc("lookup_tester_by_email", {
11829
+ p_project_id: this.config.projectId,
11830
+ p_email: userInfo.email
11831
+ }).maybeSingle();
11564
11832
  if (error || !data) return null;
11833
+ const tester = data;
11565
11834
  return {
11566
- id: data.id,
11567
- name: data.name,
11568
- email: data.email,
11569
- additionalEmails: data.additional_emails || [],
11570
- avatarUrl: data.avatar_url || void 0,
11571
- platforms: data.platforms || [],
11572
- assignedTests: data.assigned_count || 0,
11573
- completedTests: data.completed_count || 0
11835
+ id: tester.id,
11836
+ name: tester.name,
11837
+ email: tester.email,
11838
+ additionalEmails: tester.additional_emails || [],
11839
+ avatarUrl: tester.avatar_url || void 0,
11840
+ platforms: tester.platforms || [],
11841
+ assignedTests: tester.assigned_count || 0,
11842
+ completedTests: tester.completed_count || 0
11574
11843
  };
11575
11844
  } catch (err) {
11576
11845
  console.error("BugBear: getTesterInfo error", err);
11577
11846
  return null;
11578
11847
  }
11579
11848
  }
11849
+ /**
11850
+ * Basic email format validation (defense in depth)
11851
+ */
11852
+ isValidEmail(email) {
11853
+ if (!email || email.length > 254) return false;
11854
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
11855
+ return emailRegex.test(email);
11856
+ }
11857
+ /**
11858
+ * Validate report input before submission
11859
+ * Returns error message if invalid, null if valid
11860
+ */
11861
+ validateReport(report) {
11862
+ const validTypes = ["bug", "feedback", "suggestion", "test_pass", "test_fail"];
11863
+ if (report.type && !validTypes.includes(report.type)) {
11864
+ return `Invalid report type: ${report.type}. Must be one of: ${validTypes.join(", ")}`;
11865
+ }
11866
+ const validSeverities = ["critical", "high", "medium", "low"];
11867
+ if (report.severity && !validSeverities.includes(report.severity)) {
11868
+ return `Invalid severity: ${report.severity}. Must be one of: ${validSeverities.join(", ")}`;
11869
+ }
11870
+ if (report.title && report.title.length > 500) {
11871
+ return "Title must be 500 characters or less";
11872
+ }
11873
+ if (report.description && report.description.length > 1e4) {
11874
+ return "Description must be 10,000 characters or less";
11875
+ }
11876
+ if (report.screenshots && Array.isArray(report.screenshots)) {
11877
+ if (report.screenshots.length > 10) {
11878
+ return "Maximum 10 screenshots allowed";
11879
+ }
11880
+ for (const url of report.screenshots) {
11881
+ if (typeof url !== "string" || url.length > 2e3) {
11882
+ return "Invalid screenshot URL";
11883
+ }
11884
+ }
11885
+ }
11886
+ return null;
11887
+ }
11888
+ /**
11889
+ * Validate profile update input
11890
+ * Returns error message if invalid, null if valid
11891
+ */
11892
+ validateProfileUpdate(updates) {
11893
+ if (updates.name !== void 0) {
11894
+ if (typeof updates.name !== "string" || updates.name.length > 100) {
11895
+ return "Name must be 100 characters or less";
11896
+ }
11897
+ }
11898
+ if (updates.additionalEmails !== void 0) {
11899
+ if (!Array.isArray(updates.additionalEmails)) {
11900
+ return "Additional emails must be an array";
11901
+ }
11902
+ if (updates.additionalEmails.length > 5) {
11903
+ return "Maximum 5 additional emails allowed";
11904
+ }
11905
+ for (const email of updates.additionalEmails) {
11906
+ if (!this.isValidEmail(email)) {
11907
+ return `Invalid email format: ${email}`;
11908
+ }
11909
+ }
11910
+ }
11911
+ if (updates.avatarUrl !== void 0 && updates.avatarUrl !== null) {
11912
+ if (typeof updates.avatarUrl !== "string" || updates.avatarUrl.length > 2e3) {
11913
+ return "Invalid avatar URL";
11914
+ }
11915
+ }
11916
+ if (updates.platforms !== void 0) {
11917
+ if (!Array.isArray(updates.platforms)) {
11918
+ return "Platforms must be an array";
11919
+ }
11920
+ const validPlatforms = ["ios", "android", "web", "desktop", "other"];
11921
+ for (const platform of updates.platforms) {
11922
+ if (!validPlatforms.includes(platform)) {
11923
+ return `Invalid platform: ${platform}. Must be one of: ${validPlatforms.join(", ")}`;
11924
+ }
11925
+ }
11926
+ }
11927
+ return null;
11928
+ }
11929
+ /**
11930
+ * Check rate limit for an action
11931
+ * Returns { allowed: boolean, error?: string, remaining?: number }
11932
+ */
11933
+ async checkRateLimit(identifier, action) {
11934
+ try {
11935
+ const { data, error } = await this.supabase.rpc("check_rate_limit", {
11936
+ p_identifier: identifier,
11937
+ p_action: action,
11938
+ p_project_id: this.config.projectId
11939
+ });
11940
+ if (error) {
11941
+ console.warn("BugBear: Rate limit check failed, allowing request", error.message);
11942
+ return { allowed: true };
11943
+ }
11944
+ if (!data.allowed) {
11945
+ return {
11946
+ allowed: false,
11947
+ error: `Rate limit exceeded. Try again in ${Math.ceil((new Date(data.reset_at).getTime() - Date.now()) / 1e3)} seconds.`,
11948
+ remaining: 0,
11949
+ resetAt: data.reset_at
11950
+ };
11951
+ }
11952
+ return {
11953
+ allowed: true,
11954
+ remaining: data.remaining,
11955
+ resetAt: data.reset_at
11956
+ };
11957
+ } catch (err) {
11958
+ console.warn("BugBear: Rate limit check error", err);
11959
+ return { allowed: true };
11960
+ }
11961
+ }
11580
11962
  /**
11581
11963
  * Update tester profile
11582
11964
  * Allows testers to update their name, additional emails, avatar, and platforms
11583
11965
  */
11584
11966
  async updateTesterProfile(updates) {
11585
11967
  try {
11968
+ const validationError = this.validateProfileUpdate(updates);
11969
+ if (validationError) {
11970
+ return { success: false, error: validationError };
11971
+ }
11586
11972
  const userInfo = await this.getCurrentUserInfo();
11587
11973
  if (!userInfo) {
11588
11974
  return { success: false, error: "Not authenticated" };
11589
11975
  }
11976
+ const rateLimit = await this.checkRateLimit(userInfo.email, "profile_update");
11977
+ if (!rateLimit.allowed) {
11978
+ return { success: false, error: rateLimit.error };
11979
+ }
11980
+ const testerInfo = await this.getTesterInfo();
11981
+ if (!testerInfo) {
11982
+ return { success: false, error: "Not a registered tester" };
11983
+ }
11590
11984
  const updateData = {};
11591
11985
  if (updates.name !== void 0) updateData.name = updates.name;
11592
11986
  if (updates.additionalEmails !== void 0) updateData.additional_emails = updates.additionalEmails;
11593
11987
  if (updates.avatarUrl !== void 0) updateData.avatar_url = updates.avatarUrl;
11594
11988
  if (updates.platforms !== void 0) updateData.platforms = updates.platforms;
11595
- const { error } = await this.supabase.from("testers").update(updateData).eq("project_id", this.config.projectId).eq("email", userInfo.email);
11989
+ const { error } = await this.supabase.from("testers").update(updateData).eq("id", testerInfo.id);
11596
11990
  if (error) {
11597
11991
  console.error("BugBear: updateTesterProfile error", error);
11598
11992
  return { success: false, error: error.message };
@@ -11868,6 +12262,11 @@ var BugBearClient = class {
11868
12262
  console.error("BugBear: No tester info, cannot send message");
11869
12263
  return false;
11870
12264
  }
12265
+ const rateLimit = await this.checkRateLimit(testerInfo.email, "message_send");
12266
+ if (!rateLimit.allowed) {
12267
+ console.error("BugBear: Rate limit exceeded for messages");
12268
+ return false;
12269
+ }
11871
12270
  const { error } = await this.supabase.from("discussion_messages").insert({
11872
12271
  thread_id: threadId,
11873
12272
  sender_type: "tester",
@@ -11962,6 +12361,248 @@ var BugBearClient = class {
11962
12361
  return { success: false, error: message };
11963
12362
  }
11964
12363
  }
12364
+ // ============================================
12365
+ // QA Sessions (Sprint 1)
12366
+ // ============================================
12367
+ /**
12368
+ * Start a new QA session for exploratory testing
12369
+ */
12370
+ async startSession(options = {}) {
12371
+ try {
12372
+ const testerInfo = await this.getTesterInfo();
12373
+ if (!testerInfo) {
12374
+ return { success: false, error: "Not authenticated as a tester" };
12375
+ }
12376
+ const activeSession = await this.getActiveSession();
12377
+ if (activeSession) {
12378
+ return { success: false, error: "You already have an active session. End it before starting a new one." };
12379
+ }
12380
+ const { data, error } = await this.supabase.rpc("start_qa_session", {
12381
+ p_project_id: this.config.projectId,
12382
+ p_tester_id: testerInfo.id,
12383
+ p_focus_area: options.focusArea || null,
12384
+ p_track: options.track || null,
12385
+ p_platform: options.platform || null
12386
+ });
12387
+ if (error) {
12388
+ console.error("BugBear: Failed to start session", error);
12389
+ return { success: false, error: error.message };
12390
+ }
12391
+ const session = await this.getSession(data);
12392
+ if (!session) {
12393
+ return { success: false, error: "Session created but could not be fetched" };
12394
+ }
12395
+ return { success: true, session };
12396
+ } catch (err) {
12397
+ const message = err instanceof Error ? err.message : "Unknown error";
12398
+ console.error("BugBear: Error starting session", err);
12399
+ return { success: false, error: message };
12400
+ }
12401
+ }
12402
+ /**
12403
+ * End the current QA session
12404
+ */
12405
+ async endSession(sessionId, options = {}) {
12406
+ try {
12407
+ const { data, error } = await this.supabase.rpc("end_qa_session", {
12408
+ p_session_id: sessionId,
12409
+ p_notes: options.notes || null,
12410
+ p_routes_covered: options.routesCovered || null
12411
+ });
12412
+ if (error) {
12413
+ console.error("BugBear: Failed to end session", error);
12414
+ return { success: false, error: error.message };
12415
+ }
12416
+ const session = this.transformSession(data);
12417
+ return { success: true, session };
12418
+ } catch (err) {
12419
+ const message = err instanceof Error ? err.message : "Unknown error";
12420
+ console.error("BugBear: Error ending session", err);
12421
+ return { success: false, error: message };
12422
+ }
12423
+ }
12424
+ /**
12425
+ * Get the current active session for the tester
12426
+ */
12427
+ async getActiveSession() {
12428
+ try {
12429
+ const testerInfo = await this.getTesterInfo();
12430
+ if (!testerInfo) return null;
12431
+ const { data, error } = await this.supabase.from("qa_sessions").select("*").eq("project_id", this.config.projectId).eq("tester_id", testerInfo.id).eq("status", "active").order("started_at", { ascending: false }).limit(1).maybeSingle();
12432
+ if (error || !data) return null;
12433
+ return this.transformSession(data);
12434
+ } catch (err) {
12435
+ console.error("BugBear: Error fetching active session", err);
12436
+ return null;
12437
+ }
12438
+ }
12439
+ /**
12440
+ * Get a session by ID
12441
+ */
12442
+ async getSession(sessionId) {
12443
+ try {
12444
+ const { data, error } = await this.supabase.from("qa_sessions").select("*").eq("id", sessionId).single();
12445
+ if (error || !data) return null;
12446
+ return this.transformSession(data);
12447
+ } catch (err) {
12448
+ console.error("BugBear: Error fetching session", err);
12449
+ return null;
12450
+ }
12451
+ }
12452
+ /**
12453
+ * Get session history for the tester
12454
+ */
12455
+ async getSessionHistory(limit = 10) {
12456
+ try {
12457
+ const testerInfo = await this.getTesterInfo();
12458
+ if (!testerInfo) return [];
12459
+ const { data, error } = await this.supabase.from("qa_sessions").select("*").eq("project_id", this.config.projectId).eq("tester_id", testerInfo.id).order("started_at", { ascending: false }).limit(limit);
12460
+ if (error) {
12461
+ console.error("BugBear: Failed to fetch session history", error);
12462
+ return [];
12463
+ }
12464
+ return (data || []).map((s) => this.transformSession(s));
12465
+ } catch (err) {
12466
+ console.error("BugBear: Error fetching session history", err);
12467
+ return [];
12468
+ }
12469
+ }
12470
+ /**
12471
+ * Add a finding during a session
12472
+ */
12473
+ async addFinding(sessionId, options) {
12474
+ try {
12475
+ const { data, error } = await this.supabase.rpc("add_session_finding", {
12476
+ p_session_id: sessionId,
12477
+ p_type: options.type,
12478
+ p_title: options.title,
12479
+ p_description: options.description || null,
12480
+ p_severity: options.severity || "observation",
12481
+ p_route: options.route || null,
12482
+ p_screenshot_url: options.screenshotUrl || null,
12483
+ p_console_logs: options.consoleLogs || null,
12484
+ p_network_snapshot: options.networkSnapshot || null,
12485
+ p_device_info: options.deviceInfo || null,
12486
+ p_app_context: options.appContext || null
12487
+ });
12488
+ if (error) {
12489
+ console.error("BugBear: Failed to add finding", error);
12490
+ return { success: false, error: error.message };
12491
+ }
12492
+ const finding = this.transformFinding(data);
12493
+ return { success: true, finding };
12494
+ } catch (err) {
12495
+ const message = err instanceof Error ? err.message : "Unknown error";
12496
+ console.error("BugBear: Error adding finding", err);
12497
+ return { success: false, error: message };
12498
+ }
12499
+ }
12500
+ /**
12501
+ * Get findings for a session
12502
+ */
12503
+ async getSessionFindings(sessionId) {
12504
+ try {
12505
+ const { data, error } = await this.supabase.from("qa_findings").select("*").eq("session_id", sessionId).order("created_at", { ascending: true });
12506
+ if (error) {
12507
+ console.error("BugBear: Failed to fetch findings", error);
12508
+ return [];
12509
+ }
12510
+ return (data || []).map((f) => this.transformFinding(f));
12511
+ } catch (err) {
12512
+ console.error("BugBear: Error fetching findings", err);
12513
+ return [];
12514
+ }
12515
+ }
12516
+ /**
12517
+ * Convert a finding to a bug report
12518
+ */
12519
+ async convertFindingToBug(findingId) {
12520
+ try {
12521
+ const { data, error } = await this.supabase.rpc("convert_finding_to_bug", {
12522
+ p_finding_id: findingId
12523
+ });
12524
+ if (error) {
12525
+ console.error("BugBear: Failed to convert finding", error);
12526
+ return { success: false, error: error.message };
12527
+ }
12528
+ return { success: true, bugId: data };
12529
+ } catch (err) {
12530
+ const message = err instanceof Error ? err.message : "Unknown error";
12531
+ console.error("BugBear: Error converting finding", err);
12532
+ return { success: false, error: message };
12533
+ }
12534
+ }
12535
+ /**
12536
+ * Dismiss a finding
12537
+ */
12538
+ async dismissFinding(findingId, reason) {
12539
+ try {
12540
+ const { error } = await this.supabase.from("qa_findings").update({
12541
+ dismissed: true,
12542
+ dismissed_reason: reason || null,
12543
+ dismissed_at: (/* @__PURE__ */ new Date()).toISOString()
12544
+ }).eq("id", findingId);
12545
+ if (error) {
12546
+ console.error("BugBear: Failed to dismiss finding", error);
12547
+ return { success: false, error: error.message };
12548
+ }
12549
+ return { success: true };
12550
+ } catch (err) {
12551
+ const message = err instanceof Error ? err.message : "Unknown error";
12552
+ console.error("BugBear: Error dismissing finding", err);
12553
+ return { success: false, error: message };
12554
+ }
12555
+ }
12556
+ /**
12557
+ * Transform database session to QASession type
12558
+ */
12559
+ transformSession(data) {
12560
+ return {
12561
+ id: data.id,
12562
+ projectId: data.project_id,
12563
+ testerId: data.tester_id,
12564
+ focusArea: data.focus_area,
12565
+ track: data.track,
12566
+ platform: data.platform,
12567
+ startedAt: data.started_at,
12568
+ endedAt: data.ended_at,
12569
+ notes: data.notes,
12570
+ routesCovered: data.routes_covered || [],
12571
+ status: data.status,
12572
+ durationMinutes: data.duration_minutes,
12573
+ findingsCount: data.findings_count || 0,
12574
+ bugsFiled: data.bugs_filed || 0,
12575
+ createdAt: data.created_at,
12576
+ updatedAt: data.updated_at
12577
+ };
12578
+ }
12579
+ /**
12580
+ * Transform database finding to QAFinding type
12581
+ */
12582
+ transformFinding(data) {
12583
+ return {
12584
+ id: data.id,
12585
+ sessionId: data.session_id,
12586
+ projectId: data.project_id,
12587
+ type: data.type,
12588
+ severity: data.severity,
12589
+ title: data.title,
12590
+ description: data.description,
12591
+ route: data.route,
12592
+ screenshotUrl: data.screenshot_url,
12593
+ consoleLogs: data.console_logs,
12594
+ networkSnapshot: data.network_snapshot,
12595
+ deviceInfo: data.device_info,
12596
+ appContext: data.app_context,
12597
+ convertedToBugId: data.converted_to_bug_id,
12598
+ convertedToTestId: data.converted_to_test_id,
12599
+ dismissed: data.dismissed || false,
12600
+ dismissedReason: data.dismissed_reason,
12601
+ dismissedAt: data.dismissed_at,
12602
+ createdAt: data.created_at,
12603
+ updatedAt: data.updated_at
12604
+ };
12605
+ }
11965
12606
  };
11966
12607
  function createBugBear(config) {
11967
12608
  return new BugBearClient(config);
@@ -12345,6 +12986,7 @@ function BugBearButton({
12345
12986
  const [modalVisible, setModalVisible] = (0, import_react2.useState)(false);
12346
12987
  const [activeTab, setActiveTab] = (0, import_react2.useState)("tests");
12347
12988
  const [showSteps, setShowSteps] = (0, import_react2.useState)(false);
12989
+ const [showProfileOverlay, setShowProfileOverlay] = (0, import_react2.useState)(false);
12348
12990
  const [messageView, setMessageView] = (0, import_react2.useState)("list");
12349
12991
  const [selectedThread, setSelectedThread] = (0, import_react2.useState)(null);
12350
12992
  const [threadMessages, setThreadMessages] = (0, import_react2.useState)([]);
@@ -12545,6 +13187,15 @@ function BugBearButton({
12545
13187
  }
12546
13188
  setSendingNewMessage(false);
12547
13189
  };
13190
+ const handleOpenProfile = () => {
13191
+ if (testerInfo) {
13192
+ setProfileName(testerInfo.name);
13193
+ setProfileAdditionalEmails(testerInfo.additionalEmails || []);
13194
+ setProfilePlatforms(testerInfo.platforms || []);
13195
+ }
13196
+ setProfileEditing(false);
13197
+ setShowProfileOverlay(true);
13198
+ };
12548
13199
  const handleStartEditProfile = () => {
12549
13200
  if (testerInfo) {
12550
13201
  setProfileName(testerInfo.name);
@@ -12557,6 +13208,11 @@ function BugBearButton({
12557
13208
  setProfileEditing(false);
12558
13209
  setNewEmailInput("");
12559
13210
  };
13211
+ const handleCloseProfile = () => {
13212
+ setShowProfileOverlay(false);
13213
+ setProfileEditing(false);
13214
+ setNewEmailInput("");
13215
+ };
12560
13216
  const handleAddEmail = () => {
12561
13217
  const email = newEmailInput.trim().toLowerCase();
12562
13218
  if (email && email.includes("@") && !profileAdditionalEmails.includes(email)) {
@@ -12585,7 +13241,10 @@ function BugBearButton({
12585
13241
  if (result.success) {
12586
13242
  setProfileEditing(false);
12587
13243
  setProfileSaved(true);
12588
- setTimeout(() => setProfileSaved(false), 2e3);
13244
+ setTimeout(() => {
13245
+ setProfileSaved(false);
13246
+ setShowProfileOverlay(false);
13247
+ }, 1500);
12589
13248
  }
12590
13249
  setSavingProfile(false);
12591
13250
  };
@@ -12642,7 +13301,7 @@ function BugBearButton({
12642
13301
  const steps = displayedAssignment.testCase.steps;
12643
13302
  const info = templateInfo[template];
12644
13303
  const rubricMode = displayedAssignment.testCase.track?.rubricMode || "pass_fail";
12645
- return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: [styles.templateBadge, { backgroundColor: displayedAssignment.testCase.track?.color ? `${displayedAssignment.testCase.track.color}20` : "#F3F4F6" }] }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.templateIcon }, info.icon), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.templateName }, info.name), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.templateAction }, "\u2022 ", info.action)), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.TouchableOpacity, { onPress: () => setShowSteps(!showSteps), style: styles.stepsToggle }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.stepsToggleText }, showSteps ? "\u25BC" : "\u25B6", " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && template === "steps" && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.stepsList }, steps.map((step, idx) => /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { key: idx, style: styles.step }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.stepNumber }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.stepNumberText }, step.stepNumber)), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.stepContent }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.stepExpected }, "\u2192 ", step.expectedResult))))), showSteps && template === "checklist" && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.stepsList }, steps.map((step, idx) => /* @__PURE__ */ import_react2.default.createElement(
13304
+ return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: [styles.templateBadge, { backgroundColor: displayedAssignment.testCase.track?.color ? `${displayedAssignment.testCase.track.color}20` : "#3f3f46" }] }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.templateIcon }, info.icon), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.templateName }, info.name), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.templateAction }, "\u2022 ", info.action)), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.TouchableOpacity, { onPress: () => setShowSteps(!showSteps), style: styles.stepsToggle }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.stepsToggleText }, showSteps ? "\u25BC" : "\u25B6", " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && template === "steps" && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.stepsList }, steps.map((step, idx) => /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { key: idx, style: styles.step }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.stepNumber }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.stepNumberText }, step.stepNumber)), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.stepContent }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.stepExpected }, "\u2192 ", step.expectedResult))))), showSteps && template === "checklist" && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.stepsList }, steps.map((step, idx) => /* @__PURE__ */ import_react2.default.createElement(
12646
13305
  import_react_native2.TouchableOpacity,
12647
13306
  {
12648
13307
  key: idx,
@@ -12751,7 +13410,7 @@ function BugBearButton({
12751
13410
  behavior: import_react_native2.Platform.OS === "ios" ? "padding" : "height",
12752
13411
  style: styles.modalContainer
12753
13412
  },
12754
- /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.modalContent }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.header }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.headerLeft }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.headerEmoji }, "\u{1F43B}"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, null, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.headerTitle }, "BugBear"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.headerSubtitle }, testerInfo?.name))), /* @__PURE__ */ import_react2.default.createElement(
13413
+ /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.modalContent }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.header }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.headerLeft }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.headerEmoji }, "\u{1F43B}"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, null, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.headerTitle }, "BugBear"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.TouchableOpacity, { onPress: handleOpenProfile, style: styles.headerNameButton }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.headerSubtitle }, testerInfo?.name), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.headerPencil }, "\u270E")))), /* @__PURE__ */ import_react2.default.createElement(
12755
13414
  import_react_native2.TouchableOpacity,
12756
13415
  {
12757
13416
  onPress: () => setModalVisible(false),
@@ -12772,13 +13431,6 @@ function BugBearButton({
12772
13431
  onPress: () => setActiveTab("messages")
12773
13432
  },
12774
13433
  /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.tabWithBadge }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: [styles.tabText, activeTab === "messages" && styles.activeTabText] }, "Messages"), unreadCount > 0 && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.tabBadge }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.tabBadgeText }, unreadCount)))
12775
- ), /* @__PURE__ */ import_react2.default.createElement(
12776
- import_react_native2.TouchableOpacity,
12777
- {
12778
- style: [styles.tab, activeTab === "profile" && styles.activeTab],
12779
- onPress: () => setActiveTab("profile")
12780
- },
12781
- /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: [styles.tabText, activeTab === "profile" && styles.activeTabText] }, "Profile")
12782
13434
  ), /* @__PURE__ */ import_react2.default.createElement(
12783
13435
  import_react_native2.TouchableOpacity,
12784
13436
  {
@@ -12855,7 +13507,7 @@ function BugBearButton({
12855
13507
  value: composeSubject,
12856
13508
  onChangeText: setComposeSubject,
12857
13509
  placeholder: "What's this about?",
12858
- placeholderTextColor: "#9CA3AF",
13510
+ placeholderTextColor: "#71717a",
12859
13511
  maxLength: 100
12860
13512
  }
12861
13513
  ), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: [styles.label, { marginTop: 16 }] }, "Message"), /* @__PURE__ */ import_react2.default.createElement(
@@ -12865,7 +13517,7 @@ function BugBearButton({
12865
13517
  value: composeMessage,
12866
13518
  onChangeText: setComposeMessage,
12867
13519
  placeholder: "Write your message...",
12868
- placeholderTextColor: "#9CA3AF",
13520
+ placeholderTextColor: "#71717a",
12869
13521
  multiline: true,
12870
13522
  numberOfLines: 6,
12871
13523
  textAlignVertical: "top",
@@ -12930,7 +13582,70 @@ function BugBearButton({
12930
13582
  message.senderType === "tester" && styles.messageTimeTester
12931
13583
  ] }, formatMessageTime(message.createdAt))
12932
13584
  ))))
12933
- )), activeTab === "profile" && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, null, profileSaved ? /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.emptyState }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emptyEmoji }, "\u2705"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emptyTitle }, "Profile saved!")) : profileEditing ? (
13585
+ )), activeTab === "report" && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, null, submitted ? /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.emptyState }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emptyEmoji }, "\u{1F389}"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emptyTitle }, "Report submitted!")) : /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.reportTypes }, [
13586
+ { type: "bug", label: "\u{1F41B} Bug" },
13587
+ { type: "feedback", label: "\u{1F4A1} Feedback" },
13588
+ { type: "suggestion", label: "\u2728 Idea" }
13589
+ ].map(({ type, label }) => /* @__PURE__ */ import_react2.default.createElement(
13590
+ import_react_native2.TouchableOpacity,
13591
+ {
13592
+ key: type,
13593
+ style: [
13594
+ styles.reportTypeButton,
13595
+ reportType === type && styles.reportTypeActive
13596
+ ],
13597
+ onPress: () => setReportType(type)
13598
+ },
13599
+ /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: [
13600
+ styles.reportTypeText,
13601
+ reportType === type && styles.reportTypeTextActive
13602
+ ] }, label)
13603
+ ))), (reportType === "bug" || reportType === "test_fail") && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.severitySection }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.label }, "Severity"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.severityButtons }, ["critical", "high", "medium", "low"].map((sev) => {
13604
+ const activeStyles = {
13605
+ critical: styles.severityCriticalActive,
13606
+ high: styles.severityHighActive,
13607
+ medium: styles.severityMediumActive,
13608
+ low: styles.severityLowActive
13609
+ };
13610
+ return /* @__PURE__ */ import_react2.default.createElement(
13611
+ import_react_native2.TouchableOpacity,
13612
+ {
13613
+ key: sev,
13614
+ style: [
13615
+ styles.severityButton,
13616
+ severity === sev && activeStyles[sev]
13617
+ ],
13618
+ onPress: () => setSeverity(sev)
13619
+ },
13620
+ /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: [
13621
+ styles.severityText,
13622
+ severity === sev && styles.severityTextActive
13623
+ ] }, sev)
13624
+ );
13625
+ }))), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.descriptionSection }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.label }, "What happened?"), /* @__PURE__ */ import_react2.default.createElement(
13626
+ import_react_native2.TextInput,
13627
+ {
13628
+ style: styles.textInput,
13629
+ value: description,
13630
+ onChangeText: setDescription,
13631
+ placeholder: "Describe the issue...",
13632
+ placeholderTextColor: "#71717a",
13633
+ multiline: true,
13634
+ numberOfLines: 4,
13635
+ textAlignVertical: "top"
13636
+ }
13637
+ )), /* @__PURE__ */ import_react2.default.createElement(
13638
+ import_react_native2.TouchableOpacity,
13639
+ {
13640
+ style: [
13641
+ styles.submitButton,
13642
+ (!description.trim() || submitting) && styles.submitButtonDisabled
13643
+ ],
13644
+ onPress: handleSubmitReport,
13645
+ disabled: !description.trim() || submitting
13646
+ },
13647
+ /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.submitButtonText }, submitting ? "Submitting..." : "Submit Report")
13648
+ )))), showProfileOverlay && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.profileOverlay }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.ScrollView, { style: styles.profileOverlayContent }, profileSaved ? /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.emptyState }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emptyEmoji }, "\u2705"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emptyTitle }, "Profile saved!")) : profileEditing ? (
12934
13649
  /* Edit Profile Form */
12935
13650
  /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, null, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.profileEditHeader }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.profileEditTitle }, "Edit Profile"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.TouchableOpacity, { onPress: handleCancelEditProfile }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.cancelText }, "Cancel"))), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.profileSection }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.label }, "Name"), /* @__PURE__ */ import_react2.default.createElement(
12936
13651
  import_react_native2.TextInput,
@@ -12939,7 +13654,7 @@ function BugBearButton({
12939
13654
  value: profileName,
12940
13655
  onChangeText: setProfileName,
12941
13656
  placeholder: "Your name",
12942
- placeholderTextColor: "#9CA3AF"
13657
+ placeholderTextColor: "#71717a"
12943
13658
  }
12944
13659
  )), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.profileSection }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.label }, "Primary Email"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.profileReadOnly }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.profileReadOnlyText }, testerInfo?.email), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.profileReadOnlyHint }, "Main communication email"))), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.profileSection }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.label }, "Additional Testing Emails"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.profileHint }, "Add other emails you use to test on different accounts"), profileAdditionalEmails.map((email) => /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { key: email, style: styles.emailChip }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emailChipText }, email), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.TouchableOpacity, { onPress: () => handleRemoveEmail(email) }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emailChipRemove }, "\u2715")))), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.addEmailRow }, /* @__PURE__ */ import_react2.default.createElement(
12945
13660
  import_react_native2.TextInput,
@@ -12948,7 +13663,7 @@ function BugBearButton({
12948
13663
  value: newEmailInput,
12949
13664
  onChangeText: setNewEmailInput,
12950
13665
  placeholder: "email@example.com",
12951
- placeholderTextColor: "#9CA3AF",
13666
+ placeholderTextColor: "#71717a",
12952
13667
  keyboardType: "email-address",
12953
13668
  autoCapitalize: "none"
12954
13669
  }
@@ -12997,70 +13712,14 @@ function BugBearButton({
12997
13712
  },
12998
13713
  /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.editProfileButtonText }, "Edit Profile")
12999
13714
  ))
13000
- )), activeTab === "report" && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, null, submitted ? /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.emptyState }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emptyEmoji }, "\u{1F389}"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.emptyTitle }, "Report submitted!")) : /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.reportTypes }, [
13001
- { type: "bug", label: "\u{1F41B} Bug" },
13002
- { type: "feedback", label: "\u{1F4A1} Feedback" },
13003
- { type: "suggestion", label: "\u2728 Idea" }
13004
- ].map(({ type, label }) => /* @__PURE__ */ import_react2.default.createElement(
13715
+ )), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.profileOverlayFooter }, /* @__PURE__ */ import_react2.default.createElement(
13005
13716
  import_react_native2.TouchableOpacity,
13006
13717
  {
13007
- key: type,
13008
- style: [
13009
- styles.reportTypeButton,
13010
- reportType === type && styles.reportTypeActive
13011
- ],
13012
- onPress: () => setReportType(type)
13718
+ style: styles.closeProfileButton,
13719
+ onPress: handleCloseProfile
13013
13720
  },
13014
- /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: [
13015
- styles.reportTypeText,
13016
- reportType === type && styles.reportTypeTextActive
13017
- ] }, label)
13018
- ))), (reportType === "bug" || reportType === "test_fail") && /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.severitySection }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.label }, "Severity"), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.severityButtons }, ["critical", "high", "medium", "low"].map((sev) => {
13019
- const activeStyles = {
13020
- critical: styles.severityCriticalActive,
13021
- high: styles.severityHighActive,
13022
- medium: styles.severityMediumActive,
13023
- low: styles.severityLowActive
13024
- };
13025
- return /* @__PURE__ */ import_react2.default.createElement(
13026
- import_react_native2.TouchableOpacity,
13027
- {
13028
- key: sev,
13029
- style: [
13030
- styles.severityButton,
13031
- severity === sev && activeStyles[sev]
13032
- ],
13033
- onPress: () => setSeverity(sev)
13034
- },
13035
- /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: [
13036
- styles.severityText,
13037
- severity === sev && styles.severityTextActive
13038
- ] }, sev)
13039
- );
13040
- }))), /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.descriptionSection }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.label }, "What happened?"), /* @__PURE__ */ import_react2.default.createElement(
13041
- import_react_native2.TextInput,
13042
- {
13043
- style: styles.textInput,
13044
- value: description,
13045
- onChangeText: setDescription,
13046
- placeholder: "Describe the issue...",
13047
- placeholderTextColor: "#9CA3AF",
13048
- multiline: true,
13049
- numberOfLines: 4,
13050
- textAlignVertical: "top"
13051
- }
13052
- )), /* @__PURE__ */ import_react2.default.createElement(
13053
- import_react_native2.TouchableOpacity,
13054
- {
13055
- style: [
13056
- styles.submitButton,
13057
- (!description.trim() || submitting) && styles.submitButtonDisabled
13058
- ],
13059
- onPress: handleSubmitReport,
13060
- disabled: !description.trim() || submitting
13061
- },
13062
- /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.submitButtonText }, submitting ? "Submitting..." : "Submit Report")
13063
- )))), activeTab === "messages" && messageView === "thread" && selectedThread ? (
13721
+ /* @__PURE__ */ import_react2.default.createElement(import_react_native2.Text, { style: styles.closeProfileButtonText }, "\u2190 Back")
13722
+ ))), activeTab === "messages" && messageView === "thread" && selectedThread ? (
13064
13723
  /* Reply Composer */
13065
13724
  /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles.replyComposer }, /* @__PURE__ */ import_react2.default.createElement(
13066
13725
  import_react_native2.TextInput,
@@ -13069,7 +13728,7 @@ function BugBearButton({
13069
13728
  value: replyText,
13070
13729
  onChangeText: setReplyText,
13071
13730
  placeholder: "Type a reply...",
13072
- placeholderTextColor: "#9CA3AF",
13731
+ placeholderTextColor: "#71717a",
13073
13732
  multiline: true,
13074
13733
  maxLength: 1e3
13075
13734
  }
@@ -13098,13 +13757,13 @@ var styles = import_react_native2.StyleSheet.create({
13098
13757
  width: 56,
13099
13758
  height: 56,
13100
13759
  borderRadius: 28,
13101
- backgroundColor: "#7C3AED",
13760
+ backgroundColor: "#3B82F6",
13102
13761
  justifyContent: "center",
13103
13762
  alignItems: "center",
13104
- shadowColor: "#000",
13763
+ shadowColor: "#3B82F6",
13105
13764
  shadowOffset: { width: 0, height: 4 },
13106
- shadowOpacity: 0.3,
13107
- shadowRadius: 8,
13765
+ shadowOpacity: 0.4,
13766
+ shadowRadius: 12,
13108
13767
  elevation: 8,
13109
13768
  zIndex: 999999
13110
13769
  },
@@ -13137,10 +13796,10 @@ var styles = import_react_native2.StyleSheet.create({
13137
13796
  modalContainer: {
13138
13797
  flex: 1,
13139
13798
  justifyContent: "flex-end",
13140
- backgroundColor: "rgba(0, 0, 0, 0.5)"
13799
+ backgroundColor: "rgba(0, 0, 0, 0.6)"
13141
13800
  },
13142
13801
  modalContent: {
13143
- backgroundColor: "#fff",
13802
+ backgroundColor: "#18181b",
13144
13803
  borderTopLeftRadius: 20,
13145
13804
  borderTopRightRadius: 20,
13146
13805
  maxHeight: "85%"
@@ -13149,11 +13808,13 @@ var styles = import_react_native2.StyleSheet.create({
13149
13808
  flexDirection: "row",
13150
13809
  alignItems: "center",
13151
13810
  justifyContent: "space-between",
13152
- backgroundColor: "#7C3AED",
13811
+ backgroundColor: "#09090b",
13153
13812
  paddingHorizontal: 16,
13154
13813
  paddingVertical: 12,
13155
13814
  borderTopLeftRadius: 20,
13156
- borderTopRightRadius: 20
13815
+ borderTopRightRadius: 20,
13816
+ borderBottomWidth: 1,
13817
+ borderBottomColor: "#27272a"
13157
13818
  },
13158
13819
  headerLeft: {
13159
13820
  flexDirection: "row",
@@ -13164,25 +13825,35 @@ var styles = import_react_native2.StyleSheet.create({
13164
13825
  marginRight: 10
13165
13826
  },
13166
13827
  headerTitle: {
13167
- color: "#fff",
13828
+ color: "#fafafa",
13168
13829
  fontSize: 16,
13169
13830
  fontWeight: "600"
13170
13831
  },
13171
13832
  headerSubtitle: {
13172
- color: "#DDD6FE",
13833
+ color: "#71717a",
13173
13834
  fontSize: 12
13174
13835
  },
13836
+ headerNameButton: {
13837
+ flexDirection: "row",
13838
+ alignItems: "center",
13839
+ gap: 4
13840
+ },
13841
+ headerPencil: {
13842
+ color: "#71717a",
13843
+ fontSize: 11
13844
+ },
13175
13845
  closeButton: {
13176
13846
  padding: 8
13177
13847
  },
13178
13848
  closeButtonText: {
13179
- color: "#fff",
13849
+ color: "#a1a1aa",
13180
13850
  fontSize: 18
13181
13851
  },
13182
13852
  tabs: {
13183
13853
  flexDirection: "row",
13184
13854
  borderBottomWidth: 1,
13185
- borderBottomColor: "#E5E7EB"
13855
+ borderBottomColor: "#27272a",
13856
+ backgroundColor: "#18181b"
13186
13857
  },
13187
13858
  tab: {
13188
13859
  flex: 1,
@@ -13191,15 +13862,15 @@ var styles = import_react_native2.StyleSheet.create({
13191
13862
  },
13192
13863
  activeTab: {
13193
13864
  borderBottomWidth: 2,
13194
- borderBottomColor: "#7C3AED"
13865
+ borderBottomColor: "#3B82F6"
13195
13866
  },
13196
13867
  tabText: {
13197
13868
  fontSize: 14,
13198
13869
  fontWeight: "500",
13199
- color: "#6B7280"
13870
+ color: "#71717a"
13200
13871
  },
13201
13872
  activeTabText: {
13202
- color: "#7C3AED"
13873
+ color: "#3B82F6"
13203
13874
  },
13204
13875
  content: {
13205
13876
  padding: 16,
@@ -13212,16 +13883,16 @@ var styles = import_react_native2.StyleSheet.create({
13212
13883
  paddingHorizontal: 16,
13213
13884
  paddingVertical: 12,
13214
13885
  borderTopWidth: 1,
13215
- borderTopColor: "#E5E7EB",
13216
- backgroundColor: "#F9FAFB"
13886
+ borderTopColor: "#27272a",
13887
+ backgroundColor: "#09090b"
13217
13888
  },
13218
13889
  footerText: {
13219
13890
  fontSize: 12,
13220
- color: "#9CA3AF"
13891
+ color: "#52525b"
13221
13892
  },
13222
13893
  refreshText: {
13223
13894
  fontSize: 12,
13224
- color: "#6B7280"
13895
+ color: "#71717a"
13225
13896
  },
13226
13897
  emptyState: {
13227
13898
  alignItems: "center",
@@ -13233,7 +13904,7 @@ var styles = import_react_native2.StyleSheet.create({
13233
13904
  emptyTitle: {
13234
13905
  fontSize: 18,
13235
13906
  fontWeight: "600",
13236
- color: "#374151",
13907
+ color: "#e4e4e7",
13237
13908
  marginTop: 12
13238
13909
  },
13239
13910
  passedEmoji: {
@@ -13248,26 +13919,26 @@ var styles = import_react_native2.StyleSheet.create({
13248
13919
  },
13249
13920
  emptySubtitle: {
13250
13921
  fontSize: 14,
13251
- color: "#9CA3AF",
13922
+ color: "#71717a",
13252
13923
  marginTop: 4
13253
13924
  },
13254
13925
  // List view styles
13255
13926
  listHeader: {
13256
13927
  fontSize: 12,
13257
- color: "#6B7280",
13928
+ color: "#71717a",
13258
13929
  marginBottom: 12
13259
13930
  },
13260
13931
  listItem: {
13261
- backgroundColor: "#F9FAFB",
13932
+ backgroundColor: "#27272a",
13262
13933
  borderRadius: 12,
13263
13934
  padding: 12,
13264
13935
  marginBottom: 8,
13265
13936
  borderWidth: 1,
13266
- borderColor: "#E5E7EB"
13937
+ borderColor: "#3f3f46"
13267
13938
  },
13268
13939
  listItemCurrent: {
13269
- backgroundColor: "#EDE9FE",
13270
- borderColor: "#C4B5FD"
13940
+ backgroundColor: "#1e3a5f",
13941
+ borderColor: "#3B82F6"
13271
13942
  },
13272
13943
  listItemHeader: {
13273
13944
  flexDirection: "row",
@@ -13278,7 +13949,7 @@ var styles = import_react_native2.StyleSheet.create({
13278
13949
  listItemKey: {
13279
13950
  fontSize: 12,
13280
13951
  fontFamily: import_react_native2.Platform.OS === "ios" ? "Menlo" : "monospace",
13281
- color: "#6B7280"
13952
+ color: "#71717a"
13282
13953
  },
13283
13954
  listItemBadges: {
13284
13955
  flexDirection: "row",
@@ -13287,7 +13958,7 @@ var styles = import_react_native2.StyleSheet.create({
13287
13958
  listItemTitle: {
13288
13959
  fontSize: 14,
13289
13960
  fontWeight: "600",
13290
- color: "#111827",
13961
+ color: "#fafafa",
13291
13962
  marginBottom: 4
13292
13963
  },
13293
13964
  listItemMeta: {
@@ -13296,11 +13967,11 @@ var styles = import_react_native2.StyleSheet.create({
13296
13967
  },
13297
13968
  listItemMetaText: {
13298
13969
  fontSize: 12,
13299
- color: "#9CA3AF"
13970
+ color: "#71717a"
13300
13971
  },
13301
13972
  currentBadge: {
13302
13973
  fontSize: 12,
13303
- color: "#7C3AED",
13974
+ color: "#3B82F6",
13304
13975
  fontWeight: "600",
13305
13976
  marginLeft: 8
13306
13977
  },
@@ -13310,15 +13981,17 @@ var styles = import_react_native2.StyleSheet.create({
13310
13981
  },
13311
13982
  backButtonText: {
13312
13983
  fontSize: 14,
13313
- color: "#7C3AED",
13984
+ color: "#3B82F6",
13314
13985
  fontWeight: "500"
13315
13986
  },
13316
13987
  // Test card styles
13317
13988
  testCard: {
13318
- backgroundColor: "#F9FAFB",
13989
+ backgroundColor: "#27272a",
13319
13990
  borderRadius: 12,
13320
13991
  padding: 16,
13321
- marginBottom: 16
13992
+ marginBottom: 16,
13993
+ borderWidth: 1,
13994
+ borderColor: "#3f3f46"
13322
13995
  },
13323
13996
  testHeader: {
13324
13997
  flexDirection: "row",
@@ -13333,7 +14006,7 @@ var styles = import_react_native2.StyleSheet.create({
13333
14006
  testKey: {
13334
14007
  fontSize: 12,
13335
14008
  fontFamily: import_react_native2.Platform.OS === "ios" ? "Menlo" : "monospace",
13336
- color: "#6B7280"
14009
+ color: "#71717a"
13337
14010
  },
13338
14011
  trackBadge: {
13339
14012
  paddingHorizontal: 6,
@@ -13345,38 +14018,38 @@ var styles = import_react_native2.StyleSheet.create({
13345
14018
  color: "#fff"
13346
14019
  },
13347
14020
  priorityBadge: {
13348
- backgroundColor: "#E5E7EB",
14021
+ backgroundColor: "#3f3f46",
13349
14022
  paddingHorizontal: 8,
13350
14023
  paddingVertical: 2,
13351
14024
  borderRadius: 4
13352
14025
  },
13353
14026
  priorityP0: {
13354
- backgroundColor: "#FEE2E2"
14027
+ backgroundColor: "#7f1d1d"
13355
14028
  },
13356
14029
  priorityP1: {
13357
- backgroundColor: "#FED7AA"
14030
+ backgroundColor: "#78350f"
13358
14031
  },
13359
14032
  priorityText: {
13360
14033
  fontSize: 12,
13361
14034
  fontWeight: "600",
13362
- color: "#374151"
14035
+ color: "#e4e4e7"
13363
14036
  },
13364
14037
  testTitle: {
13365
14038
  fontSize: 16,
13366
14039
  fontWeight: "600",
13367
- color: "#111827",
14040
+ color: "#fafafa",
13368
14041
  marginBottom: 4
13369
14042
  },
13370
14043
  testDescription: {
13371
14044
  fontSize: 14,
13372
- color: "#6B7280",
14045
+ color: "#a1a1aa",
13373
14046
  marginBottom: 8
13374
14047
  },
13375
14048
  // Navigate button
13376
14049
  navigateButton: {
13377
- backgroundColor: "#EFF6FF",
14050
+ backgroundColor: "#1e3a5f",
13378
14051
  borderWidth: 1,
13379
- borderColor: "#BFDBFE",
14052
+ borderColor: "#3B82F6",
13380
14053
  borderRadius: 8,
13381
14054
  paddingVertical: 10,
13382
14055
  paddingHorizontal: 16,
@@ -13386,7 +14059,7 @@ var styles = import_react_native2.StyleSheet.create({
13386
14059
  navigateButtonText: {
13387
14060
  fontSize: 14,
13388
14061
  fontWeight: "500",
13389
- color: "#1D4ED8"
14062
+ color: "#60a5fa"
13390
14063
  },
13391
14064
  // Template badge
13392
14065
  templateBadge: {
@@ -13404,12 +14077,12 @@ var styles = import_react_native2.StyleSheet.create({
13404
14077
  templateName: {
13405
14078
  fontSize: 12,
13406
14079
  fontWeight: "600",
13407
- color: "#374151",
14080
+ color: "#e4e4e7",
13408
14081
  marginRight: 4
13409
14082
  },
13410
14083
  templateAction: {
13411
14084
  fontSize: 12,
13412
- color: "#6B7280"
14085
+ color: "#71717a"
13413
14086
  },
13414
14087
  // Steps toggle
13415
14088
  stepsToggle: {
@@ -13417,7 +14090,7 @@ var styles = import_react_native2.StyleSheet.create({
13417
14090
  },
13418
14091
  stepsToggleText: {
13419
14092
  fontSize: 14,
13420
- color: "#7C3AED",
14093
+ color: "#3B82F6",
13421
14094
  fontWeight: "500"
13422
14095
  },
13423
14096
  stepsList: {
@@ -13431,7 +14104,7 @@ var styles = import_react_native2.StyleSheet.create({
13431
14104
  width: 24,
13432
14105
  height: 24,
13433
14106
  borderRadius: 12,
13434
- backgroundColor: "#EDE9FE",
14107
+ backgroundColor: "#1e3a5f",
13435
14108
  justifyContent: "center",
13436
14109
  alignItems: "center",
13437
14110
  marginRight: 12
@@ -13439,41 +14112,41 @@ var styles = import_react_native2.StyleSheet.create({
13439
14112
  stepNumberText: {
13440
14113
  fontSize: 12,
13441
14114
  fontWeight: "600",
13442
- color: "#7C3AED"
14115
+ color: "#3B82F6"
13443
14116
  },
13444
14117
  stepContent: {
13445
14118
  flex: 1
13446
14119
  },
13447
14120
  stepAction: {
13448
14121
  fontSize: 14,
13449
- color: "#374151"
14122
+ color: "#e4e4e7"
13450
14123
  },
13451
14124
  stepExpected: {
13452
14125
  fontSize: 12,
13453
- color: "#9CA3AF",
14126
+ color: "#71717a",
13454
14127
  marginTop: 2
13455
14128
  },
13456
14129
  // Checklist styles
13457
14130
  checklistItem: {
13458
14131
  flexDirection: "row",
13459
14132
  alignItems: "center",
13460
- backgroundColor: "#fff",
14133
+ backgroundColor: "#27272a",
13461
14134
  borderWidth: 1,
13462
- borderColor: "#E5E7EB",
14135
+ borderColor: "#3f3f46",
13463
14136
  borderRadius: 8,
13464
14137
  padding: 12,
13465
14138
  marginBottom: 8
13466
14139
  },
13467
14140
  checklistItemChecked: {
13468
- backgroundColor: "#ECFDF5",
13469
- borderColor: "#86EFAC"
14141
+ backgroundColor: "#14532d",
14142
+ borderColor: "#22C55E"
13470
14143
  },
13471
14144
  checkbox: {
13472
14145
  width: 24,
13473
14146
  height: 24,
13474
14147
  borderRadius: 4,
13475
14148
  borderWidth: 2,
13476
- borderColor: "#22D3EE",
14149
+ borderColor: "#3B82F6",
13477
14150
  marginRight: 12,
13478
14151
  justifyContent: "center",
13479
14152
  alignItems: "center"
@@ -13490,16 +14163,16 @@ var styles = import_react_native2.StyleSheet.create({
13490
14163
  checklistText: {
13491
14164
  flex: 1,
13492
14165
  fontSize: 14,
13493
- color: "#374151"
14166
+ color: "#e4e4e7"
13494
14167
  },
13495
14168
  checklistTextChecked: {
13496
- color: "#15803D"
14169
+ color: "#4ade80"
13497
14170
  },
13498
14171
  // Rubric styles
13499
14172
  rubricItem: {
13500
- backgroundColor: "#fff",
14173
+ backgroundColor: "#27272a",
13501
14174
  borderWidth: 1,
13502
- borderColor: "#E5E7EB",
14175
+ borderColor: "#3f3f46",
13503
14176
  borderRadius: 8,
13504
14177
  padding: 12,
13505
14178
  marginBottom: 8
@@ -13513,7 +14186,7 @@ var styles = import_react_native2.StyleSheet.create({
13513
14186
  width: 24,
13514
14187
  height: 24,
13515
14188
  borderRadius: 4,
13516
- backgroundColor: "#EDE9FE",
14189
+ backgroundColor: "#1e3a5f",
13517
14190
  justifyContent: "center",
13518
14191
  alignItems: "center",
13519
14192
  marginRight: 8
@@ -13521,17 +14194,17 @@ var styles = import_react_native2.StyleSheet.create({
13521
14194
  rubricNumberText: {
13522
14195
  fontSize: 12,
13523
14196
  fontWeight: "600",
13524
- color: "#7C3AED"
14197
+ color: "#3B82F6"
13525
14198
  },
13526
14199
  rubricTitle: {
13527
14200
  flex: 1,
13528
14201
  fontSize: 14,
13529
14202
  fontWeight: "500",
13530
- color: "#111827"
14203
+ color: "#fafafa"
13531
14204
  },
13532
14205
  rubricExpected: {
13533
14206
  fontSize: 12,
13534
- color: "#6B7280",
14207
+ color: "#71717a",
13535
14208
  marginLeft: 32,
13536
14209
  marginBottom: 8
13537
14210
  },
@@ -13545,7 +14218,7 @@ var styles = import_react_native2.StyleSheet.create({
13545
14218
  paddingVertical: 8,
13546
14219
  paddingHorizontal: 12,
13547
14220
  borderRadius: 6,
13548
- backgroundColor: "#F3F4F6",
14221
+ backgroundColor: "#3f3f46",
13549
14222
  alignItems: "center"
13550
14223
  },
13551
14224
  passButtonActive: {
@@ -13557,7 +14230,7 @@ var styles = import_react_native2.StyleSheet.create({
13557
14230
  passFailButtonText: {
13558
14231
  fontSize: 12,
13559
14232
  fontWeight: "600",
13560
- color: "#6B7280"
14233
+ color: "#a1a1aa"
13561
14234
  },
13562
14235
  passButtonTextActive: {
13563
14236
  color: "#fff"
@@ -13574,17 +14247,17 @@ var styles = import_react_native2.StyleSheet.create({
13574
14247
  width: 36,
13575
14248
  height: 36,
13576
14249
  borderRadius: 6,
13577
- backgroundColor: "#F3F4F6",
14250
+ backgroundColor: "#3f3f46",
13578
14251
  justifyContent: "center",
13579
14252
  alignItems: "center"
13580
14253
  },
13581
14254
  ratingButtonActive: {
13582
- backgroundColor: "#7C3AED"
14255
+ backgroundColor: "#3B82F6"
13583
14256
  },
13584
14257
  ratingButtonText: {
13585
14258
  fontSize: 14,
13586
14259
  fontWeight: "600",
13587
- color: "#6B7280"
14260
+ color: "#a1a1aa"
13588
14261
  },
13589
14262
  ratingButtonTextActive: {
13590
14263
  color: "#fff"
@@ -13598,17 +14271,17 @@ var styles = import_react_native2.StyleSheet.create({
13598
14271
  },
13599
14272
  helperText: {
13600
14273
  fontSize: 12,
13601
- color: "#9CA3AF"
14274
+ color: "#71717a"
13602
14275
  },
13603
14276
  resetText: {
13604
14277
  fontSize: 12,
13605
- color: "#9CA3AF"
14278
+ color: "#71717a"
13606
14279
  },
13607
14280
  // Freeform styles
13608
14281
  freeformBox: {
13609
- backgroundColor: "#FFFBEB",
14282
+ backgroundColor: "#422006",
13610
14283
  borderWidth: 1,
13611
- borderColor: "#FDE68A",
14284
+ borderColor: "#a16207",
13612
14285
  borderRadius: 8,
13613
14286
  padding: 12,
13614
14287
  marginTop: 8
@@ -13616,22 +14289,22 @@ var styles = import_react_native2.StyleSheet.create({
13616
14289
  freeformTitle: {
13617
14290
  fontSize: 14,
13618
14291
  fontWeight: "600",
13619
- color: "#92400E",
14292
+ color: "#fbbf24",
13620
14293
  marginBottom: 4
13621
14294
  },
13622
14295
  freeformText: {
13623
14296
  fontSize: 12,
13624
- color: "#A16207",
14297
+ color: "#fcd34d",
13625
14298
  marginBottom: 4
13626
14299
  },
13627
14300
  freeformBullet: {
13628
14301
  fontSize: 12,
13629
- color: "#A16207",
14302
+ color: "#fcd34d",
13630
14303
  marginLeft: 8
13631
14304
  },
13632
14305
  // Expected result
13633
14306
  expectedResult: {
13634
- backgroundColor: "#ECFDF5",
14307
+ backgroundColor: "#14532d",
13635
14308
  padding: 12,
13636
14309
  borderRadius: 8,
13637
14310
  marginTop: 12
@@ -13639,12 +14312,12 @@ var styles = import_react_native2.StyleSheet.create({
13639
14312
  expectedLabel: {
13640
14313
  fontSize: 12,
13641
14314
  fontWeight: "600",
13642
- color: "#065F46",
14315
+ color: "#4ade80",
13643
14316
  marginBottom: 4
13644
14317
  },
13645
14318
  expectedText: {
13646
14319
  fontSize: 14,
13647
- color: "#047857"
14320
+ color: "#86efac"
13648
14321
  },
13649
14322
  // Action buttons
13650
14323
  actionButtons: {
@@ -13653,7 +14326,7 @@ var styles = import_react_native2.StyleSheet.create({
13653
14326
  },
13654
14327
  failButton: {
13655
14328
  flex: 1,
13656
- backgroundColor: "#FEE2E2",
14329
+ backgroundColor: "#7f1d1d",
13657
14330
  paddingVertical: 14,
13658
14331
  borderRadius: 12,
13659
14332
  alignItems: "center"
@@ -13661,7 +14334,7 @@ var styles = import_react_native2.StyleSheet.create({
13661
14334
  failButtonText: {
13662
14335
  fontSize: 16,
13663
14336
  fontWeight: "600",
13664
- color: "#DC2626"
14337
+ color: "#fca5a5"
13665
14338
  },
13666
14339
  passButton: {
13667
14340
  flex: 1,
@@ -13683,22 +14356,22 @@ var styles = import_react_native2.StyleSheet.create({
13683
14356
  },
13684
14357
  reportTypeButton: {
13685
14358
  flex: 1,
13686
- backgroundColor: "#F3F4F6",
14359
+ backgroundColor: "#3f3f46",
13687
14360
  paddingVertical: 10,
13688
14361
  borderRadius: 8,
13689
14362
  alignItems: "center"
13690
14363
  },
13691
14364
  reportTypeActive: {
13692
- backgroundColor: "#EDE9FE",
14365
+ backgroundColor: "#1e3a5f",
13693
14366
  borderWidth: 2,
13694
- borderColor: "#7C3AED"
14367
+ borderColor: "#3B82F6"
13695
14368
  },
13696
14369
  reportTypeText: {
13697
14370
  fontSize: 14,
13698
- color: "#6B7280"
14371
+ color: "#a1a1aa"
13699
14372
  },
13700
14373
  reportTypeTextActive: {
13701
- color: "#7C3AED",
14374
+ color: "#3B82F6",
13702
14375
  fontWeight: "600"
13703
14376
  },
13704
14377
  severitySection: {
@@ -13707,7 +14380,7 @@ var styles = import_react_native2.StyleSheet.create({
13707
14380
  label: {
13708
14381
  fontSize: 14,
13709
14382
  fontWeight: "500",
13710
- color: "#374151",
14383
+ color: "#e4e4e7",
13711
14384
  marginBottom: 8
13712
14385
  },
13713
14386
  severityButtons: {
@@ -13716,7 +14389,7 @@ var styles = import_react_native2.StyleSheet.create({
13716
14389
  },
13717
14390
  severityButton: {
13718
14391
  flex: 1,
13719
- backgroundColor: "#F3F4F6",
14392
+ backgroundColor: "#3f3f46",
13720
14393
  paddingVertical: 8,
13721
14394
  borderRadius: 6,
13722
14395
  alignItems: "center"
@@ -13735,7 +14408,7 @@ var styles = import_react_native2.StyleSheet.create({
13735
14408
  },
13736
14409
  severityText: {
13737
14410
  fontSize: 12,
13738
- color: "#6B7280",
14411
+ color: "#a1a1aa",
13739
14412
  textTransform: "capitalize"
13740
14413
  },
13741
14414
  severityTextActive: {
@@ -13746,17 +14419,17 @@ var styles = import_react_native2.StyleSheet.create({
13746
14419
  marginBottom: 16
13747
14420
  },
13748
14421
  textInput: {
13749
- backgroundColor: "#F9FAFB",
14422
+ backgroundColor: "#27272a",
13750
14423
  borderWidth: 1,
13751
- borderColor: "#E5E7EB",
14424
+ borderColor: "#3f3f46",
13752
14425
  borderRadius: 12,
13753
14426
  padding: 12,
13754
14427
  fontSize: 14,
13755
14428
  minHeight: 100,
13756
- color: "#111827"
14429
+ color: "#fafafa"
13757
14430
  },
13758
14431
  submitButton: {
13759
- backgroundColor: "#7C3AED",
14432
+ backgroundColor: "#3B82F6",
13760
14433
  paddingVertical: 14,
13761
14434
  borderRadius: 12,
13762
14435
  alignItems: "center"
@@ -13795,16 +14468,16 @@ var styles = import_react_native2.StyleSheet.create({
13795
14468
  },
13796
14469
  // Thread list styles
13797
14470
  threadItem: {
13798
- backgroundColor: "#F9FAFB",
14471
+ backgroundColor: "#27272a",
13799
14472
  borderRadius: 12,
13800
14473
  padding: 12,
13801
14474
  marginBottom: 8,
13802
14475
  borderWidth: 1,
13803
- borderColor: "#E5E7EB"
14476
+ borderColor: "#3f3f46"
13804
14477
  },
13805
14478
  threadItemUnread: {
13806
- backgroundColor: "#EFF6FF",
13807
- borderColor: "#BFDBFE"
14479
+ backgroundColor: "#1e3a5f",
14480
+ borderColor: "#3B82F6"
13808
14481
  },
13809
14482
  threadHeader: {
13810
14483
  flexDirection: "row",
@@ -13828,12 +14501,12 @@ var styles = import_react_native2.StyleSheet.create({
13828
14501
  threadSubject: {
13829
14502
  fontSize: 14,
13830
14503
  fontWeight: "500",
13831
- color: "#374151",
14504
+ color: "#e4e4e7",
13832
14505
  flex: 1
13833
14506
  },
13834
14507
  threadSubjectUnread: {
13835
14508
  fontWeight: "600",
13836
- color: "#111827"
14509
+ color: "#fafafa"
13837
14510
  },
13838
14511
  priorityDot: {
13839
14512
  width: 8,
@@ -13843,7 +14516,7 @@ var styles = import_react_native2.StyleSheet.create({
13843
14516
  },
13844
14517
  threadPreview: {
13845
14518
  fontSize: 13,
13846
- color: "#6B7280",
14519
+ color: "#a1a1aa",
13847
14520
  marginBottom: 4
13848
14521
  },
13849
14522
  threadMeta: {
@@ -13853,7 +14526,7 @@ var styles = import_react_native2.StyleSheet.create({
13853
14526
  },
13854
14527
  threadMetaText: {
13855
14528
  fontSize: 12,
13856
- color: "#9CA3AF"
14529
+ color: "#71717a"
13857
14530
  },
13858
14531
  unreadBadge: {
13859
14532
  backgroundColor: "#3B82F6",
@@ -13868,7 +14541,7 @@ var styles = import_react_native2.StyleSheet.create({
13868
14541
  },
13869
14542
  threadTime: {
13870
14543
  fontSize: 12,
13871
- color: "#9CA3AF"
14544
+ color: "#71717a"
13872
14545
  },
13873
14546
  // Thread detail styles
13874
14547
  threadDetailContainer: {
@@ -13877,7 +14550,7 @@ var styles = import_react_native2.StyleSheet.create({
13877
14550
  threadDetailHeader: {
13878
14551
  flexDirection: "row",
13879
14552
  alignItems: "center",
13880
- backgroundColor: "#F3F4F6",
14553
+ backgroundColor: "#27272a",
13881
14554
  padding: 12,
13882
14555
  borderRadius: 8,
13883
14556
  marginBottom: 12
@@ -13890,7 +14563,7 @@ var styles = import_react_native2.StyleSheet.create({
13890
14563
  flex: 1,
13891
14564
  fontSize: 15,
13892
14565
  fontWeight: "600",
13893
- color: "#111827"
14566
+ color: "#fafafa"
13894
14567
  },
13895
14568
  loadingMessages: {
13896
14569
  padding: 20,
@@ -13898,7 +14571,7 @@ var styles = import_react_native2.StyleSheet.create({
13898
14571
  },
13899
14572
  loadingText: {
13900
14573
  fontSize: 14,
13901
- color: "#6B7280"
14574
+ color: "#71717a"
13902
14575
  },
13903
14576
  messagesContainer: {
13904
14577
  paddingBottom: 8
@@ -13911,26 +14584,26 @@ var styles = import_react_native2.StyleSheet.create({
13911
14584
  },
13912
14585
  messageBubbleAdmin: {
13913
14586
  alignSelf: "flex-start",
13914
- backgroundColor: "#F3F4F6",
14587
+ backgroundColor: "#27272a",
13915
14588
  borderBottomLeftRadius: 4
13916
14589
  },
13917
14590
  messageBubbleTester: {
13918
14591
  alignSelf: "flex-end",
13919
- backgroundColor: "#7C3AED",
14592
+ backgroundColor: "#3B82F6",
13920
14593
  borderBottomRightRadius: 4
13921
14594
  },
13922
14595
  messageSender: {
13923
14596
  fontSize: 12,
13924
14597
  fontWeight: "600",
13925
- color: "#6B7280",
14598
+ color: "#71717a",
13926
14599
  marginBottom: 2
13927
14600
  },
13928
14601
  messageSenderTester: {
13929
- color: "#DDD6FE"
14602
+ color: "#93c5fd"
13930
14603
  },
13931
14604
  messageContent: {
13932
14605
  fontSize: 14,
13933
- color: "#111827",
14606
+ color: "#fafafa",
13934
14607
  lineHeight: 20
13935
14608
  },
13936
14609
  messageContentTester: {
@@ -13938,12 +14611,12 @@ var styles = import_react_native2.StyleSheet.create({
13938
14611
  },
13939
14612
  messageTime: {
13940
14613
  fontSize: 11,
13941
- color: "#9CA3AF",
14614
+ color: "#71717a",
13942
14615
  marginTop: 4,
13943
14616
  textAlign: "right"
13944
14617
  },
13945
14618
  messageTimeTester: {
13946
- color: "#C4B5FD"
14619
+ color: "#93c5fd"
13947
14620
  },
13948
14621
  // Reply composer styles
13949
14622
  replyComposer: {
@@ -13951,24 +14624,24 @@ var styles = import_react_native2.StyleSheet.create({
13951
14624
  alignItems: "flex-end",
13952
14625
  padding: 12,
13953
14626
  borderTopWidth: 1,
13954
- borderTopColor: "#E5E7EB",
13955
- backgroundColor: "#fff"
14627
+ borderTopColor: "#27272a",
14628
+ backgroundColor: "#18181b"
13956
14629
  },
13957
14630
  replyInput: {
13958
14631
  flex: 1,
13959
- backgroundColor: "#F9FAFB",
14632
+ backgroundColor: "#27272a",
13960
14633
  borderWidth: 1,
13961
- borderColor: "#E5E7EB",
14634
+ borderColor: "#3f3f46",
13962
14635
  borderRadius: 20,
13963
14636
  paddingHorizontal: 16,
13964
14637
  paddingVertical: 10,
13965
14638
  fontSize: 14,
13966
- color: "#111827",
14639
+ color: "#fafafa",
13967
14640
  maxHeight: 100,
13968
14641
  marginRight: 8
13969
14642
  },
13970
14643
  sendButton: {
13971
- backgroundColor: "#7C3AED",
14644
+ backgroundColor: "#3B82F6",
13972
14645
  paddingHorizontal: 16,
13973
14646
  paddingVertical: 10,
13974
14647
  borderRadius: 20,
@@ -13976,7 +14649,7 @@ var styles = import_react_native2.StyleSheet.create({
13976
14649
  alignItems: "center"
13977
14650
  },
13978
14651
  sendButtonDisabled: {
13979
- backgroundColor: "#C4B5FD"
14652
+ backgroundColor: "#1e40af"
13980
14653
  },
13981
14654
  sendButtonText: {
13982
14655
  fontSize: 14,
@@ -13988,7 +14661,7 @@ var styles = import_react_native2.StyleSheet.create({
13988
14661
  flexDirection: "row",
13989
14662
  alignItems: "center",
13990
14663
  justifyContent: "center",
13991
- backgroundColor: "#7C3AED",
14664
+ backgroundColor: "#3B82F6",
13992
14665
  paddingVertical: 12,
13993
14666
  paddingHorizontal: 20,
13994
14667
  borderRadius: 12,
@@ -14010,48 +14683,50 @@ var styles = import_react_native2.StyleSheet.create({
14010
14683
  composeTitle: {
14011
14684
  fontSize: 20,
14012
14685
  fontWeight: "600",
14013
- color: "#111827",
14686
+ color: "#fafafa",
14014
14687
  marginBottom: 4
14015
14688
  },
14016
14689
  composeSubtitle: {
14017
14690
  fontSize: 14,
14018
- color: "#6B7280"
14691
+ color: "#71717a"
14019
14692
  },
14020
14693
  composeForm: {
14021
- backgroundColor: "#F9FAFB",
14694
+ backgroundColor: "#27272a",
14022
14695
  borderRadius: 12,
14023
- padding: 16
14696
+ padding: 16,
14697
+ borderWidth: 1,
14698
+ borderColor: "#3f3f46"
14024
14699
  },
14025
14700
  composeSubjectInput: {
14026
- backgroundColor: "#fff",
14701
+ backgroundColor: "#18181b",
14027
14702
  borderWidth: 1,
14028
- borderColor: "#E5E7EB",
14703
+ borderColor: "#3f3f46",
14029
14704
  borderRadius: 8,
14030
14705
  paddingHorizontal: 12,
14031
14706
  paddingVertical: 10,
14032
14707
  fontSize: 15,
14033
- color: "#111827"
14708
+ color: "#fafafa"
14034
14709
  },
14035
14710
  composeMessageInput: {
14036
- backgroundColor: "#fff",
14711
+ backgroundColor: "#18181b",
14037
14712
  borderWidth: 1,
14038
- borderColor: "#E5E7EB",
14713
+ borderColor: "#3f3f46",
14039
14714
  borderRadius: 8,
14040
14715
  paddingHorizontal: 12,
14041
14716
  paddingVertical: 10,
14042
14717
  fontSize: 15,
14043
- color: "#111827",
14718
+ color: "#fafafa",
14044
14719
  minHeight: 120
14045
14720
  },
14046
14721
  composeSendButton: {
14047
- backgroundColor: "#7C3AED",
14722
+ backgroundColor: "#3B82F6",
14048
14723
  paddingVertical: 14,
14049
14724
  borderRadius: 12,
14050
14725
  alignItems: "center",
14051
14726
  marginTop: 20
14052
14727
  },
14053
14728
  composeSendButtonDisabled: {
14054
- backgroundColor: "#C4B5FD"
14729
+ backgroundColor: "#1e40af"
14055
14730
  },
14056
14731
  composeSendButtonText: {
14057
14732
  fontSize: 16,
@@ -14060,17 +14735,19 @@ var styles = import_react_native2.StyleSheet.create({
14060
14735
  },
14061
14736
  // Profile styles
14062
14737
  profileCard: {
14063
- backgroundColor: "#F9FAFB",
14738
+ backgroundColor: "#27272a",
14064
14739
  borderRadius: 16,
14065
14740
  padding: 24,
14066
14741
  alignItems: "center",
14067
- marginBottom: 16
14742
+ marginBottom: 16,
14743
+ borderWidth: 1,
14744
+ borderColor: "#3f3f46"
14068
14745
  },
14069
14746
  avatarCircle: {
14070
14747
  width: 72,
14071
14748
  height: 72,
14072
14749
  borderRadius: 36,
14073
- backgroundColor: "#7C3AED",
14750
+ backgroundColor: "#3B82F6",
14074
14751
  justifyContent: "center",
14075
14752
  alignItems: "center",
14076
14753
  marginBottom: 12
@@ -14083,12 +14760,12 @@ var styles = import_react_native2.StyleSheet.create({
14083
14760
  profileName: {
14084
14761
  fontSize: 20,
14085
14762
  fontWeight: "600",
14086
- color: "#111827",
14763
+ color: "#fafafa",
14087
14764
  marginBottom: 4
14088
14765
  },
14089
14766
  profileEmail: {
14090
14767
  fontSize: 14,
14091
- color: "#6B7280",
14768
+ color: "#71717a",
14092
14769
  marginBottom: 16
14093
14770
  },
14094
14771
  profileStats: {
@@ -14102,35 +14779,37 @@ var styles = import_react_native2.StyleSheet.create({
14102
14779
  profileStatValue: {
14103
14780
  fontSize: 24,
14104
14781
  fontWeight: "700",
14105
- color: "#7C3AED"
14782
+ color: "#3B82F6"
14106
14783
  },
14107
14784
  profileStatLabel: {
14108
14785
  fontSize: 12,
14109
- color: "#6B7280",
14786
+ color: "#71717a",
14110
14787
  marginTop: 2
14111
14788
  },
14112
14789
  profileStatDivider: {
14113
14790
  width: 1,
14114
14791
  height: 32,
14115
- backgroundColor: "#E5E7EB"
14792
+ backgroundColor: "#3f3f46"
14116
14793
  },
14117
14794
  profileInfoSection: {
14118
- backgroundColor: "#F9FAFB",
14795
+ backgroundColor: "#27272a",
14119
14796
  borderRadius: 12,
14120
14797
  padding: 16,
14121
- marginBottom: 12
14798
+ marginBottom: 12,
14799
+ borderWidth: 1,
14800
+ borderColor: "#3f3f46"
14122
14801
  },
14123
14802
  profileInfoLabel: {
14124
14803
  fontSize: 12,
14125
14804
  fontWeight: "600",
14126
- color: "#6B7280",
14805
+ color: "#71717a",
14127
14806
  marginBottom: 8,
14128
14807
  textTransform: "uppercase",
14129
14808
  letterSpacing: 0.5
14130
14809
  },
14131
14810
  profileInfoValue: {
14132
14811
  fontSize: 14,
14133
- color: "#374151",
14812
+ color: "#e4e4e7",
14134
14813
  marginBottom: 4
14135
14814
  },
14136
14815
  platformTags: {
@@ -14139,18 +14818,18 @@ var styles = import_react_native2.StyleSheet.create({
14139
14818
  gap: 8
14140
14819
  },
14141
14820
  platformTag: {
14142
- backgroundColor: "#EDE9FE",
14821
+ backgroundColor: "#1e3a5f",
14143
14822
  paddingHorizontal: 12,
14144
14823
  paddingVertical: 6,
14145
14824
  borderRadius: 16
14146
14825
  },
14147
14826
  platformTagText: {
14148
14827
  fontSize: 13,
14149
- color: "#7C3AED",
14828
+ color: "#60a5fa",
14150
14829
  fontWeight: "500"
14151
14830
  },
14152
14831
  editProfileButton: {
14153
- backgroundColor: "#7C3AED",
14832
+ backgroundColor: "#3B82F6",
14154
14833
  paddingVertical: 14,
14155
14834
  borderRadius: 12,
14156
14835
  alignItems: "center",
@@ -14171,48 +14850,48 @@ var styles = import_react_native2.StyleSheet.create({
14171
14850
  profileEditTitle: {
14172
14851
  fontSize: 20,
14173
14852
  fontWeight: "600",
14174
- color: "#111827"
14853
+ color: "#fafafa"
14175
14854
  },
14176
14855
  cancelText: {
14177
14856
  fontSize: 14,
14178
- color: "#6B7280"
14857
+ color: "#71717a"
14179
14858
  },
14180
14859
  profileSection: {
14181
14860
  marginBottom: 20
14182
14861
  },
14183
14862
  profileInput: {
14184
- backgroundColor: "#F9FAFB",
14863
+ backgroundColor: "#27272a",
14185
14864
  borderWidth: 1,
14186
- borderColor: "#E5E7EB",
14865
+ borderColor: "#3f3f46",
14187
14866
  borderRadius: 10,
14188
14867
  paddingHorizontal: 14,
14189
14868
  paddingVertical: 12,
14190
14869
  fontSize: 15,
14191
- color: "#111827"
14870
+ color: "#fafafa"
14192
14871
  },
14193
14872
  profileReadOnly: {
14194
- backgroundColor: "#F3F4F6",
14873
+ backgroundColor: "#27272a",
14195
14874
  borderRadius: 10,
14196
14875
  padding: 14
14197
14876
  },
14198
14877
  profileReadOnlyText: {
14199
14878
  fontSize: 15,
14200
- color: "#374151"
14879
+ color: "#a1a1aa"
14201
14880
  },
14202
14881
  profileReadOnlyHint: {
14203
14882
  fontSize: 12,
14204
- color: "#9CA3AF",
14883
+ color: "#52525b",
14205
14884
  marginTop: 4
14206
14885
  },
14207
14886
  profileHint: {
14208
14887
  fontSize: 13,
14209
- color: "#6B7280",
14888
+ color: "#71717a",
14210
14889
  marginBottom: 12
14211
14890
  },
14212
14891
  emailChip: {
14213
14892
  flexDirection: "row",
14214
14893
  alignItems: "center",
14215
- backgroundColor: "#EDE9FE",
14894
+ backgroundColor: "#1e3a5f",
14216
14895
  paddingHorizontal: 12,
14217
14896
  paddingVertical: 8,
14218
14897
  borderRadius: 20,
@@ -14221,11 +14900,11 @@ var styles = import_react_native2.StyleSheet.create({
14221
14900
  emailChipText: {
14222
14901
  flex: 1,
14223
14902
  fontSize: 14,
14224
- color: "#5B21B6"
14903
+ color: "#60a5fa"
14225
14904
  },
14226
14905
  emailChipRemove: {
14227
14906
  fontSize: 14,
14228
- color: "#8B5CF6",
14907
+ color: "#93c5fd",
14229
14908
  fontWeight: "600",
14230
14909
  marginLeft: 8
14231
14910
  },
@@ -14235,23 +14914,23 @@ var styles = import_react_native2.StyleSheet.create({
14235
14914
  },
14236
14915
  addEmailInput: {
14237
14916
  flex: 1,
14238
- backgroundColor: "#F9FAFB",
14917
+ backgroundColor: "#27272a",
14239
14918
  borderWidth: 1,
14240
- borderColor: "#E5E7EB",
14919
+ borderColor: "#3f3f46",
14241
14920
  borderRadius: 10,
14242
14921
  paddingHorizontal: 14,
14243
14922
  paddingVertical: 10,
14244
14923
  fontSize: 14,
14245
- color: "#111827"
14924
+ color: "#fafafa"
14246
14925
  },
14247
14926
  addEmailButton: {
14248
- backgroundColor: "#7C3AED",
14927
+ backgroundColor: "#3B82F6",
14249
14928
  paddingHorizontal: 16,
14250
14929
  borderRadius: 10,
14251
14930
  justifyContent: "center"
14252
14931
  },
14253
14932
  addEmailButtonDisabled: {
14254
- backgroundColor: "#C4B5FD"
14933
+ backgroundColor: "#1e40af"
14255
14934
  },
14256
14935
  addEmailButtonText: {
14257
14936
  fontSize: 14,
@@ -14264,7 +14943,7 @@ var styles = import_react_native2.StyleSheet.create({
14264
14943
  },
14265
14944
  platformButton: {
14266
14945
  flex: 1,
14267
- backgroundColor: "#F3F4F6",
14946
+ backgroundColor: "#3f3f46",
14268
14947
  paddingVertical: 12,
14269
14948
  borderRadius: 10,
14270
14949
  alignItems: "center",
@@ -14272,16 +14951,16 @@ var styles = import_react_native2.StyleSheet.create({
14272
14951
  borderColor: "transparent"
14273
14952
  },
14274
14953
  platformButtonActive: {
14275
- backgroundColor: "#EDE9FE",
14276
- borderColor: "#7C3AED"
14954
+ backgroundColor: "#1e3a5f",
14955
+ borderColor: "#3B82F6"
14277
14956
  },
14278
14957
  platformButtonText: {
14279
14958
  fontSize: 13,
14280
- color: "#6B7280",
14959
+ color: "#a1a1aa",
14281
14960
  fontWeight: "500"
14282
14961
  },
14283
14962
  platformButtonTextActive: {
14284
- color: "#7C3AED"
14963
+ color: "#3B82F6"
14285
14964
  },
14286
14965
  saveProfileButton: {
14287
14966
  backgroundColor: "#16A34A",
@@ -14297,6 +14976,35 @@ var styles = import_react_native2.StyleSheet.create({
14297
14976
  fontSize: 16,
14298
14977
  fontWeight: "600",
14299
14978
  color: "#fff"
14979
+ },
14980
+ // Profile overlay styles
14981
+ profileOverlay: {
14982
+ position: "absolute",
14983
+ top: 0,
14984
+ left: 0,
14985
+ right: 0,
14986
+ bottom: 0,
14987
+ backgroundColor: "#18181b",
14988
+ zIndex: 100
14989
+ },
14990
+ profileOverlayContent: {
14991
+ flex: 1,
14992
+ padding: 16
14993
+ },
14994
+ profileOverlayFooter: {
14995
+ borderTopWidth: 1,
14996
+ borderTopColor: "#27272a",
14997
+ padding: 12,
14998
+ backgroundColor: "#09090b"
14999
+ },
15000
+ closeProfileButton: {
15001
+ paddingVertical: 8,
15002
+ alignItems: "center"
15003
+ },
15004
+ closeProfileButtonText: {
15005
+ fontSize: 14,
15006
+ fontWeight: "500",
15007
+ color: "#3B82F6"
14300
15008
  }
14301
15009
  });
14302
15010
  // Annotate the CommonJS export names for ESM import in node: