From e2172c20f26cfc223da458b10b89e9ef5aa3dd6a Mon Sep 17 00:00:00 2001 From: Trey t Date: Sat, 7 Mar 2026 06:33:59 -0600 Subject: [PATCH] Rebrand from Casera/MyCrib to honeyDue Total rebrand across Web project: - Package name: casera-web -> honeydue-web - Cookie: casera-token -> honeydue-token - Theme store: casera-theme -> honeydue-theme - File sharing: .casera -> .honeydue, component/function renames - casera-file-handler.tsx -> honeydue-file-handler.tsx - All UI text, metadata, OG tags updated - Domains: casera.treytartt.com -> honeyDue.treytartt.com - Demo data emails updated - All documentation updated Co-Authored-By: Claude Opus 4.6 --- CHECKS | 2 +- CLAUDE.md | 12 ++--- README.md | 6 +-- docs/00-overview.md | 10 ++-- docs/01-foundation.md | 14 +++--- docs/03-advanced-features.md | 22 ++++----- docs/04-demo-mode.md | 4 +- docs/05-polish-deploy.md | 22 ++++----- docs/plans/2026-03-02-core-crud.md | 14 +++--- docs/plans/2026-03-03-advanced-features.md | 46 +++++++++--------- next.config.ts | 2 +- package-lock.json | 4 +- package.json | 2 +- src/app/(auth)/layout.tsx | 6 +-- src/app/(auth)/register/page.tsx | 2 +- src/app/api/auth/login/route.ts | 4 +- src/app/api/auth/logout/route.ts | 4 +- src/app/api/auth/me/route.ts | 4 +- src/app/api/proxy/[...path]/route.ts | 8 +-- src/app/app/contractors/[id]/page.tsx | 6 +-- src/app/app/contractors/page.tsx | 14 +++--- src/app/app/page.tsx | 2 +- src/app/app/residences/[id]/share/page.tsx | 12 ++--- src/app/app/residences/join/page.tsx | 10 ++-- src/app/demo/layout.tsx | 8 +-- src/app/demo/page.tsx | 6 +-- src/app/favicon.ico | Bin 25931 -> 1592 bytes src/app/layout.tsx | 10 ++-- src/app/onboarding/layout.tsx | 2 +- src/app/page.tsx | 12 ++--- src/app/subscription/success/page.tsx | 2 +- src/components/demo/demo-banner.tsx | 2 +- src/components/forms/auth-form-wrapper.tsx | 4 +- src/components/layout/sidebar.tsx | 4 +- src/components/layout/top-bar.tsx | 4 +- src/components/onboarding/welcome-step.tsx | 4 +- src/components/shared/upgrade-prompt.tsx | 2 +- ...-handler.tsx => honeydue-file-handler.tsx} | 20 ++++---- src/lib/api/client.ts | 10 ++-- src/lib/api/index.ts | 2 +- src/lib/demo/demo-provider.ts | 4 +- src/lib/demo/mock-data/notifications.ts | 2 +- src/lib/demo/mock-data/user.ts | 2 +- src/lib/themes/theme-config.ts | 2 +- src/lib/types/api.ts | 2 +- src/lib/types/auth.ts | 4 +- src/lib/types/contractor.ts | 4 +- src/lib/types/document.ts | 6 +-- src/lib/types/lookups.ts | 10 ++-- src/lib/types/notification.ts | 4 +- src/lib/types/residence.ts | 4 +- src/lib/types/subscription.ts | 4 +- src/lib/types/task-template.ts | 2 +- src/lib/types/task.ts | 4 +- src/middleware.ts | 2 +- src/stores/theme.ts | 2 +- src/styles/themes.css | 2 +- 57 files changed, 192 insertions(+), 192 deletions(-) rename src/components/sharing/{casera-file-handler.tsx => honeydue-file-handler.tsx} (84%) diff --git a/CHECKS b/CHECKS index cb04103..a8bbcbd 100644 --- a/CHECKS +++ b/CHECKS @@ -1,3 +1,3 @@ WAIT=10 ATTEMPTS=6 -/ Casera +/ honeyDue diff --git a/CLAUDE.md b/CLAUDE.md index 25e9099..0b8b92d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ -# Casera Web (`myCribAPI-Web`) +# honeyDue Web (`honeyDueAPI-Web`) -Next.js web client for the Casera property management platform. Talks to the Go REST API backend. +Next.js web client for the honeyDue property management platform. Talks to the Go REST API backend. ## Build & Run @@ -32,10 +32,10 @@ npm run analyze # Bundle analysis ``` Browser → Next.js page (client component) → apiFetch("/tasks/") → /api/proxy/tasks (Next.js route handler) - → Go API (reads casera-token httpOnly cookie, forwards as Authorization header) + → Go API (reads honeydue-token httpOnly cookie, forwards as Authorization header) ``` -Auth tokens are stored as httpOnly cookies (`casera-token`), never exposed to JS. The Next.js `/api/proxy/[...path]` catch-all route forwards requests to the Go API. +Auth tokens are stored as httpOnly cookies (`honeydue-token`), never exposed to JS. The Next.js `/api/proxy/[...path]` catch-all route forwards requests to the Go API. ### Directory Structure @@ -103,7 +103,7 @@ src/ **Kanban boards**: Tasks display in kanban columns (overdue, due_soon, in_progress, not_started, completed). Uses `@dnd-kit` for drag-and-drop. Column names match Go API: `overdue_tasks`, `due_soon_tasks`, `in_progress_tasks`, `not_started_tasks`, `completed_tasks`. -**Middleware** (`src/middleware.ts`): Checks `casera-token` cookie. Redirects unauthenticated users to `/login` for protected routes. Skips API routes, static files, and public paths. +**Middleware** (`src/middleware.ts`): Checks `honeydue-token` cookie. Redirects unauthenticated users to `/login` for protected routes. Skips API routes, static files, and public paths. ## Conventions @@ -123,7 +123,7 @@ src/ | Variable | Description | Default | |----------|-------------|---------| -| `NEXT_PUBLIC_API_URL` | Go API URL (client-side) | `https://casera.treytartt.com/api` | +| `NEXT_PUBLIC_API_URL` | Go API URL (client-side) | `https://honeyDue.treytartt.com/api` | | `API_URL` | Go API URL (server-side, no proxy) | Falls back to `NEXT_PUBLIC_API_URL` | | `NEXT_PUBLIC_POSTHOG_KEY` | PostHog analytics key | — | | `NEXT_PUBLIC_POSTHOG_HOST` | PostHog host | — | diff --git a/README.md b/README.md index 21d53a6..bfb98c8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Casera Web App +# honeyDue Web App -Next.js web client for the Casera property management platform. Connects to the [Go REST API](https://github.com/akatreyt/casera-api) backend. +Next.js web client for the honeyDue property management platform. Connects to the [Go REST API](https://github.com/akatreyt/honeydue-api) backend. ## Features @@ -50,7 +50,7 @@ Open [http://localhost:3000](http://localhost:3000). | Variable | Description | Required | |----------|-------------|----------| -| `NEXT_PUBLIC_API_URL` | Go API base URL (e.g. `https://casera.treytartt.com/api`) | Yes | +| `NEXT_PUBLIC_API_URL` | Go API base URL (e.g. `https://honeyDue.treytartt.com/api`) | Yes | | `API_URL` | Server-side API URL (defaults to `NEXT_PUBLIC_API_URL`) | No | | `NEXT_PUBLIC_POSTHOG_KEY` | PostHog project API key | No | | `NEXT_PUBLIC_POSTHOG_HOST` | PostHog instance URL | No | diff --git a/docs/00-overview.md b/docs/00-overview.md index 0b1353a..56ba436 100644 --- a/docs/00-overview.md +++ b/docs/00-overview.md @@ -1,8 +1,8 @@ -# Casera Web App — Build Plan Overview +# honeyDue Web App — Build Plan Overview ## What We're Building -Full parity web app for Casera: **46 screens**, **104 API operations**, **4 domains** (Residences, Tasks, Contractors, Documents), plus auth, onboarding, subscriptions, settings, and a **sandboxed demo mode** with mock data. +Full parity web app for honeyDue: **46 screens**, **104 API operations**, **4 domains** (Residences, Tasks, Contractors, Documents), plus auth, onboarding, subscriptions, settings, and a **sandboxed demo mode** with mock data. ## Tech Stack @@ -33,7 +33,7 @@ Full parity web app for Casera: **46 screens**, **104 API operations**, **4 doma ## Project Structure ``` -myCribAPI-Web/ +honeyDueAPI-Web/ ├── src/ │ ├── app/ # Next.js App Router │ │ ├── (marketing)/ # Public pages (landing, pricing) @@ -86,7 +86,7 @@ myCribAPI-Web/ |---|---| | Push notifications | Not needed (no push API for web in scope) | | Widgets | Not applicable | -| .casera file import/export | File download (export) + drag-and-drop or file picker (import) | +| .honeydue file import/export | File download (export) + drag-and-drop or file picker (import) | | Apple/Google Sign In | OAuth redirect flow (same backend endpoints) | | StoreKit subscription | Stripe Checkout or link to App Store (TBD) | | Camera capture | File upload input (no camera API needed) | @@ -112,4 +112,4 @@ myCribAPI-Web/ | Demo mode data isolation | No backend calls, purely client-side, session-scoped store, no persistence | | API compatibility | 100% same endpoints, same token format (`Token `), same request/response shapes | | Mobile feature gaps | Push notifications and widgets explicitly excluded. Everything else covered. | -| Deployment independence | Separate Dokku app, own domain (e.g., `app.casera.treytartt.com`), no coupling to Go API deployment | +| Deployment independence | Separate Dokku app, own domain (e.g., `app.honeydue.treytartt.com`), no coupling to Go API deployment | diff --git a/docs/01-foundation.md b/docs/01-foundation.md index c0a9467..4863363 100644 --- a/docs/01-foundation.md +++ b/docs/01-foundation.md @@ -18,8 +18,8 @@ Scaffold the project, wire up auth, build the app shell, and establish the desig ## 1. Project Scaffold ```bash -npx create-next-app@latest myCribAPI-Web --typescript --tailwind --eslint --app --src-dir -cd myCribAPI-Web +npx create-next-app@latest honeyDueAPI-Web --typescript --tailwind --eslint --app --src-dir +cd honeyDueAPI-Web npx shadcn@latest init ``` @@ -33,9 +33,9 @@ npm install -D vitest @playwright/test ## 2. TypeScript Types Generate TypeScript types matching the Go API DTOs. Source from: -- `myCribAPI-go/internal/dto/requests/` — request shapes -- `myCribAPI-go/internal/dto/responses/` — response shapes -- `myCribAPI-go/internal/models/` — entity shapes +- `honeyDueAPI-go/internal/dto/requests/` — request shapes +- `honeyDueAPI-go/internal/dto/responses/` — response shapes +- `honeyDueAPI-go/internal/models/` — entity shapes Key types to define in `src/lib/types/`: @@ -73,7 +73,7 @@ api/ ```typescript // src/lib/api/client.ts -const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'https://mycrib.treytartt.com/api'; +const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'https://honeyDue.treytartt.com/api'; async function apiFetch( path: string, @@ -225,7 +225,7 @@ Match the mobile app's theme system: | Desert | TBD | TBD | | Mint | TBD | TBD | -Theme values sourced from `MyCribKMM/composeApp/src/commonMain/.../ui/theme/ThemeColors.kt`. +Theme values sourced from `HoneyDueKMM/composeApp/src/commonMain/.../ui/theme/ThemeColors.kt`. ### Spacing diff --git a/docs/03-advanced-features.md b/docs/03-advanced-features.md index 25d2784..ae5eef4 100644 --- a/docs/03-advanced-features.md +++ b/docs/03-advanced-features.md @@ -4,8 +4,8 @@ Build sharing, subscriptions, notifications, profile, onboarding, and summary me ## Checklist -- [ ] Residence sharing: generate/display share code, join residence, manage users, .casera file export/import -- [ ] Contractor sharing: .casera file export/import +- [ ] Residence sharing: generate/display share code, join residence, manage users, .honeydue file export/import +- [ ] Contractor sharing: .honeydue file export/import - [ ] Subscription: status display, feature comparison, upgrade prompt, usage tracking - [ ] Notification preferences: toggle + time picker per notification type - [ ] Profile: edit name/email, change password, delete account @@ -22,7 +22,7 @@ Build sharing, subscriptions, notifications, profile, onboarding, and summary me | Route | Screen | Description | |-------|--------|-------------| | `/app/residences/[id]/share` | Share Residence | Generate/display share code, manage users | -| `/app/residences/join` | Join Residence | Enter share code or import .casera file | +| `/app/residences/join` | Join Residence | Enter share code or import .honeydue file | ### Share Code Flow @@ -35,15 +35,15 @@ Owner opens Share screen Invitee opens Join screen → Enter share code manually, OR - → Upload .casera file (drag-and-drop zone) + → Upload .honeydue file (drag-and-drop zone) → POST /api/residences/join/ { code: "ABC123" } → On success: redirect to residence detail ``` -### .casera File Handling +### .honeydue File Handling **Export** (owner): -- Button on residence detail: "Export as .casera" +- Button on residence detail: "Export as .honeydue" - Generates JSON file with `{ type: "residence", code: "ABC123", ... }` - Browser downloads the file @@ -73,7 +73,7 @@ Invitee opens Join screen ## 2. Contractor Sharing -### .casera File Export/Import +### .honeydue File Export/Import **Export**: - Button on contractor detail: "Share Contractor" @@ -82,7 +82,7 @@ Invitee opens Join screen **Import**: - Button on contractor list: "Import Contractor" -- File picker or drag-and-drop for .casera file +- File picker or drag-and-drop for .honeydue file - Read JSON, show confirmation dialog, create contractor - `POST /api/contractors/import/` @@ -123,7 +123,7 @@ Check tier limits before allowing creation: ### Upgrade Path (Phase 1) Web users are directed to the mobile app for purchases: -- "Download Casera on the App Store to upgrade" +- "Download honeyDue on the App Store to upgrade" - Link to App Store listing ### Upgrade Path (Future — Phase 2) @@ -215,7 +215,7 @@ Add Stripe Checkout for web-only subscription purchases. Requires backend work t ``` Step 1: Welcome - → "Welcome to Casera! Let's set up your first property." + → "Welcome to honeyDue! Let's set up your first property." Step 2: Choose Path → "Create a new residence" OR "Join an existing residence" @@ -300,7 +300,7 @@ Data sources: At the end of Phase 3, you should have: 1. Residence sharing with code generation, join flow, and user management -2. Contractor sharing via .casera files +2. Contractor sharing via .honeydue files 3. Subscription status with tier limits and upgrade prompts 4. Notification preferences with toggles 5. Profile editing (name, email, password, delete account) diff --git a/docs/04-demo-mode.md b/docs/04-demo-mode.md index bd9f45a..4dcb2cf 100644 --- a/docs/04-demo-mode.md +++ b/docs/04-demo-mode.md @@ -261,7 +261,7 @@ Persistent banner at the top of the demo app: ``` ┌─────────────────────────────────────────────────────────────────┐ -│ 🎯 You're exploring Casera in demo mode. [Sign Up Free] │ +│ 🎯 You're exploring honeyDue in demo mode. [Sign Up Free] │ │ Changes aren't saved. Create an account to get started! │ └─────────────────────────────────────────────────────────────────┘ ``` @@ -282,7 +282,7 @@ Before entering the demo, show a brief preview page: ``` ┌─────────────────────────────────────────────────────┐ │ │ -│ 🏠 Try Casera — No Account Needed │ +│ 🏠 Try honeyDue — No Account Needed │ │ │ │ Manage your home maintenance, track tasks, │ │ organize contractors, and store documents. │ diff --git a/docs/05-polish-deploy.md b/docs/05-polish-deploy.md index d9eb13e..2c6571a 100644 --- a/docs/05-polish-deploy.md +++ b/docs/05-polish-deploy.md @@ -162,7 +162,7 @@ const nextConfig = { output: 'standalone', // Required for Docker images: { remotePatterns: [ - { protocol: 'https', hostname: 'mycrib.treytartt.com' }, // API media + { protocol: 'https', hostname: 'honeyDue.treytartt.com' }, // API media ], }, }; @@ -171,14 +171,14 @@ const nextConfig = { ### Dokku Deployment ```bash -# On mycribDev server -dokku apps:create casera-web -dokku domains:add casera-web app.casera.treytartt.com -dokku config:set casera-web NEXT_PUBLIC_API_URL=https://mycrib.treytartt.com/api -dokku letsencrypt:enable casera-web +# On honeyDueDev server +dokku apps:create honeydue-web +dokku domains:add honeydue-web app.honeyDue.treytartt.com +dokku config:set honeydue-web NEXT_PUBLIC_API_URL=https://honeyDue.treytartt.com/api +dokku letsencrypt:enable honeydue-web # Deploy -git remote add dokku-web dokku@mycribDev:casera-web +git remote add dokku-web dokku@honeyDueDev:honeydue-web git push dokku-web main ``` @@ -316,17 +316,17 @@ Marketing and demo pages need proper meta tags: ```typescript // src/app/(marketing)/page.tsx export const metadata: Metadata = { - title: 'Casera — Home Maintenance Made Simple', + title: 'honeyDue — Home Maintenance Made Simple', description: 'Track tasks, organize contractors, store documents. Manage your home maintenance in one place.', openGraph: { - title: 'Casera — Home Maintenance Made Simple', + title: 'honeyDue — Home Maintenance Made Simple', description: 'Track tasks, organize contractors, store documents.', images: ['/og-image.png'], type: 'website', }, twitter: { card: 'summary_large_image', - title: 'Casera', + title: 'honeyDue', description: 'Home Maintenance Made Simple', images: ['/og-image.png'], }, @@ -391,7 +391,7 @@ Track same events as mobile app for consistent analytics. At the end of Phase 5, you should have: 1. Fully responsive web app (mobile, tablet, desktop) 2. Consistent loading, empty, and error states everywhere -3. Deployed on Dokku at `app.casera.treytartt.com` +3. Deployed on Dokku at `app.honeyDue.treytartt.com` 4. E2E tests covering auth, CRUD, demo mode, and responsive viewports 5. Optimized bundle with code splitting and image optimization 6. SEO-ready marketing and demo pages diff --git a/docs/plans/2026-03-02-core-crud.md b/docs/plans/2026-03-02-core-crud.md index 501e997..78ae980 100644 --- a/docs/plans/2026-03-02-core-crud.md +++ b/docs/plans/2026-03-02-core-crud.md @@ -56,7 +56,7 @@ Task 6: Integration + Verification (sequential — cross-domain wiring) ### Step 1: Install missing shadcn components and @dnd-kit ```bash -cd myCribAPI-Web +cd honeyDueAPI-Web npx shadcn@latest add dialog select textarea tabs skeleton tooltip popover calendar npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities date-fns ``` @@ -688,7 +688,7 @@ export * from './use-documents'; ### Step 14: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` Expected: Build succeeds with no type errors. @@ -1253,7 +1253,7 @@ export default function EditResidencePage({ ### Step 9: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` Expected: Build succeeds. All 4 residence routes render. @@ -2198,7 +2198,7 @@ export default function TaskDetailPage({ ### Step 11: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` ### Step 12: Commit @@ -2282,7 +2282,7 @@ Follow the same patterns as Residences (Task 2). Key differences: ### Step 9: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` ### Step 10: Commit @@ -2363,7 +2363,7 @@ Key differences from other domains: ### Step 9: Verify build ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` ### Step 10: Commit @@ -2442,7 +2442,7 @@ export default function DashboardPage() { ### Step 2: Full build verification ```bash -cd myCribAPI-Web && npm run build +cd honeyDueAPI-Web && npm run build ``` Expected: Build succeeds. All routes compile. No type errors. diff --git a/docs/plans/2026-03-03-advanced-features.md b/docs/plans/2026-03-03-advanced-features.md index 3fb19f5..359b81f 100644 --- a/docs/plans/2026-03-03-advanced-features.md +++ b/docs/plans/2026-03-03-advanced-features.md @@ -42,7 +42,7 @@ Task 7: Integration + Verification (sequential — cross-feature wiring) ### Step 1: Install Recharts ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web npm install recharts ``` @@ -282,7 +282,7 @@ export * from './use-subscription'; ### Step 9: Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Step 10: Commit @@ -302,7 +302,7 @@ git add -A && git commit -m "feat: add Phase 3 foundation — notification hooks - Create: `src/app/app/residences/join/page.tsx` - Create: `src/components/sharing/share-code-display.tsx` - Create: `src/components/sharing/user-management.tsx` -- Create: `src/components/sharing/casera-file-handler.tsx` +- Create: `src/components/sharing/honeydue-file-handler.tsx` - Create: `src/lib/hooks/use-sharing.ts` - Modify: `src/app/app/residences/[id]/page.tsx` (add Share button) - Modify: `src/app/app/contractors/[id]/page.tsx` (add Share/Export button) @@ -320,11 +320,11 @@ git add -A && git commit -m "feat: add Phase 3 foundation — notification hooks - Each user row: name, email, role badge (Owner/Member) - Owner can click "Remove" → ConfirmDialog → `residencesApi.removeResidenceUser(residenceId, userId)` -### .casera File Handler +### .honeydue File Handler -**casera-file-handler.tsx** — Reusable component for both residence and contractor sharing: -- **Export mode**: Takes data object, generates JSON `{ type: "residence"|"contractor", ... }`, triggers browser download as `.casera` file -- **Import mode**: FileUpload drop zone accepting `.casera` files, reads JSON, validates type, calls callback with parsed data +**honeydue-file-handler.tsx** — Reusable component for both residence and contractor sharing: +- **Export mode**: Takes data object, generates JSON `{ type: "residence"|"contractor", ... }`, triggers browser download as `.honeydue` file +- **Import mode**: FileUpload drop zone accepting `.honeydue` files, reads JSON, validates type, calls callback with parsed data - Uses `URL.createObjectURL` + anchor click for download - Uses `FileReader.readAsText` for import @@ -332,19 +332,19 @@ git add -A && git commit -m "feat: add Phase 3 foundation — notification hooks **Residence Share page** (`/app/residences/[id]/share`): - ShareCodeDisplay for generating/displaying share codes -- .casera export button → downloads file with share code embedded +- .honeydue export button → downloads file with share code embedded - UserManagement table - Only accessible to residence owner **Residence Join page** (`/app/residences/join`): - Text input for manual code entry -- .casera file import drop zone +- .honeydue file import drop zone - On submit: calls `residencesApi.joinWithCode()` → redirect to residence detail ### Contractor Sharing -On contractor detail page, add "Share" button → generates .casera file with contractor data for download. -On contractor list page, add "Import" button → opens import dialog → reads .casera file → creates contractor via API. +On contractor detail page, add "Share" button → generates .honeydue file with contractor data for download. +On contractor list page, add "Import" button → opens import dialog → reads .honeydue file → creates contractor via API. ### Query hooks @@ -405,13 +405,13 @@ export function useJoinResidence() { ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit ```bash -git add -A && git commit -m "feat: add residence sharing (share code, join, user management) and contractor .casera export/import" +git add -A && git commit -m "feat: add residence sharing (share code, join, user management) and contractor .honeydue export/import" ``` --- @@ -489,7 +489,7 @@ export async function deleteAccount(): Promise { ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit @@ -560,7 +560,7 @@ npx shadcn@latest add switch ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit @@ -623,11 +623,11 @@ export const useOnboardingStore = create()((set) => ({ - Clean, centered layout (no sidebar or app shell) - Progress indicator (step dots or progress bar) -- Casera logo at top +- honeyDue logo at top ### Steps -**Step 0: Welcome** — "Welcome to Casera!" message, illustration, "Get Started" button +**Step 0: Welcome** — "Welcome to honeyDue!" message, illustration, "Get Started" button **Step 1: Choose Path** — Two cards: "Create a new residence" (House icon) and "Join an existing residence" (Users icon). Clicking sets path and advances. @@ -637,7 +637,7 @@ export const useOnboardingStore = create()((set) => ({ - **Step 4a: Complete** — "You're all set!" Redirect to `/app/residences/${id}` **Path B — Join:** -- **Step 2b: Join Residence** — Code input (6-char) or .casera file import. On submit: joins via API, advances. +- **Step 2b: Join Residence** — Code input (6-char) or .honeydue file import. On submit: joins via API, advances. - **Step 3b: Complete** — "Welcome to the residence!" Redirect to residence detail. ### Onboarding trigger @@ -649,7 +649,7 @@ For now, just mark `localStorage.setItem('onboarding_complete', 'true')` after c ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit @@ -714,7 +714,7 @@ On residence detail page (`src/app/app/residences/[id]/page.tsx`), add a "Downlo ### Verify build ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Commit @@ -732,7 +732,7 @@ git add -A && git commit -m "feat: add enhanced dashboard with charts and task r ### Step 1: Full build verification ```bash -cd /Users/treyt/Desktop/code/MyCrib/myCribAPI-Web && npm run build +cd /Users/treyt/Desktop/code/HoneyDue/honeyDueAPI-Web && npm run build ``` ### Step 2: Route verification @@ -766,8 +766,8 @@ git add -A && git commit -m "feat: complete Phase 3 — advanced features integr At the end of Phase 3, verify: - [ ] **Residence sharing**: generate share code, copy, join with code, manage users (list/remove) -- [ ] **Contractor sharing**: .casera file export from detail, import on list page -- [ ] **.casera files**: download as JSON, import via drag-and-drop +- [ ] **Contractor sharing**: .honeydue file export from detail, import on list page +- [ ] **.honeydue files**: download as JSON, import via drag-and-drop - [ ] **Subscription**: status display with usage bars, feature comparison table, upgrade CTA - [ ] **Feature gating**: upgrade prompt dialog available for tier limit enforcement - [ ] **Notification preferences**: toggle switches per notification type, saves immediately diff --git a/next.config.ts b/next.config.ts index 43f44ec..64d5b9b 100644 --- a/next.config.ts +++ b/next.config.ts @@ -11,7 +11,7 @@ const nextConfig: NextConfig = { remotePatterns: [ { protocol: "https", - hostname: "casera.treytartt.com", + hostname: "honeyDue.treytartt.com", }, ], }, diff --git a/package-lock.json b/package-lock.json index ce9bb0c..a2b413d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "casera-web", + "name": "honeydue-web", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "casera-web", + "name": "honeydue-web", "version": "0.1.0", "dependencies": { "@dnd-kit/core": "^6.3.1", diff --git a/package.json b/package.json index 539e679..f971617 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "casera-web", + "name": "honeydue-web", "version": "0.1.0", "private": true, "scripts": { diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx index 73b0912..782575f 100644 --- a/src/app/(auth)/layout.tsx +++ b/src/app/(auth)/layout.tsx @@ -26,13 +26,13 @@ export default function AuthLayout({ children }: { children: React.ReactNode }) Casera - Casera + honeyDue @@ -49,7 +49,7 @@ export default function AuthLayout({ children }: { children: React.ReactNode })

- © {new Date().getFullYear()} Casera + © {new Date().getFullYear()} honeyDue

diff --git a/src/app/(auth)/register/page.tsx b/src/app/(auth)/register/page.tsx index 6367bfd..9b7ac1e 100644 --- a/src/app/(auth)/register/page.tsx +++ b/src/app/(auth)/register/page.tsx @@ -47,7 +47,7 @@ export default function RegisterPage() { return ( Already have an account?{" "} diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index a60330c..652ec57 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -11,9 +11,9 @@ import { NextRequest, NextResponse } from 'next/server'; const API_BASE_URL = process.env.API_URL || process.env.NEXT_PUBLIC_API_URL || - 'https://casera.treytartt.com/api'; + 'https://honeyDue.treytartt.com/api'; -const COOKIE_NAME = 'casera-token'; +const COOKIE_NAME = 'honeydue-token'; const COOKIE_MAX_AGE = 60 * 60 * 24 * 30; // 30 days export async function POST(request: NextRequest) { diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts index 27b8352..1bc5b5a 100644 --- a/src/app/api/auth/logout/route.ts +++ b/src/app/api/auth/logout/route.ts @@ -11,9 +11,9 @@ import { NextRequest, NextResponse } from 'next/server'; const API_BASE_URL = process.env.API_URL || process.env.NEXT_PUBLIC_API_URL || - 'https://casera.treytartt.com/api'; + 'https://honeyDue.treytartt.com/api'; -const COOKIE_NAME = 'casera-token'; +const COOKIE_NAME = 'honeydue-token'; export async function POST(request: NextRequest) { try { diff --git a/src/app/api/auth/me/route.ts b/src/app/api/auth/me/route.ts index 79a076c..84361ee 100644 --- a/src/app/api/auth/me/route.ts +++ b/src/app/api/auth/me/route.ts @@ -11,9 +11,9 @@ import { NextRequest, NextResponse } from 'next/server'; const API_BASE_URL = process.env.API_URL || process.env.NEXT_PUBLIC_API_URL || - 'https://casera.treytartt.com/api'; + 'https://honeyDue.treytartt.com/api'; -const COOKIE_NAME = 'casera-token'; +const COOKIE_NAME = 'honeydue-token'; export async function GET(_request: NextRequest) { try { diff --git a/src/app/api/proxy/[...path]/route.ts b/src/app/api/proxy/[...path]/route.ts index c9c6bec..9e75636 100644 --- a/src/app/api/proxy/[...path]/route.ts +++ b/src/app/api/proxy/[...path]/route.ts @@ -5,18 +5,18 @@ import { NextRequest, NextResponse } from 'next/server'; // Catch-all proxy route handler // --------------------------------------------------------------------------- // Every authenticated client-side API call goes through this proxy. -// It reads the `casera-token` httpOnly cookie and forwards the request to the +// It reads the `honeydue-token` httpOnly cookie and forwards the request to the // Go API with an Authorization header. // --------------------------------------------------------------------------- const API_BASE_URL = process.env.API_URL || process.env.NEXT_PUBLIC_API_URL || - 'https://casera.treytartt.com/api'; + 'https://honeyDue.treytartt.com/api'; /** * Build the target URL from the catch-all path segments. - * e.g. /api/proxy/tasks/123/ -> https://casera.treytartt.com/api/tasks/123/ + * e.g. /api/proxy/tasks/123/ -> https://honeyDue.treytartt.com/api/tasks/123/ */ function buildTargetUrl(request: NextRequest, pathSegments: string[]): string { const path = `/${pathSegments.join('/')}`; @@ -53,7 +53,7 @@ async function buildHeaders(request: NextRequest): Promise { // Attach auth token from httpOnly cookie const cookieStore = await cookies(); - const token = cookieStore.get('casera-token')?.value; + const token = cookieStore.get('honeydue-token')?.value; if (token) { headers.set('Authorization', `Token ${token}`); } diff --git a/src/app/app/contractors/[id]/page.tsx b/src/app/app/contractors/[id]/page.tsx index d9fbbcb..016267f 100644 --- a/src/app/app/contractors/[id]/page.tsx +++ b/src/app/app/contractors/[id]/page.tsx @@ -14,7 +14,7 @@ import { LoadingSkeleton } from "@/components/shared/loading-skeleton"; import { ErrorBanner } from "@/components/shared/error-banner"; import { ConfirmDialog } from "@/components/shared/confirm-dialog"; import { StarRating } from "@/components/shared/star-rating"; -import { downloadCaseraFile } from "@/components/sharing/casera-file-handler"; +import { downloadHoneyDueFile } from "@/components/sharing/honeydue-file-handler"; import { useContractor, useContractorTasks, @@ -88,7 +88,7 @@ export default function ContractorDetailPage({ size="sm" onClick={() => { const exportData = { - type: "casera_contractor_share", + type: "honeydue_contractor_share", version: 1, contractor: { name: contractor.name, @@ -107,7 +107,7 @@ export default function ContractorDetailPage({ exported_at: new Date().toISOString(), }; const safeName = contractor.name.replace(/[^a-zA-Z0-9_-]/g, "_").toLowerCase(); - downloadCaseraFile(exportData, `${safeName}-contractor`); + downloadHoneyDueFile(exportData, `${safeName}-contractor`); }} > diff --git a/src/app/app/contractors/page.tsx b/src/app/app/contractors/page.tsx index e42f519..99c2325 100644 --- a/src/app/app/contractors/page.tsx +++ b/src/app/app/contractors/page.tsx @@ -11,7 +11,7 @@ import { PageHeader } from "@/components/shared/page-header"; import { LoadingSkeleton } from "@/components/shared/loading-skeleton"; import { ErrorBanner } from "@/components/shared/error-banner"; import { EmptyState } from "@/components/shared/empty-state"; -import { CaseraFileImport } from "@/components/sharing/casera-file-handler"; +import { HoneyDueFileImport } from "@/components/sharing/honeydue-file-handler"; import { ContractorCard } from "@/components/contractors/contractor-card"; import { ContractorFilters } from "@/components/contractors/contractor-filters"; import { useContractors, useToggleFavorite, useCreateContractor } from "@/lib/hooks/use-contractors"; @@ -66,7 +66,7 @@ export default function ContractorsPage() { typeof data === "object" && data !== null && "type" in data && - (data as Record).type === "casera_contractor_share" && + (data as Record).type === "honeydue_contractor_share" && "contractor" in data ) { const contractor = (data as Record).contractor as Record; @@ -97,7 +97,7 @@ export default function ContractorsPage() { }, ); } else { - setImportError("Invalid .casera file. Expected a contractor share file."); + setImportError("Invalid .honeydue file. Expected a contractor share file."); } } @@ -118,7 +118,7 @@ export default function ContractorsPage() { }} > - Import .casera + Import .honeydue @@ -168,16 +168,16 @@ export default function ContractorsPage() { )} - {/* Import .casera dialog */} + {/* Import .honeydue dialog */} Import Contractor - Import a contractor from a .casera file shared with you. + Import a contractor from a .honeydue file shared with you. - + {importError && (

{importError}

)} diff --git a/src/app/app/page.tsx b/src/app/app/page.tsx index b5311a8..260c552 100644 --- a/src/app/app/page.tsx +++ b/src/app/app/page.tsx @@ -281,7 +281,7 @@ export default function DashboardPage() {

- Welcome to Casera{name ? `, ${name}` : ""} + Welcome to honeyDue{name ? `, ${name}` : ""}

The easiest way to keep your home running smoothly. diff --git a/src/app/app/residences/[id]/share/page.tsx b/src/app/app/residences/[id]/share/page.tsx index 1b39324..dcb8083 100644 --- a/src/app/app/residences/[id]/share/page.tsx +++ b/src/app/app/residences/[id]/share/page.tsx @@ -9,7 +9,7 @@ import { LoadingSkeleton } from "@/components/shared/loading-skeleton"; import { ErrorBanner } from "@/components/shared/error-banner"; import { ShareCodeDisplay } from "@/components/sharing/share-code-display"; import { UserManagement } from "@/components/sharing/user-management"; -import { CaseraFileExport } from "@/components/sharing/casera-file-handler"; +import { HoneyDueFileExport } from "@/components/sharing/honeydue-file-handler"; import { useResidence } from "@/lib/hooks/use-residences"; import { useDataProvider } from "@/lib/demo/data-provider-context"; @@ -46,7 +46,7 @@ export default function ResidenceSharePage({ params }: SharePageProps) { // Build the exportable residence data const exportData = { - type: "casera_residence_share", + type: "honeydue_residence_share", version: 1, residence: { name: residence.name, @@ -87,16 +87,16 @@ export default function ResidenceSharePage({ params }: SharePageProps) { )} - {/* Export .casera file */} + {/* Export .honeydue file */} {residence.is_owner && (

-

- Download residence data as a portable .casera file. + Download residence data as a portable .honeydue file.

)} diff --git a/src/app/app/residences/join/page.tsx b/src/app/app/residences/join/page.tsx index 265ffba..ec67155 100644 --- a/src/app/app/residences/join/page.tsx +++ b/src/app/app/residences/join/page.tsx @@ -11,7 +11,7 @@ import { Label } from "@/components/ui/label"; import { Separator } from "@/components/ui/separator"; import { PageHeader } from "@/components/shared/page-header"; import { ErrorBanner } from "@/components/shared/error-banner"; -import { CaseraFileImport } from "@/components/sharing/casera-file-handler"; +import { HoneyDueFileImport } from "@/components/sharing/honeydue-file-handler"; import { useJoinResidence } from "@/lib/hooks/use-sharing"; import { useDataProvider } from "@/lib/demo/data-provider-context"; @@ -61,7 +61,7 @@ export default function JoinResidencePage() { }); } else { setFileError( - "Invalid .casera file. Expected a share package with a code field.", + "Invalid .honeydue file. Expected a share package with a code field.", ); } } @@ -126,13 +126,13 @@ export default function JoinResidencePage() { {/* File import */} - Import .casera File + Import .honeydue File - If you received a .casera share package file, import it here. + If you received a .honeydue share package file, import it here. - + {fileError && (

{fileError}

)} diff --git a/src/app/demo/layout.tsx b/src/app/demo/layout.tsx index c787b2f..2c126fc 100644 --- a/src/app/demo/layout.tsx +++ b/src/app/demo/layout.tsx @@ -1,13 +1,13 @@ import type { Metadata } from "next"; export const metadata: Metadata = { - title: "Try Casera — Free Demo", + title: "Try honeyDue — Free Demo", description: - "Try Casera without an account. Manage tasks, contractors, and documents in a live demo.", + "Try honeyDue without an account. Manage tasks, contractors, and documents in a live demo.", openGraph: { - title: "Try Casera — Free Demo", + title: "Try honeyDue — Free Demo", description: - "Try Casera without an account. Manage tasks, contractors, and documents in a live demo.", + "Try honeyDue without an account. Manage tasks, contractors, and documents in a live demo.", type: "website", }, }; diff --git a/src/app/demo/page.tsx b/src/app/demo/page.tsx index 94cf5c6..340d523 100644 --- a/src/app/demo/page.tsx +++ b/src/app/demo/page.tsx @@ -16,19 +16,19 @@ export default function DemoLandingPage() { Casera - Casera + honeyDue {/* Hero */}

- See Casera in action + See honeyDue in action

Explore the full app with sample data. No account needed — diff --git a/src/app/favicon.ico b/src/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..9f92b77e9ae9eda4311bb1f4c5d3ebfbb52046d8 100644 GIT binary patch delta 1583 zcmV+~2GIG-$^p0xGKo-5M-2)Z3IG5A4M|8uQUCw|AOHXWAP52g008_L?V|ty00DDS zM?wIu&K&6g002aj@J1hh1E2u_0{{R30RRC20H6W@1ONa40RR91AfN*P1ONa40RR91 zAOHXW0IY^$^8f$^qDe$SR7eeFmR)aKMG%H(*T;#S#CDoEZE8}r2m!r7y{O;@BqXl* z0sI91DR=w(F*0GX}^n2>&h9yXX)<|bmU1pllgun< zE5!;D%4CfstP;>8U~4Sl%C{-)5(x!AEkj0&=Q^y?VPqm_q4?0G74MaRlmyPk4Feti{Tq)}QLQc9AWhCG#!&srt1rQ4`6A>x=_MLAlCOo4nLhXH9> zy0Es4$?E0?rmzNojlP7m)+|vB@q-DXDk2LkQjDBjb~d0phH_ygcClU;qaKSK4Xm}O;YMsHaSYWJ6)~tFrQwcE#!7InZ-X71E>)|q z^VA$il38aoddfd>r|iV608%*^!Du?YEc2yJ7xwg#P3MY%nJ~xW{O+vW&C>PMdR^P@ z+Kd=fpmvgfkK-v$h2$Tp6^1xo1oOqJz&@m}*H+islAs$+T^E#CVS2H$E}Nvh0;&ac zEUN_Pd%_$U0z`t}6NA1jmRh;HZNr^Xmn1~9dd<`>dx_%Ml0mO5YI4=u%}}~AI(vg- z!Eptt6!i&4%*)ycz~bIk`s}bQo80fG{k^o)x2j5i>vb9r8x{aR!u&=O7%MWC$_;; z_rrsvO%|~BL!i-%2*cep8Rv^D?eNJ_di^s0`b+nx@9fnV&DSSsI#0KAd;8vQrimUS zz_M0<;sC*f0EOs)6o@L03@YmK8q@Zcx6nd6d2wT(Ptun!QdxD&_Uo^nZ@oA!=U1FH zZNu3|brFLW0taAz1n5y>VYj&^E~22S=kaUtvmpn$m2x&?V8^q5^-KHsznoyjm*&?ALyO zS$oFX@Txu8JZ~Krs_A3?_6NFuPCx3waXU@V9~ZV7fi>%OIee75Y{}g`UESH$9oZ=hs;s(F^1$OxzL^%v1;;zE z1reqa1xiai`TKv~%fzGkcmx7Ur&hUtK+FAytwQNm+X7wB02K!YSdJ-B1WxjV|EkN+ z9(x;&%)uG6P1pieH)=71-wZ_ zY??97pV}X>_~D@K=+WI;ccx23LjZ|%J?XM$>A7+qX|b}GSo|ybS-}Cs;T3v z0^b#P5`<&6ZnC=QZh&b1Kxw6NiUJ`@nclzCc}q}rYgPH81r0+=FF(o+a!>|zkmCs$Z; literal 25931 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 LrJugUA?W`A8`#=m diff --git a/src/app/layout.tsx b/src/app/layout.tsx index c45b4e1..2268075 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -26,21 +26,21 @@ const geistMono = Geist_Mono({ export const metadata: Metadata = { title: { - default: "Casera — Home Maintenance Made Simple", - template: "%s | Casera", + default: "honeyDue — Home Maintenance Made Simple", + template: "%s | honeyDue", }, description: "Track tasks, organize contractors, store documents. Manage your home maintenance in one place.", openGraph: { - title: "Casera — Home Maintenance Made Simple", + title: "honeyDue — Home Maintenance Made Simple", description: "Track tasks, organize contractors, store documents. Manage your home maintenance in one place.", type: "website", - siteName: "Casera", + siteName: "honeyDue", }, twitter: { card: "summary_large_image", - title: "Casera — Home Maintenance Made Simple", + title: "honeyDue — Home Maintenance Made Simple", description: "Home Maintenance Made Simple", }, }; diff --git a/src/app/onboarding/layout.tsx b/src/app/onboarding/layout.tsx index 091ea50..3baae7d 100644 --- a/src/app/onboarding/layout.tsx +++ b/src/app/onboarding/layout.tsx @@ -41,7 +41,7 @@ export default function OnboardingLayout({ {/* Logo */}

- Casera + honeyDue

diff --git a/src/app/page.tsx b/src/app/page.tsx index 2a3868d..18b40fe 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -89,13 +89,13 @@ export default function HomePage() { Casera - Casera + honeyDue @@ -272,7 +272,7 @@ export default function HomePage() { Everything your home needs, nothing it doesn't.

- Casera brings all your home maintenance into one clear, + honeyDue brings all your home maintenance into one clear, organized space. No bloat, no learning curve.

@@ -406,13 +406,13 @@ export default function HomePage() { Casera - Casera + honeyDue

@@ -485,7 +485,7 @@ export default function HomePage() {

- © {new Date().getFullYear()} Casera. All rights reserved. + © {new Date().getFullYear()} honeyDue. All rights reserved.

Made for homeowners, by homeowners. diff --git a/src/app/subscription/success/page.tsx b/src/app/subscription/success/page.tsx index 51940b0..0072951 100644 --- a/src/app/subscription/success/page.tsx +++ b/src/app/subscription/success/page.tsx @@ -11,7 +11,7 @@ export default function SubscriptionSuccessPage() {

Thank you!

Your Pro subscription is now active. Enjoy unlimited access to all - Casera features. + honeyDue features.

diff --git a/src/components/layout/sidebar.tsx b/src/components/layout/sidebar.tsx index 10c17fe..444d35b 100644 --- a/src/components/layout/sidebar.tsx +++ b/src/components/layout/sidebar.tsx @@ -22,13 +22,13 @@ export function Sidebar() { Casera - Casera + honeyDue diff --git a/src/components/layout/top-bar.tsx b/src/components/layout/top-bar.tsx index 0b301a1..8cb48d1 100644 --- a/src/components/layout/top-bar.tsx +++ b/src/components/layout/top-bar.tsx @@ -49,13 +49,13 @@ export function TopBar() { Casera - Casera + honeyDue diff --git a/src/components/onboarding/welcome-step.tsx b/src/components/onboarding/welcome-step.tsx index f0926ea..05d50f1 100644 --- a/src/components/onboarding/welcome-step.tsx +++ b/src/components/onboarding/welcome-step.tsx @@ -9,8 +9,8 @@ export function WelcomeStep() { const user = useAuthStore((s) => s.user); const greeting = user?.first_name - ? `Welcome to Casera, ${user.first_name}!` - : "Welcome to Casera!"; + ? `Welcome to honeyDue, ${user.first_name}!` + : "Welcome to honeyDue!"; return (
diff --git a/src/components/shared/upgrade-prompt.tsx b/src/components/shared/upgrade-prompt.tsx index 4c85de9..3e7a533 100644 --- a/src/components/shared/upgrade-prompt.tsx +++ b/src/components/shared/upgrade-prompt.tsx @@ -44,7 +44,7 @@ export function UpgradePrompt({ open, onOpenChange, feature, limitInfo }: Upgrad features.

- Subscriptions are managed through the Casera iOS or Android app. + Subscriptions are managed through the honeyDue iOS or Android app.

diff --git a/src/components/sharing/casera-file-handler.tsx b/src/components/sharing/honeydue-file-handler.tsx similarity index 84% rename from src/components/sharing/casera-file-handler.tsx rename to src/components/sharing/honeydue-file-handler.tsx index 469003c..41ec687 100644 --- a/src/components/sharing/casera-file-handler.tsx +++ b/src/components/sharing/honeydue-file-handler.tsx @@ -9,16 +9,16 @@ import { Button } from "@/components/ui/button"; // --------------------------------------------------------------------------- /** - * Generates a `.casera` file from the given data object and triggers a download. + * Generates a `.honeydue` file from the given data object and triggers a download. */ -export function downloadCaseraFile(data: object, filename: string) { +export function downloadHoneyDueFile(data: object, filename: string) { const json = JSON.stringify(data, null, 2); const blob = new Blob([json], { type: "application/json" }); const url = URL.createObjectURL(blob); const anchor = document.createElement("a"); anchor.href = url; - anchor.download = filename.endsWith(".casera") ? filename : `${filename}.casera`; + anchor.download = filename.endsWith(".honeydue") ? filename : `${filename}.honeydue`; document.body.appendChild(anchor); anchor.click(); @@ -31,12 +31,12 @@ export function downloadCaseraFile(data: object, filename: string) { // Import component // --------------------------------------------------------------------------- -interface CaseraFileImportProps { +interface HoneyDueFileImportProps { onImport: (data: unknown) => void; accept?: string; } -export function CaseraFileImport({ onImport, accept = ".casera" }: CaseraFileImportProps) { +export function HoneyDueFileImport({ onImport, accept = ".honeydue" }: HoneyDueFileImportProps) { const inputRef = useRef(null); const [dragActive, setDragActive] = useState(false); const [error, setError] = useState(null); @@ -58,7 +58,7 @@ export function CaseraFileImport({ onImport, accept = ".casera" }: CaseraFileImp const parsed = JSON.parse(text); onImport(parsed); } catch { - setError("Invalid .casera file. Could not parse contents."); + setError("Invalid .honeydue file. Could not parse contents."); setFileName(null); } }; @@ -109,7 +109,7 @@ export function CaseraFileImport({ onImport, accept = ".casera" }: CaseraFileImp

- Drop a .casera file here or click to browse + Drop a .honeydue file here or click to browse

{fileName && (

@@ -136,18 +136,18 @@ export function CaseraFileImport({ onImport, accept = ".casera" }: CaseraFileImp // Export button component (convenience wrapper) // --------------------------------------------------------------------------- -interface CaseraFileExportProps { +interface HoneyDueFileExportProps { data: object; filename: string; label?: string; } -export function CaseraFileExport({ data, filename, label = "Export .casera" }: CaseraFileExportProps) { +export function HoneyDueFileExport({ data, filename, label = "Export .honeydue" }: HoneyDueFileExportProps) { return (