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.
This commit is contained in:
2026-03-06 01:06:43 +01:00
parent 238c9ecaed
commit 38f5babde3
14 changed files with 2218 additions and 261 deletions

BIN
layout/.DS_Store vendored

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -1453,4 +1453,729 @@ body {
75% {
transform: translateX(-2px);
}
}
}
/* 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;
}
}
}