From a24c3e332035ad86d6062b3171326c8ea725ab06 Mon Sep 17 00:00:00 2001 From: Anthony Wright Date: Tue, 21 Jul 2026 18:19:44 -0500 Subject: [PATCH] update verbiage --- .vscode/launch.json | 2 +- README.md | 40 ++++++++------ apps/api/.env.example | 2 +- apps/api/.env.staging.example | 4 +- apps/api/README.md | 6 +-- apps/api/app/core/brand.py | 2 +- apps/api/app/main.py | 2 +- apps/api/app/routers/admin.py | 4 +- apps/api/app/routers/dev_seed.py | 42 +++++++-------- apps/api/app/routers/payment_return.py | 8 +++ apps/api/pyproject.toml | 2 +- apps/api/scripts/seed_services.py | 2 +- apps/api/tests/test_dev_seed.py | 16 +++--- apps/api/tests/test_payment_gateway.py | 4 +- apps/api/tests/test_payment_return.py | 12 +++-- apps/api/tests/test_services.py | 2 +- apps/mobile/.env.staging | 4 +- apps/mobile/.env.staging.example | 2 +- apps/mobile/README.md | 20 ++++--- apps/mobile/app.config.ts | 24 +++++++-- apps/mobile/app.json.bak | 19 ++++++- apps/mobile/assets/adaptive-icon.png | Bin 0 -> 11915 bytes apps/mobile/assets/brand/skruhb-app-icon.svg | 2 + .../mobile/assets/brand/skruhb-logo-black.png | Bin 0 -> 12616 bytes .../mobile/assets/brand/skruhb-logo-black.svg | 2 + apps/mobile/assets/brand/skruhb-logo-deep.png | Bin 0 -> 14728 bytes apps/mobile/assets/brand/skruhb-logo-deep.svg | 2 + .../mobile/assets/brand/skruhb-logo-white.png | Bin 0 -> 8369 bytes .../mobile/assets/brand/skruhb-logo-white.svg | 2 + .../assets/brand/skruhb-symbol-black.png | Bin 0 -> 3395 bytes .../assets/brand/skruhb-symbol-black.svg | 2 + .../assets/brand/skruhb-symbol-brand.png | Bin 0 -> 7647 bytes .../assets/brand/skruhb-symbol-brand.svg | 2 + .../assets/brand/skruhb-symbol-white.png | Bin 0 -> 3604 bytes .../assets/brand/skruhb-symbol-white.svg | 2 + apps/mobile/assets/favicon.png | Bin 0 -> 1210 bytes apps/mobile/assets/icon.png | Bin 0 -> 49307 bytes apps/mobile/assets/splash-icon.png | Bin 0 -> 17426 bytes apps/mobile/eas.json | 8 +-- apps/mobile/package-lock.json | 4 +- apps/mobile/package.json | 2 +- apps/mobile/src/__tests__/demoLogins.test.ts | 12 ++--- .../src/__tests__/servicesCache.test.ts | 2 +- apps/mobile/src/auth/demoLogins.ts | 12 ++--- apps/mobile/src/components/AppHeader.tsx | 3 +- .../src/components/branding/Logo.test.tsx | 25 +++++++++ apps/mobile/src/components/branding/Logo.tsx | 51 ++++++++++++++++++ .../src/components/rewardsCard.test.tsx | 4 +- apps/mobile/src/components/ui/RewardsCard.tsx | 2 +- apps/mobile/src/content/brandCopy.ts | 2 +- .../src/discovery/categoryDiscovery.test.ts | 2 +- apps/mobile/src/navigation/AuthGate.tsx | 18 +++++-- .../mobile/src/screens/CustomerInfoScreen.tsx | 2 +- apps/mobile/src/screens/auth/LoginScreen.tsx | 21 ++------ .../src/screens/auth/RegisterScreen.tsx | 7 ++- .../company/ProviderDashboardScreen.tsx | 9 +++- .../customer/AppointmentDetailScreen.tsx | 2 +- .../screens/customer/CustomerHomeScreen.tsx | 2 +- .../src/screens/home/BookingDateScreen.tsx | 8 +-- .../src/screens/home/BookingTimeScreen.tsx | 10 ++-- .../src/screens/home/HomeScreen.test.tsx | 2 +- apps/mobile/src/screens/home/HomeScreen.tsx | 9 +--- .../src/screens/profile/ProfileScreen.tsx | 2 +- .../provider/ProviderDashboardScreen.tsx | 8 +-- apps/mobile/src/theme/theme.ts | 16 +++--- apps/payment/README.md | 8 +-- apps/payment/pyproject.toml | 2 +- brand/README.md | 12 +++++ brand/source/concept45-brand-figma.svg | 18 +++++++ brand/source/concept45-lockup-figma.svg | 19 +++++++ brand/source/concept45-symbol-figma.svg | 18 +++++++ brand/source/concept45-wordmark-figma.svg | 14 +++++ brand/svg/skruhb-app-icon.svg | 2 + brand/svg/skruhb-logo-black.svg | 2 + brand/svg/skruhb-logo-deep.svg | 2 + brand/svg/skruhb-logo-white.svg | 2 + brand/svg/skruhb-symbol-black.svg | 2 + brand/svg/skruhb-symbol-brand.svg | 2 + brand/svg/skruhb-symbol-white.svg | 2 + docs/architecture/overview.md | 5 +- docs/architecture/payment.md | 3 +- docs/environment.md | 7 ++- docs/getting-started.md | 19 ++++--- docs/staging.md | 4 +- docs/troubleshooting.md | 2 +- scripts/start-api.ps1 | 2 +- scripts/start-mobile.ps1 | 2 +- 87 files changed, 425 insertions(+), 202 deletions(-) create mode 100644 apps/mobile/assets/adaptive-icon.png create mode 100644 apps/mobile/assets/brand/skruhb-app-icon.svg create mode 100644 apps/mobile/assets/brand/skruhb-logo-black.png create mode 100644 apps/mobile/assets/brand/skruhb-logo-black.svg create mode 100644 apps/mobile/assets/brand/skruhb-logo-deep.png create mode 100644 apps/mobile/assets/brand/skruhb-logo-deep.svg create mode 100644 apps/mobile/assets/brand/skruhb-logo-white.png create mode 100644 apps/mobile/assets/brand/skruhb-logo-white.svg create mode 100644 apps/mobile/assets/brand/skruhb-symbol-black.png create mode 100644 apps/mobile/assets/brand/skruhb-symbol-black.svg create mode 100644 apps/mobile/assets/brand/skruhb-symbol-brand.png create mode 100644 apps/mobile/assets/brand/skruhb-symbol-brand.svg create mode 100644 apps/mobile/assets/brand/skruhb-symbol-white.png create mode 100644 apps/mobile/assets/brand/skruhb-symbol-white.svg create mode 100644 apps/mobile/assets/favicon.png create mode 100644 apps/mobile/assets/icon.png create mode 100644 apps/mobile/assets/splash-icon.png create mode 100644 apps/mobile/src/components/branding/Logo.test.tsx create mode 100644 apps/mobile/src/components/branding/Logo.tsx create mode 100644 brand/README.md create mode 100644 brand/source/concept45-brand-figma.svg create mode 100644 brand/source/concept45-lockup-figma.svg create mode 100644 brand/source/concept45-symbol-figma.svg create mode 100644 brand/source/concept45-wordmark-figma.svg create mode 100644 brand/svg/skruhb-app-icon.svg create mode 100644 brand/svg/skruhb-logo-black.svg create mode 100644 brand/svg/skruhb-logo-deep.svg create mode 100644 brand/svg/skruhb-logo-white.svg create mode 100644 brand/svg/skruhb-symbol-black.svg create mode 100644 brand/svg/skruhb-symbol-brand.svg create mode 100644 brand/svg/skruhb-symbol-white.svg diff --git a/.vscode/launch.json b/.vscode/launch.json index 01d85e8..36ab075 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -3,7 +3,7 @@ "configurations": [ { - "name": "ShoeInn API (uvicorn)", + "name": "Skruhb API (uvicorn)", "type": "python", "request": "launch", "module": "uvicorn", diff --git a/README.md b/README.md index b4ac8b4..6cfc0dc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ -# ShoeInn +Skruhb -Sneaker care scheduling, provider dispatch, notifications, and payment workflow demo. +# Skruhb + +Operations software for cleaning and care businesses, including booking, provider dispatch, notifications, and payment workflows. + +## Brand assets + +The approved concept 45 compact SK ligature is the product identity. Exact Figma source exports are preserved in `brand/source`; cleaned, editable production masters for the deep blue-green, white, black, symbol-only, and horizontal lockups live in `brand/svg`. Platform raster derivatives live with the applications that consume them. This repository is a small monorepo. Run each app from its own folder: @@ -121,7 +127,7 @@ Useful options: - `-SkipInstall` to skip `pip install` - `-PaymentMode mock` or `-PaymentMode service` - `-PaymentServiceBaseUrl "http://localhost:8001"` for service payment mode -- `-MobileRedirectBase "exp://:8081/--"` for Expo Go returns, or `shoeinn://app` for a dev build +- `-MobileRedirectBase "exp://:8081/--"` for Expo Go returns, or `skruhb://app` for a dev build - `-Port 8000` to override the API port If `apps/api/.env` already exists, the scripts preserve existing payment settings unless you explicitly pass `-PaymentMode`, `-PaymentServiceBaseUrl`, or `-MobileRedirectBase`. @@ -244,20 +250,20 @@ Invoke-RestMethod -Method Post "http://localhost:8000/dev/seed?reset=true&demo_m Default demo logins all use `Password1!`: -- Global admin: `admin@shoeinn.com` -- Customer: `customer@shoeinn.com` -- Pelham owner: `pelham.admin@shoeinn.com` -- Pelham providers: `pelham.driver1@shoeinn.com`, `pelham.driver2@shoeinn.com` -- Helena owner: `helena.admin@shoeinn.com` -- Helena provider: `helena.driver@shoeinn.com` -- Alabaster owner: `alabaster.admin@shoeinn.com` -- Alabaster provider: `alabaster.driver@shoeinn.com` +- Global admin: `admin@skruhb.com` +- Customer: `customer@skruhb.com` +- Pelham owner: `pelham.admin@skruhb.com` +- Pelham providers: `pelham.driver1@skruhb.com`, `pelham.driver2@skruhb.com` +- Helena owner: `helena.admin@skruhb.com` +- Helena provider: `helena.driver@skruhb.com` +- Alabaster owner: `alabaster.admin@skruhb.com` +- Alabaster provider: `alabaster.driver@skruhb.com` Mt. Juliet quick-demo logins use `Password123!`: -- Customer: `customer.mtjuliet@shoeinn.demo` -- Provider: `provider.mtjuliet@shoeinn.demo` -- Company admin: `admin.mtjuliet@shoeinn.demo` +- Customer: `customer.mtjuliet@skruhb.demo` +- Provider: `provider.mtjuliet@skruhb.demo` +- Company admin: `admin.mtjuliet@skruhb.demo` The seed response also returns the current login list and generated company IDs. @@ -313,7 +319,7 @@ $env:EXPO_PUBLIC_GOOGLE_MAPS_API_KEY="your-google-directions-api-key" $env:EXPO_PUBLIC_MOBILE_REDIRECT_BASE="exp://:8081/--" ``` -Use `EXPO_PUBLIC_MOBILE_REDIRECT_BASE="shoeinn://app"` for a dev build or standalone app that supports the custom scheme. +Use `EXPO_PUBLIC_MOBILE_REDIRECT_BASE="skruhb://app"` for a dev build or standalone app that supports the custom scheme. ## Optional Payment Service @@ -346,7 +352,7 @@ Then set these API values in `apps/api/.env`: ```env PAYMENT_MODE=service PAYMENT_SERVICE_BASE_URL=http://localhost:8001 -PAYMENT_MOBILE_REDIRECT_BASE=shoeinn://app +PAYMENT_MOBILE_REDIRECT_BASE=skruhb://app ``` For Expo Go return-flow testing, use an explicit Expo URL instead: @@ -496,5 +502,5 @@ Example login: ```powershell Invoke-RestMethod -Method Post "http://localhost:8000/auth/login" ` -ContentType "application/json" ` - -Body '{"email":"customer@shoeinn.com","password":"Password1!"}' + -Body '{"email":"customer@skruhb.com","password":"Password1!"}' ``` diff --git a/apps/api/.env.example b/apps/api/.env.example index c808eab..b4d08cd 100644 --- a/apps/api/.env.example +++ b/apps/api/.env.example @@ -8,7 +8,7 @@ PAYMENT_MODE=mock PAYMENT_SERVICE_BASE_URL= # Stripe should redirect to the mobile/frontend experience, not the API host. # Development/dev client example: -# PAYMENT_MOBILE_REDIRECT_BASE=shoeinn://app +# PAYMENT_MOBILE_REDIRECT_BASE=skruhb://app # Expo Go example: # PAYMENT_MOBILE_REDIRECT_BASE=exp://192.168.1.29:8081/-- PAYMENT_MOBILE_REDIRECT_BASE= diff --git a/apps/api/.env.staging.example b/apps/api/.env.staging.example index 95f8424..ec6fed8 100644 --- a/apps/api/.env.staging.example +++ b/apps/api/.env.staging.example @@ -39,10 +39,10 @@ PAYMENT_CHECKOUT_CANCEL_URL=https://api.your-domain.com/payments/return/cancel # App return URL after the browser success/cancel page. # For installed preview/dev builds, use your app scheme. # For Expo Go local testing, this may be exp://:8081/--/payment-return -PAYMENT_RETURN_APP_URL=shoeinn://payment-return +PAYMENT_RETURN_APP_URL=skruhb://payment-return # Legacy/optional redirect base. Keep blank unless existing code still reads it. PAYMENT_MOBILE_REDIRECT_BASE= # Demo/test seed routes are still available in staging v2. -# Protect them at the deployment layer or add an explicit seed secret before external demos. \ No newline at end of file +# Protect them at the deployment layer or add an explicit seed secret before external demos. diff --git a/apps/api/README.md b/apps/api/README.md index a91f735..aa8d6de 100644 --- a/apps/api/README.md +++ b/apps/api/README.md @@ -1,4 +1,4 @@ -# ShoeInn API +# Skruhb API FastAPI backend for authentication, companies, premium care services, booking holds, appointments, provider/company operations, live updates, notifications, payment reconciliation, and demo seeding. @@ -111,7 +111,7 @@ Example login: ```powershell Invoke-RestMethod -Method Post "http://localhost:8000/auth/login" ` -ContentType "application/json" ` - -Body '{"email":"customer@shoeinn.com","password":"Password1!"}' + -Body '{"email":"customer@skruhb.com","password":"Password1!"}' ``` ## Payment Modes @@ -129,7 +129,7 @@ Use service mode only when `apps/payment` is running: ```env PAYMENT_MODE=service PAYMENT_SERVICE_BASE_URL=http://localhost:8001 -PAYMENT_MOBILE_REDIRECT_BASE=shoeinn://app +PAYMENT_MOBILE_REDIRECT_BASE=skruhb://app ``` For Expo Go return-flow testing: diff --git a/apps/api/app/core/brand.py b/apps/api/app/core/brand.py index 8660245..6c139eb 100644 --- a/apps/api/app/core/brand.py +++ b/apps/api/app/core/brand.py @@ -1,2 +1,2 @@ -APP_NAME = "ShoeInn" +APP_NAME = "Skruhb" CARE_MARKETPLACE_POSITIONING = "Premium care, pickup, and delivery from trusted local teams." diff --git a/apps/api/app/main.py b/apps/api/app/main.py index dd21af5..d622d22 100644 --- a/apps/api/app/main.py +++ b/apps/api/app/main.py @@ -36,7 +36,7 @@ force=True, # <- IMPORTANT: overrides existing handlers/config ) -app = FastAPI(title="ShoeInn API") +app = FastAPI(title="Skruhb API") static_dir = Path(__file__).resolve().parent / "static" static_dir.mkdir(parents=True, exist_ok=True) diff --git a/apps/api/app/routers/admin.py b/apps/api/app/routers/admin.py index de2d5bb..47e5d61 100644 --- a/apps/api/app/routers/admin.py +++ b/apps/api/app/routers/admin.py @@ -62,8 +62,8 @@ def _create_demo_user(db: Session, *, email: str, role: str, full_name: str, pas def _seed_demo_data(db: Session) -> dict[str, object]: now = datetime.now(timezone.utc) - company_one = Company(name="Downtown ShoeInn", city="San Francisco", state="CA") - company_two = Company(name="Uptown ShoeInn", city="New York", state="NY") + company_one = Company(name="Downtown Skruhb", city="San Francisco", state="CA") + company_two = Company(name="Uptown Skruhb", city="New York", state="NY") db.add_all([company_one, company_two]) db.flush() diff --git a/apps/api/app/routers/dev_seed.py b/apps/api/app/routers/dev_seed.py index af91321..596e960 100644 --- a/apps/api/app/routers/dev_seed.py +++ b/apps/api/app/routers/dev_seed.py @@ -141,7 +141,7 @@ class SeedMarket(TypedDict): }, ], "customer": { - "email": "customer@shoeinn.com", + "email": "customer@skruhb.com", "role": "customer", "full_name": "Jordan Demo Customer", }, @@ -150,18 +150,18 @@ class SeedMarket(TypedDict): { "name": "Pelham Pickup & Press", "admin": { - "email": "pelham.admin@shoeinn.com", + "email": "pelham.admin@skruhb.com", "role": "company_admin", "full_name": "Pelham Owner Demo", }, "providers": [ { - "email": "pelham.driver1@shoeinn.com", + "email": "pelham.driver1@skruhb.com", "role": "provider", "full_name": "Mason Route Lead", }, { - "email": "pelham.driver2@shoeinn.com", + "email": "pelham.driver2@skruhb.com", "role": "provider", "full_name": "Ava Delivery Lead", }, @@ -193,13 +193,13 @@ class SeedMarket(TypedDict): { "name": "Helena Shoe & Dry Care", "admin": { - "email": "helena.admin@shoeinn.com", + "email": "helena.admin@skruhb.com", "role": "company_admin", "full_name": "Helena Owner Demo", }, "providers": [ { - "email": "helena.driver@shoeinn.com", + "email": "helena.driver@skruhb.com", "role": "provider", "full_name": "Noah Helena Driver", }, @@ -231,13 +231,13 @@ class SeedMarket(TypedDict): { "name": "Alabaster Clean Run", "admin": { - "email": "alabaster.admin@shoeinn.com", + "email": "alabaster.admin@skruhb.com", "role": "company_admin", "full_name": "Alabaster Owner Demo", }, "providers": [ { - "email": "alabaster.driver@shoeinn.com", + "email": "alabaster.driver@skruhb.com", "role": "provider", "full_name": "Liam Alabaster Driver", }, @@ -343,23 +343,23 @@ class SeedMarket(TypedDict): }, ], "customer": { - "email": "mtjuliet.customer@shoeinn.com", + "email": "mtjuliet.customer@skruhb.com", "role": "customer", "full_name": "Jordan Demo Customer", }, "quick_demo_users": { "customer": { - "email": "customer.mtjuliet@shoeinn.demo", + "email": "customer.mtjuliet@skruhb.demo", "role": "customer", "full_name": "Avery Mt. Juliet Customer", }, "provider": { - "email": "provider.mtjuliet@shoeinn.demo", + "email": "provider.mtjuliet@skruhb.demo", "role": "provider", "full_name": "Cameron Mt. Juliet Provider", }, "company_admin": { - "email": "admin.mtjuliet@shoeinn.demo", + "email": "admin.mtjuliet@skruhb.demo", "role": "company_admin", "full_name": "Reese Mt. Juliet Company Admin", }, @@ -368,18 +368,18 @@ class SeedMarket(TypedDict): { "name": "Mt. Juliet Pickup & Press", "admin": { - "email": "mtjuliet.admin@shoeinn.com", + "email": "mtjuliet.admin@skruhb.com", "role": "company_admin", "full_name": "Mt. Juliet Owner Demo", }, "providers": [ { - "email": "mtjuliet.driver1@shoeinn.com", + "email": "mtjuliet.driver1@skruhb.com", "role": "provider", "full_name": "Harper Route Lead", }, { - "email": "mtjuliet.driver2@shoeinn.com", + "email": "mtjuliet.driver2@skruhb.com", "role": "provider", "full_name": "Ethan Delivery Lead", }, @@ -411,13 +411,13 @@ class SeedMarket(TypedDict): { "name": "Providence Shoe & Dry Care", "admin": { - "email": "providence.admin@shoeinn.com", + "email": "providence.admin@skruhb.com", "role": "company_admin", "full_name": "Providence Owner Demo", }, "providers": [ { - "email": "providence.driver@shoeinn.com", + "email": "providence.driver@skruhb.com", "role": "provider", "full_name": "Lucas Providence Driver", }, @@ -449,13 +449,13 @@ class SeedMarket(TypedDict): { "name": "Golden Bear Clean Run", "admin": { - "email": "goldenbear.admin@shoeinn.com", + "email": "goldenbear.admin@skruhb.com", "role": "company_admin", "full_name": "Golden Bear Owner Demo", }, "providers": [ { - "email": "goldenbear.driver@shoeinn.com", + "email": "goldenbear.driver@skruhb.com", "role": "provider", "full_name": "Mia Golden Bear Driver", }, @@ -505,7 +505,7 @@ def _all_demo_company_names() -> set[str]: def _all_demo_emails() -> set[str]: - emails = {"admin@shoeinn.com"} + emails = {"admin@skruhb.com"} for demo_market in DEMO_MARKETS.values(): emails.add(demo_market["customer"]["email"]) emails.update(user["email"] for user in demo_market["quick_demo_users"].values()) @@ -739,7 +739,7 @@ def get_or_create_user(email: str, role: str, full_name: str, *, password: str = created["users"] += 1 return user - global_admin = get_or_create_user("admin@shoeinn.com", "admin", "ShoeInn Global Admin") + global_admin = get_or_create_user("admin@skruhb.com", "admin", "Skruhb Global Admin") customer = get_or_create_user( market["customer"]["email"], market["customer"]["role"], diff --git a/apps/api/app/routers/payment_return.py b/apps/api/app/routers/payment_return.py index 2149971..d0adb0a 100644 --- a/apps/api/app/routers/payment_return.py +++ b/apps/api/app/routers/payment_return.py @@ -77,6 +77,13 @@ def _payment_return_page(*, title: str, body: str, app_url: str | None) -> HTMLR padding: 32px 24px; box-shadow: 0 20px 40px rgba(17, 24, 39, 0.08); }} + .brand {{ + display: block; + width: 190px; + max-width: 60%; + height: auto; + margin: 0 0 28px; + }} h1 {{ margin: 0 0 12px; font-size: 28px; @@ -102,6 +109,7 @@ def _payment_return_page(*, title: str, body: str, app_url: str | None) -> HTMLR
+ {APP_NAME}

{title}

{body}

{open_app_link} diff --git a/apps/api/pyproject.toml b/apps/api/pyproject.toml index 758ae4c..1f1bc79 100644 --- a/apps/api/pyproject.toml +++ b/apps/api/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "shoeinn-api" +name = "skruhb-api" version = "0.1.0" requires-python = ">=3.11" dependencies = [ diff --git a/apps/api/scripts/seed_services.py b/apps/api/scripts/seed_services.py index fb87b79..23e6227 100644 --- a/apps/api/scripts/seed_services.py +++ b/apps/api/scripts/seed_services.py @@ -103,7 +103,7 @@ def seed_services(session: Session) -> int: company = session.execute(select(Company).limit(1)).scalar_one_or_none() if company is None: - company = Company(name="ShoeInn", city="Anywhere", state="CA") + company = Company(name="Skruhb", city="Anywhere", state="CA") session.add(company) session.flush() diff --git a/apps/api/tests/test_dev_seed.py b/apps/api/tests/test_dev_seed.py index c1934d7..d5160d9 100644 --- a/apps/api/tests/test_dev_seed.py +++ b/apps/api/tests/test_dev_seed.py @@ -139,7 +139,7 @@ def test_dev_seed_populates_realistic_city_aligned_addresses( assert response.status_code == 200, response.text assert response.json()["demo_market"] == "shelby" - customer = db_session.query(User).filter(User.email == "customer@shoeinn.com").one() + customer = db_session.query(User).filter(User.email == "customer@skruhb.com").one() assert customer.address_line1 == "230 Tucker Road" assert customer.address_line2 is None assert customer.city == "Helena" @@ -249,7 +249,7 @@ def test_dev_seed_mt_juliet_selector_resets_other_demo_markets_and_rotates_selec ).all() assert default_companies == [] - customer = db_session.query(User).filter(User.email == "mtjuliet.customer@shoeinn.com").one() + customer = db_session.query(User).filter(User.email == "mtjuliet.customer@skruhb.com").one() assert customer.address_line1 == "3005 Willow Bend Dr" assert customer.address_line2 is None assert customer.city == "Mt. Juliet" @@ -325,14 +325,14 @@ def test_dev_seed_mt_juliet_quick_demo_users_have_expected_roles( for user in db_session.query(User).filter( User.email.in_( [ - "customer.mtjuliet@shoeinn.demo", - "provider.mtjuliet@shoeinn.demo", - "admin.mtjuliet@shoeinn.demo", + "customer.mtjuliet@skruhb.demo", + "provider.mtjuliet@skruhb.demo", + "admin.mtjuliet@skruhb.demo", ] ) ) } - assert users["customer.mtjuliet@shoeinn.demo"].role == "customer" - assert users["provider.mtjuliet@shoeinn.demo"].role == "provider" - assert users["admin.mtjuliet@shoeinn.demo"].role == "company_admin" + assert users["customer.mtjuliet@skruhb.demo"].role == "customer" + assert users["provider.mtjuliet@skruhb.demo"].role == "provider" + assert users["admin.mtjuliet@skruhb.demo"].role == "company_admin" diff --git a/apps/api/tests/test_payment_gateway.py b/apps/api/tests/test_payment_gateway.py index a8018dd..ee9e9a5 100644 --- a/apps/api/tests/test_payment_gateway.py +++ b/apps/api/tests/test_payment_gateway.py @@ -67,7 +67,7 @@ def test_service_mode_requires_real_return_urls( def test_service_mode_succeeds_with_valid_return_urls(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr(settings, "payment_mode", "service") monkeypatch.setattr(settings, "payment_service_base_url", "http://payments.test") - monkeypatch.setattr(settings, "payment_mobile_redirect_base", "shoeinn://app") + monkeypatch.setattr(settings, "payment_mobile_redirect_base", "skruhb://app") captured_payload: dict[str, object] = {} @@ -103,7 +103,7 @@ def _handler(request: httpx.Request) -> httpx.Response: cancel_url = str(captured_payload["cancel_url"]) success_parts = urlparse(success_url) cancel_parts = urlparse(cancel_url) - assert success_parts.scheme == "shoeinn" + assert success_parts.scheme == "skruhb" assert success_parts.netloc == "app" assert success_parts.path == "/payment/success" assert cancel_parts.path == "/payment/cancel" diff --git a/apps/api/tests/test_payment_return.py b/apps/api/tests/test_payment_return.py index 45accb6..e56b7fa 100644 --- a/apps/api/tests/test_payment_return.py +++ b/apps/api/tests/test_payment_return.py @@ -10,14 +10,16 @@ def test_payment_return_success_page_includes_app_link( client: TestClient, monkeypatch: pytest.MonkeyPatch, ) -> None: - monkeypatch.setattr(settings, "payment_mobile_redirect_base", "shoeinn://app") + monkeypatch.setattr(settings, "payment_mobile_redirect_base", "skruhb://app") response = client.get("/payment/return/success?booking_id=booking-123&session_id=cs_123") assert response.status_code == 200 body = response.text assert "Payment received" in body - assert "shoeinn://app/payment/success?booking_id=booking-123&session_id=cs_123" in body - assert "Open ShoeInn" in body + assert "skruhb://app/payment/success?booking_id=booking-123&session_id=cs_123" in body + assert "Open Skruhb" in body + assert 'src="/static/skruhb-logo-deep.svg"' in body + assert 'alt="Skruhb"' in body def test_payment_return_cancel_page_without_app_link_shows_manual_fallback( @@ -30,5 +32,5 @@ def test_payment_return_cancel_page_without_app_link_shows_manual_fallback( assert response.status_code == 200 body = response.text assert "Checkout canceled" in body - assert "Return to ShoeInn manually" in body - assert "Open ShoeInn" not in body + assert "Return to Skruhb manually" in body + assert "Open Skruhb" not in body diff --git a/apps/api/tests/test_services.py b/apps/api/tests/test_services.py index 4ac205b..2563724 100644 --- a/apps/api/tests/test_services.py +++ b/apps/api/tests/test_services.py @@ -182,7 +182,7 @@ def test_company_services_can_filter_by_category(client: TestClient, db_session: def test_seed_services_backfills_existing_uncategorized_services(db_session: Session) -> None: - company = Company(name="Legacy ShoeInn", city="Mt. Juliet", state="TN") + company = Company(name="Legacy Skruhb", city="Mt. Juliet", state="TN") db_session.add(company) db_session.flush() service = Service( diff --git a/apps/mobile/.env.staging b/apps/mobile/.env.staging index d9e5c06..1e894b1 100644 --- a/apps/mobile/.env.staging +++ b/apps/mobile/.env.staging @@ -1,4 +1,4 @@ -EXPO_PUBLIC_API_URL=https://api-shoeinn.mrwrite.dev +EXPO_PUBLIC_API_URL=https://api.skruhb.com EXPO_PUBLIC_APP_ENV=staging EXPO_PUBLIC_ENABLE_DEMO_LOGINS=true -EXPO_PUBLIC_GOOGLE_MAPS_API_KEY=AIzaSyBuGdJpuCV5rmcJQ_Hrg7Zkd0ajL6XUglw \ No newline at end of file +EXPO_PUBLIC_GOOGLE_MAPS_API_KEY=AIzaSyBuGdJpuCV5rmcJQ_Hrg7Zkd0ajL6XUglw diff --git a/apps/mobile/.env.staging.example b/apps/mobile/.env.staging.example index 2af8a1d..bd5b7dd 100644 --- a/apps/mobile/.env.staging.example +++ b/apps/mobile/.env.staging.example @@ -6,7 +6,7 @@ EXPO_PUBLIC_API_BASE_URL=https://api-staging.example.com EXPO_PUBLIC_APP_ENV=staging EXPO_PUBLIC_ENABLE_DEMO_LOGINS=true EXPO_PUBLIC_DEMO_MARKET=shelby -EXPO_PUBLIC_MOBILE_REDIRECT_BASE=shoeinn://payment-return +EXPO_PUBLIC_MOBILE_REDIRECT_BASE=skruhb://payment-return # Optional for travel-route rendering in staging. EXPO_PUBLIC_GOOGLE_MAPS_API_KEY=replace-me-for-staging diff --git a/apps/mobile/README.md b/apps/mobile/README.md index 8bef8cd..3a2fab6 100644 --- a/apps/mobile/README.md +++ b/apps/mobile/README.md @@ -1,7 +1,11 @@ -# ShoeInn Mobile +Skruhb + +# Skruhb Mobile Expo React Native app for customer booking, provider job handling, company admin operations, live appointment updates, notifications, maps, and payment return flows. +The reusable `Logo` component in `src/components/branding/Logo.tsx` renders the approved compact SK ligature and horizontal wordmark. Editable SVG masters and required Expo raster assets are stored in `assets/brand` and `assets` respectively. + ## Requirements - Node.js 20 LTS recommended @@ -88,15 +92,15 @@ EXPO_PUBLIC_DEMO_MARKET=mt_juliet Shelby County demo accounts use `Password1!`: -- Customer: `customer@shoeinn.com` -- Provider: `pelham.driver1@shoeinn.com` -- Company admin: `pelham.admin@shoeinn.com` +- Customer: `customer@skruhb.com` +- Provider: `pelham.driver1@skruhb.com` +- Company admin: `pelham.admin@skruhb.com` Mt. Juliet demo accounts use `Password123!`: -- Customer: `customer.mtjuliet@shoeinn.demo` -- Provider: `provider.mtjuliet@shoeinn.demo` -- Company admin: `admin.mtjuliet@shoeinn.demo` +- Customer: `customer.mtjuliet@skruhb.demo` +- Provider: `provider.mtjuliet@skruhb.demo` +- Company admin: `admin.mtjuliet@skruhb.demo` Seed data from the API before logging in: @@ -125,7 +129,7 @@ For mock payment mode, no Stripe redirect setup is required. For service payment mode with Stripe Checkout, configure the app return base: ```bash -EXPO_PUBLIC_MOBILE_REDIRECT_BASE=shoeinn://app +EXPO_PUBLIC_MOBILE_REDIRECT_BASE=skruhb://app ``` For Expo Go return-flow testing: diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index d8e3368..a5bb35e 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -15,17 +15,27 @@ const demoMarket = process.env.EXPO_PUBLIC_DEMO_MARKET ?? "shelby"; export default ({ config }: ConfigContext): ExpoConfig => ({ ...config, - name: "Shoeinn", - slug: "shoeinn", - scheme: "shoeinn", + name: "Skruhb", + slug: "skruhb", + scheme: "skruhb", version: "1.0.1", + icon: "./assets/icon.png", userInterfaceStyle: "light", orientation: "portrait", platforms: ["ios", "android", "web"], + splash: { + image: "./assets/splash-icon.png", + resizeMode: "contain", + backgroundColor: "#F7F3EA", + }, android: { ...config.android, - package: "com.mrwrite.shoeinn", + package: "com.mrwrite.skruhb", versionCode: 2, + adaptiveIcon: { + foregroundImage: "./assets/adaptive-icon.png", + backgroundColor: "#062E37", + }, config: { ...config.android?.config, googleMaps: { @@ -35,7 +45,7 @@ export default ({ config }: ConfigContext): ExpoConfig => ({ }, ios: { ...config.ios, - bundleIdentifier: "com.mrwrite.shoeinn", + bundleIdentifier: "com.mrwrite.skruhb", config: { ...config.ios?.config, googleMapsApiKey: process.env.EXPO_PUBLIC_GOOGLE_MAPS_API_KEY, @@ -44,6 +54,10 @@ export default ({ config }: ConfigContext): ExpoConfig => ({ ITSAppUsesNonExemptEncryption: false, }, }, + web: { + ...config.web, + favicon: "./assets/favicon.png", + }, updates: { ...config.updates, checkAutomatically: "ON_ERROR_RECOVERY", diff --git a/apps/mobile/app.json.bak b/apps/mobile/app.json.bak index 7f150f6..3964f4f 100644 --- a/apps/mobile/app.json.bak +++ b/apps/mobile/app.json.bak @@ -1,9 +1,24 @@ { "expo": { - "name": "shoeinn", - "slug": "shoeinn", + "name": "Skruhb", + "slug": "skruhb", "version": "1.0.0", "orientation": "portrait", + "icon": "./assets/icon.png", + "splash": { + "image": "./assets/splash-icon.png", + "resizeMode": "contain", + "backgroundColor": "#F7F3EA" + }, + "android": { + "adaptiveIcon": { + "foregroundImage": "./assets/adaptive-icon.png", + "backgroundColor": "#062E37" + } + }, + "web": { + "favicon": "./assets/favicon.png" + }, "platforms": [ "ios", "android", diff --git a/apps/mobile/assets/adaptive-icon.png b/apps/mobile/assets/adaptive-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2c1b42d4eb48b1a54f442c2f962bc195ba0fcc GIT binary patch literal 11915 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 + diff --git a/apps/mobile/assets/brand/skruhb-logo-black.png b/apps/mobile/assets/brand/skruhb-logo-black.png new file mode 100644 index 0000000000000000000000000000000000000000..6a41f5b7552f859e053fc45838ee1c600c529282 GIT binary patch literal 12616 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/assets/brand/skruhb-logo-black.svg b/apps/mobile/assets/brand/skruhb-logo-black.svg new file mode 100644 index 0000000..4277aa7 --- /dev/null +++ b/apps/mobile/assets/brand/skruhb-logo-black.svg @@ -0,0 +1,2 @@ + + diff --git a/apps/mobile/assets/brand/skruhb-logo-deep.png b/apps/mobile/assets/brand/skruhb-logo-deep.png new file mode 100644 index 0000000000000000000000000000000000000000..cafdae7052615c952bc2c6a54616718c6dce1d1f GIT binary patch literal 14728 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 + diff --git a/apps/mobile/assets/brand/skruhb-logo-white.png b/apps/mobile/assets/brand/skruhb-logo-white.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd52281352bb1db83a9e9a9ac6bc5bd89aa76c8 GIT binary patch literal 8369 zcmdsd_g7O*xGpLk0sSbVp+pEGAVmd~P6UNerFRer0+L9TUZktE5NXoU5D-EO5IQKR zM362eR8b*@7Ntdqz}p58Uq|ra{HTpq;6dHB52rR257T#575= z|6e~PwR6gmy?mSNT)!d87h>9R7pNW~p1zZM!M+EM+MrrJ+6llzO1o>=QLhiq0p!>uSRDbUj z&ZiQ{V}B?8d$mCun&I(H_nru;s{kUW(+yY{7#{2Ey1Lz3{~

yaGs)@|$f;mB@Kv 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/assets/brand/skruhb-logo-white.svg b/apps/mobile/assets/brand/skruhb-logo-white.svg new file mode 100644 index 0000000..c6a42e5 --- /dev/null +++ b/apps/mobile/assets/brand/skruhb-logo-white.svg @@ -0,0 +1,2 @@ + + diff --git a/apps/mobile/assets/brand/skruhb-symbol-black.png b/apps/mobile/assets/brand/skruhb-symbol-black.png new file mode 100644 index 0000000000000000000000000000000000000000..51f6349fee9ecb1409a8aa58496385a1e0b5c177 GIT binary patch literal 3395 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/assets/brand/skruhb-symbol-black.svg b/apps/mobile/assets/brand/skruhb-symbol-black.svg new file mode 100644 index 0000000..d762896 --- /dev/null +++ b/apps/mobile/assets/brand/skruhb-symbol-black.svg @@ -0,0 +1,2 @@ + + diff --git a/apps/mobile/assets/brand/skruhb-symbol-brand.png b/apps/mobile/assets/brand/skruhb-symbol-brand.png new file mode 100644 index 0000000000000000000000000000000000000000..960f090e2928f723c6e437ced2d5bb1468ada10b GIT binary patch literal 7647 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 + diff --git a/apps/mobile/assets/brand/skruhb-symbol-white.png b/apps/mobile/assets/brand/skruhb-symbol-white.png new file mode 100644 index 0000000000000000000000000000000000000000..cac04884eb3d031d59c4bc3f5cd29fac78b2e4e6 GIT binary patch literal 3604 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 DhQQO@ literal 0 HcmV?d00001 diff --git a/apps/mobile/assets/brand/skruhb-symbol-white.svg b/apps/mobile/assets/brand/skruhb-symbol-white.svg new file mode 100644 index 0000000..948146f --- /dev/null +++ b/apps/mobile/assets/brand/skruhb-symbol-white.svg @@ -0,0 +1,2 @@ + + diff --git a/apps/mobile/assets/favicon.png b/apps/mobile/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..18349833894898c314f67037e8106a67224fdb83 GIT binary patch literal 1210 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json index 72f25d8..d508c80 100644 --- a/apps/mobile/eas.json +++ b/apps/mobile/eas.json @@ -7,7 +7,7 @@ "developmentClient": true, "distribution": "internal", "env": { - "EXPO_PUBLIC_API_URL": "https://api-shoeinn.mrwrite.dev", + "EXPO_PUBLIC_API_URL": "https://api.skruhb.com", "EXPO_PUBLIC_APP_ENV": "staging", "EXPO_PUBLIC_ENABLE_DEMO_LOGINS": "true" } @@ -18,17 +18,17 @@ "buildType": "apk" }, "env": { - "EXPO_PUBLIC_API_URL": "https://api-shoeinn.mrwrite.dev", + "EXPO_PUBLIC_API_URL": "https://api.skruhb.com", "EXPO_PUBLIC_APP_ENV": "staging", "EXPO_PUBLIC_ENABLE_DEMO_LOGINS": "true", "EXPO_PUBLIC_GOOGLE_MAPS_API_KEY": "AIzaSyBuGdJpuCV5rmcJQ_Hrg7Zkd0ajL6XUglw", - "EXPO_PUBLIC_MOBILE_REDIRECT_BASE": "shoeinn://payment-return", + "EXPO_PUBLIC_MOBILE_REDIRECT_BASE": "skruhb://payment-return", "EXPO_PUBLIC_DEMO_MARKET": "shelby" } }, "production": { "env": { - "EXPO_PUBLIC_API_URL": "https://api-shoeinn.mrwrite.dev", + "EXPO_PUBLIC_API_URL": "https://api.skruhb.com", "EXPO_PUBLIC_APP_ENV": "production", "EXPO_PUBLIC_ENABLE_DEMO_LOGINS": "false" } diff --git a/apps/mobile/package-lock.json b/apps/mobile/package-lock.json index f4de58e..2287aa8 100644 --- a/apps/mobile/package-lock.json +++ b/apps/mobile/package-lock.json @@ -1,11 +1,11 @@ { - "name": "shoeinn-mobile", + "name": "skruhb-mobile", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "shoeinn-mobile", + "name": "skruhb-mobile", "version": "1.0.0", "dependencies": { "@expo/metro-runtime": "~6.1.2", diff --git a/apps/mobile/package.json b/apps/mobile/package.json index fe91ed2..9bce047 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -1,5 +1,5 @@ { - "name": "shoeinn-mobile", + "name": "skruhb-mobile", "version": "1.0.0", "private": true, "main": "index.js", diff --git a/apps/mobile/src/__tests__/demoLogins.test.ts b/apps/mobile/src/__tests__/demoLogins.test.ts index cf2fbf5..0d66a5b 100644 --- a/apps/mobile/src/__tests__/demoLogins.test.ts +++ b/apps/mobile/src/__tests__/demoLogins.test.ts @@ -28,17 +28,17 @@ describe("demo login helpers", () => { expect(getDemoLoginAccounts("shelby")).toEqual([ { label: "Shelby Customer", - email: "customer@shoeinn.com", + email: "customer@skruhb.com", password: "Password1!", }, { label: "Shelby Provider", - email: "pelham.driver1@shoeinn.com", + email: "pelham.driver1@skruhb.com", password: "Password1!", }, { label: "Shelby Company Admin", - email: "pelham.admin@shoeinn.com", + email: "pelham.admin@skruhb.com", password: "Password1!", }, ]); @@ -56,17 +56,17 @@ describe("demo login helpers", () => { expect(getDemoLoginAccounts("mt_juliet")).toEqual([ { label: "Mt. Juliet Customer", - email: "customer.mtjuliet@shoeinn.demo", + email: "customer.mtjuliet@skruhb.demo", password: "Password123!", }, { label: "Mt. Juliet Provider", - email: "provider.mtjuliet@shoeinn.demo", + email: "provider.mtjuliet@skruhb.demo", password: "Password123!", }, { label: "Mt. Juliet Company Admin", - email: "admin.mtjuliet@shoeinn.demo", + email: "admin.mtjuliet@skruhb.demo", password: "Password123!", }, ]); diff --git a/apps/mobile/src/__tests__/servicesCache.test.ts b/apps/mobile/src/__tests__/servicesCache.test.ts index 79518b4..9fb9f45 100644 --- a/apps/mobile/src/__tests__/servicesCache.test.ts +++ b/apps/mobile/src/__tests__/servicesCache.test.ts @@ -16,7 +16,7 @@ describe('services cache hydration', () => { duration_min: 30, company: { id: 'company-1', - name: 'Shoe Inn', + name: 'Skruhb', city: 'Seattle', state: 'WA', }, diff --git a/apps/mobile/src/auth/demoLogins.ts b/apps/mobile/src/auth/demoLogins.ts index 50eba41..7e6b11f 100644 --- a/apps/mobile/src/auth/demoLogins.ts +++ b/apps/mobile/src/auth/demoLogins.ts @@ -15,17 +15,17 @@ export type DemoMarketDiscoveryLocation = { export const SHELBY_DEMO_ACCOUNTS: DemoLoginAccount[] = [ { label: "Shelby Customer", - email: "customer@shoeinn.com", + email: "customer@skruhb.com", password: "Password1!", }, { label: "Shelby Provider", - email: "pelham.driver1@shoeinn.com", + email: "pelham.driver1@skruhb.com", password: "Password1!", }, { label: "Shelby Company Admin", - email: "pelham.admin@shoeinn.com", + email: "pelham.admin@skruhb.com", password: "Password1!", }, ]; @@ -33,17 +33,17 @@ export const SHELBY_DEMO_ACCOUNTS: DemoLoginAccount[] = [ export const MT_JULIET_DEMO_ACCOUNTS: DemoLoginAccount[] = [ { label: "Mt. Juliet Customer", - email: "customer.mtjuliet@shoeinn.demo", + email: "customer.mtjuliet@skruhb.demo", password: "Password123!", }, { label: "Mt. Juliet Provider", - email: "provider.mtjuliet@shoeinn.demo", + email: "provider.mtjuliet@skruhb.demo", password: "Password123!", }, { label: "Mt. Juliet Company Admin", - email: "admin.mtjuliet@shoeinn.demo", + email: "admin.mtjuliet@skruhb.demo", password: "Password123!", }, ]; diff --git a/apps/mobile/src/components/AppHeader.tsx b/apps/mobile/src/components/AppHeader.tsx index 57cf90d..e998c1f 100644 --- a/apps/mobile/src/components/AppHeader.tsx +++ b/apps/mobile/src/components/AppHeader.tsx @@ -4,6 +4,7 @@ import { Ionicons } from "@expo/vector-icons"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useTheme } from "../theme/theme"; +import { Logo } from "./branding/Logo"; interface AppHeaderProps { title?: string; @@ -19,7 +20,7 @@ export function AppHeader({ title, locationLabel, onPressLocation, onPressNotifi return ( - {title ?? "Explore"} + {title === "Skruhb" ? : {title ?? "Explore"}} {locationLabel} diff --git a/apps/mobile/src/components/branding/Logo.test.tsx b/apps/mobile/src/components/branding/Logo.test.tsx new file mode 100644 index 0000000..a6079e8 --- /dev/null +++ b/apps/mobile/src/components/branding/Logo.test.tsx @@ -0,0 +1,25 @@ +import React from "react"; +// @ts-expect-error The current Jest renderer dependency does not ship TypeScript declarations. +import renderer, { act } from "react-test-renderer"; + +import { Logo } from "./Logo"; + +describe("Logo", () => { + it("exposes one useful accessible brand name", () => { + let tree: any; + act(() => { + tree = renderer.create(); + }); + + expect(tree!.root.findByProps({ accessibilityLabel: "Skruhb" })).toBeTruthy(); + }); + + it("can be marked decorative", () => { + let tree: any; + act(() => { + tree = renderer.create(); + }); + + expect(tree!.root.findByProps({ importantForAccessibility: "no" })).toBeTruthy(); + }); +}); diff --git a/apps/mobile/src/components/branding/Logo.tsx b/apps/mobile/src/components/branding/Logo.tsx new file mode 100644 index 0000000..6f14b43 --- /dev/null +++ b/apps/mobile/src/components/branding/Logo.tsx @@ -0,0 +1,51 @@ +import React from "react"; +import { Image, type ImageSourcePropType, type ImageStyle, type StyleProp } from "react-native"; + +export type LogoLayout = "horizontal" | "symbol"; +export type LogoTone = "brand" | "light" | "black"; + +interface LogoProps { + layout?: LogoLayout; + tone?: LogoTone; + size?: number; + decorative?: boolean; + style?: StyleProp; +} + +const sources: Record> = { + horizontal: { + brand: require("../../../assets/brand/skruhb-logo-deep.png"), + light: require("../../../assets/brand/skruhb-logo-white.png"), + black: require("../../../assets/brand/skruhb-logo-black.png"), + }, + symbol: { + brand: require("../../../assets/brand/skruhb-symbol-brand.png"), + light: require("../../../assets/brand/skruhb-symbol-white.png"), + black: require("../../../assets/brand/skruhb-symbol-black.png"), + }, +}; + +const HORIZONTAL_ASPECT_RATIO = 345 / 140; + +export function Logo({ + layout = "horizontal", + tone = "brand", + size = layout === "horizontal" ? 42 : 44, + decorative = false, + style, +}: LogoProps) { + const width = layout === "horizontal" ? size * HORIZONTAL_ASPECT_RATIO : size; + + return ( + + ); +} + +export default Logo; diff --git a/apps/mobile/src/components/rewardsCard.test.tsx b/apps/mobile/src/components/rewardsCard.test.tsx index 087c7c6..19eb7f8 100644 --- a/apps/mobile/src/components/rewardsCard.test.tsx +++ b/apps/mobile/src/components/rewardsCard.test.tsx @@ -19,12 +19,12 @@ describe("RewardsCard", () => { act(() => { tree = renderer.create( - , + , ); }); const output = JSON.stringify(tree?.toJSON()); - expect(output).toContain("ShoeInn Care Club"); + expect(output).toContain("Skruhb Care Club"); expect(output).toContain("Premium care, pickup, and delivery"); expect(output).toContain("Member"); }); diff --git a/apps/mobile/src/components/ui/RewardsCard.tsx b/apps/mobile/src/components/ui/RewardsCard.tsx index 52abf73..4a0b4d7 100644 --- a/apps/mobile/src/components/ui/RewardsCard.tsx +++ b/apps/mobile/src/components/ui/RewardsCard.tsx @@ -17,7 +17,7 @@ type RewardsCardProps = { * content. It does not imply new backend rewards behavior. */ export function RewardsCard({ - title = "ShoeInn Care Club", + title = "Skruhb Care Club", subtitle = "Premium care, pickup, and delivery", value = "Member", style, diff --git a/apps/mobile/src/content/brandCopy.ts b/apps/mobile/src/content/brandCopy.ts index 45546fd..47c6f55 100644 --- a/apps/mobile/src/content/brandCopy.ts +++ b/apps/mobile/src/content/brandCopy.ts @@ -1,5 +1,5 @@ export const brandCopy = { - appName: "ShoeInn", + appName: "Skruhb", marketplacePositioning: "Premium care, pickup, and delivery from trusted local teams.", homeTitle: "Book premium care services", homeSubtitle: "Browse trusted local care providers and schedule pickup in minutes.", diff --git a/apps/mobile/src/discovery/categoryDiscovery.test.ts b/apps/mobile/src/discovery/categoryDiscovery.test.ts index b726d24..721ce75 100644 --- a/apps/mobile/src/discovery/categoryDiscovery.test.ts +++ b/apps/mobile/src/discovery/categoryDiscovery.test.ts @@ -51,7 +51,7 @@ describe("category discovery helpers", () => { const companies: Company[] = [ { id: "company-shoes", - name: "ShoeInn", + name: "Skruhb", offered_categories: [{ id: "1", slug: "shoes", name: "Shoes", icon_key: "footprints" }], }, { diff --git a/apps/mobile/src/navigation/AuthGate.tsx b/apps/mobile/src/navigation/AuthGate.tsx index d4efe51..5a4615b 100644 --- a/apps/mobile/src/navigation/AuthGate.tsx +++ b/apps/mobile/src/navigation/AuthGate.tsx @@ -1,11 +1,12 @@ import React, { useEffect } from "react"; -import { ActivityIndicator, Linking, View } from "react-native"; +import { ActivityIndicator, Linking, StyleSheet, View } from "react-native"; import { NavigationContainer } from "@react-navigation/native"; import AuthStack from "./AuthStack"; import AppStack from "./AppStack"; import { navigateWhenReady, navigationRef } from "./rootNavigation"; import { useAuthStore } from "../state/authStore"; +import { Logo } from "../components/branding/Logo"; function normalizeIncomingPath(pathname: string, host: string): string { const trimmed = pathname.replace(/^\/+/, ""); @@ -77,9 +78,10 @@ export default function AuthGate() { if (loading) { return ( - + + ); } @@ -90,3 +92,13 @@ export default function AuthGate() { ); } + +const styles = StyleSheet.create({ + loading: { + flex: 1, + alignItems: "center", + justifyContent: "center", + gap: 20, + backgroundColor: "#F7F3EA", + }, +}); diff --git a/apps/mobile/src/screens/CustomerInfoScreen.tsx b/apps/mobile/src/screens/CustomerInfoScreen.tsx index 4d23845..d7be454 100644 --- a/apps/mobile/src/screens/CustomerInfoScreen.tsx +++ b/apps/mobile/src/screens/CustomerInfoScreen.tsx @@ -201,7 +201,7 @@ const CustomerInfoScreen: React.FC = ({ onConfirmed, onBack }) => { Cancel unpaid booking - After paying in Stripe Checkout, ShoeInn should reopen automatically when supported. If it does not, return to the app and check payment status. + After paying in Stripe Checkout, Skruhb should reopen automatically when supported. If it does not, return to the app and check payment status. ); diff --git a/apps/mobile/src/screens/auth/LoginScreen.tsx b/apps/mobile/src/screens/auth/LoginScreen.tsx index edd81b3..2442a0a 100644 --- a/apps/mobile/src/screens/auth/LoginScreen.tsx +++ b/apps/mobile/src/screens/auth/LoginScreen.tsx @@ -11,6 +11,7 @@ import { AppCard } from "../../components/AppCard"; import { AppScreen } from "../../components/AppScreen"; import { MediaPlaceholder } from "../../components/ui/MediaPlaceholder"; import { SectionHeader } from "../../components/SectionHeader"; +import { Logo } from "../../components/branding/Logo"; import { Text } from "../../components/ui/Text"; import { brandCopy } from "../../content/brandCopy"; import { AuthStackParamList } from "../../navigation/AuthStack"; @@ -24,7 +25,7 @@ export default function LoginScreen({ navigation }: Props) { const setAuth = useAuthStore((s) => s.setAuth); const rememberMe = useAuthStore((s) => s.rememberMe); const setRememberMe = useAuthStore((s) => s.setRememberMe); - const [email, setEmail] = useState("customer@shoeinn.com"); + const [email, setEmail] = useState("customer@skruhb.com"); const [password, setPassword] = useState("Password1!"); const [error, setError] = useState(null); const showDemoLogins = shouldShowDemoLogins(); @@ -50,9 +51,7 @@ export default function LoginScreen({ navigation }: Props) { - - - + Premium care @@ -60,9 +59,7 @@ export default function LoginScreen({ navigation }: Props) { - - {brandCopy.appName} - + {brandCopy.marketplacePositioning} @@ -79,7 +76,7 @@ export default function LoginScreen({ navigation }: Props) { @@ -223,14 +220,6 @@ const styles = StyleSheet.create({ hero: { gap: 8, }, - logoMark: { - width: 52, - height: 52, - borderRadius: 20, - borderWidth: 1, - alignItems: "center", - justifyContent: "center", - }, brandPill: { minHeight: 32, borderRadius: 999, diff --git a/apps/mobile/src/screens/auth/RegisterScreen.tsx b/apps/mobile/src/screens/auth/RegisterScreen.tsx index 69498e8..70594b3 100644 --- a/apps/mobile/src/screens/auth/RegisterScreen.tsx +++ b/apps/mobile/src/screens/auth/RegisterScreen.tsx @@ -15,6 +15,7 @@ import { useMutation } from "@tanstack/react-query"; import { SafeAreaView } from "react-native-safe-area-context"; import { login, register } from "../../api/http"; +import { Logo } from "../../components/branding/Logo"; import { AuthStackParamList } from "../../navigation/AuthStack"; import { useAuthStore } from "../../state/authStore"; @@ -50,8 +51,9 @@ export default function RegisterScreen({ navigation }: Props) { style={styles.flex} > + Create an account - Start booking clean kicks + Run your care from one connected place {error ? {error} : null} @@ -107,8 +109,9 @@ export default function RegisterScreen({ navigation }: Props) { const styles = StyleSheet.create({ flex: { flex: 1 }, - safeArea: { flex: 1, backgroundColor: "#f3f4f6" }, + safeArea: { flex: 1, backgroundColor: "#F7F3EA" }, container: { padding: 24, gap: 12 }, + logo: { marginBottom: 12 }, title: { fontSize: 28, fontWeight: "700", marginTop: 12 }, subtitle: { fontSize: 16, color: "#4b5563" }, field: { gap: 4 }, diff --git a/apps/mobile/src/screens/company/ProviderDashboardScreen.tsx b/apps/mobile/src/screens/company/ProviderDashboardScreen.tsx index d8413ac..cf0c186 100644 --- a/apps/mobile/src/screens/company/ProviderDashboardScreen.tsx +++ b/apps/mobile/src/screens/company/ProviderDashboardScreen.tsx @@ -5,6 +5,7 @@ import { useQuery } from "@tanstack/react-query"; import { SafeAreaView } from "react-native-safe-area-context"; import { fetchOpenAppointments } from "../../api/http"; +import { Logo } from "../../components/branding/Logo"; import { CompanyStackParamList } from "../../navigation/CompanyStack"; import { useAuthStore } from "../../state/authStore"; import type { ProviderAppointment } from "../../types/company"; @@ -41,7 +42,10 @@ export default function ProviderDashboardScreen({ navigation }: Props) { return ( - Provider dashboard + + + Provider dashboard + navigation.navigate("Notifications")} style={styles.linkButton}> 🔔 @@ -81,7 +85,8 @@ const styles = StyleSheet.create({ justifyContent: "space-between", alignItems: "center", }, - headerTitle: { fontSize: 20, fontWeight: "700" }, + headerBrand: { gap: 2 }, + headerSubtitle: { color: "#596568", fontSize: 12, fontWeight: "600" }, headerActions: { flexDirection: "row", alignItems: "center", columnGap: 12 }, linkButton: { paddingHorizontal: 6, paddingVertical: 4 }, linkText: { color: "#1d4ed8", fontWeight: "600", fontSize: 16 }, diff --git a/apps/mobile/src/screens/customer/AppointmentDetailScreen.tsx b/apps/mobile/src/screens/customer/AppointmentDetailScreen.tsx index 2361fda..acca587 100644 --- a/apps/mobile/src/screens/customer/AppointmentDetailScreen.tsx +++ b/apps/mobile/src/screens/customer/AppointmentDetailScreen.tsx @@ -246,7 +246,7 @@ export default function AppointmentDetailScreen({ route }: Props) { Alert.alert( "Payment submitted", - latest.payment_message ?? "We returned to ShoeInn, but Stripe has not marked this payment complete yet. You can refresh again if needed.", + latest.payment_message ?? "We returned to Skruhb, but Stripe has not marked this payment complete yet. You can refresh again if needed.", ); } catch (error: any) { Alert.alert("Unable to refresh payment", error?.message ?? "Please try again."); diff --git a/apps/mobile/src/screens/customer/CustomerHomeScreen.tsx b/apps/mobile/src/screens/customer/CustomerHomeScreen.tsx index 68c26f6..00eafe3 100644 --- a/apps/mobile/src/screens/customer/CustomerHomeScreen.tsx +++ b/apps/mobile/src/screens/customer/CustomerHomeScreen.tsx @@ -37,7 +37,7 @@ export default function CustomerHomeScreen() { return ( - + diff --git a/apps/mobile/src/screens/home/BookingDateScreen.tsx b/apps/mobile/src/screens/home/BookingDateScreen.tsx index da5d379..9037a6b 100644 --- a/apps/mobile/src/screens/home/BookingDateScreen.tsx +++ b/apps/mobile/src/screens/home/BookingDateScreen.tsx @@ -5,6 +5,7 @@ import { RouteProp, useNavigation, useRoute } from "@react-navigation/native"; import type { NativeStackNavigationProp } from "@react-navigation/native-stack"; import { AppScreen } from "../../components/ui/AppScreen"; +import { Logo } from "../../components/branding/Logo"; import { Button } from "../../components/ui/Button"; import { Card, PressableCard } from "../../components/ui/Card"; import { MediaPlaceholder } from "../../components/ui/MediaPlaceholder"; @@ -245,12 +246,7 @@ function BookingTopBar({ onBack, onClose }: { onBack: () => void; onClose: () => - - - ShoeInn - - - + Premium Care Marketplace diff --git a/apps/mobile/src/screens/home/BookingTimeScreen.tsx b/apps/mobile/src/screens/home/BookingTimeScreen.tsx index 12ec1ed..b02cc14 100644 --- a/apps/mobile/src/screens/home/BookingTimeScreen.tsx +++ b/apps/mobile/src/screens/home/BookingTimeScreen.tsx @@ -6,6 +6,7 @@ import type { NativeStackNavigationProp } from "@react-navigation/native-stack"; import { useQuery } from "@tanstack/react-query"; import { getAvailability } from "../../api/http"; +import { Logo } from "../../components/branding/Logo"; import { AppScreen } from "../../components/ui/AppScreen"; import { Button } from "../../components/ui/Button"; import { Card, PressableCard } from "../../components/ui/Card"; @@ -184,12 +185,7 @@ function BookingTopBar({ onBack }: { onBack: () => void }) { - - - ShoeInn - - - + Premium Care Marketplace @@ -319,7 +315,7 @@ function ServiceDetailsCard({ })} /> - + ); diff --git a/apps/mobile/src/screens/home/HomeScreen.test.tsx b/apps/mobile/src/screens/home/HomeScreen.test.tsx index a062d02..6063194 100644 --- a/apps/mobile/src/screens/home/HomeScreen.test.tsx +++ b/apps/mobile/src/screens/home/HomeScreen.test.tsx @@ -167,7 +167,7 @@ describe("HomeScreen", () => { const tree = renderComponent(); const output = JSON.stringify(tree.toJSON()); - expect(output).toContain("ShoeInn"); + expect(output).toContain("Skruhb"); expect(output).toContain("Good Morning, "); expect(output).toContain("Anthony"); expect(output).toContain("What needs care today?"); diff --git a/apps/mobile/src/screens/home/HomeScreen.tsx b/apps/mobile/src/screens/home/HomeScreen.tsx index 3281fcc..b3208e3 100644 --- a/apps/mobile/src/screens/home/HomeScreen.tsx +++ b/apps/mobile/src/screens/home/HomeScreen.tsx @@ -9,6 +9,7 @@ import { LinearGradient } from "expo-linear-gradient"; import { getAppointmentAssignment, getMyAppointments, listCareCategories, listCompanies } from "../../api/http"; import { getDemoMarketDiscoveryLocation, shouldShowDemoLogins } from "../../auth/demoLogins"; import { ProviderCard } from "../../components/ProviderCard"; +import { Logo } from "../../components/branding/Logo"; import { AppScreen } from "../../components/ui/AppScreen"; import { Button } from "../../components/ui/Button"; import { CategoryTile } from "../../components/ui/CategoryTile"; @@ -20,7 +21,6 @@ import { SectionHeader } from "../../components/ui/SectionHeader"; import { SearchBar } from "../../components/ui/SearchBar"; import { StatusBadge, AppointmentStatusBadge } from "../../components/ui/StatusBadge"; import { Text } from "../../components/ui/Text"; -import { brandCopy } from "../../content/brandCopy"; import { filterCompaniesByCategory, getCategoryEmptyMessage, @@ -230,12 +230,7 @@ export default function HomeScreen() { - - - {brandCopy.appName} - - - + PREMIUM CARE MARKETPLACE diff --git a/apps/mobile/src/screens/profile/ProfileScreen.tsx b/apps/mobile/src/screens/profile/ProfileScreen.tsx index fad5f99..d7ea700 100644 --- a/apps/mobile/src/screens/profile/ProfileScreen.tsx +++ b/apps/mobile/src/screens/profile/ProfileScreen.tsx @@ -139,7 +139,7 @@ export default function ProfileScreen() { /> diff --git a/apps/mobile/src/screens/provider/ProviderDashboardScreen.tsx b/apps/mobile/src/screens/provider/ProviderDashboardScreen.tsx index 9039391..00e09d1 100644 --- a/apps/mobile/src/screens/provider/ProviderDashboardScreen.tsx +++ b/apps/mobile/src/screens/provider/ProviderDashboardScreen.tsx @@ -7,6 +7,7 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { claimAppointment, fetchMyAppointments, fetchOpenAppointments } from "../../api/http"; import { AppointmentCard } from "../../components/AppointmentCard"; +import { Logo } from "../../components/branding/Logo"; import { AppCard } from "../../components/AppCard"; import { AppScreen } from "../../components/ui/AppScreen"; import { Button } from "../../components/ui/Button"; @@ -110,12 +111,7 @@ export default function ProviderDashboardScreen() { - - - ShoeInn - - - + PROVIDER DISPATCH diff --git a/apps/mobile/src/theme/theme.ts b/apps/mobile/src/theme/theme.ts index d2eb3e2..178a364 100644 --- a/apps/mobile/src/theme/theme.ts +++ b/apps/mobile/src/theme/theme.ts @@ -1,11 +1,11 @@ import { StyleSheet, type TextStyle, type ViewStyle } from "react-native"; const palette = { - ink900: "#1B1E24", + ink900: "#172126", ink700: "#3B424C", ink500: "#6F7782", ink300: "#9BA3AD", - porcelain: "#FAF8F4", + porcelain: "#F7F3EA", cream: "#F8F5EF", white: "#FFFFFF", linen: "#F3EDE3", @@ -14,8 +14,8 @@ const palette = { border: "#E5DACE", borderSoft: "#EFE7DC", divider: "#EEE4D8", - peacock: "#0B5563", - peacockPressed: "#083F4A", + peacock: "#062E37", + peacockPressed: "#041F25", teal: "#117B7C", mint: "#CFE9E5", gold: "#D6A73D", @@ -202,28 +202,28 @@ export const textStyles = StyleSheet.create({ export const shadows = { card: { - shadowColor: "#1B1E24", + shadowColor: "#172126", shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.07, shadowRadius: 22, elevation: 3, } satisfies ViewStyle, floating: { - shadowColor: "#1B1E24", + shadowColor: "#172126", shadowOffset: { width: 0, height: 16 }, shadowOpacity: 0.12, shadowRadius: 32, elevation: 7, } satisfies ViewStyle, modal: { - shadowColor: "#1B1E24", + shadowColor: "#172126", shadowOffset: { width: 0, height: 18 }, shadowOpacity: 0.16, shadowRadius: 40, elevation: 10, } satisfies ViewStyle, soft: { - shadowColor: "#1B1E24", + shadowColor: "#172126", shadowOffset: { width: 0, height: 6 }, shadowOpacity: 0.05, shadowRadius: 16, diff --git a/apps/payment/README.md b/apps/payment/README.md index 42afa0c..e55e7d6 100644 --- a/apps/payment/README.md +++ b/apps/payment/README.md @@ -1,4 +1,4 @@ -# ShoeInn Payment Service +# Skruhb Payment Service Optional FastAPI service that owns Stripe Checkout/PaymentIntent integration, payment records, Stripe webhook reconciliation, and payment-domain outbox rows. @@ -67,7 +67,7 @@ Set in `apps/api/.env`: ```env PAYMENT_MODE=service PAYMENT_SERVICE_BASE_URL=http://localhost:8001 -PAYMENT_MOBILE_REDIRECT_BASE=shoeinn://app +PAYMENT_MOBILE_REDIRECT_BASE=skruhb://app ``` For Expo Go: @@ -79,7 +79,7 @@ PAYMENT_MOBILE_REDIRECT_BASE=exp://:8081/-- Then start the API: ```powershell -.\scripts\start-api.ps1 -PaymentMode service -MobileRedirectBase "shoeinn://app" +.\scripts\start-api.ps1 -PaymentMode service -MobileRedirectBase "skruhb://app" ``` ## Stripe Webhooks @@ -112,7 +112,7 @@ Payment tests set in-memory SQLite and test Stripe env defaults in `tests/confte - The payment service creates tables at startup with SQLAlchemy metadata; there is no Alembic migration track in `apps/payment`. - Outbox rows are persisted, but no local broker publisher is implemented in this repository. -- Checkout can reuse Stripe Customers and eligible saved cards, but ShoeInn does not provide a separate card-management UI. +- Checkout can reuse Stripe Customers and eligible saved cards, but Skruhb does not provide a separate card-management UI. - Refund/dispute side effects are represented through payment state and compensating-action events; production support workflows remain future work. ## More Documentation diff --git a/apps/payment/pyproject.toml b/apps/payment/pyproject.toml index 235f8e4..48e78fd 100644 --- a/apps/payment/pyproject.toml +++ b/apps/payment/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "shoeinn-payment" +name = "skruhb-payment" version = "0.1.0" requires-python = ">=3.11" dependencies = [ diff --git a/brand/README.md b/brand/README.md new file mode 100644 index 0000000..1e843d2 --- /dev/null +++ b/brand/README.md @@ -0,0 +1,12 @@ +# Skruhb brand assets + +The production identity is concept 45, **Compact SK ligature**, from Figma node `11:384` in the Skruhb logo exploration file. + +- `source/` preserves the exact SVG exports used to extract the approved outlined paths. +- `svg/skruhb-logo-deep.svg` is the primary horizontal lockup for light backgrounds. +- `svg/skruhb-logo-white.svg` is the horizontal lockup for dark backgrounds. +- `svg/skruhb-logo-black.svg` is the pure-black horizontal lockup. +- `svg/skruhb-symbol-*.svg` contains symbol-only variants for compact placements. +- `svg/skruhb-app-icon.svg` contains the deep blue-green rounded-square treatment with the white ligature and warm-gold shared spine. + +All production SVGs use outlined paths and editable vector geometry; they contain no text nodes or font dependencies. Preserve their intrinsic aspect ratios, do not recolor them outside the approved palette, and provide layout clear space rather than cropping their view boxes. diff --git a/brand/source/concept45-brand-figma.svg b/brand/source/concept45-brand-figma.svg new file mode 100644 index 0000000..b5d1b32 --- /dev/null +++ b/brand/source/concept45-brand-figma.svg @@ -0,0 +1,18 @@ + + + + diff --git a/brand/source/concept45-lockup-figma.svg b/brand/source/concept45-lockup-figma.svg new file mode 100644 index 0000000..7ae88d4 --- /dev/null +++ b/brand/source/concept45-lockup-figma.svg @@ -0,0 +1,19 @@ + + + + diff --git a/brand/source/concept45-symbol-figma.svg b/brand/source/concept45-symbol-figma.svg new file mode 100644 index 0000000..ed4874c --- /dev/null +++ b/brand/source/concept45-symbol-figma.svg @@ -0,0 +1,18 @@ + + + + diff --git a/brand/source/concept45-wordmark-figma.svg b/brand/source/concept45-wordmark-figma.svg new file mode 100644 index 0000000..266e36f --- /dev/null +++ b/brand/source/concept45-wordmark-figma.svg @@ -0,0 +1,14 @@ + + + + diff --git a/brand/svg/skruhb-app-icon.svg b/brand/svg/skruhb-app-icon.svg new file mode 100644 index 0000000..b79b91a --- /dev/null +++ b/brand/svg/skruhb-app-icon.svg @@ -0,0 +1,2 @@ + + diff --git a/brand/svg/skruhb-logo-black.svg b/brand/svg/skruhb-logo-black.svg new file mode 100644 index 0000000..4277aa7 --- /dev/null +++ b/brand/svg/skruhb-logo-black.svg @@ -0,0 +1,2 @@ + + diff --git a/brand/svg/skruhb-logo-deep.svg b/brand/svg/skruhb-logo-deep.svg new file mode 100644 index 0000000..dca3c1e --- /dev/null +++ b/brand/svg/skruhb-logo-deep.svg @@ -0,0 +1,2 @@ + + diff --git a/brand/svg/skruhb-logo-white.svg b/brand/svg/skruhb-logo-white.svg new file mode 100644 index 0000000..c6a42e5 --- /dev/null +++ b/brand/svg/skruhb-logo-white.svg @@ -0,0 +1,2 @@ + + diff --git a/brand/svg/skruhb-symbol-black.svg b/brand/svg/skruhb-symbol-black.svg new file mode 100644 index 0000000..d762896 --- /dev/null +++ b/brand/svg/skruhb-symbol-black.svg @@ -0,0 +1,2 @@ + + diff --git a/brand/svg/skruhb-symbol-brand.svg b/brand/svg/skruhb-symbol-brand.svg new file mode 100644 index 0000000..fe73189 --- /dev/null +++ b/brand/svg/skruhb-symbol-brand.svg @@ -0,0 +1,2 @@ + + diff --git a/brand/svg/skruhb-symbol-white.svg b/brand/svg/skruhb-symbol-white.svg new file mode 100644 index 0000000..948146f --- /dev/null +++ b/brand/svg/skruhb-symbol-white.svg @@ -0,0 +1,2 @@ + + diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md index a966d38..fd55048 100644 --- a/docs/architecture/overview.md +++ b/docs/architecture/overview.md @@ -1,6 +1,6 @@ -# ShoeInn Architecture Overview +# Skruhb Architecture Overview -ShoeInn is a premium care marketplace demo composed of: +Skruhb is a premium care marketplace demo composed of: - React Native Mobile App - FastAPI Backend API @@ -102,4 +102,3 @@ flowchart LR - [Environment reference](../environment.md) - [Getting started](../getting-started.md) - [Troubleshooting](../troubleshooting.md) - diff --git a/docs/architecture/payment.md b/docs/architecture/payment.md index 907e504..1eb4ed7 100644 --- a/docs/architecture/payment.md +++ b/docs/architecture/payment.md @@ -37,7 +37,7 @@ API service mode: ```env PAYMENT_MODE=service PAYMENT_SERVICE_BASE_URL=http://localhost:8001 -PAYMENT_MOBILE_REDIRECT_BASE=shoeinn://app +PAYMENT_MOBILE_REDIRECT_BASE=skruhb://app ``` ## Webhooks @@ -60,4 +60,3 @@ stripe listen --forward-to http://localhost:8001/payments/webhooks/stripe - No local broker publisher for payment outbox rows. - No separate card-management UI. - Refund/dispute support exists at state/event level but production support workflows are future work. - diff --git a/docs/environment.md b/docs/environment.md index 1a9c69f..3797f56 100644 --- a/docs/environment.md +++ b/docs/environment.md @@ -26,7 +26,7 @@ Read by `apps/api/app/core/config.py`. | `PAYMENT_SERVICE_BASE_URL` | Required for service mode | blank | `http://localhost:8001` | Payment service base URL. | | `PAYMENT_CHECKOUT_SUCCESS_URL` / `PAYMENT_SUCCESS_URL` | Optional | blank | `https://api.example.com/payments/return/success` | Browser success return URL alias. | | `PAYMENT_CHECKOUT_CANCEL_URL` / `PAYMENT_CANCEL_URL` | Optional | blank | `https://api.example.com/payments/return/cancel` | Browser cancel return URL alias. | -| `PAYMENT_MOBILE_REDIRECT_BASE` | Required for service mobile return path | blank | `shoeinn://app` | Mobile/frontend redirect base. Aliases: `PAYMENT_SUCCESS_URL_BASE`, `PAYMENT_RETURN_APP_URL`. | +| `PAYMENT_MOBILE_REDIRECT_BASE` | Required for service mobile return path | blank | `skruhb://app` | Mobile/frontend redirect base. Aliases: `PAYMENT_SUCCESS_URL_BASE`, `PAYMENT_RETURN_APP_URL`. | | `PAYMENT_SERVICE_TIMEOUT_SECONDS` | No | `10.0` | `10` | Timeout for payment-service calls. | | `PAYMENT_CURRENCY` | No | `usd` | `usd` | Default payment currency. | | `ENABLE_PAYMENT_SYNC_WORKER` | No | `true` | `true` | Starts payment sync worker when service mode is configured. | @@ -45,8 +45,8 @@ Read by `apps/mobile/app.config.ts`, `src/api/http.ts`, `src/api/services.ts`, d | `SHOW_DEMO_LOGINS` | No | `false` | `true` | Non-public fallback read by app config. | | `EXPO_PUBLIC_DEMO_MARKET` | No | `shelby` | `mt_juliet` | Demo login/market selector. | | `EXPO_PUBLIC_GOOGLE_MAPS_API_KEY` | Optional | none | `AIza...` | Enables Google Directions API route line, ETA, distance, and native map API keys. | -| `EXPO_PUBLIC_MOBILE_REDIRECT_BASE` | Required for service payment return | none | `shoeinn://app` | Mobile return base for Stripe Checkout. | -| `EXPO_PUBLIC_APP_URL` | Optional alias | none | `shoeinn://app` | Alias for mobile redirect base. | +| `EXPO_PUBLIC_MOBILE_REDIRECT_BASE` | Required for service payment return | none | `skruhb://app` | Mobile return base for Stripe Checkout. | +| `EXPO_PUBLIC_APP_URL` | Optional alias | none | `skruhb://app` | Alias for mobile redirect base. | ## Payment Service @@ -64,4 +64,3 @@ Read by `apps/payment/app/config.py`. | `BOOKING_API_WEBHOOK_SECRET` | No | none | `replace-me` | Optional callback header secret. | | `DEFAULT_CURRENCY` | No | `usd` | `usd` | Payment default currency. | | `PAYMENT_ALLOW_TEST_CLOCK` | No | `true` | `true` | Allows Stripe test clock behavior in non-production testing. | - diff --git a/docs/getting-started.md b/docs/getting-started.md index 637945d..dc0198e 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -92,16 +92,16 @@ The helper script can do the same setup: Shelby County demo, password `Password1!`: -- Customer: `customer@shoeinn.com` -- Provider: `pelham.driver1@shoeinn.com` -- Company admin: `pelham.admin@shoeinn.com` -- Global admin: `admin@shoeinn.com` +- Customer: `customer@skruhb.com` +- Provider: `pelham.driver1@skruhb.com` +- Company admin: `pelham.admin@skruhb.com` +- Global admin: `admin@skruhb.com` Mt. Juliet demo, password `Password123!`: -- Customer: `customer.mtjuliet@shoeinn.demo` -- Provider: `provider.mtjuliet@shoeinn.demo` -- Company admin: `admin.mtjuliet@shoeinn.demo` +- Customer: `customer.mtjuliet@skruhb.demo` +- Provider: `provider.mtjuliet@skruhb.demo` +- Company admin: `admin.mtjuliet@skruhb.demo` To show demo login buttons: @@ -148,10 +148,10 @@ Company admin: 3. Start API in service mode: ```powershell -.\scripts\start-api.ps1 -PaymentMode service -MobileRedirectBase "shoeinn://app" +.\scripts\start-api.ps1 -PaymentMode service -MobileRedirectBase "skruhb://app" ``` -4. Start mobile with `EXPO_PUBLIC_MOBILE_REDIRECT_BASE=shoeinn://app` for a dev build, or an `exp://.../--` URL for Expo Go. +4. Start mobile with `EXPO_PUBLIC_MOBILE_REDIRECT_BASE=skruhb://app` for a dev build, or an `exp://.../--` URL for Expo Go. ## 8. Validate Before Making Changes @@ -178,4 +178,3 @@ cd .\apps\payment .\.venv\Scripts\Activate.ps1 python -m pytest tests -q ``` - diff --git a/docs/staging.md b/docs/staging.md index dbd89ba..fda30d1 100644 --- a/docs/staging.md +++ b/docs/staging.md @@ -1,6 +1,6 @@ # Staging Runbook -This runbook describes the current Docker Compose staging slice for ShoeInn. +This runbook describes the current Docker Compose staging slice for Skruhb. ## Scope @@ -96,7 +96,7 @@ Critical values: EXPO_PUBLIC_API_URL=https://api-staging.example.com EXPO_PUBLIC_API_BASE_URL=https://api-staging.example.com EXPO_PUBLIC_ENABLE_DEMO_LOGINS=true -EXPO_PUBLIC_MOBILE_REDIRECT_BASE=shoeinn://payment-return +EXPO_PUBLIC_MOBILE_REDIRECT_BASE=skruhb://payment-return ``` Do not point staging mobile builds at localhost. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 2dfb446..78d8f06 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -54,7 +54,7 @@ If native config changed, rebuild the dev client instead of relying on Expo Go. - Run `npx eas credentials`. - Regenerate credentials only if the existing profile/certificate is invalid. -- Make sure the bundle identifier remains `com.mrwrite.shoeinn`. +- Make sure the bundle identifier remains `com.mrwrite.skruhb`. ## Maps diff --git a/scripts/start-api.ps1 b/scripts/start-api.ps1 index 4c87d43..b3c38cd 100644 --- a/scripts/start-api.ps1 +++ b/scripts/start-api.ps1 @@ -131,7 +131,7 @@ try { $effectivePaymentServiceBaseUrl = "http://localhost:8001" } if (-not $effectiveMobileRedirectBase) { - throw "PAYMENT_MODE=service requires -MobileRedirectBase, for example exp://:8081/-- for Expo Go or shoeinn://app for a dev build." + throw "PAYMENT_MODE=service requires -MobileRedirectBase, for example exp://:8081/-- for Expo Go or skruhb://app for a dev build." } try { Invoke-RestMethod "$($effectivePaymentServiceBaseUrl.TrimEnd('/'))/health" | Out-Null diff --git a/scripts/start-mobile.ps1 b/scripts/start-mobile.ps1 index ce3fb48..645e46d 100644 --- a/scripts/start-mobile.ps1 +++ b/scripts/start-mobile.ps1 @@ -49,7 +49,7 @@ try { $apiPort = ([uri]$ApiBaseUrl).Port } catch { } - throw "Could not reach the ShoeInn API at $healthUrl. Check the API window for startup errors, confirm the API is running on port $apiPort, verify the LAN IP in -ApiBaseUrl, and confirm Windows Firewall allows inbound connections." + throw "Could not reach the Skruhb API at $healthUrl. Check the API window for startup errors, confirm the API is running on port $apiPort, verify the LAN IP in -ApiBaseUrl, and confirm Windows Firewall allows inbound connections." } if ($ExpectedPaymentMode) {