Skip to main content
vibld

Template

Hubshift

A hybrid workplace platform for small and growing companies. It combines desk booking on interactive floor plans, a time-grid room scheduler, a team presence board, waitlists, QR check-in, built-in messaging, multi-office administration and utilization analytics, and a no-account demo mode lets people explore it first.

Hybrid workplace platform · App · Small tools and apps · full-stack app (auth + DB)

Who it is for

  • Small business owners with hybrid teams
  • Founders scaling past 10 employees
  • Office managers replacing booking spreadsheets
  • Multi-location teams

Layout

  1. Centered auth page on white: amber rounded-square lightning icon, 'Welcome to ...' heading, subtitle
  2. Bordered card: Sign In / Sign Up segmented tabs, email and password (show/hide) fields, 'Remember me' checkbox and dark-amber 'Forgot password?' link, full-width amber 'Sign in' button
  3. 'Or continue with' divider and three square social buttons (Google, Microsoft, X)
  4. 'Or explore first' divider and outlined amber-tint demo button; terms and privacy note below
  5. App: sidebar with dashboard, floor plan desk booking, room scheduler, team presence, messages, my bookings, admin (offices, floors, rooms, analytics)

Palette

sunny, practical, welcoming, clean, efficient. A bright, low-friction front door to office logistics.

  • background#ffffff
  • text#1a212d
  • primary amber#f59f0a
  • accent amber tint#fff8eb
  • muted surface#f3f5f7
  • border#e1e7ef
  • muted text#5f6e84

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text on background16.16:14.5:1
Aadark label on amber button7.58:14.5:1
Aalink text on background5.02:14.5:1
Aatext on amber tint15.30:14.5:1
Aamuted text on background5.19:14.5:1
Aamuted text on muted surface4.74:14.5:1
focus ring / mine desk on background5.02:13:1
available desk on floor plan3.30:13:1
booked desk on floor plan3.35:13:1
input border on card3.24:13:1

As vibld’s tokens

The palette on the fifteen colour tokens vibld styles a project with, each text colour on the fill it is read on. Marked tokens are solved from the palette, because no swatch held that role at 4.5:1.

  • background
  • card
  • muted
  • primary *
  • secondary
  • accent
  • destructive *

Type

Display
DM Sans SemiBold 30px heading
Body
DM Sans 16px body; 12px uppercase tracked divider labels

A friendly geometric sans with a warm amber accent keeps a utilitarian tool approachable.

Spacing and imagery

Narrow 450px card with 32px padding, 44px controls, 4px radius (almost square), subtle 1px borders, generous vertical rhythm between groups.

No photos; a lightning-bolt icon tile, lucide icons, and floor-plan graphics and charts inside the app.

Components

  • Brand icon tile
  • Sign in / sign up tabs
  • Password visibility toggle
  • Remember me checkbox
  • Social sign-in buttons
  • Demo mode entry
  • Interactive floor plan with color-coded desks
  • Recurring reservation form
  • Time-grid room scheduler
  • Team presence board
  • Waitlist panel
  • Three-panel messaging (conversations, thread, contact info)
  • QR code per booking
  • Utilization analytics (admin)

Interactions

  • Tabs switch between sign in and sign up
  • Show/hide password
  • Demo mode logs in with sample data
  • Click a desk to book; double booking blocked
  • Weekly, biweekly or monthly recurrences with end date
  • Drag across the time grid to book a room
  • Join a waitlist and get notified
  • Download or scan a QR code to check in; message teammates

Data

  • Office{id, name, address, timezone}
  • Floor{id, office_id, name, plan}
  • Desk{id, floor_id, label, x, y, status active|disabled, features[]}
  • Room{id, office_id, name, capacity, equipment[]}
  • DeskBooking{id, desk_id, user_id, date, recurrence_id?, status}
  • RoomBooking{id, room_id, user_id, starts_at, ends_at, title}
  • Waitlist{id, desk_id, date, user_id, position}
  • Conversation{id, members[]}
  • Message{id, conversation_id, sender_id, body, created_at}
  • Profile{id, name, team, role user|admin, office_id}

Build prompt

The baseline every prompt in the catalog assumes, then this design’s own ten sections, from goal to guardrails.

The baseline
### How to use these prompts
Paste a template's build prompt into your coding agent as the first message. Each prompt names its own stack, tokens and acceptance criteria; the rules below apply to all of them and can be prepended once per project.

### Engineering baseline
- TypeScript strict mode, no `any`, small typed components, feature folders, and one source of truth for design tokens (CSS variables consumed by Tailwind).
- Validate every input with a shared zod schema on the client and again on the server or edge function. Never trust client-side checks alone.
- Show loading, empty and error states for every async view. Surface errors in plain language with a retry, and log details to the console in development only.
- Keep secrets out of the bundle. Only publishable keys (for example a Supabase anon key) belong in client code; service-role keys, API keys and webhooks live in server or edge-function environment variables.

### Data and auth baseline (full-stack templates)
- Enable Row Level Security on every table before inserting data. Default-deny, then add owner-scoped policies (`auth.uid() = user_id`) and explicit role checks for admin views.
- Store roles in a separate table checked by a security-definer function, never in a user-editable profile field.
- Upload files to private storage buckets with size and MIME limits, and serve them through signed URLs.
- Rate-limit public endpoints (forms, auth, AI calls) and add a honeypot field or captcha to anonymous forms.
- Take payments through a hosted checkout and verify webhooks by signature. Never handle raw card data.

### Accessibility and UX baseline
- Target WCAG 2.2 AA: 4.5:1 contrast for normal text and 3:1 for large text, input borders, focus rings and meaningful icons or chart lines. Every palette in this catalog lists its verified pairs; re-check with a contrast tool after any colour change.
- Keep body text at 16px or larger with 1.5 line height, nothing below 12px, no light weights under 24px, and uppercase only for short labels.
- Give every interactive element a visible focus ring, full keyboard support, semantic landmarks, labelled form fields, and alt text on meaningful images.
- Respect `prefers-reduced-motion` for every animation. Give drag-and-drop and carousels keyboard and button alternatives.
- Build mobile-first and test at 375px, 768px and 1280px.

### Content guardrails
- Use original copy, fictional sample data and placeholder or licensed imagery. Do not reuse another product's name, logo, screenshots or marketing text.
- Label demo testimonials and metrics as samples. Collect the minimum personal data the feature needs.
### Goal
Build **Hubshift**, a hybrid-office coordination platform for companies of roughly 10 to 200 people. Staff book desks on floor plans and rooms on a time grid, see who is in, message each other and check in by QR code. Admins run several offices and see utilization, and a demo mode lets anyone explore without an account.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix: Tabs, Checkbox, Dialog, Popover, Calendar, ScrollArea) and lucide-react. Use react-resizable-panels for the three-panel messaging view, Recharts for analytics, react-hook-form + zod, date-fns / date-fns-tz, TanStack Query and `qrcode.react`. Supabase provides:
- Auth: email, plus Google and Microsoft OAuth.
- Postgres with exclusion constraints against double booking.
- Realtime for presence, availability and messages.
- Edge Functions for waitlist promotion and QR check-in validation.

### Pages & layout
1. **Auth**: a centered amber icon tile, a heading and subtitle, and a bordered card with Sign in / Sign up tabs, email and password (with show/hide), Remember me and Forgot password. A full-width amber button, an "or continue with" row of social buttons, an "or explore first" divider with a Try demo button, and a terms note.
2. **Dashboard**: today's desk, upcoming room bookings, who's in today, quick actions.
3. **Desks**: office and floor selector, date picker, SVG floor plan with available, booked, mine and disabled states; a side panel to book with recurrence.
4. **Rooms**: a time grid (rooms × 30-minute slots); drag to select, then a dialog for title and attendees; equipment chips.
5. **Team**: a presence board for today and this week, filterable by team.
6. **Messages**: conversation list, thread, contact panel.
7. **My bookings**: list with QR codes and cancel.
8. **Admin**: offices, floors, desks, rooms, users and utilization analytics.

### Design system
- Tokens: `--background: #ffffff`, `--foreground: #1a212d`, `--primary: #f59f0a`, `--accent: #fff8eb`, `--muted: #f3f5f7`, `--muted-fg: #5f6e84`, `--border: #e1e7ef` (decorative), `--input-border: #7591b5`, `--link: #b45309`, `--ring: #b45309`; amber buttons carry `#1a212d` labels.
- Desk states: available `#16a34a`, booked `#7b8ea8`, mine `#b45309`, disabled a hatched pattern.
- Font: DM Sans. Headings 30/24/20px semibold; body 16px at line-height 1.5; divider labels 12px uppercase with 0.08em tracking.
- Spacing on a 4px base; radius 4px on controls, 8px on cards; hairline borders.
- Motion: 150ms, and a 200ms panel slide.

### Components & interactions
AuthTabs (inline field errors, loading button, OAuth error toast), DemoButton, FloorPlan (zoom, tooltip, keyboard nav, legend), DeskBookingPanel (recurrence with end date; conflict message), RoomTimeGrid (drag to select, keyboard selection alternative, overlaps blocked), PresenceBoard, WaitlistButton, QrTicket (download PNG), Messaging (unread badges, empty conversation state, send failure retry), AdminTables and UtilizationCharts (by office, weekday, resource). Every view has loading, empty and error states.

### Data & state
Tables as in the data model, plus `user_roles`. `desk_bookings` has a unique constraint on `(desk_id, date)` where the status is active; `room_bookings` uses a tstzrange exclusion. The demo signs into a sandbox org that is reset nightly. Seed two fictional offices, 40 desks, 8 rooms and invented staff.

### Accessibility
White on amber `#f59f0a` fails, so amber buttons use dark `#1a212d` labels (7.6:1) and links and focus rings use `#b45309`. Floor plans and the time grid need list or table alternatives with the same actions. Status is never color-only. Tabs follow the Radix keyboard model. The password toggle has an `aria-label` and pressed state. The messaging thread is a log region.
Verified contrast: body: #1a212d on #ffffff = 16.2:1; button label: #1a212d on #f59f0a = 7.6:1; link: #b45309 on #ffffff = 5.0:1; muted: #5f6e84 on #ffffff = 5.2:1.

### Security
RLS:
- Users book and cancel only their own bookings, and read availability and presence within their org.
- Admins manage offices and resources.
- Messages are readable only by conversation members.
The demo org is isolated and read-mostly. QR tokens are signed and short-lived. Validate everything with zod and constraints. Rate-limit messages and bookings. Sanitize message text (plain text only) and keep OAuth secrets server-side.

### Performance & SEO
Scope Realtime subscriptions per office, floor and date. Virtualize long message threads. Index booking dates. Lazy-load admin and analytics. Auth page: title and meta; noindex the app.

### Guardrails
- Write fresh copy; use generic social icons only where the providers are actually wired up.
- Use invented people and offices.
- Keep components small and typed; no `any`. Show conflicts and errors visibly.
- Done when: (1) no double bookings for desks or rooms under concurrent attempts; (2) waitlist promotion notifies the next user; (3) demo mode works without sign-up and resets; (4) messaging is private to members; (5) floor plan and time grid are keyboard-accessible.

Open the builderAll templatesThis palette on its own