• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

agentic-dev-library / thumbcode / 21961208242

12 Feb 2026 07:29PM UTC coverage: 51.569% (-13.4%) from 64.947%
21961208242

push

github

web-flow
feat: complete Expo → Capacitor/Vite migration (#130)

## Summary

Full framework migration from Expo/React Native to Vite + Capacitor + React Router:

- **Framework**: Expo SDK 52 → Vite 6 + Capacitor 7
- **Routing**: expo-router → react-router-dom v7
- **Styling**: NativeWind → Tailwind CSS v4
- **Testing**: Jest → Vitest + @testing-library/react
- **Components**: React Native primitives → HTML/JSX (View→div, Text→span, etc.)
- **Build**: Metro bundler → Vite with HMR

### Key changes
- Removed all React Native and Expo dependencies
- Migrated 50+ components from RN to web HTML/JSX
- Rewrote 70 test files (844 tests passing)
- Replaced deploy-gh-pages.yml: Astro docs → Vite static site deployment
- Added android-release.yml: per-architecture debug APKs on GitHub releases
- Added ABI splits to build.gradle (armeabi-v7a, arm64-v8a, x86_64, universal)
- Fixed all biome lint, TypeScript, and E2E test issues
- Deleted dead `app/` directory (old Expo Router screens)

### CI Status
All critical checks passing: Lint & Type Check, Run Tests (844 passing), Build Web, Build Web + Capacitor Sync, E2E Tests (Web), Security Scan, CodeQL, Validate PR.

1329 of 2944 branches covered (45.14%)

Branch coverage included in aggregate %.

138 of 866 new or added lines in 82 files covered. (15.94%)

120 existing lines in 23 files now uncovered.

2188 of 3876 relevant lines covered (56.45%)

9.8 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/components/onboarding/ProjectForm.tsx
1
/**
2
 * ProjectForm
3
 *
4
 * Project name input and bottom action buttons for the create project flow.
5
 */
6

7
import { VStack } from '@/components/layout';
8
import { Input, Text } from '@/components/ui';
9
import { organicBorderRadius } from '@/lib/organic-styles';
10

11
interface ProjectFormHeaderProps {
12
  projectName: string;
13
  onProjectNameChange: (name: string) => void;
14
}
15

16
export function ProjectFormHeader({
17
  projectName,
18
  onProjectNameChange,
19
}: Readonly<ProjectFormHeaderProps>) {
UNCOV
20
  return (
×
21
    <VStack spacing="sm" className="mb-6">
22
      <Text weight="semibold" className="text-white">
23
        Project Name
24
      </Text>
25
      <Input
26
        placeholder="My Awesome Project"
27
        value={projectName}
28
        onChangeText={onProjectNameChange}
29
      />
30
    </VStack>
31
  );
32
}
33

34
interface ProjectFormActionsProps {
35
  canCreate: boolean;
36
  isLoading: boolean;
37
  bottomInset: number;
38
  onSkip: () => void;
39
  onCreate: () => void;
40
}
41

42
export function ProjectFormActions({
43
  canCreate,
44
  isLoading,
45
  bottomInset,
46
  onSkip,
47
  onCreate,
48
}: Readonly<ProjectFormActionsProps>) {
UNCOV
49
  return (
×
50
    <div
51
      className="border-t border-neutral-800 px-6 py-4 flex-row gap-4"
52
      style={{ paddingBottom: bottomInset + 16 }}
53
    >
54
      <button
55
        type="button"
56
        onClick={onSkip}
57
        className="flex-1 bg-neutral-800 py-4 active:bg-neutral-700"
58
        style={organicBorderRadius.cta}
59
      >
60
        <Text className="text-neutral-300 text-center">Skip for Now</Text>
61
      </button>
62

63
      <button
64
        type="button"
65
        onClick={onCreate}
66
        disabled={!canCreate || isLoading}
×
67
        className={`flex-1 py-4 ${canCreate && !isLoading ? 'bg-coral-500 active:bg-coral-600' : 'bg-neutral-700'}`}
×
68
        style={organicBorderRadius.cta}
69
      >
70
        {isLoading ? (
×
71
          <div className="w-6 h-6 border-2 border-coral-500 border-t-transparent rounded-full animate-spin" />
72
        ) : (
73
          <Text
74
            weight="semibold"
75
            className={canCreate ? 'text-white text-center' : 'text-neutral-500 text-center'}
×
76
          >
77
            Create Project
78
          </Text>
79
        )}
80
      </button>
81
    </div>
82
  );
83
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc