diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..f86f1d1
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,16 @@
+## Summary
+
+
+
+## Changes
+
+-
+
+## Verification
+
+- [ ] `npm run typecheck`
+- [ ] `npm run format:check`
+
+## Notes
+
+
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..091208a
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,32 @@
+name: CI
+
+on:
+ pull_request:
+ push:
+ branches:
+ - main
+ - dev
+
+jobs:
+ checks:
+ name: TypeScript and format
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ cache: npm
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: TypeScript check
+ run: npm run typecheck
+
+ - name: Format check
+ run: npm run format:check
diff --git a/README.md b/README.md
index 9b0e8c5..939022e 100644
--- a/README.md
+++ b/README.md
@@ -23,9 +23,11 @@ The frontend connects directly to the Shade smart contracts and backend services
## Tech Stack
+- Next.js
- React
- TypeScript
-- Web3 / Wallet integrations
+- Tailwind CSS
+- Stellar wallet integrations
- Smart contract interaction
- REST APIs for off-chain services
@@ -47,8 +49,36 @@ Clone the repository:
git clone https://github.com//shade-dapp-frontend.git
cd shade-dapp-frontend
```
-## Install dependencies
-```npm install```
-## Install dependencies
-```npm run dev```
+Install dependencies:
+
+```bash
+npm install
+```
+
+Start the development server:
+
+```bash
+npm run dev
+```
+
+Run checks:
+
+```bash
+npm run typecheck
+npm run format:check
+```
+
+Format files:
+
+```bash
+npm run format
+```
+
+## Contributing
+
+1. Create a branch from `main`.
+2. Keep changes focused on one task or bug fix.
+3. Run `npm run typecheck` and `npm run format:check` before opening a pull request.
+4. Fill out the pull request template with a short summary, verification steps, and any notes.
+5. Request review after CI passes.
diff --git a/package-lock.json b/package-lock.json
index a84a6e2..21b02d5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -29,6 +29,7 @@
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "15.3.1",
+ "prettier": "^3.8.3",
"tailwindcss": "^4",
"tw-animate-css": "^1.3.8",
"typescript": "^5"
@@ -12976,6 +12977,22 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/prettier": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
+ "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
diff --git a/package.json b/package.json
index 97b18d5..9bd8753 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,10 @@
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
- "lint": "next lint"
+ "lint": "next lint",
+ "typecheck": "tsc --noEmit",
+ "format": "prettier --write .",
+ "format:check": "prettier --check ."
},
"dependencies": {
"@creit.tech/stellar-wallets-kit": "^2.0.0",
@@ -17,21 +20,22 @@
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.544.0",
+ "next": "15.3.1",
"react": "^19.0.0",
"react-dom": "^19.0.0",
- "next": "15.3.1",
"tailwind-merge": "^3.3.1"
},
"devDependencies": {
- "typescript": "^5",
+ "@eslint/eslintrc": "^3",
+ "@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
- "@tailwindcss/postcss": "^4",
- "tailwindcss": "^4",
- "tw-animate-css": "^1.3.8",
"eslint": "^9",
"eslint-config-next": "15.3.1",
- "@eslint/eslintrc": "^3"
+ "prettier": "^3.8.3",
+ "tailwindcss": "^4",
+ "tw-animate-css": "^1.3.8",
+ "typescript": "^5"
}
}
diff --git a/src/app/register/register-client.tsx b/src/app/register/register-client.tsx
index 37e55c1..89b111b 100644
--- a/src/app/register/register-client.tsx
+++ b/src/app/register/register-client.tsx
@@ -102,8 +102,8 @@ export function RegisterClient() {
if (step === 2) {
return Boolean(
values.businessName &&
- values.businessCategory &&
- values.businessDescription,
+ values.businessCategory &&
+ values.businessDescription,
);
}
@@ -263,9 +263,7 @@ export function RegisterClient() {
{step === 2 && "Business details"}
{step === 3 && "Email verification"}
-
- Step {step} of 3
-
+ Step {step} of 3
diff --git a/src/app/sign-in/sign-in-client.tsx b/src/app/sign-in/sign-in-client.tsx
index 28f0481..6bfd354 100644
--- a/src/app/sign-in/sign-in-client.tsx
+++ b/src/app/sign-in/sign-in-client.tsx
@@ -71,15 +71,12 @@ export function SignInClient() {
setStatus("connecting");
try {
- const { StellarWalletsKit, Networks } = await import(
- "@creit.tech/stellar-wallets-kit"
- );
- const { defaultModules } = await import(
- "@creit.tech/stellar-wallets-kit/modules/utils"
- );
- const { FREIGHTER_ID } = await import(
- "@creit.tech/stellar-wallets-kit/modules/freighter"
- );
+ const { StellarWalletsKit, Networks } =
+ await import("@creit.tech/stellar-wallets-kit");
+ const { defaultModules } =
+ await import("@creit.tech/stellar-wallets-kit/modules/utils");
+ const { FREIGHTER_ID } =
+ await import("@creit.tech/stellar-wallets-kit/modules/freighter");
StellarWalletsKit.init({
network: Networks.TESTNET,