Implement Phase 7: Contact Form 7 Integration (v0.7.0)
All checks were successful
Create Release Package / build-release (push) Successful in 1m1s

Add custom CF7 form tags for booking requests:
- [bnb_building_select] - Building filter dropdown
- [bnb_room_select] - Room selection with capacity data
- [bnb_date_checkin/checkout] - Date pickers with validation
- [bnb_guests] - Guest count with capacity limits

Features:
- Server-side validation for all fields
- Real-time AJAX availability checking
- Automatic price calculation display
- Booking creation on form submission
- Guest record creation/linking
- Custom mail tags for CF7 templates

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-03 16:30:30 +01:00
parent 3579904bad
commit 28350aabfa
8 changed files with 2053 additions and 12 deletions

View File

@@ -0,0 +1,344 @@
/**
* WP BnB Contact Form 7 Integration Styles
*
* Styling for CF7 booking forms.
*
* @package Magdev\WpBnb
*/
/* Custom Properties */
:root {
--wp-bnb-cf7-primary: #2271b1;
--wp-bnb-cf7-success: #00a32a;
--wp-bnb-cf7-warning: #dba617;
--wp-bnb-cf7-error: #d63638;
--wp-bnb-cf7-text: #1d2327;
--wp-bnb-cf7-text-light: #646970;
--wp-bnb-cf7-border: #c3c4c7;
--wp-bnb-cf7-bg: #f0f0f1;
--wp-bnb-cf7-radius: 4px;
--wp-bnb-cf7-spacing: 1rem;
}
/* Form Layout */
.wp-bnb-booking-form,
.wp-bnb-inquiry-form {
max-width: 700px;
margin: 0 auto;
}
.wp-bnb-booking-form h3,
.wp-bnb-booking-form h4,
.wp-bnb-inquiry-form h3,
.wp-bnb-inquiry-form h4 {
margin-top: 1.5em;
margin-bottom: 0.75em;
padding-bottom: 0.5em;
border-bottom: 1px solid var(--wp-bnb-cf7-border);
}
.wp-bnb-booking-form h3:first-child,
.wp-bnb-inquiry-form h3:first-child {
margin-top: 0;
}
/* Form Rows */
.wp-bnb-form-row {
margin-bottom: var(--wp-bnb-cf7-spacing);
}
.wp-bnb-form-row-2col {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--wp-bnb-cf7-spacing);
}
@media (max-width: 480px) {
.wp-bnb-form-row-2col {
grid-template-columns: 1fr;
}
}
/* Form Fields */
.wp-bnb-form-field {
display: flex;
flex-direction: column;
}
.wp-bnb-form-field label {
display: block;
margin-bottom: 0.25rem;
font-weight: 600;
font-size: 0.875rem;
color: var(--wp-bnb-cf7-text);
}
/* Custom CF7 Tags Styling */
.wp-bnb-building-select,
.wp-bnb-room-select,
.wp-bnb-date-checkin,
.wp-bnb-date-checkout,
.wp-bnb-guests {
width: 100%;
padding: 0.5rem 0.75rem;
font-size: 1rem;
line-height: 1.5;
border: 1px solid var(--wp-bnb-cf7-border);
border-radius: var(--wp-bnb-cf7-radius);
background-color: #fff;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.wp-bnb-building-select:focus,
.wp-bnb-room-select:focus,
.wp-bnb-date-checkin:focus,
.wp-bnb-date-checkout:focus,
.wp-bnb-guests:focus {
outline: none;
border-color: var(--wp-bnb-cf7-primary);
box-shadow: 0 0 0 2px rgba(34, 113, 177, 0.25);
}
/* Select dropdown */
.wp-bnb-room-select optgroup {
font-weight: 600;
font-style: normal;
color: var(--wp-bnb-cf7-text);
}
/* Date inputs */
.wp-bnb-date-checkin,
.wp-bnb-date-checkout {
cursor: pointer;
}
/* Number input */
.wp-bnb-guests {
max-width: 120px;
}
/* Availability Status */
.wp-bnb-availability-status {
padding: var(--wp-bnb-cf7-spacing);
margin: var(--wp-bnb-cf7-spacing) 0;
background-color: var(--wp-bnb-cf7-bg);
border-radius: var(--wp-bnb-cf7-radius);
text-align: center;
min-height: 50px;
display: flex;
align-items: center;
justify-content: center;
}
.wp-bnb-availability-status:empty {
display: none;
}
.wp-bnb-checking {
color: var(--wp-bnb-cf7-text-light);
font-style: italic;
}
.wp-bnb-checking::before {
content: "";
display: inline-block;
width: 16px;
height: 16px;
margin-right: 8px;
border: 2px solid var(--wp-bnb-cf7-border);
border-top-color: var(--wp-bnb-cf7-primary);
border-radius: 50%;
animation: wp-bnb-spin 0.8s linear infinite;
vertical-align: middle;
}
@keyframes wp-bnb-spin {
to {
transform: rotate(360deg);
}
}
.wp-bnb-available {
color: var(--wp-bnb-cf7-success);
font-weight: 600;
}
.wp-bnb-available::before {
content: "\2713";
display: inline-block;
margin-right: 8px;
font-size: 1.25em;
}
.wp-bnb-unavailable {
color: var(--wp-bnb-cf7-error);
font-weight: 600;
}
.wp-bnb-unavailable::before {
content: "\2717";
display: inline-block;
margin-right: 8px;
font-size: 1.25em;
}
/* Price Display */
.wp-bnb-price-display {
padding: var(--wp-bnb-cf7-spacing);
margin: var(--wp-bnb-cf7-spacing) 0;
background-color: #e7f5ea;
border: 1px solid var(--wp-bnb-cf7-success);
border-radius: var(--wp-bnb-cf7-radius);
text-align: center;
}
.wp-bnb-price-display:empty {
display: none;
}
.wp-bnb-price-label {
color: var(--wp-bnb-cf7-text-light);
font-size: 0.875rem;
}
.wp-bnb-price-amount {
font-size: 1.5rem;
font-weight: 700;
color: var(--wp-bnb-cf7-success);
margin: 0 0.5rem;
}
.wp-bnb-nights {
color: var(--wp-bnb-cf7-text-light);
font-size: 0.875rem;
}
/* Capacity Warning */
.wp-bnb-capacity-warning {
display: block;
margin-top: 0.25rem;
padding: 0.25rem 0.5rem;
font-size: 0.8125rem;
color: var(--wp-bnb-cf7-error);
background-color: #fcf0f1;
border-radius: var(--wp-bnb-cf7-radius);
}
/* Validation Errors */
.wpcf7-form-control-wrap .wpcf7-not-valid-tip {
color: var(--wp-bnb-cf7-error);
font-size: 0.8125rem;
margin-top: 0.25rem;
}
.wpcf7-form-control.wpcf7-not-valid {
border-color: var(--wp-bnb-cf7-error);
}
/* Response Messages */
.wpcf7 form.sent .wpcf7-response-output {
border-color: var(--wp-bnb-cf7-success);
background-color: #e7f5ea;
color: var(--wp-bnb-cf7-success);
}
.wpcf7 form.failed .wpcf7-response-output,
.wpcf7 form.aborted .wpcf7-response-output,
.wpcf7 form.spam .wpcf7-response-output,
.wpcf7 form.invalid .wpcf7-response-output {
border-color: var(--wp-bnb-cf7-error);
background-color: #fcf0f1;
color: var(--wp-bnb-cf7-error);
}
/* Submit Button */
.wp-bnb-booking-form .wpcf7-submit,
.wp-bnb-inquiry-form .wpcf7-submit {
display: inline-block;
padding: 0.75rem 1.5rem;
font-size: 1rem;
font-weight: 600;
color: #fff;
background-color: var(--wp-bnb-cf7-primary);
border: none;
border-radius: var(--wp-bnb-cf7-radius);
cursor: pointer;
transition: background-color 0.15s ease-in-out;
}
.wp-bnb-booking-form .wpcf7-submit:hover,
.wp-bnb-inquiry-form .wpcf7-submit:hover {
background-color: #135e96;
}
.wp-bnb-booking-form .wpcf7-submit:disabled,
.wp-bnb-inquiry-form .wpcf7-submit:disabled {
opacity: 0.7;
cursor: not-allowed;
}
/* Spinner */
.wpcf7 .wpcf7-spinner {
margin-left: 0.5rem;
}
/* Hidden Room Field (for inquiry forms) */
.wp-bnb-inquiry-form input[type="hidden"] + .wpcf7-form-control-wrap {
display: none;
}
/* Form Section Headers */
.wp-bnb-booking-form hr,
.wp-bnb-inquiry-form hr {
margin: 1.5rem 0;
border: none;
border-top: 1px solid var(--wp-bnb-cf7-border);
}
/* Dark Mode Support */
@media (prefers-color-scheme: dark) {
:root {
--wp-bnb-cf7-text: #f0f0f1;
--wp-bnb-cf7-text-light: #a7aaad;
--wp-bnb-cf7-border: #50575e;
--wp-bnb-cf7-bg: #2c3338;
}
.wp-bnb-building-select,
.wp-bnb-room-select,
.wp-bnb-date-checkin,
.wp-bnb-date-checkout,
.wp-bnb-guests {
background-color: #3c434a;
color: var(--wp-bnb-cf7-text);
}
.wp-bnb-price-display {
background-color: #1a3320;
border-color: var(--wp-bnb-cf7-success);
}
.wp-bnb-capacity-warning {
background-color: #3c1618;
}
.wpcf7 form.sent .wpcf7-response-output {
background-color: #1a3320;
}
.wpcf7 form.failed .wpcf7-response-output,
.wpcf7 form.aborted .wpcf7-response-output,
.wpcf7 form.spam .wpcf7-response-output,
.wpcf7 form.invalid .wpcf7-response-output {
background-color: #3c1618;
}
}
/* Print Styles */
@media print {
.wp-bnb-availability-status,
.wp-bnb-price-display,
.wpcf7-submit {
display: none;
}
}