diff --git a/frontend/src/views/Landing.vue b/frontend/src/views/Landing.vue index 8c0418c..a12f33e 100644 --- a/frontend/src/views/Landing.vue +++ b/frontend/src/views/Landing.vue @@ -7,6 +7,7 @@
+ ROA Space Rezervări de spații @@ -49,106 +50,183 @@

Cont gratuit, gata în câteva secunde.

- -
-
-
- Sala Aurora - azi · 6 locuri -
- Live + +
+
+ + roa.space/spaces/aurora-room
-
- -
-
- {{ selectedLabel }} - -
-
- - - -
-
-
-
- - Sala Aurora — 10:00 - deja rezervată -
-
- - Nu poți rezerva — se suprapune cu ședința lui Andrei. -
-
-
-

Nicio sală rezervată de două ori.

-

- Dacă un interval e prins, ROA Space pur și simplu nu te lasă să treci peste. - Fără suprapuneri, fără discuții „dar eu credeam că e liberă". -

-
-
-
- - -
-
-

Trei pași, și ai sala.

-

- Nimeni nu are timp de formulare. Alegi, pui ora, gata — durează mai puțin decât - să scrii mesajul pe grup. -

-
-
-
- {{ step.n }} -
-

{{ step.title }}

-

{{ step.body }}

-
-
-
-
- - -
-
-
-

Spațiile publice, fără înregistrare obligatorie.

-

- Marchezi un spațiu ca public și poate fi rezervat și fără cont — cu nume, e-mail - și ora dorită. Cine vrea își face cont, cine nu, rezervă direct. Tu păstrezi - controlul: fiecare cerere ajunge tot la tine spre aprobare. -

- Deschide un spațiu public → -
-
- Rezervare oaspete -
-
- Nume -
Maria Ionescu
+
+
+
+

Aurora Room

+

Today · 6 seats

-
- E-mail -
maria@exemplu.ro
+ Live +
+
+ +
+
+ {{ selectedLabel }} + Reserve +
+
+
+
+ + +
+ +
+
+ + roa.space/dashboard +
+
+ +
+
+

Dashboard

+ Book a Space +
+
+ + {{ p.num }}{{ p.label }} + +
+
Today
+
+
+ {{ b.time }} + {{ b.space }} + {{ b.title }} + {{ b.status }} +
+
+
+
+
+ + +
+
+ + roa.space/spaces +
+
+ +
+
+
+

Available Spaces

+

Browse and reserve meeting rooms and desk spaces

+
+ +
+
+
+
+

{{ s.name }}

+ + {{ s.active ? 'Active' : 'Inactive' }} + +
+
Type:{{ s.type }}
+
Capacity:{{ s.cap }}
+
Location:{{ s.loc }}
+
+
+
+
+
+ + +
+
+ + roa.space/spaces/aurora-room +
+
+ +
+
+
+

Aurora Room

+

Meeting Room · 8 people · Floor 2

+
+ ‹ Jul 6 – 10 › +
+
+
+ {{ t }} +
+
+
{{ day.name }}
+
+
{{ ev.label }}
+
+
-
@@ -186,6 +264,17 @@ @@ -354,22 +486,24 @@ const selectedLabel = computed(() => { .nav-inner { max-width: var(--container); margin: 0 auto; - height: 64px; + height: 80px; padding: 0 32px; display: flex; align-items: center; gap: 28px; } -.brand { display: flex; align-items: center; gap: 12px; } -.brand-logo { height: 42px; width: auto; display: block; } -.brand-divider { width: 1px; height: 30px; background: var(--border-default); } +.brand { display: flex; align-items: center; gap: 14px; } +.brand-logo { height: 60px; width: auto; display: block; } +.brand-divider { width: 1px; height: 38px; background: var(--border-default); } +/* App brand color — the real accent used inside the ROA app (indigo). */ +.brand-app-icon { display: flex; align-items: center; color: #6366f1; flex: none; } .brand-text { display: flex; flex-direction: column; gap: 1px; line-height: 1.1; } .brand-word { font-family: var(--font-mark); font-weight: 700; font-size: 18px; letter-spacing: -0.01em; - color: var(--brand); + color: #6366f1; } .brand-sub { font-size: 0.6875rem; @@ -403,7 +537,7 @@ const selectedLabel = computed(() => { .hero { max-width: var(--container); margin: 0 auto; - padding: 96px 32px 72px; + padding: 72px 32px 56px; display: grid; grid-template-columns: 1.05fr 0.95fr; gap: 64px; @@ -425,173 +559,85 @@ const selectedLabel = computed(() => { .hero-cta { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; } .hero-note { font-size: 0.875rem; color: var(--text-subtle); margin: 20px 0 0; } -/* ── Demo booking card ── */ -.demo-card { - background: var(--surface-card); - border: 1px solid var(--border-subtle); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-lg); - overflow: hidden; -} +/* ── Hero booking card (same app style as the mockups below) ── */ +.demo-window { margin-bottom: 0; } +.demo-app { background: var(--sf); padding: 4px 0 0; } .demo-head { display: flex; - align-items: center; + align-items: flex-start; justify-content: space-between; - padding: 16px 20px; - border-bottom: 1px solid var(--border-subtle); + padding: 16px 20px 14px; + border-bottom: 1px solid var(--bd); } -.demo-head-title { display: flex; flex-direction: column; gap: 2px; } -.demo-room { font-size: 0.875rem; font-weight: 700; color: var(--text-strong); letter-spacing: -0.01em; } -.demo-meta { font-size: 0.75rem; color: var(--text-muted); } -.demo-slots { display: flex; flex-direction: column; gap: 8px; padding: 16px 20px 12px; } -.slot { - display: flex; - align-items: center; - gap: 12px; - padding: 11px 12px; - border-radius: var(--radius-md); - cursor: pointer; - background: var(--surface-card); - border: 1px solid var(--border-subtle); - text-align: left; - font-family: inherit; - transition: background 180ms ease, border-color 180ms ease; -} -.slot:hover { border-color: var(--brand); } -.slot.selected { background: var(--brand-tint); border-color: var(--brand); } -.slot-time { - font-family: var(--font-mono); - font-size: 0.75rem; - color: var(--text-muted); - width: 96px; - flex: none; -} -.slot-title { flex: 1; font-size: 0.875rem; font-weight: 500; color: var(--text-strong); } -.slot-title.free { color: var(--text-subtle); } -.demo-foot { - padding: 14px 20px; - border-top: 1px solid var(--border-subtle); - background: var(--surface-page); - display: flex; - align-items: center; - justify-content: space-between; -} -.demo-selected { font-size: 0.875rem; color: var(--text-body); } - -/* ── Badges ── */ -.badge { +.demo-head h4 { font-size: 1.0625rem; font-weight: 700; color: var(--tp); margin: 0; } +.demo-head .app-subtitle { margin-top: 3px; } +.demo-live { display: inline-flex; align-items: center; gap: 6px; + font-size: 0.6875rem; + font-weight: 600; padding: 3px 10px; - border-radius: 999px; - font-size: 0.75rem; - font-weight: 600; - line-height: 1; + border-radius: 10px; + background: color-mix(in srgb, var(--ok) 12%, transparent); + color: var(--ok); } -.badge-dot, .badge-live-dot { - width: 6px; - height: 6px; - border-radius: 50%; - background: currentColor; +.demo-live-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; animation: pulse 1.6s ease-in-out infinite; } +.demo-slots { display: flex; flex-direction: column; gap: 6px; padding: 14px 18px 10px; } +.demo-slot { + display: flex; + align-items: center; + gap: 12px; + padding: 10px 12px; + border-radius: 7px; + cursor: pointer; + background: var(--bg2); + border: 1px solid transparent; + text-align: left; + font-family: inherit; + transition: background 150ms ease, border-color 150ms ease; +} +.demo-slot:hover { border-color: var(--a); } +.demo-slot.selected { background: var(--a-light); border-color: var(--a); } +.demo-slot-time { + font-family: var(--font-mono); + font-size: 0.75rem; + color: var(--ts); + width: 108px; flex: none; } -.badge-live-dot { animation: pulse 1.6s ease-in-out infinite; } -.badge-success { background: var(--ok-tint); color: var(--okt); } -.badge-neutral { background: color-mix(in srgb, var(--sub) 15%, var(--card)); color: var(--text-muted); } +.demo-slot-title { flex: 1; font-size: 0.8125rem; font-weight: 500; color: var(--tp); } +.demo-slot-title.free { color: var(--tm); } +.demo-slot-badge { + font-size: 0.6875rem; + font-weight: 600; + padding: 2px 10px; + border-radius: 10px; + white-space: nowrap; + flex: none; +} +.demo-slot-badge.booked { background: var(--bg3); color: var(--ts); } +.demo-slot-badge.free { background: color-mix(in srgb, var(--ok) 15%, transparent); color: var(--ok); } +.demo-foot { + padding: 14px 18px; + border-top: 1px solid var(--bd); + background: var(--bg2); + display: flex; + align-items: center; + justify-content: space-between; +} +.demo-selected { font-size: 0.8125rem; color: var(--ts); font-weight: 500; } + @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } } -/* ── Sections / splits ── */ -.band { border-top: 1px solid var(--border-subtle); background: var(--surface-card); } -.split { - max-width: var(--container); - margin: 0 auto; - padding: 88px 32px; - display: grid; - grid-template-columns: 1fr 1fr; - gap: 72px; - align-items: center; -} -.split-steps { grid-template-columns: 0.85fr 1.15fr; } -.split h2, .cta-band h2 { font-size: 1.875rem; letter-spacing: -0.02em; margin-bottom: 16px; } -.split p { font-size: 1rem; line-height: 1.55; color: var(--text-muted); margin: 0; max-width: 440px; } -.text-link { display: inline-block; margin-top: 20px; font-size: 1rem; font-weight: 600; color: var(--brand); } -.text-link:hover { color: var(--brand-hover); } - -/* ── Mini cards (benefit visuals) ── */ -.mini-card { - background: var(--surface-page); - border: 1px solid var(--border-subtle); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-md); - padding: 28px; -} -.band .mini-card { background: var(--surface-page); } -.mini-card-head { display: flex; align-items: center; gap: 10px; margin-bottom: 16px; } -.dot-red { width: 10px; height: 10px; border-radius: 50%; background: var(--errt); flex: none; } -.mini-card-title { font-size: 0.875rem; font-weight: 600; color: var(--text-strong); } -.mini-card-meta { font-size: 0.75rem; color: var(--text-muted); margin-left: auto; } -.conflict { - padding: 14px 16px; - border: 1px dashed var(--err-border); - background: var(--err-tint); - border-radius: var(--radius-md); - display: flex; - align-items: center; - gap: 10px; -} -.conflict-x { color: var(--errt); font-size: 18px; flex: none; } -.conflict span:last-child { font-size: 0.875rem; color: var(--errt); } - -.eyebrow { - font-size: 0.75rem; - font-weight: 600; - letter-spacing: 0.04em; - text-transform: uppercase; - color: var(--text-subtle); -} -.guest-form { display: flex; flex-direction: column; gap: 12px; margin-top: 16px; } -.field { display: flex; flex-direction: column; gap: 5px; } -.field-label { font-size: 0.75rem; color: var(--text-muted); } -.field-box { - padding: 11px 14px; - background: var(--surface-card); - border: 1px solid var(--border-default); - border-radius: var(--radius-md); - font-size: 0.875rem; -} -.field-box.strong { color: var(--text-strong); } -.field-box.muted { color: var(--text-muted); } - -/* ── Steps ── */ -.steps { display: flex; flex-direction: column; } -.step { - display: flex; - gap: 20px; - align-items: flex-start; - padding: 20px 0; - border-bottom: 1px solid var(--border-subtle); -} -.step:last-child { border-bottom: none; } -.step-n { - font-family: var(--font-mark); - font-size: 24px; - font-weight: 700; - color: var(--brand); - flex: none; - width: 40px; -} -.step h4 { font-size: 1.125rem; font-weight: 600; margin-bottom: 4px; } -.step p { font-size: 0.875rem; line-height: 1.55; color: var(--text-muted); margin: 0; } - /* ── CTA band (subtle accent-tinted surface — accent stays on the button) ── */ .cta-band { background: color-mix(in srgb, var(--accent) 7%, var(--card)); border-top: 1px solid var(--border-subtle); border-bottom: 1px solid var(--border-subtle); } -.cta-inner { max-width: var(--container-narrow); margin: 0 auto; padding: 88px 32px; text-align: center; } -.cta-band h2 { color: var(--text-strong); margin-bottom: 14px; } +.cta-inner { max-width: var(--container-narrow); margin: 0 auto; padding: 72px 32px; text-align: center; } +.cta-band h2 { font-size: 1.875rem; letter-spacing: -0.02em; color: var(--text-strong); margin-bottom: 14px; } .cta-inner p { font-size: 1.125rem; line-height: 1.55; color: var(--text-muted); margin: 0 auto 30px; max-width: 440px; } .cta-actions { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; } @@ -612,16 +658,267 @@ const selectedLabel = computed(() => { .footer-links a:hover { color: var(--brand); } .footer-copy { font-size: 0.8125rem; color: var(--text-subtle); } +/* ── Product showcase (faithful app screenshots) ── */ +.showcase { + max-width: 1040px; + margin: 0 auto; + padding: 40px 32px 64px; +} + +/* App tokens — fixed to the real app's light theme so the mockups read as + genuine screenshots regardless of the landing theme. */ +.app-window { + --a: #6366f1; --a-light: #eef2ff; + --ok: #10b981; --warn: #f59e0b; --dan: #ef4444; + --sf: #ffffff; --bg2: #f8f9fa; --bg3: #f1f3f5; + --tp: #1a1a2e; --ts: #6b7280; --tm: #9ca3af; + --bd: #e5e7eb; --bdl: #f3f4f6; + + border: 1px solid var(--border-default); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-lg); + overflow: hidden; + background: var(--sf); + margin-bottom: 28px; +} +.app-window:last-child { margin-bottom: 0; } + +.app-bar { + display: flex; + align-items: center; + gap: 7px; + padding: 10px 14px; + background: var(--bg3); + border-bottom: 1px solid var(--bd); +} +.app-dot { width: 10px; height: 10px; border-radius: 50%; background: #cfd3da; flex: none; } +.app-url { + margin-left: 10px; + font-family: var(--font-mono); + font-size: 0.75rem; + color: var(--ts); + background: var(--sf); + border: 1px solid var(--bd); + border-radius: 6px; + padding: 3px 12px; +} + +.app-body { display: flex; background: var(--bg2); min-height: 340px; } + +/* Sidebar */ +.app-side { + width: 180px; + flex: none; + background: var(--sf); + border-right: 1px solid var(--bd); + padding: 14px 12px; +} +.app-brand { + display: flex; + align-items: center; + gap: 9px; + font-weight: 700; + font-size: 1rem; + color: var(--a); + padding: 6px 8px 14px; + border-bottom: 1px solid var(--bdl); + margin-bottom: 10px; +} +.app-nav-label { + font-size: 0.6875rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--tm); + padding: 4px 8px 6px; +} +.app-nav { display: flex; flex-direction: column; gap: 2px; } +.app-nav-link { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 10px; + border-radius: 7px; + font-size: 0.8125rem; + font-weight: 500; + color: var(--ts); + border-left: 3px solid transparent; +} +.app-nav-link.active { + background: var(--bg3); + color: var(--tp); + border-left-color: var(--a); + font-weight: 600; +} + +/* Content */ +.app-content { flex: 1; padding: 20px 22px; min-width: 0; } +.app-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 14px; + margin-bottom: 18px; +} +.app-head-col { align-items: flex-start; } +.app-content h3 { font-size: 1.25rem; font-weight: 700; color: var(--tp); margin: 0; } +.app-subtitle { font-size: 0.8125rem; color: var(--ts); margin: 4px 0 0; } +.app-btn { + display: inline-flex; + align-items: center; + gap: 6px; + background: var(--a); + color: #fff; + font-size: 0.8125rem; + font-weight: 600; + padding: 8px 14px; + border-radius: 7px; + white-space: nowrap; + flex: none; +} +.app-search { + display: inline-flex; + align-items: center; + gap: 7px; + color: var(--tm); + font-size: 0.8125rem; + background: var(--sf); + border: 1px solid var(--bd); + border-radius: 7px; + padding: 8px 12px; + flex: none; +} + +/* Dashboard — stat pills */ +.app-pills { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 20px; } +.app-pill { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 0.75rem; + font-weight: 500; + padding: 5px 11px; + border-radius: 12px; + border: 1px solid transparent; +} +.app-pill-num { font-size: 0.875rem; font-weight: 700; } +.app-pill.primary { background: var(--a-light); color: var(--a); border-color: color-mix(in srgb, var(--a) 20%, transparent); } +.app-pill.warning { background: color-mix(in srgb, var(--warn) 12%, transparent); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 22%, transparent); } +.app-pill.success { background: color-mix(in srgb, var(--ok) 12%, transparent); color: var(--ok); border-color: color-mix(in srgb, var(--ok) 22%, transparent); } +.app-pill.danger { background: color-mix(in srgb, var(--dan) 12%, transparent); color: var(--dan); border-color: color-mix(in srgb, var(--dan) 22%, transparent); } + +/* Dashboard — grouped rows */ +.app-group { + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--ts); + padding-bottom: 6px; + border-bottom: 1px solid var(--bdl); + margin-bottom: 8px; +} +.app-rows { display: flex; flex-direction: column; gap: 5px; } +.app-row { + display: flex; + align-items: center; + gap: 12px; + padding: 10px 14px; + min-height: 44px; + background: var(--bg2); + border-radius: 6px; + border-left: 3px solid transparent; +} +.app-row.approved { border-left-color: var(--ok); } +.app-row.pending { border-left-color: var(--warn); } +.app-row-time { font-size: 0.8125rem; font-weight: 600; color: var(--tp); white-space: nowrap; } +.app-row-space { font-size: 0.8125rem; font-weight: 500; color: var(--a); white-space: nowrap; } +.app-row-title { flex: 1; font-size: 0.8125rem; color: var(--tp); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.app-row-badge { + font-size: 0.6875rem; + font-weight: 600; + padding: 2px 10px; + border-radius: 10px; + white-space: nowrap; + flex: none; +} +.app-row-badge.approved { background: color-mix(in srgb, var(--ok) 15%, transparent); color: var(--ok); } +.app-row-badge.pending { background: color-mix(in srgb, var(--warn) 15%, transparent); color: var(--warn); } + +/* Spaces — cards */ +.app-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; } +.app-card { + background: var(--sf); + border: 1px solid var(--bd); + border-radius: 8px; + box-shadow: var(--shadow-sm); + padding: 16px 18px; +} +.app-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; margin-bottom: 12px; } +.app-card-head h4 { font-size: 1.0625rem; font-weight: 700; color: var(--tp); margin: 0; } +.app-card-badge { font-size: 0.6875rem; font-weight: 600; padding: 3px 10px; border-radius: 10px; white-space: nowrap; } +.app-card-badge.ok { background: color-mix(in srgb, var(--ok) 15%, transparent); color: var(--ok); } +.app-card-badge.off { background: color-mix(in srgb, var(--dan) 15%, transparent); color: var(--dan); } +.app-card-info { display: flex; align-items: center; gap: 8px; font-size: 0.8125rem; color: var(--tp); padding: 4px 0; } +.app-card-info svg { color: var(--tm); flex: none; } +.app-lbl { color: var(--ts); font-weight: 500; } + +/* Space calendar — week grid */ +.app-week { font-size: 0.8125rem; font-weight: 600; color: var(--ts); background: var(--sf); border: 1px solid var(--bd); border-radius: 7px; padding: 7px 12px; white-space: nowrap; flex: none; } +.app-cal { display: grid; grid-template-columns: 40px repeat(5, 1fr); gap: 6px; } +.app-cal-times { + display: flex; + flex-direction: column; + justify-content: space-between; + padding-top: 30px; + font-family: var(--font-mono); + font-size: 0.625rem; + color: var(--tm); +} +.app-cal-col { display: flex; flex-direction: column; } +.app-cal-day { font-size: 0.75rem; font-weight: 600; color: var(--ts); text-align: center; margin-bottom: 8px; } +.app-cal-track { + position: relative; + height: 240px; + border: 1px solid var(--bd); + border-radius: 8px; + background: var(--sf); + background-image: repeating-linear-gradient( + to bottom, transparent, transparent 47px, + var(--bdl) 47px, var(--bdl) 48px + ); +} +.app-ev { + position: absolute; + left: 4px; right: 4px; + border-radius: 6px; + font-size: 0.6875rem; + font-weight: 600; + padding: 4px 7px; + overflow: hidden; + line-height: 1.25; +} +.app-ev.busy { background: var(--bg3); color: var(--ts); border-left: 3px solid var(--tm); } +.app-ev.mine { background: var(--a-light); color: var(--a); border-left: 3px solid var(--a); } + /* ── Responsive ── */ @media (max-width: 900px) { - .hero, .split, .split-steps { grid-template-columns: 1fr; gap: 40px; } + .hero { grid-template-columns: 1fr; gap: 40px; } .hero { padding: 56px 24px 48px; } .hero-copy h1 { font-size: 2.5rem; } - .split { padding: 56px 24px; } .nav-inner { padding: 0 20px; gap: 16px; } .nav-links { display: none; } .cta-inner { padding: 64px 24px; } .footer-inner { padding: 32px 24px; } + .showcase { padding: 32px 20px 48px; } +} +@media (max-width: 620px) { + .app-side { display: none; } + .app-grid { grid-template-columns: 1fr; } + .app-row-title { display: none; } + .app-cal { grid-template-columns: 32px repeat(5, 1fr); gap: 4px; } + .app-cal-track { height: 180px; } + .app-search { display: none; } } @media (max-width: 560px) { .theme-label { display: none; } @@ -631,5 +928,6 @@ const selectedLabel = computed(() => { .hero-copy h1 { font-size: 2rem; } .btn-lg { padding: 12px 20px; font-size: 0.9375rem; } .nav-login { display: none; } + .app-pills { gap: 6px; } }