mirror of
https://github.com/Dvorinka/Bookra.git
synced 2026-10-28 07:41:16 +00:00
docs: refresh README for current state
README described an old blue palette and no product features. Now lists the actual feature surface (booking, waitlists, schedules, intake, metrics, exports, feeds, notifications, i18n, Stripe/SMS), correct demo tenant slug, and the real warm-cream/terracotta token palette. FRONTEND_ISSUES open-items count updated to current (~60 ternaries). Authored By: TDvorak <[email protected]> Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
c3325354f8
commit
27e0feaed6
2 files changed
+85
-42
No files matched your search
+1
-1
@@ -25,7 +25,7 @@
|
||||
|
||||
## Still Needs Frontend Polish
|
||||
|
||||
- Many dashboard inline i18n ternaries remain (~280). Systematic extraction to `i18n.t()` keys is an ongoing task.
|
||||
- Dashboard inline i18n ternaries remain (~60 as of M30). Systematic extraction to `i18n.t()` keys is an ongoing task.
|
||||
- Registration cannot be fully customer-tested locally until Neon Auth environment variables are configured.
|
||||
|
||||
## Fixed This Session (platform audit pass)
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
# Bookra
|
||||
|
||||
Remote-first booking SaaS aligned to the `tdvorak-fullstack` profile with these overrides:
|
||||
Booking operating layer for small local service businesses. Public booking
|
||||
pages for customers, a dashboard for owners, and the scheduling, reminder, and
|
||||
billing machinery underneath.
|
||||
|
||||
Deployment targets:
|
||||
|
||||
- frontend on Vercel
|
||||
- backend on Railway
|
||||
@@ -8,12 +12,45 @@ Remote-first booking SaaS aligned to the `tdvorak-fullstack` profile with these
|
||||
- Stripe billing (checkout, customer portal, webhooks, SMS usage invoices)
|
||||
- no Docker-based local runtime
|
||||
|
||||
## What it does
|
||||
|
||||
**Public booking**
|
||||
|
||||
- Embeddable booking page per tenant (`/book/:tenantSlug`) — services, staff,
|
||||
locations, real availability
|
||||
- Customer self-service via manage token: view, reschedule, and cancel bookings
|
||||
- Class sessions with capacity and waitlists — customers see their waitlist
|
||||
position
|
||||
- Structured intake fields per service (text / yes-no, required flag), asked at
|
||||
booking time and shown to staff
|
||||
|
||||
**Dashboard**
|
||||
|
||||
- Calendar with day-level booking modals, bookings, customers, staff, services,
|
||||
locations, working hours, blocked days
|
||||
- Recurring class schedules — weekly rules that materialize sessions 28 days
|
||||
ahead
|
||||
- Waitlist management — capacity-aware promotion, session-to-session moves
|
||||
- Staff performance metrics — bookings, completion/cancellation, revenue,
|
||||
capacity-based utilization
|
||||
- CSV exports — bookings, customers, staff and service reports
|
||||
- Activity feed — persistent notification center with a per-user read cursor
|
||||
- ICS calendar feeds — read-only tenant and staff feeds with token rotation
|
||||
- CS/EN localization throughout
|
||||
|
||||
**Platform**
|
||||
|
||||
- Stripe subscriptions (monthly/yearly, CZK/USD), customer portal, webhooks
|
||||
- Email reminders; optional SMS add-on via SMS Manager.cz, metered through
|
||||
Stripe invoices
|
||||
- Admin API for tenant/plan operations
|
||||
|
||||
## Workspace
|
||||
|
||||
- `apps/frontend` SolidJS frontend
|
||||
- `apps/backend` Go API
|
||||
- `packages/api-client` generated TypeScript client/types from OpenAPI
|
||||
- `packages/shared-types` shared frontend constants and helpers
|
||||
- `apps/frontend` — SolidJS frontend
|
||||
- `apps/backend` — Go API (Gin, pgx, Goose migrations)
|
||||
- `packages/api-client` — generated TypeScript client/types from OpenAPI
|
||||
- `packages/shared-types` — shared frontend constants and helpers
|
||||
|
||||
## Local development
|
||||
|
||||
@@ -24,6 +61,8 @@ npm install
|
||||
npm run dev:frontend
|
||||
```
|
||||
|
||||
Runs on `http://localhost:3000`.
|
||||
|
||||
### Backend
|
||||
|
||||
```bash
|
||||
@@ -31,20 +70,24 @@ cd apps/backend
|
||||
go run ./cmd/api
|
||||
```
|
||||
|
||||
Both apps expect remote services:
|
||||
Runs on `http://localhost:8080`.
|
||||
|
||||
Both apps expect remote services when not in demo mode:
|
||||
|
||||
- Neon Postgres
|
||||
- Neon Auth
|
||||
- Stripe
|
||||
|
||||
See `.env.example`, `apps/frontend/.env.example`, and `apps/backend/.env.example`.
|
||||
See `apps/frontend/.env.example` and `apps/backend/.env.example` for the full
|
||||
variable list.
|
||||
|
||||
### Demo mode
|
||||
|
||||
Set `BOOKRA_DEMO_MODE=true` to run the backend with an in-memory repository and
|
||||
pre-populated demo data — no database, Neon Auth, or Stripe required. All
|
||||
requests are authenticated as the `demo-owner` principal. Pair with
|
||||
`VITE_BOOKRA_DEMO_MODE=true` on the frontend.
|
||||
`VITE_BOOKRA_DEMO_MODE=true` on the frontend. The seeded demo tenant slug is
|
||||
`studio-atelier`; its public page is `/book/studio-atelier`.
|
||||
|
||||
## CI/CD
|
||||
|
||||
@@ -75,45 +118,45 @@ npm run verify
|
||||
Runs API-client generation, frontend typecheck, backend tests, and both builds.
|
||||
Run this before pushing.
|
||||
|
||||
## Brand Colors
|
||||
## Design system
|
||||
|
||||
Bookra uses a sophisticated color system designed for modern booking interfaces with support for both light and dark themes.
|
||||
Bookra uses a warm, editorial palette implemented as CSS custom properties in
|
||||
`apps/frontend/src/styles/index.css`, with light and dark themes.
|
||||
|
||||
### Primary Palette
|
||||
- **Canvas** (`--color-canvas`): #FFFFFF (light) / #0A0A0A (dark)
|
||||
- **Canvas Elevated** (`--color-canvas-elevated`): #F8F9FA (light) / #1A1A1A (dark)
|
||||
- **Canvas Sunken** (`--color-canvas-sunken`): #F1F3F4 (light) / #252525 (dark)
|
||||
### Surfaces
|
||||
|
||||
### Accent Colors
|
||||
- **Primary** (`--color-primary`): #3B82F6
|
||||
- **Primary Hover** (`--color-primary-hover`): #2563EB
|
||||
- **Primary Active** (`--color-primary-active`): #1D4ED8
|
||||
- **Canvas**: warm cream `hsl(40 25% 97%)` light / dark counterpart per theme
|
||||
- **Canvas elevated/subtle/sunken**: stepped warm neutrals
|
||||
|
||||
### Semantic Colors
|
||||
- **Success** (`--color-success`): #10B981
|
||||
- **Warning** (`--color-warning`): #F59E0B
|
||||
- **Error** (`--color-error`): #EF4444
|
||||
- **Info** (`--color-info`): #06B6D4
|
||||
### Ink (text)
|
||||
|
||||
### Text Colors
|
||||
- **Text Primary** (`--color-text-primary`): #111827 (light) / #F9FAFB (dark)
|
||||
- **Text Secondary** (`--color-text-secondary`): #6B7280 (light) / #D1D5DB (dark)
|
||||
- **Text Muted** (`--color-text-muted`): #9CA3AF (light) / #9CA3AF (dark)
|
||||
- **Ink**: `hsl(25 15% 12%)` — primary text
|
||||
- **Ink muted**: `hsl(25 10% 42%)`
|
||||
- **Ink subtle**: `hsl(25 8% 58%)`
|
||||
|
||||
### Border & Surface
|
||||
- **Border** (`--color-border`): #E5E7EB (light) / #374151 (dark)
|
||||
- **Surface Glass** (`--color-surface-glass`): rgba(255, 255, 255, 0.8) (light) / rgba(0, 0, 0, 0.8) (dark)
|
||||
### Accent
|
||||
|
||||
### Shadow System
|
||||
- **Shadow XS** (`--shadow-xs`): 0 1px 2px 0 rgba(0, 0, 0, 0.05)
|
||||
- **Shadow SM** (`--shadow-sm`): 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.06)
|
||||
- **Shadow MD** (`--shadow-md`): 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)
|
||||
- **Shadow LG** (`--shadow-lg`): 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)
|
||||
- **Shadow XL** (`--shadow-xl`): 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)
|
||||
- **Shadow 2XL** (`--shadow-2xl`): 0 25px 50px -12px rgba(0, 0, 0, 0.25)
|
||||
- **Accent**: `hsl(17 55% 42%)` — deep warm terracotta
|
||||
- **Accent hover/active/subtle/soft/muted**: stepped variants
|
||||
|
||||
### Animation Timing
|
||||
- **Ease Out Expo** (`--ease-out-expo`): cubic-bezier(0.16, 1, 0.3, 1)
|
||||
- **Ease Spring** (`--ease-spring`): cubic-bezier(0.68, -0.55, 0.265, 1.55)
|
||||
### Semantic
|
||||
|
||||
These colors are implemented as CSS custom properties and are used throughout the frontend application for consistent theming and accessibility.
|
||||
- **Success** `hsl(145 45% 38%)`, **Warning** `hsl(38 80% 50%)`,
|
||||
**Error** `hsl(0 60% 52%)`, **Info** `hsl(210 60% 50%)`
|
||||
|
||||
### Typography
|
||||
|
||||
- **Space Grotesk** — display/headings
|
||||
- **Newsreader** — serif accents
|
||||
- **DM Sans** — UI body
|
||||
- **JetBrains Mono** — code/mono
|
||||
|
||||
### Motion
|
||||
|
||||
- **Ease out expo**: `cubic-bezier(0.16, 1, 0.3, 1)`
|
||||
- **Ease spring**: `cubic-bezier(0.68, -0.55, 0.265, 1.55)`
|
||||
|
||||
## Roadmap
|
||||
|
||||
Milestone history and the curated future-phase shortlist live in
|
||||
[project.md](/home/tdvorak/Desktop/PROG+HTML/Bookra/project.md).
|
||||
Reference in new issue
Block a user