diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md index 43fc7ba..3b57564 100644 --- a/.paul/ROADMAP.md +++ b/.paul/ROADMAP.md @@ -50,8 +50,9 @@ Szczegóły w `wp-content/plugins/yacht-booking-system/PROJECT-STATUS.md`. - [x] 09-04: Globalna sync iCal (tryb wspólny kalendarz, bez filtrowania) + nowy widget "wszystkie jachty" (kolory per-jacht, half-day, bez ukośników, formularz inquiry, privacy w REST) ✅ 2026-05-07 - [x] 09-05: UX rezerwacja — tytuły rezerwacji z GCal w paskach + per-day allDay events + tooltip na hover (cofa privacy z 09-04 per żądanie klienta) ✅ 2026-05-07 - [x] 09-06: UX rezerwacja — blokada nawigacji kalendarza (REST `/availability/bounds` + validRange w FC) ✅ 2026-05-08 -- [ ] 09-07: Security audit i poprawki -- [ ] 09-08: Testy + tłumaczenia + dokumentacja +- [ ] 09-07: Kolory per jacht w kalendarzu zbiorczym (color picker w settings + dopasowanie po nazwie w tytule globalnych eventów GCal) +- [ ] 09-08: Security audit i poprawki +- [ ] 09-09: Testy + tłumaczenia + dokumentacja --- *Roadmap created: 2026-05-05* diff --git a/.paul/STATE.md b/.paul/STATE.md index 310af9e..3252648 100644 --- a/.paul/STATE.md +++ b/.paul/STATE.md @@ -10,21 +10,21 @@ See: .paul/PROJECT.md (updated 2026-05-05) ## Current Position Milestone: v1.0 Production Release (v1.0.0) -Phase: 9 of 9 (Finalizacja) — In progress -Plan: 09-06 — Complete (blokada nawigacji kalendarza) -Status: Loop closed, ready for next plan (09-07 Security audit) -Last activity: 2026-05-08 — Closed loop 09-06 (validRange + REST /availability/bounds) +Phase: 9 of 9 (Finalizacja) — Planning +Plan: 09-07 created, awaiting approval (Kolory per jacht w kalendarzu zbiorczym) +Status: PLAN created, ready for APPLY +Last activity: 2026-05-10 — Created .paul/phases/09-finalizacja/09-07-PLAN.md Progress: - Milestone: [█████████░] 97% -- Phase 9: [████████░░] 75% (6 of 8 plans complete) +- Phase 9: [██████░░░░] 67% (6 of 9 plans complete — security i docs przesunięte na 09-08/09-09) ## Loop Position Current loop state: ``` PLAN ──▶ APPLY ──▶ UNIFY - ✓ ✓ ✓ [Loop 09-06 complete, ready for 09-07] + ✓ ○ ○ [Plan 09-07 created, awaiting approval] ``` ## Accumulated Context @@ -44,9 +44,9 @@ PLAN ──▶ APPLY ──▶ UNIFY | Issue | Origin | Effort | Revisit | |-------|--------|--------|---------| -| Tłumaczenia PL | Phase 1-8 | M | Phase 9 (plan 09-08) | -| Security audit | Phase 1-8 + privacy revert 09-05 + bounds 09-06 | M | Phase 9 (plan 09-07) | -| Dokumentacja PHP Doc | Phase 1-8 | L | Phase 9 (plan 09-08) | +| Tłumaczenia PL | Phase 1-8 | M | Phase 9 (plan 09-09) | +| Security audit | Phase 1-8 + privacy revert 09-05 + bounds 09-06 | M | Phase 9 (plan 09-08) | +| Dokumentacja PHP Doc | Phase 1-8 | L | Phase 9 (plan 09-09) | ### Blockers/Concerns @@ -54,14 +54,14 @@ None. ## Session Continuity -Last session: 2026-05-08 -Stopped at: Loop 09-06 zamknięty — blokada nawigacji kalendarza zatwierdzona -Next action: Run /paul:plan to plan 09-07 (Security audit) -Resume file: .paul/phases/09-finalizacja/09-06-SUMMARY.md +Last session: 2026-05-10 +Stopped at: Plan 09-07 utworzony — kolory per jacht w kalendarzu zbiorczym +Next action: Review and approve plan, then run /paul:apply .paul/phases/09-finalizacja/09-07-PLAN.md +Resume file: .paul/phases/09-finalizacja/09-07-PLAN.md Resume context: -- Faza 9: 6/8 planów ukończonych (75%), milestone v1.0 97% -- Plugin v1.2.1: validRange w widgecie zbiorczym (prev disabled na bieżącym miesiącu, next disabled po maxDate) -- 09-07 (Security audit) ma TRZY publiczne endpointy do oceny: `/availability/{yacht_id}`, `/availability/all`, `/availability/bounds`; dodatkowo privacy revert (tytuły rezerwacji publicznie) +- Plan 09-07 wstawiony przed security audit (per żądaniu klienta — kolory w `/rezerwacja/`) +- Roadmap przesunięty: 09-07 kolory, 09-08 security, 09-09 docs +- 1 checkpoint human-verify na końcu (autonomous: false) - Brak open issues, brak blockers --- diff --git a/.paul/governance/governance_2026-05-10.jsonl b/.paul/governance/governance_2026-05-10.jsonl new file mode 100644 index 0000000..cfa0ee4 --- /dev/null +++ b/.paul/governance/governance_2026-05-10.jsonl @@ -0,0 +1,25 @@ +{"ts":"2026-05-10T11:56:04Z","tool":"Bash","cmd":"mkdir -p \".paul/phases/09-finalizacja\"\",\"description\":\"Ensure phase dir exists\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputExpected\":","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T11:57:43Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\phases\\\\09-finalizacja\\\\09-07-PLAN.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T11:57:51Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T11:57:58Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T11:58:02Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T11:58:10Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:02:43Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\includes\\\\class-yacht.php","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:02:53Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\admin\\\\views\\\\yacht-edit.php","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:02:57Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\admin\\\\views\\\\yacht-edit.php","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:03:12Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\admin\\\\class-admin.php","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:03:18Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\includes\\\\class-yacht-booking.php","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:03:25Z","tool":"Bash","cmd":"php -l \"wp-content/plugins/yacht-booking-system/includes/class-yacht.php\" && php -l \"wp-content/plugins/yacht-booking-system/admin/class-admin.php\" && php -l \"wp-content/plugins/yacht-booking-sys","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:03:52Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\api\\\\class-rest-controller.php","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:04:15Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\api\\\\class-rest-controller.php","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:04:22Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\api\\\\class-rest-controller.php","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:04:31Z","tool":"Bash","cmd":"php -l \"wp-content/plugins/yacht-booking-system/api/class-rest-controller.php\"\",\"description\":\"PHP lint Task 2\"},\"tool_response\":{\"stdout\":\"No syntax errors detected in wp-content/plugins/","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:04:48Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\class-calendar-widget-all.php","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:04:54Z","tool":"Bash","cmd":"php -l \"wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php\"\",\"description\":\"PHP lint Task 3\"},\"tool_response\":{\"stdout\":\"No syntax errors detected in wp-content","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:08:06Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar.scss","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:08:16Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar.css","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:52:44Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar-all.css","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:52:45Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar-all.css","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T12:54:48Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar-all.css","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T13:01:31Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar-all.css","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T13:01:34Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar-all.css","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} diff --git a/.paul/phases/09-finalizacja/09-07-PLAN.md b/.paul/phases/09-finalizacja/09-07-PLAN.md new file mode 100644 index 0000000..d991e2e --- /dev/null +++ b/.paul/phases/09-finalizacja/09-07-PLAN.md @@ -0,0 +1,225 @@ +--- +phase: 09-finalizacja +plan: 07 +type: execute +wave: 1 +depends_on: [] +files_modified: + - wp-content/plugins/yacht-booking-system/includes/class-yacht.php + - wp-content/plugins/yacht-booking-system/admin/class-admin.php + - wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php + - wp-content/plugins/yacht-booking-system/api/class-rest-controller.php + - wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php + - wp-content/plugins/yacht-booking-system/yacht-booking-system.php + - .paul/ROADMAP.md +autonomous: false +delegation: off +--- + + +## Goal +Dodać administracyjny wybór koloru per jacht (`_yacht_color`) i zastosować go w widgecie zbiorczym `/rezerwacja/`. Dla rezerwacji bez przypisanego `yacht_id` (eventy z globalnego Google Calendar, source=`ical_global_calendar`) dopasować jacht po występowaniu jego nazwy/aliasu w tytule rezerwacji (case-insensitive, w dowolnym miejscu) i pokolorować event kolorem tego jachtu. + +## Purpose +Klient chce rozróżniać jachty wzrokiem w jednym wspólnym kalendarzu — obecnie kolory są przydzielane automatycznie z palety i nie ma kontroli nad wyborem; dodatkowo eventy z globalnego GCal lecą jednym kolorem `GLOBAL_EVENT_COLOR`, mimo że tytuł zawiera nazwę jachtu. + +## Output +- Pole color picker w formularzu jachtu (`yacht-edit.php`) zapisywane do meta `_yacht_color` +- Backend `Rest_Controller::get_yacht_color_palette()` honoruje meta `_yacht_color` z fallbackiem na obecną paletę (deterministyczna paleta po `yacht_id` zachowana dla braków) +- `get_all_availability()` dla eventów `is_global_event === true` próbuje dopasować jacht po nazwie/aliasie w `post_title` rezerwacji i ustawia `color` + dodaje `yacht_id` do eventu (tylko do kolorystyki frontendu, bez zmiany danych w DB) +- Legenda widgetu zbiorczego pokazuje wybrane kolory +- ROADMAP zaktualizowany: 09-07 = ten plan, 09-08 = security audit, 09-09 = testy/tłumaczenia/dokumentacja + + + + +- **Numer planu** — Gdzie ten plan wpasować w roadmapę fazy 9? + → Odpowiedź: 09-07 (przed security audit). Security przesuwamy na 09-08, dokumentacja na 09-09. +- **Fallback** — Jak ma działać brak ustawionego koloru? + → Odpowiedź: Auto z palety (jak teraz, deterministycznie po `yacht_id`). +- **Zakres** — Czy kolor stosować również w widgecie pojedynczego jachtu? + → Odpowiedź: Tylko zbiorczy (`/rezerwacja/`). Pojedynczy widget bez zmian. +- **Global iCal** — Czy eventy z yacht_id=0 mają korzystać z koloru jachtu? + → Odpowiedź: Tak — nazwa jachtu może wystąpić w dowolnym miejscu w tytule rezerwacji (case-insensitive, substring). Najdłuższe trafienie wygrywa, brak trafienia → `GLOBAL_EVENT_COLOR`. + + +## Project Context +@.paul/PROJECT.md +@.paul/ROADMAP.md +@.paul/STATE.md + +## Source Files +@wp-content/plugins/yacht-booking-system/api/class-rest-controller.php +@wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php +@wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php +@wp-content/plugins/yacht-booking-system/admin/class-admin.php +@wp-content/plugins/yacht-booking-system/includes/class-yacht.php +@wp-content/plugins/yacht-booking-system/integrations/ical/class-ical-import.php + + + + +## AC-1: Admin może wybrać kolor jachtu +```gherkin +Given administrator otwiera formularz edycji jachtu (yacht-edit.php) +When wybierze kolor w polu "Kolor jachtu w kalendarzu zbiorczym" i zapisze formularz +Then meta `_yacht_color` jachtu zostaje zapisana jako sanitowany hex (`#rrggbb`) +And po przeładowaniu formularza widzi zapisany kolor w polu +``` + +## AC-2: Kolor admina ma priorytet w widgecie zbiorczym +```gherkin +Given jacht ma ustawione `_yacht_color = #ff6600` +When frontend pobiera `GET /availability/all` +Then eventy tego jachtu (yacht_id > 0) mają `backgroundColor = #ff6600` +And legenda widgetu pokazuje kolor #ff6600 obok jego nazwy +``` + +## AC-3: Fallback z palety dla jachtów bez ustawionego koloru +```gherkin +Given jacht nie ma `_yacht_color` (brak meta lub pusta wartość) +When frontend pobiera `GET /availability/all` +Then eventy tego jachtu otrzymują kolor z `YACHT_COLOR_PALETTE` (deterministycznie po posortowanym yacht_id, jak obecnie) +``` + +## AC-4: Globalne eventy GCal kolorowane po nazwie jachtu w tytule +```gherkin +Given event z globalnego kalendarza (yacht_id=0, source=`ical_global_calendar`) o tytule "Rezerwacja - Maja - Kowalski" +And istnieje jacht o `post_title = "Maja"` z kolorem `#3498db` (lub fallback z palety) +When frontend pobiera `GET /availability/all` +Then ten event ma `backgroundColor = #3498db` +And jeśli żadna nazwa/alias jachtu nie pojawia się w tytule → `backgroundColor = GLOBAL_EVENT_COLOR` +And gdy w tytule pasuje wiele nazw → wybierany jest najdłuższy (np. "Maja Bis" wygrywa z "Maja") +``` + + + + + + + Task 1: Pole koloru w formularzu jachtu + meta `_yacht_color` + + wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php, + wp-content/plugins/yacht-booking-system/admin/class-admin.php, + wp-content/plugins/yacht-booking-system/includes/class-yacht.php, + wp-content/plugins/yacht-booking-system/yacht-booking-system.php + + + 1. `class-yacht.php`: dodaj statyczne metody `get_color( $yacht_id ): string` (zwraca '' gdy brak meta) i `update_color( $yacht_id, $color )` z sanityzacją do `#rrggbb` (regex `/^#[0-9a-f]{6}$/i`, lowercase). Klucz meta: `_yacht_color`. + 2. `admin/views/yacht-edit.php`: w sekcji ustawień jachtu dodaj pole `` z labelem "Kolor jachtu (kalendarz zbiorczy)". Pod inputem krótki tekst pomocniczy: "Pozostaw puste, aby użyć automatycznego koloru z palety." + 3. `class-admin.php` → `save_yacht()`: po istniejących wpisach meta wywołaj `Yacht::update_color( $saved_id, $_POST['yacht_color'] ?? '' )`. Pusty string usuwa meta (delete_post_meta). + 4. `class-admin.php` → `enqueue_admin_assets()` lub punkt rejestrujący style admin: na stronie `yacht-bookings-add-yacht` enqueue `wp-color-picker` (style + script) oraz inline init: `jQuery('.yacht-color-picker').wpColorPicker();`. Inline JS wpięty przez `wp_add_inline_script( 'wp-color-picker', ... )`. + Avoid: zapisywanie surowej wartości z $_POST bez sanityzacji; nadpisywanie istniejącej meta gdy POST nie zawiera `yacht_color` (ale tutaj formularz zawsze wysyła to pole). + + + Edytuj jacht w panelu, ustaw kolor `#ff6600`, zapisz. Sprawdź `wp_postmeta`: `meta_key = _yacht_color`, `meta_value = #ff6600`. Wyczyść pole, zapisz → meta usunięta. `php -l` na każdym zmienionym pliku. + + AC-1 satisfied. + + + + Task 2: Backend — `_yacht_color` w palecie + matching globalnych eventów po nazwie + + wp-content/plugins/yacht-booking-system/api/class-rest-controller.php + + + 1. `get_yacht_color_palette( $yacht_ids )`: dla każdego `yacht_id` najpierw spróbuj `Yacht::get_color( $yacht_id )`; jeśli niepuste — użyj. Inaczej fallback na obecny algorytm `palette[i % count]` (i = pozycja w posortowanej tablicy ID, jak teraz). Wynik nadal `array`. + 2. `get_all_availability()`: zbuduj mapę dopasowań nazwa→yacht_id raz przed pętlą eventów: + - Pobierz wszystkie publish jachty z polami `ID, post_title`. + - Dla każdego: dodaj wpis `[strtolower(post_title) => yacht_id]` oraz, jeśli `Yacht::get_gcal_alias($id)` niepusty, `[strtolower($alias) => yacht_id]`. + - Posortuj klucze malejąco po długości (najdłuższy match wygrywa). + 3. W pętli eventów, gdy `$is_global_event === true` (yacht_id=0 lub source=GLOBAL_CALENDAR_SOURCE): + - Weź `post_title` rezerwacji (`$booking->post_title`), zlowercase'uj. + - Iteruj po posortowanej liście kluczy; pierwszy `mb_strpos($title_lower, $key) !== false` wygrywa → `$matched_yacht_id = mapa[key]`. + - Jeśli match → `$color = $color_map[$matched_yacht_id] ?? GLOBAL_EVENT_COLOR`. Brak → `$color = GLOBAL_EVENT_COLOR` (jak teraz). + - Nie modyfikuj `yacht_id` w odpowiedzi (zostaje 0); kolor wystarczy do wizualizacji. + 4. Zachowaj obecne zachowanie dla eventów per-yacht (`yacht_id > 0`) bez zmian. + Avoid: case-sensitive porównań; budowania mapy w pętli (perf); modyfikowania danych eventu poza polem `color`. + + + `php -l class-rest-controller.php`. Ręcznie: `curl '/wp-json/yacht-booking/v1/availability/all?start=2026-05-01&end=2026-06-01' | jq '.[] | {title, color}'` — eventy globalne z nazwą jachtu w tytule mają kolor jachtu, bez nazwy → `#7fb3d5`. Per-yacht jachty z ustawionym `_yacht_color` mają ten kolor. + + AC-2, AC-3, AC-4 satisfied. + + + + Task 3: Legenda widgetu zbiorczego + ROADMAP update + + wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php, + .paul/ROADMAP.md + + + 1. `class-calendar-widget-all.php`: linia ~149-179 — `get_yacht_color_palette()` po Task 2 już honoruje `_yacht_color`, więc legenda dostanie poprawne kolory bez zmian logiki. Zweryfikuj że `$color_map` przekazywana do legendy jest taką samą referencją (jeśli nie — ujednolicić). Jeśli logika legendy oczekuje `palette[i % count]`, zaktualizować by używała tej samej funkcji co backend. + 2. `.paul/ROADMAP.md`: w sekcji "Plans" Phase 9: + - Dodaj `- [ ] 09-07: Kolory per jacht w kalendarzu zbiorczym (color picker + dopasowanie po nazwie)` + - Przesuń istniejące: `09-07: Security audit` → `09-08`, `09-08: Testy + tłumaczenia + dokumentacja` → `09-09`. + - Zaktualizuj nagłówek "Phases: 8 of 9 complete" oraz tabelę faz (Phase 9 plans count) jeśli to potrzebne. + Avoid: dotykania STATE.md tutaj — to robi krok update_state w workflow. + + + Otwórz `/rezerwacja/`, sprawdź wzrokowo: legenda u góry pokazuje kolory jachtów = wybranym w panelu (lub fallback z palety dla braków). `.paul/ROADMAP.md` zawiera 09-07 jako kolory, 09-08 jako security, 09-09 jako docs. + + AC-2 (legenda) satisfied; roadmap zsynchronizowany z planem. + + + + + Pole koloru w formularzu jachtu + zastosowanie kolorów w widgecie zbiorczym (`/rezerwacja/`) z dopasowaniem nazwy jachtu w tytule eventów globalnych. + + + 1. Wejdź do panelu admina → Jachty → wybierz dwa jachty, ustaw różne kolory (np. `#ff6600`, `#1abc9c`). Trzeci zostaw bez koloru. + 2. Odśwież `https://jachty3.pagedev.pl/rezerwacja/`. + 3. Sprawdź: + - Rezerwacje pierwszych dwóch jachtów mają wybrane kolory. + - Rezerwacje trzeciego jachtu mają kolor z palety (auto). + - Eventy z globalnego GCal, których tytuł zawiera nazwę jednego z dwóch pierwszych jachtów, też dostają jego kolor. + - Legenda u góry kalendarza zbiorczego pokazuje te same kolory. + 4. Wyczyść kolor jednego jachtu w panelu, zapisz, odśwież `/rezerwacja/` → ten jacht wraca do koloru z palety. + + Wpisz "approved" aby zamknąć plan przez `/paul:unify`, lub opisz zaobserwowane problemy. + + + + + + +## DO NOT CHANGE +- `wp-content/plugins/yacht-booking-system/integrations/ical/class-ical-import.php` (per-yacht prefix matching pozostaje bez zmian — zmieniamy tylko prezentację w `/availability/all`) +- `wp_yacht_availability` (schemat) +- Pojedynczy widget jachtu (`class-calendar-widget.php`) — kolory tam bez zmian +- Endpoint `/availability/{yacht_id}` — bez zmian +- `GLOBAL_EVENT_COLOR` jako fallback (nadal `#7fb3d5`) +- `YACHT_COLOR_PALETTE` jako fallback (nadal 8 hex) + +## SCOPE LIMITS +- Bez migracji DB (meta dodawana on-demand przez update_post_meta) +- Bez zmian w warstwie GCal sync (push/pull do Google) — kolory są tylko widoczne w naszym widgecie zbiorczym +- Bez tłumaczeń pól (PL hardcoded; tłumaczenia objęte planem 09-09) +- Bez zmian w endpointach REST poza `get_all_availability()` +- Brak wsparcia dla CSS gradient/secondary color — jeden hex per jacht + + + + +- [ ] `php -l` przechodzi na wszystkich zmienionych plikach PHP +- [ ] Po zapisie formularza jachtu z kolorem `_yacht_color` jest w `wp_postmeta` +- [ ] Po wyczyszczeniu pola meta jest usuwana +- [ ] `GET /wp-json/yacht-booking/v1/availability/all` zwraca `color` zgodny z meta lub paletą fallback +- [ ] Globalne eventy GCal z nazwą jachtu w tytule kolorowane kolorem tego jachtu +- [ ] Najdłuższe dopasowanie wygrywa (np. "Maja Bis" > "Maja") +- [ ] Brak match → `GLOBAL_EVENT_COLOR` +- [ ] Legenda widgetu zbiorczego spójna z kolorami eventów +- [ ] ROADMAP.md odzwierciedla nową kolejność (07 kolory, 08 security, 09 docs) +- [ ] Wszystkie kryteria akceptacji spełnione przy weryfikacji manualnej + + + +- Wszystkie zadania ukończone i zweryfikowane +- Brak regresji w widgecie pojedynczego jachtu +- Brak regresji w existing per-yacht iCal import (matching prefix nadal działa) +- Klient akceptuje kolory na `/rezerwacja/` + + + +Po ukończeniu utwórz `.paul/phases/09-finalizacja/09-07-SUMMARY.md`. + diff --git a/wp-content/plugins/yacht-booking-system/admin/class-admin.php b/wp-content/plugins/yacht-booking-system/admin/class-admin.php index 95e0e31..6282d48 100644 --- a/wp-content/plugins/yacht-booking-system/admin/class-admin.php +++ b/wp-content/plugins/yacht-booking-system/admin/class-admin.php @@ -412,6 +412,10 @@ class Admin { $gcal_alias = isset( $data['yacht_gcal_alias'] ) ? sanitize_text_field( wp_unslash( $data['yacht_gcal_alias'] ) ) : ''; Yacht::update_gcal_alias( $saved_id, $gcal_alias ); + // Save admin-selected color for aggregated calendar. + $yacht_color = isset( $data['yacht_color'] ) ? sanitize_text_field( wp_unslash( $data['yacht_color'] ) ) : ''; + Yacht::update_color( $saved_id, $yacht_color ); + return $saved_id; } diff --git a/wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php b/wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php index 98ba488..092f1e6 100644 --- a/wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php +++ b/wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php @@ -13,7 +13,8 @@ if ( ! defined( 'ABSPATH' ) ) { // Get yacht data $title = $yacht ? $yacht->post_title : ''; $content = $yacht ? $yacht->post_content : ''; -$gcal_alias = $yacht ? \YachtBooking\Yacht::get_gcal_alias( $yacht->ID ) : ''; +$gcal_alias = $yacht ? \YachtBooking\Yacht::get_gcal_alias( $yacht->ID ) : ''; +$yacht_color = $yacht ? \YachtBooking\Yacht::get_color( $yacht->ID ) : ''; $page_title = $yacht ? __( 'Edytuj Jacht', 'yacht-booking' ) : __( 'Dodaj Jacht', 'yacht-booking' ); ?> @@ -86,6 +87,28 @@ $page_title = $yacht ? __( 'Edytuj Jacht', 'yacht-booking' ) : __( 'Dodaj Jacht' + + + + + + + +

+ +

+ + + diff --git a/wp-content/plugins/yacht-booking-system/api/class-rest-controller.php b/wp-content/plugins/yacht-booking-system/api/class-rest-controller.php index 8fb170b..bc320de 100644 --- a/wp-content/plugins/yacht-booking-system/api/class-rest-controller.php +++ b/wp-content/plugins/yacht-booking-system/api/class-rest-controller.php @@ -376,18 +376,40 @@ class Rest_Controller extends \WP_REST_Controller { $is_global_mode = ( 'global' === Settings::get_ical_sync_mode() ); - // Build yacht_id → color map (deterministic by ascending yacht_id). - $yacht_posts = get_posts( + // Build yacht_id → color map (admin-selected `_yacht_color` lub fallback z palety po ID). + $yacht_posts_full = get_posts( array( 'post_type' => 'yacht', 'post_status' => 'publish', 'posts_per_page' => -1, 'orderby' => 'ID', 'order' => 'ASC', - 'fields' => 'ids', ) ); - $color_map = self::get_yacht_color_palette( $yacht_posts ); + $yacht_ids = array(); + foreach ( $yacht_posts_full as $yp ) { + $yacht_ids[] = (int) $yp->ID; + } + $color_map = self::get_yacht_color_palette( $yacht_ids ); + + // Build name/alias → yacht_id map (lowercase keys, sorted by length DESC for longest match). + $name_map = array(); + foreach ( $yacht_posts_full as $yp ) { + $title = mb_strtolower( trim( (string) $yp->post_title ) ); + if ( '' !== $title ) { + $name_map[ $title ] = (int) $yp->ID; + } + $alias = mb_strtolower( trim( (string) \YachtBooking\Yacht::get_gcal_alias( $yp->ID ) ) ); + if ( '' !== $alias ) { + $name_map[ $alias ] = (int) $yp->ID; + } + } + uksort( + $name_map, + function( $a, $b ) { + return mb_strlen( $b ) - mb_strlen( $a ); + } + ); // Query bookings overlapping [start, end] with status confirmed or pending. $bookings = get_posts( @@ -437,15 +459,6 @@ class Rest_Controller extends \WP_REST_Controller { $source = (string) get_post_meta( $booking_id, '_booking_source', true ); $is_global_event = ( 0 === $yacht_id || \YachtBooking\Integrations\ICal\ICal_Import::GLOBAL_CALENDAR_SOURCE === $source ); - // Color: zachowane z poprzedniej logiki (per-yacht paleta lub kolor global). - if ( $is_global_mode || $is_global_event ) { - $color = self::GLOBAL_EVENT_COLOR; - $y_id = 0; - } else { - $color = isset( $color_map[ $yacht_id ] ) ? $color_map[ $yacht_id ] : self::GLOBAL_EVENT_COLOR; - $y_id = $yacht_id; - } - // Title: raw SUMMARY z _booking_notes (iCal) lub customer_name (frontend). // Klient świadomie cofa privacy z 09-04 — tytuły rezerwacji widoczne publicznie. if ( in_array( $source, $ical_sources, true ) ) { @@ -457,6 +470,26 @@ class Rest_Controller extends \WP_REST_Controller { } $title = sanitize_text_field( $title ); + // Color resolution: + // - per-yacht event (yacht_id > 0): admin color or palette fallback + // - global event (yacht_id = 0): match yacht name/alias anywhere in title (longest wins) + if ( ! $is_global_event ) { + $color = isset( $color_map[ $yacht_id ] ) ? $color_map[ $yacht_id ] : self::GLOBAL_EVENT_COLOR; + $y_id = $yacht_id; + } else { + $color = self::GLOBAL_EVENT_COLOR; + $y_id = 0; + $title_lower = mb_strtolower( $title ); + foreach ( $name_map as $needle => $matched_id ) { + if ( '' !== $needle && false !== mb_strpos( $title_lower, $needle ) ) { + if ( isset( $color_map[ $matched_id ] ) ) { + $color = $color_map[ $matched_id ]; + } + break; + } + } + } + // Split na N eventów per dzień (allDay = każdy event mieści się w jednej komórce). // Iteracja od start_date do end_date INCLUSIVE — pierwszy i ostatni dzień // mają half-day visual (yacht odbierany / zwracany w południe). @@ -562,7 +595,8 @@ class Rest_Controller extends \WP_REST_Controller { $map = array(); foreach ( $ids as $i => $yacht_id ) { - $map[ $yacht_id ] = $palette[ $i % $count ]; + $admin_color = \YachtBooking\Yacht::get_color( $yacht_id ); + $map[ $yacht_id ] = '' !== $admin_color ? $admin_color : $palette[ $i % $count ]; } return $map; diff --git a/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar-all.css b/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar-all.css index e70f413..aeaa79d 100644 --- a/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar-all.css +++ b/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar-all.css @@ -79,11 +79,20 @@ /* Event styling — pełne wypełnienie kafelka kolorem jachtu, bez kropek/czasu */ .yacht-calendar-all .fc-event { border: none !important; - padding: 2px 4px; + padding: 0 1px; font-size: 12px; font-weight: 500; color: #fff; cursor: default; + display: flex; + align-items: center; +} + +.yacht-calendar-all .fc-event-main { + display: flex; + align-items: center; + width: 100%; + height: 100%; } .yacht-calendar-all .fc-daygrid-event-dot, @@ -93,7 +102,7 @@ /* Custom kontener tytułu (renderowany przez eventContent w JS). */ .yacht-calendar-all .yc-event-title { - padding: 1px 6px; + padding: 0 2px; font-size: 11px; font-weight: 600; color: #fff; @@ -102,13 +111,15 @@ overflow: hidden; text-overflow: ellipsis; line-height: 1.3; + text-align: center; + width: 100%; } /* Pasek eventu wyższy + gap między dziennymi segmentami (rezerwacja wielonocna = N osobnych pasków zamiast jednej belki — patrz REST split per-day). */ .yacht-calendar-all .fc-daygrid-event { min-height: 18px; - margin: 1px 2px !important; + margin: 1px 0 !important; border-radius: 2px; } @@ -123,7 +134,7 @@ .yacht-calendar-all .yc-event-title { font-size: 10px; - padding: 1px 4px; + padding: 0 1px; } .yacht-calendar-all .fc-toolbar.fc-header-toolbar { diff --git a/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css b/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css index 05302da..e80055a 100644 --- a/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css +++ b/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css @@ -1 +1 @@ -.yacht-calendar-wrapper{max-width:1200px;margin:0 auto 40px;padding:20px}.yacht-calendar-switcher{width:100vw;margin-left:50%;transform:translateX(-50%);border:none;padding:80px 20px;border-radius:0;display:flex;flex-direction:column;align-items:center;margin-bottom:0;justify-content:center;background:#0e2036;gap:30px}.yacht-calendar-switcher-label{font-family:"DM Sans",Sans-serif !important;font-size:80px;font-weight:500;letter-spacing:-0.04em;color:var(--e-global-color-7077776);line-height:.8}@media(max-width: 768px){.yacht-calendar-switcher-label{font-size:64px}}@media(max-width: 480px){.yacht-calendar-switcher-label{font-size:48px}}.yacht-calendar-switcher-buttons{display:flex;flex-wrap:wrap;gap:8px}.yacht-calendar-switcher-button{font-family:"JetBrains Mono",Sans-serif !important;font-size:.75rem !important;font-weight:500 !important;text-transform:uppercase;line-height:1 !important;letter-spacing:.25em !important;padding:16px 32px 16px 32px !important;border-radius:0 !important;background:#bc1834 !important;color:#fff !important;border:none !important;cursor:pointer !important}.yacht-calendar-switcher-button:hover{background:#a9000c !important}.yacht-calendar-switcher-button.is-active{background:#bc1834;border-color:#bc1834;color:#fff;box-shadow:0 8px 18px rgba(188,24,52,.18)}.yacht-calendar-header{margin-bottom:30px}.yacht-calendar-title{font-size:28px;font-weight:700;color:#021526;margin:0 0 15px 0}.yacht-calendar-description{color:#666;font-size:16px;line-height:1.6}.yacht-calendar-instructions{margin:0 0 30px 0;padding:12px 14px;color:#fff;border-left:1px solid red;background:#d40924;border:none;border-radius:0}.yacht-calendar-instructions p{margin:0;font-family:"Inter Tight",Sans-serif;font-size:1rem;font-weight:400}.yacht-calendar-legend{display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center;margin:0 0 18px 0}.yacht-legend-item{display:inline-flex;align-items:center;gap:8px;color:#fff;font-family:"Roboto",Sans-serif;font-size:15px;font-weight:300}.yacht-legend-swatch{width:16px;height:16px;border-radius:4px;border:1px solid rgba(0,0,0,.2)}.yacht-legend-swatch-past{background:#d0d5dd}.yacht-calendar{margin-bottom:30px;background:hsla(0,0%,100%,.1) f;border-radius:8px;box-shadow:0 2px 12px rgba(0,0,0,.08);padding:20px}.yacht-calendar .fc{font-family:inherit}.yacht-calendar .fc-button-primary{background:#bc1834;border-color:#bc1834;text-transform:uppercase;font-weight:600;font-size:13px;padding:8px 16px}.yacht-calendar .fc-button-primary:hover{background:#021526;border-color:#021526}.yacht-calendar .fc-button-primary:not(:disabled):active{background:#021526;border-color:#021526}.yacht-calendar .fc-button-primary:not(:disabled).fc-button-active{background:#021526;border-color:#021526}.yacht-calendar .fc-daygrid-day.fc-day-past{background:#f5f5f5;opacity:1}.yacht-calendar .fc-daygrid-day.fc-day-past .fc-daygrid-day-number{color:#6c757d}.yacht-calendar .fc-daygrid-day-number,.yacht-calendar a.fc-daygrid-day-number{color:#021526 !important;font-weight:600}.yacht-calendar .fc-daygrid-day:hover{background:#f8f9fa}.yacht-calendar .fc-highlight{background:rgba(188,24,52,.1) !important}.yacht-calendar .fc-daygrid-day-top{display:flex;justify-content:center;align-items:center;padding:5px}.yacht-calendar .fc-daygrid-day-number{padding:4px 6px;min-width:28px;text-align:center;display:inline-block;font-size:14px;line-height:1.2}.yacht-calendar .fc-daygrid-day-frame{min-height:80px;display:flex;flex-direction:column;position:relative}.yacht-calendar .fc-bg-event{opacity:.78 !important}.yacht-calendar .fc-bg-event.yacht-day-available{opacity:.66 !important}.yacht-calendar .fc-bg-event.yacht-day-booked{opacity:.92 !important}.yacht-calendar .fc-bg-event.yacht-day-blocked{opacity:.92 !important}.yacht-calendar .fc-bg-event.yacht-day-booked-start,.yacht-calendar .fc-bg-event.yacht-day-blocked-start{background:linear-gradient(135deg,var(--yacht-available-bg, #f5f9ff) 0%,var(--yacht-available-bg, #f5f9ff) 50%,var(--yacht-booked-bg, #bc1834) 50%,var(--yacht-booked-bg, #bc1834) 100%) !important;opacity:.92 !important}.yacht-calendar .fc-bg-event.yacht-day-booked-end,.yacht-calendar .fc-bg-event.yacht-day-blocked-end{background:linear-gradient(135deg,var(--yacht-booked-bg, #bc1834) 0%,var(--yacht-booked-bg, #bc1834) 50%,var(--yacht-available-bg, #f5f9ff) 50%,var(--yacht-available-bg, #f5f9ff) 100%) !important;opacity:.92 !important}.yacht-day-available{cursor:pointer}.yacht-day-booked{cursor:not-allowed}.yacht-day-blocked{cursor:not-allowed}.yacht-booking-form-container{background:#f9f9f9;padding:30px;border-radius:8px;margin-top:30px;border:1px solid #e0e0e0}.yacht-booking-form-container h4{margin:0 0 25px 0;font-size:22px;font-weight:700;color:#021526}.yacht-booking-form .form-row{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:20px}.yacht-booking-form .form-field{margin-bottom:20px}.yacht-booking-form label{display:block;font-weight:600;margin-bottom:8px;color:#333;font-size:14px}.yacht-booking-form label .required{color:#bc1834;margin-left:2px}.yacht-booking-form input[type=text]{width:100%;padding:12px 15px;border:1px solid #ddd;border-radius:4px;font-size:16px;transition:border-color .3s ease,box-shadow .3s ease;background:#fff;box-sizing:border-box}.yacht-booking-form input[type=email]{width:100%;padding:12px 15px;border:1px solid #ddd;border-radius:4px;font-size:16px;transition:border-color .3s ease,box-shadow .3s ease;background:#fff;box-sizing:border-box}.yacht-booking-form input[type=tel]{width:100%;padding:12px 15px;border:1px solid #ddd;border-radius:4px;font-size:16px;transition:border-color .3s ease,box-shadow .3s ease;background:#fff;box-sizing:border-box}.yacht-booking-form input[type=date]{width:100%;padding:12px 15px;border:1px solid #ddd;border-radius:4px;font-size:16px;transition:border-color .3s ease,box-shadow .3s ease;background:#fff;box-sizing:border-box}.yacht-booking-form input:focus{outline:none;border-color:#bc1834;box-shadow:0 0 0 3px rgba(188,24,52,.1)}.yacht-booking-form input:-moz-read-only{background:#f5f5f5;cursor:not-allowed}.yacht-booking-form input:read-only{background:#f5f5f5;cursor:not-allowed}.yacht-booking-form .form-actions{margin-top:25px}.booking-terms{margin-top:18px;font-size:14px;line-height:1.5;color:#333}.booking-terms a{color:#bc1834;text-decoration:underline}.yacht-booking-submit{font-family:"JetBrains Mono",Sans-serif !important;font-size:.75rem !important;font-weight:500 !important;text-transform:uppercase;line-height:1 !important;letter-spacing:.25em !important;padding:16px 32px 16px 32px !important;border-radius:0 !important;background:#bc1834 !important;color:#fff !important;border:none !important;cursor:pointer !important;transition:all .3s ease;width:100%}.yacht-booking-submit:hover{background:#a9000c !important}.yacht-booking-submit:disabled{background:#ccc;cursor:not-allowed;transform:none;box-shadow:none}.yacht-booking-response{margin-top:20px}.booking-success{padding:15px;border-radius:4px;font-size:15px;line-height:1.5}.booking-success strong{display:block;margin-bottom:5px}.booking-error{padding:15px;border-radius:4px;font-size:15px;line-height:1.5}.booking-error strong{display:block;margin-bottom:5px}.yacht-calendar-error{padding:20px;border-radius:4px;margin-bottom:20px}.yacht-calendar-error p{margin:0;line-height:1.5}.yacht-calendar-notice{padding:20px;border-radius:4px;margin-bottom:20px}.yacht-calendar-notice p{margin:0;line-height:1.5}.yacht-calendar-view-only{max-width:1200px;padding:15px 15px 0 15px;margin-bottom:0}.yacht-calendar-view-only .yacht-calendar-header{margin-bottom:15px}.yacht-calendar-view-only .yacht-calendar-title{font-size:22px;margin-bottom:10px}.yacht-calendar-view-only .yacht-calendar-instructions{margin-bottom:30px;padding:8px 12px;font-size:13px}.yacht-calendar-view-only .yacht-calendar-legend{margin-bottom:10px;font-size:13px}.yacht-calendar-view-only .yacht-calendar{padding:10px;margin-bottom:0;height:auto !important;overflow:visible}.yacht-calendar-view-only .fc-daygrid-day-frame{min-height:36px}.yacht-calendar-view-only .fc-daygrid-day-top{padding:2px}.yacht-calendar-view-only .fc-daygrid-day-number{padding:2px 4px;min-width:22px;font-size:12px}.yacht-calendar-view-only .fc-col-header-cell{font-size:12px;padding:4px 0}.yacht-calendar-view-only .fc-button{font-size:11px !important;padding:5px 10px !important}.yacht-calendar-view-only .fc-toolbar-title{font-size:16px !important}.yacht-inquiry-layout{display:grid;grid-template-columns:1fr 1fr;gap:24px;align-items:start;margin-bottom:30px}.yacht-inquiry-form-container{background:#021526;padding:24px;border-radius:8px;border:none}.yacht-inquiry-form-container h4{margin:0 0 8px 0;font-size:20px;font-weight:700;color:#fff}.yacht-inquiry-desc{margin:0 0 18px 0;color:hsla(0,0%,100%,.7);font-size:14px;line-height:1.5}.yacht-inquiry-form .form-field{margin-bottom:14px}.yacht-inquiry-form label{display:block;font-weight:600;margin-bottom:5px;color:hsla(0,0%,100%,.9);font-size:13px}.yacht-inquiry-form label .required{color:#ff6b6b;margin-left:2px}.yacht-inquiry-form input[type=text]{width:100%;padding:10px 12px;border:1px solid hsla(0,0%,100%,.2);border-radius:4px;font-size:14px;transition:border-color .3s ease,box-shadow .3s ease;background:hsla(0,0%,100%,.1);color:#fff;box-sizing:border-box;font-family:inherit}.yacht-inquiry-form input[type=email]{width:100%;padding:10px 12px;border:1px solid hsla(0,0%,100%,.2);border-radius:4px;font-size:14px;transition:border-color .3s ease,box-shadow .3s ease;background:hsla(0,0%,100%,.1);color:#fff;box-sizing:border-box;font-family:inherit}.yacht-inquiry-form input[type=tel]{width:100%;padding:10px 12px;border:1px solid hsla(0,0%,100%,.2);border-radius:4px;font-size:14px;transition:border-color .3s ease,box-shadow .3s ease;background:hsla(0,0%,100%,.1);color:#fff;box-sizing:border-box;font-family:inherit}.yacht-inquiry-form textarea{width:100%;padding:10px 12px;border:1px solid hsla(0,0%,100%,.2);border-radius:4px;font-size:14px;transition:border-color .3s ease,box-shadow .3s ease;background:hsla(0,0%,100%,.1);color:#fff;box-sizing:border-box;font-family:inherit;resize:vertical;min-height:60px}.yacht-inquiry-form textarea::-moz-placeholder{color:hsla(0,0%,100%,.4)}.yacht-inquiry-form textarea::placeholder{color:hsla(0,0%,100%,.4)}.yacht-inquiry-form textarea:focus{outline:none;border-color:#bc1834;box-shadow:0 0 0 3px rgba(188,24,52,.3);background:hsla(0,0%,100%,.15)}.yacht-inquiry-form input::-moz-placeholder{color:hsla(0,0%,100%,.4)}.yacht-inquiry-form input::placeholder{color:hsla(0,0%,100%,.4)}.yacht-inquiry-form input:focus{outline:none;border-color:#bc1834;box-shadow:0 0 0 3px rgba(188,24,52,.3);background:hsla(0,0%,100%,.15)}.yacht-inquiry-form .form-actions{margin-top:18px}.yacht-inquiry-form .booking-terms{color:hsla(0,0%,100%,.6);font-size:13px}.yacht-inquiry-form .booking-terms a{color:hsla(0,0%,100%,.85)}.yacht-inquiry-form .yacht-booking-submit{background:#bc1834;border-color:#bc1834;color:#fff}.yacht-inquiry-form .yacht-booking-submit:hover{background:#fff;color:#021526}.yacht-inquiry-response{margin-top:15px}@media(max-width: 992px){.yacht-calendar-title{font-size:24px}.yacht-calendar{padding:15px}.yacht-inquiry-layout{grid-template-columns:1fr}}@media(max-width: 768px){.yacht-inquiry-form-container{padding:18px}.yacht-calendar-title{font-size:22px}.yacht-calendar{padding:10px}.yacht-calendar .fc-toolbar{flex-direction:column;gap:10px}.yacht-calendar .fc-toolbar-chunk{display:flex;justify-content:center;width:100%}.yacht-calendar .fc-button{font-size:12px;padding:6px 12px}.yacht-calendar-legend{gap:8px 12px}.yacht-booking-form-container{padding:20px}.yacht-booking-form .form-row{grid-template-columns:1fr;gap:0}}@media(max-width: 480px){.yacht-calendar-switcher-button{width:100%;justify-content:center}.yacht-calendar-title{font-size:20px}.yacht-booking-form-container{padding:15px}.yacht-booking-form input[type=text]{font-size:14px;padding:10px 12px}.yacht-booking-form input[type=email]{font-size:14px;padding:10px 12px}.yacht-booking-form input[type=tel]{font-size:14px;padding:10px 12px}.yacht-booking-submit{padding:12px 20px;font-size:14px}}body a:not([href]):not([tabindex]),body a:not([href]):not([tabindex]):focus,body a:not([href]):not([tabindex]):hover{color:#fff}body .fc .fc-day-other .fc-daygrid-day-top{opacity:1}.yacht-calendar{--fc-border-color:#0e2036}.yacht-calendar .fc{--fc-border-color:#0e2036}.yacht-calendar .fc-theme-standard td,.yacht-calendar .fc-theme-standard th,.yacht-calendar .fc-theme-standard .fc-scrollgrid,.yacht-calendar .fc-scrollgrid,.yacht-calendar .fc-scrollgrid-section>*,.yacht-calendar .fc-daygrid-day,.yacht-calendar .fc-col-header-cell{border-color:#0e2036 !important}.yacht-calendar .fc-col-header-cell{background:#0e2036;color:#fff}.yacht-calendar .fc-col-header-cell .fc-col-header-cell-cushion{color:#fff;font-weight:600;padding:8px 4px}table{margin-bottom:0 !important}/*# sourceMappingURL=calendar.css.map */ \ No newline at end of file +.yacht-calendar-wrapper{max-width:1200px;margin:0 auto 40px;padding:20px}.yacht-calendar-switcher{width:100vw;margin-left:50%;transform:translateX(-50%);border:none;padding:80px 20px;border-radius:0;display:flex;flex-direction:column;align-items:center;margin-bottom:0;justify-content:center;background:#0e2036;gap:30px}.yacht-calendar-switcher-label{font-family:"DM Sans",Sans-serif !important;font-size:80px;font-weight:500;letter-spacing:-0.04em;color:var(--e-global-color-7077776);line-height:.8}@media(max-width: 768px){.yacht-calendar-switcher-label{font-size:64px}}@media(max-width: 480px){.yacht-calendar-switcher-label{font-size:48px}}.yacht-calendar-switcher-buttons{display:flex;flex-wrap:wrap;gap:8px}.yacht-calendar-switcher-button{font-family:"JetBrains Mono",Sans-serif !important;font-size:.75rem !important;font-weight:500 !important;text-transform:uppercase;line-height:1 !important;letter-spacing:.25em !important;padding:16px 32px 16px 32px !important;border-radius:0 !important;background:#bc1834 !important;color:#fff !important;border:none !important;cursor:pointer !important}.yacht-calendar-switcher-button:hover{background:#a9000c !important}.yacht-calendar-switcher-button.is-active{background:#bc1834;border-color:#bc1834;color:#fff;box-shadow:0 8px 18px rgba(188,24,52,.18)}.yacht-calendar-header{margin-bottom:30px}.yacht-calendar-title{font-size:28px;font-weight:700;color:#021526;margin:0 0 15px 0}.yacht-calendar-description{color:#666;font-size:16px;line-height:1.6}.yacht-calendar-instructions{margin:0 0 30px 0;padding:12px 14px;color:#fff;border-left:1px solid red;background:#d40924;border:none;border-radius:0}.yacht-calendar-instructions p{margin:0;font-family:"Inter Tight",Sans-serif;font-size:1rem;font-weight:400}.yacht-calendar-legend{display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center;margin:0 0 18px 0}.yacht-legend-item{display:inline-flex;align-items:center;gap:8px;color:#fff;font-family:"Roboto",Sans-serif;font-size:15px;font-weight:300}.yacht-legend-swatch{width:16px;height:16px;border-radius:4px;border:1px solid rgba(0,0,0,.2)}.yacht-legend-swatch-past{background:#d0d5dd}.yacht-calendar{margin-bottom:30px;background:hsla(0,0%,100%,.1) f;border-radius:8px;box-shadow:0 2px 12px rgba(0,0,0,.08);padding:20px}.yacht-calendar .fc{font-family:inherit}.yacht-calendar .fc-button-primary{background:#bc1834;border-color:#bc1834;text-transform:uppercase;font-weight:600;font-size:13px;padding:8px 16px}.yacht-calendar .fc-button-primary:hover{background:#021526;border-color:#021526}.yacht-calendar .fc-button-primary:not(:disabled):active{background:#021526;border-color:#021526}.yacht-calendar .fc-button-primary:not(:disabled).fc-button-active{background:#021526;border-color:#021526}.yacht-calendar .fc-daygrid-day.fc-day-past{background:#f5f5f5;opacity:1}.yacht-calendar .fc-daygrid-day.fc-day-past .fc-daygrid-day-number{color:#6c757d}.yacht-calendar .fc-daygrid-day-number,.yacht-calendar a.fc-daygrid-day-number{color:#021526 !important;font-weight:600}.yacht-calendar .fc-daygrid-day:hover{background:#f8f9fa}.yacht-calendar .fc-highlight{background:rgba(188,24,52,.1) !important}.yacht-calendar .fc-daygrid-day-top{display:flex;justify-content:center;align-items:center;padding:5px}.yacht-calendar .fc-daygrid-day-number{padding:4px 6px;min-width:28px;text-align:center;display:inline-block;font-size:14px;line-height:1.2}.yacht-calendar .fc-daygrid-day-frame{min-height:80px;display:flex;flex-direction:column;position:relative}.yacht-calendar .fc-bg-event{opacity:.78 !important}.yacht-calendar .fc-bg-event.yacht-day-available{opacity:.66 !important}.yacht-calendar .fc-bg-event.yacht-day-booked{opacity:.92 !important}.yacht-calendar .fc-bg-event.yacht-day-blocked{opacity:.92 !important}.yacht-calendar .fc-bg-event.yacht-day-booked-start,.yacht-calendar .fc-bg-event.yacht-day-blocked-start{background:linear-gradient(135deg, var(--yacht-available-bg, #f5f9ff) 0%, var(--yacht-available-bg, #f5f9ff) 50%, var(--yacht-booked-bg, #bc1834) 50%, var(--yacht-booked-bg, #bc1834) 100%) !important;opacity:.92 !important}.yacht-calendar .fc-bg-event.yacht-day-booked-end,.yacht-calendar .fc-bg-event.yacht-day-blocked-end{background:linear-gradient(135deg, var(--yacht-booked-bg, #bc1834) 0%, var(--yacht-booked-bg, #bc1834) 50%, var(--yacht-available-bg, #f5f9ff) 50%, var(--yacht-available-bg, #f5f9ff) 100%) !important;opacity:.92 !important}.yacht-day-available{cursor:pointer}.yacht-day-booked{cursor:not-allowed}.yacht-day-blocked{cursor:not-allowed}.yacht-booking-form-container{background:#f9f9f9;padding:30px;border-radius:8px;margin-top:30px;border:1px solid #e0e0e0}.yacht-booking-form-container h4{margin:0 0 25px 0;font-size:22px;font-weight:700;color:#021526}.yacht-booking-form .form-row{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:20px}.yacht-booking-form .form-field{margin-bottom:20px}.yacht-booking-form label{display:block;font-weight:600;margin-bottom:8px;color:#333;font-size:14px}.yacht-booking-form label .required{color:#bc1834;margin-left:2px}.yacht-booking-form input[type=text]{width:100%;padding:12px 15px;border:1px solid #ddd;border-radius:4px;font-size:16px;transition:border-color .3s ease,box-shadow .3s ease;background:#fff;box-sizing:border-box}.yacht-booking-form input[type=email]{width:100%;padding:12px 15px;border:1px solid #ddd;border-radius:4px;font-size:16px;transition:border-color .3s ease,box-shadow .3s ease;background:#fff;box-sizing:border-box}.yacht-booking-form input[type=tel]{width:100%;padding:12px 15px;border:1px solid #ddd;border-radius:4px;font-size:16px;transition:border-color .3s ease,box-shadow .3s ease;background:#fff;box-sizing:border-box}.yacht-booking-form input[type=date]{width:100%;padding:12px 15px;border:1px solid #ddd;border-radius:4px;font-size:16px;transition:border-color .3s ease,box-shadow .3s ease;background:#fff;box-sizing:border-box}.yacht-booking-form input:focus{outline:none;border-color:#bc1834;box-shadow:0 0 0 3px rgba(188,24,52,.1)}.yacht-booking-form input:-moz-read-only{background:#f5f5f5;cursor:not-allowed}.yacht-booking-form input:read-only{background:#f5f5f5;cursor:not-allowed}.yacht-booking-form .form-actions{margin-top:25px}.booking-terms{margin-top:18px;font-size:14px;line-height:1.5;color:#333}.booking-terms a{color:#bc1834;text-decoration:underline}.yacht-booking-submit{font-family:"JetBrains Mono",Sans-serif !important;font-size:.75rem !important;font-weight:500 !important;text-transform:uppercase;line-height:1 !important;letter-spacing:.25em !important;padding:16px 32px 16px 32px !important;border-radius:0 !important;background:#bc1834 !important;color:#fff !important;border:none !important;cursor:pointer !important;transition:all .3s ease;width:100%}.yacht-booking-submit:hover{background:#a9000c !important}.yacht-booking-submit:disabled{background:#ccc;cursor:not-allowed;transform:none;box-shadow:none}.yacht-booking-response{margin-top:20px}.booking-success{padding:15px;border-radius:4px;font-size:15px;line-height:1.5}.booking-success strong{display:block;margin-bottom:5px}.booking-error{padding:15px;border-radius:4px;font-size:15px;line-height:1.5}.booking-error strong{display:block;margin-bottom:5px}.yacht-calendar-error{padding:20px;border-radius:4px;margin-bottom:20px}.yacht-calendar-error p{margin:0;line-height:1.5}.yacht-calendar-notice{padding:20px;border-radius:4px;margin-bottom:20px}.yacht-calendar-notice p{margin:0;line-height:1.5}.yacht-calendar-view-only{max-width:1200px;padding:15px 15px 0 15px;margin-bottom:0}.yacht-calendar-view-only .yacht-calendar-header{margin-bottom:15px}.yacht-calendar-view-only .yacht-calendar-title{font-size:22px;margin-bottom:10px}.yacht-calendar-view-only .yacht-calendar-instructions{margin-bottom:30px;padding:8px 12px;font-size:13px}.yacht-calendar-view-only .yacht-calendar-legend{margin-bottom:10px;font-size:13px}.yacht-calendar-view-only .yacht-calendar{padding:10px;margin-bottom:0;height:auto !important;overflow:visible}.yacht-calendar-view-only .fc-daygrid-day-frame{min-height:36px}.yacht-calendar-view-only .fc-daygrid-day-top{padding:2px}.yacht-calendar-view-only .fc-daygrid-day-number{padding:2px 4px;min-width:22px;font-size:12px}.yacht-calendar-view-only .fc-col-header-cell{font-size:12px;padding:4px 0}.yacht-calendar-view-only .fc-button{font-size:11px !important;padding:5px 10px !important}.yacht-calendar-view-only .fc-toolbar-title{font-size:16px !important}.yacht-inquiry-layout{display:grid;grid-template-columns:2fr 1fr;gap:24px;align-items:start;margin-bottom:30px}.yacht-inquiry-form-container{background:#021526;border-radius:8px;border:none}.yacht-inquiry-form-container h4{margin:0 0 8px 0;font-size:20px;font-weight:700;color:#fff}.yacht-inquiry-desc{margin:0 0 18px 0;color:hsla(0,0%,100%,.7);font-size:14px;line-height:1.5}.yacht-inquiry-form .form-field{margin-bottom:14px}.yacht-inquiry-form label{display:block;font-weight:600;margin-bottom:5px;color:hsla(0,0%,100%,.9);font-size:13px}.yacht-inquiry-form label .required{color:#ff6b6b;margin-left:2px}.yacht-inquiry-form input[type=text]{width:100%;padding:10px 12px;border:1px solid hsla(0,0%,100%,.2);border-radius:4px;font-size:14px;transition:border-color .3s ease,box-shadow .3s ease;background:hsla(0,0%,100%,.1);color:#fff;box-sizing:border-box;font-family:inherit}.yacht-inquiry-form input[type=email]{width:100%;padding:10px 12px;border:1px solid hsla(0,0%,100%,.2);border-radius:4px;font-size:14px;transition:border-color .3s ease,box-shadow .3s ease;background:hsla(0,0%,100%,.1);color:#fff;box-sizing:border-box;font-family:inherit}.yacht-inquiry-form input[type=tel]{width:100%;padding:10px 12px;border:1px solid hsla(0,0%,100%,.2);border-radius:4px;font-size:14px;transition:border-color .3s ease,box-shadow .3s ease;background:hsla(0,0%,100%,.1);color:#fff;box-sizing:border-box;font-family:inherit}.yacht-inquiry-form textarea{width:100%;padding:10px 12px;border:1px solid hsla(0,0%,100%,.2);border-radius:4px;font-size:14px;transition:border-color .3s ease,box-shadow .3s ease;background:hsla(0,0%,100%,.1);color:#fff;box-sizing:border-box;font-family:inherit;resize:vertical;min-height:60px}.yacht-inquiry-form textarea::-moz-placeholder{color:hsla(0,0%,100%,.4)}.yacht-inquiry-form textarea::placeholder{color:hsla(0,0%,100%,.4)}.yacht-inquiry-form textarea:focus{outline:none;border-color:#bc1834;box-shadow:0 0 0 3px rgba(188,24,52,.3);background:hsla(0,0%,100%,.15)}.yacht-inquiry-form input::-moz-placeholder{color:hsla(0,0%,100%,.4)}.yacht-inquiry-form input::placeholder{color:hsla(0,0%,100%,.4)}.yacht-inquiry-form input:focus{outline:none;border-color:#bc1834;box-shadow:0 0 0 3px rgba(188,24,52,.3);background:hsla(0,0%,100%,.15)}.yacht-inquiry-form .form-actions{margin-top:18px}.yacht-inquiry-form .booking-terms{color:hsla(0,0%,100%,.6);font-size:13px}.yacht-inquiry-form .booking-terms a{color:hsla(0,0%,100%,.85)}.yacht-inquiry-form .yacht-booking-submit{background:#bc1834;border-color:#bc1834;color:#fff}.yacht-inquiry-form .yacht-booking-submit:hover{background:#fff;color:#021526}.yacht-inquiry-response{margin-top:15px}@media(max-width: 992px){.yacht-calendar-title{font-size:24px}.yacht-calendar{padding:15px}.yacht-inquiry-layout{grid-template-columns:1fr}}@media(max-width: 768px){.yacht-calendar-title{font-size:22px}.yacht-calendar{padding:10px}.yacht-calendar .fc-toolbar{flex-direction:column;gap:10px}.yacht-calendar .fc-toolbar-chunk{display:flex;justify-content:center;width:100%}.yacht-calendar .fc-button{font-size:12px;padding:6px 12px}.yacht-calendar-legend{gap:8px 12px}.yacht-booking-form-container{padding:20px}.yacht-booking-form .form-row{grid-template-columns:1fr;gap:0}}@media(max-width: 480px){.yacht-calendar-switcher-button{width:100%;justify-content:center}.yacht-calendar-title{font-size:20px}.yacht-booking-form-container{padding:15px}.yacht-booking-form input[type=text]{font-size:14px;padding:10px 12px}.yacht-booking-form input[type=email]{font-size:14px;padding:10px 12px}.yacht-booking-form input[type=tel]{font-size:14px;padding:10px 12px}.yacht-booking-submit{padding:12px 20px;font-size:14px}}body a:not([href]):not([tabindex]),body a:not([href]):not([tabindex]):focus,body a:not([href]):not([tabindex]):hover{color:#fff}body .fc .fc-day-other .fc-daygrid-day-top{opacity:1}.yacht-calendar{--fc-border-color: #0e2036}.yacht-calendar .fc{--fc-border-color: #0e2036}.yacht-calendar .fc-theme-standard td,.yacht-calendar .fc-theme-standard th,.yacht-calendar .fc-theme-standard .fc-scrollgrid,.yacht-calendar .fc-scrollgrid,.yacht-calendar .fc-scrollgrid-section>*,.yacht-calendar .fc-daygrid-day,.yacht-calendar .fc-col-header-cell{border-color:#0e2036 !important}.yacht-calendar .fc-col-header-cell{background:#0e2036;color:#fff}.yacht-calendar .fc-col-header-cell .fc-col-header-cell-cushion{color:#fff;font-weight:600;padding:8px 4px}table{margin-bottom:0 !important}/*# sourceMappingURL=calendar.css.map */ \ No newline at end of file diff --git a/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css.map b/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css.map index 1de1e66..8d5b830 100644 --- a/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css.map +++ b/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css.map @@ -1 +1 @@ -{"version":3,"sources":["calendar.scss"],"names":[],"mappings":"AAAA,wBACC,gBAAA,CACA,kBAAA,CACA,YAAA,CAED,yBAQC,WAAA,CACA,eAAA,CACA,0BAAA,CACA,WAAA,CACA,iBAAA,CACA,eAAA,CACA,YAAA,CACA,qBAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CACA,QAAA,CAED,+BAIC,2CAAA,CACA,cAAA,CACA,eAAA,CACA,sBAAA,CACA,mCAAA,CACA,cAAA,CAEA,yBAXD,+BAYE,cAAA,CAAA,CAED,yBAdD,+BAeE,cAAA,CAAA,CAGF,iCACC,YAAA,CACA,cAAA,CACA,OAAA,CAED,gCACC,kDAAA,CACA,2BAAA,CACA,0BAAA,CACA,wBAAA,CACA,wBAAA,CACA,+BAAA,CACA,sCAAA,CACA,0BAAA,CACA,6BAAA,CACA,qBAAA,CACA,sBAAA,CACA,yBAAA,CAEA,sCACC,6BAAA,CA4BF,0CACC,kBAAA,CACA,oBAAA,CACA,UAAA,CACA,yCAAA,CAED,uBACC,kBAAA,CAED,sBACC,cAAA,CACA,eAAA,CACA,aAAA,CACA,iBAAA,CAED,4BACC,UAAA,CACA,cAAA,CACA,eAAA,CAED,6BACC,iBAAA,CACA,iBAAA,CAEA,UAAA,CACA,yBAAA,CACA,kBAAA,CACA,WAAA,CACA,eAAA,CAEA,+BACC,QAAA,CACA,oCAAA,CACA,cAAA,CACA,eAAA,CAGF,uBACC,YAAA,CACA,cAAA,CACA,aAAA,CACA,kBAAA,CACA,iBAAA,CAED,mBACC,mBAAA,CACA,kBAAA,CACA,OAAA,CAEA,UAAA,CACA,+BAAA,CACA,cAAA,CACA,eAAA,CAED,qBACC,UAAA,CACA,WAAA,CACA,iBAAA,CACA,+BAAA,CAED,0BACC,kBAAA,CAED,gBACC,kBAAA,CACA,+BAAA,CACA,iBAAA,CACA,qCAAA,CACA,YAAA,CACA,oBACC,mBAAA,CAED,mCACC,kBAAA,CACA,oBAAA,CACA,wBAAA,CACA,eAAA,CACA,cAAA,CACA,gBAAA,CACA,yCACC,kBAAA,CACA,oBAAA,CAGA,yDACC,kBAAA,CACA,oBAAA,CAGF,mEACC,kBAAA,CACA,oBAAA,CAGF,4CACC,kBAAA,CACA,SAAA,CAEA,mEACC,UAAA,CAID,sCACC,kBAAA,CAGF,8BACC,wCAAA,CAED,oCACC,YAAA,CACA,sBAAA,CACA,kBAAA,CACA,WAAA,CAED,uCACC,eAAA,CACA,cAAA,CACA,iBAAA,CACA,oBAAA,CACA,cAAA,CACA,eAAA,CAED,sCACC,eAAA,CACA,YAAA,CACA,qBAAA,CACA,iBAAA,CAED,6BACC,sBAAA,CAED,iDACC,sBAAA,CAED,8CACC,sBAAA,CAED,+CACC,sBAAA,CAGF,qBACC,cAAA,CAED,kBACC,kBAAA,CAED,mBACC,kBAAA,CAED,8BACC,kBAAA,CACA,YAAA,CACA,iBAAA,CACA,eAAA,CACA,wBAAA,CACA,iCACC,iBAAA,CACA,cAAA,CACA,eAAA,CACA,aAAA,CAID,8BACC,YAAA,CACA,6BAAA,CACA,QAAA,CACA,kBAAA,CAED,gCACC,kBAAA,CAED,0BACC,aAAA,CACA,eAAA,CACA,iBAAA,CACA,UAAA,CACA,cAAA,CACA,oCACC,aAAA,CACA,eAAA,CAGF,qCACC,UAAA,CACA,iBAAA,CACA,qBAAA,CACA,iBAAA,CACA,cAAA,CACA,oDAAA,CACA,eAAA,CACA,qBAAA,CAED,sCACC,UAAA,CACA,iBAAA,CACA,qBAAA,CACA,iBAAA,CACA,cAAA,CACA,oDAAA,CACA,eAAA,CACA,qBAAA,CAED,oCACC,UAAA,CACA,iBAAA,CACA,qBAAA,CACA,iBAAA,CACA,cAAA,CACA,oDAAA,CACA,eAAA,CACA,qBAAA,CAED,qCACC,UAAA,CACA,iBAAA,CACA,qBAAA,CACA,iBAAA,CACA,cAAA,CACA,oDAAA,CACA,eAAA,CACA,qBAAA,CAGA,gCACC,YAAA,CACA,oBAAA,CACA,uCAAA,CAED,yCACC,kBAAA,CACA,kBAAA,CAFD,oCACC,kBAAA,CACA,kBAAA,CAGF,kCACC,eAAA,CAGF,eACC,eAAA,CACA,cAAA,CACA,eAAA,CACA,UAAA,CACA,iBACC,aAAA,CACA,yBAAA,CAGF,sBACC,kDAAA,CACA,2BAAA,CACA,0BAAA,CACA,wBAAA,CACA,wBAAA,CACA,+BAAA,CACA,sCAAA,CACA,0BAAA,CACA,6BAAA,CACA,qBAAA,CACA,sBAAA,CACA,yBAAA,CACA,uBAAA,CACA,UAAA,CAEA,4BACC,6BAAA,CAED,+BACC,eAAA,CACA,kBAAA,CACA,cAAA,CACA,eAAA,CAGF,wBACC,eAAA,CAED,iBACC,YAAA,CACA,iBAAA,CACA,cAAA,CACA,eAAA,CACA,wBACC,aAAA,CACA,iBAAA,CAGF,eACC,YAAA,CACA,iBAAA,CACA,cAAA,CACA,eAAA,CACA,sBACC,aAAA,CACA,iBAAA,CAGF,sBACC,YAAA,CACA,iBAAA,CACA,kBAAA,CACA,wBACC,QAAA,CACA,eAAA,CAGF,uBACC,YAAA,CACA,iBAAA,CACA,kBAAA,CACA,yBACC,QAAA,CACA,eAAA,CAGF,0BACC,gBAAA,CACA,wBAAA,CACA,eAAA,CACA,iDACC,kBAAA,CAED,gDACC,cAAA,CACA,kBAAA,CAED,uDACC,kBAAA,CACA,gBAAA,CACA,cAAA,CAED,iDACC,kBAAA,CACA,cAAA,CAED,0CACC,YAAA,CACA,eAAA,CACA,sBAAA,CACA,gBAAA,CAED,gDACC,eAAA,CAED,8CACC,WAAA,CAED,iDACC,eAAA,CACA,cAAA,CACA,cAAA,CAED,8CACC,cAAA,CACA,aAAA,CAED,qCACC,yBAAA,CACA,2BAAA,CAED,4CACC,yBAAA,CAGF,sBACC,YAAA,CACA,6BAAA,CACA,QAAA,CACA,iBAAA,CACA,kBAAA,CAED,8BACC,kBAAA,CACA,YAAA,CACA,iBAAA,CACA,WAAA,CACA,iCACC,gBAAA,CACA,cAAA,CACA,eAAA,CACA,UAAA,CAGF,oBACC,iBAAA,CACA,wBAAA,CACA,cAAA,CACA,eAAA,CAGA,gCACC,kBAAA,CAED,0BACC,aAAA,CACA,eAAA,CACA,iBAAA,CACA,wBAAA,CACA,cAAA,CACA,oCACC,aAAA,CACA,eAAA,CAGF,qCACC,UAAA,CACA,iBAAA,CACA,mCAAA,CACA,iBAAA,CACA,cAAA,CACA,oDAAA,CACA,6BAAA,CACA,UAAA,CACA,qBAAA,CACA,mBAAA,CAED,sCACC,UAAA,CACA,iBAAA,CACA,mCAAA,CACA,iBAAA,CACA,cAAA,CACA,oDAAA,CACA,6BAAA,CACA,UAAA,CACA,qBAAA,CACA,mBAAA,CAED,oCACC,UAAA,CACA,iBAAA,CACA,mCAAA,CACA,iBAAA,CACA,cAAA,CACA,oDAAA,CACA,6BAAA,CACA,UAAA,CACA,qBAAA,CACA,mBAAA,CAED,6BACC,UAAA,CACA,iBAAA,CACA,mCAAA,CACA,iBAAA,CACA,cAAA,CACA,oDAAA,CACA,6BAAA,CACA,UAAA,CACA,qBAAA,CACA,mBAAA,CACA,eAAA,CACA,eAAA,CACA,+CACC,wBAAA,CADD,0CACC,wBAAA,CAED,mCACC,YAAA,CACA,oBAAA,CACA,uCAAA,CACA,8BAAA,CAID,4CACC,wBAAA,CADD,uCACC,wBAAA,CAED,gCACC,YAAA,CACA,oBAAA,CACA,uCAAA,CACA,8BAAA,CAGF,kCACC,eAAA,CAED,mCACC,wBAAA,CACA,cAAA,CACA,qCACC,yBAAA,CAGF,0CACC,kBAAA,CACA,oBAAA,CACA,UAAA,CACA,gDACC,eAAA,CACA,aAAA,CAIH,wBACC,eAAA,CAED,yBACC,sBACC,cAAA,CAED,gBACC,YAAA,CAED,sBACC,yBAAA,CAAA,CAGF,yBACC,8BACC,YAAA,CAED,sBACC,cAAA,CAED,gBACC,YAAA,CACA,4BACC,qBAAA,CACA,QAAA,CAED,kCACC,YAAA,CACA,sBAAA,CACA,UAAA,CAED,2BACC,cAAA,CACA,gBAAA,CAGF,uBACC,YAAA,CAED,8BACC,YAAA,CAGA,8BACC,yBAAA,CACA,KAAA,CAAA,CAIH,yBACC,gCACC,UAAA,CACA,sBAAA,CAED,sBACC,cAAA,CAED,8BACC,YAAA,CAGA,qCACC,cAAA,CACA,iBAAA,CAED,sCACC,cAAA,CACA,iBAAA,CAED,oCACC,cAAA,CACA,iBAAA,CAGF,sBACC,iBAAA,CACA,cAAA,CAAA,CAIF,qHAGC,UAAA,CAGD,2CACC,SAAA,CAQD,MACC,0BAAA","file":"calendar.css"} \ No newline at end of file +{"version":3,"sources":["calendar.scss"],"names":[],"mappings":"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","file":"calendar.css","sourcesContent":[".yacht-calendar-wrapper {\r\n max-width: 1200px;\r\n margin: 0 auto 40px;\r\n padding: 20px;\r\n}\r\n\r\n.yacht-calendar-switcher {\r\n // display: flex;\r\n // flex-wrap: wrap;\r\n // align-items: center;\r\n // gap: 10px 14px;\r\n // margin: 0 0 22px 0;\r\n // padding: 14px 16px;\r\n // border-radius: 10px;\r\n width: 100vw;\r\n margin-left: 50%;\r\n transform: translateX(-50%);\r\n border: none;\r\n padding: 80px 20px;\r\n border-radius: 0;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n margin-bottom: 0;\r\n justify-content: center;\r\n background: #0e2036;\r\n gap: 30px;\r\n}\r\n\r\n.yacht-calendar-switcher-label {\r\n // font-size: 14px;\r\n // font-weight: 700;\r\n // color: #021526;\r\n font-family: 'DM Sans', Sans-serif !important;\r\n font-size: 80px;\r\n font-weight: 500;\r\n letter-spacing: -0.04em;\r\n color: var(--e-global-color-7077776);\r\n line-height: 0.8;\r\n\r\n @media (max-width: 768px) {\r\n font-size: 64px;\r\n }\r\n\r\n @media (max-width: 480px) {\r\n font-size: 48px;\r\n }\r\n}\r\n\r\n.yacht-calendar-switcher-buttons {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n}\r\n\r\n.yacht-calendar-switcher-button {\r\n font-family: 'JetBrains Mono', Sans-serif !important;\r\n font-size: 0.75rem !important;\r\n font-weight: 500 !important;\r\n text-transform: uppercase;\r\n line-height: 1 !important;\r\n letter-spacing: 0.25em !important;\r\n padding: 16px 32px 16px 32px !important;\r\n border-radius: 0 !important;\r\n background: #bc1834 !important;\r\n color: #fff !important;\r\n border: none !important;\r\n cursor: pointer !important;\r\n\r\n &:hover {\r\n background: #a9000c !important;\r\n }\r\n\r\n // display: inline-flex;\r\n // align-items: center;\r\n // padding: 9px 14px;\r\n // border: 1px solid #c8d4e3;\r\n // border-radius: 999px;\r\n // background: #fff;\r\n // color: #14324a;\r\n // font-size: 14px;\r\n // font-weight: 600;\r\n // line-height: 1.2;\r\n // cursor: pointer;\r\n // transition: background-color 0.2s ease, color 0.2s ease,\r\n // \tborder-color 0.2s ease, transform 0.2s ease;\r\n // &:hover {\r\n // \tborder-color: #bc1834;\r\n // \tcolor: #bc1834;\r\n // \toutline: none;\r\n // \ttransform: translateY(-1px);\r\n // }\r\n // &:focus {\r\n // \tborder-color: #bc1834;\r\n // \tcolor: #bc1834;\r\n // \toutline: none;\r\n // \ttransform: translateY(-1px);\r\n // }\r\n}\r\n\r\n.yacht-calendar-switcher-button.is-active {\r\n background: #bc1834;\r\n border-color: #bc1834;\r\n color: #fff;\r\n box-shadow: 0 8px 18px rgba(188, 24, 52, 0.18);\r\n}\r\n\r\n.yacht-calendar-header {\r\n margin-bottom: 30px;\r\n}\r\n\r\n.yacht-calendar-title {\r\n font-size: 28px;\r\n font-weight: 700;\r\n color: #021526;\r\n margin: 0 0 15px 0;\r\n}\r\n\r\n.yacht-calendar-description {\r\n color: #666;\r\n font-size: 16px;\r\n line-height: 1.6;\r\n}\r\n\r\n.yacht-calendar-instructions {\r\n margin: 0 0 30px 0;\r\n padding: 12px 14px;\r\n\r\n color: #fff;\r\n border-left: 1px solid red;\r\n background: #d40924;\r\n border: none;\r\n border-radius: 0;\r\n\r\n p {\r\n margin: 0;\r\n font-family: 'Inter Tight', Sans-serif;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n }\r\n}\r\n\r\n.yacht-calendar-legend {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 10px 16px;\r\n align-items: center;\r\n margin: 0 0 18px 0;\r\n}\r\n\r\n.yacht-legend-item {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n color: #fff;\r\n font-family: 'Roboto', Sans-serif;\r\n font-size: 15px;\r\n font-weight: 300;\r\n}\r\n\r\n.yacht-legend-swatch {\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 4px;\r\n border: 1px solid rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.yacht-legend-swatch-past {\r\n background: #d0d5dd;\r\n}\r\n\r\n.yacht-calendar {\r\n margin-bottom: 30px;\r\n background: rgba(255, 255, 255, 0.1) f;\r\n border-radius: 8px;\r\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);\r\n padding: 20px;\r\n\r\n .fc {\r\n font-family: inherit;\r\n }\r\n\r\n .fc-button-primary {\r\n background: #bc1834;\r\n border-color: #bc1834;\r\n text-transform: uppercase;\r\n font-weight: 600;\r\n font-size: 13px;\r\n padding: 8px 16px;\r\n\r\n &:hover {\r\n background: #021526;\r\n border-color: #021526;\r\n }\r\n\r\n &:not(:disabled) {\r\n &:active {\r\n background: #021526;\r\n border-color: #021526;\r\n }\r\n }\r\n\r\n &:not(:disabled).fc-button-active {\r\n background: #021526;\r\n border-color: #021526;\r\n }\r\n }\r\n\r\n .fc-daygrid-day.fc-day-past {\r\n background: #f5f5f5;\r\n opacity: 1;\r\n\r\n .fc-daygrid-day-number {\r\n color: #6c757d;\r\n }\r\n }\r\n\r\n .fc-daygrid-day-number,\r\n a.fc-daygrid-day-number {\r\n color: #021526 !important;\r\n font-weight: 600;\r\n }\r\n\r\n .fc-daygrid-day {\r\n &:hover {\r\n background: #f8f9fa;\r\n }\r\n }\r\n\r\n .fc-highlight {\r\n background: rgba(188, 24, 52, 0.1) !important;\r\n }\r\n\r\n .fc-daygrid-day-top {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 5px;\r\n }\r\n\r\n .fc-daygrid-day-number {\r\n padding: 4px 6px;\r\n min-width: 28px;\r\n text-align: center;\r\n display: inline-block;\r\n font-size: 14px;\r\n line-height: 1.2;\r\n }\r\n\r\n .fc-daygrid-day-frame {\r\n min-height: 80px;\r\n display: flex;\r\n flex-direction: column;\r\n position: relative;\r\n }\r\n\r\n .fc-bg-event {\r\n opacity: 0.78 !important;\r\n }\r\n\r\n .fc-bg-event.yacht-day-available {\r\n opacity: 0.66 !important;\r\n }\r\n\r\n .fc-bg-event.yacht-day-booked {\r\n opacity: 0.92 !important;\r\n }\r\n\r\n .fc-bg-event.yacht-day-blocked {\r\n opacity: 0.92 !important;\r\n }\r\n\r\n // Half-day rendering for first / last day of a booking or blockade.\r\n // Skos 45°. Pierwszy dzień: trójkąt bottom-left = wolny, top-right = zajęty (odbiór po południu).\r\n // Ostatni dzień: trójkąt top-left = zajęty, bottom-right = wolny (zwrot rano).\r\n .fc-bg-event.yacht-day-booked-start,\r\n .fc-bg-event.yacht-day-blocked-start {\r\n background: linear-gradient(135deg,\r\n var(--yacht-available-bg, #f5f9ff) 0%,\r\n var(--yacht-available-bg, #f5f9ff) 50%,\r\n var(--yacht-booked-bg, #bc1834) 50%,\r\n var(--yacht-booked-bg, #bc1834) 100%) !important;\r\n opacity: 0.92 !important;\r\n }\r\n\r\n .fc-bg-event.yacht-day-booked-end,\r\n .fc-bg-event.yacht-day-blocked-end {\r\n background: linear-gradient(135deg,\r\n var(--yacht-booked-bg, #bc1834) 0%,\r\n var(--yacht-booked-bg, #bc1834) 50%,\r\n var(--yacht-available-bg, #f5f9ff) 50%,\r\n var(--yacht-available-bg, #f5f9ff) 100%) !important;\r\n opacity: 0.92 !important;\r\n }\r\n}\r\n\r\n.yacht-day-available {\r\n cursor: pointer;\r\n}\r\n\r\n.yacht-day-booked {\r\n cursor: not-allowed;\r\n}\r\n\r\n.yacht-day-blocked {\r\n cursor: not-allowed;\r\n}\r\n\r\n.yacht-booking-form-container {\r\n background: #f9f9f9;\r\n padding: 30px;\r\n border-radius: 8px;\r\n margin-top: 30px;\r\n border: 1px solid #e0e0e0;\r\n\r\n h4 {\r\n margin: 0 0 25px 0;\r\n font-size: 22px;\r\n font-weight: 700;\r\n color: #021526;\r\n }\r\n}\r\n\r\n.yacht-booking-form {\r\n .form-row {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 20px;\r\n margin-bottom: 20px;\r\n }\r\n\r\n .form-field {\r\n margin-bottom: 20px;\r\n }\r\n\r\n label {\r\n display: block;\r\n font-weight: 600;\r\n margin-bottom: 8px;\r\n color: #333;\r\n font-size: 14px;\r\n\r\n .required {\r\n color: #bc1834;\r\n margin-left: 2px;\r\n }\r\n }\r\n\r\n input[type='text'] {\r\n width: 100%;\r\n padding: 12px 15px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n font-size: 16px;\r\n transition: border-color 0.3s ease, box-shadow 0.3s ease;\r\n background: #fff;\r\n box-sizing: border-box;\r\n }\r\n\r\n input[type='email'] {\r\n width: 100%;\r\n padding: 12px 15px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n font-size: 16px;\r\n transition: border-color 0.3s ease, box-shadow 0.3s ease;\r\n background: #fff;\r\n box-sizing: border-box;\r\n }\r\n\r\n input[type='tel'] {\r\n width: 100%;\r\n padding: 12px 15px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n font-size: 16px;\r\n transition: border-color 0.3s ease, box-shadow 0.3s ease;\r\n background: #fff;\r\n box-sizing: border-box;\r\n }\r\n\r\n input[type='date'] {\r\n width: 100%;\r\n padding: 12px 15px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n font-size: 16px;\r\n transition: border-color 0.3s ease, box-shadow 0.3s ease;\r\n background: #fff;\r\n box-sizing: border-box;\r\n }\r\n\r\n input {\r\n &:focus {\r\n outline: none;\r\n border-color: #bc1834;\r\n box-shadow: 0 0 0 3px rgba(188, 24, 52, 0.1);\r\n }\r\n\r\n &:read-only {\r\n background: #f5f5f5;\r\n cursor: not-allowed;\r\n }\r\n }\r\n\r\n .form-actions {\r\n margin-top: 25px;\r\n }\r\n}\r\n\r\n.booking-terms {\r\n margin-top: 18px;\r\n font-size: 14px;\r\n line-height: 1.5;\r\n color: #333;\r\n\r\n a {\r\n color: #bc1834;\r\n text-decoration: underline;\r\n }\r\n}\r\n\r\n.yacht-booking-submit {\r\n font-family: 'JetBrains Mono', Sans-serif !important;\r\n font-size: 0.75rem !important;\r\n font-weight: 500 !important;\r\n text-transform: uppercase;\r\n line-height: 1 !important;\r\n letter-spacing: 0.25em !important;\r\n padding: 16px 32px 16px 32px !important;\r\n border-radius: 0 !important;\r\n background: #bc1834 !important;\r\n color: #fff !important;\r\n border: none !important;\r\n cursor: pointer !important;\r\n transition: all 0.3s ease;\r\n width: 100%;\r\n\r\n &:hover {\r\n background: #a9000c !important;\r\n }\r\n\r\n &:disabled {\r\n background: #ccc;\r\n cursor: not-allowed;\r\n transform: none;\r\n box-shadow: none;\r\n }\r\n}\r\n\r\n.yacht-booking-response {\r\n margin-top: 20px;\r\n}\r\n\r\n.booking-success {\r\n padding: 15px;\r\n border-radius: 4px;\r\n font-size: 15px;\r\n line-height: 1.5;\r\n\r\n strong {\r\n display: block;\r\n margin-bottom: 5px;\r\n }\r\n}\r\n\r\n.booking-error {\r\n padding: 15px;\r\n border-radius: 4px;\r\n font-size: 15px;\r\n line-height: 1.5;\r\n\r\n strong {\r\n display: block;\r\n margin-bottom: 5px;\r\n }\r\n}\r\n\r\n.yacht-calendar-error {\r\n padding: 20px;\r\n border-radius: 4px;\r\n margin-bottom: 20px;\r\n\r\n p {\r\n margin: 0;\r\n line-height: 1.5;\r\n }\r\n}\r\n\r\n.yacht-calendar-notice {\r\n padding: 20px;\r\n border-radius: 4px;\r\n margin-bottom: 20px;\r\n\r\n p {\r\n margin: 0;\r\n line-height: 1.5;\r\n }\r\n}\r\n\r\n.yacht-calendar-view-only {\r\n max-width: 1200px;\r\n padding: 15px 15px 0 15px;\r\n margin-bottom: 0;\r\n\r\n .yacht-calendar-header {\r\n margin-bottom: 15px;\r\n }\r\n\r\n .yacht-calendar-title {\r\n font-size: 22px;\r\n margin-bottom: 10px;\r\n }\r\n\r\n .yacht-calendar-instructions {\r\n margin-bottom: 30px;\r\n padding: 8px 12px;\r\n font-size: 13px;\r\n }\r\n\r\n .yacht-calendar-legend {\r\n margin-bottom: 10px;\r\n font-size: 13px;\r\n }\r\n\r\n .yacht-calendar {\r\n padding: 10px;\r\n margin-bottom: 0;\r\n height: auto !important;\r\n overflow: visible;\r\n }\r\n\r\n .fc-daygrid-day-frame {\r\n min-height: 36px;\r\n }\r\n\r\n .fc-daygrid-day-top {\r\n padding: 2px;\r\n }\r\n\r\n .fc-daygrid-day-number {\r\n padding: 2px 4px;\r\n min-width: 22px;\r\n font-size: 12px;\r\n }\r\n\r\n .fc-col-header-cell {\r\n font-size: 12px;\r\n padding: 4px 0;\r\n }\r\n\r\n .fc-button {\r\n font-size: 11px !important;\r\n padding: 5px 10px !important;\r\n }\r\n\r\n .fc-toolbar-title {\r\n font-size: 16px !important;\r\n }\r\n}\r\n\r\n.yacht-inquiry-layout {\r\n display: grid;\r\n grid-template-columns: 2fr 1fr;\r\n gap: 24px;\r\n align-items: start;\r\n margin-bottom: 30px;\r\n}\r\n\r\n.yacht-inquiry-form-container {\r\n background: #021526;\r\n border-radius: 8px;\r\n border: none;\r\n\r\n h4 {\r\n margin: 0 0 8px 0;\r\n font-size: 20px;\r\n font-weight: 700;\r\n color: #fff;\r\n }\r\n}\r\n\r\n.yacht-inquiry-desc {\r\n margin: 0 0 18px 0;\r\n color: rgba(255, 255, 255, 0.7);\r\n font-size: 14px;\r\n line-height: 1.5;\r\n}\r\n\r\n.yacht-inquiry-form {\r\n .form-field {\r\n margin-bottom: 14px;\r\n }\r\n\r\n label {\r\n display: block;\r\n font-weight: 600;\r\n margin-bottom: 5px;\r\n color: rgba(255, 255, 255, 0.9);\r\n font-size: 13px;\r\n\r\n .required {\r\n color: #ff6b6b;\r\n margin-left: 2px;\r\n }\r\n }\r\n\r\n input[type='text'] {\r\n width: 100%;\r\n padding: 10px 12px;\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n border-radius: 4px;\r\n font-size: 14px;\r\n transition: border-color 0.3s ease, box-shadow 0.3s ease;\r\n background: rgba(255, 255, 255, 0.1);\r\n color: #fff;\r\n box-sizing: border-box;\r\n font-family: inherit;\r\n }\r\n\r\n input[type='email'] {\r\n width: 100%;\r\n padding: 10px 12px;\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n border-radius: 4px;\r\n font-size: 14px;\r\n transition: border-color 0.3s ease, box-shadow 0.3s ease;\r\n background: rgba(255, 255, 255, 0.1);\r\n color: #fff;\r\n box-sizing: border-box;\r\n font-family: inherit;\r\n }\r\n\r\n input[type='tel'] {\r\n width: 100%;\r\n padding: 10px 12px;\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n border-radius: 4px;\r\n font-size: 14px;\r\n transition: border-color 0.3s ease, box-shadow 0.3s ease;\r\n background: rgba(255, 255, 255, 0.1);\r\n color: #fff;\r\n box-sizing: border-box;\r\n font-family: inherit;\r\n }\r\n\r\n textarea {\r\n width: 100%;\r\n padding: 10px 12px;\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n border-radius: 4px;\r\n font-size: 14px;\r\n transition: border-color 0.3s ease, box-shadow 0.3s ease;\r\n background: rgba(255, 255, 255, 0.1);\r\n color: #fff;\r\n box-sizing: border-box;\r\n font-family: inherit;\r\n resize: vertical;\r\n min-height: 60px;\r\n\r\n &::placeholder {\r\n color: rgba(255, 255, 255, 0.4);\r\n }\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: #bc1834;\r\n box-shadow: 0 0 0 3px rgba(188, 24, 52, 0.3);\r\n background: rgba(255, 255, 255, 0.15);\r\n }\r\n }\r\n\r\n input {\r\n &::placeholder {\r\n color: rgba(255, 255, 255, 0.4);\r\n }\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: #bc1834;\r\n box-shadow: 0 0 0 3px rgba(188, 24, 52, 0.3);\r\n background: rgba(255, 255, 255, 0.15);\r\n }\r\n }\r\n\r\n .form-actions {\r\n margin-top: 18px;\r\n }\r\n\r\n .booking-terms {\r\n color: rgba(255, 255, 255, 0.6);\r\n font-size: 13px;\r\n\r\n a {\r\n color: rgba(255, 255, 255, 0.85);\r\n }\r\n }\r\n\r\n .yacht-booking-submit {\r\n background: #bc1834;\r\n border-color: #bc1834;\r\n color: #fff;\r\n\r\n &:hover {\r\n background: #fff;\r\n color: #021526;\r\n }\r\n }\r\n}\r\n\r\n.yacht-inquiry-response {\r\n margin-top: 15px;\r\n}\r\n\r\n@media (max-width: 992px) {\r\n .yacht-calendar-title {\r\n font-size: 24px;\r\n }\r\n\r\n .yacht-calendar {\r\n padding: 15px;\r\n }\r\n\r\n .yacht-inquiry-layout {\r\n grid-template-columns: 1fr;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n\r\n .yacht-calendar-title {\r\n font-size: 22px;\r\n }\r\n\r\n .yacht-calendar {\r\n padding: 10px;\r\n\r\n .fc-toolbar {\r\n flex-direction: column;\r\n gap: 10px;\r\n }\r\n\r\n .fc-toolbar-chunk {\r\n display: flex;\r\n justify-content: center;\r\n width: 100%;\r\n }\r\n\r\n .fc-button {\r\n font-size: 12px;\r\n padding: 6px 12px;\r\n }\r\n }\r\n\r\n .yacht-calendar-legend {\r\n gap: 8px 12px;\r\n }\r\n\r\n .yacht-booking-form-container {\r\n padding: 20px;\r\n }\r\n\r\n .yacht-booking-form {\r\n .form-row {\r\n grid-template-columns: 1fr;\r\n gap: 0;\r\n }\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .yacht-calendar-switcher-button {\r\n width: 100%;\r\n justify-content: center;\r\n }\r\n\r\n .yacht-calendar-title {\r\n font-size: 20px;\r\n }\r\n\r\n .yacht-booking-form-container {\r\n padding: 15px;\r\n }\r\n\r\n .yacht-booking-form {\r\n input[type='text'] {\r\n font-size: 14px;\r\n padding: 10px 12px;\r\n }\r\n\r\n input[type='email'] {\r\n font-size: 14px;\r\n padding: 10px 12px;\r\n }\r\n\r\n input[type='tel'] {\r\n font-size: 14px;\r\n padding: 10px 12px;\r\n }\r\n }\r\n\r\n .yacht-booking-submit {\r\n padding: 12px 20px;\r\n font-size: 14px;\r\n }\r\n}\r\n\r\nbody a:not([href]):not([tabindex]),\r\nbody a:not([href]):not([tabindex]):focus,\r\nbody a:not([href]):not([tabindex]):hover {\r\n color: #fff;\r\n}\r\n\r\nbody .fc .fc-day-other .fc-daygrid-day-top {\r\n opacity: 1;\r\n}\r\n\r\n.yacht-calendar {\r\n --fc-border-color: #0e2036;\r\n\r\n .fc {\r\n --fc-border-color: #0e2036;\r\n }\r\n\r\n .fc-theme-standard td,\r\n .fc-theme-standard th,\r\n .fc-theme-standard .fc-scrollgrid,\r\n .fc-scrollgrid,\r\n .fc-scrollgrid-section>*,\r\n .fc-daygrid-day,\r\n .fc-col-header-cell {\r\n border-color: #0e2036 !important;\r\n }\r\n\r\n .fc-col-header-cell {\r\n background: #0e2036;\r\n color: #fff;\r\n }\r\n\r\n .fc-col-header-cell .fc-col-header-cell-cushion {\r\n color: #fff;\r\n font-weight: 600;\r\n padding: 8px 4px;\r\n }\r\n}\r\n\r\ntable {\r\n margin-bottom: 0 !important;\r\n}"]} \ No newline at end of file diff --git a/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.scss b/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.scss index 691b598..66bed69 100644 --- a/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.scss +++ b/wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.scss @@ -1,740 +1,850 @@ .yacht-calendar-wrapper { - max-width: 1200px; - margin: 0 auto 40px; - padding: 20px; + max-width: 1200px; + margin: 0 auto 40px; + padding: 20px; } + .yacht-calendar-switcher { - // display: flex; - // flex-wrap: wrap; - // align-items: center; - // gap: 10px 14px; - // margin: 0 0 22px 0; - // padding: 14px 16px; - // border-radius: 10px; - width: 100vw; - margin-left: 50%; - transform: translateX(-50%); - border: none; - padding: 80px 20px; - border-radius: 0; - display: flex; - flex-direction: column; - align-items: center; - margin-bottom: 0; - justify-content: center; - background: #0e2036; - gap: 30px; + // display: flex; + // flex-wrap: wrap; + // align-items: center; + // gap: 10px 14px; + // margin: 0 0 22px 0; + // padding: 14px 16px; + // border-radius: 10px; + width: 100vw; + margin-left: 50%; + transform: translateX(-50%); + border: none; + padding: 80px 20px; + border-radius: 0; + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 0; + justify-content: center; + background: #0e2036; + gap: 30px; } + .yacht-calendar-switcher-label { - // font-size: 14px; - // font-weight: 700; - // color: #021526; - font-family: 'DM Sans', Sans-serif !important; - font-size: 80px; - font-weight: 500; - letter-spacing: -0.04em; - color: var(--e-global-color-7077776); - line-height: 0.8; + // font-size: 14px; + // font-weight: 700; + // color: #021526; + font-family: 'DM Sans', Sans-serif !important; + font-size: 80px; + font-weight: 500; + letter-spacing: -0.04em; + color: var(--e-global-color-7077776); + line-height: 0.8; - @media (max-width: 768px) { - font-size: 64px; - } - @media (max-width: 480px) { - font-size: 48px; - } + @media (max-width: 768px) { + font-size: 64px; + } + + @media (max-width: 480px) { + font-size: 48px; + } } + .yacht-calendar-switcher-buttons { - display: flex; - flex-wrap: wrap; - gap: 8px; + display: flex; + flex-wrap: wrap; + gap: 8px; } + .yacht-calendar-switcher-button { - font-family: 'JetBrains Mono', Sans-serif !important; - font-size: 0.75rem !important; - font-weight: 500 !important; - text-transform: uppercase; - line-height: 1 !important; - letter-spacing: 0.25em !important; - padding: 16px 32px 16px 32px !important; - border-radius: 0 !important; - background: #bc1834 !important; - color: #fff !important; - border: none !important; - cursor: pointer !important; + font-family: 'JetBrains Mono', Sans-serif !important; + font-size: 0.75rem !important; + font-weight: 500 !important; + text-transform: uppercase; + line-height: 1 !important; + letter-spacing: 0.25em !important; + padding: 16px 32px 16px 32px !important; + border-radius: 0 !important; + background: #bc1834 !important; + color: #fff !important; + border: none !important; + cursor: pointer !important; - &:hover { - background: #a9000c !important; - } - // display: inline-flex; - // align-items: center; - // padding: 9px 14px; - // border: 1px solid #c8d4e3; - // border-radius: 999px; - // background: #fff; - // color: #14324a; - // font-size: 14px; - // font-weight: 600; - // line-height: 1.2; - // cursor: pointer; - // transition: background-color 0.2s ease, color 0.2s ease, - // border-color 0.2s ease, transform 0.2s ease; - // &:hover { - // border-color: #bc1834; - // color: #bc1834; - // outline: none; - // transform: translateY(-1px); - // } - // &:focus { - // border-color: #bc1834; - // color: #bc1834; - // outline: none; - // transform: translateY(-1px); - // } + &:hover { + background: #a9000c !important; + } + + // display: inline-flex; + // align-items: center; + // padding: 9px 14px; + // border: 1px solid #c8d4e3; + // border-radius: 999px; + // background: #fff; + // color: #14324a; + // font-size: 14px; + // font-weight: 600; + // line-height: 1.2; + // cursor: pointer; + // transition: background-color 0.2s ease, color 0.2s ease, + // border-color 0.2s ease, transform 0.2s ease; + // &:hover { + // border-color: #bc1834; + // color: #bc1834; + // outline: none; + // transform: translateY(-1px); + // } + // &:focus { + // border-color: #bc1834; + // color: #bc1834; + // outline: none; + // transform: translateY(-1px); + // } } + .yacht-calendar-switcher-button.is-active { - background: #bc1834; - border-color: #bc1834; - color: #fff; - box-shadow: 0 8px 18px rgba(188, 24, 52, 0.18); + background: #bc1834; + border-color: #bc1834; + color: #fff; + box-shadow: 0 8px 18px rgba(188, 24, 52, 0.18); } + .yacht-calendar-header { - margin-bottom: 30px; + margin-bottom: 30px; } + .yacht-calendar-title { - font-size: 28px; - font-weight: 700; - color: #021526; - margin: 0 0 15px 0; + font-size: 28px; + font-weight: 700; + color: #021526; + margin: 0 0 15px 0; } + .yacht-calendar-description { - color: #666; - font-size: 16px; - line-height: 1.6; + color: #666; + font-size: 16px; + line-height: 1.6; } + .yacht-calendar-instructions { - margin: 0 0 30px 0; - padding: 12px 14px; + margin: 0 0 30px 0; + padding: 12px 14px; - color: #fff; - border-left: 1px solid red; - background: #d40924; - border: none; - border-radius: 0; + color: #fff; + border-left: 1px solid red; + background: #d40924; + border: none; + border-radius: 0; - p { - margin: 0; - font-family: 'Inter Tight', Sans-serif; - font-size: 1rem; - font-weight: 400; - } + p { + margin: 0; + font-family: 'Inter Tight', Sans-serif; + font-size: 1rem; + font-weight: 400; + } } + .yacht-calendar-legend { - display: flex; - flex-wrap: wrap; - gap: 10px 16px; - align-items: center; - margin: 0 0 18px 0; + display: flex; + flex-wrap: wrap; + gap: 10px 16px; + align-items: center; + margin: 0 0 18px 0; } + .yacht-legend-item { - display: inline-flex; - align-items: center; - gap: 8px; + display: inline-flex; + align-items: center; + gap: 8px; - color: #fff; - font-family: 'Roboto', Sans-serif; - font-size: 15px; - font-weight: 300; + color: #fff; + font-family: 'Roboto', Sans-serif; + font-size: 15px; + font-weight: 300; } + .yacht-legend-swatch { - width: 16px; - height: 16px; - border-radius: 4px; - border: 1px solid rgba(0, 0, 0, 0.2); + width: 16px; + height: 16px; + border-radius: 4px; + border: 1px solid rgba(0, 0, 0, 0.2); } + .yacht-legend-swatch-past { - background: #d0d5dd; + background: #d0d5dd; } + .yacht-calendar { - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.1) f; - border-radius: 8px; - box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); - padding: 20px; - .fc { - font-family: inherit; - } - .fc-button-primary { - background: #bc1834; - border-color: #bc1834; - text-transform: uppercase; - font-weight: 600; - font-size: 13px; - padding: 8px 16px; - &:hover { - background: #021526; - border-color: #021526; - } - &:not(:disabled) { - &:active { - background: #021526; - border-color: #021526; - } - } - &:not(:disabled).fc-button-active { - background: #021526; - border-color: #021526; - } - } - .fc-daygrid-day.fc-day-past { - background: #f5f5f5; - opacity: 1; + margin-bottom: 30px; + background: rgba(255, 255, 255, 0.1) f; + border-radius: 8px; + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); + padding: 20px; - .fc-daygrid-day-number { - color: #6c757d; - } - } - .fc-daygrid-day-number, - a.fc-daygrid-day-number { - color: #021526 !important; - font-weight: 600; - } - .fc-daygrid-day { - &:hover { - background: #f8f9fa; - } - } - .fc-highlight { - background: rgba(188, 24, 52, 0.1) !important; - } - .fc-daygrid-day-top { - display: flex; - justify-content: center; - align-items: center; - padding: 5px; - } - .fc-daygrid-day-number { - padding: 4px 6px; - min-width: 28px; - text-align: center; - display: inline-block; - font-size: 14px; - line-height: 1.2; - } - .fc-daygrid-day-frame { - min-height: 80px; - display: flex; - flex-direction: column; - position: relative; - } - .fc-bg-event { - opacity: 0.78 !important; - } - .fc-bg-event.yacht-day-available { - opacity: 0.66 !important; - } - .fc-bg-event.yacht-day-booked { - opacity: 0.92 !important; - } - .fc-bg-event.yacht-day-blocked { - opacity: 0.92 !important; - } - // Half-day rendering for first / last day of a booking or blockade. - // Skos 45°. Pierwszy dzień: trójkąt bottom-left = wolny, top-right = zajęty (odbiór po południu). - // Ostatni dzień: trójkąt top-left = zajęty, bottom-right = wolny (zwrot rano). - .fc-bg-event.yacht-day-booked-start, - .fc-bg-event.yacht-day-blocked-start { - background: linear-gradient( - 135deg, - var(--yacht-available-bg, #f5f9ff) 0%, - var(--yacht-available-bg, #f5f9ff) 50%, - var(--yacht-booked-bg, #bc1834) 50%, - var(--yacht-booked-bg, #bc1834) 100% - ) !important; - opacity: 0.92 !important; - } - .fc-bg-event.yacht-day-booked-end, - .fc-bg-event.yacht-day-blocked-end { - background: linear-gradient( - 135deg, - var(--yacht-booked-bg, #bc1834) 0%, - var(--yacht-booked-bg, #bc1834) 50%, - var(--yacht-available-bg, #f5f9ff) 50%, - var(--yacht-available-bg, #f5f9ff) 100% - ) !important; - opacity: 0.92 !important; - } + .fc { + font-family: inherit; + } + + .fc-button-primary { + background: #bc1834; + border-color: #bc1834; + text-transform: uppercase; + font-weight: 600; + font-size: 13px; + padding: 8px 16px; + + &:hover { + background: #021526; + border-color: #021526; + } + + &:not(:disabled) { + &:active { + background: #021526; + border-color: #021526; + } + } + + &:not(:disabled).fc-button-active { + background: #021526; + border-color: #021526; + } + } + + .fc-daygrid-day.fc-day-past { + background: #f5f5f5; + opacity: 1; + + .fc-daygrid-day-number { + color: #6c757d; + } + } + + .fc-daygrid-day-number, + a.fc-daygrid-day-number { + color: #021526 !important; + font-weight: 600; + } + + .fc-daygrid-day { + &:hover { + background: #f8f9fa; + } + } + + .fc-highlight { + background: rgba(188, 24, 52, 0.1) !important; + } + + .fc-daygrid-day-top { + display: flex; + justify-content: center; + align-items: center; + padding: 5px; + } + + .fc-daygrid-day-number { + padding: 4px 6px; + min-width: 28px; + text-align: center; + display: inline-block; + font-size: 14px; + line-height: 1.2; + } + + .fc-daygrid-day-frame { + min-height: 80px; + display: flex; + flex-direction: column; + position: relative; + } + + .fc-bg-event { + opacity: 0.78 !important; + } + + .fc-bg-event.yacht-day-available { + opacity: 0.66 !important; + } + + .fc-bg-event.yacht-day-booked { + opacity: 0.92 !important; + } + + .fc-bg-event.yacht-day-blocked { + opacity: 0.92 !important; + } + + // Half-day rendering for first / last day of a booking or blockade. + // Skos 45°. Pierwszy dzień: trójkąt bottom-left = wolny, top-right = zajęty (odbiór po południu). + // Ostatni dzień: trójkąt top-left = zajęty, bottom-right = wolny (zwrot rano). + .fc-bg-event.yacht-day-booked-start, + .fc-bg-event.yacht-day-blocked-start { + background: linear-gradient(135deg, + var(--yacht-available-bg, #f5f9ff) 0%, + var(--yacht-available-bg, #f5f9ff) 50%, + var(--yacht-booked-bg, #bc1834) 50%, + var(--yacht-booked-bg, #bc1834) 100%) !important; + opacity: 0.92 !important; + } + + .fc-bg-event.yacht-day-booked-end, + .fc-bg-event.yacht-day-blocked-end { + background: linear-gradient(135deg, + var(--yacht-booked-bg, #bc1834) 0%, + var(--yacht-booked-bg, #bc1834) 50%, + var(--yacht-available-bg, #f5f9ff) 50%, + var(--yacht-available-bg, #f5f9ff) 100%) !important; + opacity: 0.92 !important; + } } + .yacht-day-available { - cursor: pointer; + cursor: pointer; } -.yacht-day-booked { - cursor: not-allowed; -} -.yacht-day-blocked { - cursor: not-allowed; -} -.yacht-booking-form-container { - background: #f9f9f9; - padding: 30px; - border-radius: 8px; - margin-top: 30px; - border: 1px solid #e0e0e0; - h4 { - margin: 0 0 25px 0; - font-size: 22px; - font-weight: 700; - color: #021526; - } -} -.yacht-booking-form { - .form-row { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 20px; - margin-bottom: 20px; - } - .form-field { - margin-bottom: 20px; - } - label { - display: block; - font-weight: 600; - margin-bottom: 8px; - color: #333; - font-size: 14px; - .required { - color: #bc1834; - margin-left: 2px; - } - } - input[type='text'] { - width: 100%; - padding: 12px 15px; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 16px; - transition: border-color 0.3s ease, box-shadow 0.3s ease; - background: #fff; - box-sizing: border-box; - } - input[type='email'] { - width: 100%; - padding: 12px 15px; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 16px; - transition: border-color 0.3s ease, box-shadow 0.3s ease; - background: #fff; - box-sizing: border-box; - } - input[type='tel'] { - width: 100%; - padding: 12px 15px; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 16px; - transition: border-color 0.3s ease, box-shadow 0.3s ease; - background: #fff; - box-sizing: border-box; - } - input[type='date'] { - width: 100%; - padding: 12px 15px; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 16px; - transition: border-color 0.3s ease, box-shadow 0.3s ease; - background: #fff; - box-sizing: border-box; - } - input { - &:focus { - outline: none; - border-color: #bc1834; - box-shadow: 0 0 0 3px rgba(188, 24, 52, 0.1); - } - &:read-only { - background: #f5f5f5; - cursor: not-allowed; - } - } - .form-actions { - margin-top: 25px; - } -} -.booking-terms { - margin-top: 18px; - font-size: 14px; - line-height: 1.5; - color: #333; - a { - color: #bc1834; - text-decoration: underline; - } -} -.yacht-booking-submit { - font-family: 'JetBrains Mono', Sans-serif !important; - font-size: 0.75rem !important; - font-weight: 500 !important; - text-transform: uppercase; - line-height: 1 !important; - letter-spacing: 0.25em !important; - padding: 16px 32px 16px 32px !important; - border-radius: 0 !important; - background: #bc1834 !important; - color: #fff !important; - border: none !important; - cursor: pointer !important; - transition: all 0.3s ease; - width: 100%; - &:hover { - background: #a9000c !important; - } - &:disabled { - background: #ccc; - cursor: not-allowed; - transform: none; - box-shadow: none; - } +.yacht-day-booked { + cursor: not-allowed; } + +.yacht-day-blocked { + cursor: not-allowed; +} + +.yacht-booking-form-container { + background: #f9f9f9; + padding: 30px; + border-radius: 8px; + margin-top: 30px; + border: 1px solid #e0e0e0; + + h4 { + margin: 0 0 25px 0; + font-size: 22px; + font-weight: 700; + color: #021526; + } +} + +.yacht-booking-form { + .form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + margin-bottom: 20px; + } + + .form-field { + margin-bottom: 20px; + } + + label { + display: block; + font-weight: 600; + margin-bottom: 8px; + color: #333; + font-size: 14px; + + .required { + color: #bc1834; + margin-left: 2px; + } + } + + input[type='text'] { + width: 100%; + padding: 12px 15px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 16px; + transition: border-color 0.3s ease, box-shadow 0.3s ease; + background: #fff; + box-sizing: border-box; + } + + input[type='email'] { + width: 100%; + padding: 12px 15px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 16px; + transition: border-color 0.3s ease, box-shadow 0.3s ease; + background: #fff; + box-sizing: border-box; + } + + input[type='tel'] { + width: 100%; + padding: 12px 15px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 16px; + transition: border-color 0.3s ease, box-shadow 0.3s ease; + background: #fff; + box-sizing: border-box; + } + + input[type='date'] { + width: 100%; + padding: 12px 15px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 16px; + transition: border-color 0.3s ease, box-shadow 0.3s ease; + background: #fff; + box-sizing: border-box; + } + + input { + &:focus { + outline: none; + border-color: #bc1834; + box-shadow: 0 0 0 3px rgba(188, 24, 52, 0.1); + } + + &:read-only { + background: #f5f5f5; + cursor: not-allowed; + } + } + + .form-actions { + margin-top: 25px; + } +} + +.booking-terms { + margin-top: 18px; + font-size: 14px; + line-height: 1.5; + color: #333; + + a { + color: #bc1834; + text-decoration: underline; + } +} + +.yacht-booking-submit { + font-family: 'JetBrains Mono', Sans-serif !important; + font-size: 0.75rem !important; + font-weight: 500 !important; + text-transform: uppercase; + line-height: 1 !important; + letter-spacing: 0.25em !important; + padding: 16px 32px 16px 32px !important; + border-radius: 0 !important; + background: #bc1834 !important; + color: #fff !important; + border: none !important; + cursor: pointer !important; + transition: all 0.3s ease; + width: 100%; + + &:hover { + background: #a9000c !important; + } + + &:disabled { + background: #ccc; + cursor: not-allowed; + transform: none; + box-shadow: none; + } +} + .yacht-booking-response { - margin-top: 20px; + margin-top: 20px; } + .booking-success { - padding: 15px; - border-radius: 4px; - font-size: 15px; - line-height: 1.5; - strong { - display: block; - margin-bottom: 5px; - } + padding: 15px; + border-radius: 4px; + font-size: 15px; + line-height: 1.5; + + strong { + display: block; + margin-bottom: 5px; + } } + .booking-error { - padding: 15px; - border-radius: 4px; - font-size: 15px; - line-height: 1.5; - strong { - display: block; - margin-bottom: 5px; - } + padding: 15px; + border-radius: 4px; + font-size: 15px; + line-height: 1.5; + + strong { + display: block; + margin-bottom: 5px; + } } + .yacht-calendar-error { - padding: 20px; - border-radius: 4px; - margin-bottom: 20px; - p { - margin: 0; - line-height: 1.5; - } + padding: 20px; + border-radius: 4px; + margin-bottom: 20px; + + p { + margin: 0; + line-height: 1.5; + } } + .yacht-calendar-notice { - padding: 20px; - border-radius: 4px; - margin-bottom: 20px; - p { - margin: 0; - line-height: 1.5; - } + padding: 20px; + border-radius: 4px; + margin-bottom: 20px; + + p { + margin: 0; + line-height: 1.5; + } } + .yacht-calendar-view-only { - max-width: 1200px; - padding: 15px 15px 0 15px; - margin-bottom: 0; - .yacht-calendar-header { - margin-bottom: 15px; - } - .yacht-calendar-title { - font-size: 22px; - margin-bottom: 10px; - } - .yacht-calendar-instructions { - margin-bottom: 30px; - padding: 8px 12px; - font-size: 13px; - } - .yacht-calendar-legend { - margin-bottom: 10px; - font-size: 13px; - } - .yacht-calendar { - padding: 10px; - margin-bottom: 0; - height: auto !important; - overflow: visible; - } - .fc-daygrid-day-frame { - min-height: 36px; - } - .fc-daygrid-day-top { - padding: 2px; - } - .fc-daygrid-day-number { - padding: 2px 4px; - min-width: 22px; - font-size: 12px; - } - .fc-col-header-cell { - font-size: 12px; - padding: 4px 0; - } - .fc-button { - font-size: 11px !important; - padding: 5px 10px !important; - } - .fc-toolbar-title { - font-size: 16px !important; - } + max-width: 1200px; + padding: 15px 15px 0 15px; + margin-bottom: 0; + + .yacht-calendar-header { + margin-bottom: 15px; + } + + .yacht-calendar-title { + font-size: 22px; + margin-bottom: 10px; + } + + .yacht-calendar-instructions { + margin-bottom: 30px; + padding: 8px 12px; + font-size: 13px; + } + + .yacht-calendar-legend { + margin-bottom: 10px; + font-size: 13px; + } + + .yacht-calendar { + padding: 10px; + margin-bottom: 0; + height: auto !important; + overflow: visible; + } + + .fc-daygrid-day-frame { + min-height: 36px; + } + + .fc-daygrid-day-top { + padding: 2px; + } + + .fc-daygrid-day-number { + padding: 2px 4px; + min-width: 22px; + font-size: 12px; + } + + .fc-col-header-cell { + font-size: 12px; + padding: 4px 0; + } + + .fc-button { + font-size: 11px !important; + padding: 5px 10px !important; + } + + .fc-toolbar-title { + font-size: 16px !important; + } } + .yacht-inquiry-layout { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 24px; - align-items: start; - margin-bottom: 30px; + display: grid; + grid-template-columns: 2fr 1fr; + gap: 24px; + align-items: start; + margin-bottom: 30px; } + .yacht-inquiry-form-container { - background: #021526; - padding: 24px; - border-radius: 8px; - border: none; - h4 { - margin: 0 0 8px 0; - font-size: 20px; - font-weight: 700; - color: #fff; - } + background: #021526; + border-radius: 8px; + border: none; + + h4 { + margin: 0 0 8px 0; + font-size: 20px; + font-weight: 700; + color: #fff; + } } + .yacht-inquiry-desc { - margin: 0 0 18px 0; - color: rgba(255, 255, 255, 0.7); - font-size: 14px; - line-height: 1.5; + margin: 0 0 18px 0; + color: rgba(255, 255, 255, 0.7); + font-size: 14px; + line-height: 1.5; } + .yacht-inquiry-form { - .form-field { - margin-bottom: 14px; - } - label { - display: block; - font-weight: 600; - margin-bottom: 5px; - color: rgba(255, 255, 255, 0.9); - font-size: 13px; - .required { - color: #ff6b6b; - margin-left: 2px; - } - } - input[type='text'] { - width: 100%; - padding: 10px 12px; - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 4px; - font-size: 14px; - transition: border-color 0.3s ease, box-shadow 0.3s ease; - background: rgba(255, 255, 255, 0.1); - color: #fff; - box-sizing: border-box; - font-family: inherit; - } - input[type='email'] { - width: 100%; - padding: 10px 12px; - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 4px; - font-size: 14px; - transition: border-color 0.3s ease, box-shadow 0.3s ease; - background: rgba(255, 255, 255, 0.1); - color: #fff; - box-sizing: border-box; - font-family: inherit; - } - input[type='tel'] { - width: 100%; - padding: 10px 12px; - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 4px; - font-size: 14px; - transition: border-color 0.3s ease, box-shadow 0.3s ease; - background: rgba(255, 255, 255, 0.1); - color: #fff; - box-sizing: border-box; - font-family: inherit; - } - textarea { - width: 100%; - padding: 10px 12px; - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 4px; - font-size: 14px; - transition: border-color 0.3s ease, box-shadow 0.3s ease; - background: rgba(255, 255, 255, 0.1); - color: #fff; - box-sizing: border-box; - font-family: inherit; - resize: vertical; - min-height: 60px; - &::placeholder { - color: rgba(255, 255, 255, 0.4); - } - &:focus { - outline: none; - border-color: #bc1834; - box-shadow: 0 0 0 3px rgba(188, 24, 52, 0.3); - background: rgba(255, 255, 255, 0.15); - } - } - input { - &::placeholder { - color: rgba(255, 255, 255, 0.4); - } - &:focus { - outline: none; - border-color: #bc1834; - box-shadow: 0 0 0 3px rgba(188, 24, 52, 0.3); - background: rgba(255, 255, 255, 0.15); - } - } - .form-actions { - margin-top: 18px; - } - .booking-terms { - color: rgba(255, 255, 255, 0.6); - font-size: 13px; - a { - color: rgba(255, 255, 255, 0.85); - } - } - .yacht-booking-submit { - background: #bc1834; - border-color: #bc1834; - color: #fff; - &:hover { - background: #fff; - color: #021526; - } - } + .form-field { + margin-bottom: 14px; + } + + label { + display: block; + font-weight: 600; + margin-bottom: 5px; + color: rgba(255, 255, 255, 0.9); + font-size: 13px; + + .required { + color: #ff6b6b; + margin-left: 2px; + } + } + + input[type='text'] { + width: 100%; + padding: 10px 12px; + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 4px; + font-size: 14px; + transition: border-color 0.3s ease, box-shadow 0.3s ease; + background: rgba(255, 255, 255, 0.1); + color: #fff; + box-sizing: border-box; + font-family: inherit; + } + + input[type='email'] { + width: 100%; + padding: 10px 12px; + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 4px; + font-size: 14px; + transition: border-color 0.3s ease, box-shadow 0.3s ease; + background: rgba(255, 255, 255, 0.1); + color: #fff; + box-sizing: border-box; + font-family: inherit; + } + + input[type='tel'] { + width: 100%; + padding: 10px 12px; + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 4px; + font-size: 14px; + transition: border-color 0.3s ease, box-shadow 0.3s ease; + background: rgba(255, 255, 255, 0.1); + color: #fff; + box-sizing: border-box; + font-family: inherit; + } + + textarea { + width: 100%; + padding: 10px 12px; + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 4px; + font-size: 14px; + transition: border-color 0.3s ease, box-shadow 0.3s ease; + background: rgba(255, 255, 255, 0.1); + color: #fff; + box-sizing: border-box; + font-family: inherit; + resize: vertical; + min-height: 60px; + + &::placeholder { + color: rgba(255, 255, 255, 0.4); + } + + &:focus { + outline: none; + border-color: #bc1834; + box-shadow: 0 0 0 3px rgba(188, 24, 52, 0.3); + background: rgba(255, 255, 255, 0.15); + } + } + + input { + &::placeholder { + color: rgba(255, 255, 255, 0.4); + } + + &:focus { + outline: none; + border-color: #bc1834; + box-shadow: 0 0 0 3px rgba(188, 24, 52, 0.3); + background: rgba(255, 255, 255, 0.15); + } + } + + .form-actions { + margin-top: 18px; + } + + .booking-terms { + color: rgba(255, 255, 255, 0.6); + font-size: 13px; + + a { + color: rgba(255, 255, 255, 0.85); + } + } + + .yacht-booking-submit { + background: #bc1834; + border-color: #bc1834; + color: #fff; + + &:hover { + background: #fff; + color: #021526; + } + } } + .yacht-inquiry-response { - margin-top: 15px; + margin-top: 15px; } + @media (max-width: 992px) { - .yacht-calendar-title { - font-size: 24px; - } - .yacht-calendar { - padding: 15px; - } - .yacht-inquiry-layout { - grid-template-columns: 1fr; - } + .yacht-calendar-title { + font-size: 24px; + } + + .yacht-calendar { + padding: 15px; + } + + .yacht-inquiry-layout { + grid-template-columns: 1fr; + } } + @media (max-width: 768px) { - .yacht-inquiry-form-container { - padding: 18px; - } - .yacht-calendar-title { - font-size: 22px; - } - .yacht-calendar { - padding: 10px; - .fc-toolbar { - flex-direction: column; - gap: 10px; - } - .fc-toolbar-chunk { - display: flex; - justify-content: center; - width: 100%; - } - .fc-button { - font-size: 12px; - padding: 6px 12px; - } - } - .yacht-calendar-legend { - gap: 8px 12px; - } - .yacht-booking-form-container { - padding: 20px; - } - .yacht-booking-form { - .form-row { - grid-template-columns: 1fr; - gap: 0; - } - } + + .yacht-calendar-title { + font-size: 22px; + } + + .yacht-calendar { + padding: 10px; + + .fc-toolbar { + flex-direction: column; + gap: 10px; + } + + .fc-toolbar-chunk { + display: flex; + justify-content: center; + width: 100%; + } + + .fc-button { + font-size: 12px; + padding: 6px 12px; + } + } + + .yacht-calendar-legend { + gap: 8px 12px; + } + + .yacht-booking-form-container { + padding: 20px; + } + + .yacht-booking-form { + .form-row { + grid-template-columns: 1fr; + gap: 0; + } + } } + @media (max-width: 480px) { - .yacht-calendar-switcher-button { - width: 100%; - justify-content: center; - } - .yacht-calendar-title { - font-size: 20px; - } - .yacht-booking-form-container { - padding: 15px; - } - .yacht-booking-form { - input[type='text'] { - font-size: 14px; - padding: 10px 12px; - } - input[type='email'] { - font-size: 14px; - padding: 10px 12px; - } - input[type='tel'] { - font-size: 14px; - padding: 10px 12px; - } - } - .yacht-booking-submit { - padding: 12px 20px; - font-size: 14px; - } + .yacht-calendar-switcher-button { + width: 100%; + justify-content: center; + } + + .yacht-calendar-title { + font-size: 20px; + } + + .yacht-booking-form-container { + padding: 15px; + } + + .yacht-booking-form { + input[type='text'] { + font-size: 14px; + padding: 10px 12px; + } + + input[type='email'] { + font-size: 14px; + padding: 10px 12px; + } + + input[type='tel'] { + font-size: 14px; + padding: 10px 12px; + } + } + + .yacht-booking-submit { + padding: 12px 20px; + font-size: 14px; + } } body a:not([href]):not([tabindex]), body a:not([href]):not([tabindex]):focus, body a:not([href]):not([tabindex]):hover { - color: #fff; + color: #fff; } body .fc .fc-day-other .fc-daygrid-day-top { - opacity: 1; + opacity: 1; } .yacht-calendar { - --fc-border-color: #0e2036; + --fc-border-color: #0e2036; - .fc { - --fc-border-color: #0e2036; - } - .fc-theme-standard td, - .fc-theme-standard th, - .fc-theme-standard .fc-scrollgrid, - .fc-scrollgrid, - .fc-scrollgrid-section > *, - .fc-daygrid-day, - .fc-col-header-cell { - border-color: #0e2036 !important; - } - .fc-col-header-cell { - background: #0e2036; - color: #fff; - } - .fc-col-header-cell .fc-col-header-cell-cushion { - color: #fff; - font-weight: 600; - padding: 8px 4px; - } + .fc { + --fc-border-color: #0e2036; + } + + .fc-theme-standard td, + .fc-theme-standard th, + .fc-theme-standard .fc-scrollgrid, + .fc-scrollgrid, + .fc-scrollgrid-section>*, + .fc-daygrid-day, + .fc-col-header-cell { + border-color: #0e2036 !important; + } + + .fc-col-header-cell { + background: #0e2036; + color: #fff; + } + + .fc-col-header-cell .fc-col-header-cell-cushion { + color: #fff; + font-weight: 600; + padding: 8px 4px; + } } table { - margin-bottom: 0 !important; -} + margin-bottom: 0 !important; +} \ No newline at end of file diff --git a/wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php b/wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php index 9c5a5e9..03321f9 100644 --- a/wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php +++ b/wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php @@ -167,19 +167,18 @@ class Calendar_All_View {
+ + ID ] ) ? $color_map[ $yacht->ID ] : $global_color; ?> + + + post_title ); ?> + + - + - - - ID ] ) ? $color_map[ $yacht->ID ] : $global_color; ?> - - - post_title ); ?> - -
diff --git a/wp-content/plugins/yacht-booking-system/includes/class-yacht-booking.php b/wp-content/plugins/yacht-booking-system/includes/class-yacht-booking.php index 799cad2..fb56a67 100644 --- a/wp-content/plugins/yacht-booking-system/includes/class-yacht-booking.php +++ b/wp-content/plugins/yacht-booking-system/includes/class-yacht-booking.php @@ -218,6 +218,16 @@ class Yacht_Booking { YACHT_BOOKING_VERSION ); + // WP color picker on yacht edit form. + if ( isset( $_GET['page'] ) && 'yacht-bookings-add-yacht' === $_GET['page'] ) { + wp_enqueue_style( 'wp-color-picker' ); + wp_enqueue_script( 'wp-color-picker' ); + wp_add_inline_script( + 'wp-color-picker', + 'jQuery(function($){ $(".yacht-color-picker").wpColorPicker(); });' + ); + } + wp_enqueue_script( 'yacht-booking-admin', YACHT_BOOKING_PLUGIN_URL . 'admin/assets/js/admin.js', diff --git a/wp-content/plugins/yacht-booking-system/includes/class-yacht.php b/wp-content/plugins/yacht-booking-system/includes/class-yacht.php index ca406c7..9894c40 100644 --- a/wp-content/plugins/yacht-booking-system/includes/class-yacht.php +++ b/wp-content/plugins/yacht-booking-system/includes/class-yacht.php @@ -152,4 +152,37 @@ class Yacht { public static function update_features( $yacht_id, $features ) { update_post_meta( $yacht_id, '_yacht_features', is_array( $features ) ? $features : array() ); } + + /** + * Get admin-selected yacht color for the aggregated calendar. + * + * Returns sanitized hex (#rrggbb, lowercase) or '' when not set. + * + * @param int $yacht_id Yacht post ID. + * @return string + */ + public static function get_color( $yacht_id ) { + $value = (string) get_post_meta( $yacht_id, '_yacht_color', true ); + if ( '' === $value ) { + return ''; + } + return preg_match( '/^#[0-9a-f]{6}$/i', $value ) ? strtolower( $value ) : ''; + } + + /** + * Update yacht color. Empty value removes the meta (fallback to palette). + * + * @param int $yacht_id Yacht post ID. + * @param string $color Hex color (#rrggbb) or empty string. + */ + public static function update_color( $yacht_id, $color ) { + $color = trim( (string) $color ); + if ( '' === $color ) { + delete_post_meta( $yacht_id, '_yacht_color' ); + return; + } + if ( preg_match( '/^#[0-9a-f]{6}$/i', $color ) ) { + update_post_meta( $yacht_id, '_yacht_color', strtolower( $color ) ); + } + } }