From 38f5babde3cb56b8b98f8499ffb81c01ec2c9c44 Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Fri, 6 Mar 2026 01:06:43 +0100 Subject: [PATCH] feat: redesign tickets main view and basket view with improved styles and layout - Updated SCSS for tickets main view and basket view, enhancing visual design and responsiveness. - Added new calendar functionality in the admin panel for managing ticket availability. - Implemented error handling for ticket availability in the basket view. - Introduced a new calendar availability table in the database for tracking ticket dates. - Added a new link to the calendar in the logged-in user navigation. - Improved ticket selection logic to disable unavailable tickets in the main view. - Created guidelines for code standards in AGENTS.md. --- .serena/project.yml | 7 + .vscode/ftp-kr.sync.cache.json | 1018 ++++++++++++++++++++------- AGENTS.md | 14 + autoload/controls/class.Apanel.php | 65 +- autoload/controls/class.Tickets.php | 72 +- autoload/factory/class.Tickets.php | 199 +++++- layout/.DS_Store | Bin 6148 -> 0 bytes layout/style-css/style.css | 128 +++- layout/style-scss/style.scss | 727 ++++++++++++++++++- templates/admin-panel/calendar.php | 167 +++++ templates/site/layout-logged.php | 7 +- templates/tickets/basket-view.php | 19 +- templates/tickets/main-view.php | 49 +- upgrade.php | 7 + 14 files changed, 2218 insertions(+), 261 deletions(-) create mode 100644 AGENTS.md delete mode 100644 layout/.DS_Store create mode 100644 templates/admin-panel/calendar.php diff --git a/.serena/project.yml b/.serena/project.yml index c876d0c..bec9a30 100644 --- a/.serena/project.yml +++ b/.serena/project.yml @@ -115,3 +115,10 @@ initial_prompt: "" # override of the corresponding setting in serena_config.yml, see the documentation there. # If null or missing, the value from the global config is used. symbol_info_budget: + +# The language backend to use for this project. +# If not set, the global setting from serena_config.yml is used. +# Valid values: LSP, JetBrains +# Note: the backend is fixed at startup. If a project with a different backend +# is activated post-init, an error will be returned. +language_backend: diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json index 0a6543f..f2d0ad1 100644 --- a/.vscode/ftp-kr.sync.cache.json +++ b/.vscode/ftp-kr.sync.cache.json @@ -2,97 +2,102 @@ "ftp://brzezovka.pl@jacek@brzezovka.pl": { "public_html": { "tickets": { + "AGENTS.md": { + "type": "-", + "size": 824, + "lmtime": 1772746796821, + "modified": false + }, "ajax.php": { "type": "-", - "size": 1208, + "size": 1287, "lmtime": 0, "modified": false }, "api.php": { "type": "-", - "size": 968, - "lmtime": 0, - "modified": true + "size": 1003, + "lmtime": 1771856674000, + "modified": false }, "autoload": { "class.Cron.php": { "type": "-", "size": 27, - "lmtime": 1756895449615, + "lmtime": 0, "modified": false }, "class.DbModel.php": { "type": "-", "size": 1397, - "lmtime": 1771797002635, + "lmtime": 1771856674000, "modified": false }, "class.Excel.php": { "type": "-", "size": 4319, - "lmtime": 0, + "lmtime": 1771856674000, "modified": false }, "class.Html.php": { "type": "-", "size": 2105, - "lmtime": 0, + "lmtime": 1771856674000, "modified": false }, "class.S.php": { "type": "-", "size": 7625, - "lmtime": 1771797056545, + "lmtime": 1771856674000, "modified": false }, "class.Tpl.php": { "type": "-", "size": 1755, - "lmtime": 1771797039461, + "lmtime": 1771856674000, "modified": false }, "controls": { - "207286": {}, "class.Apanel.php": { "type": "-", - "size": 5395, - "lmtime": 1771797091338, + "size": 7347, + "lmtime": 1771856674000, "modified": false }, "class.Cron.php": { "type": "-", "size": 131, - "lmtime": 0, + "lmtime": 1771856674000, "modified": false }, "class.Scanner.php": { "type": "-", "size": 3550, - "lmtime": 1771797058858, + "lmtime": 1771856674000, "modified": false }, "class.Site.php": { "type": "-", "size": 625, - "lmtime": 1771797034132, + "lmtime": 1771856674000, "modified": false }, "class.Tickets.php": { "type": "-", - "size": 21496, - "lmtime": 1771797086011, + "size": 21842, + "lmtime": 1771856674000, "modified": false }, "class.Users.php": { "type": "-", "size": 3949, - "lmtime": 1756895574116, + "lmtime": 1771856674000, "modified": false }, ".htaccess": { "type": "-", - "size": 200, - "lmtime": 1746048812782, + "size": 208, + "lmtime": 1771856674000, "modified": false }, "index.php": { @@ -103,35 +108,34 @@ } }, "factory": { - "879348": {}, "class.Apanel.php": { "type": "-", - "size": 1273, - "lmtime": 1771796998145, + "size": 2065, + "lmtime": 1771856674000, "modified": false }, "class.Cron.php": { "type": "-", "size": 45, - "lmtime": 1756895770647, + "lmtime": 0, "modified": false }, "class.Tickets.php": { "type": "-", "size": 2630, - "lmtime": 1771796997296, + "lmtime": 0, "modified": false }, "class.Users.php": { "type": "-", "size": 1519, - "lmtime": 1771797051167, + "lmtime": 1771856674000, "modified": false }, ".htaccess": { "type": "-", - "size": 200, - "lmtime": 1746048813105, + "size": 208, + "lmtime": 1771856674000, "modified": false }, "index.php": { @@ -143,34 +147,33 @@ }, ".htaccess": { "type": "-", - "size": 200, - "lmtime": 1746048812312, + "size": 208, + "lmtime": 1771856674000, "modified": false }, "view": { - "330138": {}, "class.Cron.php": { "type": "-", "size": 46, - "lmtime": 1756895555214, + "lmtime": 1771856674000, "modified": false }, "class.Site.php": { "type": "-", "size": 863, - "lmtime": 1771797032107, + "lmtime": 1771856674000, "modified": false }, "class.Users.php": { "type": "-", "size": 361, - "lmtime": 0, + "lmtime": 1771856674000, "modified": false }, ".htaccess": { "type": "-", - "size": 200, - "lmtime": 1746048813184, + "size": 208, + "lmtime": 1771856674000, "modified": false }, "index.php": { @@ -181,24 +184,16 @@ } } }, - ".claude": { - "settings.local.json": { - "type": "-", - "size": 184, - "lmtime": 1771797522111, - "modified": false - } - }, "config.php": { "type": "-", - "size": 8763, - "lmtime": 1771797005444, + "size": 4920, + "lmtime": 0, "modified": false }, "cron.php": { "type": "-", - "size": 2636, - "lmtime": 0, + "size": 2752, + "lmtime": 1771856674000, "modified": false }, "custom.php": { @@ -207,47 +202,123 @@ "lmtime": 0, "modified": false }, - "dev": { - "team": { - "2026-02-22_22-51_php81-kompatybilnosc.md": { - "type": "-", - "size": 4570, - "lmtime": 1771797146637, - "modified": false - }, - "session-state.json": { - "type": "-", - "size": 730, - "lmtime": 1771797155895, - "modified": false - } - } - }, - ".gitignore": { - "type": "-", - "size": 0, - "lmtime": 0, - "modified": false - }, ".htaccess": { "type": "-", - "size": 1031, - "lmtime": 0, + "size": 1055, + "lmtime": 1771856674000, "modified": false }, "index.php": { "type": "-", - "size": 1774, - "lmtime": 1771797586319, + "size": 1809, + "lmtime": 1771856674000, "modified": false }, "info.php": { "type": "-", "size": 14, - "lmtime": 1771795279292, + "lmtime": 1771856674000, "modified": false }, - "layout": {}, + "layout": { + "style-scss": { + ".htaccess": { + "type": "-", + "size": 208, + "lmtime": 1771856674000, + "modified": false + }, + "index.php": { + "type": "-", + "size": 0, + "lmtime": 0, + "modified": false + }, + "_mixins.scss": { + "type": "-", + "size": 3561, + "lmtime": 0, + "modified": false + }, + "_stuff.scss": { + "type": "-", + "size": 3142, + "lmtime": 1771856674000, + "modified": false + }, + "style.scss": { + "type": "-", + "size": 26805, + "lmtime": 1771856674000, + "modified": false + } + }, + "style-css": { + "countdown": {}, + ".htaccess": { + "type": "-", + "size": 208, + "lmtime": 1771856674000, + "modified": false + }, + "style.css": { + "type": "-", + "size": 20712, + "lmtime": 1771856674000, + "modified": false + }, + "style.css.map": { + "type": "-", + "size": 42076, + "lmtime": 1771856674000, + "modified": false + } + }, + "images": { + "bg-unlogged.jpg": { + "type": "-", + "size": 73070, + "lmtime": 1771856674000, + "modified": false + }, + ".htaccess": { + "type": "-", + "size": 208, + "lmtime": 1771856674000, + "modified": false + }, + "logo copy.png": { + "type": "-", + "size": 8399, + "lmtime": 1771856674000, + "modified": false + }, + "logo.png": { + "type": "-", + "size": 8399, + "lmtime": 0, + "modified": false + }, + "logo-white.png": { + "type": "-", + "size": 8735, + "lmtime": 0, + "modified": false + }, + "no-image.jpg": { + "type": "-", + "size": 5050, + "lmtime": 0, + "modified": false + }, + "shopping-basket.svg": { + "type": "-", + "size": 3179, + "lmtime": 0, + "modified": false + } + } + }, "libraries": { "bootstrap": {}, "bootstrap-4.1.3": {}, @@ -282,27 +353,28 @@ "jquery": {}, "jquery-confirm": {}, "jquery-gantt": {}, - "license.txt": { - "type": "-", - "size": 16728, - "lmtime": 1748556485000, - "modified": false - }, "medoo": {}, "moment": {}, - "phpmailer": {}, + "phpmailer": { + "class.phpmailer.php": { + "type": "-", + "size": 145738, + "lmtime": 1771856674000, + "modified": false + } + }, "phpqrcode": {}, "qrcode-scanner": {}, "rb-download.tar.gz": { "type": "-", "size": 132796, - "lmtime": 1771797357906, + "lmtime": 0, "modified": false }, "rb.php": { "type": "-", - "size": 552317, - "lmtime": 1748556485000, + "size": 570902, + "lmtime": 1771856674000, "modified": false }, "tagsinput": {}, @@ -319,197 +391,517 @@ "modified": false } }, - "orders": {}, + "load_prices.php": { + "type": "-", + "size": 1112, + "lmtime": 1771856674000, + "modified": false + }, + "orders": { + "0": { + "0": { + "0010e260edd4bc287bfefa3440b9e64a.png": { + "type": "-", + "size": 407, + "lmtime": 0, + "modified": false + }, + "004a3da61a49092495fea8f53ca70cb7.png": { + "type": "-", + "size": 398, + "lmtime": 0, + "modified": false + }, + "007c1e9e8a19002f250a60f390d451d4.png": { + "type": "-", + "size": 411, + "lmtime": 0, + "modified": false + }, + "00b1870ea2c27f95cc6b8a79326da988.png": { + "type": "-", + "size": 403, + "lmtime": 1771856674000, + "modified": false + }, + "00b383ed530710adb0b20742e8c7ebd8.png": { + "type": "-", + "size": 410, + "lmtime": 0, + "modified": false + }, + "00b5a999bdbb389b60f6d646f5866667.png": { + "type": "-", + "size": 403, + "lmtime": 0, + "modified": false + }, + "00d4731f73ef366a5d283f9df3e4e0b4.png": { + "type": "-", + "size": 405, + "lmtime": 1771856674000, + "modified": false + } + }, + "5": { + "0561b913439320638363d3b63fd18bdd.png": { + "type": "-", + "size": 406, + "lmtime": 0, + "modified": false + }, + "057652d41808ba348c23962cfd477f08.png": { + "type": "-", + "size": 405, + "lmtime": 0, + "modified": false + }, + "0580a39afc949bd0d79909541f92dd8d.png": { + "type": "-", + "size": 406, + "lmtime": 1771856674000, + "modified": false + }, + "0583b57f6d43dc5e1052b64c1eb882ac.png": { + "type": "-", + "size": 414, + "lmtime": 0, + "modified": false + }, + "05a909585a784123549fcbb152327f87.png": { + "type": "-", + "size": 406, + "lmtime": 0, + "modified": false + }, + "05aa0f6b6a45a018c4af8b9efb24e96c.png": { + "type": "-", + "size": 405, + "lmtime": 0, + "modified": false + }, + "05d5f354eee6052e659f269df53aa08d.png": { + "type": "-", + "size": 410, + "lmtime": 0, + "modified": false + }, + "05ecd06d96092f2494eb595657e9c170.png": { + "type": "-", + "size": 417, + "lmtime": 1771856674000, + "modified": false + } + }, + "6": { + "06bf895aefe73d96c220d34320c9b1ef.png": { + "type": "-", + "size": 405, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "1": { + "e": { + "1e8eb6de16750a2d4f28917b72f9620c.png": { + "type": "-", + "size": 404, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "2": { + "8": { + "283cbf8d8596f8785e3e55380ea64b3d.png": { + "type": "-", + "size": 412, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "4": { + "1": { + "41b35697ac95919c204ef94c9fd76c18.png": { + "type": "-", + "size": 417, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "5": { + "9": { + "59ef7bc8f464fa6d61a1bc302e63e87a.png": { + "type": "-", + "size": 404, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "6": { + "4": { + "64e4bf90e8be9cf16ad3c9e2e48db531.png": { + "type": "-", + "size": 405, + "lmtime": 1771856674000, + "modified": false + } + }, + "9": { + "69120abe28ce1d3a172995ebf19e46b5.png": { + "type": "-", + "size": 405, + "lmtime": 1771856674000, + "modified": false + } + }, + "a": { + "6a39da4002c99904a23f8bdffbb9f3f2.png": { + "type": "-", + "size": 400, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "8": { + "b": { + "8b47c74db03fa468b98146c65f72e4e3.png": { + "type": "-", + "size": 405, + "lmtime": 1771856674000, + "modified": false + } + }, + "e": { + "8e1151ddfee0b552ca05362ccb93bec4.png": { + "type": "-", + "size": 407, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "9": { + "2": { + "9224cac8a1f7a2f1867209adcb220bca.png": { + "type": "-", + "size": 405, + "lmtime": 1771856674000, + "modified": false + } + }, + "6": { + "9625c1861d2ea16f1920425c8638f47d.png": { + "type": "-", + "size": 399, + "lmtime": 1771856674000, + "modified": false + } + }, + "c": { + "9c9d2e99143ff0f674fc2b8fefe0c811.png": { + "type": "-", + "size": 407, + "lmtime": 0, + "modified": false + }, + "9ca99956c4b729c57d38c8fa97873637.png": { + "type": "-", + "size": 400, + "lmtime": 1771856674000, + "modified": false + }, + "9cbdf84e6675393a64f3d4ba9b7f2d89.png": { + "type": "-", + "size": 415, + "lmtime": 1771856674000, + "modified": false + }, + ".htaccess": { + "type": "-", + "size": 200, + "lmtime": 0, + "modified": false + } + }, + "e": { + "9e82b8e722defb1cfd205b3fbca56415.png": { + "type": "-", + "size": 420, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "d": { + "0": { + "d0dddabcb18d55a9a5c344b04927e3c5.png": { + "type": "-", + "size": 416, + "lmtime": 1771856674000, + "modified": false + } + }, + "1": { + "d1531cd384f68413ab192f52ac69aaa6.png": { + "type": "-", + "size": 405, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "e": { + "6": { + "e618cfa6867950a525a03931d5ba88bb.png": { + "type": "-", + "size": 407, + "lmtime": 1771856674000, + "modified": false + } + }, + "c": { + "ec2d2cefab8e72d4bf6b2aa49bbe3ba5.png": { + "type": "-", + "size": 409, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "f": { + "0": { + "f03e85d9404a42a19b690571bbc76b45.png": { + "type": "-", + "size": 406, + "lmtime": 1771856674000, + "modified": false + } + }, + "7": { + "f7c805a2a17162f5cacc8ec025148af5.png": { + "type": "-", + "size": 404, + "lmtime": 1771856674000, + "modified": false + } + }, + "d": { + "fd0ea2de49177201f8c9836f8efcace6.png": { + "type": "-", + "size": 410, + "lmtime": 1771856674000, + "modified": false + } + }, + "e": { + "fe30725247fc0715a4db2175162d4482.png": { + "type": "-", + "size": 414, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "a": { + "0": { + "a0ac567a7f2cb51e2c1af414b12d187c.png": { + "type": "-", + "size": 408, + "lmtime": 1771856674000, + "modified": false + } + }, + "2": { + "a253ca142247a543d4a82184823049c2.png": { + "type": "-", + "size": 398, + "lmtime": 1771856674000, + "modified": false + } + }, + "3": { + "a3125a56567a69f81df9c62977ac036b.png": { + "type": "-", + "size": 410, + "lmtime": 1771856674000, + "modified": false + } + }, + "a": { + "aa5429ca1504fffa73dc51e3ee5ccabb.png": { + "type": "-", + "size": 396, + "lmtime": 1771856674000, + "modified": false + } + }, + "b": { + "ab25bf06c3053d1a6681329db64f738b.png": { + "type": "-", + "size": 405, + "lmtime": 0, + "modified": false + }, + "ab385735da32754cac3771a18d65e8f1.png": { + "type": "-", + "size": 399, + "lmtime": 1771856674000, + "modified": false + }, + "ab42658b8accc8aa1edd295f35106168.png": { + "type": "-", + "size": 406, + "lmtime": 0, + "modified": false + }, + "ab55429712d3334266342725c85e054b.png": { + "type": "-", + "size": 401, + "lmtime": 0, + "modified": false + }, + "abafb25b1af7f728a77a2ed876d62a57.png": { + "type": "-", + "size": 413, + "lmtime": 0, + "modified": false + }, + "abc979a6af1d8d8039e0239e501bb8fd.png": { + "type": "-", + "size": 398, + "lmtime": 0, + "modified": false + }, + "abe354b0babc452399f3b0bf75ef5b6b.png": { + "type": "-", + "size": 411, + "lmtime": 1771856674000, + "modified": false + }, + ".htaccess": { + "type": "-", + "size": 200, + "lmtime": 0, + "modified": false + } + }, + "f": { + "af1ef99320b2de9e6d7dd505fa4c5a4c.png": { + "type": "-", + "size": 407, + "lmtime": 1771856674000, + "modified": false + } + } + }, + "c": { + "9": { + "c9b7cc8d33c11126a111d75dfcaf1729.png": { + "type": "-", + "size": 407, + "lmtime": 1771856674000, + "modified": false + } + }, + "e": { + "ce51c7fb9cafdfeaeef6ac1cfe75c1a9.png": { + "type": "-", + "size": 402, + "lmtime": 1771856674000, + "modified": false + } + }, + "f": { + "cf5298d35e6475ee5d46cc1640d133de.png": { + "type": "-", + "size": 461, + "lmtime": 1771856674000, + "modified": false + } + } + } + }, + "robots.txt": { + "type": "-", + "size": 26, + "lmtime": 1771856674000, + "modified": false + }, + ".serena": { + "cache": {}, + "project.yml": { + "type": "-", + "size": 8072, + "lmtime": 1771952407000, + "modified": false + } + }, "templates": { - "admin-panel": { - "login.php": { - "type": "-", - "size": 376, - "lmtime": 0, - "modified": false - }, - "main-view.php": { - "type": "-", - "size": 1874, - "lmtime": 1746048817728, - "modified": false - }, - "order-data.php": { - "type": "-", - "size": 13439, - "lmtime": 1746048817806, - "modified": false - }, - "order-data-table.php": { - "type": "-", - "size": 1203, - "lmtime": 1746048817883, - "modified": false - }, - "order-summary.php": { - "type": "-", - "size": 515, - "lmtime": 0, - "modified": false - } - }, - "components": { - "spinner.php": { - "type": "-", - "size": 152, - "lmtime": 0, - "modified": false - } - }, - "cron": { - "main-view.php": { - "type": "-", - "size": 2995, - "lmtime": 0, - "modified": false - } - }, - "html": { - "button.php": { - "type": "-", - "size": 1093, - "lmtime": 0, - "modified": false - }, - "form-text.php": { - "type": "-", - "size": 269, - "lmtime": 0, - "modified": false - }, - "input-icon.php": { - "type": "-", - "size": 2239, - "lmtime": 0, - "modified": false - }, - "input.php": { - "type": "-", - "size": 1840, - "lmtime": 0, - "modified": false - }, - "input-switch.php": { - "type": "-", - "size": 1065, - "lmtime": 0, - "modified": false - }, - "panel.php": { - "type": "-", - "size": 249, - "lmtime": 0, - "modified": false - }, - "select.php": { - "type": "-", - "size": 1807, - "lmtime": 0, - "modified": false - }, - "textarea.php": { - "type": "-", - "size": 1564, - "lmtime": 0, - "modified": false - } - }, - "site": { - "layout-cron.php": { - "type": "-", - "size": 2512, - "lmtime": 0, - "modified": false - }, - "layout-logged.php": { - "type": "-", - "size": 5833, - "lmtime": 0, - "modified": false - }, - "layout-unlogged.php": { - "type": "-", - "size": 4356, - "lmtime": 0, - "modified": false - }, - "regulamin-for-gifts.php": { - "type": "-", - "size": 1733, - "lmtime": 0, - "modified": false - }, - "regulamin.php": { - "type": "-", - "size": 9529, - "lmtime": 1746048817958, - "modified": false - } - }, "tickets": { "add-ticket.php": { "type": "-", "size": 761, - "lmtime": 0, + "lmtime": 1771856674000, "modified": false }, "basket-form.php": { "type": "-", - "size": 2044, - "lmtime": 1746048818038, + "size": 2384, + "lmtime": 1771856674000, "modified": false }, "basket-summary.php": { "type": "-", - "size": 405, - "lmtime": 1746048818117, + "size": 423, + "lmtime": 1771856674000, "modified": false }, "basket-view.php": { "type": "-", - "size": 11239, - "lmtime": 1746048818193, + "size": 11856, + "lmtime": 1771856674000, "modified": false }, "disabled-sell.php": { "type": "-", "size": 228, - "lmtime": 0, + "lmtime": 1771856674000, "modified": false }, "main-view.php": { "type": "-", - "size": 13090, - "lmtime": 1746048818266, + "size": 13730, + "lmtime": 1771856674000, "modified": false }, "order-confirm.php": { "type": "-", - "size": 6853, - "lmtime": 1746048818342, + "size": 7030, + "lmtime": 1771856674000, "modified": false }, "przelewy24.php": { "type": "-", "size": 3053, - "lmtime": 0, + "lmtime": 1771856674000, "modified": false }, "scanner-view.php": { "type": "-", - "size": 1254, - "lmtime": 1746048818427, + "size": 1314, + "lmtime": 1771856674000, "modified": false }, "shopping-cart.php": { "type": "-", - "size": 2171, - "lmtime": 1746048818500, + "size": 2501, + "lmtime": 1771856674000, "modified": false } }, @@ -517,13 +909,155 @@ "login-form.php": { "type": "-", "size": 3600, - "lmtime": 0, + "lmtime": 1771856674000, "modified": false }, "settings.php": { "type": "-", - "size": 3457, - "lmtime": 1746048818575, + "size": 3540, + "lmtime": 1771856674000, + "modified": false + } + }, + "admin-panel": { + "login.php": { + "type": "-", + "size": 376, + "lmtime": 1771856674000, + "modified": false + }, + "main-view.php": { + "type": "-", + "size": 1928, + "lmtime": 1771856674000, + "modified": false + }, + "order-data.php": { + "type": "-", + "size": 14637, + "lmtime": 1771856674000, + "modified": false + }, + "order-data-table.php": { + "type": "-", + "size": 1251, + "lmtime": 1771856674000, + "modified": false + }, + "order-summary.php": { + "type": "-", + "size": 515, + "lmtime": 1771856674000, + "modified": false + }, + "settings.php": { + "type": "-", + "size": 1483, + "lmtime": 1771856674000, + "modified": false + }, + "tickets.php": { + "type": "-", + "size": 4615, + "lmtime": 1771856674000, + "modified": false + } + }, + "components": { + "spinner.php": { + "type": "-", + "size": 152, + "lmtime": 1771856674000, + "modified": false + } + }, + "cron": { + "main-view.php": { + "type": "-", + "size": 2995, + "lmtime": 1771856674000, + "modified": false + } + }, + "site": { + "layout-cron.php": { + "type": "-", + "size": 2512, + "lmtime": 1771856674000, + "modified": false + }, + "layout-logged.php": { + "type": "-", + "size": 6106, + "lmtime": 1771856674000, + "modified": false + }, + "layout-unlogged.php": { + "type": "-", + "size": 4356, + "lmtime": 1771856674000, + "modified": false + }, + "regulamin-for-gifts.php": { + "type": "-", + "size": 1733, + "lmtime": 1771856674000, + "modified": false + }, + "regulamin.php": { + "type": "-", + "size": 9529, + "lmtime": 1771856674000, + "modified": false + } + }, + "html": { + "button.php": { + "type": "-", + "size": 1093, + "lmtime": 1771856674000, + "modified": false + }, + "form-text.php": { + "type": "-", + "size": 269, + "lmtime": 1771856674000, + "modified": false + }, + "input-icon.php": { + "type": "-", + "size": 2239, + "lmtime": 1771856674000, + "modified": false + }, + "input.php": { + "type": "-", + "size": 1840, + "lmtime": 1771856674000, + "modified": false + }, + "input-switch.php": { + "type": "-", + "size": 1065, + "lmtime": 1771856674000, + "modified": false + }, + "panel.php": { + "type": "-", + "size": 249, + "lmtime": 1771856674000, + "modified": false + }, + "select.php": { + "type": "-", + "size": 1807, + "lmtime": 1771856674000, + "modified": false + }, + "textarea.php": { + "type": "-", + "size": 1564, + "lmtime": 1771856674000, "modified": false } } @@ -531,7 +1065,13 @@ "test.txt": { "type": "-", "size": 348, - "lmtime": 0, + "lmtime": 1771856674000, + "modified": false + }, + "upgrade.php": { + "type": "-", + "size": 1444, + "lmtime": 1771856674000, "modified": false }, "upload": {} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..ba2bf16 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,14 @@ +# Zasady pisania kodu +- Kod ma być czytelny „dla obcego”: jasne nazwy, mało magii +- Brak „skrótów na szybko” typu logika w widokach, copy-paste, losowe helpery bez spójności +- Każda funkcja/klasa ma mieć jedną odpowiedzialność, zwykle do 30–50 linii (jeśli dłuższe – dzielić) +- max 3 poziomy zagnieżdżeń (if/foreach), reszta do osobnych metod +- Nazewnictwo: + - klasy: PascalCase + - metody/zmienne: camelCase + - stałe: UPPER_SNAKE_CASE +- Zero „skrótologii” w nazwach (np. $d, $tmp, $x1) poza pętlami 2–3 linijki +- medoo + prepared statements bez wyjątków (żadnego sklejania SQL stringiem) +- XSS: escape w widokach (np. helper e()) +- CSRF dla formularzy, sensowna obsługa sesji +- Kod ma mieć komentarze tylko tam, gdzie wyjaśniają „dlaczego”, nie „co” \ No newline at end of file diff --git a/autoload/controls/class.Apanel.php b/autoload/controls/class.Apanel.php index 25dc50a..3e53f58 100644 --- a/autoload/controls/class.Apanel.php +++ b/autoload/controls/class.Apanel.php @@ -276,4 +276,67 @@ class Apanel echo json_encode(['status' => 'ok']); exit; } -} \ No newline at end of file + + static public function calendar() + { + $token = bin2hex(random_bytes(32)); + \S::set_session('admin_calendar_csrf', $token); + + return \Tpl::view('admin-panel/calendar', [ + 'calendar_groups' => \factory\Tickets::getCalendarDefinitions(), + 'csrf_token' => $token + ]); + } + + static public function calendar_dates() + { + header('Content-Type: application/json; charset=utf-8'); + + $groupKey = trim((string) \S::get('ticket_group')); + $definitions = \factory\Tickets::getCalendarDefinitions(); + if (!isset($definitions[$groupKey])) { + echo json_encode(['status' => 'error', 'message' => 'Niepoprawny rodzaj biletu.']); + exit; + } + + $dates = \factory\Tickets::getEnabledDatesByGroup($groupKey); + echo json_encode([ + 'status' => 'ok', + 'enabled_dates' => $dates + ]); + exit; + } + + static public function calendar_save() + { + header('Content-Type: application/json; charset=utf-8'); + + $sessionToken = (string) \S::get_session('admin_calendar_csrf'); + $requestToken = trim((string) \S::get('csrf_token')); + if (empty($sessionToken) || empty($requestToken) || !hash_equals($sessionToken, $requestToken)) { + echo json_encode(['status' => 'error', 'message' => 'Niepoprawny token CSRF.']); + exit; + } + + $groupKey = trim((string) \S::get('ticket_group')); + $definitions = \factory\Tickets::getCalendarDefinitions(); + if (!isset($definitions[$groupKey])) { + echo json_encode(['status' => 'error', 'message' => 'Niepoprawny rodzaj biletu.']); + exit; + } + + $dates = $_POST['dates'] ?? []; + if (!is_array($dates)) { + $dates = []; + } + + $saved = \factory\Tickets::saveEnabledDatesForGroup($groupKey, $dates); + if (!$saved) { + echo json_encode(['status' => 'error', 'message' => 'Nie udało się zapisać kalendarza.']); + exit; + } + + echo json_encode(['status' => 'ok']); + exit; + } +} diff --git a/autoload/controls/class.Tickets.php b/autoload/controls/class.Tickets.php index 2800c25..c6e9a22 100644 --- a/autoload/controls/class.Tickets.php +++ b/autoload/controls/class.Tickets.php @@ -9,13 +9,24 @@ class Tickets global $settings; $enable_sell = \factory\Apanel::getSetting('enable_sell', '1'); + $selectedDate = \S::get('selected_date'); + $normalizedSelectedDate = \factory\Tickets::normalizeDateFromPicker($selectedDate); + $ticketAvailability = []; + + if ($normalizedSelectedDate) { + $ticketAvailability = \factory\Tickets::getTicketAvailabilityForDate( + array_keys($settings['tickets']), + $normalizedSelectedDate + ); + } if ( !$enable_sell || $enable_sell === '0' ) return \Tpl::view( 'tickets/disabled-sell' ); return \Tpl::view('tickets/main-view', [ 'cart' => \S::get_session('basket'), - 'settings' => $settings + 'settings' => $settings, + 'ticket_availability' => $ticketAvailability ]); } @@ -23,19 +34,45 @@ class Tickets { global $settings; - $selected_date = \S::get( 'date' ) ? \S::get( 'date' ) : null; $diffDays = \S::get('diffdays') ?? 0; + $ticket_id = \S::get('ticket_id'); + $basket = \S::get_session('basket'); + + if (!$selected_date && isset($basket[$ticket_id][$diffDays]['date'])) { + $selected_date = $basket[$ticket_id][$diffDays]['date']; + } + + if (!$selected_date && \factory\Tickets::getCalendarGroupForTicket($ticket_id)) { + echo json_encode([ + 'status' => 'error', + 'message' => 'Wybierz datę wizyty dla tego biletu.' + ]); + exit; + } if ( $selected_date ) { - $selected = new \DateTime($selected_date); + $selected = \DateTime::createFromFormat('d-m-Y', $selected_date); + if (!$selected) { + echo json_encode([ + 'status' => 'error', + 'message' => 'Niepoprawna data wizyty.' + ]); + exit; + } + $today = new \DateTime(date('Y-m-d') . ' 00:00:00'); $diffDays = $selected->diff($today)->days; - } - $basket = \S::get_session('basket'); - $ticket_id = \S::get('ticket_id'); + if (!\factory\Tickets::canBuyTicketOnDate($ticket_id, $selected_date)) { + echo json_encode([ + 'status' => 'error', + 'message' => 'Ten rodzaj biletu jest niedostępny w wybranym dniu.' + ]); + exit; + } + } if ( !empty($basket[$ticket_id][$diffDays]) ) { @@ -53,7 +90,8 @@ class Tickets $addon = 0; } - $is_weekend = $selected_date && in_array((new \DateTime($selected_date))->format('N'), ['6', '7']); + $selectedDateObject = $selected_date ? \DateTime::createFromFormat('d-m-Y', $selected_date) : null; + $is_weekend = $selectedDateObject && in_array($selectedDateObject->format('N'), ['6', '7']); $base_price = $is_weekend ? ($settings['tickets'][$ticket_id]['price_weekend'] ?? $settings['tickets'][$ticket_id]['price']) : $settings['tickets'][$ticket_id]['price']; @@ -228,6 +266,24 @@ class Tickets global $settings, $mdb; $basket = \S::get_session('basket'); + if (empty($basket) || !is_array($basket)) { + header('Location: /tickets/main_view/'); + exit; + } + + foreach ($basket as $ticketId => $variants) { + foreach ($variants as $variant) { + if (empty($variant['date'])) { + continue; + } + + if (!\factory\Tickets::canBuyTicketOnDate($ticketId, $variant['date'])) { + header('Location: /tickets/basket_view/?calendar_error=1'); + exit; + } + } + } + $date = date('Y-m-d H:i:s'); $finalPrice = 0; @@ -637,4 +693,4 @@ class Tickets { return \Tpl::view('site/regulamin-for-gifts'); } -} \ No newline at end of file +} diff --git a/autoload/factory/class.Tickets.php b/autoload/factory/class.Tickets.php index 530d4ef..56493a6 100644 --- a/autoload/factory/class.Tickets.php +++ b/autoload/factory/class.Tickets.php @@ -1,6 +1,203 @@ [ + 'label' => 'Park rozrywki i dinozaurów + bilety prezentowe', + 'ticket_ids' => [ + 'plac-zabaw-ulgowy', + 'plac-zabaw-normalny', + 'gift-plac-zabaw-ulgowy', + 'gift-plac-zabaw-normalny', + ], + ], + 'park-wodny' => [ + 'label' => 'Park wodny', + 'ticket_ids' => [ + 'park-wodny-ulgowy', + 'park-wodny-normalny', + ], + ], + 'all-open' => [ + 'label' => 'All Open + bilety prezentowe', + 'ticket_ids' => [ + 'bilet-all-open-ulgowy', + 'bilet-all-open-normalny', + 'gift-bilet-all-open-ulgowy', + 'gift-bilet-all-open-normalny', + ], + ], + ]; + } + + static public function ensureCalendarTable() + { + global $mdb; + + if (self::$calendarTableReady) { + return; + } + + $sql = "CREATE TABLE IF NOT EXISTS ticket_calendar_availability ( + ticket_group VARCHAR(64) NOT NULL, + available_date DATE NOT NULL, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (ticket_group, available_date) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8"; + + $mdb->pdo->exec($sql); + self::$calendarTableReady = true; + } + + static public function normalizeDateFromPicker($date) + { + $date = trim((string) $date); + if ($date === '') { + return null; + } + + $formats = ['d-m-Y', 'Y-m-d']; + foreach ($formats as $format) { + $parsedDate = \DateTime::createFromFormat($format, $date); + if ($parsedDate && $parsedDate->format($format) === $date) { + return $parsedDate->format('Y-m-d'); + } + } + + return null; + } + + static public function getCalendarGroupForTicket($ticketId) + { + foreach (self::getCalendarDefinitions() as $groupKey => $group) { + if (in_array($ticketId, $group['ticket_ids'], true)) { + return $groupKey; + } + } + + return null; + } + + static public function getEnabledDatesByGroup($groupKey) + { + global $mdb; + + self::ensureCalendarTable(); + $definitions = self::getCalendarDefinitions(); + + if (!isset($definitions[$groupKey])) { + return []; + } + + $statement = $mdb->pdo->prepare( + "SELECT available_date + FROM ticket_calendar_availability + WHERE ticket_group = :ticket_group + ORDER BY available_date ASC" + ); + $statement->execute([':ticket_group' => $groupKey]); + + $rows = $statement->fetchAll(\PDO::FETCH_ASSOC); + if (!is_array($rows)) { + return []; + } + + return array_values(array_filter(array_map(static function ($row) { + return $row['available_date'] ?? null; + }, $rows))); + } + + static public function saveEnabledDatesForGroup($groupKey, array $dates) + { + global $mdb; + + self::ensureCalendarTable(); + $definitions = self::getCalendarDefinitions(); + + if (!isset($definitions[$groupKey])) { + return false; + } + + $normalizedDates = []; + foreach ($dates as $date) { + $normalizedDate = self::normalizeDateFromPicker($date); + if (!$normalizedDate) { + continue; + } + $normalizedDates[$normalizedDate] = $normalizedDate; + } + + $normalizedDates = array_values($normalizedDates); + + $mdb->pdo->beginTransaction(); + try { + $deleteStatement = $mdb->pdo->prepare( + "DELETE FROM ticket_calendar_availability WHERE ticket_group = :ticket_group" + ); + $deleteStatement->execute([':ticket_group' => $groupKey]); + + if (!empty($normalizedDates)) { + $insertStatement = $mdb->pdo->prepare( + "INSERT INTO ticket_calendar_availability (ticket_group, available_date) + VALUES (:ticket_group, :available_date)" + ); + + foreach ($normalizedDates as $date) { + $insertStatement->execute([ + ':ticket_group' => $groupKey, + ':available_date' => $date, + ]); + } + } + + $mdb->pdo->commit(); + } catch (\Exception $exception) { + $mdb->pdo->rollBack(); + return false; + } + + self::$allowedDateCache = []; + return true; + } + + static public function canBuyTicketOnDate($ticketId, $date) + { + $groupKey = self::getCalendarGroupForTicket($ticketId); + if (!$groupKey) { + return true; + } + + $normalizedDate = self::normalizeDateFromPicker($date); + if (!$normalizedDate) { + return false; + } + + $cacheKey = $groupKey . '|' . $normalizedDate; + if (array_key_exists($cacheKey, self::$allowedDateCache)) { + return self::$allowedDateCache[$cacheKey]; + } + + $enabledDates = self::getEnabledDatesByGroup($groupKey); + $isAllowed = in_array($normalizedDate, $enabledDates, true); + self::$allowedDateCache[$cacheKey] = $isAllowed; + + return $isAllowed; + } + + static public function getTicketAvailabilityForDate(array $ticketIds, $date) + { + $availability = []; + foreach ($ticketIds as $ticketId) { + $availability[$ticketId] = self::canBuyTicketOnDate($ticketId, $date); + } + + return $availability; + } static public function recalculate_ticket_protection( $basket ) { global $settings; @@ -110,4 +307,4 @@ class Tickets { return false; } -} \ No newline at end of file +} diff --git a/layout/.DS_Store b/layout/.DS_Store deleted file mode 100644 index 77e8dc88583fabce45856a23c24d9383cf3c4721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z-NTlTd^l6nYGJEm%uIikA@U3mDOZN=-)cPn9Ue7p&@cq8U)Rau9gl)4k@hN%b} zCi;se{Pr$O*n$OY&g$R)5iZjtFNVWU-fDLax`tsHJ>$`T78}0^igoSFJ~_R(p1q`tOuQ)~IdCrJP-6w}pww!5^;cOcvN_nRoGO-(7$63S0b*eP z7|>^d+1tO;sbXS)82Et!+#eihh_1#`q1-y4!|OBpJBTQt<68pJ(dcR{6@mwZt5iUh z%Jmb2t8}nCI?mNtDpcu=%avgsy>j(<;c|7bJ2IScS0VMp05MQ!psj{Bp8r?y%QQan z>nSuM28e-w#sKe3{iz2<>9h4)d3e@3(4L^7U|fj`2tr:first-child{display:none}#basket_page .box_01 table thead{display:none}#basket_page .box_01 table tr{margin-bottom:15px;border:1px solid #ddd;padding:10px;border-radius:10px;background:#fff}#basket_page .box_01 table td{position:relative;padding-left:50%;text-align:right;border:none;min-height:38px;padding-left:140px !important}#basket_page .box_01 table td:not(:last-child){border-bottom:1px solid #eee}#basket_page .box_01 table td::before{content:attr(data-label);position:absolute;left:10px;top:50%;font-weight:bold;color:#555;transform:translateY(-50%)}}@media(max-width: 767px)and (max-width: 575px){#basket_page .box_01 table td::before{font-size:12px}}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper{background:#fff;padding:30px}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper h2{font-size:1.5rem;margin-bottom:20px}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-vat-box{display:none}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-group .col-form-label{font-weight:600}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-group .col-form-label .form-vat-option{opacity:0;transition:400ms ease}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-group .form-check a{color:#72b81b;text-decoration:none}#basket_page .box_02 .basket_summary .basket_summary__wrapper{text-align:center;background:#fff;padding:30px;height:100%}#basket_page .box_02 .basket_summary .basket_summary__wrapper h2{font-size:1.5rem}#basket_page .box_02 .basket_summary .basket_summary__wrapper p{font-size:1.5rem;font-weight:800}#basket_page .box_02 .basket_summary .basket_summary__wrapper .buy-btn{display:inline-block;border:none;background-color:rgba(0,0,0,0);color:#333;padding:10px 30px;border-radius:10px;font-weight:800;background-color:rgb(211.327014218,242.8436018957,172.1563981043);text-decoration:none}.spinner_container{display:flex;align-items:center;justify-content:center;padding:150px 0}.lds-roller{display:inline-block;position:relative;width:80px;height:80px}.lds-roller div{animation:lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;transform-origin:40px 40px}.lds-roller div:after{content:" ";display:block;position:absolute;width:7px;height:7px;border-radius:50%;background:#72b81b;margin:-4px 0 0 -4px}.lds-roller div:nth-child(1){animation-delay:-0.036s}.lds-roller div:nth-child(1):after{top:63px;left:63px}.lds-roller div:nth-child(2){animation-delay:-0.072s}.lds-roller div:nth-child(2):after{top:68px;left:56px}.lds-roller div:nth-child(3){animation-delay:-0.108s}.lds-roller div:nth-child(3):after{top:71px;left:48px}.lds-roller div:nth-child(4){animation-delay:-0.144s}.lds-roller div:nth-child(4):after{top:72px;left:40px}.lds-roller div:nth-child(5){animation-delay:-0.18s}.lds-roller div:nth-child(5):after{top:71px;left:32px}.lds-roller div:nth-child(6){animation-delay:-0.216s}.lds-roller div:nth-child(6):after{top:68px;left:24px}.lds-roller div:nth-child(7){animation-delay:-0.252s}.lds-roller div:nth-child(7):after{top:63px;left:17px}.lds-roller div:nth-child(8){animation-delay:-0.288s}.lds-roller div:nth-child(8):after{top:56px;left:12px}@keyframes lds-roller{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}#scanner{width:100%;max-width:500px;margin-left:auto;margin-right:auto}@media(min-width: 768px){#scanner{margin-top:50px}}.alogin-page .panel-login{padding-top:100px;padding-bottom:100px;display:flex;align-items:center;justify-content:center}.alogin-page .panel-login form{display:flex;flex-direction:column;gap:10px}#tickets-orders{padding-top:100px;padding-bottom:100px}#tickets-orders h1{margin-bottom:20px}#tickets-orders table{margin-bottom:10px;background:#fff;border-bottom:none}#tickets-orders table thead tr{border-bottom:1px solid rgba(0,0,0,.1)}#tickets-orders table thead tr th{padding:15px 10px;font-size:16px;font-weight:600;border-bottom:none}#tickets-orders table tbody tr td{font-size:14px}#tickets-orders table tbody tr td.edit-btn a{margin-left:20px}#tickets-orders table tbody tr td.edit-btn i{color:#333;font-size:20px;transition:color 200ms ease}#tickets-orders table tbody tr td.edit-btn i:hover{color:#72b81b}#tickets-orders table tr{border-bottom:1px solid rgba(0,0,0,.1)}#tickets-orders table tr td{padding:15px 10px;border-bottom:none}#tickets-orders #myTable_wrapper .row:nth-child(1){margin-bottom:10px}#tickets-orders #myTable_wrapper #myTable_length label{display:flex;flex-direction:row;align-items:center;gap:15px}#tickets-orders #myTable_wrapper #myTable_length label select{min-width:70px;background-color:#fff}#tickets-orders #myTable_wrapper #myTable_filter label{display:flex;flex-direction:row;align-items:center;gap:15px}#tickets-orders #myTable_wrapper #myTable_filter label input{margin-left:0;background:#fff}#tickets-orders #myTable_wrapper #myTable_paginate .pagination{display:flex;align-items:center;-moz-column-gap:5px;column-gap:5px;margin-bottom:0}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button{padding:0;border:none}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button.active a{color:#fff;background:#72b81b}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button:hover{border:none;background:none}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button.disabled>.page-link{color:#95a5a6}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button .page-link{color:#000}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button a{border:none}#order-data{padding:100px 0}#order-data .order-data .mini-nav-menu{margin-bottom:30px}#order-data .order-data .mini-nav-menu a:hover{color:#333}#order-data .order-data .box_01{margin-bottom:24px}#order-data .order-data .box_01 table{width:100%;background:#fff}#order-data .order-data .box_01 table tr{text-align:center;border-top:1px solid rgba(0,0,0,.1)}#order-data .order-data .box_01 table tr th{padding:8px}#order-data .order-data .box_01 table tr th h3{font-size:1.25rem;font-weight:800}#order-data .order-data .box_01 table tr td{padding:8px}#order-data .order-data .box_01 table tr td .btn_t1{width:30px;height:30px;border-radius:50%;border:none;transition:150ms ease-in-out}#order-data .order-data .box_01 table tr td .btn_t1.add:hover{color:#72b81b;border-color:#72b81b}#order-data .order-data .box_01 table tr td .btn_t1.subtract:hover{color:#eb5024;border-color:#eb5024}#order-data .order-data .box_01 table tr td .btn_t1.delete{border:none}#order-data .order-data .box_01 table tr td .btn_t1.delete:hover{color:#e31e4b}#order-data .order-data .box_01 .btn-save-new-list{display:block;margin:30px auto 0}#order-data .order-data .box_02 .order-detale-info .order-detale-info__wrapper{background:#fff;padding:30px}#order-data .order-data .box_02 .order-detale-info .order-detale-info__wrapper h2{font-size:1.5rem;margin-bottom:20px}#order-data .order-data .box_02 .order-detale-info .order-detale-info__wrapper .form-group .col-form-label{font-weight:600}#order-data .order-data .box_02 .order-summary .order-summary__wrapper{text-align:center;background:#fff;padding:30px;height:100%}#order-data .order-data .box_02 .order-summary .order-summary__wrapper h2{font-size:1.5rem;margin-bottom:20px}#order-data .order-data .box_02 .order-summary .order-summary__wrapper p{font-size:1.5rem;font-weight:800}#regulamin_box{margin-top:80px;margin-bottom:50px}#regulamin_box .regulamin_box__wrapper h5{font-size:26px;margin:0;color:#333;text-align:center;margin-bottom:20px}#regulamin_box .regulamin_box__wrapper h6{font-size:22px;margin-bottom:10px;text-transform:uppercase;font-family:"Lato",sans-serif;font-weight:800;letter-spacing:.8px;color:#333;text-align:center}#regulamin_box .regulamin_box__wrapper .regulamin__box{margin-bottom:50px}#regulamin_box .regulamin_box__wrapper .regulamin__box h5{text-align:center}.sale-box h2{text-align:center;font-size:48px;line-height:43px}.sale-box h2 span{color:#74aa32;font-weight:700}#dateForm{display:flex;justify-content:center;gap:15px;flex-wrap:wrap}#dateForm ._title{width:100%;font-weight:600;font-size:30px;text-align:center}.basket_protection{display:grid;grid-template-columns:1fr;justify-content:flex-end;margin:10px auto;text-align:right}.basket_protection p{margin-bottom:0;font-style:italic}@keyframes cartBounce{0%,100%{transform:translateX(0)}25%{transform:translateX(-8px) scale(1.1)}50%{transform:translateX(4px) scale(1.05)}75%{transform:translateX(-2px)}}/*# sourceMappingURL=style.css.map */ \ No newline at end of file +@import"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,300;1,400;1,700&display=swap";*{margin:0;padding:0;box-sizing:border-box}body{color:#333;font-family:"Lato",sans-serif;background-color:#f3f0cf;display:flex;flex-direction:column;min-height:100vh}.btn-t1{border:none;background-color:rgba(0,0,0,0);color:#333;padding:10px 30px;border-radius:10px;font-weight:800;background-color:rgb(164.4360189573,229.7914691943,83.2085308057);text-decoration:none}.btn-t1:disabled{background-color:rgba(149,165,166,.5);cursor:not-allowed}.btn-t2{border:none;background-color:rgba(0,0,0,0);color:#fff;padding:10px 30px;border-radius:10px;font-weight:800;background-color:#333;text-decoration:none}.btn-t2:disabled{background-color:rgba(149,165,166,.5);cursor:not-allowed}.btn{padding:9px 30px}.flex-buttons-group{display:flex;justify-content:center;align-items:center;gap:5px}.c_green{color:#72b81b}.c_red{color:#e31e4b}.top{position:relative;background:#72b81b;color:#fff;height:70px}.top .a_menu .logo{position:absolute;margin:10px 0 !important}.top .a_menu #nav-menu.active{display:block;right:0;top:0;left:0;bottom:0;height:100vh;background:#fff;z-index:999}.top .a_menu #menu-hamburger{position:relative;height:70px;display:flex;align-items:center;justify-content:flex-end;z-index:9999}.top .a_menu #menu-hamburger i{font-size:28px}.top .a_menu #menu-hamburger.active #btn-hamburger{position:relative;height:30px;width:30px}.top .a_menu #menu-hamburger.active #btn-hamburger span{position:absolute;width:100%;height:2px;background:#333;border-radius:5px;top:50%;transform:translateY(-50%)}.top .a_menu #menu-hamburger.active #btn-hamburger span:nth-child(1){top:50%;transform:rotate(45deg) translateY(-50%)}.top .a_menu #menu-hamburger.active #btn-hamburger span:nth-child(2){transform:translateX(-100%) translateY(-50%)}.top .a_menu #menu-hamburger.active #btn-hamburger span:nth-child(3){top:50%;transform:rotate(-45deg) translateY(-50%)}.top .a_menu #menu-hamburger #btn-hamburger{position:relative;height:30px;width:30px;overflow:hidden}.top .a_menu #menu-hamburger #btn-hamburger span{position:absolute;width:100%;height:2px;background:#fff;border-radius:5px;top:50%;transform:translateY(-50%);transition:all 250ms ease}.top .a_menu #menu-hamburger #btn-hamburger span:nth-child(1){top:20%}.top .a_menu #menu-hamburger #btn-hamburger span:nth-child(3){top:80%}@media(min-width: 768px){.top .a_menu #menu-hamburger{display:none}}@media(max-width: 767px){.top .a_menu #nav-menu{position:fixed;display:none}.top .a_menu #nav-menu ul{width:100%;max-width:300px;padding:0 15px;margin:0 auto;flex-direction:column;justify-content:center}.top .a_menu #nav-menu ul li a{color:#333}}.top .logo{background:#72b81b;display:block;margin:0 auto 10px;width:150px;border-radius:0 0 50% 50%;padding:10px 25px 25px}.top .logo img{width:100%}@media(max-width: 600px){.top .logo{margin:10px 0}}.top nav{height:70px}.top nav ul{height:100%;display:flex;flex-direction:row;align-items:center;justify-content:flex-end;gap:25px;list-style:none;margin:0;padding:0}.top nav ul li a{color:#fff;font-size:18px;font-weight:600;text-decoration:none}.main{display:flex;flex-direction:column;flex-grow:1}.main .tickets_calendar{margin-top:100px;width:100%;margin-bottom:50px}.main .tickets{margin-bottom:50px;display:flex;flex-direction:column;width:100%;gap:80px}.main .tickets .ticket-container{display:flex;flex-direction:column;width:100%;gap:40px;align-items:center}.main .tickets .ticket-container .title-container{text-align:center;position:relative}.main .tickets .ticket-container .title-container::after{content:"";position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:100px;border-bottom:2px dotted #000}.main .tickets .ticket-container .title-container .title{font-weight:800;font-size:46px}@media(max-width: 991px){.main .tickets .ticket-container .title-container .title{font-size:36px;font-size:22px}}.main .tickets .ticket-container .title-container .description{font-size:28px}.main .tickets .ticket{display:flex;flex-direction:row;align-items:center}.main .tickets .ticket .ticket-description{display:flex;flex-direction:column;align-items:center;justify-content:center;width:500px;text-align:center;color:#fff;border-radius:10px;padding:20px 0}.main .tickets .ticket .ticket-description--yellow{background-color:#ffc937}.main .tickets .ticket .ticket-description--red{background-color:#e31e4b}.main .tickets .ticket .ticket-description--blue{background-color:#138fcb}.main .tickets .ticket .ticket-description--orange{background-color:#eb5024}.main .tickets .ticket .ticket-description--green{background-color:#72b81b}.main .tickets .ticket .ticket-description--violet{background-color:#8900be}.main .tickets .ticket .ticket-description .ticket__name{font-size:46px;font-weight:800}@media(max-width: 991px){.main .tickets .ticket .ticket-description .ticket__name{font-size:32px}}@media(max-width: 767px){.main .tickets .ticket .ticket-description .ticket__name{font-size:28px}}.main .tickets .ticket .ticket-description .description{font-size:13px;font-style:italic;line-height:.75;margin-bottom:0}.main .tickets .ticket .ticket-description .ticket-alert{font-size:20px;margin:20px 0 0 0;font-weight:800;text-transform:uppercase;text-decoration:underline}@media(max-width: 991px){.main .tickets .ticket .ticket-description .ticket-alert{font-size:16px}}@media(max-width: 991px){.main .tickets .ticket .ticket-description{padding-left:10px;padding-right:10px;width:400px}}@media(max-width: 575px){.main .tickets .ticket .ticket-description{width:100%}}.main .tickets .ticket .price{font-size:46px;margin-left:40px;font-weight:800;min-width:138px}@media(max-width: 991px){.main .tickets .ticket .price{font-size:36px;min-width:130px}}@media(max-width: 767px){.main .tickets .ticket .price{margin-left:0;min-width:unset;margin-bottom:0}}.main .tickets .ticket .ticket-quantity{margin-left:auto}@media(max-width: 767px){.main .tickets .ticket .ticket-quantity{margin-left:0}}.main .tickets .ticket .ticket-quantity .button{padding:10px 20px;border-radius:8px;border:none;background-color:#72b81b;color:#fff;font-size:14px;font-weight:700;cursor:pointer;transition:all .3s ease;white-space:nowrap}.main .tickets .ticket .ticket-quantity .button:hover{background-color:rgb(91.9563981043,148.4208530806,21.7791469194)}.main .tickets .ticket .ticket-quantity .button.added{background-color:rgb(80.9345971564,130.6312796209,19.1687203791);transform:scale(1.05)}@media(max-width: 767px){.main .tickets .ticket{flex-direction:column;row-gap:15px}}@media(max-width: 575px){.main .tickets .ticket{width:100%}}.main .bottom-info__description{text-align:center;font-size:16px;line-height:29px;padding:20px 0;position:relative}.main .bottom-info__description::after,.main .bottom-info__description::before{position:absolute;content:"";border-bottom:2px dotted #333;left:50%;transform:translateX(-50%);width:10%}.main .bottom-info__description::after{top:0}.main .bottom-info__description::before{bottom:0}.main .bottom-info__description p:nth-child(2){margin-bottom:0}.main .bottom-info__background{margin-top:40px;background-image:url("https://brzezovka.pl/css/../img/bgcity.png");background-position:bottom center;background-repeat:repeat-x;width:100%;height:300px}.footer{background-color:#34327c;display:flex;flex-direction:column;width:100%;color:#fff}.footer a{text-decoration:none;color:#eb5024}.footer .footer__top{display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-rows:1fr;justify-items:center;align-items:center}.footer .footer__top .location{padding:20px 0;text-align:center}.footer .footer__top .location .title{font-size:22px;font-weight:800}.footer .footer__top .logo{height:100px}.footer .footer__top .logo img{width:100%;height:100%}.footer .footer__bottom{width:100%}.footer .footer__bottom p{text-align:center;margin:0;padding:30px 0}@media(max-width: 767px){.footer .footer__top{padding-top:30px;grid-template-columns:1fr}.footer .footer__top .opening-hours{grid-row-start:2}.footer .footer__top .logo{grid-row-start:1}.footer .footer__top .location{grid-row-start:3}}.shopping-cart-container--active .shopping-cart{opacity:1;transform:translateX(0)}.shopping-cart{opacity:0;position:fixed;top:80px;right:10px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:10px;background-color:#72b81b;color:#fff;gap:20px;width:230px;padding:20px 0;transition:opacity .2s;transform:translateX(100%)}.shopping-cart.hide{display:none}.shopping-cart .basket{font-size:30px}.shopping-cart .quantity{font-size:18px;font-weight:800}.shopping-cart .tickets__list{width:100%;list-style:none;padding:0 5px;background-color:#fff;color:#333;border-right:1px solid #333;border-left:1px solid #333;max-height:calc(90svh - 400px);overflow:auto}.shopping-cart .tickets__list p{margin-bottom:0}.shopping-cart .tickets__list .ticket{border:1px solid #333;border-radius:5px;margin:5px 0;padding:5px 0 5px 5px;display:grid;grid-template-columns:1fr 20px;grid-template-rows:1fr 1fr;grid-template-areas:"name btn" "price btn";font-size:12px;align-items:center}.shopping-cart .tickets__list .ticket__description{grid-area:name;font-weight:800;font-size:13px}.shopping-cart .tickets__list .ticket__price{grid-area:price;font-weight:800;font-size:13px}.shopping-cart .tickets__list .ticket__price span{font-weight:400}.shopping-cart .tickets__list .ticket .ticket__button{grid-area:btn;border:none;background-color:rgba(0,0,0,0);color:#333;font-size:14px;font-weight:800}.shopping-cart .sum-section{text-align:center}.shopping-cart .sum-section p{margin-bottom:0}.shopping-cart .sum-section{font-weight:800;font-size:18px}.shopping-cart .off-btn{border:none;background-color:rgba(0,0,0,0);color:#fff;font-size:18px;font-weight:800;position:absolute;top:5px;right:15px}.shopping-cart .buy-btn{border:none;background-color:rgba(0,0,0,0);color:#333;padding:10px 30px;border-radius:10px;font-weight:800;background-color:rgb(164.4360189573,229.7914691943,83.2085308057);text-decoration:none}.mobile-cart-btn.cart-bounce{animation:cartBounce .5s ease}.mobile-cart-btn{position:fixed;bottom:50px;right:0;opacity:1;z-index:10;border-top-left-radius:10px;border-bottom-left-radius:10px;background-color:#72b81b;padding:20px 15px 15px 15px;transition:all 250ms ease-in-out;cursor:pointer}.mobile-cart-btn.hide{transform:translateX(100%)}.mobile-cart-btn span{position:absolute;top:8px;right:5px;display:flex;align-items:center;justify-content:center;padding:5px;background:#fff;border-radius:100%;width:20px;height:20px;line-height:1;font-size:12px}.mobile-cart-btn .mobile-cart-btn--img img{width:100%;max-width:40px}#basket_page .basket_content{margin-top:100px;margin-bottom:100px}#basket_page .box_01{margin-bottom:24px}#basket_page .box_01 table{width:100%;background:#fff;border-collapse:collapse}#basket_page .box_01 table tr{text-align:center;border-top:1px solid rgba(0,0,0,.1)}#basket_page .box_01 table tr th{padding:8px}#basket_page .box_01 table tr th h3{font-size:1.25rem;font-weight:800}@media(max-width: 991px){#basket_page .box_01 table tr th h3{font-size:.85rem}}#basket_page .box_01 table tr td{padding:8px}@media(max-width: 991px){#basket_page .box_01 table tr td{font-size:14px}}#basket_page .box_01 table tr td .ticket-date{color:#888;font-size:12px}#basket_page .box_01 table tr td .btn_t1{width:30px;height:30px;border-radius:50%;border:none;transition:150ms ease-in-out;background:#f0f0f0;display:inline-block;color:#000}#basket_page .box_01 table tr td .btn_t1 i{color:#000}#basket_page .box_01 table tr td .btn_t1.add:hover{color:#72b81b;border-color:#72b81b}#basket_page .box_01 table tr td .btn_t1.subtract:hover{color:#eb5024;border-color:#eb5024}#basket_page .box_01 table tr td .btn_t1.delete{border:none}#basket_page .box_01 table tr td .btn_t1.delete:hover{color:#e31e4b}@media(max-width: 767px){#basket_page .box_01 table{background:rgba(0,0,0,0)}#basket_page .box_01 table thead,#basket_page .box_01 table tbody,#basket_page .box_01 table th,#basket_page .box_01 table td,#basket_page .box_01 table tr{display:block}#basket_page .box_01 table tbody>tr:first-child{display:none}#basket_page .box_01 table thead{display:none}#basket_page .box_01 table tr{margin-bottom:15px;border:1px solid #ddd;padding:10px;border-radius:10px;background:#fff}#basket_page .box_01 table td{position:relative;padding-left:50%;text-align:right;border:none;min-height:38px;padding-left:140px !important}#basket_page .box_01 table td:not(:last-child){border-bottom:1px solid #eee}#basket_page .box_01 table td::before{content:attr(data-label);position:absolute;left:10px;top:50%;font-weight:bold;color:#555;transform:translateY(-50%)}}@media(max-width: 767px)and (max-width: 575px){#basket_page .box_01 table td::before{font-size:12px}}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper{background:#fff;padding:30px}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper h2{font-size:1.5rem;margin-bottom:20px}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-vat-box{display:none}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-group .col-form-label{font-weight:600}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-group .col-form-label .form-vat-option{opacity:0;transition:400ms ease}#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-group .form-check a{color:#72b81b;text-decoration:none}#basket_page .box_02 .basket_summary .basket_summary__wrapper{text-align:center;background:#fff;padding:30px;height:100%}#basket_page .box_02 .basket_summary .basket_summary__wrapper h2{font-size:1.5rem}#basket_page .box_02 .basket_summary .basket_summary__wrapper p{font-size:1.5rem;font-weight:800}#basket_page .box_02 .basket_summary .basket_summary__wrapper .buy-btn{display:inline-block;border:none;background-color:rgba(0,0,0,0);color:#333;padding:10px 30px;border-radius:10px;font-weight:800;background-color:rgb(211.327014218,242.8436018957,172.1563981043);text-decoration:none}.spinner_container{display:flex;align-items:center;justify-content:center;padding:150px 0}.lds-roller{display:inline-block;position:relative;width:80px;height:80px}.lds-roller div{animation:lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;transform-origin:40px 40px}.lds-roller div:after{content:" ";display:block;position:absolute;width:7px;height:7px;border-radius:50%;background:#72b81b;margin:-4px 0 0 -4px}.lds-roller div:nth-child(1){animation-delay:-0.036s}.lds-roller div:nth-child(1):after{top:63px;left:63px}.lds-roller div:nth-child(2){animation-delay:-0.072s}.lds-roller div:nth-child(2):after{top:68px;left:56px}.lds-roller div:nth-child(3){animation-delay:-0.108s}.lds-roller div:nth-child(3):after{top:71px;left:48px}.lds-roller div:nth-child(4){animation-delay:-0.144s}.lds-roller div:nth-child(4):after{top:72px;left:40px}.lds-roller div:nth-child(5){animation-delay:-0.18s}.lds-roller div:nth-child(5):after{top:71px;left:32px}.lds-roller div:nth-child(6){animation-delay:-0.216s}.lds-roller div:nth-child(6):after{top:68px;left:24px}.lds-roller div:nth-child(7){animation-delay:-0.252s}.lds-roller div:nth-child(7):after{top:63px;left:17px}.lds-roller div:nth-child(8){animation-delay:-0.288s}.lds-roller div:nth-child(8):after{top:56px;left:12px}@keyframes lds-roller{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}#scanner{width:100%;max-width:500px;margin-left:auto;margin-right:auto}@media(min-width: 768px){#scanner{margin-top:50px}}.alogin-page .panel-login{padding-top:100px;padding-bottom:100px;display:flex;align-items:center;justify-content:center}.alogin-page .panel-login form{display:flex;flex-direction:column;gap:10px}#tickets-orders{padding-top:100px;padding-bottom:100px}#tickets-orders h1{margin-bottom:20px}#tickets-orders table{margin-bottom:10px;background:#fff;border-bottom:none}#tickets-orders table thead tr{border-bottom:1px solid rgba(0,0,0,.1)}#tickets-orders table thead tr th{padding:15px 10px;font-size:16px;font-weight:600;border-bottom:none}#tickets-orders table tbody tr td{font-size:14px}#tickets-orders table tbody tr td.edit-btn a{margin-left:20px}#tickets-orders table tbody tr td.edit-btn i{color:#333;font-size:20px;transition:color 200ms ease}#tickets-orders table tbody tr td.edit-btn i:hover{color:#72b81b}#tickets-orders table tr{border-bottom:1px solid rgba(0,0,0,.1)}#tickets-orders table tr td{padding:15px 10px;border-bottom:none}#tickets-orders #myTable_wrapper .row:nth-child(1){margin-bottom:10px}#tickets-orders #myTable_wrapper #myTable_length label{display:flex;flex-direction:row;align-items:center;gap:15px}#tickets-orders #myTable_wrapper #myTable_length label select{min-width:70px;background-color:#fff}#tickets-orders #myTable_wrapper #myTable_filter label{display:flex;flex-direction:row;align-items:center;gap:15px}#tickets-orders #myTable_wrapper #myTable_filter label input{margin-left:0;background:#fff}#tickets-orders #myTable_wrapper #myTable_paginate .pagination{display:flex;align-items:center;-moz-column-gap:5px;column-gap:5px;margin-bottom:0}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button{padding:0;border:none}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button.active a{color:#fff;background:#72b81b}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button:hover{border:none;background:none}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button.disabled>.page-link{color:#95a5a6}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button .page-link{color:#000}#tickets-orders #myTable_wrapper #myTable_paginate .pagination .paginate_button a{border:none}#order-data{padding:100px 0}#order-data .order-data .mini-nav-menu{margin-bottom:30px}#order-data .order-data .mini-nav-menu a:hover{color:#333}#order-data .order-data .box_01{margin-bottom:24px}#order-data .order-data .box_01 table{width:100%;background:#fff}#order-data .order-data .box_01 table tr{text-align:center;border-top:1px solid rgba(0,0,0,.1)}#order-data .order-data .box_01 table tr th{padding:8px}#order-data .order-data .box_01 table tr th h3{font-size:1.25rem;font-weight:800}#order-data .order-data .box_01 table tr td{padding:8px}#order-data .order-data .box_01 table tr td .btn_t1{width:30px;height:30px;border-radius:50%;border:none;transition:150ms ease-in-out}#order-data .order-data .box_01 table tr td .btn_t1.add:hover{color:#72b81b;border-color:#72b81b}#order-data .order-data .box_01 table tr td .btn_t1.subtract:hover{color:#eb5024;border-color:#eb5024}#order-data .order-data .box_01 table tr td .btn_t1.delete{border:none}#order-data .order-data .box_01 table tr td .btn_t1.delete:hover{color:#e31e4b}#order-data .order-data .box_01 .btn-save-new-list{display:block;margin:30px auto 0}#order-data .order-data .box_02 .order-detale-info .order-detale-info__wrapper{background:#fff;padding:30px}#order-data .order-data .box_02 .order-detale-info .order-detale-info__wrapper h2{font-size:1.5rem;margin-bottom:20px}#order-data .order-data .box_02 .order-detale-info .order-detale-info__wrapper .form-group .col-form-label{font-weight:600}#order-data .order-data .box_02 .order-summary .order-summary__wrapper{text-align:center;background:#fff;padding:30px;height:100%}#order-data .order-data .box_02 .order-summary .order-summary__wrapper h2{font-size:1.5rem;margin-bottom:20px}#order-data .order-data .box_02 .order-summary .order-summary__wrapper p{font-size:1.5rem;font-weight:800}#regulamin_box{margin-top:80px;margin-bottom:50px}#regulamin_box .regulamin_box__wrapper h5{font-size:26px;margin:0;color:#333;text-align:center;margin-bottom:20px}#regulamin_box .regulamin_box__wrapper h6{font-size:22px;margin-bottom:10px;text-transform:uppercase;font-family:"Lato",sans-serif;font-weight:800;letter-spacing:.8px;color:#333;text-align:center}#regulamin_box .regulamin_box__wrapper .regulamin__box{margin-bottom:50px}#regulamin_box .regulamin_box__wrapper .regulamin__box h5{text-align:center}.sale-box h2{text-align:center;font-size:48px;line-height:43px}.sale-box h2 span{color:#74aa32;font-weight:700}#dateForm{display:flex;justify-content:center;gap:15px;flex-wrap:wrap}#dateForm ._title{width:100%;font-weight:600;font-size:30px;text-align:center}.basket_protection{display:grid;grid-template-columns:1fr;justify-content:flex-end;margin:10px auto;text-align:right}.basket_protection p{margin-bottom:0;font-style:italic}@keyframes cartBounce{0%,100%{transform:translateX(0)}25%{transform:translateX(-8px) scale(1.1)}50%{transform:translateX(4px) scale(1.05)}75%{transform:translateX(-2px)}}/*# sourceMappingURL=style.css.map */ +/* Tickets main view redesign */ +#tickets-main-view .tickets_calendar{margin-top:48px;margin-bottom:30px} +#tickets-main-view #dateForm{max-width:1040px;margin:0 auto;background:linear-gradient(160deg,#fff 0%,#f6faef 100%);border:1px solid rgba(114,184,27,.2);border-radius:20px;padding:26px 24px;box-shadow:0 12px 28px rgba(36,58,11,.08)} +#tickets-main-view #dateForm ._title{width:100%;text-align:left;font-size:30px;line-height:1.15;font-weight:900;letter-spacing:.2px;margin-bottom:10px} +#tickets-main-view .flatpickr-calendar.inline{width:100%;max-width:420px;margin:0 auto;border-radius:16px;box-shadow:0 8px 22px rgba(51,51,51,.08);border:1px solid #e8eed6} +#tickets-main-view .tickets{width:min(1120px,calc(100% - 30px));margin:0 auto 60px;gap:42px} +#tickets-main-view .tickets .ticket-container{gap:18px;align-items:stretch;background:rgba(255,255,255,.72);border:1px solid rgba(51,51,51,.08);border-radius:20px;padding:26px 22px 18px;box-shadow:0 8px 26px rgba(21,39,5,.05);backdrop-filter:blur(2px)} +#tickets-main-view .tickets .ticket-container .title-container{padding-bottom:14px;margin-bottom:6px} +#tickets-main-view .tickets .ticket-container .title-container::after{width:140px;border-bottom:2px dashed rgba(51,51,51,.35)} +#tickets-main-view .tickets .ticket-container .title-container .title{font-size:clamp(30px,4vw,44px)} +#tickets-main-view .tickets .ticket-container .title-container .description{font-size:clamp(14px,2.5vw,20px);line-height:1.3;margin-bottom:0;color:#4f5d48} +#tickets-main-view .tickets .ticket{width:100%;display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:16px 20px;align-items:center;padding:10px;border-radius:16px;background:#fff;border:1px solid #edf1e5} +#tickets-main-view .tickets .ticket .ticket-description{width:100%;min-height:86px;padding:16px 14px;border-radius:12px} +#tickets-main-view .tickets .ticket .ticket-description .ticket__name{font-size:clamp(22px,3.2vw,31px);line-height:1.05} +#tickets-main-view .tickets .ticket .ticket-description .description{margin-top:4px;font-size:12px;line-height:1.2} +#tickets-main-view .tickets .ticket .ticket-description .ticket-alert{font-size:13px;margin-top:10px;text-decoration:none} +#tickets-main-view .tickets .ticket .price{margin-left:0;min-width:105px;text-align:right;font-size:clamp(31px,3.5vw,40px);line-height:1} +#tickets-main-view .tickets .ticket .ticket-quantity{margin-left:0} +#tickets-main-view .tickets .ticket .ticket-quantity .button{border-radius:999px;padding:11px 16px;min-width:170px;font-size:13px;text-transform:uppercase;letter-spacing:.35px;box-shadow:0 6px 14px rgba(114,184,27,.22)} +#tickets-main-view .tickets .ticket .ticket-quantity .button:disabled{background:#d6dccd;color:#5d6658;box-shadow:none} +#tickets-main-view .bottom-info__description{max-width:1120px;margin:0 auto;font-size:14px;line-height:1.8} +@media(max-width: 991px){ +#tickets-main-view #dateForm ._title{text-align:center;font-size:24px} +#tickets-main-view .tickets .ticket{grid-template-columns:1fr auto;grid-template-areas:"desc desc" "price button";gap:12px} +#tickets-main-view .tickets .ticket .ticket-description{grid-area:desc} +#tickets-main-view .tickets .ticket .price{grid-area:price;text-align:left;min-width:unset} +#tickets-main-view .tickets .ticket .ticket-quantity{grid-area:button;justify-self:end}} +@media(max-width: 767px){ +#tickets-main-view .tickets_calendar{margin-top:32px} +#tickets-main-view #dateForm{border-radius:16px;padding:18px 14px} +#tickets-main-view .tickets{width:calc(100% - 20px);gap:22px} +#tickets-main-view .tickets .ticket-container{border-radius:14px;padding:16px 10px 10px} +#tickets-main-view .tickets .ticket{padding:8px;border-radius:12px} +#tickets-main-view .tickets .ticket .ticket-description{min-height:76px;padding:12px 10px} +#tickets-main-view .tickets .ticket .ticket-quantity .button{min-width:132px;padding:10px 12px;font-size:12px}} +/* Tickets cards v2 - more compact, bolder look */ +#tickets-main-view .tickets{gap:28px} +#tickets-main-view .tickets .ticket-container{padding:18px 16px 12px;gap:12px;border-radius:18px} +#tickets-main-view .tickets .ticket{gap:12px 14px;padding:8px;border-radius:14px;border:1px solid #e7eddc;box-shadow:0 6px 16px rgba(25,33,19,.06);position:relative;overflow:hidden} +#tickets-main-view .tickets .ticket::after{content:"";position:absolute;inset:auto 0 0 0;height:2px;background:linear-gradient(90deg,rgba(114,184,27,.6),rgba(19,143,203,.2))} +#tickets-main-view .tickets .ticket .ticket-description{min-height:64px;padding:10px 10px;border-radius:10px} +#tickets-main-view .tickets .ticket .ticket-description .ticket__name{font-size:clamp(17px,2.2vw,23px);line-height:1.08;letter-spacing:.1px} +#tickets-main-view .tickets .ticket .ticket-description .description{font-size:11px;margin-top:2px} +#tickets-main-view .tickets .ticket .ticket-description .ticket-alert{margin-top:6px;font-size:11px;opacity:.95} +#tickets-main-view .tickets .ticket .price{font-size:clamp(22px,2.5vw,30px);font-weight:900;min-width:88px;text-align:center;padding:8px 10px;border-radius:999px;background:#f5f9ed;border:1px solid #dfeac9;color:#2f3a24} +#tickets-main-view .tickets .ticket .ticket-quantity .button{min-width:146px;padding:9px 12px;font-size:11px;letter-spacing:.5px;font-weight:800} +@media(max-width: 991px){ +#tickets-main-view .tickets .ticket{grid-template-columns:1fr auto auto;grid-template-areas:"desc price button";align-items:center} +#tickets-main-view .tickets .ticket .ticket-description{grid-area:desc} +#tickets-main-view .tickets .ticket .price{grid-area:price;text-align:center;min-width:82px;padding:7px 8px} +#tickets-main-view .tickets .ticket .ticket-quantity{grid-area:button;justify-self:end}} +@media(max-width: 767px){ +#tickets-main-view .tickets .ticket{grid-template-columns:1fr;grid-template-areas:"desc" "price" "button";justify-items:stretch} +#tickets-main-view .tickets .ticket .price{justify-self:start;font-size:24px;min-width:0} +#tickets-main-view .tickets .ticket .ticket-quantity{justify-self:stretch} +#tickets-main-view .tickets .ticket .ticket-quantity .button{width:100%;min-width:0}} +/* Tickets main view refinements */ +#tickets-main-view #dateForm{max-width:none;width:min(1120px,calc(100% - 30px))} +#tickets-main-view .tickets .ticket .price{background:transparent;border:0;border-radius:0;box-shadow:none;padding:0;min-width:78px;color:#2b3721} +#tickets-main-view .shopping-cart{width:320px;right:18px;top:84px;border-radius:16px;padding:12px;gap:10px;color:#24311c;background:rgba(255,255,255,.98);border:1px solid #dfe9cf;box-shadow:0 18px 34px rgba(28,43,14,.22);transform:translateX(120%)} +#tickets-main-view .shopping-cart .basket{font-size:22px;color:#72b81b} +#tickets-main-view .shopping-cart .quantity{width:100%;text-align:center;font-size:20px;font-weight:900;line-height:1.1} +#tickets-main-view .shopping-cart .tickets__list{width:100%;padding:0;border:0;max-height:44svh;background:transparent} +#tickets-main-view .shopping-cart .tickets__list .ticket{margin:0 0 8px;border:1px solid #dde6ce;border-radius:10px;padding:8px;font-size:13px;background:#f9fcf4;grid-template-columns:1fr 18px} +#tickets-main-view .shopping-cart .tickets__list .ticket__description{font-size:14px;line-height:1.2} +#tickets-main-view .shopping-cart .tickets__list .ticket__price{font-size:12px;color:#566149} +#tickets-main-view .shopping-cart .tickets__list .ticket .ticket__button{color:#b53b30} +#tickets-main-view .shopping-cart .sum-section{width:100%;border-radius:10px;padding:8px 10px;background:#f3f8e7;border:1px solid #dce8c5;font-size:20px;line-height:1.1} +#tickets-main-view .shopping-cart .buy-btn{width:100%;text-align:center;border-radius:10px;padding:11px 14px;background:#72b81b;color:#fff;font-size:16px;font-weight:800} +#tickets-main-view .shopping-cart .off-btn{top:8px;right:10px;color:#72815f;font-size:16px} +@media(max-width: 767px){ +#tickets-main-view #dateForm{width:calc(100% - 20px)} +#tickets-main-view .tickets .ticket .price{min-width:0} +#tickets-main-view .shopping-cart{width:calc(100vw - 20px);right:10px;top:74px;max-height:calc(100svh - 90px);overflow:hidden}} +/* Tickets main view final fixes */ +#tickets-main-view{--tickets-main-width:min(1120px,calc(100% - 30px))} +#tickets-main-view .tickets_calendar{width:var(--tickets-main-width);margin-left:auto;margin-right:auto} +#tickets-main-view #dateForm{width:100%;max-width:none} +#tickets-main-view .tickets{width:var(--tickets-main-width)} +#tickets-main-view .shopping-cart-container--active .shopping-cart{opacity:1;transform:translateX(0)} +#tickets-main-view .shopping-cart{opacity:0;transform:translateX(120%)} +@media(max-width: 767px){ +#tickets-main-view{--tickets-main-width:calc(100% - 20px)}} +/* Basket view redesign */ +#basket_page .basket_content{width:min(1120px,calc(100% - 30px));margin:42px auto 70px} +#basket_page .box_01 table{border-radius:16px;overflow:hidden;border:1px solid #dfe8cd;box-shadow:0 10px 26px rgba(30,43,18,.08)} +#basket_page .box_01 table tr th{background:#f4f9ea;border-top:0} +#basket_page .box_01 table tr th h3{font-size:1rem;letter-spacing:.3px} +#basket_page .box_01 table tr td{font-size:15px;background:#fff} +#basket_page .box_01 table tr td .ticket-date{display:inline-block;margin-top:4px;padding:3px 8px;border-radius:999px;background:#f2f7e8;color:#5a6650;font-size:11px} +#basket_page .box_01 table tr td .btn_t1{background:#f6faef;border:1px solid #dce8c5} +#basket_page .box_01 .basket_protection{margin-top:12px;background:#f7fbe9;border:1px solid #dce8c5;border-radius:12px;padding:10px 12px} +#basket_page .box_01 .basket_protection .ticket_protection{color:#4f6f1f;font-weight:700;text-decoration:none} +#basket_page .box_01 .basket_protection .ticket_protection:hover{text-decoration:underline} +#basket_page .box_01 .basket_protection__text p{color:#5a6650;font-size:13px} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper{border-radius:16px;border:1px solid #dfe8cd;box-shadow:0 10px 26px rgba(30,43,18,.08);padding:24px} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper h2{font-weight:900;margin-bottom:16px} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-control{border-radius:10px;border-color:#d6dfc6;min-height:42px} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-control:focus{border-color:#72b81b;box-shadow:0 0 0 .2rem rgba(114,184,27,.2)} +#basket_page .box_02 .basket_summary .basket_summary__wrapper{border-radius:16px;border:1px solid #dfe8cd;box-shadow:0 10px 26px rgba(30,43,18,.08);background:linear-gradient(165deg,#fff 0%,#f5faea 100%);padding:28px 18px} +#basket_page .box_02 .basket_summary .basket_summary__wrapper h2{font-weight:800} +#basket_page .box_02 .basket_summary .basket_summary__wrapper p{font-size:2rem;line-height:1.1} +#basket_page .box_02 .basket_summary .basket_summary__wrapper .buy-btn{border-radius:999px;background:#72b81b;color:#fff;min-width:150px;padding:10px 16px} +#basket_page .box_02 .basket_summary .basket_summary__wrapper .buy-btn:hover{background:#5e9c15} +@media(max-width: 991px){ +#basket_page .basket_content{width:calc(100% - 20px);margin-top:26px} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper,#basket_page .box_02 .basket_summary .basket_summary__wrapper{padding:16px 12px;border-radius:12px}} +@media(max-width: 767px){ +#basket_page .basket_content{margin-top:14px;margin-bottom:26px;width:calc(100% - 14px)} +#basket_page .box_01{margin-bottom:10px} +#basket_page .box_01 table tr{margin-bottom:8px;padding:8px} +#basket_page .box_01 table td{min-height:34px;padding-top:6px !important;padding-bottom:6px !important;font-size:13px} +#basket_page .box_01 table tr td .btn_t1{width:26px;height:26px} +#basket_page .box_01 .basket_protection{margin-top:8px;padding:8px 10px;border-radius:10px} +#basket_page .box_01 .basket_protection .ticket_protection{font-size:13px} +#basket_page .box_01 .basket_protection__text p{font-size:12px;line-height:1.35} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper{padding:12px 10px;border-radius:10px} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper h2{font-size:1.15rem;margin-bottom:10px} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-group{margin-bottom:.35rem !important} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-control{min-height:36px;font-size:14px;padding-top:6px;padding-bottom:6px} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .col-form-label,#basket_page .box_02 .basket_user_data .basket_user_data__wrapper .form-check-label{font-size:14px;line-height:1.25} +#basket_page .box_02 .basket_user_data .basket_user_data__wrapper textarea.form-control{min-height:74px} +#basket_page .box_02 .basket_summary .basket_summary__wrapper{margin-top:10px;padding:14px 10px;border-radius:10px} +#basket_page .box_02 .basket_summary .basket_summary__wrapper h2{font-size:1.1rem;margin-bottom:6px} +#basket_page .box_02 .basket_summary .basket_summary__wrapper p{font-size:1.5rem;margin-bottom:10px} +#basket_page .box_02 .basket_summary .basket_summary__wrapper .buy-btn{width:100%;min-width:0;padding:9px 12px;font-size:14px}} diff --git a/layout/style-scss/style.scss b/layout/style-scss/style.scss index 6a125cd..293f15b 100644 --- a/layout/style-scss/style.scss +++ b/layout/style-scss/style.scss @@ -1453,4 +1453,729 @@ body { 75% { transform: translateX(-2px); } -} \ No newline at end of file +} + +/* Tickets main view redesign */ +#tickets-main-view { + .tickets_calendar { + margin-top: 48px; + margin-bottom: 30px; + } + + #dateForm { + max-width: 1040px; + margin: 0 auto; + background: linear-gradient(160deg, #ffffff 0%, #f6faef 100%); + border: 1px solid rgba(114, 184, 27, 0.2); + border-radius: 20px; + padding: 26px 24px; + box-shadow: 0 12px 28px rgba(36, 58, 11, 0.08); + } + + #dateForm ._title { + width: 100%; + text-align: left; + font-size: 30px; + line-height: 1.15; + font-weight: 900; + letter-spacing: 0.2px; + margin-bottom: 10px; + } + + .flatpickr-calendar.inline { + width: 100%; + max-width: 420px; + margin: 0 auto; + border-radius: 16px; + box-shadow: 0 8px 22px rgba(51, 51, 51, 0.08); + border: 1px solid #e8eed6; + } + + .tickets { + width: min(1120px, calc(100% - 30px)); + margin: 0 auto 60px; + gap: 42px; + } + + .tickets .ticket-container { + gap: 18px; + align-items: stretch; + background: rgba(255, 255, 255, 0.72); + border: 1px solid rgba(51, 51, 51, 0.08); + border-radius: 20px; + padding: 26px 22px 18px; + box-shadow: 0 8px 26px rgba(21, 39, 5, 0.05); + backdrop-filter: blur(2px); + } + + .tickets .ticket-container .title-container { + padding-bottom: 14px; + margin-bottom: 6px; + } + + .tickets .ticket-container .title-container::after { + width: 140px; + border-bottom: 2px dashed rgba(51, 51, 51, 0.35); + } + + .tickets .ticket-container .title-container .title { + font-size: clamp(30px, 4vw, 44px); + } + + .tickets .ticket-container .title-container .description { + font-size: clamp(14px, 2.5vw, 20px); + line-height: 1.3; + margin-bottom: 0; + color: #4f5d48; + } + + .tickets .ticket { + width: 100%; + display: grid; + grid-template-columns: minmax(0, 1fr) auto auto; + gap: 16px 20px; + align-items: center; + padding: 10px; + border-radius: 16px; + background: #ffffff; + border: 1px solid #edf1e5; + } + + .tickets .ticket .ticket-description { + width: 100%; + min-height: 86px; + padding: 16px 14px; + border-radius: 12px; + } + + .tickets .ticket .ticket-description .ticket__name { + font-size: clamp(22px, 3.2vw, 31px); + line-height: 1.05; + } + + .tickets .ticket .ticket-description .description { + margin-top: 4px; + font-size: 12px; + line-height: 1.2; + } + + .tickets .ticket .ticket-description .ticket-alert { + font-size: 13px; + margin-top: 10px; + text-decoration: none; + } + + .tickets .ticket .price { + margin-left: 0; + min-width: 105px; + text-align: right; + font-size: clamp(31px, 3.5vw, 40px); + line-height: 1; + } + + .tickets .ticket .ticket-quantity { + margin-left: 0; + } + + .tickets .ticket .ticket-quantity .button { + border-radius: 999px; + padding: 11px 16px; + min-width: 170px; + font-size: 13px; + text-transform: uppercase; + letter-spacing: 0.35px; + box-shadow: 0 6px 14px rgba(114, 184, 27, 0.22); + } + + .tickets .ticket .ticket-quantity .button:disabled { + background: #d6dccd; + color: #5d6658; + box-shadow: none; + } + + .bottom-info__description { + max-width: 1120px; + margin: 0 auto; + font-size: 14px; + line-height: 1.8; + } + + @include respond-below(md) { + #dateForm ._title { + text-align: center; + font-size: 24px; + } + + .tickets .ticket { + grid-template-columns: 1fr auto; + grid-template-areas: + "desc desc" + "price button"; + gap: 12px; + } + + .tickets .ticket .ticket-description { + grid-area: desc; + } + + .tickets .ticket .price { + grid-area: price; + text-align: left; + min-width: unset; + } + + .tickets .ticket .ticket-quantity { + grid-area: button; + justify-self: end; + } + } + + @include respond-below(sm) { + .tickets_calendar { + margin-top: 32px; + } + + #dateForm { + border-radius: 16px; + padding: 18px 14px; + } + + .tickets { + width: calc(100% - 20px); + gap: 22px; + } + + .tickets .ticket-container { + border-radius: 14px; + padding: 16px 10px 10px; + } + + .tickets .ticket { + padding: 8px; + border-radius: 12px; + } + + .tickets .ticket .ticket-description { + min-height: 76px; + padding: 12px 10px; + } + + .tickets .ticket .ticket-quantity .button { + min-width: 132px; + padding: 10px 12px; + font-size: 12px; + } + } +} + +/* Basket view redesign */ +#basket_page { + .basket_content { + width: min(1120px, calc(100% - 30px)); + margin: 42px auto 70px; + } + + .box_01 table { + border-radius: 16px; + overflow: hidden; + border: 1px solid #dfe8cd; + box-shadow: 0 10px 26px rgba(30, 43, 18, 0.08); + } + + .box_01 table tr th { + background: #f4f9ea; + border-top: 0; + } + + .box_01 table tr th h3 { + font-size: 1rem; + letter-spacing: 0.3px; + } + + .box_01 table tr td { + font-size: 15px; + background: #fff; + } + + .box_01 table tr td .ticket-date { + display: inline-block; + margin-top: 4px; + padding: 3px 8px; + border-radius: 999px; + background: #f2f7e8; + color: #5a6650; + font-size: 11px; + } + + .box_01 table tr td .btn_t1 { + background: #f6faef; + border: 1px solid #dce8c5; + } + + .box_01 .basket_protection { + margin-top: 12px; + background: #f7fbe9; + border: 1px solid #dce8c5; + border-radius: 12px; + padding: 10px 12px; + } + + .box_01 .basket_protection .ticket_protection { + color: #4f6f1f; + font-weight: 700; + text-decoration: none; + } + + .box_01 .basket_protection .ticket_protection:hover { + text-decoration: underline; + } + + .box_01 .basket_protection__text p { + color: #5a6650; + font-size: 13px; + } + + .box_02 .basket_user_data .basket_user_data__wrapper { + border-radius: 16px; + border: 1px solid #dfe8cd; + box-shadow: 0 10px 26px rgba(30, 43, 18, 0.08); + padding: 24px; + } + + .box_02 .basket_user_data .basket_user_data__wrapper h2 { + font-weight: 900; + margin-bottom: 16px; + } + + .box_02 .basket_user_data .basket_user_data__wrapper .form-control { + border-radius: 10px; + border-color: #d6dfc6; + min-height: 42px; + } + + .box_02 .basket_user_data .basket_user_data__wrapper .form-control:focus { + border-color: #72b81b; + box-shadow: 0 0 0 0.2rem rgba(114, 184, 27, 0.2); + } + + .box_02 .basket_summary .basket_summary__wrapper { + border-radius: 16px; + border: 1px solid #dfe8cd; + box-shadow: 0 10px 26px rgba(30, 43, 18, 0.08); + background: linear-gradient(165deg, #ffffff 0%, #f5faea 100%); + padding: 28px 18px; + } + + .box_02 .basket_summary .basket_summary__wrapper h2 { + font-weight: 800; + } + + .box_02 .basket_summary .basket_summary__wrapper p { + font-size: 2rem; + line-height: 1.1; + } + + .box_02 .basket_summary .basket_summary__wrapper .buy-btn { + border-radius: 999px; + background: #72b81b; + color: #fff; + min-width: 150px; + padding: 10px 16px; + } + + .box_02 .basket_summary .basket_summary__wrapper .buy-btn:hover { + background: #5e9c15; + } + + @include respond-below(md) { + .basket_content { + width: calc(100% - 20px); + margin-top: 26px; + } + + .box_02 .basket_user_data .basket_user_data__wrapper, + .box_02 .basket_summary .basket_summary__wrapper { + padding: 16px 12px; + border-radius: 12px; + } + } + + @include respond-below(sm) { + .basket_content { + margin-top: 14px; + margin-bottom: 26px; + width: calc(100% - 14px); + } + + .box_01 { + margin-bottom: 10px; + } + + .box_01 table tr { + margin-bottom: 8px; + padding: 8px; + } + + .box_01 table td { + min-height: 34px; + padding-top: 6px !important; + padding-bottom: 6px !important; + font-size: 13px; + } + + .box_01 table tr td .btn_t1 { + width: 26px; + height: 26px; + } + + .box_01 .basket_protection { + margin-top: 8px; + padding: 8px 10px; + border-radius: 10px; + } + + .box_01 .basket_protection .ticket_protection { + font-size: 13px; + } + + .box_01 .basket_protection__text p { + font-size: 12px; + line-height: 1.35; + } + + .box_02 .basket_user_data .basket_user_data__wrapper { + padding: 12px 10px; + border-radius: 10px; + } + + .box_02 .basket_user_data .basket_user_data__wrapper h2 { + font-size: 1.15rem; + margin-bottom: 10px; + } + + .box_02 .basket_user_data .basket_user_data__wrapper .form-group { + margin-bottom: 0.35rem !important; + } + + .box_02 .basket_user_data .basket_user_data__wrapper .form-control { + min-height: 36px; + font-size: 14px; + padding-top: 6px; + padding-bottom: 6px; + } + + .box_02 .basket_user_data .basket_user_data__wrapper .col-form-label, + .box_02 .basket_user_data .basket_user_data__wrapper .form-check-label { + font-size: 14px; + line-height: 1.25; + } + + .box_02 .basket_user_data .basket_user_data__wrapper textarea.form-control { + min-height: 74px; + } + + .box_02 .basket_summary .basket_summary__wrapper { + margin-top: 10px; + padding: 14px 10px; + border-radius: 10px; + } + + .box_02 .basket_summary .basket_summary__wrapper h2 { + font-size: 1.1rem; + margin-bottom: 6px; + } + + .box_02 .basket_summary .basket_summary__wrapper p { + font-size: 1.5rem; + margin-bottom: 10px; + } + + .box_02 .basket_summary .basket_summary__wrapper .buy-btn { + width: 100%; + min-width: 0; + padding: 9px 12px; + font-size: 14px; + } + } +} + +/* Tickets main view final fixes */ +#tickets-main-view { + --tickets-main-width: min(1120px, calc(100% - 30px)); + + .tickets_calendar { + width: var(--tickets-main-width); + margin-left: auto; + margin-right: auto; + } + + #dateForm { + width: 100%; + max-width: none; + } + + .tickets { + width: var(--tickets-main-width); + } + + .shopping-cart-container--active .shopping-cart { + opacity: 1; + transform: translateX(0); + } + + .shopping-cart { + opacity: 0; + transform: translateX(120%); + } + + @include respond-below(sm) { + --tickets-main-width: calc(100% - 20px); + } +} + +/* Tickets main view refinements */ +#tickets-main-view { + #dateForm { + max-width: none; + width: min(1120px, calc(100% - 30px)); + } + + .tickets .ticket .price { + background: transparent; + border: 0; + border-radius: 0; + box-shadow: none; + padding: 0; + min-width: 78px; + color: #2b3721; + } + + .shopping-cart { + width: 320px; + right: 18px; + top: 84px; + border-radius: 16px; + padding: 12px; + gap: 10px; + color: #24311c; + background: rgba(255, 255, 255, 0.98); + border: 1px solid #dfe9cf; + box-shadow: 0 18px 34px rgba(28, 43, 14, 0.22); + transform: translateX(120%); + } + + .shopping-cart .basket { + font-size: 22px; + color: #72b81b; + } + + .shopping-cart .quantity { + width: 100%; + text-align: center; + font-size: 20px; + font-weight: 900; + line-height: 1.1; + } + + .shopping-cart .tickets__list { + width: 100%; + padding: 0; + border: 0; + max-height: 44svh; + background: transparent; + } + + .shopping-cart .tickets__list .ticket { + margin: 0 0 8px; + border: 1px solid #dde6ce; + border-radius: 10px; + padding: 8px; + font-size: 13px; + background: #f9fcf4; + grid-template-columns: 1fr 18px; + } + + .shopping-cart .tickets__list .ticket__description { + font-size: 14px; + line-height: 1.2; + } + + .shopping-cart .tickets__list .ticket__price { + font-size: 12px; + color: #566149; + } + + .shopping-cart .tickets__list .ticket .ticket__button { + color: #b53b30; + } + + .shopping-cart .sum-section { + width: 100%; + border-radius: 10px; + padding: 8px 10px; + background: #f3f8e7; + border: 1px solid #dce8c5; + font-size: 20px; + line-height: 1.1; + } + + .shopping-cart .buy-btn { + width: 100%; + text-align: center; + border-radius: 10px; + padding: 11px 14px; + background: #72b81b; + color: #fff; + font-size: 16px; + font-weight: 800; + } + + .shopping-cart .off-btn { + top: 8px; + right: 10px; + color: #72815f; + font-size: 16px; + } + + @include respond-below(sm) { + #dateForm { + width: calc(100% - 20px); + } + + .tickets .ticket .price { + min-width: 0; + } + + .shopping-cart { + width: calc(100vw - 20px); + right: 10px; + top: 74px; + max-height: calc(100svh - 90px); + overflow: hidden; + } + } +} + +/* Tickets cards v2 - more compact, bolder look */ +#tickets-main-view { + .tickets { + gap: 28px; + } + + .tickets .ticket-container { + padding: 18px 16px 12px; + gap: 12px; + border-radius: 18px; + } + + .tickets .ticket { + gap: 12px 14px; + padding: 8px; + border-radius: 14px; + border: 1px solid #e7eddc; + box-shadow: 0 6px 16px rgba(25, 33, 19, 0.06); + position: relative; + overflow: hidden; + } + + .tickets .ticket::after { + content: ''; + position: absolute; + inset: auto 0 0 0; + height: 2px; + background: linear-gradient(90deg, rgba(114, 184, 27, 0.6), rgba(19, 143, 203, 0.2)); + } + + .tickets .ticket .ticket-description { + min-height: 64px; + padding: 10px 10px; + border-radius: 10px; + } + + .tickets .ticket .ticket-description .ticket__name { + font-size: clamp(17px, 2.2vw, 23px); + line-height: 1.08; + letter-spacing: 0.1px; + } + + .tickets .ticket .ticket-description .description { + font-size: 11px; + margin-top: 2px; + } + + .tickets .ticket .ticket-description .ticket-alert { + margin-top: 6px; + font-size: 11px; + opacity: 0.95; + } + + .tickets .ticket .price { + font-size: clamp(22px, 2.5vw, 30px); + font-weight: 900; + min-width: 88px; + text-align: center; + padding: 8px 10px; + border-radius: 999px; + background: #f5f9ed; + border: 1px solid #dfeac9; + color: #2f3a24; + } + + .tickets .ticket .ticket-quantity .button { + min-width: 146px; + padding: 9px 12px; + font-size: 11px; + letter-spacing: 0.5px; + font-weight: 800; + } + + @include respond-below(md) { + .tickets .ticket { + grid-template-columns: 1fr auto auto; + grid-template-areas: "desc price button"; + align-items: center; + } + + .tickets .ticket .ticket-description { + grid-area: desc; + } + + .tickets .ticket .price { + grid-area: price; + text-align: center; + min-width: 82px; + padding: 7px 8px; + } + + .tickets .ticket .ticket-quantity { + grid-area: button; + justify-self: end; + } + } + + @include respond-below(sm) { + .tickets .ticket { + grid-template-columns: 1fr; + grid-template-areas: + "desc" + "price" + "button"; + justify-items: stretch; + } + + .tickets .ticket .price { + justify-self: start; + font-size: 24px; + min-width: 0; + } + + .tickets .ticket .ticket-quantity { + justify-self: stretch; + } + + .tickets .ticket .ticket-quantity .button { + width: 100%; + min-width: 0; + } + } +} diff --git a/templates/admin-panel/calendar.php b/templates/admin-panel/calendar.php new file mode 100644 index 0000000..04f8578 --- /dev/null +++ b/templates/admin-panel/calendar.php @@ -0,0 +1,167 @@ + + + + +
+
+
+

Kalendarz

+ +
+
+ + +
+ + + +
+ +
+ + + +
+
+
+
+
+ + diff --git a/templates/site/layout-logged.php b/templates/site/layout-logged.php index 8ba2517..e70fc2e 100644 --- a/templates/site/layout-logged.php +++ b/templates/site/layout-logged.php @@ -74,6 +74,11 @@ Cennik +
  • + + Kalendarz + +
  • Ustawienia @@ -139,4 +144,4 @@ - \ No newline at end of file + diff --git a/templates/tickets/basket-view.php b/templates/tickets/basket-view.php index 356fc38..3f32e3f 100644 --- a/templates/tickets/basket-view.php +++ b/templates/tickets/basket-view.php @@ -10,6 +10,14 @@ } ?> + +
    +
    + Co najmniej jeden bilet jest już niedostępny w wybranym terminie. Zmień datę w koszyku. +
    +
    + +
    @@ -202,6 +210,15 @@ $(function() { }, success: function(data) { response = jQuery.parseJSON(data); + if (response.status === 'error') { + if ($.alert) { + $.alert(response.message); + } else { + alert(response.message); + } + return; + } + $('.box_01').html(response.basket_form); $('.box_02 .basket_summary').html(response.basket_summary); } @@ -296,4 +313,4 @@ $(function() { } } }); - \ No newline at end of file + diff --git a/templates/tickets/main-view.php b/templates/tickets/main-view.php index 2e93d30..235b91e 100644 --- a/templates/tickets/main-view.php +++ b/templates/tickets/main-view.php @@ -1,4 +1,13 @@ ticket_availability ?? []; +$isTicketAvailable = static function ($ticketId) use ($ticketAvailability) { + if (!array_key_exists($ticketId, $ticketAvailability)) { + return true; + } + + return (bool) $ticketAvailability[$ticketId]; +}; + if (isset($_POST['selected_date'])) { $selected_date = $_POST['selected_date']; $selected = DateTime::createFromFormat('d-m-Y', $selected_date); @@ -35,6 +44,7 @@ if (isset($_POST['selected_date'])) { +
    Wybierz datę przyjazdu:
    @@ -62,6 +72,7 @@ if (isset($_POST['selected_date'])) {
    +

    settings['tickets'][$item]['name']; ?>

    @@ -74,11 +85,14 @@ if (isset($_POST['selected_date'])) { settings['tickets'][$item], $days_diff, $is_weekend); ?>
    - +
    +

    settings['tickets'][$item]['name']; ?>

    @@ -91,7 +105,9 @@ if (isset($_POST['selected_date'])) { settings['tickets'][$item], $days_diff, $is_weekend); ?>
    - +
    @@ -107,6 +123,7 @@ if (isset($_POST['selected_date'])) {
    settings['bilety-all-open'] as $key => $item) : ?> +
    @@ -123,7 +140,9 @@ if (isset($_POST['selected_date'])) { ?>
    - +
    @@ -137,6 +156,7 @@ if (isset($_POST['selected_date'])) {

    bilety dla rodzin

    settings['bilety-rodzinne'] as $key => $item) : ?> +

    settings['tickets'][$item]['name']; ?>

    @@ -151,7 +171,9 @@ if (isset($_POST['selected_date'])) { ?>
    - +
    @@ -164,6 +186,7 @@ if (isset($_POST['selected_date'])) {

    Na cały sezon

    settings['karnety'] as $key => $item) : ?> +

    settings['tickets'][$item]['name']; ?>

    @@ -179,7 +202,9 @@ if (isset($_POST['selected_date'])) { ?>
    - +
    @@ -242,6 +267,7 @@ if (isset($_POST['selected_date'])) {
    +
    \ No newline at end of file + diff --git a/upgrade.php b/upgrade.php index 9fddab3..fe0d6b1 100644 --- a/upgrade.php +++ b/upgrade.php @@ -29,6 +29,13 @@ $migrations = [ 'ticket_prices_add_price_weekend' => "ALTER TABLE ticket_prices ADD COLUMN IF NOT EXISTS price_weekend DECIMAL(10,2) DEFAULT NULL AFTER price", + 'ticket_calendar_availability' => "CREATE TABLE IF NOT EXISTS ticket_calendar_availability ( + ticket_group VARCHAR(64) NOT NULL, + available_date DATE NOT NULL, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (ticket_group, available_date) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8", + ]; $ok = 0;