[prepare] hardware website for staging

This commit is contained in:
Baha Khmeissi 2025-07-06 19:17:27 +01:00
parent 5d6a14e2ed
commit 0d28446044
45 changed files with 124431 additions and 0 deletions

187
app.py Normal file
View File

@ -0,0 +1,187 @@
from flask import Flask, render_template, request, jsonify, session
from pymongo import MongoClient
import random
import string
app = Flask(__name__)
MONGO_URI_RO = 'mongodb://localhost:27017/hardware'
app.secret_key = 'test'
# mongoimport --db hardware --collection product_thinkmate --file db.json --jsonArray
def init_mongo():
client = MongoClient(MONGO_URI_RO)
return client['hardware']
@app.route('/', methods=['GET'])
def home():
hardware = init_mongo()
categories = list(hardware['product_thinkmate'].find({}))
return render_template('base_website.html', categories=categories)
@app.route('/index', methods=['POST'])
def index():
hardware = init_mongo()
categories = list(hardware['product_thinkmate'].find({}))
return render_template('index.html', categories=categories)
@app.route('/servers', methods=['POST'])
def servers():
hardware = init_mongo()
servers = list(hardware['product_thinkmate'].find({'type': 'server'}))
return render_template('servers.html', servers=servers)
@app.route('/servers/<category>', methods=['POST'])
def category(category):
hardware = init_mongo()
server_category = hardware['product_thinkmate'].find_one({'type': 'server', 'category': category})
server_details = server_category.get('server_details', '')
server_highlights_detail = server_category.get('server_highlights_detail', '')
products = server_category.get('products', '')
details_list = [phrase.strip() for phrase in server_details.split('||')]
return render_template('category.html', server_category=server_category,
details_list=details_list, server_highlights_detail=server_highlights_detail,
products=products)
@app.route('/product/<category>/<product_name>', methods=['POST'])
def product(category, product_name):
session.clear()
product_id = request.args.get('product_id')
hardware = init_mongo()
category_data = hardware['product_thinkmate'].find_one({'category': category})
saved_selections = session.get('config_selections', {}).get(product_name, {})
product = None
config_data = None
if category_data and 'products' in category_data:
for item in category_data['products']:
if item.get('product_name') == product_name:
product = item
config_data = item.get('product_data', {}).get('config', [])[0]
break
return render_template('product.html', product=product,
category_data=category_data, config_data=config_data,
saved_selections=saved_selections)
@app.route('/configurator/<category>/<product_name>/<config_category>', methods=['POST'])
def config(category, product_name, config_category):
product_id = request.args.get('product_id')
hardware = init_mongo()
category_data = hardware['product_thinkmate'].find_one({'category': category})
saved_selections = session.get('config_selections', {}).get(product_name, {})
product = None
config_data = None
if category_data and 'products' in category_data:
for item in category_data['products']:
if item.get('product_name') == product_name:
product = item
config_data = item.get('product_data', {}).get('config', [])
for config in config_data:
if config.get('category', {}).get('name') == config_category:
config_data = config
break
break
return render_template('config.html', product=product, category_data=category_data,
config_data=config_data, config_category=config_category,
saved_selections=saved_selections)
@app.route('/save_config_selection', methods=['POST'])
def save_config_selection():
data = request.form
product_name = data.get('product_name')
category = data.get('category')
max_quantity_str = data.get('max_quantity', None)
try:
max_quantity = int(max_quantity_str) if max_quantity_str and max_quantity_str.isdigit() else None
except ValueError:
max_quantity = None
sub_category = data.get('sub_category')
config_choice_type = data.get('config_choice_type')
new_category_data = {"max_quantity": max_quantity}
config_keys = [key for key in data.keys() if key.startswith('config-')]
if config_choice_type != 'radio' and max_quantity and len(config_keys) > max_quantity:
return jsonify({
'message': f'Cannot select more than {max_quantity} options for {category}.',
'status': 'ko'
})
if config_keys:
if config_choice_type == 'radio':
for key, value in data.items():
if key.startswith('config-'):
new_category_data["selection"] = value
break
else:
new_category_data["subcategories"] = {}
for key, value in data.items():
if key.startswith('config-'):
parts = key.split('-')
subcategory = parts[3] if len(parts) >= 4 else category
new_category_data["subcategories"].setdefault(subcategory, []).append(value)
else:
if config_choice_type == 'radio':
new_category_data["selection"] = None
else:
new_category_data["subcategories"] = {sub_category or category: []}
config_selections = session.get('config_selections', {})
config_selections.setdefault(product_name, {})[category] = new_category_data
# Cleanup logic
if config_choice_type != 'radio':
subcats = config_selections[product_name][category].get("subcategories", {})
subcats = {k: v for k, v in subcats.items() if v}
if not subcats:
config_selections[product_name].pop(category, None)
elif not config_selections[product_name][category].get("selection"):
config_selections[product_name].pop(category, None)
if not config_selections[product_name]:
config_selections.pop(product_name)
session['config_selections'] = config_selections
return jsonify(config_selections.get(product_name, {}))
@app.route('/show_order', methods=['POST'])
def show_order():
config_selection = session.get('config_selections', {})
return render_template('order.html', config_selection=config_selection,
no_order_message='No orders found in the session.')
def sanitize_keys(data):
if isinstance(data, dict):
return {k.replace('.', '_'): sanitize_keys(v) for k, v in data.items()}
elif isinstance(data, list):
return [sanitize_keys(i) for i in data]
return data
@app.route('/confirm_order', methods=['POST'])
def confirm_order():
order = sanitize_keys(session.get('config_selections', {}))
hardware = init_mongo()
if not order:
return 'No orders found in the session.'
if 'order' not in hardware.list_collection_names():
hardware.create_collection('order')
order_id = ''.join(random.choices(string.ascii_letters + string.digits, k=5))
details = []
for product_name, categories in order.items():
for category_name, category_data in categories.items():
details.append({
"category": category_name,
"selection": category_data.get("selection"),
"subcategories": category_data.get("subcategories", {})
})
hardware['order'].insert_one({
'order_id': order_id,
'product_name': product_name,
'details': details,
'status': 'confirmed'
})
session.clear()
return '<i class="fas fa-check" style="color: green;"></i> Order confirmed successfully!'
if __name__ == '__main__':
app.run(debug=True)

71159
db.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,26 @@
.toast-example {
position: static;
margin: 10px 0 30px;
}
.toast-example.padding-0 {
margin-bottom: 30px;
}
.toast-example > div {
width: auto;
max-width: 300px;
margin-bottom: 0;
}
.position-example {
position: relative;
height: 330px;
margin-bottom: 20px;
}
.position-example > div {
position: absolute;
width: 100%;
padding: 20px;
}
.position-example > .btn-block + .btn-block {
margin-top: 215px;
}

View File

@ -0,0 +1,66 @@
.example-modal {
display: block;
width: 100%;
padding: 35px 15px;
background-color: #f3f7f9;
}
.example-modal .modal {
position: relative;
top: auto;
right: auto;
bottom: auto;
left: auto;
z-index: 1;
display: block;
}
.example-modal .modal .modal-dialog {
width: auto;
max-width: 600px;
margin: 15px auto;
}
.example-modal-top .center {
top: 0;
-webkit-transform: translate(-50%, 0px);
transform: translate(-50%, 0px);
}
.example-modal-bottom .center {
top: auto;
bottom: 0;
-webkit-transform: translate(-50%, 0px);
transform: translate(-50%, 0px);
}
.example-modal-sidebar .center {
top: 0;
right: 5px;
left: auto;
-webkit-transform: none;
transform: none;
}
.example-buttons .modal-footer .btn {
margin-right: 0;
margin-bottom: 0;
}
.color-selector > li {
margin-right: 20px;
margin-bottom: 11px;
}
@media (max-width: 767.98px) {
#examplePositionSidebar .modal-sidebar {
min-width: 260px;
}
}
.example-fill-in.example-well {
position: relative;
background-color: #fff;
border: 1px solid #e4eaec;
}
.example-fill-in.example-well:after {
content: "x";
position: absolute;
right: 10px;
top: 10px;
}

View File

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,301 @@
/*------------------------------------------------------------------
Project: Antler - Hosting Provider & WHMCS Template
Description: Antler Responsive Premium Template Designed for all web hosting providers
Author: inebur (Rúben Rodrigues)
Author URI: http://inebur.com/
Author Envato: https://themeforest.net/user/inebur
Copyright: 2021 inebur
Version: 2.4
* Dark Color Skin
-------------------------------------------------------------------*/
/* Dark Light */
svg #svg-ico {
fill: #4c555d;
}
svg #svg-concept {
stroke: #4c555d;
}
.golink {
color: #4c555d !important;
border-bottom: solid 1px #4c555d;
}
.golink:hover {
color: #4c555d !important;
}
.bg-pink {
background-color: #4c555d !important;
}
.c-pink {
color: #4c555d !important;
}
.bb-pink {
border-bottom: solid 1px #4c555d !important;
}
.popover {
border: solid 1px #4c555d;
}
.popover .arrow::before {
border-top-color: #4c555d;
}
.popover .popover-header {
background-color: #4c555d;
}
::selection {
background: #4c555d;
}
.nav-menu .main-menu > .menu-item > .sub-menu > .menu-item a:hover {
color: #4c555d;
}
.nav-menu
.main-menu
.menu-item
.menu-large
.service-list
.service
.media-body
a:hover {
color: #4c555d;
}
.megamenu .start-offer .inner {
background-color: #4c555d;
}
.megamenu .service-list .service.special .media-body a:hover {
color: #4c555d;
}
.megamenu .service-list .service .media-body a:hover {
color: #4c555d;
}
.megamenu-list .service-list .service .media-body a:hover {
color: #4c555d;
}
.team .wrapper:hover .team-info .desc {
color: #4c555d;
}
.wpc-cloud-range .noUi-connect {
background-color: #4c555d;
}
.wpc-cloud-range .noUi-tooltip:before {
border-color: #4c555d transparent transparent transparent;
}
.wpc-cloud-range .noUi-tooltip {
background-color: #4c555d;
}
.wpc-cloud-range .noUi-horizontal .noUi-handle {
background-color: #4c555d;
}
.wpc-vps-info .title .info {
color: #4c555d;
}
.fullrock .closer {
color: #4c555d !important;
}
.form-control:focus {
border: solid 1px #4c555d !important;
}
.sec-bg5 {
background-color: #4c555d;
}
.total-grad {
background: linear-gradient(-60deg, #4c555d 0%, #212529 100%) !important;
}
.total-grad-inverse {
background: linear-gradient(240deg, #212529 0%, #4c555d 100%);
}
.total-grad-pink-blue-intense {
background: linear-gradient(240deg, #3f004a 50%, #000000 100%);
}
.total-grad-pink-blue-intensee {
background: linear-gradient(-240deg, #3f004a 50%, #000000 100%);
}
.menu-wrap.fixed {
background: #33003b;
}
.btn-default-pink {
color: #4c555d;
border: 1px solid #4c555d;
}
.btn-default-pink:hover {
background-color: #4c555d;
}
.btn-default-grad-purple-fill {
background-image: linear-gradient(
to right,
#212529,
#4c555d 40%,
#4c555d 40%,
#212529
);
}
.btn-default-grad-purple-fill:hover {
background-image: linear-gradient(
to right,
#212529,
#4c555d 40%,
#4c555d 40%,
#212529
);
}
.btn-default-pink-fill {
background-color: #4c555d !important;
}
.owl-theme .owl-dots .owl-dot.active span {
border: solid 1px #4c555d !important;
}
.pricing .wrapper .title {
color: #4c555d;
}
.pricing .list-info {
background-color: #4c555d;
}
.slick #slider .plan-container .title {
color: #4c555d;
}
.tabs-header .btn-secondary:not(:disabled):not(.disabled).active {
background-color: #3e0048 !important;
}
.tabs.offers-tabs .tabs-header .active {
border-left: solid 2px #4c555d;
color: #4c555d;
}
.tabs.offers-tabs .tabs-header .active:hover {
color: #4c555d;
}
.fill-input:focus {
border-color: #4c555d !important;
}
.countdown .wrapper .clock div:first-child {
border: solid 1px #4c555d;
background-color: #4c555d;
}
.accordion.faq .panel-title.active {
border-bottom: solid 1px #4c555d;
}
.blog .sidebar .heading.active {
color: #4c555d;
}
.blog .sidebar .posts .tabs-header li.active {
color: #4c555d;
border-bottom-color: #4c555d;
}
.blog .sidebar .line.active:before {
background-color: #4c555d;
}
.blog .media .media-heading a:hover {
color: #4c555d;
}
.blog .wrap-blog .social-icon i {
color: #4c555d;
}
.blog .sidebar .categories .heading a.active {
color: #4c555d;
}
.blog .sidebar .categories .heading a:after {
color: #4c555d;
}
.blog .sidebar .categories .heading span {
color: #4c555d;
}
.circle-section .title-round {
color: #4c555d;
}
.domain-prices li {
color: #4c555d;
}
.maping .datacenters {
background: #4c555d;
}
.footer .soc-icons i {
color: #4c555d;
}
.included i {
color: #4c555d;
}
.soc-icons-apply span {
color: #4c555d;
}
.bigline {
border: solid 1px #4c555d;
}
.smallline {
border: solid 1px #4c555d;
}
.knowledge a {
color: #4c555d;
}
.godown span {
color: #4c555d;
}
.cd-filter-block input[type="radio"]:checked + label::before,
.cd-filter-block input[type="checkbox"]:checked + label::before {
border: none !important;
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
background: white !important;
}
.cd-filter-block select:hover {
border: solid 1px #4c555d !important;
}
.cd-filter-block input:focus,
.cd-filter-block select:focus {
border-color: #4c555d !important;
}
.range-slider-input::-webkit-slider-runnable-track {
background: #4c555d;
}
.range-slider-input::-webkit-slider-thumb {
background: #4c555d;
}
.zoo-content .icoo i {
background-color: #4c555d;
}
.services .service-wrap .pay img {
border: solid 1px #4c555d;
}
.page-item.active .page-link {
background-color: #4c555d !important;
border-color: #4c555d !important;
}
.cd-filter-block input.range-slider-input {
background-color: #3e0048 !important;
}
.range-slider-input::-webkit-slider-thumb {
background-color: #4c555d !important;
}
.range-slider-input::-moz-range-thumb {
background-color: #4c555d !important;
}
/* Dark Dark */
.bg-purple {
background-color: #212529 !important;
}
.c-purple {
color: #212529 !important;
}
.sec-grad-white-to-purple {
background: linear-gradient(90deg, #fff 70%, #212529 0%) !important;
}
.btn-default-purple {
color: #212529;
border: 1px solid #212529;
}
.btn-default-purple:hover {
background-color: #212529;
}
.btn-default-purple-fill {
background-color: #212529 !important;
}
.pricing .table .title {
color: #212529;
}
.accordion.faq .panel-title.active {
color: #212529 !important;
}
.wpc-vps-info .price-wrap .title {
background-color: #212529;
}
/* Custom Dark */
.megamenu .start-offer .inner .inner-content {
color: #efefef;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,781 @@
/* --------------------------------
Main Components
-------------------------------- */
.cd-header {
position: relative;
height: 150px;
background-color: #331d35;
}
.cd-header h1 {
color: #ffffff;
line-height: 150px;
text-align: center;
font-size: 2.4rem;
font-weight: 300;
}
@media only screen and (min-width: 1170px) {
.cd-header {
height: 180px;
}
.cd-header h1 {
line-height: 180px;
}
}
.cd-main-content:after {
content: "";
display: table;
clear: both;
}
.cd-main-content.is-fixed .cd-tab-filter-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
}
.cd-main-content.is-fixed .cd-gallery {
padding-top: 76px;
}
.cd-main-content.is-fixed .cd-filter {
position: fixed;
height: 100vh;
overflow: hidden;
}
.cd-main-content.is-fixed .cd-filter-trigger {
position: fixed;
}
@media only screen and (min-width: 768px) {
.cd-main-content.is-fixed .cd-gallery {
padding-top: 90px;
}
}
@media only screen and (min-width: 1170px) {
.cd-main-content.is-fixed .cd-gallery {
padding-top: 100px;
}
}
/* --------------------------------
xtab-filter
-------------------------------- */
.cd-tab-filter-wrapper {
background-color: #ffffff;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.08);
z-index: 1;
}
.cd-tab-filter-wrapper:after {
content: "";
display: table;
clear: both;
}
.cd-tab-filter {
/* tabbed navigation style on mobile - dropdown */
position: relative;
height: 50px;
width: 140px;
margin: 0 auto;
z-index: 1;
}
.cd-tab-filter::after {
/* small arrow icon */
content: "";
position: absolute;
right: 14px;
top: 50%;
bottom: auto;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
display: inline-block;
width: 16px;
height: 16px;
background: url("../img/filter/cd-icon-arrow.svg") no-repeat center center;
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
transition: all 0.3s;
pointer-events: none;
}
.cd-tab-filter ul {
position: absolute;
top: 0;
left: 0;
background-color: #ffffff;
box-shadow: inset 0 -2px 0 #a3d133;
}
.cd-tab-filter li {
display: none;
}
.cd-tab-filter li:first-child {
/* this way the placehodler is alway visible */
display: block;
}
.cd-tab-filter a {
display: block; /* set same size of the .cd-tab-filter */
height: 50px;
width: 140px;
line-height: 50px;
padding-left: 14px;
}
.cd-tab-filter a.selected {
background: #a3d133;
color: #ffffff;
}
.cd-tab-filter.is-open::after {
/* small arrow rotation */
-webkit-transform: translateY(-50%) rotate(-180deg);
-moz-transform: translateY(-50%) rotate(-180deg);
-ms-transform: translateY(-50%) rotate(-180deg);
-o-transform: translateY(-50%) rotate(-180deg);
transform: translateY(-50%) rotate(-180deg);
}
.cd-tab-filter.is-open ul {
box-shadow: inset 0 -2px 0 #a3d133, 0 2px 10px rgba(0, 0, 0, 0.2);
}
.cd-tab-filter.is-open ul li {
display: block;
}
.cd-tab-filter.is-open .placeholder a {
/* reduces the opacity of the placeholder on mobile when the menu is open */
opacity: 0.4;
}
@media only screen and (min-width: 768px) {
.cd-tab-filter {
/* tabbed navigation style on medium devices */
width: auto;
cursor: auto;
}
.cd-tab-filter::after {
/* hide the arrow */
display: none;
}
.cd-tab-filter ul {
background: transparent;
position: static;
box-shadow: none;
text-align: center;
}
.cd-tab-filter li {
display: inline-block;
}
.cd-tab-filter li.placeholder {
display: none !important;
}
.cd-tab-filter a {
display: inline-block;
padding: 0 1em;
width: auto;
color: #9a9a9a;
text-transform: uppercase;
font-weight: 700;
font-size: 1.3rem;
}
.no-touch .cd-tab-filter a:hover {
color: #a3d133;
}
.cd-tab-filter a.selected {
background: transparent;
color: #a3d133; /* create border bottom using box-shadow property */
box-shadow: inset 0 -2px 0 #a3d133;
}
.cd-tab-filter.is-open ul li {
display: inline-block;
}
}
@media only screen and (min-width: 1170px) {
.cd-tab-filter {
/* tabbed navigation on big devices */
width: 100%;
float: right;
margin: 0;
-webkit-transition: width 0.3s;
-moz-transition: width 0.3s;
transition: width 0.3s;
}
.cd-tab-filter.filter-is-visible {
/* reduce width when filter is visible */
width: 80%;
}
}
/* --------------------------------
xgallery
-------------------------------- */
.cd-gallery {
padding: 26px 5%;
width: 100%;
}
.cd-gallery li {
margin-bottom: 1.6em;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
display: none;
}
.cd-gallery li.gap {
/* used in combination with text-align: justify to align gallery elements */
opacity: 0;
height: 0;
display: inline-block;
}
.cd-gallery img {
display: block;
width: 100%;
}
.mixcontainer .cd-fail-message {
box-shadow: 0 5px 15px 0 rgba(110, 110, 110, 0.1);
border-radius: 15px;
background: #fff;
padding: 30px;
text-align: center;
display: none;
}
.mixcontainer .sec-main .cd-fail-message {
box-shadow: none;
padding: 30px 0px 0px 0px;
}
.mixitup-container-failed .cd-fail-message {
width: 100%;
display: inline-block !important;
}
@media (max-width: 767px) {
.mixitup-container-failed .cd-fail-message {
margin-bottom: 80px;
}
}
@media only screen and (min-width: 768px) {
.cd-gallery {
padding: 40px 3%;
}
.cd-gallery ul {
text-align: justify;
}
.cd-gallery ul:after {
content: "";
display: table;
clear: both;
}
.cd-gallery li {
width: 48%;
margin-bottom: 2em;
}
}
@media only screen and (min-width: 1170px) {
.cd-gallery {
padding: 50px 2%;
float: right;
-webkit-transition: width 0.3s;
-moz-transition: width 0.3s;
transition: width 0.3s;
}
.cd-gallery li {
width: 23%;
}
.cd-gallery.filter-is-visible {
/* reduce width when filter is visible */
width: 80%;
}
}
/* --------------------------------
xfilter
-------------------------------- */
.cd-filter {
position: absolute;
top: 0;
left: 0;
width: 280px;
background: #ffffff;
box-shadow: 4px 4px 20px transparent;
z-index: 2; /* Force Hardware Acceleration in WebKit */
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-transform: translateX(-100%);
-moz-transform: translateX(-100%);
-ms-transform: translateX(-100%);
-o-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-transition: -webkit-transform 0.3s, box-shadow 0.3s;
-moz-transition: -moz-transform 0.3s, box-shadow 0.3s;
transition: transform 0.3s, box-shadow 0.3s;
}
.cd-filter .cd-close {
position: absolute;
top: 0px;
right: 5px;
height: 45px;
line-height: 45px;
width: 45px;
color: #414142;
font-size: 1.3rem;
text-align: center;
background: #fed800;
opacity: 0;
font-size: 20px !important;
border-radius: 50px;
box-shadow: 3px 1px 5px rgba(0, 0, 0, 0.1);
-webkit-transition: opacity 0.3s;
-moz-transition: opacity 0.3s;
transition: opacity 0.3s;
z-index: 3;
}
.no-touch .cd-filter .cd-close:hover {
background: #32255f;
}
.cd-filter.filter-is-visible {
-webkit-transform: translateX(0);
-moz-transform: translateX(0);
-ms-transform: translateX(0);
-o-transform: translateX(0);
transform: translateX(0);
box-shadow: 4px 4px 20px rgba(0, 0, 0, 0.2);
}
.cd-filter.filter-is-visible .cd-close {
opacity: 1;
}
@media only screen and (min-width: 1170px) {
.cd-filter {
width: 20%;
}
.cd-filter form {
padding: 70px 10%;
}
}
.cd-filter-trigger {
position: absolute;
top: 0;
left: 0;
line-height: 50px;
width: 60px; /* image replacement */
overflow: hidden;
text-indent: 100%;
color: transparent;
white-space: nowrap;
z-index: 3;
}
.cd-filter-trigger.filter-is-visible {
pointer-events: none;
}
@media only screen and (min-width: 1170px) {
.cd-filter-trigger {
width: auto;
text-indent: 0;
color: #9a9a9a;
font-size: 1.3rem;
font-weight: 700;
padding-left: 24px;
background-position: left center;
-webkit-transition: color 0.3s;
-moz-transition: color 0.3s;
transition: color 0.3s;
}
.no-touch .cd-filter-trigger:hover {
color: #a3d133;
}
.cd-filter-trigger.filter-is-visible,
.cd-filter-trigger.filter-is-visible:hover {
color: #ffffff;
}
}
/* --------------------------------
xcustom form elements
-------------------------------- */
.cd-filter-block {
position: relative;
}
.cd-filter-block h4 {
/* filter block title */
position: relative;
margin-bottom: 5px;
padding: 10px 0 10px 20px;
color: #9a9a9a;
text-transform: uppercase;
font-weight: 700;
font-size: 1.3rem;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
cursor: pointer;
}
.no-touch .cd-filter-block h4:hover {
color: #a3d133;
}
.cd-filter-block h4::before {
/* arrow */
font-family: "Font Awesome 5 Free";
content: "\f107";
position: absolute;
left: 0;
top: 17px;
width: 16px;
height: 16px;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
-webkit-transition: -webkit-transform 0.3s;
-moz-transition: -moz-transform 0.3s;
transition: transform 0.3s;
}
.cd-filter-block h4.closed::before {
-webkit-transform: translateY(-50%) rotate(-90deg);
-moz-transform: translateY(-50%) rotate(-90deg);
-ms-transform: translateY(-50%) rotate(-90deg);
-o-transform: translateY(-50%) rotate(-90deg);
transform: translateY(-50%) rotate(-90deg);
}
.cd-filter-block input,
.cd-filter-block select,
.cd-filter-block .radio-label::before,
.cd-filter-block .checkbox-label::before {
/* shared style for input elements */
font-family: "Open Sans", sans-serif;
border-radius: 0;
background-color: #ffffff;
border: none;
}
.cd-filter-block input,
.cd-filter-block select {
width: 100%;
padding: 15px 60px 15px 30px;
border-radius: 50px;
font-size: 14px;
cursor: pointer;
background-color: #ffffff !important;
border: solid 1px #fcb813 !important;
-webkit-appearance: none;
-moz-appearance: none;
-ms-appearance: none;
-o-appearance: none;
appearance: none;
box-shadow: none;
}
.cd-filter-block input:hover,
.cd-filter-block select:hover {
-webkit-transition: 0.3s;
-moz-transition: 0.3s;
-ms-transition: 0.3s;
-o-transition: 0.3s;
transition: 0.3s;
}
.cd-filter-block label i {
font-size: 20px;
color: #d8d8d8;
top: 42px;
right: 40px;
position: absolute;
}
.cd-filter-block input:focus,
.cd-filter-block select:focus {
outline: none;
background-color: #ffffff;
}
.cd-filter-block input {
/* custom style for the search element */
border-color: transparent;
background-color: #e6e6e6; /* prevent jump - ios devices */
}
.cd-filter-block input::-webkit-search-cancel-button {
display: none;
}
.cd-filter-block .cd-select {
/* select element wrapper */
position: relative;
}
.cd-filter-block .cd-select::after {
/* switcher arrow for select element */
content: "";
position: absolute;
z-index: 1;
right: 30px;
top: 27px;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
display: block;
width: 16px;
height: 16px;
background: url("../img/filter/cd-icon-arrow.svg") no-repeat center center;
pointer-events: none;
}
.cd-filter-block select::-ms-expand {
display: none;
}
.cd-filter-block .list li {
position: relative;
margin-bottom: 0.8em;
}
.cd-filter-block .list li:last-of-type {
margin-bottom: 0;
list-style: none;
}
.cd-filter-block input[type="radio"],
.cd-filter-block input[type="checkbox"] {
/* hide original check and radio buttons */
position: absolute;
left: 0;
top: 0;
margin: 0;
padding: 0;
opacity: 0;
z-index: 2;
}
.cd-filter-block .checkbox-label,
.cd-filter-block .radio-label {
padding-left: 24px;
font-size: 1.4rem;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.cd-filter-block .checkbox-label::before,
.cd-filter-block .checkbox-label::after,
.cd-filter-block .radio-label::before,
.cd-filter-block .radio-label::after {
/* custom radio and check boxes */
content: "";
display: block;
position: absolute;
top: 50%;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
.cd-filter-block .checkbox-label::before,
.cd-filter-block .radio-label::before {
width: 19px;
height: 18px;
margin-left: 0;
}
.cd-filter-block .checkbox-label::after,
.cd-filter-block .radio-label::after {
/* check mark - hidden */
display: none;
}
.cd-filter-block .checkbox-label::after {
/* check mark style for check boxes */
width: 16px;
height: 16px;
/* background: url("../img/filter/cd-icon-check.svg") no-repeat center center; */
}
.cd-filter-block .radio-label::before,
.cd-filter-block .radio-label::after {
border-radius: 50%;
}
.cd-filter-block .radio-label::after {
/* check mark style for radio buttons */
width: 10px;
height: 10px;
background: linear-gradient(0deg, #fcb813 45.31%, #fcdb26 100%) !important;
left: 5px;
border: 2px solid black;
}
.cd-filter-block input[type="radio"]:checked + label::before,
.cd-filter-block input[type="checkbox"]:checked + label::before {
border-color: #a3d133;
background-color: #a3d133;
}
.cd-filter-block input[type="radio"]:checked + label::after,
.cd-filter-block input[type="checkbox"]:checked + label::after {
display: block;
/* background-color: red; */
}
#ex1Slider .slider-selection {
background: #bababa;
}
.tooltip.in {
filter: alpha(opacity=90);
opacity: 0.9;
}
.tooltip.top .tooltip-arrow {
bottom: -5px;
left: 50%;
margin-left: -5px;
border-width: 5px 5px 0;
border-top-color: #000;
}
.tooltip-arrow {
position: absolute;
width: 0;
height: 0;
}
ol,
ul {
list-style: none;
}
blockquote,
q {
quotes: none;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: "";
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
/* --------------------------------
Custom
-------------------------------- */
.cd-gallery {
padding: 50px 0px 0px 0px;
}
.cd-gallery li {
box-shadow: none;
}
.cd-gallery .wrapper .title {
font-size: 18px;
font-family: "Open Sans";
}
.cd-gallery.domains .wrapper .title {
font-size: 32px;
font-family: "Open Sans";
}
.cd-tab-filter a.selected {
border: none !important;
background: #fdd700 !important;
color: #fff !important;
box-shadow: none !important;
}
.cd-tab-filter a.selected:hover {
text-transform: none !important;
text-decoration: none !important;
}
.cd-tab-filter a {
text-transform: none;
font-size: 15px !important;
font-family: "Open Sans";
color: #808080;
}
.no-touch .cd-tab-filter a:hover {
text-decoration: none !important;
}
.no-touch .cd-filter .cd-close:hover {
background-color: #313131 !important;
text-decoration: none !important;
-webkit-transition: 0.3s;
-moz-transition: 0.3s;
-ms-transition: 0.3s;
-o-transition: 0.3s;
transition: 0.3s;
}
.cd-filter.filter-is-visible {
font-family: "Open Sans";
box-shadow: 2px 1px 10px rgba(0, 0, 0, 0.1);
}
.cd-filter-block h4 {
text-transform: capitalize !important;
font-weight: 600 !important;
font-size: 16px !important;
color: #212122 !important;
}
.cd-filter-block .cd-filter-content input[type="search"] {
border: solid 1px #e0e0e0;
font-size: 14px !important;
background: transparent;
}
.cd-filter-block .cd-filter-content {
padding: 0px;
}
.cd-filter-block .checkbox-label::before,
.cd-filter-block .radio-label::before {
border: none;
box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
}
.cd-filter-block .checkbox-label,
.cd-filter-block .radio-label {
position: relative;
display: grid !important;
font-size: 16px !important;
color: #000;
}
.action-content {
position: relative;
}
.action {
bottom: 0;
right: 0;
top: 0 !important;
left: 0;
position: absolute;
display: inline-block;
height: 100%;
border-radius: 15px;
background: rgba(0, 0, 0, 0.7);
top: 0px;
text-align: center;
opacity: 0;
transition: all 0.3s;
z-index: 1;
}
.action:hover {
opacity: 1;
}
.action a {
margin-right: 20px;
font-size: 16px;
color: #fff;
}
.action a:last-child {
margin-right: 0px;
}
.action a:hover {
color: #fdd700;
text-decoration: none;
}
.action a i {
color: #fff;
font-size: 32px;
padding: 0px;
}
.action a i:hover {
color: #fdd700;
text-decoration: none;
-webkit-transition: 0.3s;
-moz-transition: 0.3s;
-ms-transition: 0.3s;
-o-transition: 0.3s;
transition: 0.3s;
}
.action .metatag {
position: relative;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
}
.action .rating {
font-size: 24px;
padding-top: 15px;
width: 100%;
}
.action .rating i {
font-size: 18px;
color: #808080;
padding: 2px;
}
.action .rating i:hover {
color: #fdd700;
text-decoration: none;
-webkit-transition: 0.3s;
-moz-transition: 0.3s;
-ms-transition: 0.3s;
-o-transition: 0.3s;
transition: 0.3s;
}

6319
static/felcloud/website/css/style.min.css vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,532 @@
/**
* Swiper 5.1.0
* Most modern mobile touch slider and framework with hardware accelerated transitions
* http://swiperjs.com
* Copyright 2014-2019 Vladimir Kharlampidi
* Released under the MIT License
* Released on: October 16, 2019
*/
@font-face {
font-family: swiper-icons;
src: url("data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA")
format("woff");
font-weight: 400;
font-style: normal;
}
:root {
--swiper-theme-color: #007aff;
}
.swiper-container {
margin-left: auto;
margin-right: auto;
position: relative;
overflow: hidden;
list-style: none;
padding: 0;
z-index: 1;
}
.swiper-container-vertical > .swiper-wrapper {
flex-direction: column;
}
.swiper-wrapper {
position: relative;
width: 100%;
height: 100%;
z-index: 1;
display: flex;
transition-property: transform;
box-sizing: content-box;
}
.swiper-container-android .swiper-slide,
.swiper-wrapper {
transform: translate3d(0px, 0, 0);
}
.swiper-container-multirow > .swiper-wrapper {
flex-wrap: wrap;
}
.swiper-container-multirow-column > .swiper-wrapper {
flex-wrap: wrap;
flex-direction: column;
}
.swiper-container-free-mode > .swiper-wrapper {
transition-timing-function: ease-out;
margin: 0 auto;
}
.swiper-slide {
flex-shrink: 0;
width: 100%;
height: 100%;
position: relative;
transition-property: transform;
}
.swiper-slide-invisible-blank {
visibility: hidden;
}
.swiper-container-autoheight,
.swiper-container-autoheight .swiper-slide {
height: auto;
}
.swiper-container-autoheight .swiper-wrapper {
align-items: flex-start;
transition-property: transform, height;
}
.swiper-container-3d {
perspective: 1200px;
}
.swiper-container-3d .swiper-cube-shadow,
.swiper-container-3d .swiper-slide,
.swiper-container-3d .swiper-slide-shadow-bottom,
.swiper-container-3d .swiper-slide-shadow-left,
.swiper-container-3d .swiper-slide-shadow-right,
.swiper-container-3d .swiper-slide-shadow-top,
.swiper-container-3d .swiper-wrapper {
transform-style: preserve-3d;
}
.swiper-container-3d .swiper-slide-shadow-bottom,
.swiper-container-3d .swiper-slide-shadow-left,
.swiper-container-3d .swiper-slide-shadow-right,
.swiper-container-3d .swiper-slide-shadow-top {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 10;
}
.swiper-container-3d .swiper-slide-shadow-left {
background-image: linear-gradient(
to left,
rgba(0, 0, 0, 0.5),
rgba(0, 0, 0, 0)
);
}
.swiper-container-3d .swiper-slide-shadow-right {
background-image: linear-gradient(
to right,
rgba(0, 0, 0, 0.5),
rgba(0, 0, 0, 0)
);
}
.swiper-container-3d .swiper-slide-shadow-top {
background-image: linear-gradient(
to top,
rgba(0, 0, 0, 0.5),
rgba(0, 0, 0, 0)
);
}
.swiper-container-3d .swiper-slide-shadow-bottom {
background-image: linear-gradient(
to bottom,
rgba(0, 0, 0, 0.5),
rgba(0, 0, 0, 0)
);
}
.swiper-container-css-mode > .swiper-wrapper {
overflow: auto;
scrollbar-width: none;
-ms-overflow-style: none;
}
.swiper-container-css-mode > .swiper-wrapper::-webkit-scrollbar {
display: none;
}
.swiper-container-css-mode > .swiper-wrapper > .swiper-slide {
scroll-snap-align: start start;
}
.swiper-container-horizontal.swiper-container-css-mode > .swiper-wrapper {
scroll-snap-type: x mandatory;
}
.swiper-container-vertical.swiper-container-css-mode > .swiper-wrapper {
scroll-snap-type: y mandatory;
}
:root {
--swiper-navigation-size: 44px;
}
.swiper-button-next,
.swiper-button-prev {
position: absolute;
top: 50%;
width: calc(var(--swiper-navigation-size) / 44 * 27);
height: var(--swiper-navigation-size);
margin-top: calc(-1 * var(--swiper-navigation-size) / 2);
z-index: 10;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
color: var(--swiper-navigation-color, var(--swiper-theme-color));
}
.swiper-button-next.swiper-button-disabled,
.swiper-button-prev.swiper-button-disabled {
opacity: 0.35;
cursor: auto;
pointer-events: none;
}
.swiper-button-next:after,
.swiper-button-prev:after {
font-family: swiper-icons;
font-size: var(--swiper-navigation-size);
text-transform: none !important;
}
.swiper-button-prev,
.swiper-container-rtl .swiper-button-next {
left: 10px;
right: auto;
}
.swiper-button-prev:after,
.swiper-container-rtl .swiper-button-next:after {
content: "prev";
}
.swiper-button-next,
.swiper-container-rtl .swiper-button-prev {
right: 10px;
left: auto;
}
.swiper-button-next:after,
.swiper-container-rtl .swiper-button-prev:after {
content: "next";
}
.swiper-button-next.swiper-button-white,
.swiper-button-prev.swiper-button-white {
--swiper-navigation-color: #ffffff;
}
.swiper-button-next.swiper-button-black,
.swiper-button-prev.swiper-button-black {
--swiper-navigation-color: #000000;
}
.swiper-button-lock {
display: none;
}
.swiper-pagination {
position: absolute;
text-align: center;
transition: 0.3s opacity;
transform: translate3d(0, 0, 0);
z-index: 10;
}
.swiper-pagination.swiper-pagination-hidden {
opacity: 0;
}
.swiper-container-horizontal > .swiper-pagination-bullets,
.swiper-pagination-custom,
.swiper-pagination-fraction {
bottom: 10px;
left: 0;
width: 100%;
}
.swiper-pagination-bullets-dynamic {
overflow: hidden;
font-size: 0;
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {
transform: scale(0.33);
position: relative;
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active {
transform: scale(1);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main {
transform: scale(1);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev {
transform: scale(0.66);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev {
transform: scale(0.33);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next {
transform: scale(0.66);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next {
transform: scale(0.33);
}
.swiper-pagination-bullet {
width: 8px;
height: 8px;
display: inline-block;
border-radius: 100%;
background: #000;
opacity: 0.2;
}
button.swiper-pagination-bullet {
border: none;
margin: 0;
padding: 0;
box-shadow: none;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
.swiper-pagination-clickable .swiper-pagination-bullet {
cursor: pointer;
}
.swiper-pagination-bullet-active {
opacity: 1;
background: var(--swiper-pagination-color, var(--swiper-theme-color));
}
.swiper-container-vertical > .swiper-pagination-bullets {
right: 10px;
top: 50%;
transform: translate3d(0px, -50%, 0);
}
.swiper-container-vertical
> .swiper-pagination-bullets
.swiper-pagination-bullet {
margin: 6px 0;
display: block;
}
.swiper-container-vertical
> .swiper-pagination-bullets.swiper-pagination-bullets-dynamic {
top: 50%;
transform: translateY(-50%);
width: 8px;
}
.swiper-container-vertical
> .swiper-pagination-bullets.swiper-pagination-bullets-dynamic
.swiper-pagination-bullet {
display: inline-block;
transition: 0.2s transform, 0.2s top;
}
.swiper-container-horizontal
> .swiper-pagination-bullets
.swiper-pagination-bullet {
margin: 0 4px;
}
.swiper-container-horizontal
> .swiper-pagination-bullets.swiper-pagination-bullets-dynamic {
left: 50%;
transform: translateX(-50%);
white-space: nowrap;
}
.swiper-container-horizontal
> .swiper-pagination-bullets.swiper-pagination-bullets-dynamic
.swiper-pagination-bullet {
transition: 0.2s transform, 0.2s left;
}
.swiper-container-horizontal.swiper-container-rtl
> .swiper-pagination-bullets-dynamic
.swiper-pagination-bullet {
transition: 0.2s transform, 0.2s right;
}
.swiper-pagination-progressbar {
background: rgba(0, 0, 0, 0.25);
position: absolute;
}
.swiper-pagination-progressbar .swiper-pagination-progressbar-fill {
background: var(--swiper-pagination-color, var(--swiper-theme-color));
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
transform: scale(0);
transform-origin: left top;
}
.swiper-container-rtl
.swiper-pagination-progressbar
.swiper-pagination-progressbar-fill {
transform-origin: right top;
}
.swiper-container-horizontal > .swiper-pagination-progressbar,
.swiper-container-vertical
> .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite {
width: 100%;
height: 4px;
left: 0;
top: 0;
}
.swiper-container-horizontal
> .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,
.swiper-container-vertical > .swiper-pagination-progressbar {
width: 4px;
height: 100%;
left: 0;
top: 0;
}
.swiper-pagination-white {
--swiper-pagination-color: #ffffff;
}
.swiper-pagination-black {
--swiper-pagination-color: #000000;
}
.swiper-pagination-lock {
display: none;
}
.swiper-scrollbar {
border-radius: 10px;
position: relative;
-ms-touch-action: none;
background: rgba(0, 0, 0, 0.1);
}
.swiper-container-horizontal > .swiper-scrollbar {
position: absolute;
left: 1%;
bottom: 3px;
z-index: 50;
height: 5px;
width: 98%;
}
.swiper-container-vertical > .swiper-scrollbar {
position: absolute;
right: 3px;
top: 1%;
z-index: 50;
width: 5px;
height: 98%;
}
.swiper-scrollbar-drag {
height: 100%;
width: 100%;
position: relative;
background: rgba(0, 0, 0, 0.5);
border-radius: 10px;
left: 0;
top: 0;
}
.swiper-scrollbar-cursor-drag {
cursor: move;
}
.swiper-scrollbar-lock {
display: none;
}
.swiper-zoom-container {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
}
.swiper-zoom-container > canvas,
.swiper-zoom-container > img,
.swiper-zoom-container > svg {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
.swiper-slide-zoomed {
cursor: move;
}
.swiper-lazy-preloader {
width: 42px;
height: 42px;
position: absolute;
left: 50%;
top: 50%;
margin-left: -21px;
margin-top: -21px;
z-index: 10;
transform-origin: 50%;
animation: swiper-preloader-spin 1s infinite linear;
box-sizing: border-box;
border: 4px solid var(--swiper-preloader-color, var(--swiper-theme-color));
border-radius: 50%;
border-top-color: transparent;
}
.swiper-lazy-preloader-white {
--swiper-preloader-color: #fff;
}
.swiper-lazy-preloader-black {
--swiper-preloader-color: #000;
}
@keyframes swiper-preloader-spin {
100% {
transform: rotate(360deg);
}
}
.swiper-container .swiper-notification {
position: absolute;
left: 0;
top: 0;
pointer-events: none;
opacity: 0;
z-index: -1000;
}
.swiper-container-fade.swiper-container-free-mode .swiper-slide {
transition-timing-function: ease-out;
}
.swiper-container-fade .swiper-slide {
pointer-events: none;
transition-property: opacity;
}
.swiper-container-fade .swiper-slide .swiper-slide {
pointer-events: none;
}
.swiper-container-fade .swiper-slide-active,
.swiper-container-fade .swiper-slide-active .swiper-slide-active {
pointer-events: auto;
}
.swiper-container-cube {
overflow: visible;
}
.swiper-container-cube .swiper-slide {
pointer-events: none;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
z-index: 1;
visibility: hidden;
transform-origin: 0 0;
width: 100%;
height: 100%;
}
.swiper-container-cube .swiper-slide .swiper-slide {
pointer-events: none;
}
.swiper-container-cube.swiper-container-rtl .swiper-slide {
transform-origin: 100% 0;
}
.swiper-container-cube .swiper-slide-active,
.swiper-container-cube .swiper-slide-active .swiper-slide-active {
pointer-events: auto;
}
.swiper-container-cube .swiper-slide-active,
.swiper-container-cube .swiper-slide-next,
.swiper-container-cube .swiper-slide-next + .swiper-slide,
.swiper-container-cube .swiper-slide-prev {
pointer-events: auto;
visibility: visible;
}
.swiper-container-cube .swiper-slide-shadow-bottom,
.swiper-container-cube .swiper-slide-shadow-left,
.swiper-container-cube .swiper-slide-shadow-right,
.swiper-container-cube .swiper-slide-shadow-top {
z-index: 0;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.swiper-container-cube .swiper-cube-shadow {
position: absolute;
left: 0;
bottom: 0px;
width: 100%;
height: 100%;
background: #000;
opacity: 0.6;
-webkit-filter: blur(50px);
filter: blur(50px);
z-index: 0;
}
.swiper-container-flip {
overflow: visible;
}
.swiper-container-flip .swiper-slide {
pointer-events: none;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
z-index: 1;
}
.swiper-container-flip .swiper-slide .swiper-slide {
pointer-events: none;
}
.swiper-container-flip .swiper-slide-active,
.swiper-container-flip .swiper-slide-active .swiper-slide-active {
pointer-events: auto;
}
.swiper-container-flip .swiper-slide-shadow-bottom,
.swiper-container-flip .swiper-slide-shadow-left,
.swiper-container-flip .swiper-slide-shadow-right,
.swiper-container-flip .swiper-slide-shadow-top {
z-index: 0;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}

View File

@ -0,0 +1,304 @@
@font-face { font-family: 'Cloudicon'; src: url('../../fonts/cloudicon/Cloudicon.eot?h7rmut'); src: url('../../fonts/cloudicon/Cloudicon.eot?h7rmut#iefix') format('embedded-opentype'), url('../../fonts/cloudicon/Cloudicon.ttf?h7rmut') format('truetype'), url('../../fonts/cloudicon/Cloudicon.woff?h7rmut') format('woff'), url('../../fonts/cloudicon/Cloudicon.svg?h7rmut#Cloudicon') format('svg'); font-weight: normal; font-style: normal; }
[Cloudicon]:before { font-family: 'Cloudicon'; content: attr(Cloudicon); speak: none; }
[class^="icon-"], [class*=" icon-"] { /* use !important to prevent issues with browser extensions that change fonts */
font-family: 'Cloudicon' !important; color: #808080; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
.icon-add:before { content: "\e900"; }
.icon-aid:before { content: "\e901"; }
.icon-alarm:before { content: "\e902"; }
.icon-alert:before { content: "\e903"; }
.icon-alpha:before { content: "\e904"; }
.icon-analytics:before { content: "\e905"; }
.icon-android:before { content: "\e906"; }
.icon-apple:before { content: "\e907"; }
.icon-audio:before { content: "\e908"; }
.icon-award:before { content: "\e909"; }
.icon-ballon:before { content: "\e90a"; }
.icon-basketshop:before { content: "\e90b"; }
.icon-battery:before { content: "\e90c"; }
.icon-bell:before { content: "\e90d"; }
.icon-bitcoin:before { content: "\e90e"; }
.icon-blog:before { content: "\e90f"; }
.icon-bluetooth:before { content: "\e910"; }
.icon-book:before { content: "\e911"; }
.icon-bookmark:before { content: "\e912"; }
.icon-branch:before { content: "\e913"; }
.icon-briefcase:before { content: "\e914"; }
.icon-browser:before { content: "\e915"; }
.icon-brush:before { content: "\e916"; }
.icon-bubble:before { content: "\e917"; }
.icon-builder:before { content: "\e918"; }
.icon-bulb:before { content: "\e919"; }
.icon-businesman:before { content: "\e91a"; }
.icon-calendar:before { content: "\e91b"; }
.icon-card:before { content: "\e91c"; }
.icon-cart:before { content: "\e91d"; }
.icon-cartdown:before { content: "\e91e"; }
.icon-cartnull:before { content: "\e91f"; }
.icon-cartup:before { content: "\e920"; }
.icon-cctv:before { content: "\e921"; }
.icon-center:before { content: "\e922"; }
.icon-ceo:before { content: "\e923"; }
.icon-chart:before { content: "\e924"; }
.icon-check:before { content: "\e925"; }
.icon-clip:before { content: "\e926"; }
.icon-clock:before { content: "\e927"; }
.icon-close:before { content: "\e928"; }
.icon-cloud:before { content: "\e929"; }
.icon-cloudconnect:before { content: "\e92a"; }
.icon-cloudfast:before { content: "\e92b"; }
.icon-cloudfiber:before { content: "\e92c"; }
.icon-cloudlinux:before { content: "\e92d"; }
.icon-cloudmanaged:before { content: "\e92e"; }
.icon-cloudown:before { content: "\e92f"; }
.icon-cloudowner:before { content: "\e930"; }
.icon-cloudsecurity:before { content: "\e931"; }
.icon-cloudserver:before { content: "\e932"; }
.icon-cloudup:before { content: "\e933"; }
.icon-cloudwindows:before { content: "\e934"; }
.icon-cluster:before { content: "\e935"; }
.icon-code:before { content: "\e936"; }
.icon-coffe:before { content: "\e937"; }
.icon-color:before { content: "\e938"; }
.icon-compare:before { content: "\e939"; }
.icon-compass:before { content: "\e93a"; }
.icon-container:before { content: "\e93b"; }
.icon-coupon:before { content: "\e93c"; }
.icon-cpu:before { content: "\e93d"; }
.icon-crown:before { content: "\e93e"; }
.icon-danger:before { content: "\e93f"; }
.icon-database:before { content: "\e940"; }
.icon-dedicated:before { content: "\e941"; }
.icon-delete:before { content: "\e942"; }
.icon-designed:before { content: "\e943"; }
.icon-desktop:before { content: "\e944"; }
.icon-device:before { content: "\e945"; }
.icon-diagram:before { content: "\e946"; }
.icon-diamond:before { content: "\e947"; }
.icon-direction:before { content: "\e948"; }
.icon-directions:before { content: "\e949"; }
.icon-disabled:before { content: "\e94a"; }
.icon-diskette:before { content: "\e94b"; }
.icon-display:before { content: "\e94c"; }
.icon-docbox:before { content: "\e94d"; }
.icon-document:before { content: "\e94e"; }
.icon-dollar:before { content: "\e94f"; }
.icon-domains:before { content: "\e950"; }
.icon-domainserver:before { content: "\e951"; }
.icon-doubleleft:before { content: "\e952"; }
.icon-doubleright:before { content: "\e953"; }
.icon-download:before { content: "\e954"; }
.icon-dribbble:before { content: "\e955"; }
.icon-drink:before { content: "\e956"; }
.icon-drives:before { content: "\e957"; }
.icon-drivessd:before { content: "\e958"; }
.icon-drone:before { content: "\e959"; }
.icon-drop:before { content: "\e95a"; }
.icon-dropbox:before { content: "\e95b"; }
.icon-duality:before { content: "\e95c"; }
.icon-dvd:before { content: "\e95d"; }
.icon-eco:before { content: "\e95e"; }
.icon-ecommerce:before { content: "\e95f"; }
.icon-editable:before { content: "\e960"; }
.icon-email:before { content: "\e961"; }
.icon-emailopen:before { content: "\e962"; }
.icon-empty:before { content: "\e963"; }
.icon-energy:before { content: "\e964"; }
.icon-euro:before { content: "\e965"; }
.icon-eye:before { content: "\e966"; }
.icon-facebook:before { content: "\e967"; }
.icon-factory:before { content: "\e968"; }
.icon-favorite:before { content: "\e969"; }
.icon-features:before { content: "\e96a"; }
.icon-female:before { content: "\e96b"; }
.icon-filter:before { content: "\e96c"; }
.icon-financial:before { content: "\e96d"; }
.icon-firewall:before { content: "\e96e"; }
.icon-flagpoint:before { content: "\e96f"; }
.icon-flash:before { content: "\e970"; }
.icon-folder:before { content: "\e971"; }
.icon-free:before { content: "\e972"; }
.icon-freenetwork:before { content: "\e973"; }
.icon-frequency:before { content: "\e974"; }
.icon-full:before { content: "\e975"; }
.icon-fullscreen:before { content: "\e976"; }
.icon-gaming:before { content: "\e977"; }
.icon-gift:before { content: "\e978"; }
.icon-git:before { content: "\e979"; }
.icon-github:before { content: "\e97a"; }
.icon-glasses:before { content: "\e97b"; }
.icon-global:before { content: "\e97c"; }
.icon-globe:before { content: "\e97d"; }
.icon-goal:before { content: "\e97e"; }
.icon-googleplus:before { content: "\e97f"; }
.icon-graduation:before { content: "\e980"; }
.icon-grow:before { content: "\e981"; }
.icon-hand:before { content: "\e982"; }
.icon-hat:before { content: "\e983"; }
.icon-headphones:before { content: "\e984"; }
.icon-helpdesk:before { content: "\e985"; }
.icon-hierarchy:before { content: "\e986"; }
.icon-house:before { content: "\e987"; }
.icon-housebird:before { content: "\e988"; }
.icon-html5:before { content: "\e989"; }
.icon-inbox:before { content: "\e98a"; }
.icon-index:before { content: "\e98b"; }
.icon-indicateleft:before { content: "\e98c"; }
.icon-indicateright:before { content: "\e98d"; }
.icon-infrastructure:before { content: "\e98e"; }
.icon-Instagram:before { content: "\e98f"; }
.icon-interface:before { content: "\e990"; }
.icon-internet:before { content: "\e991"; }
.icon-inverse:before { content: "\e992"; }
.icon-key:before { content: "\e993"; }
.icon-label:before { content: "\e994"; }
.icon-laptop:before { content: "\e995"; }
.icon-latency:before { content: "\e996"; }
.icon-law:before { content: "\e997"; }
.icon-layers:before { content: "\e998"; }
.icon-learning:before { content: "\e999"; }
.icon-led:before { content: "\e99a"; }
.icon-left:before { content: "\e99b"; }
.icon-less:before { content: "\e99c"; }
.icon-link:before { content: "\e99d"; }
.icon-linkedin:before { content: "\e99e"; }
.icon-linux:before { content: "\e99f"; }
.icon-linuxserver:before { content: "\e9a0"; }
.icon-livechat:before { content: "\e9a1"; }
.icon-location:before { content: "\e9a2"; }
.icon-lock:before { content: "\e9a3"; }
.icon-log:before { content: "\e9a4"; }
.icon-magnetic:before { content: "\e9a5"; }
.icon-mailbox:before { content: "\e9a6"; }
.icon-maintenance:before { content: "\e9a7"; }
.icon-man:before { content: "\e9a8"; }
.icon-managedserver:before { content: "\e9a9"; }
.icon-map:before { content: "\e9aa"; }
.icon-medal:before { content: "\e9ab"; }
.icon-meeting:before { content: "\e9ac"; }
.icon-megaphone:before { content: "\e9ad"; }
.icon-menu:before { content: "\e9ae"; }
.icon-metric:before { content: "\e9af"; }
.icon-mobile:before { content: "\e9b0"; }
.icon-money:before { content: "\e9b1"; }
.icon-monitor:before { content: "\e9b2"; }
.icon-mouse:before { content: "\e9b3"; }
.icon-move:before { content: "\e9b4"; }
.icon-movie:before { content: "\e9b5"; }
.icon-music:before { content: "\e9b6"; }
.icon-mute:before { content: "\e9b7"; }
.icon-navigation:before { content: "\e9b8"; }
.icon-network:before { content: "\e9b9"; }
.icon-notes:before { content: "\e9ba"; }
.icon-objective:before { content: "\e9bb"; }
.icon-on:before { content: "\e9bc"; }
.icon-pacman:before { content: "\e9bd"; }
.icon-paper:before { content: "\e9be"; }
.icon-paypal:before { content: "\e9bf"; }
.icon-phone:before { content: "\e9c0"; }
.icon-pic:before { content: "\e9c1"; }
.icon-pin:before { content: "\e9c2"; }
.icon-pinterest:before { content: "\e9c3"; }
.icon-placard:before { content: "\e9c4"; }
.icon-plane:before { content: "\e9c5"; }
.icon-play:before { content: "\e9c6"; }
.icon-playstore:before { content: "\e9c7"; }
.icon-plug:before { content: "\e9c8"; }
.icon-plus:before { content: "\e9c9"; }
.icon-point:before { content: "\e9ca"; }
.icon-points:before { content: "\e9cb"; }
.icon-pound:before { content: "\e9cc"; }
.icon-preferences:before { content: "\e9cd"; }
.icon-print:before { content: "\e9ce"; }
.icon-privacy:before { content: "\e9cf"; }
.icon-private:before { content: "\e9d0"; }
.icon-progress:before { content: "\e9d1"; }
.icon-protected:before { content: "\e9d2"; }
.icon-protection:before { content: "\e9d3"; }
.icon-qrcode:before { content: "\e9d4"; }
.icon-question:before { content: "\e9d5"; }
.icon-rack:before { content: "\e9d6"; }
.icon-ram:before { content: "\e9d7"; }
.icon-random:before { content: "\e9d8"; }
.icon-rate:before { content: "\e9d9"; }
.icon-recycle:before { content: "\e9da"; }
.icon-redundancy:before { content: "\e9db"; }
.icon-refresh:before { content: "\e9dc"; }
.icon-regression:before { content: "\e9dd"; }
.icon-reload:before { content: "\e9de"; }
.icon-repair:before { content: "\e9df"; }
.icon-report:before { content: "\e9e0"; }
.icon-reseller:before { content: "\e9e1"; }
.icon-resize:before { content: "\e9e2"; }
.icon-ribbon:before { content: "\e9e3"; }
.icon-right:before { content: "\e9e4"; }
.icon-robot:before { content: "\e9e5"; }
.icon-router:before { content: "\e9e6"; }
.icon-sad:before { content: "\e9e7"; }
.icon-savings:before { content: "\e9e8"; }
.icon-science:before { content: "\e9e9"; }
.icon-security:before { content: "\e9ea"; }
.icon-select:before { content: "\e9eb"; }
.icon-servers:before { content: "\e9ec"; }
.icon-settings:before { content: "\e9ed"; }
.icon-shared:before { content: "\e9ee"; }
.icon-shipping:before { content: "\e9ef"; }
.icon-shop:before { content: "\e9f0"; }
.icon-sinal:before { content: "\e9f1"; }
.icon-smile:before { content: "\e9f2"; }
.icon-snapchat:before { content: "\e9f3"; }
.icon-solid:before { content: "\e9f4"; }
.icon-solution:before { content: "\e9f5"; }
.icon-spam:before { content: "\e9f6"; }
.icon-speed:before { content: "\e9f7"; }
.icon-stable:before { content: "\e9f8"; }
.icon-star:before { content: "\e9f9"; }
.icon-statuette:before { content: "\e9fa"; }
.icon-strategy:before { content: "\e9fb"; }
.icon-stream:before { content: "\e9fc"; }
.icon-structure:before { content: "\e9fd"; }
.icon-sun:before { content: "\e9fe"; }
.icon-support:before { content: "\e9ff"; }
.icon-surprise:before { content: "\ea00"; }
.icon-switch:before { content: "\ea01"; }
.icon-sync:before { content: "\ea02"; }
.icon-tablet:before { content: "\ea03"; }
.icon-tag:before { content: "\ea04"; }
.icon-talk:before { content: "\ea05"; }
.icon-target:before { content: "\ea06"; }
.icon-tea:before { content: "\ea07"; }
.icon-technology:before { content: "\ea08"; }
.icon-telescope:before { content: "\ea09"; }
.icon-thumbdown:before { content: "\ea0a"; }
.icon-thumbup:before { content: "\ea0b"; }
.icon-ticket:before { content: "\ea0c"; }
.icon-time:before { content: "\ea0d"; }
.icon-timer:before { content: "\ea0e"; }
.icon-tools:before { content: "\ea0f"; }
.icon-toxic:before { content: "\ea10"; }
.icon-twitter:before { content: "\ea11"; }
.icon-umbrella:before { content: "\ea12"; }
.icon-unlock:before { content: "\ea13"; }
.icon-upgrade:before { content: "\ea14"; }
.icon-upload:before { content: "\ea15"; }
.icon-ups:before { content: "\ea16"; }
.icon-usb:before { content: "\ea17"; }
.icon-user:before { content: "\ea18"; }
.icon-vault:before { content: "\ea19"; }
.icon-video:before { content: "\ea1a"; }
.icon-vimeo:before { content: "\ea1b"; }
.icon-virus:before { content: "\ea1c"; }
.icon-vps:before { content: "\ea1d"; }
.icon-wallet:before { content: "\ea1e"; }
.icon-water:before { content: "\ea1f"; }
.icon-wifi:before { content: "\ea20"; }
.icon-win:before { content: "\ea21"; }
.icon-wind:before { content: "\ea22"; }
.icon-window:before { content: "\ea23"; }
.icon-windows:before { content: "\ea24"; }
.icon-windowserver:before { content: "\ea25"; }
.icon-wine:before { content: "\ea26"; }
.icon-wink:before { content: "\ea27"; }
.icon-woman:before { content: "\ea28"; }
.icon-wordpress:before { content: "\ea29"; }
.icon-youtube:before { content: "\ea2a"; }
.icon-zoom:before { content: "\ea2b"; }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,197 @@
::selection {
background-color: #0056b3;
color: #ffffff;
}
::-moz-selection {
background-color: #0056b3;
color: #ffffff;
}
.indexBg.overlay:before {
background-image: url("/static/felcloud/server room.jpg");
background-size: cover;
background-repeat: no-repeat;
}
.serversBg.overlay:before {
background-image: url("/static/felcloud/servers.jpg") !important;
background-size: cover !important;
background-repeat: no-repeat !important;
}
.configurations {
display: flex;
flex-direction: column;
gap: 10px; /* Space between configuration items */
margin: 20px 0;
}
.config-item {
border: 1px solid #ddd;
border-radius: 8px;
padding: 10px;
transition: background-color 0.3s, box-shadow 0.3s;
}
.config-item:hover {
background-color: #f9f9f9; /* Subtle background change */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Elevation effect */
}
.config-link {
font-size: 16px;
font-weight: bold;
text-decoration: none;
cursor: pointer;
transition: color 0.3s;
margin: 0;
}
.config-link:hover {
color: #0056b3; /* Darker blue on hover */
text-decoration: underline;
}
#servers.htmx-added {
opacity: 0;
}
#servers {
opacity: 1;
transition: opacity 0.1s ease-out;
}
.nav-menu .main-menu a {
font-family: "Inter", sans-serif !important;
font-size: 20px !important;
}
.configurations {
display: flex;
flex-direction: column;
gap: 10px; /* Space between configuration items */
margin: 20px 0;
}
.config-item {
border: 1px solid #ddd;
border-radius: 8px;
padding: 10px;
transition: background-color 0.3s, box-shadow 0.3s;
}
.config-item:hover {
background-color: #f9f9f9; /* Subtle background change */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Elevation effect */
}
.config-link {
font-size: 16px;
font-weight: bold;
text-decoration: none;
cursor: pointer;
transition: color 0.3s;
margin: 0;
}
.config-link:hover {
color: #0056b3; /* Darker blue on hover */
text-decoration: underline;
}
#options.htmx-added {
opacity: 0;
}
#options {
opacity: 1;
transition: opacity 0.1s ease-out;
}
.wrappers {
background-color: rgba(0, 0, 0, 0.7);
padding: 30px;
min-height: 240px;
}
/* .wrapper {
background-color: rgba(0, 0, 0, 0.7);
padding: 30px;
min-height: 240px;
} */
.filter {
background-color: white;
margin-right: 15px;
padding: 10px;
}
h4:before,
h4:after {
content: "";
flex: 1;
border-bottom: 2px solid #000;
margin: auto;
}
.htmx-indicator {
opacity: 0;
transition: opacity 500ms ease-in;
}
.htmx-request .htmx-indicator {
opacity: 1;
}
.htmx-request.htmx-indicator {
opacity: 1;
}
.btn-focused {
background-color: #4c4a4a !important;
color: #fff !important;
border: none !important;
display: none;
}
.sc-config-header {
display: flex;
align-items: center;
text-align: center;
margin: 20px 0;
position: relative;
}
.sc-line {
height: 4px;
background: #ccc;
}
.sc-line-left {
flex: 0.2;
}
.sc-line-right {
flex: 1.5;
margin-right: 100px; /* Reserve space for max quantity */
}
.sc-category-title {
margin: 0 10px;
background: transparent;
font-size: 13px;
font-weight: 900;
color: #717171;
text-shadow: 1px 1px 1px #fff;
text-transform: uppercase;
white-space: nowrap;
}
.sc-max-quantity {
position: absolute;
right: 0;
font-size: 12px;
font-weight: bold;
color: #555;
white-space: nowrap;
padding: 0 5px;
}
.fade-me-in.htmx-added {
opacity: 0;
}
.fade-me-in {
opacity: 1;
transition: opacity 0.2s ease-in;
}
.logo {
width: 60px;
}

File diff suppressed because one or more lines are too long

1817
static/felcloud/website/js/isotope.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,205 @@
/*!
* The Final Countdown for jQuery v2.2.0 (http://hilios.github.io/jQuery.countdown/)
* Copyright (c) 2016 Edson Hilios
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
!(function (a) {
"use strict";
"function" == typeof define && define.amd ? define(["jquery"], a) : a(jQuery);
})(function (a) {
"use strict";
function b(a) {
if (a instanceof Date) return a;
if (String(a).match(g))
return (
String(a).match(/^[0-9]*$/) && (a = Number(a)),
String(a).match(/\-/) && (a = String(a).replace(/\-/g, "/")),
new Date(a)
);
throw new Error("Couldn't cast `" + a + "` to a date object.");
}
function c(a) {
var b = a.toString().replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
return new RegExp(b);
}
function d(a) {
return function (b) {
var d = b.match(/%(-|!)?[A-Z]{1}(:[^;]+;)?/gi);
if (d)
for (var f = 0, g = d.length; f < g; ++f) {
var h = d[f].match(/%(-|!)?([a-zA-Z]{1})(:[^;]+;)?/),
j = c(h[0]),
k = h[1] || "",
l = h[3] || "",
m = null;
(h = h[2]),
i.hasOwnProperty(h) && ((m = i[h]), (m = Number(a[m]))),
null !== m &&
("!" === k && (m = e(l, m)),
"" === k && m < 10 && (m = "0" + m.toString()),
(b = b.replace(j, m.toString())));
}
return (b = b.replace(/%%/, "%"));
};
}
function e(a, b) {
var c = "s",
d = "";
return (
a &&
((a = a.replace(/(:|;|\s)/gi, "").split(/\,/)),
1 === a.length ? (c = a[0]) : ((d = a[0]), (c = a[1]))),
Math.abs(b) > 1 ? c : d
);
}
var f = [],
g = [],
h = { precision: 100, elapse: !1, defer: !1 };
g.push(/^[0-9]*$/.source),
g.push(/([0-9]{1,2}\/){2}[0-9]{4}( [0-9]{1,2}(:[0-9]{2}){2})?/.source),
g.push(/[0-9]{4}([\/\-][0-9]{1,2}){2}( [0-9]{1,2}(:[0-9]{2}){2})?/.source),
(g = new RegExp(g.join("|")));
var i = {
Y: "years",
m: "months",
n: "daysToMonth",
d: "daysToWeek",
w: "weeks",
W: "weeksToMonth",
H: "hours",
M: "minutes",
S: "seconds",
D: "totalDays",
I: "totalHours",
N: "totalMinutes",
T: "totalSeconds",
},
j = function (b, c, d) {
(this.el = b),
(this.$el = a(b)),
(this.interval = null),
(this.offset = {}),
(this.options = a.extend({}, h)),
(this.instanceNumber = f.length),
f.push(this),
this.$el.data("countdown-instance", this.instanceNumber),
d &&
("function" == typeof d
? (this.$el.on("update.countdown", d),
this.$el.on("stoped.countdown", d),
this.$el.on("finish.countdown", d))
: (this.options = a.extend({}, h, d))),
this.setFinalDate(c),
this.options.defer === !1 && this.start();
};
a.extend(j.prototype, {
start: function () {
null !== this.interval && clearInterval(this.interval);
var a = this;
this.update(),
(this.interval = setInterval(function () {
a.update.call(a);
}, this.options.precision));
},
stop: function () {
clearInterval(this.interval),
(this.interval = null),
this.dispatchEvent("stoped");
},
toggle: function () {
this.interval ? this.stop() : this.start();
},
pause: function () {
this.stop();
},
resume: function () {
this.start();
},
remove: function () {
this.stop.call(this),
(f[this.instanceNumber] = null),
delete this.$el.data().countdownInstance;
},
setFinalDate: function (a) {
this.finalDate = b(a);
},
update: function () {
if (0 === this.$el.closest("html").length) return void this.remove();
var b,
c = void 0 !== a._data(this.el, "events"),
d = new Date();
(b = this.finalDate.getTime() - d.getTime()),
(b = Math.ceil(b / 1e3)),
(b = !this.options.elapse && b < 0 ? 0 : Math.abs(b)),
this.totalSecsLeft !== b &&
c &&
((this.totalSecsLeft = b),
(this.elapsed = d >= this.finalDate),
(this.offset = {
seconds: this.totalSecsLeft % 60,
minutes: Math.floor(this.totalSecsLeft / 60) % 60,
hours: Math.floor(this.totalSecsLeft / 60 / 60) % 24,
days: Math.floor(this.totalSecsLeft / 60 / 60 / 24) % 7,
daysToWeek: Math.floor(this.totalSecsLeft / 60 / 60 / 24) % 7,
daysToMonth: Math.floor(
(this.totalSecsLeft / 60 / 60 / 24) % 30.4368
),
weeks: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 7),
weeksToMonth: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 7) % 4,
months: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 30.4368),
years: Math.abs(this.finalDate.getFullYear() - d.getFullYear()),
totalDays: Math.floor(this.totalSecsLeft / 60 / 60 / 24),
totalHours: Math.floor(this.totalSecsLeft / 60 / 60),
totalMinutes: Math.floor(this.totalSecsLeft / 60),
totalSeconds: this.totalSecsLeft,
}),
this.options.elapse || 0 !== this.totalSecsLeft
? this.dispatchEvent("update")
: (this.stop(), this.dispatchEvent("finish")));
},
dispatchEvent: function (b) {
var c = a.Event(b + ".countdown");
(c.finalDate = this.finalDate),
(c.elapsed = this.elapsed),
(c.offset = a.extend({}, this.offset)),
(c.strftime = d(this.offset)),
this.$el.trigger(c);
},
}),
(a.fn.countdown = function () {
var b = Array.prototype.slice.call(arguments, 0);
return this.each(function () {
var c = a(this).data("countdown-instance");
if (void 0 !== c) {
var d = f[c],
e = b[0];
j.prototype.hasOwnProperty(e)
? d[e].apply(d, b.slice(1))
: null === String(e).match(/^[$A-Z_][0-9A-Z_$]*$/i)
? (d.setFinalDate.call(d, e), d.start())
: a.error(
"Method %s does not exist on jQuery.countdown".replace(
/\%s/gi,
e
)
);
} else new j(this, b[0], b[1]);
});
});
});

File diff suppressed because one or more lines are too long

5574
static/felcloud/website/js/jquery.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,252 @@
var scrollme = (function (e) {
var t = {},
a = e(document),
n = e(window);
return (
(t.body_height = 0),
(t.viewport_height = 0),
(t.viewport_top = 0),
(t.viewport_bottom = 0),
(t.viewport_top_previous = -1),
(t.elements = []),
(t.elements_in_view = []),
(t.property_defaults = {
opacity: 1,
translatex: 0,
translatey: 0,
translatez: 0,
rotatex: 0,
rotatey: 0,
rotatez: 0,
scale: 1,
scalex: 1,
scaley: 1,
scalez: 1,
}),
(t.scrollme_selector = ".scrollme"),
(t.animateme_selector = ".animateme"),
(t.update_interval = 10),
(t.easing_functions = {
linear: function (e) {
return e;
},
easeout: function (e) {
return e * e * e;
},
easein: function (e) {
return 1 - (e = 1 - e) * e * e;
},
easeinout: function (e) {
return e < 0.5 ? 4 * e * e * e : 1 - 4 * (e = 1 - e) * e * e;
},
}),
(t.init_events = ["ready", "page:load", "page:change"]),
(t.init_if = function () {
return !0;
}),
(t.init = function () {
return (
!!t.init_if() &&
(t.init_elements(),
t.on_resize(),
n.on("resize orientationchange", function () {
t.on_resize();
}),
e(document).ready(function () {
setTimeout(function () {
t.on_resize();
}, 100);
}),
setInterval(t.update, t.update_interval),
!0)
);
}),
(t.init_elements = function () {
e(t.scrollme_selector).each(function () {
var a = {};
a.element = e(this);
var n = [];
e(this)
.find(t.animateme_selector)
.addBack(t.animateme_selector)
.each(function () {
var a = {};
(a.element = e(this)),
(a.when = a.element.data("when")),
(a.from = a.element.data("from")),
(a.to = a.element.data("to")),
a.element.is("[data-crop]")
? (a.crop = a.element.data("crop"))
: (a.crop = !0),
a.element.is("[data-easing]")
? (a.easing = t.easing_functions[a.element.data("easing")])
: (a.easing = t.easing_functions.easeout);
var i = {};
a.element.is("[data-opacity]") &&
(i.opacity = a.element.data("opacity")),
a.element.is("[data-translatex]") &&
(i.translatex = a.element.data("translatex")),
a.element.is("[data-translatey]") &&
(i.translatey = a.element.data("translatey")),
a.element.is("[data-translatez]") &&
(i.translatez = a.element.data("translatez")),
a.element.is("[data-rotatex]") &&
(i.rotatex = a.element.data("rotatex")),
a.element.is("[data-rotatey]") &&
(i.rotatey = a.element.data("rotatey")),
a.element.is("[data-rotatez]") &&
(i.rotatez = a.element.data("rotatez")),
a.element.is("[data-scale]") &&
(i.scale = a.element.data("scale")),
a.element.is("[data-scalex]") &&
(i.scalex = a.element.data("scalex")),
a.element.is("[data-scaley]") &&
(i.scaley = a.element.data("scaley")),
a.element.is("[data-scalez]") &&
(i.scalez = a.element.data("scalez")),
(a.properties = i),
n.push(a);
}),
(a.effects = n),
t.elements.push(a);
});
}),
(t.update = function () {
window.requestAnimationFrame(function () {
t.update_viewport_position(),
t.viewport_top_previous != t.viewport_top &&
(t.update_elements_in_view(), t.animate()),
(t.viewport_top_previous = t.viewport_top);
});
}),
(t.animate = function () {
for (var e = t.elements_in_view.length, a = 0; a < e; a++)
for (
var n = t.elements_in_view[a], i = n.effects.length, o = 0;
o < i;
o++
) {
var r = n.effects[o];
switch (r.when) {
case "view":
case "span":
var s = n.top - t.viewport_height,
l = n.bottom;
break;
case "exit":
(s = n.bottom - t.viewport_height), (l = n.bottom);
break;
default:
(s = n.top - t.viewport_height), (l = n.top);
}
r.crop &&
(s < 0 && (s = 0),
l > t.body_height - t.viewport_height &&
(l = t.body_height - t.viewport_height));
var m = (t.viewport_top - s) / (l - s),
p = r.from,
c = r.to,
_ = (m - p) / (c - p),
u = r.easing(_),
d = t.animate_value(m, u, p, c, r, "opacity"),
v = t.animate_value(m, u, p, c, r, "translatey"),
h = t.animate_value(m, u, p, c, r, "translatex"),
f = t.animate_value(m, u, p, c, r, "translatez"),
w = t.animate_value(m, u, p, c, r, "rotatex"),
g = t.animate_value(m, u, p, c, r, "rotatey"),
y = t.animate_value(m, u, p, c, r, "rotatez"),
x = t.animate_value(m, u, p, c, r, "scale"),
z = t.animate_value(m, u, p, c, r, "scalex"),
b = t.animate_value(m, u, p, c, r, "scaley"),
k = t.animate_value(m, u, p, c, r, "scalez");
"scale" in r.properties && ((z = x), (b = x), (k = x)),
r.element.css({
opacity: d,
transform:
"translate3d( " +
h +
"px , " +
v +
"px , " +
f +
"px ) rotateX( " +
w +
"deg ) rotateY( " +
g +
"deg ) rotateZ( " +
y +
"deg ) scale3d( " +
z +
" , " +
b +
" , " +
k +
" )",
});
}
}),
(t.animate_value = function (e, a, n, i, o, r) {
var s = t.property_defaults[r];
if (!(r in o.properties)) return s;
var l = o.properties[r],
m = i > n;
if (e < n && m) return s;
if (e > i && m) return l;
if (e > n && !m) return s;
if (e < i && !m) return l;
var p = s + a * (l - s);
switch (r) {
case "opacity":
p = p.toFixed(2);
break;
case "translatex":
case "translatey":
case "translatez":
p = p.toFixed(0);
break;
case "rotatex":
case "rotatey":
case "rotatez":
p = p.toFixed(1);
break;
case "scale":
p = p.toFixed(3);
}
return p;
}),
(t.update_viewport_position = function () {
(t.viewport_top = n.scrollTop()),
(t.viewport_bottom = t.viewport_top + t.viewport_height);
}),
(t.update_elements_in_view = function () {
t.elements_in_view = [];
for (var e = t.elements.length, a = 0; a < e; a++)
t.elements[a].top < t.viewport_bottom &&
t.elements[a].bottom > t.viewport_top &&
t.elements_in_view.push(t.elements[a]);
}),
(t.on_resize = function () {
t.update_viewport(),
t.update_element_heights(),
t.update_viewport_position(),
t.update_elements_in_view(),
t.animate();
}),
(t.update_viewport = function () {
(t.body_height = a.height()), (t.viewport_height = n.height());
}),
(t.update_element_heights = function () {
for (var e = t.elements.length, a = 0; a < e; a++) {
var n = t.elements[a].element.outerHeight(),
i = t.elements[a].element.offset();
(t.elements[a].height = n),
(t.elements[a].top = i.top),
(t.elements[a].bottom = i.top + n);
}
}),
e("docuemnt").ready(function () {
t.init();
}),
t
);
})(jQuery);

View File

@ -0,0 +1,630 @@
/*! lazysizes - v5.3.0 */
!(function (e) {
var t = (function (u, D, f) {
"use strict";
var k, H;
if (
((function () {
var e;
var t = {
lazyClass: "lazyload",
loadedClass: "lazyloaded",
loadingClass: "lazyloading",
preloadClass: "lazypreload",
errorClass: "lazyerror",
autosizesClass: "lazyautosizes",
fastLoadedClass: "ls-is-cached",
iframeLoadMode: 0,
srcAttr: "data-src",
srcsetAttr: "data-srcset",
sizesAttr: "data-sizes",
minSize: 40,
customMedia: {},
init: true,
expFactor: 1.5,
hFac: 0.8,
loadMode: 2,
loadHidden: true,
ricTimeout: 0,
throttleDelay: 125,
};
H = u.lazySizesConfig || u.lazysizesConfig || {};
for (e in t) {
if (!(e in H)) {
H[e] = t[e];
}
}
})(),
!D || !D.getElementsByClassName)
) {
return { init: function () {}, cfg: H, noSupport: true };
}
var O = D.documentElement,
i = u.HTMLPictureElement,
P = "addEventListener",
$ = "getAttribute",
q = u[P].bind(u),
I = u.setTimeout,
U = u.requestAnimationFrame || I,
o = u.requestIdleCallback,
j = /^picture$/i,
r = ["load", "error", "lazyincluded", "_lazyloaded"],
a = {},
G = Array.prototype.forEach,
J = function (e, t) {
if (!a[t]) {
a[t] = new RegExp("(\\s|^)" + t + "(\\s|$)");
}
return a[t].test(e[$]("class") || "") && a[t];
},
K = function (e, t) {
if (!J(e, t)) {
e.setAttribute("class", (e[$]("class") || "").trim() + " " + t);
}
},
Q = function (e, t) {
var a;
if ((a = J(e, t))) {
e.setAttribute("class", (e[$]("class") || "").replace(a, " "));
}
},
V = function (t, a, e) {
var i = e ? P : "removeEventListener";
if (e) {
V(t, a);
}
r.forEach(function (e) {
t[i](e, a);
});
},
X = function (e, t, a, i, r) {
var n = D.createEvent("Event");
if (!a) {
a = {};
}
a.instance = k;
n.initEvent(t, !i, !r);
n.detail = a;
e.dispatchEvent(n);
return n;
},
Y = function (e, t) {
var a;
if (!i && (a = u.picturefill || H.pf)) {
if (t && t.src && !e[$]("srcset")) {
e.setAttribute("srcset", t.src);
}
a({ reevaluate: true, elements: [e] });
} else if (t && t.src) {
e.src = t.src;
}
},
Z = function (e, t) {
return (getComputedStyle(e, null) || {})[t];
},
s = function (e, t, a) {
a = a || e.offsetWidth;
while (a < H.minSize && t && !e._lazysizesWidth) {
a = t.offsetWidth;
t = t.parentNode;
}
return a;
},
ee = (function () {
var a, i;
var t = [];
var r = [];
var n = t;
var s = function () {
var e = n;
n = t.length ? r : t;
a = true;
i = false;
while (e.length) {
e.shift()();
}
a = false;
};
var e = function (e, t) {
if (a && !t) {
e.apply(this, arguments);
} else {
n.push(e);
if (!i) {
i = true;
(D.hidden ? I : U)(s);
}
}
};
e._lsFlush = s;
return e;
})(),
te = function (a, e) {
return e
? function () {
ee(a);
}
: function () {
var e = this;
var t = arguments;
ee(function () {
a.apply(e, t);
});
};
},
ae = function (e) {
var a;
var i = 0;
var r = H.throttleDelay;
var n = H.ricTimeout;
var t = function () {
a = false;
i = f.now();
e();
};
var s =
o && n > 49
? function () {
o(t, { timeout: n });
if (n !== H.ricTimeout) {
n = H.ricTimeout;
}
}
: te(function () {
I(t);
}, true);
return function (e) {
var t;
if ((e = e === true)) {
n = 33;
}
if (a) {
return;
}
a = true;
t = r - (f.now() - i);
if (t < 0) {
t = 0;
}
if (e || t < 9) {
s();
} else {
I(s, t);
}
};
},
ie = function (e) {
var t, a;
var i = 99;
var r = function () {
t = null;
e();
};
var n = function () {
var e = f.now() - a;
if (e < i) {
I(n, i - e);
} else {
(o || r)(r);
}
};
return function () {
a = f.now();
if (!t) {
t = I(n, i);
}
};
},
e = (function () {
var v, m, c, h, e;
var y, z, g, p, C, b, A;
var n = /^img$/i;
var d = /^iframe$/i;
var E = "onscroll" in u && !/(gle|ing)bot/.test(navigator.userAgent);
var _ = 0;
var w = 0;
var M = 0;
var N = -1;
var L = function (e) {
M--;
if (!e || M < 0 || !e.target) {
M = 0;
}
};
var x = function (e) {
if (A == null) {
A = Z(D.body, "visibility") == "hidden";
}
return (
A ||
!(
Z(e.parentNode, "visibility") == "hidden" &&
Z(e, "visibility") == "hidden"
)
);
};
var W = function (e, t) {
var a;
var i = e;
var r = x(e);
g -= t;
b += t;
p -= t;
C += t;
while (r && (i = i.offsetParent) && i != D.body && i != O) {
r = (Z(i, "opacity") || 1) > 0;
if (r && Z(i, "overflow") != "visible") {
a = i.getBoundingClientRect();
r =
C > a.left && p < a.right && b > a.top - 1 && g < a.bottom + 1;
}
}
return r;
};
var t = function () {
var e, t, a, i, r, n, s, o, l, u, f, c;
var d = k.elements;
if ((h = H.loadMode) && M < 8 && (e = d.length)) {
t = 0;
N++;
for (; t < e; t++) {
if (!d[t] || d[t]._lazyRace) {
continue;
}
if (!E || (k.prematureUnveil && k.prematureUnveil(d[t]))) {
R(d[t]);
continue;
}
if (!(o = d[t][$]("data-expand")) || !(n = o * 1)) {
n = w;
}
if (!u) {
u =
!H.expand || H.expand < 1
? O.clientHeight > 500 && O.clientWidth > 500
? 500
: 370
: H.expand;
k._defEx = u;
f = u * H.expFactor;
c = H.hFac;
A = null;
if (w < f && M < 1 && N > 2 && h > 2 && !D.hidden) {
w = f;
N = 0;
} else if (h > 1 && N > 1 && M < 6) {
w = u;
} else {
w = _;
}
}
if (l !== n) {
y = innerWidth + n * c;
z = innerHeight + n;
s = n * -1;
l = n;
}
a = d[t].getBoundingClientRect();
if (
(b = a.bottom) >= s &&
(g = a.top) <= z &&
(C = a.right) >= s * c &&
(p = a.left) <= y &&
(b || C || p || g) &&
(H.loadHidden || x(d[t])) &&
((m && M < 3 && !o && (h < 3 || N < 4)) || W(d[t], n))
) {
R(d[t]);
r = true;
if (M > 9) {
break;
}
} else if (
!r &&
m &&
!i &&
M < 4 &&
N < 4 &&
h > 2 &&
(v[0] || H.preloadAfterLoad) &&
(v[0] ||
(!o && (b || C || p || g || d[t][$](H.sizesAttr) != "auto")))
) {
i = v[0] || d[t];
}
}
if (i && !r) {
R(i);
}
}
};
var a = ae(t);
var S = function (e) {
var t = e.target;
if (t._lazyCache) {
delete t._lazyCache;
return;
}
L(e);
K(t, H.loadedClass);
Q(t, H.loadingClass);
V(t, B);
X(t, "lazyloaded");
};
var i = te(S);
var B = function (e) {
i({ target: e.target });
};
var T = function (e, t) {
var a = e.getAttribute("data-load-mode") || H.iframeLoadMode;
if (a == 0) {
e.contentWindow.location.replace(t);
} else if (a == 1) {
e.src = t;
}
};
var F = function (e) {
var t;
var a = e[$](H.srcsetAttr);
if ((t = H.customMedia[e[$]("data-media") || e[$]("media")])) {
e.setAttribute("media", t);
}
if (a) {
e.setAttribute("srcset", a);
}
};
var s = te(function (t, e, a, i, r) {
var n, s, o, l, u, f;
if (!(u = X(t, "lazybeforeunveil", e)).defaultPrevented) {
if (i) {
if (a) {
K(t, H.autosizesClass);
} else {
t.setAttribute("sizes", i);
}
}
s = t[$](H.srcsetAttr);
n = t[$](H.srcAttr);
if (r) {
o = t.parentNode;
l = o && j.test(o.nodeName || "");
}
f = e.firesLoad || ("src" in t && (s || n || l));
u = { target: t };
K(t, H.loadingClass);
if (f) {
clearTimeout(c);
c = I(L, 2500);
V(t, B, true);
}
if (l) {
G.call(o.getElementsByTagName("source"), F);
}
if (s) {
t.setAttribute("srcset", s);
} else if (n && !l) {
if (d.test(t.nodeName)) {
T(t, n);
} else {
t.src = n;
}
}
if (r && (s || l)) {
Y(t, { src: n });
}
}
if (t._lazyRace) {
delete t._lazyRace;
}
Q(t, H.lazyClass);
ee(function () {
var e = t.complete && t.naturalWidth > 1;
if (!f || e) {
if (e) {
K(t, H.fastLoadedClass);
}
S(u);
t._lazyCache = true;
I(function () {
if ("_lazyCache" in t) {
delete t._lazyCache;
}
}, 9);
}
if (t.loading == "lazy") {
M--;
}
}, true);
});
var R = function (e) {
if (e._lazyRace) {
return;
}
var t;
var a = n.test(e.nodeName);
var i = a && (e[$](H.sizesAttr) || e[$]("sizes"));
var r = i == "auto";
if (
(r || !m) &&
a &&
(e[$]("src") || e.srcset) &&
!e.complete &&
!J(e, H.errorClass) &&
J(e, H.lazyClass)
) {
return;
}
t = X(e, "lazyunveilread").detail;
if (r) {
re.updateElem(e, true, e.offsetWidth);
}
e._lazyRace = true;
M++;
s(e, t, r, i, a);
};
var r = ie(function () {
H.loadMode = 3;
a();
});
var o = function () {
if (H.loadMode == 3) {
H.loadMode = 2;
}
r();
};
var l = function () {
if (m) {
return;
}
if (f.now() - e < 999) {
I(l, 999);
return;
}
m = true;
H.loadMode = 3;
a();
q("scroll", o, true);
};
return {
_: function () {
e = f.now();
k.elements = D.getElementsByClassName(H.lazyClass);
v = D.getElementsByClassName(H.lazyClass + " " + H.preloadClass);
q("scroll", a, true);
q("resize", a, true);
q("pageshow", function (e) {
if (e.persisted) {
var t = D.querySelectorAll("." + H.loadingClass);
if (t.length && t.forEach) {
U(function () {
t.forEach(function (e) {
if (e.complete) {
R(e);
}
});
});
}
}
});
if (u.MutationObserver) {
new MutationObserver(a).observe(O, {
childList: true,
subtree: true,
attributes: true,
});
} else {
O[P]("DOMNodeInserted", a, true);
O[P]("DOMAttrModified", a, true);
setInterval(a, 999);
}
q("hashchange", a, true);
[
"focus",
"mouseover",
"click",
"load",
"transitionend",
"animationend",
].forEach(function (e) {
D[P](e, a, true);
});
if (/d$|^c/.test(D.readyState)) {
l();
} else {
q("load", l);
D[P]("DOMContentLoaded", a);
I(l, 2e4);
}
if (k.elements.length) {
t();
ee._lsFlush();
} else {
a();
}
},
checkElems: a,
unveil: R,
_aLSL: o,
};
})(),
re = (function () {
var a;
var n = te(function (e, t, a, i) {
var r, n, s;
e._lazysizesWidth = i;
i += "px";
e.setAttribute("sizes", i);
if (j.test(t.nodeName || "")) {
r = t.getElementsByTagName("source");
for (n = 0, s = r.length; n < s; n++) {
r[n].setAttribute("sizes", i);
}
}
if (!a.detail.dataAttr) {
Y(e, a.detail);
}
});
var i = function (e, t, a) {
var i;
var r = e.parentNode;
if (r) {
a = s(e, r, a);
i = X(e, "lazybeforesizes", { width: a, dataAttr: !!t });
if (!i.defaultPrevented) {
a = i.detail.width;
if (a && a !== e._lazysizesWidth) {
n(e, r, i, a);
}
}
}
};
var e = function () {
var e;
var t = a.length;
if (t) {
e = 0;
for (; e < t; e++) {
i(a[e]);
}
}
};
var t = ie(e);
return {
_: function () {
a = D.getElementsByClassName(H.autosizesClass);
q("resize", t);
},
checkElems: t,
updateElem: i,
};
})(),
t = function () {
if (!t.i && D.getElementsByClassName) {
t.i = true;
re._();
e._();
}
};
return (
I(function () {
H.init && t();
}),
(k = {
cfg: H,
autoSizer: re,
loader: e,
init: t,
uP: Y,
aC: K,
rC: Q,
hC: J,
fire: X,
gW: s,
rAF: ee,
})
);
})(e, e.document, Date);
(e.lazySizes = t),
"object" == typeof module && module.exports && (module.exports = t);
})("undefined" != typeof window ? window : {});

File diff suppressed because it is too large Load Diff

1144
static/felcloud/website/js/popper.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,762 @@
function setActiveColor(t) {
var e, i;
for (e = 0; (i = document.getElementsByTagName("link")[e]); e++)
-1 != i.getAttribute("rel").indexOf("style") &&
i.getAttribute("title") &&
((i.disabled = !0), i.getAttribute("title") == t && (i.disabled = !1));
}
function getActiveColor() {
var t, e;
for (t = 0; (e = document.getElementsByTagName("link")[t]); t++)
if (
-1 != e.getAttribute("rel").indexOf("style") &&
e.getAttribute("title") &&
!e.disabled
)
return e.getAttribute("title");
return null;
}
function getSetColor() {
var t, e;
for (t = 0; (e = document.getElementsByTagName("link")[t]); t++)
if (
-1 != e.getAttribute("rel").indexOf("style") &&
-1 == e.getAttribute("rel").indexOf("alt") &&
e.getAttribute("title")
)
return e.getAttribute("title");
return null;
}
function generateCookie(t, e, i) {
if (i) {
var n = new Date();
n.setTime(n.getTime() + 24 * i * 60 * 60 * 1e3);
var o = "; expires=" + n.toGMTString();
} else o = "";
document.cookie = t + "=" + e + o + "; path=/";
}
function goCookie(t) {
for (
var e = t + "=", i = document.cookie.split(";"), n = 0;
n < i.length;
n++
) {
for (var o = i[n]; " " == o.charAt(0); ) o = o.substring(1, o.length);
if (0 == o.indexOf(e)) return o.substring(e.length, o.length);
}
return null;
}
document.addEventListener("DOMContentLoaded", function () {
"use strict";
loadWindowSettings(),
loadWindowEvents(),
loadMenu(),
loadTabs(),
izotope(),
popup(),
accordion(),
loadTooltips(),
initSliderUI(),
loadCountdown(),
speacialCount(),
loadSkills(),
misc(),
slick(),
listenSlick(),
loader(),
backtotop(),
owldemo(),
isotope(),
livechat(),
contactform(),
popover(),
scrollgoto(),
active(),
display(),
switching(),
headerfooter(),
translate(),
switchVisible(),
setActiveColor();
}),
(window.onload = function (t) {
var e = goCookie("style");
setActiveColor(e || getSetColor());
}),
(window.onunload = function (t) {
generateCookie("style", getActiveColor(), 365);
});
var cookie = goCookie("style"),
title = cookie || getSetColor();
function switchVisible() {
document.getElementById("price-val") &&
("none" == document.getElementById("price-val").style.display
? ((document.getElementById("price-val").style.display = "block"),
(document.getElementById("priceon-val").style.display = "none"))
: ((document.getElementById("price-val").style.display = "none"),
(document.getElementById("priceon-val").style.display = "block")));
}
function translate() {
$.getScript("js/lib/i18next.min.js", function () {
$.getScript("js/lib/i18nextXHRBackend.min.js", function () {
$.getScript("js/lib/jquery-i18next.min.js", function () {
var t = localStorage.getItem("lng");
t || (localStorage.setItem("lng", "en-US"), (t = "en-US")),
i18next.use(i18nextXHRBackend).init(
{
lng: t,
fallbackLng: "en-US",
backend: { loadPath: "locales/{{lng}}/translations.json" },
},
function (t, e) {
jqueryI18next.init(i18next, $, {
tName: "t",
i18nName: "i18n",
handleName: "localize",
selectorAttr: "data-i18n",
targetAttr: "i18n-target",
optionsAttr: "i18n-options",
useOptionsAttr: !1,
parseDefaultValueFromContent: !0,
}),
$(document).localize();
}
);
});
});
});
}
function headerfooter() {
$("#header").load("header.html", function (t, e, i) {
$('#drop-lng [data-lng="' + localStorage.getItem("lng") + '"]').addClass(
"xpto active"
),
$("#drop-lng label").click(function (t) {
t.preventDefault(),
localStorage.setItem("lng", $(this).attr("data-lng")),
location.reload(!0);
});
}),
$("#footer").load("footer.html", function (t, e, i) {
$('#drop-lng [data-lng="' + localStorage.getItem("lng") + '"]').addClass(
"xpto active"
),
$("#drop-lng label").click(function (t) {
t.preventDefault(),
localStorage.setItem("lng", $(this).attr("data-lng")),
location.reload(!0);
});
});
}
function switching() {
$(window).on("load", function () {
var t = $("#run-switch"),
e = $(".price-content .period", ".price-container");
t.on("click", function () {
if (
($(".mo", this).toggleClass("active"),
$(".an", this).toggleClass("active"),
$(".month", this).toggleClass("active"),
$(".switch", this).toggleClass("on"),
$(".year", this).toggleClass("active"),
e.hasClass("hourly"))
) {
e.text("month");
for (var t = 0; t <= 4; t++)
$(".price-container:eq(" + t + ") .value").text(
parseFloat(
Number($(".price-container:eq(" + t + ") .value").text()) / 12
).toFixed(2)
),
$(".price-container:eq(" + t + ") .discount").text(
parseFloat(
Number($(".price-container:eq(" + t + ") .discount").text()) /
12
).toFixed(2)
);
} else {
e.text("year");
for (t = 0; t <= 4; t++)
$(".price-container:eq(" + t + ") .value").text(
parseFloat(
12 * Number($(".price-container:eq(" + t + ") .value").text())
).toFixed(2)
),
$(".price-container:eq(" + t + ") .discount").text(
parseFloat(
12 *
Number($(".price-container:eq(" + t + ") .discount").text())
).toFixed(2)
);
}
e.toggleClass("hourly");
});
});
}
function openNav() {
document.getElementById("myNav").style.display = "block";
}
function closeNav() {
document.getElementById("myNav").style.display = "none";
}
function display() {
$("#showall").on("click", function () {
$(".targetDiv").show();
}),
$(".showSingle").on("click", function () {
$(".targetDiv").hide(), $("#div" + $(this).attr("target")).show();
});
}
function active() {
$(".heading a").on("click", function () {
$(".heading a").removeClass("active"), $(this).addClass("active");
});
}
function scrollgoto() {
$(".gocheck").on("click", function (t) {
var e = $(this.getAttribute("href"));
e.length &&
(t.preventDefault(),
$("html, body").stop().animate({ scrollTop: e.offset().top }, 0));
});
}
function popover() {
$('[data-bs-toggle="popover"]').popover();
}
function contactform() {
$("#contactForm").on("submit", function (t) {
$.ajax({
type: "POST",
url: "php/form-process.php",
data: $(this).serialize(),
success: function () {
$("#msgSubmit").fadeIn(100).show();
},
}),
t.preventDefault();
});
}
function livechat() {}
function isotope() {
$(window).on("load", function () {
var t,
e = $(".featured").isotope({
itemSelector: ".isotope-item",
masonry: { columnWidth: ".isotope-item" },
getSortData: {
selectedCategory: function (e) {
return $(e).hasClass(t) ? 0 : 1;
},
},
}),
i = $(".featured").find(".featured-items");
$(".sort-button-group").on("click", ".button", function () {
if ("all" === (t = $(this).attr("data-category")))
return (
e.isotope({ sortBy: "original-order" }), void i.css({ opacity: 1 })
);
var n = "." + t;
i.filter(n).css({ opacity: 1 }),
i.not(n).css({ opacity: 0 }),
e.isotope("updateSortData"),
e.isotope({ sortBy: "selectedCategory" });
}),
$(".button-group").each(function (t, e) {
var i = $(e);
i.on("click", "li", function () {
i.find(".active").removeClass("active"), $(this).addClass("active");
});
});
});
}
function owldemo() {
$(".owl-carousel").owlCarousel({
onInitialized: function (t) {
$(".active .owl-video-play-icon").trigger("click");
},
nav: !1,
singleItem: !0,
autoHeight: !0,
dots: !0,
center: !0,
margin: 0,
padding: 0,
animateOut: "fadeOut",
items: 1,
autoPlay: 5500,
stopOnHover: !0,
center: !0,
navigation: !1,
pagination: !1,
goToFirstSpeed: 1300,
singleItem: !0,
responsive: !0,
responsiveRefreshRate: 200,
responsiveBaseWidth: window,
video: !0,
autoplay: !0,
autoplayTimeout: 9e3,
autoplayHoverPause: !0,
navText: [
"<i class='fa fa-chevron-left'></i>",
"<i class='fa fa-chevron-right'></i>",
],
responsive: { 0: { items: 1 } },
});
}
function backtotop() {
var t = $(".cd-top");
$(window).scroll(function () {
$(this).scrollTop() > 300
? t.addClass("cd-is-visible")
: t.removeClass("cd-is-visible cd-fade-out"),
$(this).scrollTop() > 1200 && t.addClass("cd-fade-out");
}),
t.on("click", function (t) {
t.preventDefault(), $("body,html").animate({ scrollTop: 0 }, 0);
});
}
function loader() {
$(window).on("load", function () {
$("#spinner-area").fadeOut("slow");
});
}
function listenSlick() {
$(".slick").on("unslick", function () {
var t = setInterval(function () {
$(window).width() > 590 && (clearInterval(t), slick());
}, 100);
});
}
function slick() {
$("#slider").slick({
centerMode: !0,
centerPadding: "200px",
slidesToShow: 3,
infinite: !0,
arrows: !0,
responsive: [
{
breakpoint: 1200,
settings: {
arrows: !0,
centerMode: !0,
centerPadding: "100px",
slidesToShow: 3,
},
},
{
breakpoint: 991,
settings: {
arrows: !0,
centerMode: !0,
centerPadding: "200px",
slidesToShow: 1,
},
},
{
breakpoint: 768,
settings: {
arrows: !0,
centerMode: !0,
centerPadding: "150px",
slidesToShow: 1,
},
},
{ breakpoint: 590, settings: "unslick" },
],
});
}
function popup() {
$(".popup-with-form").length &&
$(".popup-with-form").magnificPopup({
type: "image",
preloader: !0,
focus: "#name",
closeOnBgClick: !0,
callbacks: {
beforeOpen: function () {
$(window).width() < 700
? (this.st.focus = !1)
: (this.st.focus = "#name");
},
},
}),
$(".gallery-item").magnificPopup({
delegate: "a",
type: "image",
tLoading: "Loading image #%curr%...",
mainClass: "mfp-img-mobile",
gallery: { enabled: !0, navigateByImgClick: !0, preload: [0, 1] },
}),
$(".image-link").magnificPopup({
type: "image",
mainClass: "mfp-with-zoom",
gallery: { enabled: !0, navigateByImgClick: !0, preload: [0, 1] },
image: { titleSrc: "title" },
zoom: {
enabled: !0,
navigateByImgClick: !0,
duration: 300,
easing: "ease-in-out",
opener: function (t) {
return t.is("img") ? t : t.find("img");
},
},
});
}
function misc() {
$("#myModal").on("shown.bs.modal", function () {
$("#myInput").focus();
});
}
setActiveColor(title),
$("img.svg").each(function () {
var t = jQuery(this),
e = t.prop("attributes"),
i = t.attr("src");
$.get(i, function (i) {
var n = $(i).find("svg");
(n = n.removeAttr("xmlns:a")),
$.each(e, function () {
n.attr(this.name, this.value);
}),
t.replaceWith(n);
});
}),
(function (t) {
t(document).ready(function () {
t(".styleswitch").click(function () {
var e;
return (
(e = this.getAttribute("data-rel")),
t("link[rel*=style][title]").each(function (t) {
(this.disabled = !0),
this.getAttribute("title") == e && (this.disabled = !1);
}),
!1
);
});
});
})(jQuery),
jQuery(function (t) {
var e = window.location.href;
t("#menu ul li a").each(function () {
this.href === e &&
(t(this).addClass("active"),
t(this).parent().parent().closest("li").addClass("active2"),
t(".active2 a:first").addClass("active"));
});
}),
$(".mobile .menu-item").on("click", function () {
"none" === $(".sub-menu", this).css("display")
? $(".sub-menu", this).css("display", "block")
: $(".sub-menu", this).css("display", "none");
}),
$(document).ready(function () {
$(".popup-youtube, .popup-vimeo, .popup-gmaps").magnificPopup({
disableOn: 700,
type: "iframe",
mainClass: "mfp-fade",
removalDelay: 160,
preloader: !1,
fixedContentPos: !1,
});
});
// var mySwiper = new Swiper(".swiper-container", {
// direction: "horizontal",
// loop: !0,
// autoHeight: !0,
// grabCursor: !0,
// centeredSlides: !0,
// autoplay: { delay: 5e3, speed: 1e3, disableOnInteraction: !1 },
// pagination: { el: ".swiper-pagination" },
// navigation: { nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev" },
// scrollbar: { el: ".swiper-scrollbar" },
// });
function loadTooltips() {
$("#element").tooltip("show"),
$(function () {
$('[data-bs-toggle="tooltip"]').tooltip();
});
}
function initSliderUI() {
var t = 0;
$(".slider-ui").length &&
$(".slider-ui").each(function () {
var e = $(this),
i = e.find(".slider-line"),
n = e.find(".slider-inp"),
o = "sliderUI" + t,
a = "inputUI" + t,
l = parseInt(n.attr("data-start")),
s = parseInt(n.attr("data-count-step"));
i.attr("id", o), n.attr("id", a), t++, (s = s || 300);
var r = document.getElementById(o),
c = document.getElementById(a);
function d() {
return {
VPS1: {
name: "Service A",
disk: "100GB",
ram: "1GB",
cpu: "1 Core",
bandwith: "100GB",
setup: "8€",
ip: "2 IPs",
price: "99.09",
priceon: "8.26",
orderlink:
"http://inebur.com/whmcs/cart.php?a=add&pid=4&carttpl=antler",
},
VPS2: {
name: "Service B",
disk: "200GB",
ram: "4GB",
cpu: "2 Core",
setup: "15€",
ip: "4 IPs",
bandwith: "500GB",
price: "155.00",
priceon: "12.92",
orderlink:
"http://inebur.com/whmcs/cart.php?a=add&pid=5&carttpl=antler",
},
VPS3: {
name: "Service C",
disk: "300GB",
ram: "8GB",
cpu: "4 Core",
setup: "Free",
ip: "8 IPs",
bandwith: "2TB",
price: "299.99",
priceon: "25.00",
orderlink:
"http://inebur.com/whmcs/cart.php?a=add&pid=6&carttpl=antler",
},
VPS4: {
name: "Service D",
disk: "400GB",
ram: "12GB",
cpu: "4 Core",
setup: "Free",
ip: "8 IPs",
bandwith: "Unlimited",
price: "395.22",
priceon: "32.94",
orderlink:
"http://inebur.com/whmcs/cart.php?a=confproduct&i=3&carttpl=antler",
},
VPS5: {
name: "Service E",
disk: "500GB",
ram: "16GB",
cpu: "8 Core",
setup: "Free",
ip: "12 IPs",
bandwith: "Unlimited",
price: "545.00",
priceon: "45.42",
orderlink:
"http://inebur.com/whmcs/cart.php?a=confproduct&i=4&carttpl=antler",
},
};
}
noUiSlider.create(r, {
start: l || 1,
step: 1,
connect: "lower",
tooltips: !0,
format: {
to: function (t) {
return "VPS" + t;
},
from: function (t) {
return t;
},
},
range: { min: 1, max: s },
pips: {
mode: "values",
values: [1, 2, 3, 4, 5],
density: 5,
stepped: !0,
},
}),
r.noUiSlider.on("change", function (t, e, i, n) {
$(this.target)
.closest(".sidebar")
.find(".circle")
.attr("data-percent", (parseInt(i) / s) * 100);
}),
r.noUiSlider.on("update", function (t, e) {
var i, n;
(i = t[e]),
(n = d()),
$("#disk-val").html(n[i].disk),
$("#cpu-val").html(n[i].cpu),
$("#ram-val").html(n[i].ram),
$("#setup-val").html(n[i].setup),
$("#ip-val").html(n[i].ip),
$("#bw-val").html(n[i].bandwith),
$("#price-val").html(n[i].price),
$("#priceon-val").html(n[i].priceon),
$("#orderlink-val").html(n[i].orderlink),
(c.value = t[e]),
(function (t) {
var e = d();
$("#orderlink").attr("href", e[t].orderlink);
})(t[e]);
}),
c.addEventListener("change", function () {
r.noUiSlider.set([null, this.value]);
}),
c.addEventListener("keydown", function (t) {
var e = Number(r.noUiSlider.get()),
i = r.noUiSlider.steps();
switch (((i = i[0]), t.which)) {
case 13:
r.noUiSlider.set(this.value);
break;
case 38:
r.noUiSlider.set(e + i[1]);
break;
case 40:
r.noUiSlider.set(e - i[0]);
}
});
});
}
function loadMenu() {
$(".nav-menu .menu-toggle").on("click", function () {
$(this).closest(".menu-wrap").toggleClass("active");
}),
$(".btn-scroll").on("click", function () {
return (
$("html, body").animate(
{ scrollTop: $($.attr(this, "href")).offset().top - 10 },
500
),
!1
);
});
}
function izotope() {
if ($(".izotope-container").length) {
var t = $(".izotope-container");
t.isotope({
itemSelector: ".item",
layoutMode: "masonry",
masonry: { columnWidth: ".item" },
});
}
$("#filters").on("click", ".but", function () {
$(".izotope-container").each(function () {
$(this).find(".item").removeClass("animated");
}),
$("#filters .but").removeClass("activbut"),
$(this).addClass("activbut");
var e = $(this).attr("data-filter");
t.isotope({ filter: e });
});
}
function loadTabs() {
$(".tabs-header").on("click", "li:not(.active)", function () {
var t = $(this).index();
$(this).addClass("active").siblings().removeClass("active"),
$(this)
.closest(".tabs")
.find(".tabs-item")
.removeClass("active")
.eq(t)
.addClass("active");
});
}
function accordion() {
$(".accordion").on("click", ".panel-title", function () {
var t = $(this),
e = t.parent();
e.find(".panel-collapse").slideToggle("200"),
t.toggleClass("active"),
e.siblings().find(".panel-collapse").slideUp("200"),
e.siblings().find(".panel-title").removeClass("active");
}),
accordHeight();
}
function accordHeight() {
$(".accordion.faq .square").each(function () {
$(this).css({
height: $(this).parent().outerHeight(!0),
"padding-top": $(this).parent().outerHeight(!0) / 2 - 20,
});
});
}
function loadSkills() {
$(".circle")
.not(".animated")
.each(function () {
$(window).scrollTop() >=
$(this).offset().top - 0.7 * $(window).height() &&
$(this).addClass("animated").circliful();
});
}
function selectInit() {
$(".selectpicker").each(function () {
var t = $(this),
e = t.attr("data-class");
t.selectpicker({ style: "cst-select " + e });
});
}
function loadWindowEvents() {
$(window).on("resize", function () {
offheight(), accordHeight();
}),
$(window).on("scroll", function () {
loadSkills();
}),
$(window).on("scroll", function () {
$(window).scrollTop() >= 100
? $(".menu-wrap").addClass("fixed")
: $(".menu-wrap").removeClass("fixed");
});
}
function loadCountdown() {
$("#clock").countdown("2022/10/24 00:00", function (t) {
$(this).html(
t.strftime(
'<div>%w <span class="title">Weeks</span></div><div>%d <span class="title">days</span></div><div>%H <span class="title">hours</span></div><div>%S <span class="title">seconds</span></div>'
)
);
});
}
function speacialCount() {
$("#specialclock").countdown("2022/12/6", function (t) {
$(this).html(t.strftime("Time left: [ %D days %H:%M:%S ]"));
});
}
function offheight() {
if ($(window).width() > 750) {
var t = $(".offers").outerHeight(!0);
$(".offers.light").css("height", t + 1);
}
}
function loadWindowSettings() {
offheight(),
$(window).width() < 750 &&
$(".nav-menu .main-menu > .menu-item-has-children > a").on(
"click",
function () {
if ("#" !== $(this).attr("href"))
return $(this).next().slideToggle(0), !1;
}
);
}
function updateSlidesPerView(t, e, i, n) {
var o = $(window).width();
$(window).height();
return o > 1199 ? n : o > 991 ? i : o > 700 ? e : t;
}
$(function () {
$('[data-bs-toggle="tooltip"]').tooltip();
});

18
static/felcloud/website/js/slick.min.js vendored Normal file

File diff suppressed because one or more lines are too long

7050
static/felcloud/website/js/swiper.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,625 @@
/*!
*
* typed.js - A JavaScript Typing Animation Library
* Author: Matt Boldt <me@mattboldt.com>
* Version: v2.0.11
* Url: https://github.com/mattboldt/typed.js
* License(s): MIT
*
*/
(function (t, e) {
"object" == typeof exports && "object" == typeof module
? (module.exports = e())
: "function" == typeof define && define.amd
? define([], e)
: "object" == typeof exports
? (exports.Typed = e())
: (t.Typed = e());
})(this, function () {
return (function (t) {
function e(n) {
if (s[n]) return s[n].exports;
var i = (s[n] = { exports: {}, id: n, loaded: !1 });
return t[n].call(i.exports, i, i.exports, e), (i.loaded = !0), i.exports;
}
var s = {};
return (e.m = t), (e.c = s), (e.p = ""), e(0);
})([
function (t, e, s) {
"use strict";
function n(t, e) {
if (!(t instanceof e))
throw new TypeError("Cannot call a class as a function");
}
Object.defineProperty(e, "__esModule", { value: !0 });
var i = (function () {
function t(t, e) {
for (var s = 0; s < e.length; s++) {
var n = e[s];
(n.enumerable = n.enumerable || !1),
(n.configurable = !0),
"value" in n && (n.writable = !0),
Object.defineProperty(t, n.key, n);
}
}
return function (e, s, n) {
return s && t(e.prototype, s), n && t(e, n), e;
};
})(),
r = s(1),
o = s(3),
a = (function () {
function t(e, s) {
n(this, t), r.initializer.load(this, s, e), this.begin();
}
return (
i(t, [
{
key: "toggle",
value: function () {
this.pause.status ? this.start() : this.stop();
},
},
{
key: "stop",
value: function () {
this.typingComplete ||
this.pause.status ||
(this.toggleBlinking(!0),
(this.pause.status = !0),
this.options.onStop(this.arrayPos, this));
},
},
{
key: "start",
value: function () {
this.typingComplete ||
(this.pause.status &&
((this.pause.status = !1),
this.pause.typewrite
? this.typewrite(
this.pause.curString,
this.pause.curStrPos
)
: this.backspace(
this.pause.curString,
this.pause.curStrPos
),
this.options.onStart(this.arrayPos, this)));
},
},
{
key: "destroy",
value: function () {
this.reset(!1), this.options.onDestroy(this);
},
},
{
key: "reset",
value: function () {
var t =
arguments.length <= 0 ||
void 0 === arguments[0] ||
arguments[0];
clearInterval(this.timeout),
this.replaceText(""),
this.cursor &&
this.cursor.parentNode &&
(this.cursor.parentNode.removeChild(this.cursor),
(this.cursor = null)),
(this.strPos = 0),
(this.arrayPos = 0),
(this.curLoop = 0),
t &&
(this.insertCursor(),
this.options.onReset(this),
this.begin());
},
},
{
key: "begin",
value: function () {
var t = this;
this.options.onBegin(this),
(this.typingComplete = !1),
this.shuffleStringsIfNeeded(this),
this.insertCursor(),
this.bindInputFocusEvents && this.bindFocusEvents(),
(this.timeout = setTimeout(function () {
t.currentElContent && 0 !== t.currentElContent.length
? t.backspace(
t.currentElContent,
t.currentElContent.length
)
: t.typewrite(
t.strings[t.sequence[t.arrayPos]],
t.strPos
);
}, this.startDelay));
},
},
{
key: "typewrite",
value: function (t, e) {
var s = this;
this.fadeOut &&
this.el.classList.contains(this.fadeOutClass) &&
(this.el.classList.remove(this.fadeOutClass),
this.cursor &&
this.cursor.classList.remove(this.fadeOutClass));
var n = this.humanizer(this.typeSpeed),
i = 1;
return this.pause.status === !0
? void this.setPauseStatus(t, e, !0)
: void (this.timeout = setTimeout(function () {
e = o.htmlParser.typeHtmlChars(t, e, s);
var n = 0,
r = t.substr(e);
if ("^" === r.charAt(0) && /^\^\d+/.test(r)) {
var a = 1;
(r = /\d+/.exec(r)[0]),
(a += r.length),
(n = parseInt(r)),
(s.temporaryPause = !0),
s.options.onTypingPaused(s.arrayPos, s),
(t = t.substring(0, e) + t.substring(e + a)),
s.toggleBlinking(!0);
}
if ("`" === r.charAt(0)) {
for (
;
"`" !== t.substr(e + i).charAt(0) &&
(i++, !(e + i > t.length));
);
var u = t.substring(0, e),
l = t.substring(u.length + 1, e + i),
c = t.substring(e + i + 1);
(t = u + l + c), i--;
}
s.timeout = setTimeout(function () {
s.toggleBlinking(!1),
e >= t.length
? s.doneTyping(t, e)
: s.keepTyping(t, e, i),
s.temporaryPause &&
((s.temporaryPause = !1),
s.options.onTypingResumed(s.arrayPos, s));
}, n);
}, n));
},
},
{
key: "keepTyping",
value: function (t, e, s) {
0 === e &&
(this.toggleBlinking(!1),
this.options.preStringTyped(this.arrayPos, this)),
(e += s);
var n = t.substr(0, e);
this.replaceText(n), this.typewrite(t, e);
},
},
{
key: "doneTyping",
value: function (t, e) {
var s = this;
this.options.onStringTyped(this.arrayPos, this),
this.toggleBlinking(!0),
(this.arrayPos === this.strings.length - 1 &&
(this.complete(),
this.loop === !1 || this.curLoop === this.loopCount)) ||
(this.timeout = setTimeout(function () {
s.backspace(t, e);
}, this.backDelay));
},
},
{
key: "backspace",
value: function (t, e) {
var s = this;
if (this.pause.status === !0)
return void this.setPauseStatus(t, e, !0);
if (this.fadeOut) return this.initFadeOut();
this.toggleBlinking(!1);
var n = this.humanizer(this.backSpeed);
this.timeout = setTimeout(function () {
e = o.htmlParser.backSpaceHtmlChars(t, e, s);
var n = t.substr(0, e);
if ((s.replaceText(n), s.smartBackspace)) {
var i = s.strings[s.arrayPos + 1];
i && n === i.substr(0, e)
? (s.stopNum = e)
: (s.stopNum = 0);
}
e > s.stopNum
? (e--, s.backspace(t, e))
: e <= s.stopNum &&
(s.arrayPos++,
s.arrayPos === s.strings.length
? ((s.arrayPos = 0),
s.options.onLastStringBackspaced(),
s.shuffleStringsIfNeeded(),
s.begin())
: s.typewrite(s.strings[s.sequence[s.arrayPos]], e));
}, n);
},
},
{
key: "complete",
value: function () {
this.options.onComplete(this),
this.loop ? this.curLoop++ : (this.typingComplete = !0);
},
},
{
key: "setPauseStatus",
value: function (t, e, s) {
(this.pause.typewrite = s),
(this.pause.curString = t),
(this.pause.curStrPos = e);
},
},
{
key: "toggleBlinking",
value: function (t) {
this.cursor &&
(this.pause.status ||
(this.cursorBlinking !== t &&
((this.cursorBlinking = t),
t
? this.cursor.classList.add("typed-cursor--blink")
: this.cursor.classList.remove(
"typed-cursor--blink"
))));
},
},
{
key: "humanizer",
value: function (t) {
return Math.round((Math.random() * t) / 2) + t;
},
},
{
key: "shuffleStringsIfNeeded",
value: function () {
this.shuffle &&
(this.sequence = this.sequence.sort(function () {
return Math.random() - 0.5;
}));
},
},
{
key: "initFadeOut",
value: function () {
var t = this;
return (
(this.el.className += " " + this.fadeOutClass),
this.cursor &&
(this.cursor.className += " " + this.fadeOutClass),
setTimeout(function () {
t.arrayPos++,
t.replaceText(""),
t.strings.length > t.arrayPos
? t.typewrite(t.strings[t.sequence[t.arrayPos]], 0)
: (t.typewrite(t.strings[0], 0), (t.arrayPos = 0));
}, this.fadeOutDelay)
);
},
},
{
key: "replaceText",
value: function (t) {
this.attr
? this.el.setAttribute(this.attr, t)
: this.isInput
? (this.el.value = t)
: "html" === this.contentType
? (this.el.innerHTML = t)
: (this.el.textContent = t);
},
},
{
key: "bindFocusEvents",
value: function () {
var t = this;
this.isInput &&
(this.el.addEventListener("focus", function (e) {
t.stop();
}),
this.el.addEventListener("blur", function (e) {
(t.el.value && 0 !== t.el.value.length) || t.start();
}));
},
},
{
key: "insertCursor",
value: function () {
this.showCursor &&
(this.cursor ||
((this.cursor = document.createElement("span")),
(this.cursor.className = "typed-cursor"),
(this.cursor.innerHTML = this.cursorChar),
this.el.parentNode &&
this.el.parentNode.insertBefore(
this.cursor,
this.el.nextSibling
)));
},
},
]),
t
);
})();
(e["default"] = a), (t.exports = e["default"]);
},
function (t, e, s) {
"use strict";
function n(t) {
return t && t.__esModule ? t : { default: t };
}
function i(t, e) {
if (!(t instanceof e))
throw new TypeError("Cannot call a class as a function");
}
Object.defineProperty(e, "__esModule", { value: !0 });
var r =
Object.assign ||
function (t) {
for (var e = 1; e < arguments.length; e++) {
var s = arguments[e];
for (var n in s)
Object.prototype.hasOwnProperty.call(s, n) && (t[n] = s[n]);
}
return t;
},
o = (function () {
function t(t, e) {
for (var s = 0; s < e.length; s++) {
var n = e[s];
(n.enumerable = n.enumerable || !1),
(n.configurable = !0),
"value" in n && (n.writable = !0),
Object.defineProperty(t, n.key, n);
}
}
return function (e, s, n) {
return s && t(e.prototype, s), n && t(e, n), e;
};
})(),
a = s(2),
u = n(a),
l = (function () {
function t() {
i(this, t);
}
return (
o(t, [
{
key: "load",
value: function (t, e, s) {
if (
("string" == typeof s
? (t.el = document.querySelector(s))
: (t.el = s),
(t.options = r({}, u["default"], e)),
(t.isInput = "input" === t.el.tagName.toLowerCase()),
(t.attr = t.options.attr),
(t.bindInputFocusEvents = t.options.bindInputFocusEvents),
(t.showCursor = !t.isInput && t.options.showCursor),
(t.cursorChar = t.options.cursorChar),
(t.cursorBlinking = !0),
(t.elContent = t.attr
? t.el.getAttribute(t.attr)
: t.el.textContent),
(t.contentType = t.options.contentType),
(t.typeSpeed = t.options.typeSpeed),
(t.startDelay = t.options.startDelay),
(t.backSpeed = t.options.backSpeed),
(t.smartBackspace = t.options.smartBackspace),
(t.backDelay = t.options.backDelay),
(t.fadeOut = t.options.fadeOut),
(t.fadeOutClass = t.options.fadeOutClass),
(t.fadeOutDelay = t.options.fadeOutDelay),
(t.isPaused = !1),
(t.strings = t.options.strings.map(function (t) {
return t.trim();
})),
"string" == typeof t.options.stringsElement
? (t.stringsElement = document.querySelector(
t.options.stringsElement
))
: (t.stringsElement = t.options.stringsElement),
t.stringsElement)
) {
(t.strings = []), (t.stringsElement.style.display = "none");
var n = Array.prototype.slice.apply(
t.stringsElement.children
),
i = n.length;
if (i)
for (var o = 0; o < i; o += 1) {
var a = n[o];
t.strings.push(a.innerHTML.trim());
}
}
(t.strPos = 0),
(t.arrayPos = 0),
(t.stopNum = 0),
(t.loop = t.options.loop),
(t.loopCount = t.options.loopCount),
(t.curLoop = 0),
(t.shuffle = t.options.shuffle),
(t.sequence = []),
(t.pause = {
status: !1,
typewrite: !0,
curString: "",
curStrPos: 0,
}),
(t.typingComplete = !1);
for (var o in t.strings) t.sequence[o] = o;
(t.currentElContent = this.getCurrentElContent(t)),
(t.autoInsertCss = t.options.autoInsertCss),
this.appendAnimationCss(t);
},
},
{
key: "getCurrentElContent",
value: function (t) {
var e = "";
return (e = t.attr
? t.el.getAttribute(t.attr)
: t.isInput
? t.el.value
: "html" === t.contentType
? t.el.innerHTML
: t.el.textContent);
},
},
{
key: "appendAnimationCss",
value: function (t) {
var e = "data-typed-js-css";
if (
t.autoInsertCss &&
(t.showCursor || t.fadeOut) &&
!document.querySelector("[" + e + "]")
) {
var s = document.createElement("style");
(s.type = "text/css"), s.setAttribute(e, !0);
var n = "";
t.showCursor &&
(n +=
"\n .typed-cursor{\n opacity: 1;\n }\n .typed-cursor.typed-cursor--blink{\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n "),
t.fadeOut &&
(n +=
"\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n }\n .typed-cursor.typed-cursor--blink.typed-fade-out{\n -webkit-animation: 0;\n animation: 0;\n }\n "),
0 !== s.length &&
((s.innerHTML = n), document.body.appendChild(s));
}
},
},
]),
t
);
})();
e["default"] = l;
var c = new l();
e.initializer = c;
},
function (t, e) {
"use strict";
Object.defineProperty(e, "__esModule", { value: !0 });
var s = {
strings: [
"These are the default values...",
"You know what you should do?",
"Use your own!",
"Have a great day!",
],
stringsElement: null,
typeSpeed: 0,
startDelay: 0,
backSpeed: 0,
smartBackspace: !0,
shuffle: !1,
backDelay: 700,
fadeOut: !1,
fadeOutClass: "typed-fade-out",
fadeOutDelay: 500,
loop: !1,
loopCount: 1 / 0,
showCursor: !0,
cursorChar: "|",
autoInsertCss: !0,
attr: null,
bindInputFocusEvents: !1,
contentType: "html",
onBegin: function (t) {},
onComplete: function (t) {},
preStringTyped: function (t, e) {},
onStringTyped: function (t, e) {},
onLastStringBackspaced: function (t) {},
onTypingPaused: function (t, e) {},
onTypingResumed: function (t, e) {},
onReset: function (t) {},
onStop: function (t, e) {},
onStart: function (t, e) {},
onDestroy: function (t) {},
};
(e["default"] = s), (t.exports = e["default"]);
},
function (t, e) {
"use strict";
function s(t, e) {
if (!(t instanceof e))
throw new TypeError("Cannot call a class as a function");
}
Object.defineProperty(e, "__esModule", { value: !0 });
var n = (function () {
function t(t, e) {
for (var s = 0; s < e.length; s++) {
var n = e[s];
(n.enumerable = n.enumerable || !1),
(n.configurable = !0),
"value" in n && (n.writable = !0),
Object.defineProperty(t, n.key, n);
}
}
return function (e, s, n) {
return s && t(e.prototype, s), n && t(e, n), e;
};
})(),
i = (function () {
function t() {
s(this, t);
}
return (
n(t, [
{
key: "typeHtmlChars",
value: function (t, e, s) {
if ("html" !== s.contentType) return e;
var n = t.substr(e).charAt(0);
if ("<" === n || "&" === n) {
var i = "";
for (
i = "<" === n ? ">" : ";";
t.substr(e + 1).charAt(0) !== i &&
(e++, !(e + 1 > t.length));
);
e++;
}
return e;
},
},
{
key: "backSpaceHtmlChars",
value: function (t, e, s) {
if ("html" !== s.contentType) return e;
var n = t.substr(e).charAt(0);
if (">" === n || ";" === n) {
var i = "";
for (
i = ">" === n ? "<" : "&";
t.substr(e - 1).charAt(0) !== i && (e--, !(e < 0));
);
e--;
}
return e;
},
},
]),
t
);
})();
e["default"] = i;
var r = new i();
e.htmlParser = r;
},
]);
});
//# sourceMappingURL=typed.min.js.map

448
static/felcloud/website/js/wow.min.js vendored Normal file
View File

@ -0,0 +1,448 @@
/*! WOW - v1.1.3 - 2016-05-06
* Copyright (c) 2016 Matthieu Aussaguel;*/ (function () {
var a,
b,
c,
d,
e,
f = function (a, b) {
return function () {
return a.apply(b, arguments);
};
},
g =
[].indexOf ||
function (a) {
for (var b = 0, c = this.length; c > b; b++)
if (b in this && this[b] === a) return b;
return -1;
};
(b = (function () {
function a() {}
return (
(a.prototype.extend = function (a, b) {
var c, d;
for (c in b) (d = b[c]), null == a[c] && (a[c] = d);
return a;
}),
(a.prototype.isMobile = function (a) {
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
a
);
}),
(a.prototype.createEvent = function (a, b, c, d) {
var e;
return (
null == b && (b = !1),
null == c && (c = !1),
null == d && (d = null),
null != document.createEvent
? ((e = document.createEvent("CustomEvent")),
e.initCustomEvent(a, b, c, d))
: null != document.createEventObject
? ((e = document.createEventObject()), (e.eventType = a))
: (e.eventName = a),
e
);
}),
(a.prototype.emitEvent = function (a, b) {
return null != a.dispatchEvent
? a.dispatchEvent(b)
: b in (null != a)
? a[b]()
: "on" + b in (null != a)
? a["on" + b]()
: void 0;
}),
(a.prototype.addEvent = function (a, b, c) {
return null != a.addEventListener
? a.addEventListener(b, c, !1)
: null != a.attachEvent
? a.attachEvent("on" + b, c)
: (a[b] = c);
}),
(a.prototype.removeEvent = function (a, b, c) {
return null != a.removeEventListener
? a.removeEventListener(b, c, !1)
: null != a.detachEvent
? a.detachEvent("on" + b, c)
: delete a[b];
}),
(a.prototype.innerHeight = function () {
return "innerHeight" in window
? window.innerHeight
: document.documentElement.clientHeight;
}),
a
);
})()),
(c =
this.WeakMap ||
this.MozWeakMap ||
(c = (function () {
function a() {
(this.keys = []), (this.values = []);
}
return (
(a.prototype.get = function (a) {
var b, c, d, e, f;
for (f = this.keys, b = d = 0, e = f.length; e > d; b = ++d)
if (((c = f[b]), c === a)) return this.values[b];
}),
(a.prototype.set = function (a, b) {
var c, d, e, f, g;
for (g = this.keys, c = e = 0, f = g.length; f > e; c = ++e)
if (((d = g[c]), d === a)) return void (this.values[c] = b);
return this.keys.push(a), this.values.push(b);
}),
a
);
})())),
(a =
this.MutationObserver ||
this.WebkitMutationObserver ||
this.MozMutationObserver ||
(a = (function () {
function a() {
"undefined" != typeof console &&
null !== console &&
console.warn("MutationObserver is not supported by your browser."),
"undefined" != typeof console &&
null !== console &&
console.warn(
"WOW.js cannot detect dom mutations, please call .sync() after loading new content."
);
}
return (a.notSupported = !0), (a.prototype.observe = function () {}), a;
})())),
(d =
this.getComputedStyle ||
function (a, b) {
return (
(this.getPropertyValue = function (b) {
var c;
return (
"float" === b && (b = "styleFloat"),
e.test(b) &&
b.replace(e, function (a, b) {
return b.toUpperCase();
}),
(null != (c = a.currentStyle) ? c[b] : void 0) || null
);
}),
this
);
}),
(e = /(\-([a-z]){1})/g),
(this.WOW = (function () {
function e(a) {
null == a && (a = {}),
(this.scrollCallback = f(this.scrollCallback, this)),
(this.scrollHandler = f(this.scrollHandler, this)),
(this.resetAnimation = f(this.resetAnimation, this)),
(this.start = f(this.start, this)),
(this.scrolled = !0),
(this.config = this.util().extend(a, this.defaults)),
null != a.scrollContainer &&
(this.config.scrollContainer = document.querySelector(
a.scrollContainer
)),
(this.animationNameCache = new c()),
(this.wowEvent = this.util().createEvent(this.config.boxClass));
}
return (
(e.prototype.defaults = {
boxClass: "wow",
animateClass: "animated",
offset: 0,
mobile: !0,
live: !0,
callback: null,
scrollContainer: null,
}),
(e.prototype.init = function () {
var a;
return (
(this.element = window.document.documentElement),
"interactive" === (a = document.readyState) || "complete" === a
? this.start()
: this.util().addEvent(document, "DOMContentLoaded", this.start),
(this.finished = [])
);
}),
(e.prototype.start = function () {
var b, c, d, e;
if (
((this.stopped = !1),
(this.boxes = function () {
var a, c, d, e;
for (
d = this.element.querySelectorAll("." + this.config.boxClass),
e = [],
a = 0,
c = d.length;
c > a;
a++
)
(b = d[a]), e.push(b);
return e;
}.call(this)),
(this.all = function () {
var a, c, d, e;
for (d = this.boxes, e = [], a = 0, c = d.length; c > a; a++)
(b = d[a]), e.push(b);
return e;
}.call(this)),
this.boxes.length)
)
if (this.disabled()) this.resetStyle();
else
for (e = this.boxes, c = 0, d = e.length; d > c; c++)
(b = e[c]), this.applyStyle(b, !0);
return (
this.disabled() ||
(this.util().addEvent(
this.config.scrollContainer || window,
"scroll",
this.scrollHandler
),
this.util().addEvent(window, "resize", this.scrollHandler),
(this.interval = setInterval(this.scrollCallback, 50))),
this.config.live
? new a(
(function (a) {
return function (b) {
var c, d, e, f, g;
for (g = [], c = 0, d = b.length; d > c; c++)
(f = b[c]),
g.push(
function () {
var a, b, c, d;
for (
c = f.addedNodes || [],
d = [],
a = 0,
b = c.length;
b > a;
a++
)
(e = c[a]), d.push(this.doSync(e));
return d;
}.call(a)
);
return g;
};
})(this)
).observe(document.body, { childList: !0, subtree: !0 })
: void 0
);
}),
(e.prototype.stop = function () {
return (
(this.stopped = !0),
this.util().removeEvent(
this.config.scrollContainer || window,
"scroll",
this.scrollHandler
),
this.util().removeEvent(window, "resize", this.scrollHandler),
null != this.interval ? clearInterval(this.interval) : void 0
);
}),
(e.prototype.sync = function (b) {
return a.notSupported ? this.doSync(this.element) : void 0;
}),
(e.prototype.doSync = function (a) {
var b, c, d, e, f;
if ((null == a && (a = this.element), 1 === a.nodeType)) {
for (
a = a.parentNode || a,
e = a.querySelectorAll("." + this.config.boxClass),
f = [],
c = 0,
d = e.length;
d > c;
c++
)
(b = e[c]),
g.call(this.all, b) < 0
? (this.boxes.push(b),
this.all.push(b),
this.stopped || this.disabled()
? this.resetStyle()
: this.applyStyle(b, !0),
f.push((this.scrolled = !0)))
: f.push(void 0);
return f;
}
}),
(e.prototype.show = function (a) {
return (
this.applyStyle(a),
(a.className = a.className + " " + this.config.animateClass),
null != this.config.callback && this.config.callback(a),
this.util().emitEvent(a, this.wowEvent),
this.util().addEvent(a, "animationend", this.resetAnimation),
this.util().addEvent(a, "oanimationend", this.resetAnimation),
this.util().addEvent(a, "webkitAnimationEnd", this.resetAnimation),
this.util().addEvent(a, "MSAnimationEnd", this.resetAnimation),
a
);
}),
(e.prototype.applyStyle = function (a, b) {
var c, d, e;
return (
(d = a.getAttribute("data-wow-duration")),
(c = a.getAttribute("data-wow-delay")),
(e = a.getAttribute("data-wow-iteration")),
this.animate(
(function (f) {
return function () {
return f.customStyle(a, b, d, c, e);
};
})(this)
)
);
}),
(e.prototype.animate = (function () {
return "requestAnimationFrame" in window
? function (a) {
return window.requestAnimationFrame(a);
}
: function (a) {
return a();
};
})()),
(e.prototype.resetStyle = function () {
var a, b, c, d, e;
for (d = this.boxes, e = [], b = 0, c = d.length; c > b; b++)
(a = d[b]), e.push((a.style.visibility = "visible"));
return e;
}),
(e.prototype.resetAnimation = function (a) {
var b;
return a.type.toLowerCase().indexOf("animationend") >= 0
? ((b = a.target || a.srcElement),
(b.className = b.className
.replace(this.config.animateClass, "")
.trim()))
: void 0;
}),
(e.prototype.customStyle = function (a, b, c, d, e) {
return (
b && this.cacheAnimationName(a),
(a.style.visibility = b ? "hidden" : "visible"),
c && this.vendorSet(a.style, { animationDuration: c }),
d && this.vendorSet(a.style, { animationDelay: d }),
e && this.vendorSet(a.style, { animationIterationCount: e }),
this.vendorSet(a.style, {
animationName: b ? "none" : this.cachedAnimationName(a),
}),
a
);
}),
(e.prototype.vendors = ["moz", "webkit"]),
(e.prototype.vendorSet = function (a, b) {
var c, d, e, f;
d = [];
for (c in b)
(e = b[c]),
(a["" + c] = e),
d.push(
function () {
var b, d, g, h;
for (
g = this.vendors, h = [], b = 0, d = g.length;
d > b;
b++
)
(f = g[b]),
h.push(
(a["" + f + c.charAt(0).toUpperCase() + c.substr(1)] =
e)
);
return h;
}.call(this)
);
return d;
}),
(e.prototype.vendorCSS = function (a, b) {
var c, e, f, g, h, i;
for (
h = d(a),
g = h.getPropertyCSSValue(b),
f = this.vendors,
c = 0,
e = f.length;
e > c;
c++
)
(i = f[c]), (g = g || h.getPropertyCSSValue("-" + i + "-" + b));
return g;
}),
(e.prototype.animationName = function (a) {
var b;
try {
b = this.vendorCSS(a, "animation-name").cssText;
} catch (c) {
b = d(a).getPropertyValue("animation-name");
}
return "none" === b ? "" : b;
}),
(e.prototype.cacheAnimationName = function (a) {
return this.animationNameCache.set(a, this.animationName(a));
}),
(e.prototype.cachedAnimationName = function (a) {
return this.animationNameCache.get(a);
}),
(e.prototype.scrollHandler = function () {
return (this.scrolled = !0);
}),
(e.prototype.scrollCallback = function () {
var a;
return !this.scrolled ||
((this.scrolled = !1),
(this.boxes = function () {
var b, c, d, e;
for (d = this.boxes, e = [], b = 0, c = d.length; c > b; b++)
(a = d[b]), a && (this.isVisible(a) ? this.show(a) : e.push(a));
return e;
}.call(this)),
this.boxes.length || this.config.live)
? void 0
: this.stop();
}),
(e.prototype.offsetTop = function (a) {
for (var b; void 0 === a.offsetTop; ) a = a.parentNode;
for (b = a.offsetTop; (a = a.offsetParent); ) b += a.offsetTop;
return b;
}),
(e.prototype.isVisible = function (a) {
var b, c, d, e, f;
return (
(c = a.getAttribute("data-wow-offset") || this.config.offset),
(f =
(this.config.scrollContainer &&
this.config.scrollContainer.scrollTop) ||
window.pageYOffset),
(e =
f +
Math.min(this.element.clientHeight, this.util().innerHeight()) -
c),
(d = this.offsetTop(a)),
(b = d + a.clientHeight),
e >= d && b >= f
);
}),
(e.prototype.util = function () {
return null != this._util ? this._util : (this._util = new b());
}),
(e.prototype.disabled = function () {
return (
!this.config.mobile && this.util().isMobile(navigator.userAgent)
);
}),
e
);
})());
}).call(this);

204
static/global/js/Plugin.js Normal file
View File

@ -0,0 +1,204 @@
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define("/Plugin", ["exports", "jquery"], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require("jquery"));
} else {
var mod = {
exports: {},
};
factory(mod.exports, global.jQuery);
global.Plugin = mod.exports;
}
})(this, function (_exports, _jquery) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true,
});
_exports.getPluginAPI = getPluginAPI;
_exports.getPlugin = getPlugin;
_exports.getDefaults = getDefaults;
_exports.pluginFactory = pluginFactory;
_exports.default = _exports.Plugin = void 0;
_jquery = babelHelpers.interopRequireDefault(_jquery);
var plugins = {};
var apis = {};
var Plugin =
/*#__PURE__*/
(function () {
function Plugin($el) {
var options =
arguments.length > 1 && arguments[1] !== undefined
? arguments[1]
: {};
babelHelpers.classCallCheck(this, Plugin);
this.name = this.getName();
this.$el = $el;
this.options = options;
this.isRendered = false;
}
babelHelpers.createClass(
Plugin,
[
{
key: "getName",
value: function getName() {
return "plugin";
},
},
{
key: "render",
value: function render() {
if (_jquery.default.fn[this.name]) {
this.$el[this.name](this.options);
} else {
return false;
}
},
},
{
key: "initialize",
value: function initialize() {
if (this.isRendered) {
return false;
}
this.render();
this.isRendered = true;
},
},
],
[
{
key: "getDefaults",
value: function getDefaults() {
return {};
},
},
{
key: "register",
value: function register(name, obj) {
if (typeof obj === "undefined") {
return;
}
plugins[name] = obj;
if (typeof obj.api !== "undefined") {
Plugin.registerApi(name, obj);
}
},
},
{
key: "registerApi",
value: function registerApi(name, obj) {
var api = obj.api();
if (typeof api === "string") {
var _api = obj.api().split("|");
var event = "".concat(_api[0], ".plugin.").concat(name);
var func = _api[1] || "render";
var callback = function callback(e) {
var $el = (0, _jquery.default)(this);
var plugin = $el.data("pluginInstance");
if (!plugin) {
plugin = new obj(
$el,
_jquery.default.extend(
true,
{},
getDefaults(name),
$el.data()
)
);
plugin.initialize();
$el.data("pluginInstance", plugin);
}
plugin[func](e);
};
apis[name] = function (selector, context) {
if (context) {
(0, _jquery.default)(context).off(event);
(0, _jquery.default)(context).on(event, selector, callback);
} else {
(0, _jquery.default)(selector).on(event, callback);
}
};
} else if (typeof api === "function") {
apis[name] = api;
}
},
},
]
);
return Plugin;
})();
_exports.Plugin = Plugin;
function getPluginAPI(name) {
if (typeof name === "undefined") {
return apis;
}
return apis[name];
}
function getPlugin(name) {
if (typeof plugins[name] !== "undefined") {
return plugins[name];
}
console.warn("Plugin:".concat(name, " has no warpped class."));
return false;
}
function getDefaults(name) {
var PluginClass = getPlugin(name);
if (PluginClass) {
return PluginClass.getDefaults();
}
return {};
}
function pluginFactory(name, $el) {
var options =
arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var PluginClass = getPlugin(name);
if (PluginClass && typeof PluginClass.api === "undefined") {
return new PluginClass(
$el,
_jquery.default.extend(true, {}, getDefaults(name), options)
);
} else if (_jquery.default.fn[name]) {
var plugin = new Plugin($el, options);
plugin.getName = function () {
return name;
};
plugin.name = name;
return plugin;
} else if (typeof PluginClass.api !== "undefined") {
// console.log('Plugin:' + name + ' use api render.');
return false;
}
console.warn("Plugin:".concat(name, " script is not loaded."));
return false;
}
var _default = Plugin;
_exports.default = _default;
});

View File

@ -0,0 +1,103 @@
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define("/Plugin/toastr", ["exports", "Plugin"], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require("Plugin"));
} else {
var mod = {
exports: {},
};
factory(mod.exports, global.Plugin);
global.PluginToastr = mod.exports;
}
})(this, function (_exports, _Plugin2) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true,
});
_exports.default = void 0;
_Plugin2 = babelHelpers.interopRequireDefault(_Plugin2);
var NAME = "toastr";
var Toastr =
/*#__PURE__*/
(function (_Plugin) {
babelHelpers.inherits(Toastr, _Plugin);
function Toastr() {
babelHelpers.classCallCheck(this, Toastr);
return babelHelpers.possibleConstructorReturn(
this,
babelHelpers.getPrototypeOf(Toastr).apply(this, arguments)
);
}
babelHelpers.createClass(
Toastr,
[
{
key: "getName",
value: function getName() {
return NAME;
},
},
{
key: "render",
value: function render() {
this.$el.data("toastrWrapApi", this);
},
},
{
key: "show",
value: function show(e) {
if (typeof toastr === "undefined") {
return;
}
e.preventDefault();
var options = this.options;
var message = options.message || "";
var type = options.type || "info";
var title = options.title || undefined;
switch (type) {
case "success":
toastr.success(message, title, options);
break;
case "warning":
toastr.warning(message, title, options);
break;
case "error":
toastr.error(message, title, options);
break;
case "info":
toastr.info(message, title, options);
break;
default:
toastr.info(message, title, options);
}
},
},
],
[
{
key: "api",
value: function api() {
return "click|show";
},
},
]
);
return Toastr;
})(_Plugin2.default);
_Plugin2.default.register(NAME, Toastr);
var _default = Toastr;
_exports.default = _default;
});

3076
static/global/js/htmx.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

282
static/global/vendor/toastr/toastr.css vendored Normal file
View File

@ -0,0 +1,282 @@
@charset "UTF-8";
.toast-title {
font-weight: 700;
}
.toast-message {
-ms-word-wrap: break-word;
word-wrap: break-word;
}
.toast-message a,
.toast-message label {
color: #fff;
}
.toast-message a:hover {
color: #ccd5db;
text-decoration: none;
}
.toast-close-button {
position: relative;
top: -0.3em;
right: -0.3em;
float: right;
margin-bottom: -0.5em;
font-size: 20px;
font-weight: 400;
color: #fff;
-webkit-text-shadow: 0 1px 0 white;
text-shadow: 0 1px 0 white;
opacity: 0.8;
}
.toast-close-button:hover,
.toast-close-button:focus {
color: #000;
text-decoration: none;
cursor: pointer;
opacity: 0.4;
outline: none;
}
/*Additional properties for button version
iOS requires the button element instead of an anchor tag.
If you want the anchor version, it requires `href="#"`.*/
button.toast-close-button {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}
.toast-top-center {
top: 12px;
right: 0;
width: 100%;
}
.toast-bottom-center {
right: 0;
bottom: 12px;
width: 100%;
}
.toast-top-full-width {
top: 0;
right: 0;
width: 100%;
}
.toast-top-full-width .toast {
margin-bottom: 0;
}
.toast-bottom-full-width {
right: 0;
bottom: 0;
width: 100%;
}
.toast-bottom-full-width .toast {
margin-bottom: 0;
}
.toast-top-left {
top: 12px;
left: 12px;
}
.toast-top-right {
top: 12px;
right: 12px;
}
.toast-bottom-right {
right: 12px;
bottom: 12px;
}
.toast-bottom-left {
bottom: 12px;
left: 12px;
}
.toast-example,
#toast-container {
position: fixed;
z-index: 1700;
pointer-events: none;
/*overrides*/
}
.toast-example *,
#toast-container * {
box-sizing: border-box;
}
.toast-example > div,
#toast-container > div {
position: relative;
width: 300px;
padding: 15px 20px;
margin: 0 0 6px;
overflow: hidden;
color: #a3afb7;
pointer-events: auto;
background-repeat: no-repeat;
background-position: 15px center;
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 0.215rem;
opacity: 0.95;
}
.toast-example > .toast-shadow,
#toast-container > .toast-shadow {
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.23);
}
.toast-example > .toast-shadow:hover,
#toast-container > .toast-shadow:hover {
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.23);
}
.toast-example > :hover,
#toast-container > :hover {
cursor: pointer;
opacity: 1;
}
.toast-example > .toast-success:not(.toast-just-text),
.toast-example > .toast-info:not(.toast-just-text),
.toast-example > .toast-warning:not(.toast-just-text),
.toast-example > .toast-error:not(.toast-just-text),
#toast-container > .toast-success:not(.toast-just-text),
#toast-container > .toast-info:not(.toast-just-text),
#toast-container > .toast-warning:not(.toast-just-text),
#toast-container > .toast-error:not(.toast-just-text) {
padding-left: 50px;
}
.toast-example > .toast-success:not(.toast-just-text):before,
.toast-example > .toast-info:not(.toast-just-text):before,
.toast-example > .toast-warning:not(.toast-just-text):before,
.toast-example > .toast-error:not(.toast-just-text):before,
#toast-container > .toast-success:not(.toast-just-text):before,
#toast-container > .toast-info:not(.toast-just-text):before,
#toast-container > .toast-warning:not(.toast-just-text):before,
#toast-container > .toast-error:not(.toast-just-text):before {
position: absolute;
top: 50%;
left: 12px;
font-family: "Web Icons";
font-size: 30px;
font-style: normal;
font-weight: 400;
-webkit-transform: translate(0, -50%);
transform: translate(0, -50%);
text-rendering: auto;
speak: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.toast-example > .toast-success,
#toast-container > .toast-success {
color: #fff;
}
.toast-example > .toast-success:not(.toast-just-text):before,
#toast-container > .toast-success:not(.toast-just-text):before {
content: "";
}
.toast-example > .toast-info,
#toast-container > .toast-info {
color: #fff;
}
.toast-example > .toast-info:not(.toast-just-text):before,
#toast-container > .toast-info:not(.toast-just-text):before {
content: "";
}
.toast-example > .toast-warning,
#toast-container > .toast-warning {
color: #fff;
}
.toast-example > .toast-warning:not(.toast-just-text):before,
#toast-container > .toast-warning:not(.toast-just-text):before {
content: "";
}
.toast-example > .toast-error,
#toast-container > .toast-error {
color: #fff;
}
.toast-example > .toast-error:not(.toast-just-text):before,
#toast-container > .toast-error:not(.toast-just-text):before {
content: "";
}
.toast-example.toast-top-center > div,
.toast-example.toast-bottom-center > div,
#toast-container.toast-top-center > div,
#toast-container.toast-bottom-center > div {
width: 300px;
margin-right: auto;
margin-left: auto;
}
.toast-example.toast-top-full-width > div,
.toast-example.toast-bottom-full-width > div,
#toast-container.toast-top-full-width > div,
#toast-container.toast-bottom-full-width > div {
width: 100%;
margin-right: auto;
margin-left: auto;
border-radius: 0;
}
.toast {
background-color: #e4eaee;
}
.toast-success {
background-color: #28d17c;
}
.toast-error {
background-color: #ff666b;
}
.toast-info {
background-color: #28c0de;
}
.toast-warning {
background-color: #f57d1b;
}
.toast-progress {
position: absolute;
bottom: 0;
left: 0;
height: 4px;
background-color: #000;
opacity: 0.1;
}
/*Responsive Design*/
@media all and (max-width: 240px) {
.toast-example > div,
#toast-container > div {
width: 11em;
}
.toast-example .toast-close-button,
#toast-container .toast-close-button {
top: -0.2em;
right: -0.2em;
}
}
@media all and (min-width: 241px) and (max-width: 480px) {
.toast-example > div,
#toast-container > div {
width: 18em;
}
.toast-example .toast-close-button,
#toast-container .toast-close-button {
top: -0.2em;
right: -0.2em;
}
}
@media (min-width: 480px) and (max-width: 767.98px) {
.toast-example > div,
#toast-container > div {
width: 25em;
}
}

517
static/global/vendor/toastr/toastr.js vendored Normal file
View File

@ -0,0 +1,517 @@
/*
* Toastr
* Copyright 2012-2015
* Authors: John Papa, Hans Fjällemark, and Tim Ferrell.
* All Rights Reserved.
* Use, reproduction, distribution, and modification of this code is subject to the terms and
* conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
*
* ARIA Support: Greta Krafsig
*
* Project: https://github.com/CodeSeven/toastr
*/
/* global define */
(function (define) {
define(["jquery"], function ($) {
return (function () {
var $container;
var listener;
var toastId = 0;
var toastType = {
error: "error",
info: "info",
success: "success",
warning: "warning",
};
var toastr = {
clear: clear,
remove: remove,
error: error,
getContainer: getContainer,
info: info,
options: {},
subscribe: subscribe,
success: success,
version: "2.1.4",
warning: warning,
};
var previousToast;
return toastr;
////////////////
function error(message, title, optionsOverride) {
return notify({
type: toastType.error,
iconClass: getOptions().iconClasses.error,
message: message,
optionsOverride: optionsOverride,
title: title,
});
}
function getContainer(options, create) {
if (!options) {
options = getOptions();
}
$container = $("#" + options.containerId);
if ($container.length) {
return $container;
}
if (create) {
$container = createContainer(options);
}
return $container;
}
function info(message, title, optionsOverride) {
return notify({
type: toastType.info,
iconClass: getOptions().iconClasses.info,
message: message,
optionsOverride: optionsOverride,
title: title,
});
}
function subscribe(callback) {
listener = callback;
}
function success(message, title, optionsOverride) {
return notify({
type: toastType.success,
iconClass: getOptions().iconClasses.success,
message: message,
optionsOverride: optionsOverride,
title: title,
});
}
function warning(message, title, optionsOverride) {
return notify({
type: toastType.warning,
iconClass: getOptions().iconClasses.warning,
message: message,
optionsOverride: optionsOverride,
title: title,
});
}
function clear($toastElement, clearOptions) {
var options = getOptions();
if (!$container) {
getContainer(options);
}
if (!clearToast($toastElement, options, clearOptions)) {
clearContainer(options);
}
}
function remove($toastElement) {
var options = getOptions();
if (!$container) {
getContainer(options);
}
if ($toastElement && $(":focus", $toastElement).length === 0) {
removeToast($toastElement);
return;
}
if ($container.children().length) {
$container.remove();
}
}
// internal functions
function clearContainer(options) {
var toastsToClear = $container.children();
for (var i = toastsToClear.length - 1; i >= 0; i--) {
clearToast($(toastsToClear[i]), options);
}
}
function clearToast($toastElement, options, clearOptions) {
var force =
clearOptions && clearOptions.force ? clearOptions.force : false;
if (
$toastElement &&
(force || $(":focus", $toastElement).length === 0)
) {
$toastElement[options.hideMethod]({
duration: options.hideDuration,
easing: options.hideEasing,
complete: function () {
removeToast($toastElement);
},
});
return true;
}
return false;
}
function createContainer(options) {
$container = $("<div/>")
.attr("id", options.containerId)
.addClass(options.positionClass);
$container.appendTo($(options.target));
return $container;
}
function getDefaults() {
return {
tapToDismiss: true,
toastClass: "toast",
containerId: "toast-container",
debug: false,
showMethod: "fadeIn", //fadeIn, slideDown, and show are built into jQuery
showDuration: 300,
showEasing: "swing", //swing and linear are built into jQuery
onShown: undefined,
hideMethod: "fadeOut",
hideDuration: 1000,
hideEasing: "swing",
onHidden: undefined,
closeMethod: false,
closeDuration: false,
closeEasing: false,
closeOnHover: true,
extendedTimeOut: 1000,
iconClasses: {
error: "toast-error",
info: "toast-info",
success: "toast-success",
warning: "toast-warning",
},
iconClass: "toast-info",
positionClass: "toast-top-right",
timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky
titleClass: "toast-title",
messageClass: "toast-message",
escapeHtml: false,
target: "body",
closeHtml: '<button type="button">&times;</button>',
closeClass: "toast-close-button",
newestOnTop: true,
preventDuplicates: false,
progressBar: false,
progressClass: "toast-progress",
rtl: false,
};
}
function publish(args) {
if (!listener) {
return;
}
listener(args);
}
function notify(map) {
var options = getOptions();
var iconClass = map.iconClass || options.iconClass;
if (typeof map.optionsOverride !== "undefined") {
options = $.extend(options, map.optionsOverride);
iconClass = map.optionsOverride.iconClass || iconClass;
}
if (shouldExit(options, map)) {
return;
}
toastId++;
$container = getContainer(options, true);
var intervalId = null;
var $toastElement = $("<div/>");
var $titleElement = $("<div/>");
var $messageElement = $("<div/>");
var $progressElement = $("<div/>");
var $closeElement = $(options.closeHtml);
var progressBar = {
intervalId: null,
hideEta: null,
maxHideTime: null,
};
var response = {
toastId: toastId,
state: "visible",
startTime: new Date(),
options: options,
map: map,
};
personalizeToast();
displayToast();
handleEvents();
publish(response);
if (options.debug && console) {
console.log(response);
}
return $toastElement;
function escapeHtml(source) {
if (source == null) {
source = "";
}
return source
.replace(/&/g, "&amp;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#39;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;");
}
function personalizeToast() {
setIcon();
setTitle();
setMessage();
setCloseButton();
setProgressBar();
setRTL();
setSequence();
setAria();
}
function setAria() {
var ariaValue = "";
switch (map.iconClass) {
case "toast-success":
case "toast-info":
ariaValue = "polite";
break;
default:
ariaValue = "assertive";
}
$toastElement.attr("aria-live", ariaValue);
}
function handleEvents() {
if (options.closeOnHover) {
$toastElement.hover(stickAround, delayedHideToast);
}
if (!options.onclick && options.tapToDismiss) {
$toastElement.click(hideToast);
}
if (options.closeButton && $closeElement) {
$closeElement.click(function (event) {
if (event.stopPropagation) {
event.stopPropagation();
} else if (
event.cancelBubble !== undefined &&
event.cancelBubble !== true
) {
event.cancelBubble = true;
}
if (options.onCloseClick) {
options.onCloseClick(event);
}
hideToast(true);
});
}
if (options.onclick) {
$toastElement.click(function (event) {
options.onclick(event);
hideToast();
});
}
}
function displayToast() {
$toastElement.hide();
$toastElement[options.showMethod]({
duration: options.showDuration,
easing: options.showEasing,
complete: options.onShown,
});
if (options.timeOut > 0) {
intervalId = setTimeout(hideToast, options.timeOut);
progressBar.maxHideTime = parseFloat(options.timeOut);
progressBar.hideEta =
new Date().getTime() + progressBar.maxHideTime;
if (options.progressBar) {
progressBar.intervalId = setInterval(updateProgress, 10);
}
}
}
function setIcon() {
if (map.iconClass) {
$toastElement.addClass(options.toastClass).addClass(iconClass);
}
}
function setSequence() {
if (options.newestOnTop) {
$container.prepend($toastElement);
} else {
$container.append($toastElement);
}
}
function setTitle() {
if (map.title) {
var suffix = map.title;
if (options.escapeHtml) {
suffix = escapeHtml(map.title);
}
$titleElement.append(suffix).addClass(options.titleClass);
$toastElement.append($titleElement);
}
}
function setMessage() {
if (map.message) {
var suffix = map.message;
if (options.escapeHtml) {
suffix = escapeHtml(map.message);
}
$messageElement.append(suffix).addClass(options.messageClass);
$toastElement.append($messageElement);
}
}
function setCloseButton() {
if (options.closeButton) {
$closeElement.addClass(options.closeClass).attr("role", "button");
$toastElement.prepend($closeElement);
}
}
function setProgressBar() {
if (options.progressBar) {
$progressElement.addClass(options.progressClass);
$toastElement.prepend($progressElement);
}
}
function setRTL() {
if (options.rtl) {
$toastElement.addClass("rtl");
}
}
function shouldExit(options, map) {
if (options.preventDuplicates) {
if (map.message === previousToast) {
return true;
} else {
previousToast = map.message;
}
}
return false;
}
function hideToast(override) {
var method =
override && options.closeMethod !== false
? options.closeMethod
: options.hideMethod;
var duration =
override && options.closeDuration !== false
? options.closeDuration
: options.hideDuration;
var easing =
override && options.closeEasing !== false
? options.closeEasing
: options.hideEasing;
if ($(":focus", $toastElement).length && !override) {
return;
}
clearTimeout(progressBar.intervalId);
return $toastElement[method]({
duration: duration,
easing: easing,
complete: function () {
removeToast($toastElement);
clearTimeout(intervalId);
if (options.onHidden && response.state !== "hidden") {
options.onHidden();
}
response.state = "hidden";
response.endTime = new Date();
publish(response);
},
});
}
function delayedHideToast() {
if (options.timeOut > 0 || options.extendedTimeOut > 0) {
intervalId = setTimeout(hideToast, options.extendedTimeOut);
progressBar.maxHideTime = parseFloat(options.extendedTimeOut);
progressBar.hideEta =
new Date().getTime() + progressBar.maxHideTime;
}
}
function stickAround() {
clearTimeout(intervalId);
progressBar.hideEta = 0;
$toastElement.stop(true, true)[options.showMethod]({
duration: options.showDuration,
easing: options.showEasing,
});
}
function updateProgress() {
var percentage =
((progressBar.hideEta - new Date().getTime()) /
progressBar.maxHideTime) *
100;
$progressElement.width(percentage + "%");
}
}
function getOptions() {
return $.extend({}, getDefaults(), toastr.options);
}
function removeToast($toastElement) {
if (!$container) {
$container = getContainer();
}
if ($toastElement.is(":visible")) {
return;
}
$toastElement.remove();
$toastElement = null;
if ($container.children().length === 0) {
$container.remove();
previousToast = undefined;
}
}
})();
});
})(
typeof define === "function" && define.amd
? define
: function (deps, factory) {
if (typeof module !== "undefined" && module.exports) {
//Node
module.exports = factory(require("jquery"));
} else {
window.toastr = factory(window.jQuery);
}
}
);

367
templates/base_website.html Normal file
View File

@ -0,0 +1,367 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>{% block title %}{% endblock %}</title>
<link
rel="icon"
href="/static/felcloud/website/img/felcloud.ico"
type="image/x-icon"
/>
<link
href="/static/felcloud/website/fonts/cloudicon/cloudicon.css"
rel="stylesheet"
onload="if(media!='all')media='all'"
/>
<link
href="/static/felcloud/website/fonts/fontawesome/css/all.css"
rel="stylesheet"
onload="if(media!='all')media='all'"
/>
<!-- CSS styles -->
<link
href="/static/felcloud/website/css/colors/dark.css"
rel="stylesheet"
/>
<link
href="/static/felcloud/website/css/bootstrap.min.css"
rel="stylesheet"
/>
<link
href="/static/felcloud/website/css/swiper.min.css"
rel="stylesheet"
onload="if(media!='all')media='all'"
/>
<link
href="/static/felcloud/website/css/animate.min.css"
rel="stylesheet"
onload="if(media!='all')media='all'"
/>
<link href="/static/felcloud/website/css/filter.css" rel="stylesheet" />
<link href="/static/felcloud/website/css/custom.css" rel="stylesheet" />
<link rel="stylesheet" href="/static/global/vendor/toastr/toastr.css" />
<link
rel="stylesheet"
href="/static/base/assets/examples/css/advanced/toastr.css"
/>
<link href="/static/felcloud/website/hardware.css" rel="stylesheet" />
<link
rel="stylesheet"
href="/static/base/assets/examples/css/uikit/modals.css"
/>
<link href="/static/felcloud/website/css/style.min.css" rel="stylesheet" />
<script>
var products = "{{ products }}";
var order_id = "{{order_id}}";
</script>
</head>
<body style="background-color: white">
<!-- ***** NEWS ***** -->
<!-- ***** NAV MENU DESKTOP ****** -->
<div
class="menu-wrap"
style="
border: 1px solid black;
padding: 20px 0 !important;
background-color: #33003b;
"
>
<div class="nav-menu">
<div class="container">
<div class="row align-items-center">
<div class="col-2 col-md-2">
<a
hx-post="/index"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
style="cursor: pointer"
>
<img
class="logo"
src="/static/felcloud/website/img/felcloud.ico"
alt="logo"
/>
</a>
</div>
<nav id="menu" class="col-10 col-md-10">
<div class="navigation float-end">
<button class="menu-toggle">
<span class="icon"></span>
<span class="icon"></span>
<span class="icon"></span>
</button>
<ul class="main-menu nav navbar-nav navbar-right navHome">
<li class="menu-item menu-item-has-children me-2">
<a
class="pe-1"
hx-post="/index"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
>
Home
</a>
</li>
<li class="menu-item">
<a
hx-post="/servers"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
>Servers
</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
</div>
</div>
<!-- ***** NAV MENU MOBILE ****** -->
<div class="menu-wrap mobile">
<div class="container">
<div class="row align-items-center">
<div class="col-6">
<a
hx-post="/index"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
><img
class="svg logo-menu d-block"
src="./assets/img/logo.svg"
alt="logo Antler"
/></a>
</div>
<div class="col-6">
<nav class="nav-menu float-end d-flex">
<div class="tech-box">
<img
class="svg"
src="./assets/img/menu.svg"
alt=""
data-bs-toggle="offcanvas"
data-bs-target="#offcanvasWithBackdrop"
aria-controls="offcanvasWithBackdrop"
/>
</div>
<button id="nav-toggle" class="menu-toggle">
<span class="icon"></span>
<span class="icon"></span>
<span class="icon"></span>
</button>
<div class="main-menu bg-seccolorstyle">
<div class="menu-item">
<a
class="mergecolor"
hx-post="/index"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
data-bs-toggle="dropdown"
>Home
<div class="badge bg-purple">NEW</div></a
>
</div>
<div class="menu-item">
<a
class="mergecolor"
hx-post="/servers"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
data-bs-toggle="dropdown"
>Servers
</a>
</div>
</div>
</nav>
</div>
</div>
</div>
</div>
<img
id="spinner3"
class="htmx-indicator"
src="/static/global/vendor/blueimp-file-upload/loading.gif"
style="
width: 100px;
height: 100px;
position: fixed;
top: 50%;
left: 44%;
z-index: 9999;
"
alt="Loading"
/>
<div id="bodyTarget" class="fade-me-in">{% include '/index.html' %}</div>
<footer class="footer" style="background-color: #33003b; bottom: 0">
<div>
<div class="footer-top">
<div class="row" style="justify-content: space-around">
<div class="col-sm-12 col-md-6">
<div class="heading">
<img
src="/static/felcloud/website/img/felcloud.ico"
alt="logo"
class="logo"
/>
</div>
<div class="subheading text-justify footParagraph">
with our best efforts, we are committed to providing you with
the best service and support. We are always here to help you
with any questions or concerns you may have. Thank you for
choosing us as your trusted partner in your journey towards
success.
</div>
<br />
<div class="soc-icons soc-iconsDiv">
<a href="#" target="_blank"
><i class="fab fa-facebook-f"></i
></a>
<a href="#" target="_blank"><i class="fab fa-linkedin"></i></a>
<a href="#" target="_blank"><i class="fab fa-twitter"></i></a>
<a href="#" target="_blank"><i class="fab fa-instagram"></i></a>
</div>
<div>
<a
href="/terms"
target="_blank"
style="color: white; text-decoration: underline"
><span data-i18n="[html]header.termsCond"></span
></a>
</div>
</div>
<div class="col-sm-12 col-md-3 contact">
<div class="heading contactTitle">
<span data-i18n="[html]header.contact"></span>
</div>
<ul class="footer-menu">
<li class="menu-item">
<a>
<img
class="footer-icon"
src="/static/felcloud/website/newTheme/tel.svg"
/>
+33 6 83 38 88 96</a
>
</li>
<li class="menu-item">
<a>
<img
class="footer-icon"
src="/static/felcloud/website/newTheme/envolop.svg"
/>
contact@felcloud.io</a
>
</li>
<li class="menu-item">
<a
><img
class="footer-icon"
src="/static/felcloud/website/newTheme/local.svg"
/>
<span>
<span data-i18n="[html]header.felAdd"></span>
</span>
<span>
<span data-i18n="[html]header.felPost"></span>
</span>
</a>
</li>
</ul>
</div>
<div class="text-center">
<div class="d-flex justify-content-center">
<ul class="payment-list" style="padding-left: 0">
<li><p data-i18n="[html]header.paymentsWeAccept"></p></li>
<li><i class="fab fa-cc-visa"></i></li>
<li><i class="fab fa-cc-mastercard"></i></li>
</ul>
</div>
<div id="year" class="copyrigh text-center"></div>
<span
><div class="crafted">
Crafted with
<i class="fas fa-heart" style="color: red"></i> by
<a href="https://{{console_host}}">Cloudnet</a>
</div></span
>
</div>
</div>
</div>
</div>
</footer>
<!-- ***** BUTTON GO TOP ***** -->
<a href="#0" class="cd-top"> <i class="fas fa-angle-up"></i> </a>
<!-- Javascript -->
<script src="/static/global/js/htmx.min.js"></script>
<script src="/static/global/vendor/babel-external-helpers/babel-external-helpers.js"></script>
<script src="/static/felcloud/website/js/jquery.min.js"></script>
<script defer src="/static/felcloud/website/js/popper.min.js"></script>
<script defer src="/static/felcloud/website/js/bootstrap.min.js"></script>
<script
defer
src="/static/felcloud/website/js/jquery.countdown.js"
></script>
<script
defer
src="/static/felcloud/website/js/jquery.magnific-popup.min.js"
></script>
<script defer src="/static/felcloud/website/js/slick.min.js"></script>
<script defer src="/static/felcloud/website/js/isotope.min.js"></script>
<script
defer
src="/static/felcloud/website/js/jquery.scrollme.min.js"
></script>
<script defer src="/static/felcloud/website/js/swiper.min.js"></script>
<script async src="/static/felcloud/website/js/lazysizes.min.js"></script>
<script
defer
src="/static/felcloud/website/js/owl.carousel.min.js"
></script>
<script defer src="/static/felcloud/website/js/scripts.min.js"></script>
<script src="/static/global/js/Plugin.js"></script>
<script src="/static/felcloud/website/js/typed.js"></script>
<script src="/static/felcloud/website/js/wow.min.js"></script>
<script>
new WOW().init();
</script>
<script src="/static/global/js/Plugin/toastr.js"></script>
<script src="/static/global/vendor/toastr/toastr.js"></script>
<script>
htmx.on("htmx:afterSettle", function (event) {
if (event.detail.xhr.responseURL.includes("/show_order")) {
$("#modalOrder").modal("show");
}
if (event.detail.xhr.responseURL.includes("/save_config_selection")) {
try {
const serverResponse = JSON.parse(event.detail.xhr.responseText);
const message = `<i class="fas fa-exclamation-triangle"></i> ${serverResponse.message}`;
const status = serverResponse.status;
if (status === "ko") {
toastr.error("", message, { timeOut: 3000 });
}
} catch (error) {
console.error("Error parsing server response:");
}
}
});
</script>
<script>
$("#nav-toggle").click(function () {
$(".menu-wrap.mobile, .menu-toggle").toggleClass("active");
});
</script>
</body>
</html>

100
templates/cart.html Normal file
View File

@ -0,0 +1,100 @@
{% extends "/base_website.html" %} {% block title %}New Website{% endblock %} {%
block html_head %}
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Antler - Hosting Provider & WHMCS Template</title>
<meta name="description" content="" />
<script>
// var details_list = "{{details_list }}";
// var server_highlights_detail = "{{server_highlights_detail }}";
// var products = "{{products }}";
</script>
{% endblock %} {% block page %}
<div class="box-container limit-width">
<!-- ***** SETTINGS ****** -->
<!-- ***** LOADING PAGE ****** -->
<!-- ***** SLIDER ***** -->
<!-- ***** BANNER ***** -->
<div class="top-header item7 overlay scrollme">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12">
<div
class="wrapper animateme"
data-when="span"
data-from="0"
data-to="0.75"
data-opacity="1"
data-translatey="-50"
>
<h1 class="heading">Cart</h1>
<h3 class="subheading">Please Complete Your Order Bekiw</h3>
</div>
</div>
</div>
</div>
</div>
<!-- ***** KNOWLEDGEBASE ***** -->
<section
class="config cd-main-content pb-80 blog sec-bg2 motpath notoppadding bg-seccolorstyle"
>
<div class="container">
<div class="row">
<div class="col-md-12 col-lg-8 pt-80">
<div id="sidebar_content" class="wrap-blog">
<div class="row">
<div class="col-md-12 col-lg-12">
<div
class="wrapper targetDiv sec-grad-white-to-green noshadow bg-colorstyle"
>
<h1 class="mergecolor">Review & Checkout</h1>
<p class="mergecolor">
Lorem ipsum dolor sit amet, consectetur adipiscing elit
</p>
<div class="row">
<div class="col-md-12 pt-4">
<div class="table-responsive-lg">
<table class="table compare">
<thead>
<tr class="seccolor">
<td>test</td>
<td>test</td>
<td>test</td>
<td>test</td>
</tr>
</thead>
<tbody>
<tr class="seccolor">
<td>test</td>
<td>test</td>
<td>test</td>
<td>test</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- ***** SLIDER ***** -->
<!-- ***** UPLOADED FOOTER FROM FOOTER.HTML ***** -->
<!-- ***** BUTTON GO TOP ***** -->
<a href="#0" class="cd-top"> <i class="fas fa-angle-up"></i> </a>
{% endblock %} {% block footerjs %}
<!-- Javascript -->
{% endblock %}
</div>

110
templates/category.html Normal file
View File

@ -0,0 +1,110 @@
<div class="box-container limit-width fade-me-in">
<!-- ***** SETTINGS ****** -->
<div class="indexBg top-header item8 overlay"></div>
<!-- ***** SLIDER ***** -->
<div class="motpath">
<div class="container" style="background-color: #f9f9f9; padding: 50px">
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="row">
<div class="col-6">
<h1
class="section-heading mergecolor"
style="color: black; font-size: 50px !important"
>
<span style="color: red">{{server_category.name}}</span>
{{server_category.category}}
</h1>
</div>
<div class="col-4">
<img
src="{{server_category.category_image}}"
alt="{{server_category.category_image}}"
/>
</div>
<div class="included col-12" style="color: black">
<h4 class="mb-5">{{server_category.server_title}}</h4>
</div>
<div class="col-12">
{% for p in details_list %}
<p>{{p}}</p>
{% endfor %}
</div>
{% if server_category.server_highlights %}
<div class="col-12 mb-2">
<h5 class="mb-2">{{ server_category.server_highlights }}</h5>
<h6>Supports:</h6>
<ul>
{% for detail in server_highlights_detail %}
<li>{{ detail }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<div class="col-12 mb-2">
<h4 style="color: black">
Configure & <span style="color: red"> Buy </span> :
</h4>
<br />
<hr />
</div>
<div class="col-12 row" style="padding: 15px">
<div class="col-2" style="padding: 10px">
<i class="fas fa-filter" aria-hidden="true"></i> Filter
</div>
<div class="col-1 filter">CPU</div>
<div class="col-1 filter">CPU</div>
<div class="col-1 filter">CPU</div>
<div class="col-1 filter">CPU</div>
<div class="col-1 filter">CPU</div>
<div class="col-1 filter">CPU</div>
<div class="col-1 filter">CPU</div>
</div>
<div class="row">
{% for product in products %}
<div class="col-md-4 mb-2">
<div
style="
background-color: white;
padding: 25px;
padding-top: 35px;
border-radius: 10px;
height: 480px;
min-height: fit-content;
"
>
<div class="text-center mb-4" style="height: 120px">
<img
src="{{product.image_url}}"
alt="{{product.image_url}}"
/>
</div>
<h4>{{ product.product_name}}</h4>
<ul>
{% for detail in product.details %}
<li>{{detail}}</li>
{% endfor %}
</ul>
<button
hx-post="/product/{{server_category.category}}/{{ product.product_name}}"
class="btn btn-outline btn-default-yellow-fill mb-2"
style="scale: 0.8; border-radius: 5px"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
>
Configure Now !
</button>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ***** SLIDER ***** -->
</div>

102
templates/config.html Normal file
View File

@ -0,0 +1,102 @@
<form class="fade-me-in">
<div id="target-row" class="row">
<div class="col-md-12 sc-config-header">
<div class="sc-line sc-line-left"></div>
<h6 class="sc-category-title">{{ config_data.category.name }}</h6>
<div class="sc-line sc-line-right"></div>
{% if config_data.category.max_quantity is not none %}
<span class="sc-max-quantity">
Max Quantity: {{ config_data.category.max_quantity }}
</span>
{% endif %}
</div>
<div class="col-md-12 row">
<img
src="{{ config_data.category.category_img }}"
alt="{{ config_data.category.name }}"
class="col-md-2"
style="height: 60px"
/>
<div class="col-md-10" style="max-height: 550px; overflow-y: auto">
<!-- Handle configurations -->
{% if config_data.category.sub_category %}
<!-- Case 1: Category has subcategories -->
{% for sub_category in config_data.category.sub_category %} {% set
outer_index = loop.index0 %}
<h6 style="font-weight: bold" class="sc-subcategory-title">
{{ sub_category.name }}
</h6>
<ul class="config-list" style="list-style: none">
{% for item in sub_category.config %}
<li>
<input type="{{ config_data.category.config_choice_type }}" name="{%
if config_data.category.config_choice_type == 'radio' %}config-{{
config_data.category.name }}{% else %}config-{{ loop.index0 }}-{{
outer_index }}-{{ sub_category.name }}{% endif %}" value="{{ item
}}" id="{{ config_data.category.name }}_{{ item }}"
hx-post="/save_config_selection" hx-trigger="change" hx-vals='{% if
config_data.category.config_choice_type == "radio"
%}{"product_name": "{{product.product_name}}", "category":
"{{config_data.category.name}}", "max_quantity":
"{{config_data.category.max_quantity}}", "config_choice_type":
"{{config_data.category.config_choice_type}}"}{% else
%}{"product_name": "{{product.product_name}}", "category":
"{{config_data.category.name}}", "sub_category":
"{{sub_category.name}}", "max_quantity":
"{{config_data.category.max_quantity}}", "config_choice_type":
"{{config_data.category.config_choice_type}}"}{% endif %}' {% if
config_data.category.config_choice_type == 'radio' and
saved_selections.get(config_data.category.name, {}).get('selection')
== item %}checked{% elif config_data.category.config_choice_type !=
'radio' and item in (saved_selections.get(config_data.category.name,
{}).get('subcategories', {}).get(sub_category.name, [])) %}checked{%
endif %} />
<label
class="d-inline"
for="{{ config_data.category.name }}_{{ item }}"
>{{ item }}</label
>
</li>
{% endfor %}
</ul>
{% endfor %} {% else %}
<!-- Case 2: Category has no subcategories -->
<ul class="config-list" style="list-style: none">
{% for item in config_data.category.config %}
<li>
<input type="{{ config_data.category.config_choice_type }}" name="{%
if config_data.category.config_choice_type == 'radio' %}config-{{
config_data.category.name }}{% else %}config-{{ loop.index0 }}-{{
config_data.category.name }}{% endif %}" value="{{ item }}" id="{{
config_data.category.name }}_{{ item }}"
hx-post="/save_config_selection" hx-trigger="change" hx-vals='{% if
config_data.category.config_choice_type == "radio"
%}{"product_name": "{{product.product_name}}", "category":
"{{config_data.category.name}}", "max_quantity":
"{{config_data.category.max_quantity}}", "config_choice_type":
"{{config_data.category.config_choice_type}}"}{% else
%}{"product_name": "{{product.product_name}}", "category":
"{{config_data.category.name}}", "max_quantity":
"{{config_data.category.max_quantity}}", "config_choice_type":
"{{config_data.category.config_choice_type}}"}{% endif %}' {% if
config_data.category.config_choice_type == 'radio' and
saved_selections.get(config_data.category.name, {}).get('selection')
== item %}checked{% elif config_data.category.config_choice_type !=
'radio' and item in (saved_selections.get(config_data.category.name,
{}).get('subcategories', {}).get(config_data.category.name, []))
%}checked{% endif %} />
<label
class="d-inline"
for="{{ config_data.category.name }}_{{ item }}"
>{{ item }}</label
>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
</div>
</div>
</form>

View File

@ -0,0 +1,30 @@
<div id="options">
{% if options %}
<table style="width: 100%; border-collapse: collapse">
<thead>
<tr style="background-color: #f4f4f4; border-bottom: 2px solid #ccc">
<th style="padding: 10px; text-align: left">Option Name</th>
<th style="padding: 10px; text-align: right">Price (€)</th>
</tr>
</thead>
<tbody>
{% for option in options %}
<tr
style="border-bottom: 1px solid #ddd; transition: background-color 0.3s"
onmouseover="this.style.backgroundColor='#f0f8ff';"
onmouseout="this.style.backgroundColor='white';"
>
<td style="padding: 10px">{{ option.option_name }}</td>
<td style="padding: 10px; text-align: right">
{{ option.option_price }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p style="padding: 10px; color: #ff0000">
No options available for this configuration.
</p>
{% endif %}
</div>

View File

@ -0,0 +1,27 @@
<div class="col-lg-8 row" id="servers">
{% for product in products_by_category %}
<div class="col-sm-6 col-md-6">
<div class="wrapper">
<div class="img-section"></div>
<div class="team-info bg-seccolorstyle noshadow" style="padding-top: 5px">
<img
class="svg"
src="{{product.image}}"
alt="{{product.image}}"
style="max-width: 70%; margin-bottom: 0"
/>
<h3 style="margin-bottom: 1.1em; font-size: 1.2rem">
{{ product.name }}
</h3>
<a
href="/product?product_id={{ product.id }}"
class="btn btn-default-yellow-fill mt-4"
style="scale: 0.7"
>See now !</a
>
</div>
</div>
</div>
{% endfor %}
</div>

243
templates/index.html Normal file
View File

@ -0,0 +1,243 @@
<div class="box-container limit-width fade-me-in">
<!-- ***** FRAME MODE ****** -->
<div class="body-borders" data-border="20">
<div class="top-border bg-white"></div>
<div class="right-border bg-white"></div>
<div class="bottom-border bg-white"></div>
<div class="left-border bg-white"></div>
</div>
<!-- ***** SLIDER ***** -->
<div class="indexBg top-header item8 overlay">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="wrapper">
<h1 class="heading">About Us</h1>
<div class="included">
<h4 class="mb-3">Why Choose Us?</h4>
<ul>
<li>
<i class="fas fa-check-circle"></i> Best hosting provider
</li>
</ul>
<ul>
<li>
<i class="fas fa-check-circle"></i> Award cloud infrastructure
</li>
</ul>
<ul>
<li>
<i class="fas fa-check-circle"></i> Awesome control panels
</li>
</ul>
<ul>
<li>
<i class="fas fa-check-circle"></i> Reference Domain solutions
</li>
</ul>
<ul>
<li>
<i class="fas fa-check-circle"></i> Support Premium 24/7/365
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ***** CLIENT STATS ***** -->
<section
id="clientstats"
class="pricing special sec-uping scrollme bg-colorstyle specialposition"
>
<div class="container">
<div class="row justify-content-end pb-80" style="height: 430px">
<div
class="col-sm-12 col-md-6 col-lg-4 animateme"
data-when="enter"
data-from="0"
data-to="1"
data-opacity="1"
data-translatey="-20"
>
<div
class="wrapper price-container text-start bg-seccolorstyle noshadow"
>
<div class="top-content pb-5">
<img
class="svg mb-3"
src="/static/felcloud/website/fonts/svg/servers.svg"
height="65"
alt=""
/>
<div class="title mergecolor">1000+ Servers Available</div>
<div class="fromer pt-3 seccolor">
We have a wide range of servers to choose from, so you can find
the perfect one for your needs.
</div>
</div>
</div>
</div>
<div
class="col-sm-12 col-md-6 col-lg-4 animateme"
data-when="span"
data-from="0"
data-to="1"
data-opacity="1"
data-translatey="50"
>
<div
class="wrapper price-container text-start bg-seccolorstyle noshadow"
>
<div class="plans badge feat bg-grey">top</div>
<div class="top-content pb-5">
<img
class="svg mb-3"
src="/static/felcloud/website/fonts/svg/rack.svg"
height="65"
alt=""
/>
<div class="title mergecolor">+1500 Componants Avaialble</div>
<div class="fromer pt-3 seccolor">
We have a huge selection of components to choose from.
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- ***** TEAM ***** -->
<section
class="sec-bg2 bg-colorstyle tophalfpadding nobottompadding motpath"
style="padding: 2em"
>
<div class="team">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 text-center">
<h2 class="section-heading mergecolor">Our Best Selling Servers</h2>
<p class="section-subheading mergecolor">
Discover our best servers with unbeatable performance and top-tier
reliability, all at the best prices! Whether you're launching a
website, gaming, or running apps, we've got the perfect solution.
Get started today with power, speed, and support!
</p>
</div>
{% for category in categories[:3] %}
<div class="col-lg-4 col-sm-6 mb-2">
<div
style="
background-color: white;
padding: 25px;
padding-top: 35px;
border-radius: 10px;
height: 480px;
width: fit-content;
min-height: fit-content;
"
>
<div class="text-center mb-4" style="height: 120px">
<img
src="{{category['products'][0].image_url}}"
alt="{{category['products'][0].image_url}}"
/>
</div>
<h4>{{ category['products'][0].product_name }}</h4>
<ul>
{% for detail in category['products'][0].details %}
<li>{{detail}}</li>
{% endfor %}
</ul>
<a
hx-post="/product/{{ category.category }}/{{ category['products'][0].product_name}}"
class="btn btn-outline btn-default-yellow-fill mb-2"
style="scale: 0.8; border-radius: 5px"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
>
Configure Now !
</a>
</div>
</div>
{% endfor%}
</div>
</div>
</div>
</section>
<!-- ***** MAP ***** -->
<section
class="services maping sec-grad-grey-to-grey bottompadding"
style="padding: 2em; margin-bottom: 0"
>
<div class="container">
<div class="service-wrap">
<div class="row">
<div class="col-sm-12 text-center">
<h2 class="section-heading text-white mergecolor">
Check out Our best selling components
</h2>
<p
class="section-subheading mergecolor"
style="color: white; font-weight: bold"
>
checkout our best selling components and services, and get the
best deals on the market. Our components are designed to provide
you with the best performance and reliability, so you can focus on
what matters most - your business.
</p>
</div>
<div class="team">
<div class="container">
<div class="row">
{% for category in categories[3:6] %} {% if category['products']
%}
<div class="col-lg-4 col-sm-6 mb-2">
<div
style="
background-color: white;
padding: 25px;
padding-top: 35px;
border-radius: 10px;
height: 480px;
width: fit-content;
min-height: fit-content;
"
>
<div class="text-center mb-4" style="height: 120px">
<img
src="{{category['products'][0].image_url}}"
alt="{{category['products'][0].image_url}}"
/>
</div>
<h4>{{ category['products'][0].product_name }}</h4>
<ul>
{% for detail in category['products'][0].details %}
<li>{{detail}}</li>
{% endfor %}
</ul>
<a
hx-post="/product/{{ category.category }}/{{ category['products'][0].product_name}}"
class="btn btn-outline btn-default-yellow-fill mb-2"
style="scale: 0.8; border-radius: 5px"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
>
Configure Now !
</a>
</div>
</div>
{% endif %} {% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>

84
templates/order.html Normal file
View File

@ -0,0 +1,84 @@
<div
class="modal fade modal-info"
id="modalOrder"
aria-hidden="true"
aria-labelledby="modalOrder"
role="dialog"
tabindex="-1"
>
<div class="modal-dialog">
<div class="modal-content" style="padding: 20px">
<div id="confirm_order" class="container fade-me-in">
{% if config_selection %}
<h3 class="mb-5 text-center" style="font-weight: bold">Your Order</h3>
{% for product_name, categories in config_selection.items() %}
<div class="card mb-3">
<div class="card-header">
<h4 class="mb-0 font-bold">Product: {{ product_name }}</h4>
</div>
<div class="card-body">
{% for category_name, category_data in categories.items() %}
<div class="mb-2">
<h5 class="mb-3"><strong>{{ category_name }}</strong></h5>
{% if category_data.get('selection') %}
<!-- Handle radio input selections -->
<ul class="list-group">
<li class="mb-4">
<ul style="list-style-type: disc">
<li>{{ category_data.selection }}</li>
</ul>
</li>
</ul>
{% elif category_data.get('subcategories') %}
<!-- Handle checkbox input subcategories -->
<ul class="list-group">
{% for subcategory_name, items in
category_data.subcategories.items() %}
<li class="mb-4">
{% if category_name != subcategory_name %}
<strong>{{ subcategory_name }}:</strong>
{% endif %}
<ul style="list-style-type: disc">
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
{% else %}
<p>No items selected in this category.</p>
{% endif %}
</div>
{% endfor %}
</div>
</div>
{% endfor %}
<div>
<button
class="btn btn-success"
hx-post="/confirm_order"
hx-target="#confirm_order"
hx-swap="innerHTML swap:.3s"
style="
background-color: #198754;
color: white;
border-radius: 5px;
padding: 15px;
font-size: 14px;
float: right;
"
hx-indicator="#spinner3"
>
Confirm Order
</button>
</div>
{% else %}
<div class="alert alert-info" role="alert" style="margin-bottom: 0">
{{no_order_message}}
</div>
{% endif %}
</div>
</div>
</div>
</div>

163
templates/product.html Normal file
View File

@ -0,0 +1,163 @@
<div class="box-container limit-width fade-me-in">
<div class="indexBg top-header item8 overlay"></div>
<!-- ***** SLIDER ***** -->
<div class="motpath">
<div class="container" style="background-color: #f9f9f9; padding: 40px">
<div class="row">
<div class="col-sm-12 col-md-12">
<div
class="row"
style="
align-items: center;
justify-content: center;
background-color: white;
padding: 50px;
"
>
<div
style="height: 109px;background-image:url('{{product.image_url}}');background-repeat: no-repeat;background-size: contain;"
class="col-4"
></div>
<div class="col-6">
<h1
class="section-heading mergecolor"
style="
color: black;
font-size: 30px !important;
font-weight: bold;
"
>
{{category_data.category}} {{product.product_name}}
</h1>
<p>{{product.product_data.description}}</p>
{% if product.product_data.use_cases %}
<h5 style="font-weight: bold">
Ideal {{category_data.category}} Use Cases
</h5>
<ul>
{% for cases in product.product_data.use_cases %}
<li>{{cases}}</li>
{% endfor %}
</ul>
{% endif %}
</div>
<div class="col-md-12">
{% if product.product_data.specifications %}
<h4 class="mb-5" style="font-weight: bold">Specifications:</h4>
<table
style="background-color: white; padding: 10px"
class="table table-bordered datable table-hover mb-5"
>
<tbody>
{% for key, value in
product.product_data.specifications.items() %}
<tr>
<td style="width: 200px; padding: 15px; font-weight: bold">
{{key}}
</td>
<td style="width: 200px; padding: 15px">{{value}}</td>
</tr>
{% endfor%}
</tbody>
</table>
{% endif %} {% if product.product_data.industries %}
<div class="mb-5">
<h5 style="font-weight: bold">Industries :</h5>
</div>
{% endif %}
<div class="industries row mb-5">
{% for industry in product.product_data.industries %}
<div
class="industry-item col-md-3 mb-5"
style="font-size: 17px"
>
<i
class="fas {% if industry == 'Energy' %}fa-bolt {% elif industry == 'Engineering' %}fa-cogs {% elif industry == 'Financial Services' %}fa-wallet {% elif industry == 'Aerospace / Defense' %}fa-fighter-jet {% elif industry == 'Cloud Services' %}fa-cloud {% elif industry == 'Life Sciences' %}fa-dna {% endif %}"
></i>
<span>{{ industry }}</span>
</div>
{% endfor %}
</div>
<div class="row" style="align-items: center">
<div class="col-lg-8">
<h5 style="font-weight: bold">Configurator :</h5>
</div>
<div class="col-lg-4">
<button
class="btn btn-success"
hx-post="/show_order"
hx-target="#target-order"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
style="
background-color: #198754;
color: white;
border-radius: 5px;
padding: 15px;
font-size: 14px;
float: right;
"
>
Show full order
</button>
</div>
</div>
<div id="system-config" class="row">
<div
class="col-md-3 row mb-2"
style="
max-height: 600px;
overflow-y: auto;
padding: 20px;
background-color: white;
box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;
"
>
{% for config in product.product_data.config %}
<a
class="btn btn-outline mb-2 col-md-12 {% if loop.first %}btn-default-yellow-fill{% endif %}"
style="
border-radius: 5px;
padding: 15px;
background-color: #35173a;
color: white;
font-weight: bold;
"
hx-post="/configurator/{{category_data.category}}/{{product.product_name}}/{{config.category.name}}"
hx-target="#target-config"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
hx-on="click: this.closest('#system-config').querySelectorAll('.btn').forEach(btn => btn.classList.remove('btn-default-yellow-fill')); this.classList.add('btn-default-yellow-fill');"
>
{{config.category.name}}
</a>
{% endfor %}
</div>
<div
id="target-config"
class="col-md-9 fade-me-in"
style="padding: 20px"
>
{% include '/config.html' %}
</div>
</div>
<div class="text-center">
<img
id="spinner2"
class="htmx-indicator"
src="/static/global/vendor/blueimp-file-upload/loading.gif"
style="width: 30px; height: 30px"
alt="Loading"
/>
</div>
<div style="clear: both" id="target-order"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

137
templates/servers.html Normal file
View File

@ -0,0 +1,137 @@
<div class="box-container limit-width fade-me-in">
<!-- ***** SLIDER ***** -->
<div class="serversBg top-header item8 overlay">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="wrapper wrappers text-center">
<h1 style="font-size: 50px !important" class="heading">
FelCloud sets the standard for server excellence.
</h1>
<div class="included text-center">
<h4 class="mb-5">
Our commitment to precision engineering, reliability, and
personalized support ensures each system delivers the power,
scalability, and dependability to drive your goals forward.
</h4>
</div>
</div>
</div>
<div class="col-md-3">
<div class="wrapper wrappers wrapperBg">
<h6 style="color: white">
<i class="fas fa-certificate" aria-hidden="true"></i>&nbsp; &nbsp;
Server Excellence Standard
</h6>
<div class="included text-center">
<h6 class="mb-3">
FelCloud sets the benchmark for exceptional server performance,
providing unmatched reliability and top-tier solutions for your
business needs.
</h6>
</div>
</div>
</div>
<div class="col-md-3">
<div class="wrapper wrappers wrapperBg">
<h6 style="color: white">
<i class="fas fa-trophy" aria-hidden="true"></i> &nbsp; &nbsp;
Three-Year Warranty
</h6>
<div class="included text-center">
<h6 class="mb-3">
Our Three-Year Warranty ensures long-lasting reliability,
offering full protection, expert service, and advanced parts
replacement for complete peace of mind.
</h6>
</div>
</div>
</div>
<div class="col-md-3">
<div class="wrapper wrappers wrapperBg">
<h6 style="color: white">
<i class="fas fa-headset" aria-hidden="true"></i>&nbsp; &nbsp;
Real People, Real Support
</h6>
<div class="included text-center">
<h6 class="mb-3">
Our customer service team provides personalized, real-time
support, ensuring that all concerns are addressed quickly and
efficiently with no automated systems.
</h6>
</div>
</div>
</div>
<div class="col-md-3">
<div class="wrapper wrappers wrapperBg">
<h6 style="color: white">
<i class="fas fa-rocket" aria-hidden="true"></i>&nbsp; &nbsp;
Outperforming Giants
</h6>
<div class="included text-center">
<h6 class="mb-3">
We excel by fostering direct supplier relationships, ensuring
competitive pricing, and offering fully customized systems that
guarantee superior performance.
</h6>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ***** TEAM ***** -->
<section
class="sec-bg2 bg-colorstyle tophalfpadding nobottompadding motpath"
style="padding: 2em"
>
<div class="team">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 text-center">
<h2 class="section-heading mergecolor">Our Servers Types</h2>
<p class="section-subheading mergecolor">
Explore our diverse range of server types, each designed to meet
specific needs and deliver optimal performance for your
applications.
</p>
</div>
</div>
<div class="row serversCategories">
{% for category in servers %}
<div class="col-md-4 mb-2">
<div
style="
background-color: white;
padding: 25px;
padding-top: 35px;
border-radius: 10px;
height: 340px;
"
>
<div class="text-center mb-4" style="height: 120px">
<img src="{{category.category_image}}" alt="{{nav_image}}" />
</div>
<button
hx-post="/servers/{{category.category}}"
class="btn btn-outline btn-default-yellow-fill mb-2"
style="scale: 0.8; border-radius: 5px"
hx-target="#bodyTarget"
hx-swap="innerHTML swap:.3s"
hx-indicator="#spinner3"
>
{{category.category}}
</button>
<p>{{category.description}}</p>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</section>
<!-- ***** SLIDER ***** -->
</div>