chore: convert to Turborepo + npm workspaces monorepo

- Move React/Vite frontend to apps/web/ (@budgetwise/web)
- Add apps/appwrite/ (@budgetwise/appwrite) to source-control the
  Appwrite backend: declarative schema in appwrite.json (5 collections),
  CLI-based deploy.sh for containerized use, functions/ dir for future
  Appwrite Functions
- Add turbo.json for task orchestration (build, deploy, dev)
- Replace .gitlab-ci.yml with Woodpecker CI pipelines in .woodpecker/:
    web-production.yml  — push to main → build + rsync to prod
    web-staging.yml     — push to staging → build + rsync to staging
    web-preview.yml     — PR open → deploy to {pr}.{domain}; PR close → cleanup
    appwrite.yml        — schema changes in apps/appwrite/ → CLI deploy
- All secrets injected via Woodpecker CI (no committed .env files)
This commit is contained in:
Kushal Gaywala
2026-02-28 19:16:26 +01:00
parent 8009c11581
commit e0e0cc65f1
49 changed files with 729 additions and 226 deletions

76
apps/web/src/index.css Normal file
View File

@@ -0,0 +1,76 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
* {
-webkit-tap-highlight-color: transparent;
box-sizing: border-box;
}
html {
font-family: 'Inter', system-ui, sans-serif;
background-color: #0f172a;
color: white;
overscroll-behavior: none;
/* Support for safe areas on modern Android/iOS */
padding-top: env(safe-area-inset-top);
}
body {
margin: 0;
padding: 0;
min-height: 100dvh;
overflow-x: hidden;
}
/* Scrollbar */
::-webkit-scrollbar {
width: 4px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: #334155;
border-radius: 4px;
}
/* Number inputs remove spinners */
input[type='number']::-webkit-inner-spin-button,
input[type='number']::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type='number'] {
-moz-appearance: textfield;
}
/* Date input dark styling */
input[type='date']::-webkit-calendar-picker-indicator {
filter: invert(1) opacity(0.5);
cursor: pointer;
}
/* Select arrow */
select {
-webkit-appearance: none;
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 12px center;
padding-right: 36px !important;
}
}
@layer utilities {
/* Bottom safe area for PWA on Android/iOS */
.safe-area-bottom {
padding-bottom: env(safe-area-inset-bottom, 0px);
}
/* Full viewport height that respects the browser UI on mobile */
.h-dvh {
height: 100dvh;
}
}