Polish footer UI and localize demo-request form endpoints
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
{% load wagtailimages_tags %}
|
||||
<section class="saas-demo saas-demo--inline saas-demo--{{ self.background_style }}"
|
||||
data-width="{{ self.layout_width }}">
|
||||
<div class="saas-demo__container">
|
||||
<header class="saas-demo__header">
|
||||
<h2 class="saas-demo__title">{{ self.section_title }}</h2>
|
||||
{% if self.section_subtitle %}
|
||||
<div class="saas-demo__subtitle">{{ self.section_subtitle }}</div>
|
||||
{% endif %}
|
||||
</header>
|
||||
|
||||
<form class="saas-demo__form" action="{% url "contact_form:contact-form-handler" %}" method="post">
|
||||
{% csrf_token %}
|
||||
<div class="saas-demo__fields">
|
||||
{% for field in self.form_fields %}
|
||||
<div class="saas-demo__field">
|
||||
<label class="saas-demo__label" for="demo-{{ field.field_type }}">
|
||||
{{ field.label }}
|
||||
{% if field.required %}<span class="saas-demo__required">*</span>{% endif %}
|
||||
</label>
|
||||
{% if field.field_type == 'message' %}
|
||||
<textarea class="saas-demo__textarea"
|
||||
id="demo-{{ field.field_type }}"
|
||||
name="{% if field.field_type == "email" %}email_from{% elif field.field_type == "phone" %}phonenumber{% elif field.field_type == "text" %}name{% else %}{{ field.field_type }}{% endif %}"
|
||||
placeholder="{{ field.placeholder }}"
|
||||
{% if field.required %}required{% endif %}></textarea>
|
||||
{% elif field.field_type == 'company_size' %}
|
||||
<select class="saas-demo__select"
|
||||
id="demo-{{ field.field_type }}"
|
||||
name="{% if field.field_type == "email" %}email_from{% elif field.field_type == "phone" %}phonenumber{% elif field.field_type == "text" %}name{% else %}{{ field.field_type }}{% endif %}"
|
||||
{% if field.required %}required{% endif %}>
|
||||
<option value="">{{ field.placeholder|default:"Select company size" }}</option>
|
||||
<option value="1-10">1-10 employees</option>
|
||||
<option value="11-50">11-50 employees</option>
|
||||
<option value="51-200">51-200 employees</option>
|
||||
<option value="201-500">201-500 employees</option>
|
||||
<option value="500+">500+ employees</option>
|
||||
</select>
|
||||
{% else %}
|
||||
<input class="saas-demo__input"
|
||||
type="{% if field.field_type == 'email' %}email{% elif field.field_type == 'phone' %}tel{% else %}text{% endif %}"
|
||||
id="demo-{{ field.field_type }}"
|
||||
name="{% if field.field_type == "email" %}email_from{% elif field.field_type == "phone" %}phonenumber{% elif field.field_type == "text" %}name{% else %}{{ field.field_type }}{% endif %}"
|
||||
placeholder="{{ field.placeholder }}"
|
||||
{% if field.required %}required{% endif %}>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<button type="submit" class="saas-demo__submit">{{ self.submit_button_text }}</button>
|
||||
|
||||
{% if self.privacy_text %}
|
||||
<div class="saas-demo__privacy">{{ self.privacy_text }}</div>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
@@ -0,0 +1,94 @@
|
||||
{% load wagtailimages_tags %}
|
||||
<section class="saas-demo saas-demo--modal-trigger saas-demo--{{ self.background_style }}"
|
||||
data-width="{{ self.layout_width }}"
|
||||
data-demo-modal-root>
|
||||
<div class="saas-demo__container">
|
||||
<div class="saas-demo__content">
|
||||
<h2 class="saas-demo__title">{{ self.section_title }}</h2>
|
||||
{% if self.section_subtitle %}
|
||||
<div class="saas-demo__subtitle">{{ self.section_subtitle }}</div>
|
||||
{% endif %}
|
||||
|
||||
<button type="button" class="saas-demo__trigger" data-demo-modal-open>
|
||||
{{ self.submit_button_text }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Modal -->
|
||||
<div class="saas-demo__modal" data-demo-modal hidden>
|
||||
<div class="saas-demo__modal-backdrop" data-demo-modal-close></div>
|
||||
<div class="saas-demo__modal-content">
|
||||
<button type="button" class="saas-demo__modal-close" data-demo-modal-close aria-label="Close">
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
|
||||
</button>
|
||||
|
||||
<h3 class="saas-demo__modal-title">{{ self.section_title }}</h3>
|
||||
|
||||
<form class="saas-demo__form" action="{% url "contact_form:contact-form-handler" %}" method="post">
|
||||
{% csrf_token %}
|
||||
<div class="saas-demo__fields">
|
||||
{% for field in self.form_fields %}
|
||||
<div class="saas-demo__field">
|
||||
<label class="saas-demo__label" for="modal-{{ field.field_type }}">
|
||||
{{ field.label }}
|
||||
{% if field.required %}<span class="saas-demo__required">*</span>{% endif %}
|
||||
</label>
|
||||
{% if field.field_type == 'message' %}
|
||||
<textarea class="saas-demo__textarea"
|
||||
id="modal-{{ field.field_type }}"
|
||||
name="{% if field.field_type == "email" %}email_from{% elif field.field_type == "phone" %}phonenumber{% elif field.field_type == "text" %}name{% else %}{{ field.field_type }}{% endif %}"
|
||||
placeholder="{{ field.placeholder }}"
|
||||
{% if field.required %}required{% endif %}></textarea>
|
||||
{% else %}
|
||||
<input class="saas-demo__input"
|
||||
type="{% if field.field_type == 'email' %}email{% elif field.field_type == 'phone' %}tel{% else %}text{% endif %}"
|
||||
id="modal-{{ field.field_type }}"
|
||||
name="{% if field.field_type == "email" %}email_from{% elif field.field_type == "phone" %}phonenumber{% elif field.field_type == "text" %}name{% else %}{{ field.field_type }}{% endif %}"
|
||||
placeholder="{{ field.placeholder }}"
|
||||
{% if field.required %}required{% endif %}>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<button type="submit" class="saas-demo__submit">{{ self.submit_button_text }}</button>
|
||||
|
||||
{% if self.privacy_text %}
|
||||
<div class="saas-demo__privacy">{{ self.privacy_text }}</div>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<script>
|
||||
(function () {
|
||||
const roots = document.querySelectorAll('[data-demo-modal-root]');
|
||||
roots.forEach((root) => {
|
||||
if (root.dataset.modalBound === "1") return;
|
||||
root.dataset.modalBound = "1";
|
||||
|
||||
const modal = root.querySelector('[data-demo-modal]');
|
||||
const openBtn = root.querySelector('[data-demo-modal-open]');
|
||||
const closeBtns = root.querySelectorAll('[data-demo-modal-close]');
|
||||
if (!modal || !openBtn) return;
|
||||
|
||||
const openModal = () => {
|
||||
modal.hidden = false;
|
||||
document.body.style.overflow = 'hidden';
|
||||
};
|
||||
|
||||
const closeModal = () => {
|
||||
modal.hidden = true;
|
||||
document.body.style.overflow = '';
|
||||
};
|
||||
|
||||
openBtn.addEventListener('click', openModal);
|
||||
closeBtns.forEach((btn) => btn.addEventListener('click', closeModal));
|
||||
|
||||
root.addEventListener('keydown', (event) => {
|
||||
if (event.key === 'Escape' && !modal.hidden) closeModal();
|
||||
});
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
@@ -0,0 +1,156 @@
|
||||
{% load wagtailimages_tags %}
|
||||
<section class="saas-demo saas-demo--split saas-demo--{{ self.background_style }} mandelstudio-demo-split"
|
||||
data-width="{{ self.layout_width }}">
|
||||
<style>
|
||||
.mandelstudio-demo-split {
|
||||
position: relative;
|
||||
border-radius: 18px;
|
||||
overflow: hidden;
|
||||
background: linear-gradient(180deg, #f8fbff 0%, #f3f7fc 100%);
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__container {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: clamp(1.25rem, 2.2vw, 2.25rem);
|
||||
gap: clamp(1rem, 2vw, 2rem);
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__title {
|
||||
font-size: clamp(1.9rem, 3vw, 3rem);
|
||||
line-height: 1.1;
|
||||
letter-spacing: -0.03em;
|
||||
margin-bottom: .8rem;
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__subtitle {
|
||||
color: #556070;
|
||||
max-width: 54ch;
|
||||
margin-bottom: .9rem;
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__benefits-list {
|
||||
margin-bottom: 1.15rem;
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__benefit {
|
||||
color: #212b3a;
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__visual {
|
||||
margin-top: .5rem;
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__image {
|
||||
width: 100%;
|
||||
border-radius: 16px;
|
||||
border: 1px solid rgba(39, 66, 107, .14);
|
||||
box-shadow: 0 12px 28px rgba(20, 35, 68, .12);
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__form-wrapper {
|
||||
border: 1px solid rgba(42, 72, 120, .15);
|
||||
border-radius: 16px;
|
||||
background: #fff;
|
||||
box-shadow: 0 14px 30px rgba(18, 38, 76, .09);
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__form {
|
||||
padding: clamp(1rem, 2vw, 1.5rem);
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__input,
|
||||
.mandelstudio-demo-split .saas-demo__select,
|
||||
.mandelstudio-demo-split .saas-demo__textarea {
|
||||
background: #fbfdff;
|
||||
border-color: #d8e1ec;
|
||||
transition: border-color .2s ease, box-shadow .2s ease;
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__input:focus,
|
||||
.mandelstudio-demo-split .saas-demo__select:focus,
|
||||
.mandelstudio-demo-split .saas-demo__textarea:focus {
|
||||
border-color: #377dff;
|
||||
box-shadow: 0 0 0 .2rem rgba(55, 125, 255, .15);
|
||||
}
|
||||
.mandelstudio-demo-split .saas-demo__submit {
|
||||
box-shadow: 0 8px 18px rgba(40, 95, 214, .3);
|
||||
}
|
||||
@media (max-width: 991.98px) {
|
||||
.mandelstudio-demo-split .saas-demo__visual {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="saas-demo__container">
|
||||
<div class="saas-demo__content">
|
||||
<h2 class="saas-demo__title">{{ self.section_title }}</h2>
|
||||
{% if self.section_subtitle %}
|
||||
<div class="saas-demo__subtitle">{{ self.section_subtitle }}</div>
|
||||
{% endif %}
|
||||
|
||||
{% if self.benefits_title or self.benefits %}
|
||||
<div class="saas-demo__benefits">
|
||||
{% if self.benefits_title %}
|
||||
<h3 class="saas-demo__benefits-title">{{ self.benefits_title }}</h3>
|
||||
{% endif %}
|
||||
{% if self.benefits %}
|
||||
<ul class="saas-demo__benefits-list">
|
||||
{% for benefit in self.benefits %}
|
||||
<li class="saas-demo__benefit">
|
||||
<svg class="saas-demo__check" width="20" height="20" viewBox="0 0 20 20" fill="none">
|
||||
<path d="M4 10L8 14L16 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
{{ benefit }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if self.side_image %}
|
||||
<div class="saas-demo__visual">
|
||||
{% image self.side_image width-640 class="saas-demo__image" %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="saas-demo__form-wrapper">
|
||||
<form class="saas-demo__form" action="{% url "contact_form:contact-form-handler" %}" method="post">
|
||||
{% csrf_token %}
|
||||
<div class="saas-demo__fields">
|
||||
{% for field in self.form_fields %}
|
||||
<div class="saas-demo__field">
|
||||
<label class="saas-demo__label" for="split-{{ field.field_type }}">
|
||||
{{ field.label }}
|
||||
{% if field.required %}<span class="saas-demo__required">*</span>{% endif %}
|
||||
</label>
|
||||
{% if field.field_type == 'message' %}
|
||||
<textarea class="saas-demo__textarea"
|
||||
id="split-{{ field.field_type }}"
|
||||
name="{% if field.field_type == "email" %}email_from{% elif field.field_type == "phone" %}phonenumber{% elif field.field_type == "text" %}name{% else %}{{ field.field_type }}{% endif %}"
|
||||
placeholder="{{ field.placeholder }}"
|
||||
{% if field.required %}required{% endif %}></textarea>
|
||||
{% elif field.field_type == 'company_size' %}
|
||||
<select class="saas-demo__select"
|
||||
id="split-{{ field.field_type }}"
|
||||
name="{% if field.field_type == "email" %}email_from{% elif field.field_type == "phone" %}phonenumber{% elif field.field_type == "text" %}name{% else %}{{ field.field_type }}{% endif %}"
|
||||
{% if field.required %}required{% endif %}>
|
||||
<option value="">{{ field.placeholder|default:"Select company size" }}</option>
|
||||
<option value="1-10">1-10 employees</option>
|
||||
<option value="11-50">11-50 employees</option>
|
||||
<option value="51-200">51-200 employees</option>
|
||||
<option value="201-500">201-500 employees</option>
|
||||
<option value="500+">500+ employees</option>
|
||||
</select>
|
||||
{% else %}
|
||||
<input class="saas-demo__input"
|
||||
type="{% if field.field_type == 'email' %}email{% elif field.field_type == 'phone' %}tel{% else %}text{% endif %}"
|
||||
id="split-{{ field.field_type }}"
|
||||
name="{% if field.field_type == "email" %}email_from{% elif field.field_type == "phone" %}phonenumber{% elif field.field_type == "text" %}name{% else %}{{ field.field_type }}{% endif %}"
|
||||
placeholder="{{ field.placeholder }}"
|
||||
{% if field.required %}required{% endif %}>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<button type="submit" class="saas-demo__submit">{{ self.submit_button_text }}</button>
|
||||
|
||||
{% if self.privacy_text %}
|
||||
<div class="saas-demo__privacy">{{ self.privacy_text }}</div>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -0,0 +1,11 @@
|
||||
{% load wagtailcore_tags %}
|
||||
{% if self.heading %}<p class="footer_header">{{ self.heading }}</p>{% endif %}
|
||||
{% if children %}
|
||||
<ul class="mb-footer-links list-unstyled m-0">
|
||||
{% for page in children %}
|
||||
<li class="mb-footer-links__item mb-2">
|
||||
<a href="{% pageurl page %}">{{ page.title }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
141
mandelstudio/templates/oxyan/partials/footer.html
Normal file
141
mandelstudio/templates/oxyan/partials/footer.html
Normal file
@@ -0,0 +1,141 @@
|
||||
{% load staticfiles %}
|
||||
{% load wagtailcore_tags wagtailimages_tags wagtailsettings_tags cache %}
|
||||
{% get_settings %}
|
||||
|
||||
{% cache 300 footer_menu LANGUAGE_CODE request.site %}
|
||||
<style>
|
||||
.mb-footer-wrap {
|
||||
margin-top: clamp(2rem, 4vw, 3.5rem);
|
||||
position: relative;
|
||||
}
|
||||
.mb-footer {
|
||||
position: relative;
|
||||
background:
|
||||
radial-gradient(120% 120% at 0% 0%, rgba(84, 149, 230, .22) 0%, rgba(84, 149, 230, 0) 45%),
|
||||
radial-gradient(90% 120% at 100% 0%, rgba(65, 206, 186, .16) 0%, rgba(65, 206, 186, 0) 45%),
|
||||
linear-gradient(180deg, #264f72 0%, #203f5c 100%);
|
||||
border-radius: 28px 28px 0 0;
|
||||
padding: clamp(2rem, 4vw, 3rem) 0;
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255,255,255,.12),
|
||||
0 -10px 24px rgba(20, 43, 72, .20);
|
||||
overflow: hidden;
|
||||
}
|
||||
.mb-footer:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: linear-gradient(90deg, rgba(255,255,255,.07) 0%, rgba(255,255,255,0) 35%, rgba(255,255,255,.06) 100%);
|
||||
pointer-events: none;
|
||||
}
|
||||
.mb-footer .footer_column {
|
||||
padding-top: .75rem;
|
||||
padding-bottom: .75rem;
|
||||
}
|
||||
.mb-footer .mb-footer__card {
|
||||
height: 100%;
|
||||
background: rgba(255, 255, 255, .055);
|
||||
border: 1px solid rgba(255, 255, 255, .14);
|
||||
border-radius: 16px;
|
||||
padding: 1.1rem 1.15rem;
|
||||
backdrop-filter: blur(1.2px);
|
||||
}
|
||||
.mb-footer .footer_header {
|
||||
font-size: 1.05rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: .01em;
|
||||
margin-bottom: .9rem;
|
||||
color: #f4f8ff;
|
||||
}
|
||||
.mb-footer .footer_column,
|
||||
.mb-footer .footer_column * {
|
||||
color: rgba(237, 244, 255, .93);
|
||||
}
|
||||
.mb-footer .footer_column a {
|
||||
color: #eef4ff;
|
||||
text-decoration: none;
|
||||
transition: color .2s ease, transform .2s ease;
|
||||
}
|
||||
.mb-footer .footer_column a:hover {
|
||||
color: #ffffff;
|
||||
transform: translateX(2px);
|
||||
}
|
||||
.mb-footer .footer_column .rich-text p {
|
||||
margin-bottom: .65rem;
|
||||
line-height: 1.65;
|
||||
max-width: 34ch;
|
||||
}
|
||||
.mb-footer .mb-footer__card .aboutus-logo {
|
||||
max-height: 52px;
|
||||
width: auto;
|
||||
}
|
||||
.mb-footer .mb-footer__card .social {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
.mb-footer .mb-footer__card .social a {
|
||||
border-color: rgba(255, 255, 255, .42);
|
||||
color: #ffffff;
|
||||
background: rgba(255,255,255,.08);
|
||||
}
|
||||
.mb-footer .mb-footer__card .social a:hover {
|
||||
background: rgba(255,255,255,.18);
|
||||
}
|
||||
.mb-copyright {
|
||||
background: #1b3650;
|
||||
padding: 1rem 0;
|
||||
border-top: 1px solid rgba(255,255,255,.16);
|
||||
}
|
||||
.mb-copyright .copyright_block,
|
||||
.mb-copyright .copyright_block * {
|
||||
color: rgba(234, 241, 255, .92);
|
||||
margin: 0;
|
||||
font-size: .95rem;
|
||||
}
|
||||
.mb-copyright .copyright_block a {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
}
|
||||
.mb-copyright .copyright_block a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
@media (max-width: 991.98px) {
|
||||
.mb-footer {
|
||||
border-radius: 20px 20px 0 0;
|
||||
}
|
||||
.mb-footer .mb-footer__card {
|
||||
padding: 1rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="mb-footer-wrap">
|
||||
<footer class="footer mb-footer">
|
||||
<div class="container">
|
||||
<div class="row g-4">
|
||||
{% with footer=settings.ocyan_plugin_wagtail.OcyanSettings.footer %}
|
||||
{% for block in footer %}
|
||||
{% if block.block_type == 'page_list' and block.value.page and not block.value.page.get_children.live.public %}
|
||||
{% else %}
|
||||
<div class="{% if footer|length == 3 %}col-lg-4{% elif footer|length == 2 %}col-lg-6{% else %}col-lg-3{% endif %} col-md-6 col-sm-12 footer_column {{ block.block_type|slugify }}">
|
||||
<div class="mb-footer__card">
|
||||
{% include_block block %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<section class="copyright_wrapper mb-copyright">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-12 copyright_block">
|
||||
{% include_block settings.ocyan_plugin_wagtail.OcyanSettings.mini_footer %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
{% endcache %}
|
||||
Reference in New Issue
Block a user