@bbearai/react-native 0.1.8 → 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 +843 -191
  2. package/dist/index.mjs +843 -191
  3. package/package.json +4 -4
package/dist/index.mjs CHANGED
@@ -11411,7 +11411,16 @@ var BugBearClient = class {
11411
11411
  */
11412
11412
  async submitReport(report) {
11413
11413
  try {
11414
+ const validationError = this.validateReport(report);
11415
+ if (validationError) {
11416
+ return { success: false, error: validationError };
11417
+ }
11414
11418
  const userInfo = await this.getCurrentUserInfo();
11419
+ const rateLimitId = userInfo?.email || this.config.projectId;
11420
+ const rateLimit = await this.checkRateLimit(rateLimitId, "report_submit");
11421
+ if (!rateLimit.allowed) {
11422
+ return { success: false, error: rateLimit.error };
11423
+ }
11415
11424
  if (!userInfo) {
11416
11425
  console.error("BugBear: No user info available, cannot submit report");
11417
11426
  return { success: false, error: "User not authenticated" };
@@ -11462,6 +11471,7 @@ var BugBearClient = class {
11462
11471
  const { data, error } = await this.supabase.from("test_assignments").select(`
11463
11472
  id,
11464
11473
  status,
11474
+ started_at,
11465
11475
  test_case:test_cases(
11466
11476
  id,
11467
11477
  title,
@@ -11489,6 +11499,7 @@ var BugBearClient = class {
11489
11499
  return (data || []).map((item) => ({
11490
11500
  id: item.id,
11491
11501
  status: item.status,
11502
+ startedAt: item.started_at,
11492
11503
  testCase: {
11493
11504
  id: item.test_case.id,
11494
11505
  title: item.test_case.title,
@@ -11514,47 +11525,430 @@ var BugBearClient = class {
11514
11525
  return [];
11515
11526
  }
11516
11527
  }
11528
+ /**
11529
+ * Get assignment by ID with time tracking fields
11530
+ */
11531
+ async getAssignment(assignmentId) {
11532
+ try {
11533
+ const { data, error } = await this.supabase.from("test_assignments").select(`
11534
+ id,
11535
+ status,
11536
+ started_at,
11537
+ completed_at,
11538
+ duration_seconds,
11539
+ test_case:test_cases(
11540
+ id,
11541
+ title,
11542
+ test_key,
11543
+ description,
11544
+ steps,
11545
+ expected_result,
11546
+ priority,
11547
+ target_route,
11548
+ track:qa_tracks(
11549
+ id,
11550
+ name,
11551
+ icon,
11552
+ color,
11553
+ test_template,
11554
+ rubric_mode,
11555
+ description
11556
+ )
11557
+ )
11558
+ `).eq("id", assignmentId).single();
11559
+ if (error || !data) return null;
11560
+ const testCase = data.test_case;
11561
+ if (!testCase) {
11562
+ console.error("BugBear: Assignment returned without test_case");
11563
+ return null;
11564
+ }
11565
+ const track = testCase.track;
11566
+ return {
11567
+ id: data.id,
11568
+ status: data.status,
11569
+ startedAt: data.started_at,
11570
+ durationSeconds: data.duration_seconds,
11571
+ testCase: {
11572
+ id: testCase.id,
11573
+ title: testCase.title,
11574
+ testKey: testCase.test_key,
11575
+ description: testCase.description,
11576
+ steps: testCase.steps,
11577
+ expectedResult: testCase.expected_result,
11578
+ priority: testCase.priority,
11579
+ targetRoute: testCase.target_route,
11580
+ track: track ? {
11581
+ id: track.id,
11582
+ name: track.name,
11583
+ icon: track.icon,
11584
+ color: track.color,
11585
+ testTemplate: track.test_template,
11586
+ rubricMode: track.rubric_mode || "pass_fail",
11587
+ description: track.description
11588
+ } : void 0
11589
+ }
11590
+ };
11591
+ } catch (err) {
11592
+ console.error("BugBear: Error fetching assignment", err);
11593
+ return null;
11594
+ }
11595
+ }
11596
+ /**
11597
+ * Update assignment status with automatic time tracking
11598
+ * - Sets started_at when status changes to 'in_progress'
11599
+ * - Calculates duration_seconds when status changes to 'passed'/'failed'/'blocked'
11600
+ * - Optionally include feedback when completing a test
11601
+ */
11602
+ async updateAssignmentStatus(assignmentId, status, options) {
11603
+ try {
11604
+ const { data: currentAssignment, error: fetchError } = await this.supabase.from("test_assignments").select("status, started_at").eq("id", assignmentId).single();
11605
+ if (fetchError || !currentAssignment) {
11606
+ return { success: false, error: "Assignment not found" };
11607
+ }
11608
+ const updateData = { status };
11609
+ let durationSeconds;
11610
+ if (status === "in_progress" && currentAssignment.status !== "in_progress") {
11611
+ updateData.started_at = (/* @__PURE__ */ new Date()).toISOString();
11612
+ }
11613
+ if (["passed", "failed", "blocked"].includes(status)) {
11614
+ updateData.completed_at = (/* @__PURE__ */ new Date()).toISOString();
11615
+ if (currentAssignment.started_at) {
11616
+ const startedAt = new Date(currentAssignment.started_at);
11617
+ const completedAt = /* @__PURE__ */ new Date();
11618
+ durationSeconds = Math.round((completedAt.getTime() - startedAt.getTime()) / 1e3);
11619
+ updateData.duration_seconds = durationSeconds;
11620
+ }
11621
+ }
11622
+ if (options?.notes) {
11623
+ updateData.notes = options.notes;
11624
+ }
11625
+ if (options?.testResult) {
11626
+ updateData.test_result = options.testResult;
11627
+ }
11628
+ const { error } = await this.supabase.from("test_assignments").update(updateData).eq("id", assignmentId);
11629
+ if (error) {
11630
+ console.error("BugBear: Failed to update assignment status", error);
11631
+ return { success: false, error: error.message };
11632
+ }
11633
+ if (options?.feedback && ["passed", "failed", "blocked"].includes(status)) {
11634
+ const { data: assignmentData, error: fetchError2 } = await this.supabase.from("test_assignments").select("test_case_id").eq("id", assignmentId).single();
11635
+ if (fetchError2) {
11636
+ console.error("BugBear: Failed to fetch assignment for feedback", fetchError2);
11637
+ } else if (assignmentData?.test_case_id) {
11638
+ const feedbackResult = await this.submitTestFeedback({
11639
+ testCaseId: assignmentData.test_case_id,
11640
+ assignmentId,
11641
+ feedback: options.feedback,
11642
+ timeToCompleteSeconds: durationSeconds
11643
+ });
11644
+ if (!feedbackResult.success) {
11645
+ console.error("BugBear: Failed to submit feedback", feedbackResult.error);
11646
+ }
11647
+ }
11648
+ }
11649
+ return { success: true, durationSeconds };
11650
+ } catch (err) {
11651
+ const message = err instanceof Error ? err.message : "Unknown error";
11652
+ console.error("BugBear: Error updating assignment status", err);
11653
+ return { success: false, error: message };
11654
+ }
11655
+ }
11656
+ /**
11657
+ * Submit feedback on a test case to help improve test quality
11658
+ * This empowers testers to shape better tests over time
11659
+ */
11660
+ async submitTestFeedback(options) {
11661
+ try {
11662
+ const testerInfo = await this.getTesterInfo();
11663
+ if (!testerInfo) {
11664
+ return { success: false, error: "Not authenticated as tester" };
11665
+ }
11666
+ const { testCaseId, assignmentId, feedback, timeToCompleteSeconds } = options;
11667
+ if (feedback.rating < 1 || feedback.rating > 5) {
11668
+ return { success: false, error: "Rating must be between 1 and 5" };
11669
+ }
11670
+ const { error: feedbackError } = await this.supabase.from("test_feedback").insert({
11671
+ project_id: this.config.projectId,
11672
+ test_case_id: testCaseId,
11673
+ assignment_id: assignmentId || null,
11674
+ tester_id: testerInfo.id,
11675
+ rating: feedback.rating,
11676
+ clarity_rating: feedback.clarityRating || null,
11677
+ steps_rating: feedback.stepsRating || null,
11678
+ relevance_rating: feedback.relevanceRating || null,
11679
+ feedback_note: feedback.feedbackNote?.trim() || null,
11680
+ suggested_improvement: feedback.suggestedImprovement?.trim() || null,
11681
+ is_outdated: feedback.isOutdated || false,
11682
+ needs_more_detail: feedback.needsMoreDetail || false,
11683
+ steps_unclear: feedback.stepsUnclear || false,
11684
+ expected_result_unclear: feedback.expectedResultUnclear || false,
11685
+ platform: this.getDeviceInfo().platform,
11686
+ time_to_complete_seconds: timeToCompleteSeconds || null
11687
+ });
11688
+ if (feedbackError) {
11689
+ console.error("BugBear: Failed to submit feedback", feedbackError);
11690
+ return { success: false, error: feedbackError.message };
11691
+ }
11692
+ if (assignmentId) {
11693
+ const { error: assignmentError } = await this.supabase.from("test_assignments").update({
11694
+ feedback_rating: feedback.rating,
11695
+ feedback_note: feedback.feedbackNote?.trim() || null,
11696
+ feedback_submitted_at: (/* @__PURE__ */ new Date()).toISOString()
11697
+ }).eq("id", assignmentId);
11698
+ if (assignmentError) {
11699
+ console.error("BugBear: Failed to update assignment feedback fields", assignmentError);
11700
+ }
11701
+ }
11702
+ return { success: true };
11703
+ } catch (err) {
11704
+ const message = err instanceof Error ? err.message : "Unknown error";
11705
+ console.error("BugBear: Error submitting feedback", err);
11706
+ return { success: false, error: message };
11707
+ }
11708
+ }
11709
+ /**
11710
+ * Get the currently active (in_progress) assignment for the tester
11711
+ */
11712
+ async getActiveAssignment() {
11713
+ try {
11714
+ const testerInfo = await this.getTesterInfo();
11715
+ if (!testerInfo) return null;
11716
+ const { data, error } = await this.supabase.from("test_assignments").select(`
11717
+ id,
11718
+ status,
11719
+ started_at,
11720
+ test_case:test_cases(
11721
+ id,
11722
+ title,
11723
+ test_key,
11724
+ description,
11725
+ steps,
11726
+ expected_result,
11727
+ priority,
11728
+ target_route,
11729
+ track:qa_tracks(
11730
+ id,
11731
+ name,
11732
+ icon,
11733
+ color,
11734
+ test_template,
11735
+ rubric_mode,
11736
+ description
11737
+ )
11738
+ )
11739
+ `).eq("project_id", this.config.projectId).eq("tester_id", testerInfo.id).eq("status", "in_progress").order("started_at", { ascending: false }).limit(1).maybeSingle();
11740
+ if (error || !data) return null;
11741
+ const testCase = data.test_case;
11742
+ if (!testCase) {
11743
+ console.error("BugBear: Active assignment returned without test_case");
11744
+ return null;
11745
+ }
11746
+ const track = testCase.track;
11747
+ return {
11748
+ id: data.id,
11749
+ status: data.status,
11750
+ startedAt: data.started_at,
11751
+ testCase: {
11752
+ id: testCase.id,
11753
+ title: testCase.title,
11754
+ testKey: testCase.test_key,
11755
+ description: testCase.description,
11756
+ steps: testCase.steps,
11757
+ expectedResult: testCase.expected_result,
11758
+ priority: testCase.priority,
11759
+ targetRoute: testCase.target_route,
11760
+ track: track ? {
11761
+ id: track.id,
11762
+ name: track.name,
11763
+ icon: track.icon,
11764
+ color: track.color,
11765
+ testTemplate: track.test_template,
11766
+ rubricMode: track.rubric_mode || "pass_fail",
11767
+ description: track.description
11768
+ } : void 0
11769
+ }
11770
+ };
11771
+ } catch (err) {
11772
+ console.error("BugBear: Error fetching active assignment", err);
11773
+ return null;
11774
+ }
11775
+ }
11517
11776
  /**
11518
11777
  * Get current tester info
11519
11778
  * Looks up tester by email from the host app's authenticated user
11779
+ * Checks both primary email AND additional_emails array
11780
+ * Uses parameterized RPC function to prevent SQL injection
11520
11781
  */
11521
11782
  async getTesterInfo() {
11522
11783
  try {
11523
11784
  const userInfo = await this.getCurrentUserInfo();
11524
- if (!userInfo) return null;
11525
- const { data, error } = await this.supabase.from("testers").select("*").eq("project_id", this.config.projectId).eq("email", userInfo.email).eq("status", "active").single();
11785
+ if (!userInfo?.email) return null;
11786
+ if (!this.isValidEmail(userInfo.email)) {
11787
+ console.warn("BugBear: Invalid email format");
11788
+ return null;
11789
+ }
11790
+ const { data, error } = await this.supabase.rpc("lookup_tester_by_email", {
11791
+ p_project_id: this.config.projectId,
11792
+ p_email: userInfo.email
11793
+ }).maybeSingle();
11526
11794
  if (error || !data) return null;
11795
+ const tester = data;
11527
11796
  return {
11528
- id: data.id,
11529
- name: data.name,
11530
- email: data.email,
11531
- additionalEmails: data.additional_emails || [],
11532
- avatarUrl: data.avatar_url || void 0,
11533
- platforms: data.platforms || [],
11534
- assignedTests: data.assigned_count || 0,
11535
- completedTests: data.completed_count || 0
11797
+ id: tester.id,
11798
+ name: tester.name,
11799
+ email: tester.email,
11800
+ additionalEmails: tester.additional_emails || [],
11801
+ avatarUrl: tester.avatar_url || void 0,
11802
+ platforms: tester.platforms || [],
11803
+ assignedTests: tester.assigned_count || 0,
11804
+ completedTests: tester.completed_count || 0
11536
11805
  };
11537
11806
  } catch (err) {
11538
11807
  console.error("BugBear: getTesterInfo error", err);
11539
11808
  return null;
11540
11809
  }
11541
11810
  }
11811
+ /**
11812
+ * Basic email format validation (defense in depth)
11813
+ */
11814
+ isValidEmail(email) {
11815
+ if (!email || email.length > 254) return false;
11816
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
11817
+ return emailRegex.test(email);
11818
+ }
11819
+ /**
11820
+ * Validate report input before submission
11821
+ * Returns error message if invalid, null if valid
11822
+ */
11823
+ validateReport(report) {
11824
+ const validTypes = ["bug", "feedback", "suggestion", "test_pass", "test_fail"];
11825
+ if (report.type && !validTypes.includes(report.type)) {
11826
+ return `Invalid report type: ${report.type}. Must be one of: ${validTypes.join(", ")}`;
11827
+ }
11828
+ const validSeverities = ["critical", "high", "medium", "low"];
11829
+ if (report.severity && !validSeverities.includes(report.severity)) {
11830
+ return `Invalid severity: ${report.severity}. Must be one of: ${validSeverities.join(", ")}`;
11831
+ }
11832
+ if (report.title && report.title.length > 500) {
11833
+ return "Title must be 500 characters or less";
11834
+ }
11835
+ if (report.description && report.description.length > 1e4) {
11836
+ return "Description must be 10,000 characters or less";
11837
+ }
11838
+ if (report.screenshots && Array.isArray(report.screenshots)) {
11839
+ if (report.screenshots.length > 10) {
11840
+ return "Maximum 10 screenshots allowed";
11841
+ }
11842
+ for (const url of report.screenshots) {
11843
+ if (typeof url !== "string" || url.length > 2e3) {
11844
+ return "Invalid screenshot URL";
11845
+ }
11846
+ }
11847
+ }
11848
+ return null;
11849
+ }
11850
+ /**
11851
+ * Validate profile update input
11852
+ * Returns error message if invalid, null if valid
11853
+ */
11854
+ validateProfileUpdate(updates) {
11855
+ if (updates.name !== void 0) {
11856
+ if (typeof updates.name !== "string" || updates.name.length > 100) {
11857
+ return "Name must be 100 characters or less";
11858
+ }
11859
+ }
11860
+ if (updates.additionalEmails !== void 0) {
11861
+ if (!Array.isArray(updates.additionalEmails)) {
11862
+ return "Additional emails must be an array";
11863
+ }
11864
+ if (updates.additionalEmails.length > 5) {
11865
+ return "Maximum 5 additional emails allowed";
11866
+ }
11867
+ for (const email of updates.additionalEmails) {
11868
+ if (!this.isValidEmail(email)) {
11869
+ return `Invalid email format: ${email}`;
11870
+ }
11871
+ }
11872
+ }
11873
+ if (updates.avatarUrl !== void 0 && updates.avatarUrl !== null) {
11874
+ if (typeof updates.avatarUrl !== "string" || updates.avatarUrl.length > 2e3) {
11875
+ return "Invalid avatar URL";
11876
+ }
11877
+ }
11878
+ if (updates.platforms !== void 0) {
11879
+ if (!Array.isArray(updates.platforms)) {
11880
+ return "Platforms must be an array";
11881
+ }
11882
+ const validPlatforms = ["ios", "android", "web", "desktop", "other"];
11883
+ for (const platform of updates.platforms) {
11884
+ if (!validPlatforms.includes(platform)) {
11885
+ return `Invalid platform: ${platform}. Must be one of: ${validPlatforms.join(", ")}`;
11886
+ }
11887
+ }
11888
+ }
11889
+ return null;
11890
+ }
11891
+ /**
11892
+ * Check rate limit for an action
11893
+ * Returns { allowed: boolean, error?: string, remaining?: number }
11894
+ */
11895
+ async checkRateLimit(identifier, action) {
11896
+ try {
11897
+ const { data, error } = await this.supabase.rpc("check_rate_limit", {
11898
+ p_identifier: identifier,
11899
+ p_action: action,
11900
+ p_project_id: this.config.projectId
11901
+ });
11902
+ if (error) {
11903
+ console.warn("BugBear: Rate limit check failed, allowing request", error.message);
11904
+ return { allowed: true };
11905
+ }
11906
+ if (!data.allowed) {
11907
+ return {
11908
+ allowed: false,
11909
+ error: `Rate limit exceeded. Try again in ${Math.ceil((new Date(data.reset_at).getTime() - Date.now()) / 1e3)} seconds.`,
11910
+ remaining: 0,
11911
+ resetAt: data.reset_at
11912
+ };
11913
+ }
11914
+ return {
11915
+ allowed: true,
11916
+ remaining: data.remaining,
11917
+ resetAt: data.reset_at
11918
+ };
11919
+ } catch (err) {
11920
+ console.warn("BugBear: Rate limit check error", err);
11921
+ return { allowed: true };
11922
+ }
11923
+ }
11542
11924
  /**
11543
11925
  * Update tester profile
11544
11926
  * Allows testers to update their name, additional emails, avatar, and platforms
11545
11927
  */
11546
11928
  async updateTesterProfile(updates) {
11547
11929
  try {
11930
+ const validationError = this.validateProfileUpdate(updates);
11931
+ if (validationError) {
11932
+ return { success: false, error: validationError };
11933
+ }
11548
11934
  const userInfo = await this.getCurrentUserInfo();
11549
11935
  if (!userInfo) {
11550
11936
  return { success: false, error: "Not authenticated" };
11551
11937
  }
11938
+ const rateLimit = await this.checkRateLimit(userInfo.email, "profile_update");
11939
+ if (!rateLimit.allowed) {
11940
+ return { success: false, error: rateLimit.error };
11941
+ }
11942
+ const testerInfo = await this.getTesterInfo();
11943
+ if (!testerInfo) {
11944
+ return { success: false, error: "Not a registered tester" };
11945
+ }
11552
11946
  const updateData = {};
11553
11947
  if (updates.name !== void 0) updateData.name = updates.name;
11554
11948
  if (updates.additionalEmails !== void 0) updateData.additional_emails = updates.additionalEmails;
11555
11949
  if (updates.avatarUrl !== void 0) updateData.avatar_url = updates.avatarUrl;
11556
11950
  if (updates.platforms !== void 0) updateData.platforms = updates.platforms;
11557
- const { error } = await this.supabase.from("testers").update(updateData).eq("project_id", this.config.projectId).eq("email", userInfo.email);
11951
+ const { error } = await this.supabase.from("testers").update(updateData).eq("id", testerInfo.id);
11558
11952
  if (error) {
11559
11953
  console.error("BugBear: updateTesterProfile error", error);
11560
11954
  return { success: false, error: error.message };
@@ -11830,6 +12224,11 @@ var BugBearClient = class {
11830
12224
  console.error("BugBear: No tester info, cannot send message");
11831
12225
  return false;
11832
12226
  }
12227
+ const rateLimit = await this.checkRateLimit(testerInfo.email, "message_send");
12228
+ if (!rateLimit.allowed) {
12229
+ console.error("BugBear: Rate limit exceeded for messages");
12230
+ return false;
12231
+ }
11833
12232
  const { error } = await this.supabase.from("discussion_messages").insert({
11834
12233
  thread_id: threadId,
11835
12234
  sender_type: "tester",
@@ -11924,6 +12323,248 @@ var BugBearClient = class {
11924
12323
  return { success: false, error: message };
11925
12324
  }
11926
12325
  }
12326
+ // ============================================
12327
+ // QA Sessions (Sprint 1)
12328
+ // ============================================
12329
+ /**
12330
+ * Start a new QA session for exploratory testing
12331
+ */
12332
+ async startSession(options = {}) {
12333
+ try {
12334
+ const testerInfo = await this.getTesterInfo();
12335
+ if (!testerInfo) {
12336
+ return { success: false, error: "Not authenticated as a tester" };
12337
+ }
12338
+ const activeSession = await this.getActiveSession();
12339
+ if (activeSession) {
12340
+ return { success: false, error: "You already have an active session. End it before starting a new one." };
12341
+ }
12342
+ const { data, error } = await this.supabase.rpc("start_qa_session", {
12343
+ p_project_id: this.config.projectId,
12344
+ p_tester_id: testerInfo.id,
12345
+ p_focus_area: options.focusArea || null,
12346
+ p_track: options.track || null,
12347
+ p_platform: options.platform || null
12348
+ });
12349
+ if (error) {
12350
+ console.error("BugBear: Failed to start session", error);
12351
+ return { success: false, error: error.message };
12352
+ }
12353
+ const session = await this.getSession(data);
12354
+ if (!session) {
12355
+ return { success: false, error: "Session created but could not be fetched" };
12356
+ }
12357
+ return { success: true, session };
12358
+ } catch (err) {
12359
+ const message = err instanceof Error ? err.message : "Unknown error";
12360
+ console.error("BugBear: Error starting session", err);
12361
+ return { success: false, error: message };
12362
+ }
12363
+ }
12364
+ /**
12365
+ * End the current QA session
12366
+ */
12367
+ async endSession(sessionId, options = {}) {
12368
+ try {
12369
+ const { data, error } = await this.supabase.rpc("end_qa_session", {
12370
+ p_session_id: sessionId,
12371
+ p_notes: options.notes || null,
12372
+ p_routes_covered: options.routesCovered || null
12373
+ });
12374
+ if (error) {
12375
+ console.error("BugBear: Failed to end session", error);
12376
+ return { success: false, error: error.message };
12377
+ }
12378
+ const session = this.transformSession(data);
12379
+ return { success: true, session };
12380
+ } catch (err) {
12381
+ const message = err instanceof Error ? err.message : "Unknown error";
12382
+ console.error("BugBear: Error ending session", err);
12383
+ return { success: false, error: message };
12384
+ }
12385
+ }
12386
+ /**
12387
+ * Get the current active session for the tester
12388
+ */
12389
+ async getActiveSession() {
12390
+ try {
12391
+ const testerInfo = await this.getTesterInfo();
12392
+ if (!testerInfo) return null;
12393
+ 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();
12394
+ if (error || !data) return null;
12395
+ return this.transformSession(data);
12396
+ } catch (err) {
12397
+ console.error("BugBear: Error fetching active session", err);
12398
+ return null;
12399
+ }
12400
+ }
12401
+ /**
12402
+ * Get a session by ID
12403
+ */
12404
+ async getSession(sessionId) {
12405
+ try {
12406
+ const { data, error } = await this.supabase.from("qa_sessions").select("*").eq("id", sessionId).single();
12407
+ if (error || !data) return null;
12408
+ return this.transformSession(data);
12409
+ } catch (err) {
12410
+ console.error("BugBear: Error fetching session", err);
12411
+ return null;
12412
+ }
12413
+ }
12414
+ /**
12415
+ * Get session history for the tester
12416
+ */
12417
+ async getSessionHistory(limit = 10) {
12418
+ try {
12419
+ const testerInfo = await this.getTesterInfo();
12420
+ if (!testerInfo) return [];
12421
+ 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);
12422
+ if (error) {
12423
+ console.error("BugBear: Failed to fetch session history", error);
12424
+ return [];
12425
+ }
12426
+ return (data || []).map((s) => this.transformSession(s));
12427
+ } catch (err) {
12428
+ console.error("BugBear: Error fetching session history", err);
12429
+ return [];
12430
+ }
12431
+ }
12432
+ /**
12433
+ * Add a finding during a session
12434
+ */
12435
+ async addFinding(sessionId, options) {
12436
+ try {
12437
+ const { data, error } = await this.supabase.rpc("add_session_finding", {
12438
+ p_session_id: sessionId,
12439
+ p_type: options.type,
12440
+ p_title: options.title,
12441
+ p_description: options.description || null,
12442
+ p_severity: options.severity || "observation",
12443
+ p_route: options.route || null,
12444
+ p_screenshot_url: options.screenshotUrl || null,
12445
+ p_console_logs: options.consoleLogs || null,
12446
+ p_network_snapshot: options.networkSnapshot || null,
12447
+ p_device_info: options.deviceInfo || null,
12448
+ p_app_context: options.appContext || null
12449
+ });
12450
+ if (error) {
12451
+ console.error("BugBear: Failed to add finding", error);
12452
+ return { success: false, error: error.message };
12453
+ }
12454
+ const finding = this.transformFinding(data);
12455
+ return { success: true, finding };
12456
+ } catch (err) {
12457
+ const message = err instanceof Error ? err.message : "Unknown error";
12458
+ console.error("BugBear: Error adding finding", err);
12459
+ return { success: false, error: message };
12460
+ }
12461
+ }
12462
+ /**
12463
+ * Get findings for a session
12464
+ */
12465
+ async getSessionFindings(sessionId) {
12466
+ try {
12467
+ const { data, error } = await this.supabase.from("qa_findings").select("*").eq("session_id", sessionId).order("created_at", { ascending: true });
12468
+ if (error) {
12469
+ console.error("BugBear: Failed to fetch findings", error);
12470
+ return [];
12471
+ }
12472
+ return (data || []).map((f) => this.transformFinding(f));
12473
+ } catch (err) {
12474
+ console.error("BugBear: Error fetching findings", err);
12475
+ return [];
12476
+ }
12477
+ }
12478
+ /**
12479
+ * Convert a finding to a bug report
12480
+ */
12481
+ async convertFindingToBug(findingId) {
12482
+ try {
12483
+ const { data, error } = await this.supabase.rpc("convert_finding_to_bug", {
12484
+ p_finding_id: findingId
12485
+ });
12486
+ if (error) {
12487
+ console.error("BugBear: Failed to convert finding", error);
12488
+ return { success: false, error: error.message };
12489
+ }
12490
+ return { success: true, bugId: data };
12491
+ } catch (err) {
12492
+ const message = err instanceof Error ? err.message : "Unknown error";
12493
+ console.error("BugBear: Error converting finding", err);
12494
+ return { success: false, error: message };
12495
+ }
12496
+ }
12497
+ /**
12498
+ * Dismiss a finding
12499
+ */
12500
+ async dismissFinding(findingId, reason) {
12501
+ try {
12502
+ const { error } = await this.supabase.from("qa_findings").update({
12503
+ dismissed: true,
12504
+ dismissed_reason: reason || null,
12505
+ dismissed_at: (/* @__PURE__ */ new Date()).toISOString()
12506
+ }).eq("id", findingId);
12507
+ if (error) {
12508
+ console.error("BugBear: Failed to dismiss finding", error);
12509
+ return { success: false, error: error.message };
12510
+ }
12511
+ return { success: true };
12512
+ } catch (err) {
12513
+ const message = err instanceof Error ? err.message : "Unknown error";
12514
+ console.error("BugBear: Error dismissing finding", err);
12515
+ return { success: false, error: message };
12516
+ }
12517
+ }
12518
+ /**
12519
+ * Transform database session to QASession type
12520
+ */
12521
+ transformSession(data) {
12522
+ return {
12523
+ id: data.id,
12524
+ projectId: data.project_id,
12525
+ testerId: data.tester_id,
12526
+ focusArea: data.focus_area,
12527
+ track: data.track,
12528
+ platform: data.platform,
12529
+ startedAt: data.started_at,
12530
+ endedAt: data.ended_at,
12531
+ notes: data.notes,
12532
+ routesCovered: data.routes_covered || [],
12533
+ status: data.status,
12534
+ durationMinutes: data.duration_minutes,
12535
+ findingsCount: data.findings_count || 0,
12536
+ bugsFiled: data.bugs_filed || 0,
12537
+ createdAt: data.created_at,
12538
+ updatedAt: data.updated_at
12539
+ };
12540
+ }
12541
+ /**
12542
+ * Transform database finding to QAFinding type
12543
+ */
12544
+ transformFinding(data) {
12545
+ return {
12546
+ id: data.id,
12547
+ sessionId: data.session_id,
12548
+ projectId: data.project_id,
12549
+ type: data.type,
12550
+ severity: data.severity,
12551
+ title: data.title,
12552
+ description: data.description,
12553
+ route: data.route,
12554
+ screenshotUrl: data.screenshot_url,
12555
+ consoleLogs: data.console_logs,
12556
+ networkSnapshot: data.network_snapshot,
12557
+ deviceInfo: data.device_info,
12558
+ appContext: data.app_context,
12559
+ convertedToBugId: data.converted_to_bug_id,
12560
+ convertedToTestId: data.converted_to_test_id,
12561
+ dismissed: data.dismissed || false,
12562
+ dismissedReason: data.dismissed_reason,
12563
+ dismissedAt: data.dismissed_at,
12564
+ createdAt: data.created_at,
12565
+ updatedAt: data.updated_at
12566
+ };
12567
+ }
11927
12568
  };
11928
12569
  function createBugBear(config) {
11929
12570
  return new BugBearClient(config);
@@ -12635,7 +13276,7 @@ function BugBearButton({
12635
13276
  const steps = displayedAssignment.testCase.steps;
12636
13277
  const info = templateInfo[template];
12637
13278
  const rubricMode = displayedAssignment.testCase.track?.rubricMode || "pass_fail";
12638
- return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(View, { style: [styles.templateBadge, { backgroundColor: displayedAssignment.testCase.track?.color ? `${displayedAssignment.testCase.track.color}20` : "#F3F4F6" }] }, /* @__PURE__ */ React2.createElement(Text, { style: styles.templateIcon }, info.icon), /* @__PURE__ */ React2.createElement(Text, { style: styles.templateName }, info.name), /* @__PURE__ */ React2.createElement(Text, { style: styles.templateAction }, "\u2022 ", info.action)), /* @__PURE__ */ React2.createElement(TouchableOpacity, { onPress: () => setShowSteps(!showSteps), style: styles.stepsToggle }, /* @__PURE__ */ React2.createElement(Text, { style: styles.stepsToggleText }, showSteps ? "\u25BC" : "\u25B6", " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && template === "steps" && /* @__PURE__ */ React2.createElement(View, { style: styles.stepsList }, steps.map((step, idx) => /* @__PURE__ */ React2.createElement(View, { key: idx, style: styles.step }, /* @__PURE__ */ React2.createElement(View, { style: styles.stepNumber }, /* @__PURE__ */ React2.createElement(Text, { style: styles.stepNumberText }, step.stepNumber)), /* @__PURE__ */ React2.createElement(View, { style: styles.stepContent }, /* @__PURE__ */ React2.createElement(Text, { style: styles.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ React2.createElement(Text, { style: styles.stepExpected }, "\u2192 ", step.expectedResult))))), showSteps && template === "checklist" && /* @__PURE__ */ React2.createElement(View, { style: styles.stepsList }, steps.map((step, idx) => /* @__PURE__ */ React2.createElement(
13279
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(View, { style: [styles.templateBadge, { backgroundColor: displayedAssignment.testCase.track?.color ? `${displayedAssignment.testCase.track.color}20` : "#3f3f46" }] }, /* @__PURE__ */ React2.createElement(Text, { style: styles.templateIcon }, info.icon), /* @__PURE__ */ React2.createElement(Text, { style: styles.templateName }, info.name), /* @__PURE__ */ React2.createElement(Text, { style: styles.templateAction }, "\u2022 ", info.action)), /* @__PURE__ */ React2.createElement(TouchableOpacity, { onPress: () => setShowSteps(!showSteps), style: styles.stepsToggle }, /* @__PURE__ */ React2.createElement(Text, { style: styles.stepsToggleText }, showSteps ? "\u25BC" : "\u25B6", " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && template === "steps" && /* @__PURE__ */ React2.createElement(View, { style: styles.stepsList }, steps.map((step, idx) => /* @__PURE__ */ React2.createElement(View, { key: idx, style: styles.step }, /* @__PURE__ */ React2.createElement(View, { style: styles.stepNumber }, /* @__PURE__ */ React2.createElement(Text, { style: styles.stepNumberText }, step.stepNumber)), /* @__PURE__ */ React2.createElement(View, { style: styles.stepContent }, /* @__PURE__ */ React2.createElement(Text, { style: styles.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ React2.createElement(Text, { style: styles.stepExpected }, "\u2192 ", step.expectedResult))))), showSteps && template === "checklist" && /* @__PURE__ */ React2.createElement(View, { style: styles.stepsList }, steps.map((step, idx) => /* @__PURE__ */ React2.createElement(
12639
13280
  TouchableOpacity,
12640
13281
  {
12641
13282
  key: idx,
@@ -12841,7 +13482,7 @@ function BugBearButton({
12841
13482
  value: composeSubject,
12842
13483
  onChangeText: setComposeSubject,
12843
13484
  placeholder: "What's this about?",
12844
- placeholderTextColor: "#9CA3AF",
13485
+ placeholderTextColor: "#71717a",
12845
13486
  maxLength: 100
12846
13487
  }
12847
13488
  ), /* @__PURE__ */ React2.createElement(Text, { style: [styles.label, { marginTop: 16 }] }, "Message"), /* @__PURE__ */ React2.createElement(
@@ -12851,7 +13492,7 @@ function BugBearButton({
12851
13492
  value: composeMessage,
12852
13493
  onChangeText: setComposeMessage,
12853
13494
  placeholder: "Write your message...",
12854
- placeholderTextColor: "#9CA3AF",
13495
+ placeholderTextColor: "#71717a",
12855
13496
  multiline: true,
12856
13497
  numberOfLines: 6,
12857
13498
  textAlignVertical: "top",
@@ -12963,7 +13604,7 @@ function BugBearButton({
12963
13604
  value: description,
12964
13605
  onChangeText: setDescription,
12965
13606
  placeholder: "Describe the issue...",
12966
- placeholderTextColor: "#9CA3AF",
13607
+ placeholderTextColor: "#71717a",
12967
13608
  multiline: true,
12968
13609
  numberOfLines: 4,
12969
13610
  textAlignVertical: "top"
@@ -12988,7 +13629,7 @@ function BugBearButton({
12988
13629
  value: profileName,
12989
13630
  onChangeText: setProfileName,
12990
13631
  placeholder: "Your name",
12991
- placeholderTextColor: "#9CA3AF"
13632
+ placeholderTextColor: "#71717a"
12992
13633
  }
12993
13634
  )), /* @__PURE__ */ React2.createElement(View, { style: styles.profileSection }, /* @__PURE__ */ React2.createElement(Text, { style: styles.label }, "Primary Email"), /* @__PURE__ */ React2.createElement(View, { style: styles.profileReadOnly }, /* @__PURE__ */ React2.createElement(Text, { style: styles.profileReadOnlyText }, testerInfo?.email), /* @__PURE__ */ React2.createElement(Text, { style: styles.profileReadOnlyHint }, "Main communication email"))), /* @__PURE__ */ React2.createElement(View, { style: styles.profileSection }, /* @__PURE__ */ React2.createElement(Text, { style: styles.label }, "Additional Testing Emails"), /* @__PURE__ */ React2.createElement(Text, { style: styles.profileHint }, "Add other emails you use to test on different accounts"), profileAdditionalEmails.map((email) => /* @__PURE__ */ React2.createElement(View, { key: email, style: styles.emailChip }, /* @__PURE__ */ React2.createElement(Text, { style: styles.emailChipText }, email), /* @__PURE__ */ React2.createElement(TouchableOpacity, { onPress: () => handleRemoveEmail(email) }, /* @__PURE__ */ React2.createElement(Text, { style: styles.emailChipRemove }, "\u2715")))), /* @__PURE__ */ React2.createElement(View, { style: styles.addEmailRow }, /* @__PURE__ */ React2.createElement(
12994
13635
  TextInput,
@@ -12997,7 +13638,7 @@ function BugBearButton({
12997
13638
  value: newEmailInput,
12998
13639
  onChangeText: setNewEmailInput,
12999
13640
  placeholder: "email@example.com",
13000
- placeholderTextColor: "#9CA3AF",
13641
+ placeholderTextColor: "#71717a",
13001
13642
  keyboardType: "email-address",
13002
13643
  autoCapitalize: "none"
13003
13644
  }
@@ -13062,7 +13703,7 @@ function BugBearButton({
13062
13703
  value: replyText,
13063
13704
  onChangeText: setReplyText,
13064
13705
  placeholder: "Type a reply...",
13065
- placeholderTextColor: "#9CA3AF",
13706
+ placeholderTextColor: "#71717a",
13066
13707
  multiline: true,
13067
13708
  maxLength: 1e3
13068
13709
  }
@@ -13091,13 +13732,13 @@ var styles = StyleSheet.create({
13091
13732
  width: 56,
13092
13733
  height: 56,
13093
13734
  borderRadius: 28,
13094
- backgroundColor: "#7C3AED",
13735
+ backgroundColor: "#3B82F6",
13095
13736
  justifyContent: "center",
13096
13737
  alignItems: "center",
13097
- shadowColor: "#000",
13738
+ shadowColor: "#3B82F6",
13098
13739
  shadowOffset: { width: 0, height: 4 },
13099
- shadowOpacity: 0.3,
13100
- shadowRadius: 8,
13740
+ shadowOpacity: 0.4,
13741
+ shadowRadius: 12,
13101
13742
  elevation: 8,
13102
13743
  zIndex: 999999
13103
13744
  },
@@ -13130,10 +13771,10 @@ var styles = StyleSheet.create({
13130
13771
  modalContainer: {
13131
13772
  flex: 1,
13132
13773
  justifyContent: "flex-end",
13133
- backgroundColor: "rgba(0, 0, 0, 0.5)"
13774
+ backgroundColor: "rgba(0, 0, 0, 0.6)"
13134
13775
  },
13135
13776
  modalContent: {
13136
- backgroundColor: "#fff",
13777
+ backgroundColor: "#18181b",
13137
13778
  borderTopLeftRadius: 20,
13138
13779
  borderTopRightRadius: 20,
13139
13780
  maxHeight: "85%"
@@ -13142,11 +13783,13 @@ var styles = StyleSheet.create({
13142
13783
  flexDirection: "row",
13143
13784
  alignItems: "center",
13144
13785
  justifyContent: "space-between",
13145
- backgroundColor: "#7C3AED",
13786
+ backgroundColor: "#09090b",
13146
13787
  paddingHorizontal: 16,
13147
13788
  paddingVertical: 12,
13148
13789
  borderTopLeftRadius: 20,
13149
- borderTopRightRadius: 20
13790
+ borderTopRightRadius: 20,
13791
+ borderBottomWidth: 1,
13792
+ borderBottomColor: "#27272a"
13150
13793
  },
13151
13794
  headerLeft: {
13152
13795
  flexDirection: "row",
@@ -13157,12 +13800,12 @@ var styles = StyleSheet.create({
13157
13800
  marginRight: 10
13158
13801
  },
13159
13802
  headerTitle: {
13160
- color: "#fff",
13803
+ color: "#fafafa",
13161
13804
  fontSize: 16,
13162
13805
  fontWeight: "600"
13163
13806
  },
13164
13807
  headerSubtitle: {
13165
- color: "#DDD6FE",
13808
+ color: "#71717a",
13166
13809
  fontSize: 12
13167
13810
  },
13168
13811
  headerNameButton: {
@@ -13171,20 +13814,21 @@ var styles = StyleSheet.create({
13171
13814
  gap: 4
13172
13815
  },
13173
13816
  headerPencil: {
13174
- color: "#DDD6FE",
13817
+ color: "#71717a",
13175
13818
  fontSize: 11
13176
13819
  },
13177
13820
  closeButton: {
13178
13821
  padding: 8
13179
13822
  },
13180
13823
  closeButtonText: {
13181
- color: "#fff",
13824
+ color: "#a1a1aa",
13182
13825
  fontSize: 18
13183
13826
  },
13184
13827
  tabs: {
13185
13828
  flexDirection: "row",
13186
13829
  borderBottomWidth: 1,
13187
- borderBottomColor: "#E5E7EB"
13830
+ borderBottomColor: "#27272a",
13831
+ backgroundColor: "#18181b"
13188
13832
  },
13189
13833
  tab: {
13190
13834
  flex: 1,
@@ -13193,15 +13837,15 @@ var styles = StyleSheet.create({
13193
13837
  },
13194
13838
  activeTab: {
13195
13839
  borderBottomWidth: 2,
13196
- borderBottomColor: "#7C3AED"
13840
+ borderBottomColor: "#3B82F6"
13197
13841
  },
13198
13842
  tabText: {
13199
13843
  fontSize: 14,
13200
13844
  fontWeight: "500",
13201
- color: "#6B7280"
13845
+ color: "#71717a"
13202
13846
  },
13203
13847
  activeTabText: {
13204
- color: "#7C3AED"
13848
+ color: "#3B82F6"
13205
13849
  },
13206
13850
  content: {
13207
13851
  padding: 16,
@@ -13214,16 +13858,16 @@ var styles = StyleSheet.create({
13214
13858
  paddingHorizontal: 16,
13215
13859
  paddingVertical: 12,
13216
13860
  borderTopWidth: 1,
13217
- borderTopColor: "#E5E7EB",
13218
- backgroundColor: "#F9FAFB"
13861
+ borderTopColor: "#27272a",
13862
+ backgroundColor: "#09090b"
13219
13863
  },
13220
13864
  footerText: {
13221
13865
  fontSize: 12,
13222
- color: "#9CA3AF"
13866
+ color: "#52525b"
13223
13867
  },
13224
13868
  refreshText: {
13225
13869
  fontSize: 12,
13226
- color: "#6B7280"
13870
+ color: "#71717a"
13227
13871
  },
13228
13872
  emptyState: {
13229
13873
  alignItems: "center",
@@ -13235,7 +13879,7 @@ var styles = StyleSheet.create({
13235
13879
  emptyTitle: {
13236
13880
  fontSize: 18,
13237
13881
  fontWeight: "600",
13238
- color: "#374151",
13882
+ color: "#e4e4e7",
13239
13883
  marginTop: 12
13240
13884
  },
13241
13885
  passedEmoji: {
@@ -13250,26 +13894,26 @@ var styles = StyleSheet.create({
13250
13894
  },
13251
13895
  emptySubtitle: {
13252
13896
  fontSize: 14,
13253
- color: "#9CA3AF",
13897
+ color: "#71717a",
13254
13898
  marginTop: 4
13255
13899
  },
13256
13900
  // List view styles
13257
13901
  listHeader: {
13258
13902
  fontSize: 12,
13259
- color: "#6B7280",
13903
+ color: "#71717a",
13260
13904
  marginBottom: 12
13261
13905
  },
13262
13906
  listItem: {
13263
- backgroundColor: "#F9FAFB",
13907
+ backgroundColor: "#27272a",
13264
13908
  borderRadius: 12,
13265
13909
  padding: 12,
13266
13910
  marginBottom: 8,
13267
13911
  borderWidth: 1,
13268
- borderColor: "#E5E7EB"
13912
+ borderColor: "#3f3f46"
13269
13913
  },
13270
13914
  listItemCurrent: {
13271
- backgroundColor: "#EDE9FE",
13272
- borderColor: "#C4B5FD"
13915
+ backgroundColor: "#1e3a5f",
13916
+ borderColor: "#3B82F6"
13273
13917
  },
13274
13918
  listItemHeader: {
13275
13919
  flexDirection: "row",
@@ -13280,7 +13924,7 @@ var styles = StyleSheet.create({
13280
13924
  listItemKey: {
13281
13925
  fontSize: 12,
13282
13926
  fontFamily: Platform2.OS === "ios" ? "Menlo" : "monospace",
13283
- color: "#6B7280"
13927
+ color: "#71717a"
13284
13928
  },
13285
13929
  listItemBadges: {
13286
13930
  flexDirection: "row",
@@ -13289,7 +13933,7 @@ var styles = StyleSheet.create({
13289
13933
  listItemTitle: {
13290
13934
  fontSize: 14,
13291
13935
  fontWeight: "600",
13292
- color: "#111827",
13936
+ color: "#fafafa",
13293
13937
  marginBottom: 4
13294
13938
  },
13295
13939
  listItemMeta: {
@@ -13298,11 +13942,11 @@ var styles = StyleSheet.create({
13298
13942
  },
13299
13943
  listItemMetaText: {
13300
13944
  fontSize: 12,
13301
- color: "#9CA3AF"
13945
+ color: "#71717a"
13302
13946
  },
13303
13947
  currentBadge: {
13304
13948
  fontSize: 12,
13305
- color: "#7C3AED",
13949
+ color: "#3B82F6",
13306
13950
  fontWeight: "600",
13307
13951
  marginLeft: 8
13308
13952
  },
@@ -13312,15 +13956,17 @@ var styles = StyleSheet.create({
13312
13956
  },
13313
13957
  backButtonText: {
13314
13958
  fontSize: 14,
13315
- color: "#7C3AED",
13959
+ color: "#3B82F6",
13316
13960
  fontWeight: "500"
13317
13961
  },
13318
13962
  // Test card styles
13319
13963
  testCard: {
13320
- backgroundColor: "#F9FAFB",
13964
+ backgroundColor: "#27272a",
13321
13965
  borderRadius: 12,
13322
13966
  padding: 16,
13323
- marginBottom: 16
13967
+ marginBottom: 16,
13968
+ borderWidth: 1,
13969
+ borderColor: "#3f3f46"
13324
13970
  },
13325
13971
  testHeader: {
13326
13972
  flexDirection: "row",
@@ -13335,7 +13981,7 @@ var styles = StyleSheet.create({
13335
13981
  testKey: {
13336
13982
  fontSize: 12,
13337
13983
  fontFamily: Platform2.OS === "ios" ? "Menlo" : "monospace",
13338
- color: "#6B7280"
13984
+ color: "#71717a"
13339
13985
  },
13340
13986
  trackBadge: {
13341
13987
  paddingHorizontal: 6,
@@ -13347,38 +13993,38 @@ var styles = StyleSheet.create({
13347
13993
  color: "#fff"
13348
13994
  },
13349
13995
  priorityBadge: {
13350
- backgroundColor: "#E5E7EB",
13996
+ backgroundColor: "#3f3f46",
13351
13997
  paddingHorizontal: 8,
13352
13998
  paddingVertical: 2,
13353
13999
  borderRadius: 4
13354
14000
  },
13355
14001
  priorityP0: {
13356
- backgroundColor: "#FEE2E2"
14002
+ backgroundColor: "#7f1d1d"
13357
14003
  },
13358
14004
  priorityP1: {
13359
- backgroundColor: "#FED7AA"
14005
+ backgroundColor: "#78350f"
13360
14006
  },
13361
14007
  priorityText: {
13362
14008
  fontSize: 12,
13363
14009
  fontWeight: "600",
13364
- color: "#374151"
14010
+ color: "#e4e4e7"
13365
14011
  },
13366
14012
  testTitle: {
13367
14013
  fontSize: 16,
13368
14014
  fontWeight: "600",
13369
- color: "#111827",
14015
+ color: "#fafafa",
13370
14016
  marginBottom: 4
13371
14017
  },
13372
14018
  testDescription: {
13373
14019
  fontSize: 14,
13374
- color: "#6B7280",
14020
+ color: "#a1a1aa",
13375
14021
  marginBottom: 8
13376
14022
  },
13377
14023
  // Navigate button
13378
14024
  navigateButton: {
13379
- backgroundColor: "#EFF6FF",
14025
+ backgroundColor: "#1e3a5f",
13380
14026
  borderWidth: 1,
13381
- borderColor: "#BFDBFE",
14027
+ borderColor: "#3B82F6",
13382
14028
  borderRadius: 8,
13383
14029
  paddingVertical: 10,
13384
14030
  paddingHorizontal: 16,
@@ -13388,7 +14034,7 @@ var styles = StyleSheet.create({
13388
14034
  navigateButtonText: {
13389
14035
  fontSize: 14,
13390
14036
  fontWeight: "500",
13391
- color: "#1D4ED8"
14037
+ color: "#60a5fa"
13392
14038
  },
13393
14039
  // Template badge
13394
14040
  templateBadge: {
@@ -13406,12 +14052,12 @@ var styles = StyleSheet.create({
13406
14052
  templateName: {
13407
14053
  fontSize: 12,
13408
14054
  fontWeight: "600",
13409
- color: "#374151",
14055
+ color: "#e4e4e7",
13410
14056
  marginRight: 4
13411
14057
  },
13412
14058
  templateAction: {
13413
14059
  fontSize: 12,
13414
- color: "#6B7280"
14060
+ color: "#71717a"
13415
14061
  },
13416
14062
  // Steps toggle
13417
14063
  stepsToggle: {
@@ -13419,7 +14065,7 @@ var styles = StyleSheet.create({
13419
14065
  },
13420
14066
  stepsToggleText: {
13421
14067
  fontSize: 14,
13422
- color: "#7C3AED",
14068
+ color: "#3B82F6",
13423
14069
  fontWeight: "500"
13424
14070
  },
13425
14071
  stepsList: {
@@ -13433,7 +14079,7 @@ var styles = StyleSheet.create({
13433
14079
  width: 24,
13434
14080
  height: 24,
13435
14081
  borderRadius: 12,
13436
- backgroundColor: "#EDE9FE",
14082
+ backgroundColor: "#1e3a5f",
13437
14083
  justifyContent: "center",
13438
14084
  alignItems: "center",
13439
14085
  marginRight: 12
@@ -13441,41 +14087,41 @@ var styles = StyleSheet.create({
13441
14087
  stepNumberText: {
13442
14088
  fontSize: 12,
13443
14089
  fontWeight: "600",
13444
- color: "#7C3AED"
14090
+ color: "#3B82F6"
13445
14091
  },
13446
14092
  stepContent: {
13447
14093
  flex: 1
13448
14094
  },
13449
14095
  stepAction: {
13450
14096
  fontSize: 14,
13451
- color: "#374151"
14097
+ color: "#e4e4e7"
13452
14098
  },
13453
14099
  stepExpected: {
13454
14100
  fontSize: 12,
13455
- color: "#9CA3AF",
14101
+ color: "#71717a",
13456
14102
  marginTop: 2
13457
14103
  },
13458
14104
  // Checklist styles
13459
14105
  checklistItem: {
13460
14106
  flexDirection: "row",
13461
14107
  alignItems: "center",
13462
- backgroundColor: "#fff",
14108
+ backgroundColor: "#27272a",
13463
14109
  borderWidth: 1,
13464
- borderColor: "#E5E7EB",
14110
+ borderColor: "#3f3f46",
13465
14111
  borderRadius: 8,
13466
14112
  padding: 12,
13467
14113
  marginBottom: 8
13468
14114
  },
13469
14115
  checklistItemChecked: {
13470
- backgroundColor: "#ECFDF5",
13471
- borderColor: "#86EFAC"
14116
+ backgroundColor: "#14532d",
14117
+ borderColor: "#22C55E"
13472
14118
  },
13473
14119
  checkbox: {
13474
14120
  width: 24,
13475
14121
  height: 24,
13476
14122
  borderRadius: 4,
13477
14123
  borderWidth: 2,
13478
- borderColor: "#22D3EE",
14124
+ borderColor: "#3B82F6",
13479
14125
  marginRight: 12,
13480
14126
  justifyContent: "center",
13481
14127
  alignItems: "center"
@@ -13492,16 +14138,16 @@ var styles = StyleSheet.create({
13492
14138
  checklistText: {
13493
14139
  flex: 1,
13494
14140
  fontSize: 14,
13495
- color: "#374151"
14141
+ color: "#e4e4e7"
13496
14142
  },
13497
14143
  checklistTextChecked: {
13498
- color: "#15803D"
14144
+ color: "#4ade80"
13499
14145
  },
13500
14146
  // Rubric styles
13501
14147
  rubricItem: {
13502
- backgroundColor: "#fff",
14148
+ backgroundColor: "#27272a",
13503
14149
  borderWidth: 1,
13504
- borderColor: "#E5E7EB",
14150
+ borderColor: "#3f3f46",
13505
14151
  borderRadius: 8,
13506
14152
  padding: 12,
13507
14153
  marginBottom: 8
@@ -13515,7 +14161,7 @@ var styles = StyleSheet.create({
13515
14161
  width: 24,
13516
14162
  height: 24,
13517
14163
  borderRadius: 4,
13518
- backgroundColor: "#EDE9FE",
14164
+ backgroundColor: "#1e3a5f",
13519
14165
  justifyContent: "center",
13520
14166
  alignItems: "center",
13521
14167
  marginRight: 8
@@ -13523,17 +14169,17 @@ var styles = StyleSheet.create({
13523
14169
  rubricNumberText: {
13524
14170
  fontSize: 12,
13525
14171
  fontWeight: "600",
13526
- color: "#7C3AED"
14172
+ color: "#3B82F6"
13527
14173
  },
13528
14174
  rubricTitle: {
13529
14175
  flex: 1,
13530
14176
  fontSize: 14,
13531
14177
  fontWeight: "500",
13532
- color: "#111827"
14178
+ color: "#fafafa"
13533
14179
  },
13534
14180
  rubricExpected: {
13535
14181
  fontSize: 12,
13536
- color: "#6B7280",
14182
+ color: "#71717a",
13537
14183
  marginLeft: 32,
13538
14184
  marginBottom: 8
13539
14185
  },
@@ -13547,7 +14193,7 @@ var styles = StyleSheet.create({
13547
14193
  paddingVertical: 8,
13548
14194
  paddingHorizontal: 12,
13549
14195
  borderRadius: 6,
13550
- backgroundColor: "#F3F4F6",
14196
+ backgroundColor: "#3f3f46",
13551
14197
  alignItems: "center"
13552
14198
  },
13553
14199
  passButtonActive: {
@@ -13559,7 +14205,7 @@ var styles = StyleSheet.create({
13559
14205
  passFailButtonText: {
13560
14206
  fontSize: 12,
13561
14207
  fontWeight: "600",
13562
- color: "#6B7280"
14208
+ color: "#a1a1aa"
13563
14209
  },
13564
14210
  passButtonTextActive: {
13565
14211
  color: "#fff"
@@ -13576,17 +14222,17 @@ var styles = StyleSheet.create({
13576
14222
  width: 36,
13577
14223
  height: 36,
13578
14224
  borderRadius: 6,
13579
- backgroundColor: "#F3F4F6",
14225
+ backgroundColor: "#3f3f46",
13580
14226
  justifyContent: "center",
13581
14227
  alignItems: "center"
13582
14228
  },
13583
14229
  ratingButtonActive: {
13584
- backgroundColor: "#7C3AED"
14230
+ backgroundColor: "#3B82F6"
13585
14231
  },
13586
14232
  ratingButtonText: {
13587
14233
  fontSize: 14,
13588
14234
  fontWeight: "600",
13589
- color: "#6B7280"
14235
+ color: "#a1a1aa"
13590
14236
  },
13591
14237
  ratingButtonTextActive: {
13592
14238
  color: "#fff"
@@ -13600,17 +14246,17 @@ var styles = StyleSheet.create({
13600
14246
  },
13601
14247
  helperText: {
13602
14248
  fontSize: 12,
13603
- color: "#9CA3AF"
14249
+ color: "#71717a"
13604
14250
  },
13605
14251
  resetText: {
13606
14252
  fontSize: 12,
13607
- color: "#9CA3AF"
14253
+ color: "#71717a"
13608
14254
  },
13609
14255
  // Freeform styles
13610
14256
  freeformBox: {
13611
- backgroundColor: "#FFFBEB",
14257
+ backgroundColor: "#422006",
13612
14258
  borderWidth: 1,
13613
- borderColor: "#FDE68A",
14259
+ borderColor: "#a16207",
13614
14260
  borderRadius: 8,
13615
14261
  padding: 12,
13616
14262
  marginTop: 8
@@ -13618,22 +14264,22 @@ var styles = StyleSheet.create({
13618
14264
  freeformTitle: {
13619
14265
  fontSize: 14,
13620
14266
  fontWeight: "600",
13621
- color: "#92400E",
14267
+ color: "#fbbf24",
13622
14268
  marginBottom: 4
13623
14269
  },
13624
14270
  freeformText: {
13625
14271
  fontSize: 12,
13626
- color: "#A16207",
14272
+ color: "#fcd34d",
13627
14273
  marginBottom: 4
13628
14274
  },
13629
14275
  freeformBullet: {
13630
14276
  fontSize: 12,
13631
- color: "#A16207",
14277
+ color: "#fcd34d",
13632
14278
  marginLeft: 8
13633
14279
  },
13634
14280
  // Expected result
13635
14281
  expectedResult: {
13636
- backgroundColor: "#ECFDF5",
14282
+ backgroundColor: "#14532d",
13637
14283
  padding: 12,
13638
14284
  borderRadius: 8,
13639
14285
  marginTop: 12
@@ -13641,12 +14287,12 @@ var styles = StyleSheet.create({
13641
14287
  expectedLabel: {
13642
14288
  fontSize: 12,
13643
14289
  fontWeight: "600",
13644
- color: "#065F46",
14290
+ color: "#4ade80",
13645
14291
  marginBottom: 4
13646
14292
  },
13647
14293
  expectedText: {
13648
14294
  fontSize: 14,
13649
- color: "#047857"
14295
+ color: "#86efac"
13650
14296
  },
13651
14297
  // Action buttons
13652
14298
  actionButtons: {
@@ -13655,7 +14301,7 @@ var styles = StyleSheet.create({
13655
14301
  },
13656
14302
  failButton: {
13657
14303
  flex: 1,
13658
- backgroundColor: "#FEE2E2",
14304
+ backgroundColor: "#7f1d1d",
13659
14305
  paddingVertical: 14,
13660
14306
  borderRadius: 12,
13661
14307
  alignItems: "center"
@@ -13663,7 +14309,7 @@ var styles = StyleSheet.create({
13663
14309
  failButtonText: {
13664
14310
  fontSize: 16,
13665
14311
  fontWeight: "600",
13666
- color: "#DC2626"
14312
+ color: "#fca5a5"
13667
14313
  },
13668
14314
  passButton: {
13669
14315
  flex: 1,
@@ -13685,22 +14331,22 @@ var styles = StyleSheet.create({
13685
14331
  },
13686
14332
  reportTypeButton: {
13687
14333
  flex: 1,
13688
- backgroundColor: "#F3F4F6",
14334
+ backgroundColor: "#3f3f46",
13689
14335
  paddingVertical: 10,
13690
14336
  borderRadius: 8,
13691
14337
  alignItems: "center"
13692
14338
  },
13693
14339
  reportTypeActive: {
13694
- backgroundColor: "#EDE9FE",
14340
+ backgroundColor: "#1e3a5f",
13695
14341
  borderWidth: 2,
13696
- borderColor: "#7C3AED"
14342
+ borderColor: "#3B82F6"
13697
14343
  },
13698
14344
  reportTypeText: {
13699
14345
  fontSize: 14,
13700
- color: "#6B7280"
14346
+ color: "#a1a1aa"
13701
14347
  },
13702
14348
  reportTypeTextActive: {
13703
- color: "#7C3AED",
14349
+ color: "#3B82F6",
13704
14350
  fontWeight: "600"
13705
14351
  },
13706
14352
  severitySection: {
@@ -13709,7 +14355,7 @@ var styles = StyleSheet.create({
13709
14355
  label: {
13710
14356
  fontSize: 14,
13711
14357
  fontWeight: "500",
13712
- color: "#374151",
14358
+ color: "#e4e4e7",
13713
14359
  marginBottom: 8
13714
14360
  },
13715
14361
  severityButtons: {
@@ -13718,7 +14364,7 @@ var styles = StyleSheet.create({
13718
14364
  },
13719
14365
  severityButton: {
13720
14366
  flex: 1,
13721
- backgroundColor: "#F3F4F6",
14367
+ backgroundColor: "#3f3f46",
13722
14368
  paddingVertical: 8,
13723
14369
  borderRadius: 6,
13724
14370
  alignItems: "center"
@@ -13737,7 +14383,7 @@ var styles = StyleSheet.create({
13737
14383
  },
13738
14384
  severityText: {
13739
14385
  fontSize: 12,
13740
- color: "#6B7280",
14386
+ color: "#a1a1aa",
13741
14387
  textTransform: "capitalize"
13742
14388
  },
13743
14389
  severityTextActive: {
@@ -13748,17 +14394,17 @@ var styles = StyleSheet.create({
13748
14394
  marginBottom: 16
13749
14395
  },
13750
14396
  textInput: {
13751
- backgroundColor: "#F9FAFB",
14397
+ backgroundColor: "#27272a",
13752
14398
  borderWidth: 1,
13753
- borderColor: "#E5E7EB",
14399
+ borderColor: "#3f3f46",
13754
14400
  borderRadius: 12,
13755
14401
  padding: 12,
13756
14402
  fontSize: 14,
13757
14403
  minHeight: 100,
13758
- color: "#111827"
14404
+ color: "#fafafa"
13759
14405
  },
13760
14406
  submitButton: {
13761
- backgroundColor: "#7C3AED",
14407
+ backgroundColor: "#3B82F6",
13762
14408
  paddingVertical: 14,
13763
14409
  borderRadius: 12,
13764
14410
  alignItems: "center"
@@ -13797,16 +14443,16 @@ var styles = StyleSheet.create({
13797
14443
  },
13798
14444
  // Thread list styles
13799
14445
  threadItem: {
13800
- backgroundColor: "#F9FAFB",
14446
+ backgroundColor: "#27272a",
13801
14447
  borderRadius: 12,
13802
14448
  padding: 12,
13803
14449
  marginBottom: 8,
13804
14450
  borderWidth: 1,
13805
- borderColor: "#E5E7EB"
14451
+ borderColor: "#3f3f46"
13806
14452
  },
13807
14453
  threadItemUnread: {
13808
- backgroundColor: "#EFF6FF",
13809
- borderColor: "#BFDBFE"
14454
+ backgroundColor: "#1e3a5f",
14455
+ borderColor: "#3B82F6"
13810
14456
  },
13811
14457
  threadHeader: {
13812
14458
  flexDirection: "row",
@@ -13830,12 +14476,12 @@ var styles = StyleSheet.create({
13830
14476
  threadSubject: {
13831
14477
  fontSize: 14,
13832
14478
  fontWeight: "500",
13833
- color: "#374151",
14479
+ color: "#e4e4e7",
13834
14480
  flex: 1
13835
14481
  },
13836
14482
  threadSubjectUnread: {
13837
14483
  fontWeight: "600",
13838
- color: "#111827"
14484
+ color: "#fafafa"
13839
14485
  },
13840
14486
  priorityDot: {
13841
14487
  width: 8,
@@ -13845,7 +14491,7 @@ var styles = StyleSheet.create({
13845
14491
  },
13846
14492
  threadPreview: {
13847
14493
  fontSize: 13,
13848
- color: "#6B7280",
14494
+ color: "#a1a1aa",
13849
14495
  marginBottom: 4
13850
14496
  },
13851
14497
  threadMeta: {
@@ -13855,7 +14501,7 @@ var styles = StyleSheet.create({
13855
14501
  },
13856
14502
  threadMetaText: {
13857
14503
  fontSize: 12,
13858
- color: "#9CA3AF"
14504
+ color: "#71717a"
13859
14505
  },
13860
14506
  unreadBadge: {
13861
14507
  backgroundColor: "#3B82F6",
@@ -13870,7 +14516,7 @@ var styles = StyleSheet.create({
13870
14516
  },
13871
14517
  threadTime: {
13872
14518
  fontSize: 12,
13873
- color: "#9CA3AF"
14519
+ color: "#71717a"
13874
14520
  },
13875
14521
  // Thread detail styles
13876
14522
  threadDetailContainer: {
@@ -13879,7 +14525,7 @@ var styles = StyleSheet.create({
13879
14525
  threadDetailHeader: {
13880
14526
  flexDirection: "row",
13881
14527
  alignItems: "center",
13882
- backgroundColor: "#F3F4F6",
14528
+ backgroundColor: "#27272a",
13883
14529
  padding: 12,
13884
14530
  borderRadius: 8,
13885
14531
  marginBottom: 12
@@ -13892,7 +14538,7 @@ var styles = StyleSheet.create({
13892
14538
  flex: 1,
13893
14539
  fontSize: 15,
13894
14540
  fontWeight: "600",
13895
- color: "#111827"
14541
+ color: "#fafafa"
13896
14542
  },
13897
14543
  loadingMessages: {
13898
14544
  padding: 20,
@@ -13900,7 +14546,7 @@ var styles = StyleSheet.create({
13900
14546
  },
13901
14547
  loadingText: {
13902
14548
  fontSize: 14,
13903
- color: "#6B7280"
14549
+ color: "#71717a"
13904
14550
  },
13905
14551
  messagesContainer: {
13906
14552
  paddingBottom: 8
@@ -13913,26 +14559,26 @@ var styles = StyleSheet.create({
13913
14559
  },
13914
14560
  messageBubbleAdmin: {
13915
14561
  alignSelf: "flex-start",
13916
- backgroundColor: "#F3F4F6",
14562
+ backgroundColor: "#27272a",
13917
14563
  borderBottomLeftRadius: 4
13918
14564
  },
13919
14565
  messageBubbleTester: {
13920
14566
  alignSelf: "flex-end",
13921
- backgroundColor: "#7C3AED",
14567
+ backgroundColor: "#3B82F6",
13922
14568
  borderBottomRightRadius: 4
13923
14569
  },
13924
14570
  messageSender: {
13925
14571
  fontSize: 12,
13926
14572
  fontWeight: "600",
13927
- color: "#6B7280",
14573
+ color: "#71717a",
13928
14574
  marginBottom: 2
13929
14575
  },
13930
14576
  messageSenderTester: {
13931
- color: "#DDD6FE"
14577
+ color: "#93c5fd"
13932
14578
  },
13933
14579
  messageContent: {
13934
14580
  fontSize: 14,
13935
- color: "#111827",
14581
+ color: "#fafafa",
13936
14582
  lineHeight: 20
13937
14583
  },
13938
14584
  messageContentTester: {
@@ -13940,12 +14586,12 @@ var styles = StyleSheet.create({
13940
14586
  },
13941
14587
  messageTime: {
13942
14588
  fontSize: 11,
13943
- color: "#9CA3AF",
14589
+ color: "#71717a",
13944
14590
  marginTop: 4,
13945
14591
  textAlign: "right"
13946
14592
  },
13947
14593
  messageTimeTester: {
13948
- color: "#C4B5FD"
14594
+ color: "#93c5fd"
13949
14595
  },
13950
14596
  // Reply composer styles
13951
14597
  replyComposer: {
@@ -13953,24 +14599,24 @@ var styles = StyleSheet.create({
13953
14599
  alignItems: "flex-end",
13954
14600
  padding: 12,
13955
14601
  borderTopWidth: 1,
13956
- borderTopColor: "#E5E7EB",
13957
- backgroundColor: "#fff"
14602
+ borderTopColor: "#27272a",
14603
+ backgroundColor: "#18181b"
13958
14604
  },
13959
14605
  replyInput: {
13960
14606
  flex: 1,
13961
- backgroundColor: "#F9FAFB",
14607
+ backgroundColor: "#27272a",
13962
14608
  borderWidth: 1,
13963
- borderColor: "#E5E7EB",
14609
+ borderColor: "#3f3f46",
13964
14610
  borderRadius: 20,
13965
14611
  paddingHorizontal: 16,
13966
14612
  paddingVertical: 10,
13967
14613
  fontSize: 14,
13968
- color: "#111827",
14614
+ color: "#fafafa",
13969
14615
  maxHeight: 100,
13970
14616
  marginRight: 8
13971
14617
  },
13972
14618
  sendButton: {
13973
- backgroundColor: "#7C3AED",
14619
+ backgroundColor: "#3B82F6",
13974
14620
  paddingHorizontal: 16,
13975
14621
  paddingVertical: 10,
13976
14622
  borderRadius: 20,
@@ -13978,7 +14624,7 @@ var styles = StyleSheet.create({
13978
14624
  alignItems: "center"
13979
14625
  },
13980
14626
  sendButtonDisabled: {
13981
- backgroundColor: "#C4B5FD"
14627
+ backgroundColor: "#1e40af"
13982
14628
  },
13983
14629
  sendButtonText: {
13984
14630
  fontSize: 14,
@@ -13990,7 +14636,7 @@ var styles = StyleSheet.create({
13990
14636
  flexDirection: "row",
13991
14637
  alignItems: "center",
13992
14638
  justifyContent: "center",
13993
- backgroundColor: "#7C3AED",
14639
+ backgroundColor: "#3B82F6",
13994
14640
  paddingVertical: 12,
13995
14641
  paddingHorizontal: 20,
13996
14642
  borderRadius: 12,
@@ -14012,48 +14658,50 @@ var styles = StyleSheet.create({
14012
14658
  composeTitle: {
14013
14659
  fontSize: 20,
14014
14660
  fontWeight: "600",
14015
- color: "#111827",
14661
+ color: "#fafafa",
14016
14662
  marginBottom: 4
14017
14663
  },
14018
14664
  composeSubtitle: {
14019
14665
  fontSize: 14,
14020
- color: "#6B7280"
14666
+ color: "#71717a"
14021
14667
  },
14022
14668
  composeForm: {
14023
- backgroundColor: "#F9FAFB",
14669
+ backgroundColor: "#27272a",
14024
14670
  borderRadius: 12,
14025
- padding: 16
14671
+ padding: 16,
14672
+ borderWidth: 1,
14673
+ borderColor: "#3f3f46"
14026
14674
  },
14027
14675
  composeSubjectInput: {
14028
- backgroundColor: "#fff",
14676
+ backgroundColor: "#18181b",
14029
14677
  borderWidth: 1,
14030
- borderColor: "#E5E7EB",
14678
+ borderColor: "#3f3f46",
14031
14679
  borderRadius: 8,
14032
14680
  paddingHorizontal: 12,
14033
14681
  paddingVertical: 10,
14034
14682
  fontSize: 15,
14035
- color: "#111827"
14683
+ color: "#fafafa"
14036
14684
  },
14037
14685
  composeMessageInput: {
14038
- backgroundColor: "#fff",
14686
+ backgroundColor: "#18181b",
14039
14687
  borderWidth: 1,
14040
- borderColor: "#E5E7EB",
14688
+ borderColor: "#3f3f46",
14041
14689
  borderRadius: 8,
14042
14690
  paddingHorizontal: 12,
14043
14691
  paddingVertical: 10,
14044
14692
  fontSize: 15,
14045
- color: "#111827",
14693
+ color: "#fafafa",
14046
14694
  minHeight: 120
14047
14695
  },
14048
14696
  composeSendButton: {
14049
- backgroundColor: "#7C3AED",
14697
+ backgroundColor: "#3B82F6",
14050
14698
  paddingVertical: 14,
14051
14699
  borderRadius: 12,
14052
14700
  alignItems: "center",
14053
14701
  marginTop: 20
14054
14702
  },
14055
14703
  composeSendButtonDisabled: {
14056
- backgroundColor: "#C4B5FD"
14704
+ backgroundColor: "#1e40af"
14057
14705
  },
14058
14706
  composeSendButtonText: {
14059
14707
  fontSize: 16,
@@ -14062,17 +14710,19 @@ var styles = StyleSheet.create({
14062
14710
  },
14063
14711
  // Profile styles
14064
14712
  profileCard: {
14065
- backgroundColor: "#F9FAFB",
14713
+ backgroundColor: "#27272a",
14066
14714
  borderRadius: 16,
14067
14715
  padding: 24,
14068
14716
  alignItems: "center",
14069
- marginBottom: 16
14717
+ marginBottom: 16,
14718
+ borderWidth: 1,
14719
+ borderColor: "#3f3f46"
14070
14720
  },
14071
14721
  avatarCircle: {
14072
14722
  width: 72,
14073
14723
  height: 72,
14074
14724
  borderRadius: 36,
14075
- backgroundColor: "#7C3AED",
14725
+ backgroundColor: "#3B82F6",
14076
14726
  justifyContent: "center",
14077
14727
  alignItems: "center",
14078
14728
  marginBottom: 12
@@ -14085,12 +14735,12 @@ var styles = StyleSheet.create({
14085
14735
  profileName: {
14086
14736
  fontSize: 20,
14087
14737
  fontWeight: "600",
14088
- color: "#111827",
14738
+ color: "#fafafa",
14089
14739
  marginBottom: 4
14090
14740
  },
14091
14741
  profileEmail: {
14092
14742
  fontSize: 14,
14093
- color: "#6B7280",
14743
+ color: "#71717a",
14094
14744
  marginBottom: 16
14095
14745
  },
14096
14746
  profileStats: {
@@ -14104,35 +14754,37 @@ var styles = StyleSheet.create({
14104
14754
  profileStatValue: {
14105
14755
  fontSize: 24,
14106
14756
  fontWeight: "700",
14107
- color: "#7C3AED"
14757
+ color: "#3B82F6"
14108
14758
  },
14109
14759
  profileStatLabel: {
14110
14760
  fontSize: 12,
14111
- color: "#6B7280",
14761
+ color: "#71717a",
14112
14762
  marginTop: 2
14113
14763
  },
14114
14764
  profileStatDivider: {
14115
14765
  width: 1,
14116
14766
  height: 32,
14117
- backgroundColor: "#E5E7EB"
14767
+ backgroundColor: "#3f3f46"
14118
14768
  },
14119
14769
  profileInfoSection: {
14120
- backgroundColor: "#F9FAFB",
14770
+ backgroundColor: "#27272a",
14121
14771
  borderRadius: 12,
14122
14772
  padding: 16,
14123
- marginBottom: 12
14773
+ marginBottom: 12,
14774
+ borderWidth: 1,
14775
+ borderColor: "#3f3f46"
14124
14776
  },
14125
14777
  profileInfoLabel: {
14126
14778
  fontSize: 12,
14127
14779
  fontWeight: "600",
14128
- color: "#6B7280",
14780
+ color: "#71717a",
14129
14781
  marginBottom: 8,
14130
14782
  textTransform: "uppercase",
14131
14783
  letterSpacing: 0.5
14132
14784
  },
14133
14785
  profileInfoValue: {
14134
14786
  fontSize: 14,
14135
- color: "#374151",
14787
+ color: "#e4e4e7",
14136
14788
  marginBottom: 4
14137
14789
  },
14138
14790
  platformTags: {
@@ -14141,18 +14793,18 @@ var styles = StyleSheet.create({
14141
14793
  gap: 8
14142
14794
  },
14143
14795
  platformTag: {
14144
- backgroundColor: "#EDE9FE",
14796
+ backgroundColor: "#1e3a5f",
14145
14797
  paddingHorizontal: 12,
14146
14798
  paddingVertical: 6,
14147
14799
  borderRadius: 16
14148
14800
  },
14149
14801
  platformTagText: {
14150
14802
  fontSize: 13,
14151
- color: "#7C3AED",
14803
+ color: "#60a5fa",
14152
14804
  fontWeight: "500"
14153
14805
  },
14154
14806
  editProfileButton: {
14155
- backgroundColor: "#7C3AED",
14807
+ backgroundColor: "#3B82F6",
14156
14808
  paddingVertical: 14,
14157
14809
  borderRadius: 12,
14158
14810
  alignItems: "center",
@@ -14173,48 +14825,48 @@ var styles = StyleSheet.create({
14173
14825
  profileEditTitle: {
14174
14826
  fontSize: 20,
14175
14827
  fontWeight: "600",
14176
- color: "#111827"
14828
+ color: "#fafafa"
14177
14829
  },
14178
14830
  cancelText: {
14179
14831
  fontSize: 14,
14180
- color: "#6B7280"
14832
+ color: "#71717a"
14181
14833
  },
14182
14834
  profileSection: {
14183
14835
  marginBottom: 20
14184
14836
  },
14185
14837
  profileInput: {
14186
- backgroundColor: "#F9FAFB",
14838
+ backgroundColor: "#27272a",
14187
14839
  borderWidth: 1,
14188
- borderColor: "#E5E7EB",
14840
+ borderColor: "#3f3f46",
14189
14841
  borderRadius: 10,
14190
14842
  paddingHorizontal: 14,
14191
14843
  paddingVertical: 12,
14192
14844
  fontSize: 15,
14193
- color: "#111827"
14845
+ color: "#fafafa"
14194
14846
  },
14195
14847
  profileReadOnly: {
14196
- backgroundColor: "#F3F4F6",
14848
+ backgroundColor: "#27272a",
14197
14849
  borderRadius: 10,
14198
14850
  padding: 14
14199
14851
  },
14200
14852
  profileReadOnlyText: {
14201
14853
  fontSize: 15,
14202
- color: "#374151"
14854
+ color: "#a1a1aa"
14203
14855
  },
14204
14856
  profileReadOnlyHint: {
14205
14857
  fontSize: 12,
14206
- color: "#9CA3AF",
14858
+ color: "#52525b",
14207
14859
  marginTop: 4
14208
14860
  },
14209
14861
  profileHint: {
14210
14862
  fontSize: 13,
14211
- color: "#6B7280",
14863
+ color: "#71717a",
14212
14864
  marginBottom: 12
14213
14865
  },
14214
14866
  emailChip: {
14215
14867
  flexDirection: "row",
14216
14868
  alignItems: "center",
14217
- backgroundColor: "#EDE9FE",
14869
+ backgroundColor: "#1e3a5f",
14218
14870
  paddingHorizontal: 12,
14219
14871
  paddingVertical: 8,
14220
14872
  borderRadius: 20,
@@ -14223,11 +14875,11 @@ var styles = StyleSheet.create({
14223
14875
  emailChipText: {
14224
14876
  flex: 1,
14225
14877
  fontSize: 14,
14226
- color: "#5B21B6"
14878
+ color: "#60a5fa"
14227
14879
  },
14228
14880
  emailChipRemove: {
14229
14881
  fontSize: 14,
14230
- color: "#8B5CF6",
14882
+ color: "#93c5fd",
14231
14883
  fontWeight: "600",
14232
14884
  marginLeft: 8
14233
14885
  },
@@ -14237,23 +14889,23 @@ var styles = StyleSheet.create({
14237
14889
  },
14238
14890
  addEmailInput: {
14239
14891
  flex: 1,
14240
- backgroundColor: "#F9FAFB",
14892
+ backgroundColor: "#27272a",
14241
14893
  borderWidth: 1,
14242
- borderColor: "#E5E7EB",
14894
+ borderColor: "#3f3f46",
14243
14895
  borderRadius: 10,
14244
14896
  paddingHorizontal: 14,
14245
14897
  paddingVertical: 10,
14246
14898
  fontSize: 14,
14247
- color: "#111827"
14899
+ color: "#fafafa"
14248
14900
  },
14249
14901
  addEmailButton: {
14250
- backgroundColor: "#7C3AED",
14902
+ backgroundColor: "#3B82F6",
14251
14903
  paddingHorizontal: 16,
14252
14904
  borderRadius: 10,
14253
14905
  justifyContent: "center"
14254
14906
  },
14255
14907
  addEmailButtonDisabled: {
14256
- backgroundColor: "#C4B5FD"
14908
+ backgroundColor: "#1e40af"
14257
14909
  },
14258
14910
  addEmailButtonText: {
14259
14911
  fontSize: 14,
@@ -14266,7 +14918,7 @@ var styles = StyleSheet.create({
14266
14918
  },
14267
14919
  platformButton: {
14268
14920
  flex: 1,
14269
- backgroundColor: "#F3F4F6",
14921
+ backgroundColor: "#3f3f46",
14270
14922
  paddingVertical: 12,
14271
14923
  borderRadius: 10,
14272
14924
  alignItems: "center",
@@ -14274,16 +14926,16 @@ var styles = StyleSheet.create({
14274
14926
  borderColor: "transparent"
14275
14927
  },
14276
14928
  platformButtonActive: {
14277
- backgroundColor: "#EDE9FE",
14278
- borderColor: "#7C3AED"
14929
+ backgroundColor: "#1e3a5f",
14930
+ borderColor: "#3B82F6"
14279
14931
  },
14280
14932
  platformButtonText: {
14281
14933
  fontSize: 13,
14282
- color: "#6B7280",
14934
+ color: "#a1a1aa",
14283
14935
  fontWeight: "500"
14284
14936
  },
14285
14937
  platformButtonTextActive: {
14286
- color: "#7C3AED"
14938
+ color: "#3B82F6"
14287
14939
  },
14288
14940
  saveProfileButton: {
14289
14941
  backgroundColor: "#16A34A",
@@ -14307,7 +14959,7 @@ var styles = StyleSheet.create({
14307
14959
  left: 0,
14308
14960
  right: 0,
14309
14961
  bottom: 0,
14310
- backgroundColor: "#fff",
14962
+ backgroundColor: "#18181b",
14311
14963
  zIndex: 100
14312
14964
  },
14313
14965
  profileOverlayContent: {
@@ -14316,9 +14968,9 @@ var styles = StyleSheet.create({
14316
14968
  },
14317
14969
  profileOverlayFooter: {
14318
14970
  borderTopWidth: 1,
14319
- borderTopColor: "#E5E7EB",
14971
+ borderTopColor: "#27272a",
14320
14972
  padding: 12,
14321
- backgroundColor: "#F9FAFB"
14973
+ backgroundColor: "#09090b"
14322
14974
  },
14323
14975
  closeProfileButton: {
14324
14976
  paddingVertical: 8,
@@ -14327,7 +14979,7 @@ var styles = StyleSheet.create({
14327
14979
  closeProfileButtonText: {
14328
14980
  fontSize: 14,
14329
14981
  fontWeight: "500",
14330
- color: "#7C3AED"
14982
+ color: "#3B82F6"
14331
14983
  }
14332
14984
  });
14333
14985
  export {