Nantes Université

Skip to content
Extraits de code Groupes Projets
Valider cb9b312f rédigé par Erwan DELAGE's avatar Erwan DELAGE
Parcourir les fichiers

Merge branch 'develop' into 'master'

Develop

See merge request !9
parents 76f60156 986e3294
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!9Develop
Affichage de
avec 10246 ajouts et 114 suppressions
......@@ -301,15 +301,20 @@ def set_default_values():
# By default, the importing, filtering and denoising steps will be done one the whole gathered fastq
set_default_value("global", "parallel-samples", False)
if "denoiser" in config["global"]:
# FASTQ type and format
if config["global"]["library-type"] == "single-end":
set_default_value("import", "type", "\"SampleData[SequencesWithQuality]\"")
set_default_value("import", "input-format", "SingleEndFastqManifestPhred33")
# Fill denoiser type
if "deblur" in config.keys():
config["global"]["denoiser"] = "deblur"
elif "dada2" in config.keys():
config["global"]["denoiser"] = "dada2"
else:
set_default_value("import", "type", "\"SampleData[PairedEndSequencesWithQuality]\"")
set_default_value("import", "input-format", "PairedEndFastqManifestPhred33")
# FASTQ type and format
if config["global"]["library-type"] == "single-end":
set_default_value("import", "type", "\"SampleData[SequencesWithQuality]\"")
set_default_value("import", "input-format", "SingleEndFastqManifestPhred33")
else:
set_default_value("import", "type", "\"SampleData[PairedEndSequencesWithQuality]\"")
set_default_value("import", "input-format", "PairedEndFastqManifestPhred33")
# Set global multithreading parameter
set_default_value("global", "nbthreads", 1)
......@@ -354,6 +359,7 @@ def set_multithreading():
## WORKFLOW FUNCTIONS ##
##############################
def parallel_process():
"""
Qiime2 is normally a sequential process. Unfortunately, when dealing with a lot of samples, it can
......@@ -481,6 +487,8 @@ def getInput(tool, given_file=""):
if tool == "alpha_rarefaction":
if given_file == "table.qza":
return getOutput("merge_denoiser_results", "table.qza") if config["global"]["parallel-samples"] else getOutput("denoiser", "table.qza")
elif given_file == "abundance_table.tsv":
return getOutput("export_table_tsv", "abundance_table.tsv")
else:
return getOutput("phylogenetic_tree", "rooted-tree.qza")
......@@ -593,6 +601,8 @@ def format_all_rule():
all_input.append(getOutput("summarize_table", "table.qzv"))
all_input.append(getOutput("export_table_tsv", "abundance_table.tsv"))
all_input.append(getOutput("alpha_rarefaction", "results/index.html"))
if config["global"]["parallel-samples"]:
all_input.append(getOutput("merge_denoiser_stats", "html"))
......@@ -602,9 +612,7 @@ def format_all_rule():
if "taxonomy" in config.keys():
all_input.append(getOutput("taxonomy", "barplot/index.html"))
if "alpha-rarefaction" in config.keys():
all_input.append(getOutput("alpha_rarefaction", "results/index.html"))
all_input.append(getOutput("summarize_table", "plots"))
if "ancom" in config.keys():
all_input.append(getOutput("ancom", "volcano/index.html"))
......@@ -666,83 +674,83 @@ rule multiqc:
echo "\nMultiQc.....OK" >> {params.logfile}
"""
if "denoiser" in config["global"]:
########################
## IMPORT FASTQ ##
########################
# Split the main manifest file into several ones (one per sample) to parallellize the tasks
rule split_manifest:
input: getInput("split_manifest")
output: getOutput("split_manifest", "manifest.csv")
run:
import os
import pandas
########################
## IMPORT FASTQ ##
########################
df = pd.read_csv(config["global"]["manifest"], comment="#")
if wildcards.sample_id == 'All':
df.to_csv(output[0], index=False)
else:
minDf = df[df["sample-id"].astype(str) == wildcards.sample_id]
minDf.to_csv(output[0], index=False)
# Split the main manifest file into several ones (one per sample) to parallellize the tasks
rule split_manifest:
input: getInput("split_manifest")
output: getOutput("split_manifest", "manifest.csv")
run:
import os
import pandas
# Import Fastq files into a QIIME2 artifact
rule import:
input: getInput("import")
output: getOutput("import", "import.qza")
conda: qiime2_yml
params: options = getOptions("import")
shell: """
qiime tools import --input-path {input} --output-path {output} {params.options}
"""
df = pd.read_csv(config["global"]["manifest"], comment="#")
if wildcards.sample_id == 'All':
df.to_csv(output[0], index=False)
else:
minDf = df[df["sample-id"].astype(str) == wildcards.sample_id]
minDf.to_csv(output[0], index=False)
# Import Fastq files into a QIIME2 artifact
rule import:
input: getInput("import")
output: getOutput("import", "import.qza")
conda: qiime2_yml
params: options = getOptions("import")
shell: """
qiime tools import --input-path {input} --output-path {output} {params.options}
"""
#####################
## FILTERING ##
#####################
#####################
## FILTERING ##
#####################
rule cutadapt:
input: getInput("cutadapt")
output: getOutput("cutadapt", "cutadapt.qza")
conda: qiime2_yml
params: options = getOptions("cutadapt"),
lib_type = pairedOrSingle("cutadapt")
shell: """
qiime cutadapt {params.lib_type} --i-demultiplexed-sequences {input} --o-trimmed-sequences {output} {params.options}
"""
rule cutadapt:
input: getInput("cutadapt")
output: getOutput("cutadapt", "cutadapt.qza")
conda: qiime2_yml
params: options = getOptions("cutadapt"),
lib_type = pairedOrSingle("cutadapt")
shell: """
qiime cutadapt {params.lib_type} --i-demultiplexed-sequences {input} --o-trimmed-sequences {output} --p-discard-untrimmed {params.options}
"""
# If the library is paired-end, reads need to be joined together for further analysis
# ONLY WHEN DEBLUR IS USED AS DENOISER
rule join_pairs:
input: getInput("join_pairs")
output: getOutput("join_pairs", "joined_sequences.qza")
conda: qiime2_yml
shell: """
qiime vsearch join-pairs --i-demultiplexed-seqs {input} --o-joined-sequences {output}
"""
# If the library is paired-end, reads need to be joined together for further analysis
# ONLY WHEN DEBLUR IS USED AS DENOISER
rule join_pairs:
input: getInput("join_pairs")
output: getOutput("join_pairs", "joined_sequences.qza")
conda: qiime2_yml
shell: """
qiime vsearch join-pairs --i-demultiplexed-seqs {input} --o-joined-sequences {output}
"""
# Filter reads on quality
# ONLY WHEN DEBLUR IS USED AS DENOISER
rule quality_filter:
input: getInput("quality_filter")
output: getOutput("quality_filter", "filtered_sequences.qza"),
getOutput("quality_filter", "filter_stats.qza"),
getOutput("quality_filter", "filter_stats.qzv"),
directory(getOutput("quality_filter", "html")),
getOutput("quality_filter", "stats/stats.csv")
params: options = getOptions("quality-filter"),
lib_type = pairedOrSingle("quality_filter")
conda: qiime2_yml
shell: """
qiime quality-filter {params.lib_type} --i-demux {input} --o-filtered-sequences {output[0]} --o-filter-stats {output[1]} {params.options}
qiime metadata tabulate --m-input-file {output[1]} --o-visualization {output[2]}
qiime tools export --input-path {output[2]} --output-path {output[3]}
qiime tools export --input-path {output[1]} --output-path `dirname {output[4]}`
"""
# Filter reads on quality
# ONLY WHEN DEBLUR IS USED AS DENOISER
rule quality_filter:
input: getInput("quality_filter")
output: getOutput("quality_filter", "filtered_sequences.qza"),
getOutput("quality_filter", "filter_stats.qza"),
getOutput("quality_filter", "filter_stats.qzv"),
directory(getOutput("quality_filter", "html")),
getOutput("quality_filter", "stats/stats.csv")
params: options = getOptions("quality-filter"),
lib_type = pairedOrSingle("quality_filter")
conda: qiime2_yml
shell: """
qiime quality-filter {params.lib_type} --i-demux {input} --o-filtered-sequences {output[0]} --o-filter-stats {output[1]} {params.options}
qiime metadata tabulate --m-input-file {output[1]} --o-visualization {output[2]}
qiime tools export --input-path {output[2]} --output-path {output[3]}
qiime tools export --input-path {output[1]} --output-path `dirname {output[4]}`
"""
#####################
## DENOISING ##
#####################
if "denoiser" in config["global"]:
# Deblur denoiser : produces an OTU table
rule deblur:
......@@ -942,59 +950,90 @@ if "denoiser" in config["global"]:
getOutput("diversity", "unweighted_unifrac_pcoa_results.qza"),
getOutput("diversity", "weighted_unifrac_pcoa_results.qza"),
getOutput("diversity", "jaccard_pcoa_results.qza"),
getOutput("diversity", "bray_curits_pcoa_results.qza"),
getOutput("diversity", "bray_curtis_pcoa_results.qza"),
getOutput("diversity", "unweighted_unifrac_emperor.qzv"),
getOutput("diversity", "weighted_unifrac_emperor.qzv"),
getOutput("diversity", "jaccard_emperor.qzv"),
getOutput("diversity", "bray_curtis_emperor.qzv"),
braycurtis = directory(getOutput("diversity", "pcoa/bray_curtis")),
jaccard = directory(getOutput("diversity", "pcoa/jaccard")),
unweighted_unifrac = directory(getOutput("diversity", "pcoa/unweighted_unifrac")),
html = getOutput("diversity", "pcoa/weighted_unifrac/emperor.html")
braycurtis_pcoa = directory(getOutput("diversity", "pcoa/bray_curtis")),
jaccard_pcoa = directory(getOutput("diversity", "pcoa/jaccard")),
unweighted_unifrac_pcoa = directory(getOutput("diversity", "pcoa/unweighted_unifrac")),
weighted_unifrac_pcoa = getOutput("diversity", "pcoa/weighted_unifrac/emperor.html")
params: options = getOptions("diversity"),
logfile = config["global"]["outdir"] + "/" + LOGFILE
conda: qiime2_yml
shell: """
qiime diversity core-metrics-phylogenetic --i-phylogeny {input[0]} --i-table {input[1]} --m-metadata-file {input[2]} --o-rarefied-table {output[0]} --o-faith-pd-vector {output[1]} --o-observed-otus-vector {output[2]} --o-shannon-vector {output[3]} --o-evenness-vector {output[4]} --o-unweighted-unifrac-distance-matrix {output[5]} --o-weighted-unifrac-distance-matrix {output[6]} --o-jaccard-distance-matrix {output[7]} --o-bray-curtis-distance-matrix {output[8]} --o-unweighted-unifrac-pcoa-results {output[9]} --o-weighted-unifrac-pcoa-results {output[10]} --o-jaccard-pcoa-results {output[11]} --o-bray-curtis-pcoa-results {output[12]} --o-unweighted-unifrac-emperor {output[13]} --o-weighted-unifrac-emperor {output[14]} --o-jaccard-emperor {output[15]} --o-bray-curtis-emperor {output[16]} {params.options}
qiime tools export --input-path {output[16]} --output-path {output.braycurtis}
qiime tools export --input-path {output[15]} --output-path {output.jaccard}
qiime tools export --input-path {output[13]} --output-path {output.unweighted_unifrac}
qiime tools export --input-path {output[14]} --output-path `dirname {output.html}`
qiime tools export --input-path {output[16]} --output-path {output.braycurtis_pcoa}
qiime tools export --input-path {output[15]} --output-path {output.jaccard_pcoa}
qiime tools export --input-path {output[13]} --output-path {output.unweighted_unifrac_pcoa}
qiime tools export --input-path {output[14]} --output-path `dirname {output.weighted_unifrac_pcoa}`
python scripts/export_diversity.py {outdir}/diversity
echo "\nDiversity.....OK" >> {params.logfile}
"""
rule alpha_group_significance:
input: getInput("alpha_group_significance", "shannon_vector.qza"),
getInput("alpha_group_significance", "evenness_vector.qza"),
getInput("alpha_group_significance", "faith_pd_vector.qza"),
getInput("alpha_group_significance", "observed_otus_vector.qza"),
config["global"]["context"]
output: getOutput("alpha_group_significance", "shannon-group-significance/index.html"),
output: getOutput("alpha_group_significance", "shannon-group-significance.qzv"),
getOutput("alpha_group_significance", "evenness-group-significance.qzv"),
getOutput("alpha_group_significance", "faith_pd_vector.qzv"),
getOutput("alpha_group_significance", "observed_otus_vector.qzv"),
getOutput("alpha_group_significance", "shannon-group-significance/index.html"),
getOutput("alpha_group_significance", "evenness-group-significance/index.html"),
getOutput("alpha_group_significance", "shannon-group-significance.qzv"),
getOutput("alpha_group_significance", "evenness-group-significance.qzv")
getOutput("alpha_group_significance", "faith_pd-group-significance/index.html"),
getOutput("alpha_group_significance", "observed_otus-group-significance/index.html")
conda: qiime2_yml
shell: """
qiime diversity alpha-group-significance --i-alpha-diversity {input[0]} --m-metadata-file {input[2]} --o-visualization {output[2]}
qiime diversity alpha-group-significance --i-alpha-diversity {input[1]} --m-metadata-file {input[2]} --o-visualization {output[3]}
qiime tools export --input-path {output[2]} --output-path `dirname {output[0]}`
qiime tools export --input-path {output[3]} --output-path `dirname {output[1]}`
qiime diversity alpha-group-significance --i-alpha-diversity {input[0]} --m-metadata-file {input[4]} --o-visualization {output[0]}
qiime diversity alpha-group-significance --i-alpha-diversity {input[1]} --m-metadata-file {input[4]} --o-visualization {output[1]}
qiime diversity alpha-group-significance --i-alpha-diversity {input[2]} --m-metadata-file {input[4]} --o-visualization {output[2]}
qiime diversity alpha-group-significance --i-alpha-diversity {input[3]} --m-metadata-file {input[4]} --o-visualization {output[3]}
qiime tools export --input-path {output[0]} --output-path `dirname {output[4]}`
qiime tools export --input-path {output[1]} --output-path `dirname {output[5]}`
qiime tools export --input-path {output[2]} --output-path `dirname {output[6]}`
qiime tools export --input-path {output[3]} --output-path `dirname {output[7]}`
"""
# Alpha rarefaction
if "alpha-rarefaction" in config.keys():
# Write the alpha rarefaction max depth parameter into a file
rule prepare_alpha_rarefaction:
input: getInput("alpha_rarefaction", "abundance_table.tsv")
output: getOutput("export_table_tsv", "alpha-rarefaction_maxdepth.txt")
run:
rule alpha_rarefaction:
input: getInput("alpha_rarefaction", "table.qza"),
getInput("alpha_rarefaction", "rooted-tree.qza"),
config["global"]["context"]
output: getOutput("alpha_rarefaction", "alpha_rarefaction.qzv"),
getOutput("alpha_rarefaction", "results/index.html")
params: options = getOptions("alpha-rarefaction")
conda: qiime2_yml
shell: """
qiime diversity alpha-rarefaction --i-table {input[0]} --i-phylogeny {input[1]} --m-metadata-file {input[2]} --o-visualization {output[0]} {params.options}
qiime tools export --input-path {output[0]} --output-path `dirname {output[1]}`
"""
# If an alpha rarefaction is already given by the user, we get it
if "alpha-rarefaction" in config.keys() and "p-max-depth" in config["alpha-rarefaction"].keys():
max_depth = config["alpha-rarefaction"]["p-max-depth"]
# Otherwise we take the median value across sample depth
else:
df = pd.read_csv(input[0], sep="\t", index_col=0)
max_depth = int(df.sum().median())
if "alpha-rarefaction" not in config.keys():
config["alpha-rarefaction"] = dict()
config["alpha-rarefaction"]["p-max-depth"] = max_depth
# Write max rarefaction parameter into a file
f = open(output[0], 'w')
f.write(str(max_depth))
f.close()
# Alpha rarefaction
rule alpha_rarefaction:
input: getInput("alpha_rarefaction", "table.qza"),
getInput("alpha_rarefaction", "rooted-tree.qza"),
config["global"]["context"],
getOutput("export_table_tsv", "alpha-rarefaction_maxdepth.txt")
output: getOutput("alpha_rarefaction", "alpha_rarefaction.qzv"),
getOutput("alpha_rarefaction", "results/index.html")
conda: qiime2_yml
shell: """
RAREFACTION_MAX_DEPTH=$(cat {input[3]})
qiime diversity alpha-rarefaction --i-table {input[0]} --i-phylogeny {input[1]} --m-metadata-file {input[2]} --o-visualization {output[0]} --p-max-depth $RAREFACTION_MAX_DEPTH
qiime tools export --input-path {output[0]} --output-path `dirname {output[1]}`
"""
# Taxonomy
if 'taxonomy' in config.keys():
......@@ -1008,6 +1047,7 @@ if "denoiser" in config["global"]:
getOutput("taxonomy", "taxa-bar-plots.qzv"),
getOutput("taxonomy", "taxons/index.html"),
getOutput("taxonomy", "barplot/index.html"),
getOutput("taxonomy", "taxons/metadata.tsv")
conda: qiime2_yml
params: options = getOptions("taxonomy", ["classifier"]),
logfile = config["global"]["outdir"] + "/" + LOGFILE
......@@ -1020,6 +1060,14 @@ if "denoiser" in config["global"]:
echo "\nTaxonomy.....OK" >> {params.logfile}
"""
rule prevalence_abundance:
input: getOutput("export_table_tsv", "abundance_table.tsv"),
getOutput("taxonomy", "taxons/metadata.tsv")
output: directory(getOutput("summarize_table", "plots"))
shell: """
python scripts/plot_prevalence_abundance.py {input[0]} {input[1]} {output}
"""
# ANCOM (differential expression)
if 'ancom' in config.keys():
......@@ -1040,6 +1088,20 @@ if "denoiser" in config["global"]:
"""
############################
## BUILD REPORT #
############################
rule build_report:
output:
outdir + "/report.tar.gz"
shell: """
python scripts/build_report/build_report.py {outdir}
tar czvf {output} -C {outdir} report
rm -r {outdir}/report
"""
###########################
## CLEAN RULES ##
###########################
......
......@@ -3,5 +3,8 @@ dependencies :
- bioconda::snakemake
- pandas
- python-dateutil
- git
- conda-forge::gitpython
- jsonschema
- jinja2
- plotly
......@@ -2,8 +2,7 @@
"global" : {
"manifest" : "test/manifest.csv",
"context" : "test/context.tsv",
"denoiser" : "dada2",
"outdir" : "out",
"outdir" : "out_dada2",
"parallel-samples" : false,
"nbthreads" : 2
},
......@@ -14,9 +13,6 @@
"diversity" : {
"p-sampling-depth" : 2338
},
"alpha-rarefaction" : {
"p-max-depth" : 5000
},
"ancom" : {
"m-metadata-column" : "time"
}
......
"""
This script gathers all outputs from the pipeline in an archive
with an html report.
"""
from jinja2 import Environment, PackageLoader
import os.path
import sys
import shutil
def gather_outputs():
"""
Gather all interesting pipeline outputs (HTML viz, data tables...) in a single directory and feed
the template dictionary that will be used to generate the html report.
"""
# Create report directory
global REPORT_DIR
REPORT_DIR = INDIR + "/report"
try:
shutil.rmtree(REPORT_DIR)
print("Removing previous report.")
except FileNotFoundError:
pass
os.mkdir(REPORT_DIR)
# Get multiqc report
if os.path.isfile(INDIR + "/multiqc/multiqc_report.html"):
os.mkdir(REPORT_DIR + "/multiqc")
shutil.copyfile(INDIR + "/multiqc/multiqc_report.html", REPORT_DIR + "/multiqc/multiqc_report.html")
template_data["multiqc_report"] = "multiqc/multiqc_report.html"
# Get dada2 stats
if os.path.isfile(INDIR + "/dada2/html/index.html"):
shutil.copytree(INDIR + "/dada2/html", REPORT_DIR + "/dada2/html")
template_data["dada2_report"] = "dada2/html/index.html"
# Get ASV table infos
if os.path.isfile(INDIR + "/export_table_tsv/abundance_table.tsv"):
shutil.copytree(INDIR + "/export_table_tsv", REPORT_DIR + "/asv_table")
shutil.copytree(INDIR + "/summarize_table/seqs_html", REPORT_DIR + "/asv_sequences/seqs_html")
shutil.copytree(INDIR + "/summarize_table/table_html", REPORT_DIR + "/asv_table/table_html")
template_data["sequences_html"] = "asv_sequences/seqs_html/index.html"
template_data["summarize_html"] = "asv_table/table_html/index.html"
# Get alpha rarefaction data
if os.path.isfile(INDIR + "/alpha_rarefaction/results/index.html"):
shutil.copytree(INDIR + "/alpha_rarefaction/results", REPORT_DIR + "/alpha_rarefaction")
template_data["alpha_rarefaction"] = "alpha_rarefaction/index.html"
# Get diversity data
if os.path.isfile(INDIR + "/diversity/pcoa/bray_curtis/index.html"):
shutil.copytree(INDIR + "/diversity/pcoa", REPORT_DIR + "/diversity/pcoa")
shutil.copytree(INDIR + "/diversity/tables", REPORT_DIR + "/diversity/tables")
template_data["alpha_rarefaction"] = "alpha_rarefaction/index.html"
# Get alpha group significance data
if os.path.isfile(INDIR + "/alpha_group_significance/shannon-group-significance/index.html"):
shutil.copytree(INDIR + "/alpha_group_significance/shannon-group-significance", REPORT_DIR + "/diversity/alpha_group_significance/shannon-group-significance")
shutil.copytree(INDIR + "/alpha_group_significance/evenness-group-significance", REPORT_DIR + "/diversity/alpha_group_significance/evenness-group-significance")
shutil.copytree(INDIR + "/alpha_group_significance/faith_pd-group-significance", REPORT_DIR + "/diversity/alpha_group_significance/faith_pd-group-significance")
shutil.copytree(INDIR + "/alpha_group_significance/observed_otus-group-significance", REPORT_DIR + "/diversity/alpha_group_significance/observed_otus-group-significance")
template_data["alpha_shannon"] = "diversity/alpha_group_significance/shannon-group-significance/index.html"
template_data["alpha_eveness"] = "diversity/alpha_group_significance/evenness-group-significance/index.html"
template_data["alpha_faith"] = "diversity/alpha_group_significance/faith_pd-group-significance/index.html"
template_data["alpha_observedotus"] = "diversity/alpha_group_significance/observed_otus-group-significance/index.html"
# Get taxonomic composition
if os.path.isfile(INDIR + "/taxonomy/barplot/index.html"):
shutil.copytree(INDIR + "/taxonomy/barplot", REPORT_DIR + "/taxonomy/barplot")
shutil.copytree(INDIR + "/taxonomy/taxons", REPORT_DIR + "/taxonomy/taxons")
template_data["taxo_barplot"] = "taxonomy/barplot/index.html"
template_data["taxo_taxons"] = "taxonomy/taxons/index.html"
# Get Differential abundance
if os.path.isfile(INDIR + "/ancom/volcano/index.html"):
shutil.copytree(INDIR + "/ancom/volcano", REPORT_DIR + "/ancom/volcano")
template_data["ancom_volcano"] = "ancom/volcano/index.html"
# Get Phylogenetic tree
if os.path.isfile(INDIR + "/phylogenetic_tree/tree.nwk"):
os.mkdir(REPORT_DIR + "/phylogenetic_tree")
shutil.copyfile(INDIR + "/phylogenetic_tree/tree.nwk", REPORT_DIR + "/phylogenetic_tree/tree.nwk")
template_data["phylogenetic_tree"] = "phylogenetic_tree/tree.nwk"
def build_html_report():
# Feed HTML template
env = Environment(loader=PackageLoader('build_report', '../'))
htmlTemplate = env.get_template('build_report/templates/build_report.html')
htmlContent = htmlTemplate.render(template_data).encode("utf-8")
# Export HTML file
with open(REPORT_DIR + "/microSysMics.html", 'wb') as f:
f.write(htmlContent)
# Copy bootstrap files
shutil.copytree(os.path.dirname(os.path.abspath(__file__)) + "/static", REPORT_DIR + "/.static")
if __name__ == "__main__":
# Get input analysis directory
global INDIR
INDIR = sys.argv[1]
# Initialize an empty dictionnary that will feed the template
global template_data
template_data = dict()
# Gather all interesting output (HTML viz, data tables...) in a single directory
gather_outputs()
# Build the html report
build_html_report()
Ce diff est replié.
/*!
* Bootstrap v3.3.4 (http://getbootstrap.com)
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
\ No newline at end of file
Ce diff est replié.
Impossible d'afficher diff de source : il est trop volumineux. Options pour résoudre ce problème : voir le blob.
.row {
margin-right: -10px;
margin-left: -10px;
}
.tile_count {
margin-bottom: 20px;
margin-top: 20px;
}
.tile_count .tile_stats_count {
border-bottom: 1px solid #D9DEE4;
padding: 0 10px 0 20px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
position: relative;
}
@media (min-width: 992px) {
footer {
margin-left: 230px;
}
}
@media (min-width: 992px) {
.tile_count .tile_stats_count {
margin-bottom: 10px;
border-bottom: 0;
padding-bottom: 10px;
}
}
.tile_count .tile_stats_count:before {
content:"";
position: absolute;
left: 0;
height: 65px;
border-left: 2px solid #ADB2B5;
margin-top: 10px;
}
@media (min-width:992px) {
.tile_count .tile_stats_count:first-child:before {
border-left: 0;
}
}
.tile_count .tile_stats_count .count {
font-size: 30px;
line-height: 47px;
font-weight: 600;
}
@media (min-width:768px) {
.tile_count .tile_stats_count .count {
font-size: 40px;
}
}
@media (min-width: 992px) and (max-width: 1100px) {
.tile_count .tile_stats_count .count {
font-size: 30px;
}
}
.tile_count .tile_stats_count span {
font-size: 12px;
}
@media (min-width:768px) {
.tile_count .tile_stats_count span {
font-size: 13px;
}
}
.tile_count .tile_stats_count .count_bottom i {
width: 12px;
}
/** tile stats **/
.tile-stats {
position: relative;
display: block;
margin-bottom: 12px;
border: 1px solid #E4E4E4;
-webkit-border-radius: 5px;
overflow: hidden;
padding-bottom: 5px;
-webkit-background-clip: padding-box;
-moz-border-radius: 5px;
-moz-background-clip: padding;
border-radius: 5px;
background-clip: padding-box;
background: #FFF;
-moz-transition: all 300ms ease-in-out;
-o-transition: all 300ms ease-in-out;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.tile-stats:hover .icon i {
animation-name: tansformAnimation;
animation-duration: .5s;
animation-iteration-count: 1;
color: rgba(58, 58, 58, 0.41);
animation-timing-function: ease;
animation-fill-mode: forwards;
-webkit-animation-name: tansformAnimation;
-webkit-animation-duration: .5s;
-webkit-animation-iteration-count: 1;
-webkit-animation-timing-function: ease;
-webkit-animation-fill-mode: forwards;
-moz-animation-name: tansformAnimation;
-moz-animation-duration: .5s;
-moz-animation-iteration-count: 1;
-moz-animation-timing-function: ease;
-moz-animation-fill-mode: forwards;
}
.tile-stats .icon {
width: 20px;
height: 20px;
color: #BAB8B8;
position: absolute;
right: 53px;
top: 22px;
z-index: 1;
}
.tile-stats .icon i {
margin: 0;
font-size: 60px;
line-height: 0;
vertical-align: bottom;
padding: 0;
}
.tile-stats .count {
font-size: 38px;
font-weight: bold;
line-height: 1.65857143
}
.tile-stats .count, .tile-stats h3, .tile-stats p {
position: relative;
margin: 0;
margin-left: 10px;
z-index: 5;
padding: 0;
}
.tile-stats h3 {
color: #BAB8B8;
}
.tile-stats p {
margin-top: 5px;
font-size: 12px;
}
.tile-stats > .dash-box-footer {
position: relative;
text-align: center;
margin-top: 5px;
padding: 3px 0;
color: #fff;
color: rgba(255, 255, 255, 0.8);
display: block;
z-index: 10;
background: rgba(0, 0, 0, 0.1);
text-decoration: none;
}
.tile-stats > .dash-box-footer:hover {
color: #fff;
background: rgba(0, 0, 0, 0.15);
}
.tile-stats > .dash-box-footer:hover {
color: #fff;
background: rgba(0, 0, 0, 0.15);
}
table.tile_info {
padding: 10px 15px;
}
table.tile_info span.right {
margin-right: 0;
float: right;
position: absolute;
right: 4%;
}
.tile:hover {
text-decoration: none;
}
.tile_header {
border-bottom: transparent;
padding: 7px 15px;
margin-bottom: 15px;
background: #E7E7E7;
}
.tile_head h4 {
margin-top: 0;
margin-bottom: 5px;
}
.tiles-bottom {
padding: 5px 10px;
margin-top: 10px;
background: rgba(194, 194, 194, 0.3);
text-align: left;
}
.blue {
color: #3498DB;
}
.purple {
color: #9B59B6;
}
.green {
color: #1ABB9C;
}
.aero {
color: #9CC2CB;
}
.red {
color: #E74C3C;
}
.dark {
color: #34495E;
}
.grey {
color :#7B8483;
}
Ce diff est replié.
Fichier ajouté
Fichier ajouté
Fichier ajouté
Fichier ajouté
Ce diff est replié.
Ce diff est replié.
Ce diff est replié.
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter