尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Mobile-first booking app for Nizar (barber). Clients book from a shared link without an account; Nizar manages appointments from an authenticated dashboard.
Standalone repository, independent from any other project.
• Next.js (App Router) + React + TypeScript (strict)
• Tailwind CSS v4 (design tokens in src/app/globals.css)
• Supabase (PostgreSQL, Auth, RLS) via @supabase/ssr
• Geist font (self-hosted through the geist package)
Requires Node.js 24 (see .nvmrc). A current Node matters: Morocco's clock rules come from the runtime's timezone data.檢視完整 README ↗Mobile-first booking app for Nizar (barber). Clients book from a shared link without an account; Nizar manages appointments from an authenticated dashboard.
Standalone repository, independent from any other project.
src/app/globals.css)@supabase/ssrgeist package)Requires Node.js 24 (see .nvmrc). A current Node matters: Morocco's clock rules come from the runtime's timezone data.
npm ci
cp .env.example .env.local # then fill in the values
npm run dev # http://localhost:3000
Checks:
npm run typecheck
npm run lint
npm test # unit tests: availability engine, booking service, clients, settings…
npm run build
npm run test:e2e # Playwright, definition of done (needs `npx playwright install chromium`)
| Variable | Where | Purpose |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | public | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | public | Anon/publishable key — protected by RLS |
NEXT_PUBLIC_SITE_URL | public | Canonical URL used for the booking link and QR code |
SUPABASE_SERVICE_ROLE_KEY | server only | Used only in server code for validated public operations. Never prefix with NEXT_PUBLIC_. |
Until Supabase is connected (NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY
unset), the app runs on built-in example data (src/lib/booking/demo-data.ts, mirroring
supabase/seed.sql). Bookings a visitor makes are kept in an httpOnly cookie in their own
browser, so each tester sees the example data plus their own bookings. /login lets anyone
in and /dashboard shows the example barber. Never ship real clients on demo mode.
Public routes: / → /nizar (landing) → /nizar/7jez (booking flow) →
/manage/[token] (confirmation, reschedule, cancel; .../calendar downloads an .ics).
Barber routes (/dashboard): Lyouma, Planning (Nhar / Simana + appointment sheet),
Clients (search, profile), Reglages (Profil, Services, Aw9at lkhedma, Ma disponiblech,
Parametres reservation, Lien dyal reservation + QR, Compte).
Demo settings changes are kept in a second cookie (nizar_demo_cfg), re-validated on
every read. To stay under the browser's 4 KB cookie limit the demo keeps the visitor's
6 most recent bookings and trims notes to 140 characters (demo only).
Project: cuunoajwxymacyfmnatm. Run once, in order, in Supabase → SQL Editor:
supabase/migrations/20261001120000_core_schema.sqlsupabase/migrations/20261001120100_security.sqlsupabase/seed.sql — first set v_owner_email to Nizar's login email.Then in Authentication:
nizar barber automatically.<site>/auth/confirm to Redirect URLs.Sample data can be removed with supabase/seed-reset.sql and recreated by re-running seed.sql.
npm run test:db applies a Supabase stub, the migrations and the seed to a throwaway
local PostgreSQL database and checks constraints, double-booking protection and RLS.
Needs PostgreSQL 16 with btree_gist/pgcrypto and PGHOST/PGPORT/PGUSER set.
See docs/architecture.md for the scheduling and security decisions and docs/qa.md for the V0.1 QA report and known limits.
src/
app/ routes (App Router), global tokens, root layout
components/ui/ Button, Card, Progress, PageShell, Spinner
app/login/ Nizar's sign-in, password reset
app/dashboard/ private area (guarded by requireBarber)
proxy.ts session refresh + /dashboard redirect
lib/auth.ts getCurrentBarber / requireBarber
lib/database.types.ts typed schema for the Supabase client
lib/env.ts typed env access
lib/supabase/
client.ts browser client (anon key, RLS)
server.ts server client bound to Nizar's auth cookies (RLS)
admin.ts service-role client, server-only
proxy.ts session refresh helper
supabase/
migrations/ schema, constraints, RLS
seed.sql dev seed (re-runnable), seed-reset.sql removes sample data
tests/db/ database test suite
| Token | Value | Use |
|---|---|---|
canvas | #000000 | page background |
surface | #1D1D1D | cards, secondary surfaces |
gold | #DDB361 | primary CTA, selected, active nav, key time |
gold-pressed | #D8A94C | pressed / selected variation |
gold-deep | #C6922B | deeper accent |
fg / muted | #F5F5F2 / #9A9A9A | main / secondary text |
Utilities: px-page (20px), p-card (16px), rounded-card (16px), h-control (56px), h-nav (76px), text sizes text-hero, text-title, text-section, text-body, text-secondary, text-time, animations animate-enter-forward / animate-enter-back (220ms, disabled under reduced motion).
Vercel project nizar-barber (framework: Next.js, root directory: repository root). Set the environment variables above for Preview and Production.