Function to upload site in ftp or sftp

This commit is contained in:
2026-05-21 13:02:20 +02:00
committed by kitoy
parent 50829e9f60
commit 5c17b65820
142 changed files with 288 additions and 933 deletions

View File

@@ -4,6 +4,8 @@ from werkzeug.utils import secure_filename
from app.forms import *
from PIL import Image
from pathlib import Path, PurePath, PurePosixPath
from shutil import rmtree, copytree
import subprocess
class DataSite:
user_folder = None
@@ -170,12 +172,40 @@ class DataSite:
print(f"Error removing directory (might not be empty): {e}")
def writeHTML(self, pageName :str, htmlExport :str):
public_folder = Path(PurePosixPath(self.user_folder).joinpath('public'))
pageName = pageName+'.html'
page = Path(PurePosixPath(self.user_folder).joinpath('public', pageName))
page.write_text(htmlExport)
def writeHTML(self, theme:str, pageName :str, htmlExport :str):
publicFolder = Path(PurePosixPath(self.user_folder).joinpath('public'))
themesFolder = Path(PurePosixPath('app').joinpath('templates','themes', self.datas['config']['theme'],'static'))
publicStaticFolder = Path(PurePosixPath(self.user_folder).joinpath('public', 'static'))
if pageName == '/':
pageIndex = publicFolder / 'index.html'
pageIndex.write_text(htmlExport)
else:
pageFolder = Path(PurePosixPath(self.user_folder).joinpath('public', pageName))
pageFolder.mkdir(exist_ok=True)
pageIndex = pageFolder / 'index.html'
pageIndex.write_text(htmlExport)
rmtree (publicStaticFolder, ignore_errors=True)
copytree(themesFolder, publicStaticFolder)
def publish(self, user:str, password:str, serverAddress:str, serverPort:int, folder:str):
remote_directory = "/remote/dir"
userDir = Path(PurePosixPath(self.user_folder))
command = "lftp -u \"{}\",\"{}\" -p {} {} -e ' mirror -R public {}; bye;'".format(user,
password,
serverPort,
serverAddress,
folder)
print(command)
try:
subprocess.call(command, shell=True, cwd=str(userDir))
except ChildProcessError:
return False
return True
def emptyTrash(self):
for file in self.trash:

View File

@@ -21,7 +21,7 @@ csrf = CSRFProtect(app)
app.secret_key = 'your_secret_key'
app.config.from_pyfile('config.py')
THEMES_FOLDER = './themes/'
THEMES_FOLDER = './templates/themes/'
USERS_FOLDER = app.config['USERS_FOLDER']
bcrypt = Bcrypt(app)
@@ -108,8 +108,7 @@ def editPhoto(page, image, bloc):
else:
return redirect ('/#'+bloc)
else:
return render_template(THEMES_FOLDER+theme+'/blocs/edit/_image-edit'+'.html', form=form, image=myblocs[bloc][image], bloc=myblocs[bloc])
return render_template(THEMES_FOLDER+theme+'/blocs/edit/_image-edit'+'.html', form=form, image=myblocs[bloc][image], bloc=myblocs[bloc])
@app.route('/upload-gallery/<bloc>', methods=['POST'], defaults={'page': ''})
@app.route('/<page>/upload-gallery/<bloc>', methods=['POST'])
@@ -169,7 +168,6 @@ def delImage(page, bloc, image):
return make_response(('Image removed', 200))
@app.route('/imgs_list/<blocname>', methods=['GET'], defaults={'page': ''})
@app.route('/<page>/imgs_list/<blocname>', methods=['GET'])
@login_required
@@ -186,7 +184,6 @@ def imagesList(page, blocname):
return render_template(THEMES_FOLDER+theme+'/blocs/edit/images_list.html',page=page,
bloc=bloc)
@app.route('/edit/<blocname>', methods=['GET', 'POST'], defaults={'page': ''})
@app.route('/<page>/edit/<blocname>', methods=['GET', 'POST'])
@login_required
@@ -298,7 +295,6 @@ def addBloc(page):
else:
return redirect(url_for('edit'))
@app.route('/addPage', methods=['POST'])
@login_required
def addPage():
@@ -340,10 +336,6 @@ def rmPage(pageName):
return redirect(url_for('edit'))
@app.route('/sortblocs', methods=['POST'], defaults={'page': ''})
@app.route('/<page>/sortblocs', methods=['POST'])
@@ -393,14 +385,14 @@ def editMenu():
flash (u'Le menu a bien été modifier', 'success');
return redirect(url_for('edit'))
@app.route('/public/img/<filename>')
@app.route('/img/<filename>')
@login_required
def myimgs(filename):
user = '%s' % escape(session['username'])
return send_from_directory(
os.path.join(USERS_FOLDER, user, 'public', 'img'), filename )
@app.route('/public/img/thumbnails/<filename>')
@app.route('/img/thumbnails/<filename>')
@login_required
def mythumbnails(filename):
user = '%s' % escape(session['username'])
@@ -414,7 +406,7 @@ def favicon():
@app.route('/publish', methods=['GET'])
@app.route('/publish', methods=['POST'])
@login_required
def publish():
user = '%s' % escape(session['username'])
@@ -422,6 +414,15 @@ def publish():
listPages = db.getPages()
theme = db.datas['config']['theme']
menu = db.datas['menu']
test_alphanum = "^[A-Za-z0-9/_-]*$"
serverAddress = str(request.form['serverAddress'])
serverPort = str(request.form['serverPort'])
username = str(request.form['username'])
password = str(request.form['password'])
folder = str(request.form['folder'])
for page in listPages:
myblocs = db.getBlocs(page)['blocs']
@@ -442,6 +443,23 @@ def publish():
page='/',
myblocs=myblocs)
db.writeHTML(theme, 'index', htmlExport)
db.writeHTML(theme, '/', htmlExport)
if serverPort == '' or serverPort.isdigit() == False :
serverPort = '22'
if folder == '' :
folder = '/'
elif(bool(re.match(test_alphanum, folder)) == False):
folder = '/'
if db.publish(username, password, serverAddress, serverPort, folder) == False:
return make_response(('Impossible de publier le site ', 500))
return redirect(url_for('edit'))

View File

@@ -0,0 +1,70 @@
<div class="publish" id="publish">
<form action="/publish" id="publish" method="POST" class="" >
<input id="csrf_token" name="csrf_token" type="hidden" value="{{ csrf_token() }}">
<h3>Publier mon site </h3>
<p> Rentrez ici les identifiants de connexions fourni par votre hébergeur. </p>
<br/>
<label for="ServerAddress"> Adresse du serveur : </label>
<div class="input-group">
<input type="text"
name="serverAddress"
class="form-control"
id="serverAddress"
placeholder="sftp://mon_serveur.com, ou ftp://mon_serveur.com"
required>
<dd<div class="invalid-feedback">
L'upload a rencontrer n'a pas pu se faire.
</div>
</div>
<br/>
<label for="serverPort"> port </label>
<br/>
<input type="number"
name="serverPort"
min="0"
max="65536"
class="form-control"
id="serverPort"
placeholder="Si vous ne savez pas ne mettez rien">
<br/>
<label for="serverPort"> Dossier </label>
<br/>
<input type="text"
name="folder"
class="form-control"
id="folder"
placeholder="Spécifier un dossier sinon ne mettez rien">
<br/>
<label for="User"> Nom d'utilisateur </label>
<br/>
<input type="text"
name="username"
class="form-control"
id="username"
placeholder="Nom d'utilisateur fourni par votre hébergeur"
required>
<br/>
<label for="Password"> Mot de passe </label>
<br/>
<input type="password"
name="password"
class="form-control"
id="password"
placeholder="Mot de passe fourni par votre hébergeur"
required>
<br/>
<button type="submit" class="btn btn-success"
onclick="valid_nameBloc()"> Publier le site </button>
</form>
</div>

View File

@@ -5,9 +5,9 @@
{% for image in bloc.values() %}
{% if image.file %}
<div class="col-lg-4 col-sm-6 text-center">
<a class="portfolio-box" href="/public/img/{{ image.file }}"
<a class="portfolio-box" href="/img/{{ image.file }}"
alt="{{ image.description }}">
<img class="img-fluid" src="/public/img/thumbnails/{{ image.file }}"
<img class="img-fluid" src="/img/thumbnails/{{ image.file }}"
alt="{{ image.description }}">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">

View File

@@ -1,4 +1,4 @@
<header class="article-img text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/public/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
<header class="article-img text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
<div class="container my-auto">
<div class="row" style="mix-blend-mode: hard-light;background-color: rgba(0,0,0,0.3);">
<div class="col-lg-10 mx-auto">

View File

@@ -1,4 +1,4 @@
<header class="masthead text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/public/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
<header class="masthead text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
<div class="container my-auto">
<div class="row" style="mix-blend-mode: hard-light;background-color: rgba(0,0,0,0.3);">
<div class="col-lg-10 mx-auto">

View File

@@ -1,347 +0,0 @@
body {
font-family: 'Lora';
background: linear-gradient(rgba(47, 23, 15, 0.65), rgba(47, 23, 15, 0.65)), url("../img/background.jpg");
background-attachment: fixed;
background-position: center;
background-size: cover;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Raleway';
}
p {
line-height: 1.75;
}
.text-faded {
color: rgba(255, 255, 255, 0.3);
}
.site-heading {
margin-top: 5rem;
margin-bottom: 5rem;
text-transform: uppercase;
line-height: 1;
font-family: 'Raleway';
}
.site-heading .site-heading-upper {
display: block;
font-size: 2rem;
font-weight: 800;
}
.site-heading .site-heading-lower {
font-size: 4rem;
font-weight: 100;
line-height: 4rem;
}
.page-section {
margin-top: 5rem;
margin-bottom: 5rem;
}
.section-heading {
text-transform: uppercase;
}
.section-heading .section-heading-upper {
display: block;
font-size: 1rem;
font-weight: 800;
}
.section-heading .section-heading-lower {
display: block;
font-size: 1.75rem;
font-weight: 100;
}
.bg-faded {
background-color: rgba(255, 255, 255, 0.85);
}
#mainNav {
background-color: rgba(47, 23, 15, 0.9);
font-family: 'Raleway';
}
#mainNav .navbar-brand {
color: #e6a756;
}
#mainNav .navbar-nav .nav-item .nav-link {
color: rgba(255, 255, 255, 0.7);
font-weight: 800;
}
#mainNav .navbar-nav .nav-item.active .nav-link {
color: #e6a756;
}
@media (min-width: 992px) {
#mainNav .navbar-nav .nav-item .nav-link {
font-size: 0.9rem;
}
#mainNav .navbar-nav .nav-item .nav-link:hover {
color: rgba(255, 255, 255, 0.4);
}
#mainNav .navbar-nav .nav-item.active .nav-link:hover {
color: #e6a756;
}
}
.btn-xl {
font-weight: 700;
font-size: 0.8rem;
padding-top: 1.5rem;
padding-bottom: 1.5rem;
padding-left: 2rem;
padding-right: 2rem;
}
.intro {
position: relative;
}
@media (min-width: 992px) {
.intro .intro-img {
width: 75%;
float: right;
}
.intro .intro-text {
left: 0;
width: 60%;
margin-top: 3rem;
position: absolute;
}
.intro .intro-text .intro-button {
width: 100%;
left: 0;
position: absolute;
bottom: -2rem;
}
}
@media (min-width: 1200px) {
.product-item .product-item-title {
position: relative;
z-index: 1;
margin-bottom: -3rem;
font-size: 3rem;
}
.product-item .product-item-img {
position: relative;
z-index: 0;
height: 50rem;
/*max-width: 80vw;*/
}
.product-item .product-item-description {
position: relative;
z-index: 1;
margin-top: -5rem;
}
.carousel-item {
height: 70rem;
width: 100%;
background-color: rgba(0, 0, 0, 0);
}
.intro .intro-text {
width: 45%;
}
}
.cta {
padding-top: 5rem;
padding-bottom: 5rem;
background-color: rgba(230, 167, 86, 0.9);
}
.cta .cta-inner {
position: relative;
padding: 3rem;
margin: 0.5rem;
background-color: rgba(255, 255, 255, 0.85);
}
.cta .cta-inner:before {
border-radius: 0.5rem;
content: '';
position: absolute;
top: -0.5rem;
bottom: -0.5rem;
left: -0.5rem;
right: -0.5rem;
border: 0.25rem solid rgba(255, 255, 255, 0.85);
}
@media (min-width: 992px) {
.about-heading .about-heading-img {
position: relative;
z-index: 0;
}
.about-heading .about-heading-content {
margin-top: -5rem;
position: relative;
z-index: 1;
}
}
@media (max-width: 768px) {
.section-heading .section-heading-upper {
font-size: 0.5rem;
}
.section-heading .section-heading-lower {
font-size: 1rem;
}
.product-item .product-item-title {
position: relative;
z-index: 0;
margin-bottom: -1rem;
}
.product-item .product-item-img {
position: relative;
z-index: 1;
max-width: 60vw;
}
.product-item .product-item-description {
position: relative;
padding-top: 2rem;
z-index: 0;
}
.carousel-item {
margin-top: -27rem;
height: 60rem;
width: 100%;
background-color: rgba(0, 0, 0, 0);
}
}
@media (min-width: 768px) {
.product-item .product-item-title {
position: relative;
z-index: 1;
margin-bottom: -3rem;
}
.product-item .product-item-img {
position: relative;
z-index: 0;
max-width: 80vw;
max-height: 30rem;
}
.product-item .product-item-description {
position: relative;
z-index: 1;
margin-left: 30%;
margin-top: -0.5rem;
width: 50vw;
}
.carousel-item {
margin-top: -10rem;
height: 50rem;
width: 100%;
background-color: rgba(0, 0, 0, 0);
}
}
.list-hours {
font-size: 0.9rem;
}
.list-hours .list-hours-item {
border-bottom: 1px solid rgba(230, 167, 86, 0.5);
padding-bottom: .25rem;
margin-bottom: 1rem;
font-style: italic;
}
.list-hours .list-hours-item.today {
font-weight: bold;
color: #e6a756;
}
@media (min-width: 992px) {
.list-hours {
width: 50%;
font-size: 1.1rem;
}
}
.address strong {
font-size: 1.2rem;
}
.footer {
background-color: rgba(47, 23, 15, 0.9);
}
.text-primary {
color: #e6a756 !important;
}
.carousel-caption {
color: rgba(47, 23, 15, 0.9);
}
.bg-primary {
background-color: #e6a756 !important;
}
.btn {
box-shadow: 0px 3px 3px 0px rgba(33, 37, 41, 0.1);
}
.btn-primary {
background-color: #e6a756;
border-color: #e6a756;
}
.btn-primary:hover, .btn-primary:focus, .btn-primary:active {
background-color: #df902a;
border-color: #df902a;
}
.font-weight-light {
font-weight: 100 !important;
}
.carousel-item {
width: 100%;
background-color: rgba(0, 0, 0, 0);
}
.product-item .product-item-description {
margin-top: -5rem;
}

View File

@@ -1,6 +0,0 @@
#toolNav {
background-color: rgba(0, 0, 0, 0.3);
border-top: 67px;
border-top-color: currentcolor;
border-color: black;
}

View File

@@ -1,283 +0,0 @@
body {
font-family: 'Lora', 'Helvetica Neue', Helvetica, Arial, sans-serif;
position: relative;
width: 100%;
height: 100%;
color: white;
background-color: black;
}
html {
width: 100%;
height: 100%;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Cabin', 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-weight: 700;
margin: 0 0 35px;
letter-spacing: 1px;
text-transform: uppercase;
}
p {
font-size: 16px;
line-height: 1.5;
margin: 0 0 25px;
}
@media (min-width: 768px) {
p {
font-size: 18px;
line-height: 1.6;
margin: 0 0 35px;
}
}
a {
-webkit-transition: all 0.2s ease-in-out;
-moz-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
color: #42DCA3;
}
a:focus, a:hover {
text-decoration: none;
color: #1d9b6c;
}
#mainNav {
font-family: 'Cabin', 'Helvetica Neue', Helvetica, Arial, sans-serif;
margin-bottom: 0;
text-transform: uppercase;
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
background-color: black;
}
#mainNav .navbar-toggler {
font-size: 14px;
padding: 11px;
color: white;
border: 1px solid white;
}
#mainNav .navbar-brand {
font-weight: 700;
}
#mainNav a {
color: white;
}
#mainNav .navbar-nav .nav-item {
-webkit-transition: background 0.3s ease-in-out;
-moz-transition: background 0.3s ease-in-out;
transition: background 0.3s ease-in-out;
}
#mainNav .navbar-nav .nav-item:hover {
color: fade(white, 80%);
outline: none;
background-color: transparent;
}
#mainNav .navbar-nav .nav-item:active, #mainNav .navbar-nav .nav-item:focus {
outline: none;
background-color: transparent;
}
@media (min-width: 992px) {
#mainNav {
padding-top: 20px;
padding-bottom: 20px;
-webkit-transition: background 0.3s ease-in-out, padding-top 0.3s ease-in-out, padding-bottom 0.3s;
-moz-transition: background 0.3s ease-in-out, padding-top 0.3s ease-in-out, padding-bottom 0.3s;
transition: background 0.3s ease-in-out, padding-top 0.3s ease-in-out, padding-bottom 0.3s;
letter-spacing: 1px;
border-bottom: none;
background: transparent;
}
#mainNav.navbar-shrink {
padding-top: 10px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
background: black;
}
#mainNav .nav-link.active {
outline: none;
background-color: rgba(255, 255, 255, 0.3);
}
#mainNav .nav-link.active:hover {
color: white;
}
}
.masthead {
display: table;
width: 100%;
height: auto;
padding: 200px 0;
text-align: center;
color: white;
background: url("../img/header.jpg") no-repeat bottom center scroll;
background-color: black;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
.masthead .intro-body {
display: table-cell;
vertical-align: middle;
}
.masthead .intro-body .brand-heading {
font-size: 50px;
}
.masthead .intro-body .intro-text {
font-size: 18px;
}
@media (min-width: 768px) {
.masthead {
height: 100%;
padding: 0;
}
.masthead .intro-body .brand-heading {
font-size: 100px;
}
.masthead .intro-body .intro-text {
font-size: 22px;
}
}
.btn-circle {
font-size: 26px;
width: 55px;
height: 55px;
margin-top: 15px;
line-height: 45px;
-webkit-transition: background 0.3s ease-in-out;
-moz-transition: background 0.3s ease-in-out;
transition: background 0.3s ease-in-out;
color: white;
border: 2px solid white;
border-radius: 100% !important;
background: transparent;
}
.btn-circle:focus, .btn-circle:hover {
color: white;
outline: none;
background: rgba(255, 255, 255, 0.1);
}
.content-section {
padding-top: 150px;
padding-bottom: 150px;
}
.download-section {
color: white;
background: url("../img/background.jpg") no-repeat center center scroll;
background-color: black;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
#map {
width: 100%;
height: 300px;
}
@media (min-width: 992px) {
.content-section {
padding-top: 200px;
padding-bottom: 200px;
}
#map {
height: 350px;
}
}
.btn {
font-family: 'Cabin', 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-weight: 400;
-webkit-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
text-transform: uppercase;
border-radius: 0;
}
.btn-default {
color: #42DCA3;
border: 1px solid #42DCA3;
background-color: transparent;
}
.btn-default:focus, .btn-default:hover {
color: black;
border: 1px solid #42DCA3;
outline: none;
background-color: #42DCA3;
}
ul.banner-social-buttons {
margin-top: 0;
}
@media (max-width: 1199px) {
ul.banner-social-buttons {
margin-top: 15px;
}
}
@media (max-width: 767px) {
ul.banner-social-buttons li {
display: block;
margin-bottom: 20px;
padding: 0;
}
ul.banner-social-buttons li:last-child {
margin-bottom: 0;
}
}
footer {
padding: 50px 0;
}
footer p {
font-size: 14px;
margin: 0;
}
::-moz-selection {
background: #fcfcfc;
background: rgba(255, 255, 255, 0.2);
text-shadow: none;
}
::selection {
background: #fcfcfc;
background: rgba(255, 255, 255, 0.2);
text-shadow: none;
}
img::selection {
background: transparent;
}
img::-moz-selection {
background: transparent;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

View File

@@ -58,9 +58,9 @@
</a>
<div class="dropdown-menu" aria-labelledby="Sous-menu">
<a class="dropdown-item" href="https://dede.Fr">Un lien</a>
<a class="dropdown-item" href="https://kitoy.me">Un lien</a>
<a class="dropdown-item" href="https://example.fr">Un autre truc</a>
<a class="dropdown-item" href="https://kitoy.eu">Un autre truc</a>
</div>
</li>
@@ -79,7 +79,7 @@
<header class="masthead text-center text-white d-flex" style="
background-image: url('/public/img/bg_custom_bloc0IMG_20140817_182202.jpg');" id="bloc0" >
background-image: url('/img/bg_custom_bloc0IMG_20140817_182202.jpg');" id="bloc0" >
<div class="container my-auto">
<div class="row" style="mix-blend-mode: hard-light;background-color: rgba(0,0,0,0.3);">
<div class="col-lg-10 mx-auto">
@@ -150,9 +150,9 @@
<div class="col-lg-4 col-sm-6 text-center">
<a class="portfolio-box" href="/public/img/jhenning-poppy-9639559.jpg"
<a class="portfolio-box" href="/img/jhenning-poppy-9639559.jpg"
alt="Un coqelicot seul au milieu d&#39;une pelouse">
<img class="img-fluid" src="/public/img/thumbnails/jhenning-poppy-9639559.jpg"
<img class="img-fluid" src="/img/thumbnails/jhenning-poppy-9639559.jpg"
alt="Un coqelicot seul au milieu d&#39;une pelouse">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
@@ -170,9 +170,9 @@
<div class="col-lg-4 col-sm-6 text-center">
<a class="portfolio-box" href="/public/img/namden-vietnam-9963155.png"
<a class="portfolio-box" href="/img/namden-vietnam-9963155.png"
alt="Des petites terrasses de fleurs formant des marchent faîtes pour decendre dans la vallé ">
<img class="img-fluid" src="/public/img/thumbnails/namden-vietnam-9963155.png"
<img class="img-fluid" src="/img/thumbnails/namden-vietnam-9963155.png"
alt="Des petites terrasses de fleurs formant des marchent faîtes pour decendre dans la vallé ">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
@@ -190,9 +190,9 @@
<div class="col-lg-4 col-sm-6 text-center">
<a class="portfolio-box" href="/public/img/martinophuc-la-mure-village.jpg"
<a class="portfolio-box" href="/img/martinophuc-la-mure-village.jpg"
alt="Un champs de blé avec une montagne en arrière plan">
<img class="img-fluid" src="/public/img/thumbnails/martinophuc-la-mure-village.jpg"
<img class="img-fluid" src="/img/thumbnails/martinophuc-la-mure-village.jpg"
alt="Un champs de blé avec une montagne en arrière plan">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">

View File

@@ -1 +0,0 @@
function init(){var e={zoom:15,center:new google.maps.LatLng(40.67,-73.94),disableDefaultUI:!0,scrollwheel:!1,draggable:!1,styles:[{featureType:"water",elementType:"geometry",stylers:[{color:"#000000"},{lightness:17}]},{featureType:"landscape",elementType:"geometry",stylers:[{color:"#000000"},{lightness:20}]},{featureType:"road.highway",elementType:"geometry.fill",stylers:[{color:"#000000"},{lightness:17}]},{featureType:"road.highway",elementType:"geometry.stroke",stylers:[{color:"#000000"},{lightness:29},{weight:.2}]},{featureType:"road.arterial",elementType:"geometry",stylers:[{color:"#000000"},{lightness:18}]},{featureType:"road.local",elementType:"geometry",stylers:[{color:"#000000"},{lightness:16}]},{featureType:"poi",elementType:"geometry",stylers:[{color:"#000000"},{lightness:21}]},{elementType:"labels.text.stroke",stylers:[{visibility:"on"},{color:"#000000"},{lightness:16}]},{elementType:"labels.text.fill",stylers:[{saturation:36},{color:"#000000"},{lightness:40}]},{elementType:"labels.icon",stylers:[{visibility:"off"}]},{featureType:"transit",elementType:"geometry",stylers:[{color:"#000000"},{lightness:19}]},{featureType:"administrative",elementType:"geometry.fill",stylers:[{color:"#000000"},{lightness:20}]},{featureType:"administrative",elementType:"geometry.stroke",stylers:[{color:"#000000"},{lightness:17},{weight:1.2}]}]},t=document.getElementById("map");map=new google.maps.Map(t,e);var l=new google.maps.LatLng(40.67,-73.94);new google.maps.Marker({position:l,map:map,icon:"img/map-marker.svg"})}!function(e){"use strict";e('a.js-scroll-trigger[href*="#"]:not([href="#"])').click(function(){if(location.pathname.replace(/^\//,"")==this.pathname.replace(/^\//,"")&&location.hostname==this.hostname){var t=e(this.hash);if((t=t.length?t:e("[name="+this.hash.slice(1)+"]")).length)return e("html, body").animate({scrollTop:t.offset().top-48},1e3,"easeInOutExpo"),!1}}),e(".js-scroll-trigger").click(function(){e(".navbar-collapse").collapse("hide")}),e("body").scrollspy({target:"#mainNav",offset:54});var t=function(){e("#mainNav").offset().top>100?e("#mainNav").addClass("navbar-shrink"):e("#mainNav").removeClass("navbar-shrink")};t(),e(window).scroll(t)}(jQuery);var map=null;google.maps.event.addDomListener(window,"load",init),google.maps.event.addDomListener(window,"resize",function(){map.setCenter(new google.maps.LatLng(40.67,-73.94))});

View File

@@ -58,9 +58,9 @@
</a>
<div class="dropdown-menu" aria-labelledby="Sous-menu">
<a class="dropdown-item" href="https://dede.Fr">Un lien</a>
<a class="dropdown-item" href="https://kitoy.me">Un lien</a>
<a class="dropdown-item" href="https://example.fr">Un autre truc</a>
<a class="dropdown-item" href="https://kitoy.eu">Un autre truc</a>
</div>
</li>

View File

@@ -63,6 +63,92 @@ h6 {
color: rgba(255, 255, 255, 0.7);
}
.ql-align-center {
text-align: center;
}
.ql-align-left {
text-align: left;
}
.ql-align-right {
text-align: right;
}
blockquote {
padding: 60px 80px 40px;
position: relative;
}
blockquote p {
font-size: 35px;
font-weight: 700px;
text-align: center;
}
/*blockquote p::before {
content: "\f095";
font-family: FontAwesome;
display: inline-block;
padding-right: 6px;
vertical-align: middle;
font-size: 180px;
}*/
blockquote:before {
position: absolute;
font-family: 'FontAwesome';
top: 0;
content:"\f10d";
font-size: 200px;
color: rgba(0,0,0,0.1);
}
blockquote::after {
content: "";
top: 20px;
left: 50%;
margin-left: -100px;
position: absolute;
height: 3px;
width: 200px;
}
blockquote{
font-size: 1.4em;
width:60%;
margin:50px auto;
font-style:italic;
color: #555555;
padding:1.2em 30px 1.2em 75px;
border-left:8px solid #f05f40;
line-height:1.6;
position: relative;
background:#EDEDED;
}
blockquote::before{
font-family:Arial;
content: "\201C";
color:#f05f40;
font-size:4em;
position: absolute;
left: 10px;
top:-10px;
}
blockquote::after{
content: '';
}
blockquote span{
display:block;
color:#333333;
font-style: normal;
font-weight: bold;
margin-top:1em;
}
section {
padding: 8rem 0;
z-index: -1;
@@ -141,7 +227,7 @@ img::-moz-selection {
@media (min-width: 992px) {
#mainNav {
border-color: transparent;
background-color: transparent;
background-color: rgba(0,0,0,0.7);
}
#mainNav .navbar-brand {
color: rgba(255, 255, 255, 0.7);
@@ -190,16 +276,27 @@ header.masthead {
background-size: cover;
}
header.masthead hr {
header.article-img {
padding-top: 10rem;
padding-bottom: calc(10rem - 56px);
background-position: center center;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
header.article-img header.masthead hr {
margin-top: 30px;
margin-bottom: 30px;
}
header.masthead h1 {
header.article-img header.masthead h1 {
font-size: 2rem;
}
header.masthead p {
header.article-img header.masthead p {
font-weight: 300;
}
@@ -210,19 +307,27 @@ header.masthead p {
}
@media (min-width: 992px) {
header.article-img {
height: 50vh;
min-height: 300px;
padding-top: 0;
padding-bottom: 0;
}
header.masthead {
height: 100vh;
min-height: 650px;
padding-top: 0;
padding-bottom: 0;
}
header.masthead h1 {
header.article-img header.masthead h1 {
font-size: 3rem;
}
}
@media (min-width: 1200px) {
header.masthead h1 {
header.article-img header.masthead h1 {
font-size: 4rem;
}
.btn-success {

View File

@@ -0,0 +1,3 @@
/* PrismJS 1.30.0
https://prismjs.com/download#themes=prism-okaidia&languages=markup+css+clike+javascript+bash+c+cpp+markdown+markup-templating+nginx+php+python */
code[class*=language-],pre[data-language*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8292a2}.token.punctuation{color:#f8f8f2}.token.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#ae81ff}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#a6e22e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#e6db74}.token.keyword{color:#66d9ef}.token.important,.token.regex{color:#fd971f}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 434 KiB

After

Width:  |  Height:  |  Size: 434 KiB

View File

@@ -58,9 +58,9 @@
</a>
<div class="dropdown-menu" aria-labelledby="Sous-menu">
<a class="dropdown-item" href="https://dede.Fr">Un lien</a>
<a class="dropdown-item" href="https://kitoy.me">Un lien</a>
<a class="dropdown-item" href="https://example.fr">Un autre truc</a>
<a class="dropdown-item" href="https://kitoy.eu">Un autre truc</a>
</div>
</li>
@@ -79,7 +79,7 @@
<header class="article-img text-center text-white d-flex" style="
background-image: url('/public/img/bg_custom_bloc0image_entete_exemple.jpg');" id="bloc0" >
background-image: url('/img/bg_custom_bloc0image_entete_exemple.jpg');" id="bloc0" >
<div class="container my-auto">
<div class="row" style="mix-blend-mode: hard-light;background-color: rgba(0,0,0,0.3);">
<div class="col-lg-10 mx-auto">

View File

@@ -58,9 +58,9 @@
</a>
<div class="dropdown-menu" aria-labelledby="Sous-menu">
<a class="dropdown-item" href="https://dede.Fr">Un lien</a>
<a class="dropdown-item" href="https://kitoy.me">Un lien</a>
<a class="dropdown-item" href="https://example.fr">Un autre truc</a>
<a class="dropdown-item" href="https://kitoy.eu">Un autre truc</a>
</div>
</li>

View File

@@ -58,9 +58,9 @@
</a>
<div class="dropdown-menu" aria-labelledby="Sous-menu">
<a class="dropdown-item" href="https://dede.Fr">Un lien</a>
<a class="dropdown-item" href="https://kitoy.me">Un lien</a>
<a class="dropdown-item" href="https://example.fr">Un autre truc</a>
<a class="dropdown-item" href="https://kitoy.eu">Un autre truc</a>
</div>
</li>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More