diff --git a/README.md b/README.md index a7f31d6..9e4640a 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,11 @@ -# Nouveau site web de Librezo +Proposition de design pour Librezo. [voir le rendu](http://librezo.txmn.tk) -## Utilisation +## Build -[Installez Zola](https://getzola.org) +[Install Zola](https://getzola.org) ```bash -# tester en local -zola serve - -# compiler en démo publique -LIBREZO_WEBSITE=dev zola build - -# compiler en prod -zola build + zola serve ``` - -## Contribution - -Le site devrait respecter les points suivants. - -Note : il n'est pas nécessaire de s'y conformer immédiatement en faisant une MR. La relecture de MR est là pour ça. - -* **Validité** - * Testez votre code avec [le validateur du W3C](https://validator.w3.org). -* **Accessibilité et Responsive** - * Testez votre code avec [le validateur WAVE](https://wave.webaim.org). - * Suivez les recommandations d'accessibilité du [W3C](https://www.w3.org/WAI/) et du [MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility). - * Toutes les fonctionnalités doivent être accessibles au clavier exclusivement (tab, flèches, entrée, espace). Essayez éventuellement avec un lecteur d'écran comme [Orca](https://wiki.gnome.org/Projects/Orca) (Linux), [NVDA](https://www.nvaccess.org/) (Windows) ou TalkBack (Android). - * Les images doivent être optionnelles. - * JavaScript doit être optionnel. - * Les modes clair et sombres doivent être utilisables. (sous Firefox, CTRL+Maj+i puis icônes Soleil et Lune) - * Testez la page avec différentes tailles d'écran. (sous Firefox, CTRL+Maj+m) - * Testez la page avec des simulateurs de daltonisme. (sous Firefox, CTRL+Maj+i puis onglet Accessibilité) -* **Performance** - * Limitez l'utilisation de frameworks. - * Compressez bien les images. [YOGA Image Optimizer](https://yoga.flozz.org/) peut être utile. - * Réduisez les requêtes externes. - * Évitez les animations en continu et les lectures automatiques. -* **Style de code** - * Respectez l'indentation. - * La convention de nommages des `id` et `class` est hiérarchique, avec les niveaux de hiérarchie séparés par des tirets `-`. Les underscores `_` marquent un espace mais pas un niveau hiérarchique. - Exemple : `header-menu-button` serait un bouton du menu de l'entête. -* **Légalité** - * Respectez le RGPD et la loi Informatique et Libertés. - * Sauf exception, n'utilisez que des œuvres et formats libres, et respectez leur licence. (images, polices, bibliothèques) diff --git a/content/404.md b/content/404.md deleted file mode 100644 index 6c9d454..0000000 --- a/content/404.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -title = "Erreur 404" -+++ - -
- Erreur 404 -
diff --git a/content/_index.md b/content/_index.md index d586627..fcacc90 100644 --- a/content/_index.md +++ b/content/_index.md @@ -2,135 +2,68 @@ title = "Librezo" +++ - - - - - + Collectif d'artisans numériques -
- Librezo -
-
-

Aix Bastia Brignoles Cajarc Grasse Le Havre Limoux Marseille

+

Aix – Cambrai – Cévennes – Grasse – Le Havre – Marseille – Montreuil

Made in Chez Vous
-

Melun Montreuil Nantes Pau Rennes Roanne Toulouse

+

Montpellier – Nantes – Paris – Pau – Rennes – Rohanne – Toulouse

-
+Vous en avez assez de dépendre des géants du web ? -Reprenez le contrôle ↱ -En savoir plus sur les logiciels libres ↱ +Reprenez le contrôle de vos données +

+
COMMENT ÇA SE PASSE ?
+

+
Autonomisation de l'infrastructure réseau
-
-{{ square_box(title="Confidentialité", text="Vos données personnelles le restent") }} -{{ square_box(title="Résilience", text="Récupérez rapidement d'une panne avec des sauvegardes") }} -{{ square_box(title="Souveraineté", text="Reprenez le contrôle de votre infrastructure informatique") }} -{{ square_box(title="Liberté", text="Choisissez, personnalisez : c'est du logiciel libre") }} -{{ square_box(title="Interopérabilité", text="Passez vos données d’un système à l’autre sans contrainte") }} -{{ square_box(title="Accessibilité", text="Des prix honnêtes et des logiciels faciles à prendre en main") }} -{{ square_box(title="Proximité", text="Serveur installé chez vous et suivi assuré") }} -{{ square_box(title="Écologie", text="Ensemble, on cherche la solution adaptée à vos besoins, sans consommation superflue") }} -{{ square_box(title="Savoir-faire", text="Vous êtes en contact direct avec des experts") }} -{{ square_box(title="Solidarité", text="15% de nos bénéfices sont reversés au développement des logiciels utilisés") }} +
+{{ process_box(number="1", title="Étude", description="Définition du besoin et propositions de solutions adaptées.") }} +{{ process_box(number="2", title="Installation", description="Montage du serveur à domicile et installation du système et des composants logiciels.") }} +{{ process_box(number="3", title="Configuration", description="Réglages sur mesure et configurations de sécurité.") }} +{{ process_box(number="4", title="Acquisition", description="Votre serveur GNU/Linux est prêt et 100% entre vos mains. Tests.") }}
- - -

Pour qui ?

- -
- -Pour toute structure ou personne qui possède une infrastructure réseau (site Internet, serveur de fichiers...) ou qui souhaite en faire l'acquisition. +

+
Formations optionnelles
+
+{{ process_box(number="5", title="Accompagnement utilisateur", description="Apprenez en quelques heures à utiliser vos outils.") }} +{{ process_box(number="6", title="Accompagnement administrateur", description="Devenez administrateur-système de votre propre infrastructure (plusieurs semaines).") }} +{{ process_box(number="7", title="Autonomie", description="Vous êtes capable de gérer votre système et vos applications : vous êtes autonome et n'avez plus besoin de tiers de confiance.") }}
-

Nos partenaires

- -
-{{ partner_box( - title = "Pâquerette, informatique collaborative et responsable" - img = "/img/partners/paquerette.png" - url = "https://paquerette.eu" -) }} -{{ partner_box( - title = "WikiLibriste.fr" - img = "/img/partners/wikilibriste.jpg" - url = "https://wikilibriste.fr" -) }} -{{ partner_box( - title = "Electrocycle" - img = "/img/partners/electrocycle.png" - url = "https://electrocycle.co" -) }} -{{ partner_box( - title = "Librecours" - img = "/img/partners/librecours-mini.png" - url = "https://librecours.net" -) }} -{{ partner_box( - title = "Ethic IT" - img = "/img/partners/ethicit-mini.png" - url = "https://ethicit.fr" -) }} -{{ partner_box( - title = "Immae" - img = "/img/partners/immae-mini.png" - url = "https://immae.eu" -) }} -{{ partner_box( - title = "Distrilab" - img = "/img/partners/distrilab.png" - url = "https://distrilab.fr" -) }} -{{ partner_box( - title = "foOpgp" - img = "/img/partners/foopgp-mini.png" - url = "https://foopgp.org" -) }} -
- -

Ils nous font confiance

+

Ils nous font confiance

-{% client_box( +{{ client_box( title = "Novelcast" href = "https://novelcast.com" img = "/img/clients/novelcast.png" - sign = "Jean-Baptiste J." -) %} - J'ai fait appel à Librezo pour développer un CRM back-office autonome, indépendant et léger, afin de maîtriser nos données sensibles, sur un serveur local, indépendant, avec une redondance sur un serveur miroir.
- La proposition de Librezo s'est portée sur des serveurs de petite taille, abordables, très économes en énergie, et très facilement sécurisables.
- L'équipe de Librezo a été d'un grand secours, et la maîtrise des impératifs de sécurité des données contre l'effacement ou le piratage est indéniable. -{% end %} -{% client_box( + text = + "J'ai fait appel à Librezo pour développer un CRM back-office autonome, indépendant et léger, afin de maîtriser nos données sensibles, sur un serveur local, indépendant, avec une redondance sur un serveur miroir.
+ La proposition de Librezo s'est porté des serveurs de petite taille, abordables, très économes en énergie, et très facilement sécurisables.
+ L'équipe de Librezo a été d'un grand secours, et la maîtrise des impératifs de sécurité des données contre l'effacement ou le piratage est indéniable.

+ Jean-Baptiste J." +) }} +{{ client_box( title = "Oasis21" href = "https://oasis21.org" img = "/img/partners/oasis21.png" - img_dark = "/img/partners/oasis21-white.png" - sign = "Mathieu L." -) %} - La SCIC Oasis21 fait appel à Librezo pour la gestion technique de son serveur mutualisé de stockage en ligne via Nextcloud. Nous avons construit une vraie relation partenariale et de confiance, brique qui nous semble indispensable pour gérer un projet informatique aussi crucial pour les structures de l'ESS qui en bénéficient. Nous sommes ravis de pouvoir collaborer ensemble dans la durée autour de ce projet et de bénéficier des compétences techniques et de l'écoute de Librezo afin d'offrir un service de qualité aux membres de notre coopérative. -{% end %} -{% client_box( - title = "GE-Data" - href = "https://ge-data.com" - img = "/img/clients/ge-data.png" - sign = "Olivier F." -) %} - Librezo a mis en place nos serveurs et continue à les maintenir. Le soutien technique est de qualité et vraiment à l'écoute de nos besoins, avec des solutions créatives face à nos demandes. Leur connaissance des solutions en logiciels libres est aussi un plus pour nous. -{% end %} -{% client_box( - title = "Jarditerre" - href = "https://jarditerre.fr" - img = "/img/clients/jarditerre.jpg" - sign = "Salomé D." -) %} - J'ai fait appel à Librezo pour créer les sites web de Jarditerre et de Verdun Coliving. J’ai été très satisfaite de leur aide et de leur réactivité que ce soit par email ou par téléphone. Ils m’offrent aussi l’hébergement, le tout en monnaie libre, ce qui montre leur fort engagement pour un monde libre et meilleur, et nous permet d’en faire autant dans nos activités. -{% end %} - + text = + "La SCIC Oasis21 fait appel à Librezo pour la gestion technique de son serveur mutualisé de stockage en ligne via Nextcloud. Nous avons construit une vraie relation partenariale et de confiance, brique qui nous semble indispensable pour gérer un projet informatique aussi crucial pour les structures de l'ESS qui en bénéficient. Nous sommes ravis de pouvoir collaborer ensemble dans la durée autour de ce projet et de bénéficier des compétences techniques et de l'écoute de Librezo afin d'offrir un service de qualité aux membres de notre coopérative.

+ Mathieu L." +) }} +{{ client_box( + title = "Jarditerre" + href = "https://jarditerre.fr" + img = "/img/clients/Jarditerre.png" + text = + "J'ai fait appel à Librezo pour créer les sites webs de Jarditerre et de Verdun Coliving. J’ai été très satisfaite de leur aide et de leur réactivité que ce soit par email ou par téléphone.
Ils m’offrent aussi l’hébergement, le tout en monnaie libre, ce qui montre leur fort engagement pour un monde libre et meilleur, et nous permet d’en faire autant dans nos activités.

+ Salomé D." +) }}
diff --git a/content/_index.md.save b/content/_index.md.save new file mode 100644 index 0000000..4f04a53 --- /dev/null +++ b/content/_index.md.save @@ -0,0 +1,60 @@ ++++ +title = "Librezo" ++++ + + + +Collectif d'artisans numériques + +
+

Aix – Cambrai – Cévennes – Grasse – Le Havre – Marseille – Montreuil

+
+ Made in Chez Vous +
+

Montpellier – Nantes – Paris – Pau – Rennes – Rohanne – Toulouse

+
+ +Vous en avez assez de dépendre des géants du web ? + +Reprenez le contrôle de vos données + +
Comment ça se passe ?
+ +https://git.txmn.tk/Librezo/website.gitAutonomisation de l'infrastructure réseau
+ +
+{{ process_box(number="1", title="Étude", description="Définition du besoin et propositions de solutions adaptées.") }} +{{ process_box(number="2", title="Installation", description="Montage du serveur à domicile et installation du système et des composants logiciels.") }} +{{ process_box(number="3", title="Configuration", description="Réglages sur mesure et configurations de sécurité.") }} +{{ process_box(number="4", title="Acquisition", description="Votre serveur GNU/Linux est prêt et 100% entre vos mains. Tests.") }} +
+ +
Formations optionnelles
+ +
+{{ process_box(number="5", title="Accompagnement utilisateur", description="Apprenez en quelques heures à utiliser vos outils.") }} +{{ process_box(number="6", title="Accompagnement administrateur", description="Devenez administrateur-système de votre propre infrastructure (plusieurs semaines).") }} +{{ process_box(number="7", title="Autonomie", description="Vous êtes capable de gérer votre système et vos applications : vous êtes autonome et n'avez plus besoin de tiers de confiance.") }} +
+ +

Iels nous font confiance

+ +
+{{ client_box( + title = "Novelcast" + href = "https://novelcast.com" + img = "/img/clients/novelcast.png" + text = + "J'ai fait appel à Librezo pour développer un CRM back-office autonome, indépendant et léger, afin de maîtriser nos données sensibles, sur un serveur local, indépendant, avec une redondance sur un serveur miroir.
+ La proposition de Librezo s'est porté des serveurs de petite taille, abordables, très économes en énergie, et très facilement sécurisables.
+ L'équipe de Librezo a été d'un grand secours, et la maîtrise des impératifs de sécurité des données contre l'effacement ou le piratage est indéniable.
+ En plus, ils sont gentils et ils sentent bon sous les bras..." +) }} +{{ client_box( + title = "Oasis21" + href = "https://oasis21.org" + img = "/img/partners/oasis21.png" + text = + "La SCIC Oasis21 fait appel à Librezo pour la gestion technique de son serveur mutualisé de stockage en ligne via Nextcloud. Nous avons construit une vraie relation partenariale et de confiance, brique qui nous semble indispensable pour gérer un projet informatique aussi crucial pour les structures de l'ESS qui en bénéficient. Nous sommes ravis de pouvoir collaborer ensemble dans la durée autour de ce projet et de bénéficier des compétences techniques et de l'écoute de Librezo afin d'offrir un service de qualité aux membres de notre coopérative." +) }} +
diff --git a/content/charte.md b/content/charte.md index 184b493..8109ac6 100644 --- a/content/charte.md +++ b/content/charte.md @@ -2,34 +2,24 @@ title = "Charte" +++ -
- Charte -
- Librezo est un collectif autogéré d'individus, d’associations et d’entreprises qui mutualisent leurs ressources, compétences et connaissances au sein d'une structure à taille humaine dans le but de : -* promouvoir des solutions informatiques en licences libres comme alternatives aux systèmes privateurs des GAFAM ; -* encourager l’installation de serveurs auto-hébergés pour permettre à ses clients de s’affranchir d’acteurs tiers et leur garantir la confidentialité et le contrôle de leurs données personnelles et de leur infrastructure numérique ; -* créer un réseau de prestataires de confiance sur l’ensemble du territoire ; -* accompagner ses clients dans leur utilisation des logiciels libres en vue de les rendre autonomes ; -* développer un modèle économique viable pour la promotion du logiciel libre en mettant en œuvre des prestations de service sur mesure associées à son utilisation. +* promouvoir des solutions informatiques en licences libres comme alternatives aux systèmes privateurs des GAFAM +* encourager l’installation de serveurs auto-hébergés pour permettre à ses clients s’affranchir d’acteurs tiers et leur garantir la confidentialité et le contrôle de leurs données personnelles et de leur infrastructure numérique +* créer un réseau de prestataires de confiance sur l’ensemble du territoire +* accompagner ses clients dans leur utilisation des logiciels libres en vue de les rendre autonomes +* développer un modèle économique viable pour la promotion du logiciel libre en mettant en œuvre des prestations de service sur mesure associées à son utilisation La mission de Librezo s’inscrit dans une volonté technique de décentralisation des serveurs informatiques pour se préserver de la surveillance et de la censure généralisées. Cette décentralisation répond également à la nécessaire réduction de l’empreinte énergétique du numérique. Les membres de Librezo et leurs partenaires sont promoteurs, utilisateurs, contributeurs ou ont une implication forte dans le logiciel libre. L'appartenance au collectif Librezo n'est pas liée à des accords financiers ou commerciaux, mais à l'évaluation par les autres membres du respect des valeurs et objectifs communs : -* liberté en tant que non-nuisance symétrique ; -* horizontalité des prises de décision ; -* partage et transmission des connaissances ; -* autonomie et entraide au sein d’une toile de confiance ; -* contribution au développement de l’écosystème du logiciel libre par la création de nouveaux outils informatiques ; +* liberté en tant que non nuisance symétrique. +* horizontalité de la prise de décision. +* partage et transmission des connaissances. +* autonomie et entraide au sein d’une toile de confiance. +* contribution au développement de l’écosystème du logiciel libre par la création de nouveaux outils informatiques. * politique locale des prestations favorisant la proximité géographique des clients et prestataires. -L’aventure Librezo est une expérimentation de démocratie d’entreprise. - - +L’aventure Librezo est une expérimentation de démocratie d’entreprise. diff --git a/content/contact.md b/content/contact.md index 376d737..62fda2a 100644 --- a/content/contact.md +++ b/content/contact.md @@ -1,34 +1,13 @@ +++ title = "Contact" -[extra] -leaflet = 1 +++ -
- Contactez-nous -
+Que ce soit pour un devis, pour rejoindre notre collectif ou pour toute question relative à nos services, n'hésitez pas à nous contacter. -Pour un devis, pour [rejoindre notre collectif](/rejoignez-nous) ou pour toute question relative à nos services : +Librezo
+Chez Oasis21
+2 rue de la Clôture
+75019 Paris +tel : 07.82.30.66.53
Courriel : contact@librezo.fr - -## On est là - -{% map() %} -[[43.3879, 6.0785], "Brignoles", [["Francis Drubigny"]]], -[[42.6998, 9.4518], "Bastia", [["Fred Romboni"]]], -[[44.4742, 1.8296], "Cajarc", [["Sylvestre Mignot"]]], -//[[50.1718, 3.2305], "Cambrai", []], -[[43.6578, 6.9228], "Grasse", [["Ismaël Bouya"], ["Vincent Dubois"]]], -[[49.4927, 0.1641], "Le Havre", [["Pierre-Jean Chancellier"]]], -[[43.0465, 2.2449], "Limoux", [["Fabrice"]]], -[[43.3099, 5.4127], "Marseille", [["Jean-Jacques Brucker"]]], -[[48.5421, 2.6551], "Melun", [["Étienne Bouché"]]], -//[[43.6048, 3.8818], "Montpellier", []], -[[48.8584, 2.4371], "Montreuil", [["Cédric Dumond"]]], -[[47.2084, -1.6026], "Nantes", [["Clément Thomas"]]], -[[43.2926, -0.3703], "Pau", [["Thibaut Parent"]]], -[[48.1077, -1.6795], "Rennes", [["Tobias Ollive"], ["Philippe Lhardy"]]], -[[46.0321, 4.0730], "Roanne", [["Pierre Kuhn"]]], -[[43.5931, 1.4272], "Toulouse", [["Baptiste Malet-Schalck"], ["Mathilde Longuet"]]], -{% end %} diff --git a/content/fonctionnement.md b/content/fonctionnement.md index 24ff22d..2ac8773 100644 --- a/content/fonctionnement.md +++ b/content/fonctionnement.md @@ -2,49 +2,40 @@ title = "Fonctionnement" +++ -
- Librezo en pièces détachées -
+## Fonctionnement de Librezo avec ses clients -

Comment ça se passe ?

+- Librezo est à la fois un collectif de membres prestataires informel _et_ une SAS tout à fait officielle. Librezo n'a pas de salariés, uniquement des prestataires. -

Autonomisation de l'infrastructure réseau

+- Tout client peut contacter Librezo pour avoir un devis ou un contrat qui sera réalisé par un ou plusieurs de ses membres prestataires. + +- Librezo s'occupe de trouver au sein du collectif le ou les prestataires compétents pour réaliser le projet. + +- Une fois le ou les prestataires trouvés, le client est mis en contact direct avec son prestataire principal, qui gérera son dossier technique et coordonnera les différentes tâches à accomplir. + +- Le prestataire principal retourne le devis global majoré de la TVA et 15% qui correspondent aux frais de gestion. -
-{{ process_box(number="1", title="Étude", description="Définition du besoin et propositions de solutions adaptées.") }} -{{ process_box(number="2", title="Installation", description="Montage du serveur à domicile et installation du système et des composants logiciels.") }} -{{ process_box(number="3", title="Configuration", description="Réglages sur mesure et configurations de sécurité.") }} -{{ process_box(number="4", title="Acquisition", description="Votre serveur GNU/Linux est prêt et 100% entre vos mains. Tests.") }} -
+- Une fois le devis validé par Librezo, le client paie 30% d’acompte. -

Accompagnements optionnels

+- Quand la prestation est terminée et que le service créé est fonctionnel, le ou les prestataires envoient les factures à Librezo qui facture à son tour le client des 70% restants. Toute prestation est payable à 30 jours maximum. -
-{{ process_box(number="5", title="Accompagnement utilisateur", description="Apprenez en quelques heures à utiliser vos outils.") }} -{{ process_box(number="6", title="Accompagnement administrateur", description="Devenez administrateur-système de votre propre infrastructure (plusieurs semaines).") }} -{{ process_box(number="7", title="Autonomie", description="Vous êtes capable de gérer votre système et vos applications : vous êtes autonome et n'avez plus besoin de tiers de confiance.") }} -
+- Le client fait le virement à Librezo, qui rémunère ensuite les prestataires. -

Avec les client·es

+## Maintenance de projet -Le client contacte Librezo pour obtenir un devis. +- Dans le cadre d'un contrat de maintenance ou de monitoring, il est possible de régler un forfait à l'année ou de payer à l'heure. La facture annuelle peut être réglée en totalité à librezo au début (ou date anniversaire), au semestre ou au trimestre et le(s) prestataire(s) qui interviennent sur le projet facturent mensuellement leur temps passé. -Librezo trouve le prestataire compétent pour le projet, qui établit son devis directement au client. +- Librezo propose de la maintenance sur les projets et développements conçus par ses prestataires et/ou qui rentrent dans le cadre de sa charte. -Une fois le devis validé, le client paie 30% d’acompte. +- Le contrat de maintenance est élaboré par Librezo et le client, mais n'est pas forcément attribué au prestataire principal, qui doit alors fournir les accès à un autre prestataire pouvant le remplacer s'il n'est pas disponible. -Quand la prestation est terminée et que le service créé est fonctionnel, le prestataire envoie sa facture au client qui règle les 70% restants. +## Fonctionnement de Librezo avec ses membres et associés -Toute prestation est payable à 30 jours maximum. +- Tout libriste désireux de rejoindre le collectif est libre d'en faire la demande. Il doit cependant avoir sa propre structure pour devenir prestataire (auto et micro entreprise, association, entreprise, etc...) ainsi que des compétences et une expertise à apporter, quel que soit son domaine d'action. -### Maintenance de projet +- Tout membre du collectif désireux de devenir associé de la SAS peut en faire la demande, qui sera étudiée par les autres membres avant cooptation. -Librezo propose de la maintenance sur les projets et développements conçus par ses prestataires et/ou qui rentrent dans le cadre de sa charte. Cette maintenance peut être effectuée à distance. +- Le collectif gère la gouvernance et les projets, l'entreprise gère les questions financières et légales. -Dans le cadre d’un contrat de maintenance ou de monitoring, il est possible de régler un forfait à l’année ou de payer à l’heure. La facture annuelle peut être réglée en totalité au prestataire au début (ou à date anniversaire), au semestre ou au trimestre, et les prestataires intervenant sur le projet facturent mensuellement leur temps passé. +- Chaque membre et/ou associé ne dispose que d'une voix, quel que soit son nombre de parts. -

Avec nos membres

- -- Tout·e libriste souhaitant [rejoindre le collectif](/rejoignez-nous) est libre d'en faire la demande, qui sera étudiée par les autres membres avant cooptation. Il faut cependant avoir sa propre structure pour devenir prestataire (micro-entreprise, association, entreprise, etc...) ainsi que des compétences et une expertise à apporter, quel que soit son domaine d'action. -- La gouvernance du collectif est collégiale. Chaque membre dispose d'une seule voix. -- Les membres prestataires s'acquittent eux-mêmes de leurs formalités administratives et financières. Le collectif ne gère pas la comptabilité de ses membres. +- Les prestataires s'acquittent eux-mêmes de leurs formalités administratives et financières, Librezo ne gère que sa propre comptabilité, pas celle de ses prestataires. diff --git a/content/logiciel-libre.md b/content/logiciel-libre.md index aec6e48..4a38a42 100644 --- a/content/logiciel-libre.md +++ b/content/logiciel-libre.md @@ -2,68 +2,67 @@ title = "Le logiciel libre, nécessaire outil de notre souveraineté numérique" +++ -
- L'ignoble hydre des GAFAM -
- -Pourquoi proposons-nous des logiciels libres, et d'abord qu'entendons-nous par "libre" ? +Pourquoi proposons-nous des logiciels libres, et d'abord qu'entendons-nous par "libre" ? ## Les libertés informatiques Les logiciels libres respectent vos 4 libertés informatiques fondamentales : * **Utiliser le logiciel** - Votre logiciel ne vous obligera jamais à payer ou à respecter des clauses malhonnêtes pour pouvoir continuer à l'utiliser. - + Votre logiciel ne vous obligera jamais à payer ou à respecter des clauses malhonnêtes, pour pouvoir continuer à l'utiliser. * **Étudier le logiciel** Le code source (les plans de conception) du logiciel est publié, n'importe qui peut donc demander à des experts indépendants d'en faire un audit de sécurité, par exemple. - * **Partager le logiciel** Si vous avez une copie du logiciel, vous avez toujours le droit de la partager. Même si le distributeur d'origine ne répond plus, vous pourrez toujours trouver une copie autre part. - * **Modifier le logiciel** - Une fonctionnalité vous manque ou un bug vous gêne ? Faites appel à un développeur pour améliorer le logiciel. Nul besoin d'attendre que l'éditeur d'origine veuille bien accéder à votre demande. L'amélioration pourra ensuite être partagée avec la communauté. + Une fonctionnalité vous manque ou un bug vous gêne ? Il suffit de trouver un développeur qui voudra bien améliorer le logiciel. Nul besoin d'attendre que l'éditeur d'origine veuille bien accéder à votre demande. L'amélioration pourra ensuite être partagée avec la communauté. Un logiciel ne respectant pas ces 4 libertés fondamentales est dit privateur, car il tente de vous priver de votre capacité à traiter de l'information, c'est-à-dire à utiliser un ordinateur. -Quels sont les autres avantages du logiciel libre ? - -## Conçus pour être utiles - -Les logiciels libres sont en général conçus pour faire leur fonction, et non pour être vendus. Il y a donc moins de conflits d'intérêts néfastes. - -Le code source d'un logiciel privateur ne pouvant être audité, il est impossible de savoir exactement ce qu'il fait quand nous l'exécutons sur notre machine, nous devons donc avoir toute confiance en son éditeur. Les incessants soucis de confidentialité observés chez les géants de l'informatique montre que cette confiance est peut-être mal placée. - -Exemple : quand vous téléchargez une application "lampe de poche" et qu’elle demande l’accès à vos contacts, agendas, photos, GPS, etc… peut-être qu’elle ne fait pas que lampe de poche ! - -## Sécurité - -Les logiciels privateurs dont le code source reste secret peuvent facilement intégrer des portes dérobées, qui permettent non seulement à l'éditeur et aux services secrets gouvernementaux de contrôler la machine à distance, mais aussi aux pirates ! - -Une telle faille est plus facilement détectée dans un logiciel libre, et la communauté est alertée. - -On pourrait croire qu’un code source public faciliterait le travail des pirates, mais dès qu’une faille est trouvée, elle peut être corrigée par la communauté plutôt que tenue secrète. - -## Interopérabilité - -Les éditeurs de services privateurs ont tout intérêt à rendre difficile l'utilisation d'autres services que les leurs : une fois que vous devenez dépendant de leur système, il devient très coûteux d'en changer, et vous pouvez être incité à acheter toujours plus. - -## Gratuité - -Les logiciels libres sont gratuits à utiliser, mais jamais gratuits à produire ! - -Les logiciels libres ne se financent en général pas par la vente de licences d'utilisation, la publicité ou la vente de données à caractère personnel. Le travail est souvent bénévole ou alimenté par le don. Il est donc naturel de contribuer à leur développement quand on les utilise. C'est ce que fait Librezo, en reversant 15% de ses bénéfices à des projets de logiciels libres. - ## Auto-hébergement -Pourquoi s'auto-héberger ? - Les services centralisés posent divers problèmes : -* Vous n'avez aucun contrôle sur leur gestion, ils peuvent exploiter vos données sensibles à des fins publicitaires ou politiques sans votre consentement. -* Leurs propriétaires peuvent faire des choix qui ne vous plaisent pas voire avec lesquels vous êtes en désaccord. -* Ce sont les hypermarchés d'Internet : si votre prestataire de services est éloigné (Paris, États-Unis), chaque page web vue sur votre site aura parcouru des milliers de kilomètres en passant par des dizaines de machines. +* Vous n'avez aucun contrôle sur leur gestion, ils peuvent exploiter vos données sensibles à des fins publicitaires ou politiques. Leurs propriétaires peuvent faire des choix qui ne vous plaisent pas. +* Ce sont les hypermarchés d'Internet : si votre prestataire de services est loin (Paris, Amérique), chaque page web vue sur votre site aura parcouru des milliers de kilomètres en passant par des dizaines de machines. Héberger vos services informatiques chez vous ou chez des prestataires locaux et de confiance, permet de relocaliser Internet, de ne pas subir les choix des hébergeurs, et de respecter vos données sensibles et celles de vos clients. -
Reprenez le contrôle ↱
+## Sécurité + +Les logiciels privateurs dont le code source reste secret peuvent facilement intégrer des portes dérobées, qui permettent non seulement à l'éditeur et aux services secrets de contrôler la machine à distance, mais aussi aux pirates ! + +Une telle faille est plus facilement détectée dans un logiciel libre, et la communauté est alertée. + +On pourrait se dire qu'un code source public faciliterait le travail des pirates, mais cela est largement compensé par le fait que dès qu'une faille est trouvée, tout le monde le sait et elle peut être corrigée plutôt que tenue secrète. + +## Conçu pour être utile + +Les logiciels libres sont en général conçus pour faire leur boulot, et non pour être vendus. Il y a donc moins de conflits d'intérêts néfastes. + +## Protection des données + +## Interopérabilité + +Les éditeurs de services privateurs ont tout intérêt à rendre difficile d'utiliser d'autres services que les leurs : une fois que vous devenez dépendant de leur système, il devient très coûteux d'en changer, et vous pouvez être incité à acheter toujours plus. + +## Communauté + +## Gratuité + +gratuit mais a besoin de financement -> dons + +
+ +Ancienne version : + +Devant la ruée vers ce nouvel Or Noir que sont devenues nos données personnelles durant cette dernière décennie, un constat s'impose : les géants du web proposant un service apparemment gratuit vendent nos données et s'enrichissent car le produit, c'est nous. + +La licence interdisant tout audit du code, il est impossible de savoir exactement ce que fait un programme propriétaire que nous exécutons, nous devons donc avoir toute confiance dans l'entreprise qui nous l'a vendu. Les incessants soucis de confidentialité observés chez la plupart des grands acteurs connus montre que cette confiance est peut-être mal placée. + + +Il existe une solution simple à ce problème : le logiciel libre. + +Accessible, décentralisé, communautaire, audité par des cohortes de développeurs du monde entier, moins gourmand en ressources et donc moins énergivore, sa licence permet l'utilisation immédiate et sans condition de tous les programmes contenus dans les gigantesques bibliothèques partagées des systèmes GNU/Linux et donc une autonomie logicielle complète. + +Couplée à l'auto-hébergement, cette solution communautaire permet de garder un contrôle total de votre matériel, de vos logiciels, de vos données et de votre confidentialité. diff --git a/content/mentions-legales.md b/content/mentions-legales.md deleted file mode 100644 index 2c20abf..0000000 --- a/content/mentions-legales.md +++ /dev/null @@ -1,18 +0,0 @@ -+++ -title = "Mentions légales" -+++ - -Ce site, les services hébergés ainsi que les sous-domaines de librezo.com et librezo.fr sont édités par le collectif Librezo. - -## Hébergeurs - -- [EthicIT](https://ethicit.fr/) -- Chez Cédric Dumond, 53 rue Colmet Lépinay 93100 Montreuil - -## Conception - -Site conçu par tuxmain avec la complicité de GRA, Djool et Attilax. - -Le [code source](https://git.txmn.tk/Librezo/website) du site est disponible sous licence CC BY-SA 4.0. - -Logo par Dig sous licence CC BY-SA 4.0. diff --git a/content/qui-sommes-nous.md b/content/qui-sommes-nous.md index 4862b39..5148ce8 100644 --- a/content/qui-sommes-nous.md +++ b/content/qui-sommes-nous.md @@ -1,211 +1,119 @@ +++ title = "Qui sommes-nous ?" -[extra] -carousel = true +++ -
- Qui sommes-nous +Librezo est un collectif décentralisé, né de la rencontre d'ami·es libristes désirant partager leur passion et leur savoir-faire dans le domaine des réseaux et du logiciel libre. + +
+ + Activateur France Num +
-Librezo est un collectif décentralisé, né de la rencontre d'ami·es libristes désirant partager leur passion et leur savoir-faire dans le domaine des réseaux et du logiciel libre. - -
-{% team_box( - title = "Étienne Bouché" - place = "Melun" - subtitle = "Le Technicien engagé" - img = "poka.jpg" -) %} - Administrateur système Linux depuis 10 ans, a travaillé aussi bien pour des Associations que pour de grandes entreprises. Développeur pour la Monnaie Libre Ğ1. Possède autant de cordes à son arc qu’à son piano. -{% end %} -{% team_box( - title = "Cédric Dumond" - place = "Montreuil" - subtitle = "Le comédien bidouilleur" - img = "cedric.jpg" -) %} - Fondateur de Librezo, d'après une idée d'Étienne.
- Comédien, auteur, gribouilleur, libriste, formateur autodidacte GNU-Linux pour la Chambre des Métiers et de l'Artisanat de la Ville de Paris. Vrai "Touche-à-tout", ne laissez rien traîner. -{% end %} -{% team_box( - title = "Pascal Engélibert" - place = "Bordeaux" - subtitle = "Le bricoleur" - img = "tuxmain.jpg" -) %} - Alias tuxmain. Geek depuis toujours, étudiant, libriste. Développeur de ProgAccess et d'outils en tous genres. Héberge quelques sites et services variés. Amateur d'électronique. -{% end %} -{% team_box( - title = "Tobias Ollive" - place = "Rennes" - subtitle = "Le monocycliste" - img = "tobias.jpg" -) %} - Ingénieur en informatique, glaneur, bidouilleur et circassien à ses heures perdues, a travaillé dans un projet de recherche pour l'accessibilité des personnes aveugles pendant 2 ans. -{% end %} -{% team_box( - title = "Baptiste Malet-Schalck" - place = "Toulouse" - subtitle = "Gentil informaticien" - img = "ethicit.jpg" -) %} - Geek, passionné d'astronomie, aime la vie et les gens. Facilitateur informatique, auto-entrepreneur, touche-à-tout. Créateur d'EthicIT et devloprog. -{% end %} -{% team_box( - title = "Jean-Jacques Brucker" - place = "Marseille" - subtitle = "01D 5CH001 H4CK3r" - img = "jjb.jpg" -) %} - Ingénieur & libriste depuis 20 ans, a travaillé pour de grands groupes (Sagem, Phillips, Orange), mais pas que. A développé ou maintenu divers logiciels, systèmes et écosystèmes. Love bash, git, debian, OpenPGP. -{% end %} -{% team_box( - title = "Mathilde Longuet" - place = "Toulouse" - subtitle = "La CyberPunk" - img = "mathilde.jpg" -) %} - Ingénieure en informatique, passionnée de philosophie et politique, a travaillé dans la cybersécurité 3 ans, avant de se tourner vers le monde associatif. -{% end %} -{% team_box( - title = "Francis Drubigny" - place = "Brignoles" - subtitle = "L'explorateur polymathe" - img = "francis-drubigny.jpg" -) %} - Chef de projet web & digital, autodidacte, 20 ans d'expériences diverses dans le monde du web et de l'informatique. Passionné de technologies, polymathe avec un intérêt pour des sujets variés : informatique, sport, santéi, économie, sciences, sociologie... -{% end %} -{% team_box( - title = "Ismaël Bouya" - place = "Grasse" - subtitle = "L’acrobate libriste" - img = "ismael.jpg" -) %} - Ancien chercheur et ingénieur logiciel, circassien semi-professionnel, propose des services et formations basés sur des logiciels libres depuis plus de 10 ans. (site web Immae) -{% end %} -{% team_box( - title = "Vincent Dubois" - place = "Le Bar Sur Loup" - subtitle = "Ingénieur Multi-potentiels" - img = "vincent.jpg" -) %} - Militant logiciels libres et Open Data, de nombreuses années d'animation d'ateliers logiciels libres et install-party, mais aussi de la modélisation numérique, de la cartographie, et bien d'autres choses ! -{% end %} -{% team_box( - title = "Philippe Lhardy" - place = "Rennes" - subtitle = "Ingénieur système" - img = "philippe.png" -) %} - Militant logiciels libres au sein de l'association linux azur depuis de nombreuses années. A travaillé 20 ans dans le développement de solutions d'administration de sécurité réseau. -{% end %} -{% team_box( - title = "Mose" - place = "Taïwan" - subtitle = "devops libriste" - img = "mose.jpg" -) %} - Mose est un technicien de l'internet montpelliérain expatrié à Taiwan. Militant du libre depuis 96. Bidouilleur multitâche. Voir son site web pour plus d'info. -{% end %} -{% team_box( - title = "Fabrice alias 12b" - place = "Limoux" - subtitle = "Ingénieur système" - img = "fabrice.jpg" -) %} - Fabrice est ingénieur systèmes temps réels et photographe dans le sud de la France. Passionné par les logiciels libres depuis sa tendre enfance, il s'occupe au DistriLab de l'infrastructure d'hébergement des outils libres et de la veille techologique sur les technologies distribuées. -{% end %} -{% team_box( - title = "Thibaut Parent" - place = "Pau" - subtitle = "Librate éthique" - img = "thibaut-parent.png" -) %} - Libriste depuis 20 ans, freelance web éthique depuis 2011. Webmaster WordPress pluridisciplinaire : création, refonte et administration de sites Internet, communication, création de contenu... Engagé dans l'associatif et l'alternatif, sa devise est "utile-juste-éthique" -{% end %} -{% team_box( - title = "Pierre Kuhn" - place = "Roanne" - subtitle = "Développeur web et PHP" - img = "pierretux.jpg" -) %} - Developpeur PHP et SPIP depuis 10 ans en autodidacte, pour des associations, entreprises et institutions gouvernementales. Touche à tout mais surtout au jardin et à SPIP ! -{% end %} -{% team_box( - title = "Sylvestre Mignot" - place = "Cajarc" - subtitle = "Artisan bidouilleur" - img = "sylvestre.png" -) %} - Libriste, formé à la bidouille (résilience numérique, énergétique, domotique). Artisan laser numérique aujourd'hui, il a mis ces connaissances au service de son entreprise Anuanua. -{% end %} -{% team_box( - title = "Pierre-Jean Chancellier" - place = "Le Havre" - subtitle = "L'enjoliveur du web" - img = "paidge.jpg" -) %} - Développeur Front en reconversion depuis 2011 et contributeur de la monnaie libre Ğ1 depuis 2015. Sa spécialité ? Tout de qui touche au web : HTML, CSS, Javascript et PHP. Il vient de créer sa micro-entreprise pour offrir son expertise dans vos projets de sites ou d'applications en ligne. -{% end %} -{% team_box( - title = "Polie Tujeri" - place = "Gramat" - subtitle = "La scribouillarde" - img = "djool.png" -) %} - Copywriter, rédactrice, community manager et commerciale. Traque les bugs et les erreurs de syntaxe. Vie parallèle en compagnie de plantes et d'animaux sauvages. Slogans, punchlines, jeux de mots et storytelling garantis. -{% end %} +
+{{ team_box( + title = "Étienne Bouché", + place = "Melun", + subtitle = "Le Technicien engagé", + img = "poka.jpg", + description = "Administrateur système Linux depuis 10 ans, a travaillé aussi bien pour des Associations (TERA, La Ruche Qui Dit Oui, Axiom-Team) que pour de grandes entreprises (La Poste, Solucom). Développeur pour la Monnaie Libre Ğ1, fondateur historique de P2PLEGAL." +) }} +{{ team_box( + title = "Cédric Dumond", + place = "Montreuil", + subtitle = "Le comédien bidouilleur", + img = "cedric.jpg", + description = "Fondateur de Librezo, d'après une idée d'Étienne.
Comédien, auteur, gribouilleur, libriste, formateur autodidacte GNU-Linux pour la Chambre des Métiers et de l'Artisanat de la Ville de Paris. Vrai "Touche-à-tout", ne laissez rien traîner." +) }} +{{ team_box( + title = "Pascal Engélibert", + place = "Bordeaux", + subtitle = "Le bricoleur", + img = "tuxmain.jpg", + description = "Geek depuis toujours, étudiant, libriste. Développeur de ProgAccess et d'outils en tous genres. Héberge quelques sites et services variés. Amateur d'électronique." +) }} +{{ team_box( + title = "Tobias Ollive", + place = "Cambrai", + subtitle = "Le monocycliste", + img = "tobias.jpg", + description = "Ingénieur en informatique, glaneur, bidouilleur et circassien à ses heures perdues, a travaillé dans un projet de recherche pour l'accessibilité des personnes aveugles pendant 2 ans." +) }} +{{ team_box( + title = "Baptiste Malet-Schalck", + place = "Toulouse", + subtitle = "Gentil informaticien", + img = "ethicit.jpg", + description = "Geek, passionné d'astronomie, aime la vie et les gens. Facilitateur informatique, auto-entrepreneur, touche-à-tout. Créateur d'EthicIT et devloprog." +) }} +{{ team_box( + title = "Jean-Jacques Brucker", + place = "Marseille", + subtitle = "01D 5CH001 H4CK3r", + img = "jjb.png", + description = "Ingénieur & libriste depuis 20 ans, a travaillé pour de grands groupes (Sagem, Phillips, Orange), mais pas que. À développé ou maintenu divers logiciels, systèmes et écosystèmes. Love bash, git, debian, OpenPGP." +) }} +{{ team_box( + title = "Mathilde Longuet", + place = "Toulouse", + subtitle = "La CyberPunk", + img = "mathilde.jpg", + description = "Ingénieure en informatique, passionnée de philosophie et politique, a travaillé dans la cybersécurité 3 ans, avant de se tourner vers le monde associatif." +) }} +{{ team_box( + title = "Francis Drubigny", + place = "Brignoles", + subtitle = "L'explorateur polymathe", + img = "francis-drubigny.jpg", + description = "Chef de projet web & digital, autodidacte, 18 ans d'expériences diverses dans le monde du web et de l'informatique. Passionné de technologies, je suis polymathe et m'intéresse à pas mal de sujets : l'informatique mais aussi le sport, la santé, l'économie, les sciences, la sociologie..." +) }} +{{ team_box( + title = "Ismaël Bouya", + place = "Grasse", + subtitle = "L’acrobate libriste", + img = "ismael.jpg", + description = "Ancien chercheur et ingénieur logiciel, circassien semi-professionnel, propose des services et formations basés sur des logiciels libres depuis plus de 10 ans." +) }} +{{ team_box( + title = "Vincent Dubois", + place = "Le Bar Sur Loup", + subtitle = "Ingénieur Multi-potentiels", + img = "vincent.jpg", + description = "Militant logiciels libres et Open Data, de nombreuses années d'animation d'ateliers logiciels libres et install-party, mais aussi de la modélisation numérique, de la cartographie, et bien d'autres choses!" +) }} +{{ team_box( + title = "Philippe Lhardy", + place = "Rennes", + subtitle = "Ingénieur système", + img = "philippe.png", + description = "Militant logiciels libres au sein de l'association linux azur depuis de nombreuses années. A travaillé 20 ans dans le développement de solutions d'administration de sécurité réseau." +) }} +{{ team_box( + title = "Mose", + place = "Taïwan", + subtitle = "devops libriste", + img = "mose.jpg", + description = "Mose est un technicien de l'internet montpelliérain expatrié à Taiwan. Militant du libre depuis 96. Bidouilleur multitâche. Voir son site web pour plus d'info." +) }} +{{ team_box( + title = "Fabrice alias 12b", + place = "Cévennes", + subtitle = "Ingénieur système", + img = "fabrice.jpg", + description = "Fabrice est ingénieur systèmes temps réels et photographe dans le sud de la France. Passionné par les logiciels libres depuis sa tendre enfance, il s'occupe au DistriLab de l'infrastructure d'hébergement des outils libres et de la veille techologique sur les technologies distribuées." +) }} +{{ team_box( + title = "Thibaut Parent", + place = "Pau", + subtitle = "Librate éthique", + img = "thibaut-parent.png", + description = "Parhit est un mot hindi qui signifie faire preuve de bienfaisance, d'altruisme et de bienveillance envers les autres. Papa épique de deux merveilles en IEF, libriste depuis mes 20 ans, freelance web éthique depuis 2011, à la recherche de poésie, d'amour et de liberté. Souverain aujourd'hui pour demain." +) }} +{{ team_box( + title = "Pierre Kuhn", + place = "Roanne", + subtitle = "Développeur web et php", + img = "pierretux.png", + description = "Developpeur php et SPIP depuis 10 ans en autodidacte. Touche à tout mais surtout au jardin et à SPIP !" +) }}
- -
- Qui sommes-nous -
- -## Dans les parcours de nos membres prestataires - -(hors du cadre de Librezo) - -{% carousel(id="carousel-prestaworkedfor") %} -{{ carousel_item(msg='Sopra Steria') }} -{{ carousel_item(msg='Météo France') }} -{{ carousel_item(msg='Sagem') }} -{{ carousel_item(msg='Car-Use.org') }} -{{ carousel_item(msg='Nova Discovery') }} -{{ carousel_item(msg='Conciliateurs') }} -{{ carousel_item(msg='Philips') }} -{{ carousel_item(msg='FretLink') }} -{{ carousel_item(msg='Lycée professionnel Jean-Pierre Timbaud') }} -{{ carousel_item(msg='Mamans qui déchirent') }} -{{ carousel_item(msg='5 minutes à tuer') }} -{{ carousel_item(msg='Crealouest') }} -{{ carousel_item(msg='La Poste') }} -{{ carousel_item(msg='Trainline') }} -{{ carousel_item(msg='EADS Astrium') }} -{{ carousel_item(msg='Clean Toilets') }} -{{ carousel_item(msg='Hologic') }} -{{ carousel_item(msg='La Ruche qui dit Oui') }} -{{ carousel_item(msg='CNES') }} -{{ carousel_item(msg='Airbus') }} -{{ carousel_item(msg='CCI de Bayonne') }} -{{ carousel_item(msg='Elsys Design') }} -{{ carousel_item(msg='Octoshow') }} -{{ carousel_item(msg='Art & Culture - La Chouette') }} -{{ carousel_item(msg='Orange') }} -{{ carousel_item(msg='Undula') }} -{{ carousel_item(msg='Open.global') }} -{{ carousel_item(msg='Ministère de la santé') }} -{{ carousel_item(msg='Ministère du travail') }} -{{ carousel_item(msg='Thales') }} -{{ carousel_item(msg='My Community Manager') }} -{{ carousel_item(msg='Sports Santé') }} -{{ carousel_item(msg='Tera') }} -{{ carousel_item(msg='Imago Process') }} -{{ carousel_item(msg='Air France') }} -{{ carousel_item(msg='associations.gouv.fr') }} -{{ carousel_item(msg='Axiom-Team') }} -{{ carousel_item(msg='La Vélodyssée') }} -{{ carousel_item(msg='Solucom') }} -{{ carousel_item(msg='EDF') }} -{{ carousel_item(msg='SII') }} -{% end %} diff --git a/content/rejoignez-nous.md b/content/rejoignez-nous.md deleted file mode 100644 index ca21c82..0000000 --- a/content/rejoignez-nous.md +++ /dev/null @@ -1,17 +0,0 @@ -+++ -title = "Rejoignez-nous" -+++ - -
- Rejoignez-nous -
- -Vous connaissez bien GNU/Linux, le réseau, vous savez installer du hardware, un OS, ouvrir des ports sur une box, coder en bash, débugger un logiciel, identifier des failles, les licences libres sont vos livres de chevet... Ou simplement, vous voulez vous investir dans la promotion du logiciel libre au sein d'une équipe de personnes très diverses mais partageant des valeurs communes ? Devenez membre et prestataire Librezo ! - -La condition ? Être en accord avec [la charte de Librezo](/charte) et s'engager à la respecter. - -Notre Collectif est à l'image de notre code : ouvert et transparent. Les nouveaux membres sont toujours les bienvenus : nouvelles compétences, nouvelles idées, nouveaux clients et nouvelles localités, pour pouvoir à terme agir sur l'ensemble du territoire. - -
- Terrassons l'infâme dragon des géants du web -
diff --git a/content/reprenez-le-controle.md b/content/reprenez-le-controle.md deleted file mode 100644 index fe05d08..0000000 --- a/content/reprenez-le-controle.md +++ /dev/null @@ -1,21 +0,0 @@ -+++ -title = "Reprenez le contrôle" -+++ - -
- Reprenez le contrôle -
- -Les géants du web imposent leur agenda à l'économie et à tous les aspects de notre vie via leurs services, qu'ils soient payants ou gratuits. Ils se construisent des monopoles en choisissant les usages possibles des ordinateurs, ils redéfinissent la démocratie, les libertés individuelles et collectives tout en marchandisant notre vie privée et en l'exploitant à des fins politiques de censure, délation et manipulation. - -Le code source de leurs logiciels n'étant pas accessible, il est pratiquement impossible de savoir exactement ce que fait notre ordinateur lorsqu'il exécute ces logiciels dits "privateurs"*. Nous devons donc avoir toute confiance dans l'entreprise qui nous l'a vendu. Les incessants soucis de confidentialité voire de sécurité observés chez la plupart des grands acteurs connus montre que cette confiance est peut-être mal placée. - -Il existe une solution simple à ce problème : le logiciel libre. - -Il peut être conçu et gouverné comme un commun, entouré d'une communauté active dans son développement, auditable par des développeurs du monde entier, et en général moins gourmand en ressources et en énergie. Ses conditions d'utilisation respectent vos libertés de l'utiliser gratuitement sans limitation et de l'installer chez vous ; de le modifier, d'en faire un audit de sécurité ou de l'étudier (en faisant éventuellement appel à un informaticien indépendant) ; de le partager. - -Couplée à l'auto-hébergement, cette solution permet de garder un contrôle total de votre matériel, de vos logiciels, de vos données et de votre confidentialité. - -
En savoir plus sur les logiciels libres ↱
- -* "Privateur" au sens où il vous prive de [vos libertés fondamentales](/logiciel-libre). \ No newline at end of file diff --git a/content/rgpd.md b/content/rgpd.md deleted file mode 100644 index 5847c39..0000000 --- a/content/rgpd.md +++ /dev/null @@ -1,17 +0,0 @@ -+++ -title = "RGPD" -+++ - -Règlement général sur la protection des données de Librezo : - -Par "utilisateur", nous entendons toute personne physique interagissant avec les services informatiques maintenus par Librezo, hébergés par Librezo, par ses clients ou par un tiers. - -1. Librezo recueillera uniquement les données nécessaires à l'utilisation et à la maintenance de ses services. -2. Les données à caractère personnel recueillies seront stockées sur des serveurs sécurisés et protégés par des mesures d'identification et d'authentification. -3. Les données à caractère personnel recueillies ne seront jamais partagées avec des tiers sans l'accord explicite de l'utilisateur. -4. Les données recueillies seront conservées pendant le temps nécessaire à l'accomplissement des objectifs de la mission tels que définis par le client. -5. Toutes les demandes des utilisateurs concernant l'accès, la rectification et l'effacement des données à caractère personnel seront traitées dans un délai raisonnable. -6. Librezo mettra en place des politiques et des procédures pour assurer le respect des droits des utilisateurs conformément au RGPD. -7. Librezo s'engage à informer les utilisateurs de toute violation de données à caractère personnel qui pourrait avoir lieu les concernant. -8. Les utilisateurs ont le droit de retirer leur consentement à tout moment. -9. Librezo s'engage à respecter la vie privée des utilisateurs et à protéger leurs données à caractère personnel. diff --git a/content/services/_index.md b/content/services/_index.md deleted file mode 100644 index 4b26619..0000000 --- a/content/services/_index.md +++ /dev/null @@ -1,223 +0,0 @@ -+++ -title = "Services et tarifs" -+++ - -
- Services et tarifs -
- -## Auto-hébergement - -Chaque service informatique en ligne (site web, boîte mail, document partagé, etc.) fonctionne en général sur un ordinateur relié à Internet en permanence, que l'on nomme un _serveur_. On dit que le serveur héberge le service. Beaucoup de ces serveurs sont gérés par très peu d'acteurs ([les géants du web](https://degooglisons-internet.org/fr/)) et regroupés par milliers dans des datacenters. - -L'auto-hébergement consiste à relocaliser ses services informatiques en installant un serveur chez soi. - -Auto-héberger ses sites, c'est un peu comme être propriétaire : ça a un coût, mais une fois le matériel et les logiciels installés, il n'y a plus de loyer et plus personne ne peut vous exproprier ! - -Librezo installe et configure votre serveur dans vos locaux, à partir de 1000€. - -Librezo ne vend pas de matériel mais vous conseille précisément en fonction du besoin. - -Nous encourageons vivement l'utilisation de micro-ordinateurs de type Raspberry Pi très peu énergivores (5-10W) pour un petit serveur. - -**Contactez-nous pour un devis détaillé.** - -

À la carte

- - - - - - - - - - - - - - - - - - - - - -
Assistance & MaintenanceAccompagnement sur les outilsAccompagnement administration système
à partir de 300€/an
(3 premiers mois offerts)
à partir de 40€/hà partir de 40€/h
Debian, NextCloud, DolibarrNextCloud, YunoHost, Jirafeau, BBB, Jitsisur Debian exclusivement
- - - - - - - - - - - - - - - - - - - - - -
Création intégrale de siteCréation d'un site de sauvegardesCréation d'un site miroir
à partir de 1000€
(variable selon le devis)
à partir de 500€à partir de 1500€
WordPress, Spip
- - - - - - - - - - - - - - - - - - - - - -
YunohostPartage de fichiers sécuriséServeur de visioconférence
à partir de 500€à partir de 300€à partir de 500€
Interface simplifiée d'administration du serveurJirafeau ou LufiBigBlueButton, Jitsi ou Galène
- - - - - - - - - - - - - - - - - - - - - - -
Installation GNU/LinuxInstallation d'outil libreCréation de logos
à partir de 70€de 300 à 1500€à partir de 500€
Votre OS libre sur votre ordinateur personnel
(variable selon la configuration souhaitée)
- - - - - - - - - - - - - - - - - -
Simulation d'attaque
à partir de 900€
Chercher des failles de sécurité pour pouvoir les corriger avant de se faire attaquer.
- -## Hébergement en ligne - -Les CHATONS sont un Collectif d'Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires. Si vous préférez ne pas gérer vous-même votre matériel et vos services, vous pourrez trouver votre bonheur chez le CHATON le plus proche de vous. - -
- CHATONS -
- -## Exemples d'outils libres auto-hébergeables - -
-
-{{ need_box(title="Publier des vidéos") }} -
-{{ service_box(href="https://joinpeertube.org", title="PeerTube", img="/img/solutions/peertube.svg") }} -
-
-
-{{ need_box(title="Visioconférence") }} -
-{{ service_box(href="https://bigbluebutton.org", title="BigBlueButton", img="/img/solutions/bigbluebutton.png") }} -{{ service_box(href="https://jitsi.org", title="Jitsi", img="/img/solutions/jitsi.png") }} -
-
-
-{{ need_box(title="Partage et édition de fichiers") }} -
-{{ service_box(href="https://nextcloud.org", title="NextCloud", img="/img/solutions/nextcloud.svg") }} -{{ service_box(href="https://framalibre.org/content/jirafeau", title="Jirafeau", img="/img/solutions/jirafeau.svg") }} -{{ service_box(href="https://linuxfr.org/news/un-nouveau-logiciel-libre-lufi", title="Lufi", img="/img/solutions/lufi.svg") }} -{{ service_box(href="https://cryptpad.org", title="CryptPad", img="/img/solutions/cryptpad.svg") }} -{{ service_box(href="https://hedgedoc.org", title="HedgeDoc", img="/img/solutions/hedgedoc.svg") }} -
-
-
-{{ need_box(title="Gestion & Comptabilité") }} -
-{{ service_box(href="https://www.dolibarr.org", title="Dolibarr", img="/img/solutions/dolibarr.png") }} -{{ service_box(href="https://dokos.io", title="Dokos", img="/img/solutions/dokos.svg") }} -
-
-
-{{ need_box(title="Création de site web") }} -
-{{ service_box(href="https://wordpress.org", title="WordPress", img="/img/solutions/wordpress.svg") }} -{{ service_box(href="https://www.spip.net", title="SPIP", img="/img/solutions/spip.png") }} -
-
-
-{{ need_box(title="Organisation d'événements") }} -
-{{ service_box(href="https://joinmobilizon.org", title="Mobilizon", img="/img/solutions/mobilizon.png") }} -
-
-
-{{ need_box(title="Newsletter & liste de mails") }} -
-{{ service_box(href="https://listmonk.app", title="ListMonk", img="/img/solutions/listmonk.svg") }} -{{ service_box(href="https://www.sympa.community", title="Sympa", img="/img/solutions/sympa.png") }} -
-
-
-{{ need_box(title="Prise de décisions") }} -
-{{ service_box(href="https://www.loomio.com", title="Loomio", img="/img/solutions/loomio.svg") }} -
-
-
-{{ need_box(title="Et beaucoup, beaucoup d'autres...") }} -
-
-
- -## Sécurité - -Personne, ni nous ni aucun grand groupe, ne peut vous garantir une sécurité totale. Ceux qui le font sont des menteurs. Mais nous pouvons vous faire bénéficier de nos années d'expérience dans le domaine, que ce soit en tant que hackers ou en tant que spécialistes de la cyber-sécurité. Une sécurité totale, non, mais maximale, oui : - -- Firewall Debian (iptables) -- Certificats SSL (let's encrypt) -- Configuration NGINX pour vos serveurs web -- Mot de passe utilisateur ou administrateur -- Chiffrement possible (optionnel) - -### Les sauvegardes - -En cas de perte du serveur (vol, incendie, accident), il est indispensable d'effectuer régulièrement des sauvegardes pour pouvoir retrouver rapidement ses données et son site. On peut effectuer ses sauvegardes sur HDD externe, sur clé USB, avoir un deuxième serveur de sauvegarde situé ailleurs, ou sur un serveur en ligne. - -Dans ce dernier cas, nous pouvons vous proposer d'automatiser vos sauvegardes en ligne directement dans la configuration et vous conseillons de passer par un de nos partenaire CHATONS. - -Il est également possible d'avoir un serveur miroir mis à jour en temps réel qui prenne le relais si votre serveur n°1 est défaillant, le service internet étant alors assuré même en cas de panne. diff --git a/content/services/site-miroir.md b/content/services/site-miroir.md deleted file mode 100644 index 216177b..0000000 --- a/content/services/site-miroir.md +++ /dev/null @@ -1,9 +0,0 @@ -+++ -title = "Création d'un site miroir" -+++ - -Nous pouvons créer sur un deuxième serveur (auto-hébergé ou en ligne) un site-miroir, clone du site original et maintenu à jour toutes les heures, capable de prendre le relai automatiquement en cas de panne du serveur principal. - -Néanmoins, nous sommes obligés pour cette solution d'utiliser l'infrastructure P2PLEGAL pour assurer une haute disponibilité 24h/24. - -Cette solution ne peut donc vous convenir que si vous nous faites confiance, et ne vous rend donc pas 100% autonomes. diff --git a/content/tarifs.md b/content/tarifs.md new file mode 100644 index 0000000..a4ea0c4 --- /dev/null +++ b/content/tarifs.md @@ -0,0 +1,100 @@ ++++ +title = "Services et tarifs" ++++ + +## Auto-hébergement + +Auto-héberger ses sites, c'est un peu comme être propriétaire : ça a un coût, mais une fois le matériel et les logiciels installés, il n'y a plus de loyer et plus personne ne peut vous exproprier ! + +LIBREZO vous installe à domicile et configure votre serveur. + +## Forfaits + +## À la carte + +## Hébergement en ligne + +Si vous préférez ne pas gérer vous-même votre matériel et vos services, c'est votre droit. Vous pourrez trouver votre bonheur chez notre partenaire [CHATONS](https://www.chatons.org/) le plus proche de vous : + +- [ETHICIT](https://www.ethicit.fr/) à Toulouse +- [IMMAE](https://immae.eu/) à Grasse +- [DISTRILAB](https://distrilab.fr/) à Montpellier +- [PAQUERETTE](https://paquerette.fr/) à Paris + +## Exemples d'outils possibles + +Solutions libres en auto-hébergement + +
+
+{{ need_box(title="Publier des vidéos") }} +
+{{ service_box(href="https://joinpeertube.org", title="PeerTube", img="/img/solutions/peertube.svg") }} +
+
+
+{{ need_box(title="Visioconférence") }} +
+{{ service_box(href="https://bigbluebutton.org", title="BigBlueButton", img="/img/solutions/bigbluebutton.png") }} +{{ service_box(href="https://jitsi.org", title="Jitsi", img="/img/solutions/jitsi.png") }} +
+
+
+{{ need_box(title="Partage de fichiers") }} +
+{{ service_box(href="https://framalibre.org/content/jirafeau", title="Jirafeau", img="/img/solutions/jirafeau.png") }} +{{ service_box(href="https://linuxfr.org/news/un-nouveau-logiciel-libre-lufi", title="Lufi", img="/img/solutions/lufi.svg") }} +
+
+
+ +Et beaucoup, beaucoup d'autres... + +## Forfaits + + + + + + + + + + + + + + + + + + + + + + + + + + +
Forfait basiqueForfait écoloForfait cosy
Votre site sur Raspberry Pi ou équivalent2 instances sur Raspberry Pi ou équivalent + serveur de sauvegarde4 instances sur mini-tour amd64 ou équivalent + serveur miroir haute disponibilité
à partir de 1000€*à partir de 2000€*à partir de 3000€*
Conso : 5WConso : 10WConso : ≥60W
+ +* Prix de l'installation selon devis, matériel non inclus. + +## Sécurité + +Personne, ni nous ni aucun grand groupe, ne peut vous garantir une sécurité totale. Ceux qui le font sont des menteurs. Mais nous pouvons vous faire bénéficier de nos années d'expérience dans le domaine, que ce soit en tant que hackers ou en tant que spécialistes de la cyber-sécurité. Une sécurité totale, non, mais maximale, oui : + +- Firewall Debian (iptables) +- Certificats SSL (let's encrypt) +- Configuration NGINX pour vos serveurs web +- Mot de passe utilisateur ou administrateur +- Chiffrement possible (optionnel) + +### Les sauvegardes + +En cas de perte du serveur (vol, incendie, accident), il est indispensable d'effectuer régulièrement des sauvegardes pour pouvoir retrouver rapidement ses données et son site. On peut effectuer ses sauvegardes sur HDD externe, sur clé USB, avoir un deuxième serveur de sauvegarde situé ailleurs, ou sur un serveur en ligne. + +Dans ce dernier cas, nous pouvons vous proposer d'automatiser vos sauvegardes en ligne directement dans la configuration et vous conseillons de passer par un de nos partenaire CHATONS. + +Il est également possible d'avoir un serveur miroir mis à jour en temps réel qui prenne le relais si votre serveur n°1 est défaillant, le service internet étant alors assuré même en cas de panne. diff --git a/sass/css/base.scss b/sass/css/base.scss index 283f194..8a640cc 100644 --- a/sass/css/base.scss +++ b/sass/css/base.scss @@ -1,16 +1,11 @@ @import "defs"; -@import "carousel"; @import "clients"; @import "footer"; @import "header"; -@import "partners"; -@import "prices"; @import "process"; @import "services"; -@import "square_box"; @import "team"; -@import "timeline"; #dev-warning { position: fixed; @@ -43,33 +38,13 @@ main.center { text-align: center; } -.nonarrower { - max-width: 100% !important; - margin-left: 0 !important; - text-align: center !important; -} - @media screen and (min-width: 900px) { - .narrower > p, .narrower > ul, .narrower > ol, .narrower > h1, .narrower > h2, .narrower > h3, .narrower > strong, .narrower > em, .nn { + .narrower > p, .narrower > ul, .narrower > h1, .narrower > h2, .narrower > h3, .nn { max-width: 900px; margin-left: calc(50% - 450px); } } -@media screen and (min-width: 1200px) { - .nn1200 { - max-width: 1200px; - margin-left: calc(50% - 600px); - } -} - -@media screen and (min-width: 1400px) { - .nn1400 { - max-width: 1400px; - margin-left: calc(50% - 700px); - } -} - a, a:visited { text-decoration: none; color: $blue; @@ -99,15 +74,6 @@ a:hover, a:focus { font-family: Neucha; display: flex; align-items: center; - justify-content: space-between; -} - -.cities p { - width: 33%; -} - -.cities .city { - margin: 0 0.5em; } .madein-wrapper { @@ -116,8 +82,6 @@ a:hover, a:focus { } .madein { - position: relative; - z-index: -1; width: 192px; transform: rotate(-30deg); } @@ -155,116 +119,3 @@ h3 { font-family: Neucha; font-weight: normal; } - -.title-bar { - font-family: Neucha; - font-size: 42px; - background: linear-gradient(0.25turn, $blue, $violet); - color: #fff; - margin-top: 16px; - margin-bottom: 16px; -} - -.title-bar2 { - font-family: Neucha; - font-size: 36px; - margin-top: 16px; - margin-bottom: 16px; -} - -.title-bar2::after { - content: ""; - display: block; - height: 1px; - background: linear-gradient(0.25turn, $blue, $violet); -} - -#map { - width: 100%; - height: 600px; - max-height: calc(100vh - 64px); -} - -/*@media (prefers-color-scheme: light) { - html { - background: radial-gradient(circle at 100%, rgba(2, 148, 217, 0.2) 20%, white); - } -}*/ - -@media (prefers-color-scheme: dark) { - html { - background-color: black; - color: white; - } - - #dev-warning { - color: black; - } - - .cities { - color: $grey2; - } -} - -@media screen and (min-width: 641px) { - .img-right { - float: right; - } -} -@media screen and (max-width: 640px) { - .img-right { - text-align: center; - } -} - -.img-right img { - max-width: 100vw; -} - -.bigbutton { - display: inline-block; - margin: 4px; - background: linear-gradient(-0.125turn, $blue, $violet); - border-radius: 4px; - font-family: Neucha; - font-size: 150%; - padding: 16px; -} - -a.bigbutton, a.bigbutton:hover, a.bigbutton:focus { - color: white; - text-decoration: none; -} - -a.bigbutton:hover, a.bigbutton:focus { - box-shadow: 4px 4px 0 $violet; -} - -.bigbutton2 { - display: inline-block; - margin: 4px; - border: 1px solid $blue; - border-radius: 4px; - font-family: Neucha; - font-size: 150%; - padding: 16px; -} - -a.bigbutton2, a.bigbutton2:hover, a.bigbutton2:focus { - color: black; - text-decoration: none; -} - -a.bigbutton2:hover, a.bigbutton2:focus { - box-shadow: 4px 4px 0 $violet; -} - -@media (prefers-color-scheme: dark) { - a.bigbutton2, a.bigbutton2:hover, a.bigbutton2:focus { - color: white; - } -} - -.emph { - font-size: 120%; -} diff --git a/sass/css/carousel.scss b/sass/css/carousel.scss deleted file mode 100644 index 7ab6723..0000000 --- a/sass/css/carousel.scss +++ /dev/null @@ -1,35 +0,0 @@ -.carousel { - width: 100%; - display: flex; - gap: 16px; - align-content: center; - align-items: center; - justify-content: space-evenly; -} - -// Zola generates noisy empty paragraphs -.carousel p { - display: none; -} - -.carousel-item { - display: inline-block; -} - -.carousel-hidden { - display: none; -} - -// Carousel: prestas worked for... - -#carousel-prestaworkedfor { - min-height: 128px; - background-color: white; - padding-top: 7px; -} - -.prestaworkedfor { - max-width: 128px; - max-height: 128px; - margin: auto; -} diff --git a/sass/css/clients.scss b/sass/css/clients.scss index 0478fe5..24fc5ae 100644 --- a/sass/css/clients.scss +++ b/sass/css/clients.scss @@ -54,14 +54,3 @@ margin: 0 16px 32px 16px; } } - -.client_box-sign { - color: $grey1; - float: right; -} - -@media (prefers-color-scheme: dark) { - .client_box-sign { - color: $grey2; - } -} diff --git a/sass/css/defs.scss b/sass/css/defs.scss index 1b62b51..e44659f 100644 --- a/sass/css/defs.scss +++ b/sass/css/defs.scss @@ -1,11 +1,6 @@ $blue: #0294d9; $violet: #ac44ff; $grey1: #444; -$grey2: #bbb; - -$grad1_3tr: rgba(2, 148, 217, 0.2); -$grad2_3tr: rgba(87, 108, 236, 0.2); -$grad3_3tr: rgba(172, 68, 255, 0.2); @font-face { font-family: LunaSans; diff --git a/sass/css/footer.scss b/sass/css/footer.scss index eeeffc7..0b6db91 100644 --- a/sass/css/footer.scss +++ b/sass/css/footer.scss @@ -12,23 +12,10 @@ footer { max-width: 1100px; padding: 16px 4px; margin: auto; - gap: 20px; - justify-content: center; - align-items: center; - } .footer-pane { flex: 1; - max-width: 800px; -} - -@media screen and (max-width: 900px) { - .footer-wrapper { - flex-direction: column; - justify-content: center; - align-items: center; - } } footer a, footer a:visited { diff --git a/sass/css/header.scss b/sass/css/header.scss index d09c894..62ce088 100644 --- a/sass/css/header.scss +++ b/sass/css/header.scss @@ -1,13 +1,10 @@ @import "defs"; header { - position: sticky; - z-index: 10; - top: 0; display: flex; justify-content: space-between; - max-width: 1100px; height: 48px; + max-width: 1100px; margin: 0 auto 16px auto; padding: 0 4px; font-size: 24px; @@ -21,12 +18,12 @@ header { filter: drop-shadow(1px 2px 1px $violet); } -#header-menu > ul { +#header-menu ul { list-style-type: none; margin: 9px 0 0 0; } -#header-menu > ul li { +#header-menu li { display: inline-block; margin: 0 8px; } @@ -40,62 +37,3 @@ header { text-shadow: 1px 2px 1px $violet; text-decoration: none; } - -@media (prefers-color-scheme: light) { - header, .header-menu-phone { - background-color: white; - } -} - -@media (prefers-color-scheme: dark) { - #header-menu a { - color: white; - } - - header, .header-menu-phone { - background-color: black; - } -} - -@media (min-width: 960px) { - .phone-only { - display: none; - } -} - -@media (max-width: 959px) { - .phone-hidden { - display: none; - } -} - -.header-menu-phone { - position: fixed; - z-index: 5; - top: 48px; - left: 0; - padding: 16px; - max-height: calc(100vh - 48px); - overflow-y: auto; - margin-top: 0; - box-sizing: border-box; - border-right: 2px solid $violet; - border-bottom: 2px solid $violet; - border-bottom-right-radius: 6px; - list-style: none; -} - -.hamburger-menu { - font-size: 150%; - margin: 0.25em; - font-family: LunaSans; -} - -.hamburger-menu:hover, .hamburger-menu:focus { - opacity: 100%; -} - -.hamburger-menu > summary { - list-style: none; - cursor: pointer; -} diff --git a/sass/css/partners.scss b/sass/css/partners.scss deleted file mode 100644 index ff9c201..0000000 --- a/sass/css/partners.scss +++ /dev/null @@ -1,10 +0,0 @@ -.partners { - text-align: center; - background-color: white; -} - -.partner_box-img { - margin: 16px; - max-width: 256px; - max-height: 256px; -} \ No newline at end of file diff --git a/sass/css/prices.scss b/sass/css/prices.scss deleted file mode 100644 index 50f10aa..0000000 --- a/sass/css/prices.scss +++ /dev/null @@ -1,34 +0,0 @@ -@import "defs"; - -// TABLEAU DES PRIX - -.prices { - width: 100%; - table-layout: fixed; -} - -.prices th { - font-family: Neucha; - font-size: 24px; - background: linear-gradient(0.125turn, $blue, $violet); - color: #fff; - padding: 4px; -} - -.prices td { - padding: 4px; - text-align: center; - font-size: 20px; -} - -.prices tr td:first-of-type { - background-color: $grad1_3tr; -} - -.prices tr td:first-of-type + td { - background-color: $grad2_3tr; -} - -.prices tr td:first-of-type + td + td { - background-color: $grad3_3tr; -} diff --git a/sass/css/process.scss b/sass/css/process.scss index 625d4e9..b808ae2 100644 --- a/sass/css/process.scss +++ b/sass/css/process.scss @@ -1,6 +1,16 @@ @import "defs"; +.process-title { + font-family: Neucha; + font-size: 42px; + background: linear-gradient(0.25turn, $blue, $violet); + color: #fff; + margin-top: 16px; + margin-bottom: 16px; +} + .process_boxes { + flex: 62%; text-align: center; font-family: LunaSans; } @@ -10,7 +20,7 @@ width: 256px; padding-top: 4px; vertical-align: top; - margin: 8px 20px; + margin: 8px 16px; } .process_box-number { @@ -21,7 +31,6 @@ background: linear-gradient(-0.125turn, $blue, $violet); color: #fff; border-radius: 32px; - opacity: 0.65; } .process_box-title { diff --git a/sass/css/services.scss b/sass/css/services.scss index 114151d..9c8b70a 100644 --- a/sass/css/services.scss +++ b/sass/css/services.scss @@ -68,9 +68,3 @@ padding-bottom: 14px; font-size: 24px; } - -@media (prefers-color-scheme: dark) { - .service_box-link, .service_box-link:visited { - color: white; - } -} diff --git a/sass/css/square_box.scss b/sass/css/square_box.scss deleted file mode 100644 index 23eaa86..0000000 --- a/sass/css/square_box.scss +++ /dev/null @@ -1,84 +0,0 @@ -@import "defs"; - -.square_boxes { - display: flex; - flex: 62%; - text-align: center; - font-family: LunaSans; - gap: 45px; - align-items: center; - justify-content: center; - flex-wrap: wrap; -} - -.square_box { - width: 200px; - min-height: 200px; - background: linear-gradient(-0.125turn, $blue, $violet); -} - -.square_box-inner-bottom { - margin: 1px 1px 0 1px; - border-bottom: 1px solid white; - min-height: 198px; - background-color: white; -} - -.square_box-inner-top { - margin: 0 1px 1px 1px; - min-height: 198px; - border-top: 1px solid white; - background-color: white; -} - -.square_box-inner-right { - margin: 1px 0 1px 1px; - min-width: 198px; - min-height: 198px; - border-right: 1px solid white; - background-color: white; -} - -.square_box-inner-left { - margin: 1px 1px 1px 0; - min-width: 198px; - min-height: 198px; - border-left: 1px solid white; - background-color: white; -} - -@media (prefers-color-scheme: dark) { - .square_box-inner { - color: white; - background-color: black; - } - - .square_box-inner-bottom { - border-bottom: 1px solid black; - } - - .square_box-inner-top { - border-top: 1px solid black; - } - - .square_box-inner-right { - border-right: 1px solid black; - } - - .square_box-inner-left { - border-left: 1px solid black; - } -} - -.square_box-title { - display: block; - width: 100%; - padding: 16px 6px 6px 6px; - box-sizing: border-box; - font-family: Neucha; - font-size: 175%; -} - -.square_box-text { - padding: 6px; -} diff --git a/sass/css/timeline.scss b/sass/css/timeline.scss deleted file mode 100644 index f39cb4e..0000000 --- a/sass/css/timeline.scss +++ /dev/null @@ -1,22 +0,0 @@ -@import "defs"; - -.timeline-item { - width: 50%; - box-sizing: border-box; - margin: 0; - padding: 16px; -} - -.timeline-left { - position: relative; - border: 1px solid $blue; - border-radius: 16px 0 0 16px; -} - -.timeline-right { - position: relative; - left: 50%; - margin-left: -1px; - border: 1px solid $blue; - border-radius: 0 16px 16px 0; -} diff --git a/static/.htaccess b/static/.htaccess deleted file mode 100644 index 6d3471c..0000000 --- a/static/.htaccess +++ /dev/null @@ -1 +0,0 @@ -ErrorDocument 404 /404/ diff --git a/static/img/clients/Jarditerre.png b/static/img/clients/Jarditerre.png new file mode 100644 index 0000000..e0325b1 Binary files /dev/null and b/static/img/clients/Jarditerre.png differ diff --git a/static/img/clients/ge-data.png b/static/img/clients/ge-data.png deleted file mode 100644 index 40edb38..0000000 Binary files a/static/img/clients/ge-data.png and /dev/null differ diff --git a/static/img/clients/jarditerre.jpg b/static/img/clients/jarditerre.jpg deleted file mode 100644 index f011752..0000000 Binary files a/static/img/clients/jarditerre.jpg and /dev/null differ diff --git a/static/img/drawings/404.webp b/static/img/drawings/404.webp deleted file mode 100644 index 1c25c70..0000000 Binary files a/static/img/drawings/404.webp and /dev/null differ diff --git a/static/img/drawings/accueil.webp b/static/img/drawings/accueil.webp deleted file mode 100644 index f436b63..0000000 Binary files a/static/img/drawings/accueil.webp and /dev/null differ diff --git a/static/img/drawings/charte.webp b/static/img/drawings/charte.webp deleted file mode 100644 index ab2d878..0000000 Binary files a/static/img/drawings/charte.webp and /dev/null differ diff --git a/static/img/drawings/contact.webp b/static/img/drawings/contact.webp deleted file mode 100644 index f495277..0000000 Binary files a/static/img/drawings/contact.webp and /dev/null differ diff --git a/static/img/drawings/dragon.webp b/static/img/drawings/dragon.webp deleted file mode 100644 index d196566..0000000 Binary files a/static/img/drawings/dragon.webp and /dev/null differ diff --git a/static/img/drawings/fonctionnement.webp b/static/img/drawings/fonctionnement.webp deleted file mode 100644 index a7add4b..0000000 Binary files a/static/img/drawings/fonctionnement.webp and /dev/null differ diff --git a/static/img/drawings/hydre.webp b/static/img/drawings/hydre.webp deleted file mode 100644 index 93da468..0000000 Binary files a/static/img/drawings/hydre.webp and /dev/null differ diff --git a/static/img/drawings/masque.webp b/static/img/drawings/masque.webp deleted file mode 100644 index 38a5f10..0000000 Binary files a/static/img/drawings/masque.webp and /dev/null differ diff --git a/static/img/drawings/qui.webp b/static/img/drawings/qui.webp deleted file mode 100644 index 5173d9c..0000000 Binary files a/static/img/drawings/qui.webp and /dev/null differ diff --git a/static/img/drawings/rejoignez-nous.webp b/static/img/drawings/rejoignez-nous.webp deleted file mode 100644 index 6c42c85..0000000 Binary files a/static/img/drawings/rejoignez-nous.webp and /dev/null differ diff --git a/static/img/drawings/tarifs.webp b/static/img/drawings/tarifs.webp deleted file mode 100644 index 0362275..0000000 Binary files a/static/img/drawings/tarifs.webp and /dev/null differ diff --git a/static/img/drawings/usine.webp b/static/img/drawings/usine.webp deleted file mode 100644 index d0453e0..0000000 Binary files a/static/img/drawings/usine.webp and /dev/null differ diff --git a/static/img/francenum-activateur.jpg b/static/img/francenum-activateur.jpg new file mode 100644 index 0000000..69219f6 Binary files /dev/null and b/static/img/francenum-activateur.jpg differ diff --git a/static/img/librezo-little-black.png b/static/img/librezo-little-black.png new file mode 100644 index 0000000..2c63418 Binary files /dev/null and b/static/img/librezo-little-black.png differ diff --git a/static/img/logo-color-dark.png b/static/img/logo-color-dark.png deleted file mode 100644 index 47afee9..0000000 Binary files a/static/img/logo-color-dark.png and /dev/null differ diff --git a/static/img/logo-stencil-black.svg b/static/img/logo-stencil-black.svg deleted file mode 100644 index 4b08d5b..0000000 --- a/static/img/logo-stencil-black.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/static/img/logo-stencil-white.svg b/static/img/logo-stencil-white.svg deleted file mode 100644 index 36ce6be..0000000 --- a/static/img/logo-stencil-white.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/static/img/partners/chatons.png b/static/img/partners/chatons.png deleted file mode 100644 index 87c4ad5..0000000 Binary files a/static/img/partners/chatons.png and /dev/null differ diff --git a/static/img/partners/distrilab.png b/static/img/partners/distrilab.png deleted file mode 100644 index 994dfb4..0000000 Binary files a/static/img/partners/distrilab.png and /dev/null differ diff --git a/static/img/partners/electrocycle.png b/static/img/partners/electrocycle.png deleted file mode 100644 index c42b339..0000000 Binary files a/static/img/partners/electrocycle.png and /dev/null differ diff --git a/static/img/partners/foopgp-mini.png b/static/img/partners/foopgp-mini.png index e21dcbd..2c9fe69 100644 Binary files a/static/img/partners/foopgp-mini.png and b/static/img/partners/foopgp-mini.png differ diff --git a/static/img/partners/oasis21-white.png b/static/img/partners/oasis21-white.png deleted file mode 100644 index 295c236..0000000 Binary files a/static/img/partners/oasis21-white.png and /dev/null differ diff --git a/static/img/partners/paquerette.png b/static/img/partners/paquerette.png deleted file mode 100644 index e08d359..0000000 Binary files a/static/img/partners/paquerette.png and /dev/null differ diff --git a/static/img/partners/wikilibriste.jpg b/static/img/partners/wikilibriste.jpg deleted file mode 100644 index 129ca24..0000000 Binary files a/static/img/partners/wikilibriste.jpg and /dev/null differ diff --git a/static/img/prestasworkedfor/5minutesatuer.png b/static/img/prestasworkedfor/5minutesatuer.png deleted file mode 100644 index 3ba0e73..0000000 Binary files a/static/img/prestasworkedfor/5minutesatuer.png and /dev/null differ diff --git a/static/img/prestasworkedfor/airbus.svg b/static/img/prestasworkedfor/airbus.svg deleted file mode 100644 index 25d0d7f..0000000 --- a/static/img/prestasworkedfor/airbus.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/static/img/prestasworkedfor/airfrance.png b/static/img/prestasworkedfor/airfrance.png deleted file mode 100644 index c85dbea..0000000 Binary files a/static/img/prestasworkedfor/airfrance.png and /dev/null differ diff --git a/static/img/prestasworkedfor/artculture-lachouette.jpg b/static/img/prestasworkedfor/artculture-lachouette.jpg deleted file mode 100644 index 8b3c55f..0000000 Binary files a/static/img/prestasworkedfor/artculture-lachouette.jpg and /dev/null differ diff --git a/static/img/prestasworkedfor/assogouvfr.png b/static/img/prestasworkedfor/assogouvfr.png deleted file mode 100644 index 45bbefe..0000000 Binary files a/static/img/prestasworkedfor/assogouvfr.png and /dev/null differ diff --git a/static/img/prestasworkedfor/astrium.jpg b/static/img/prestasworkedfor/astrium.jpg deleted file mode 100644 index 9636b1b..0000000 Binary files a/static/img/prestasworkedfor/astrium.jpg and /dev/null differ diff --git a/static/img/prestasworkedfor/axiom.svg b/static/img/prestasworkedfor/axiom.svg deleted file mode 100644 index f2b50f4..0000000 --- a/static/img/prestasworkedfor/axiom.svg +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - ( - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/prestasworkedfor/car-use.png b/static/img/prestasworkedfor/car-use.png deleted file mode 100644 index 4135b4c..0000000 Binary files a/static/img/prestasworkedfor/car-use.png and /dev/null differ diff --git a/static/img/prestasworkedfor/cci-bayonne.png b/static/img/prestasworkedfor/cci-bayonne.png deleted file mode 100644 index 61fbc7d..0000000 Binary files a/static/img/prestasworkedfor/cci-bayonne.png and /dev/null differ diff --git a/static/img/prestasworkedfor/cleantoilets.png b/static/img/prestasworkedfor/cleantoilets.png deleted file mode 100644 index 6133125..0000000 Binary files a/static/img/prestasworkedfor/cleantoilets.png and /dev/null differ diff --git a/static/img/prestasworkedfor/cnes.png b/static/img/prestasworkedfor/cnes.png deleted file mode 100644 index e950b2c..0000000 Binary files a/static/img/prestasworkedfor/cnes.png and /dev/null differ diff --git a/static/img/prestasworkedfor/conciliateurs.png b/static/img/prestasworkedfor/conciliateurs.png deleted file mode 100644 index 5b9d894..0000000 Binary files a/static/img/prestasworkedfor/conciliateurs.png and /dev/null differ diff --git a/static/img/prestasworkedfor/crealouest.png b/static/img/prestasworkedfor/crealouest.png deleted file mode 100644 index e63a884..0000000 Binary files a/static/img/prestasworkedfor/crealouest.png and /dev/null differ diff --git a/static/img/prestasworkedfor/edf.svg b/static/img/prestasworkedfor/edf.svg deleted file mode 100644 index 547eb21..0000000 --- a/static/img/prestasworkedfor/edf.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/static/img/prestasworkedfor/elsysdesign.svg b/static/img/prestasworkedfor/elsysdesign.svg deleted file mode 100644 index da0c9f9..0000000 --- a/static/img/prestasworkedfor/elsysdesign.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/static/img/prestasworkedfor/fretlink.png b/static/img/prestasworkedfor/fretlink.png deleted file mode 100644 index d13cf8f..0000000 Binary files a/static/img/prestasworkedfor/fretlink.png and /dev/null differ diff --git a/static/img/prestasworkedfor/hologic.webp b/static/img/prestasworkedfor/hologic.webp deleted file mode 100644 index e75bda1..0000000 Binary files a/static/img/prestasworkedfor/hologic.webp and /dev/null differ diff --git a/static/img/prestasworkedfor/imagoprocess.png b/static/img/prestasworkedfor/imagoprocess.png deleted file mode 100644 index 5c4d68a..0000000 Binary files a/static/img/prestasworkedfor/imagoprocess.png and /dev/null differ diff --git a/static/img/prestasworkedfor/laposte.svg b/static/img/prestasworkedfor/laposte.svg deleted file mode 100644 index a2268dc..0000000 --- a/static/img/prestasworkedfor/laposte.svg +++ /dev/null @@ -1,36 +0,0 @@ - - 20221102_lp_logotype_bleu_vertical_rvb-63652c442d623-ai - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/static/img/prestasworkedfor/laruchequiditoui.svg b/static/img/prestasworkedfor/laruchequiditoui.svg deleted file mode 100644 index 3fcec55..0000000 --- a/static/img/prestasworkedfor/laruchequiditoui.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/prestasworkedfor/lyceejptimbaud.png b/static/img/prestasworkedfor/lyceejptimbaud.png deleted file mode 100644 index 8ffab0a..0000000 Binary files a/static/img/prestasworkedfor/lyceejptimbaud.png and /dev/null differ diff --git a/static/img/prestasworkedfor/mamansquidechirent.png b/static/img/prestasworkedfor/mamansquidechirent.png deleted file mode 100644 index 752a9e6..0000000 Binary files a/static/img/prestasworkedfor/mamansquidechirent.png and /dev/null differ diff --git a/static/img/prestasworkedfor/meteofrance.png b/static/img/prestasworkedfor/meteofrance.png deleted file mode 100644 index cbf74af..0000000 Binary files a/static/img/prestasworkedfor/meteofrance.png and /dev/null differ diff --git a/static/img/prestasworkedfor/ministeresante.png b/static/img/prestasworkedfor/ministeresante.png deleted file mode 100644 index 77ec723..0000000 Binary files a/static/img/prestasworkedfor/ministeresante.png and /dev/null differ diff --git a/static/img/prestasworkedfor/ministeretravail.png b/static/img/prestasworkedfor/ministeretravail.png deleted file mode 100644 index f697e3c..0000000 Binary files a/static/img/prestasworkedfor/ministeretravail.png and /dev/null differ diff --git a/static/img/prestasworkedfor/mycommunitymanager.png b/static/img/prestasworkedfor/mycommunitymanager.png deleted file mode 100644 index 64464d9..0000000 Binary files a/static/img/prestasworkedfor/mycommunitymanager.png and /dev/null differ diff --git a/static/img/prestasworkedfor/novadiscovery.png b/static/img/prestasworkedfor/novadiscovery.png deleted file mode 100644 index 8d6ff36..0000000 Binary files a/static/img/prestasworkedfor/novadiscovery.png and /dev/null differ diff --git a/static/img/prestasworkedfor/octoshow.png b/static/img/prestasworkedfor/octoshow.png deleted file mode 100644 index b2b51d9..0000000 Binary files a/static/img/prestasworkedfor/octoshow.png and /dev/null differ diff --git a/static/img/prestasworkedfor/open.global.png b/static/img/prestasworkedfor/open.global.png deleted file mode 100644 index 1fc07ec..0000000 Binary files a/static/img/prestasworkedfor/open.global.png and /dev/null differ diff --git a/static/img/prestasworkedfor/orange.svg b/static/img/prestasworkedfor/orange.svg deleted file mode 100644 index 2f7a667..0000000 --- a/static/img/prestasworkedfor/orange.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/static/img/prestasworkedfor/philips.svg b/static/img/prestasworkedfor/philips.svg deleted file mode 100644 index a755a0f..0000000 --- a/static/img/prestasworkedfor/philips.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/static/img/prestasworkedfor/sagem.png b/static/img/prestasworkedfor/sagem.png deleted file mode 100644 index 0d59358..0000000 Binary files a/static/img/prestasworkedfor/sagem.png and /dev/null differ diff --git a/static/img/prestasworkedfor/sii.png b/static/img/prestasworkedfor/sii.png deleted file mode 100644 index e7af67f..0000000 Binary files a/static/img/prestasworkedfor/sii.png and /dev/null differ diff --git a/static/img/prestasworkedfor/solucom.webp b/static/img/prestasworkedfor/solucom.webp deleted file mode 100644 index 843dbd8..0000000 Binary files a/static/img/prestasworkedfor/solucom.webp and /dev/null differ diff --git a/static/img/prestasworkedfor/soprasteria.png b/static/img/prestasworkedfor/soprasteria.png deleted file mode 100644 index c18b6f0..0000000 Binary files a/static/img/prestasworkedfor/soprasteria.png and /dev/null differ diff --git a/static/img/prestasworkedfor/sportssante.png b/static/img/prestasworkedfor/sportssante.png deleted file mode 100644 index 5d7d21a..0000000 Binary files a/static/img/prestasworkedfor/sportssante.png and /dev/null differ diff --git a/static/img/prestasworkedfor/tera.png b/static/img/prestasworkedfor/tera.png deleted file mode 100644 index 2e40ecc..0000000 Binary files a/static/img/prestasworkedfor/tera.png and /dev/null differ diff --git a/static/img/prestasworkedfor/thales.svg b/static/img/prestasworkedfor/thales.svg deleted file mode 100644 index 86e9a80..0000000 --- a/static/img/prestasworkedfor/thales.svg +++ /dev/null @@ -1,13 +0,0 @@ - - -Thales Group logo - - - - - - - - - \ No newline at end of file diff --git a/static/img/prestasworkedfor/trainline.svg b/static/img/prestasworkedfor/trainline.svg deleted file mode 100644 index 4dc03ed..0000000 --- a/static/img/prestasworkedfor/trainline.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/img/prestasworkedfor/undula.png b/static/img/prestasworkedfor/undula.png deleted file mode 100644 index d3bcf3e..0000000 Binary files a/static/img/prestasworkedfor/undula.png and /dev/null differ diff --git a/static/img/prestasworkedfor/velodyssee.svg b/static/img/prestasworkedfor/velodyssee.svg deleted file mode 100644 index c8d6011..0000000 --- a/static/img/prestasworkedfor/velodyssee.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/solutions/cryptpad.svg b/static/img/solutions/cryptpad.svg deleted file mode 100644 index 9eaa7d6..0000000 --- a/static/img/solutions/cryptpad.svg +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/solutions/dokos.svg b/static/img/solutions/dokos.svg deleted file mode 100644 index a050bcd..0000000 --- a/static/img/solutions/dokos.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/static/img/solutions/dolibarr.png b/static/img/solutions/dolibarr.png deleted file mode 100644 index 417387d..0000000 Binary files a/static/img/solutions/dolibarr.png and /dev/null differ diff --git a/static/img/solutions/hedgedoc.svg b/static/img/solutions/hedgedoc.svg deleted file mode 100644 index 703079b..0000000 --- a/static/img/solutions/hedgedoc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/solutions/jirafeau.png b/static/img/solutions/jirafeau.png new file mode 100644 index 0000000..7e2efc3 Binary files /dev/null and b/static/img/solutions/jirafeau.png differ diff --git a/static/img/solutions/jirafeau.svg b/static/img/solutions/jirafeau.svg deleted file mode 100644 index 1076fb2..0000000 --- a/static/img/solutions/jirafeau.svg +++ /dev/null @@ -1,159 +0,0 @@ - - -]> - - - - - - - - - - - - - diff --git a/static/img/solutions/listmonk.svg b/static/img/solutions/listmonk.svg deleted file mode 100644 index 858dad1..0000000 --- a/static/img/solutions/listmonk.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - diff --git a/static/img/solutions/loomio.svg b/static/img/solutions/loomio.svg deleted file mode 100644 index a85b08d..0000000 --- a/static/img/solutions/loomio.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/solutions/mobilizon.png b/static/img/solutions/mobilizon.png deleted file mode 100644 index 2b78f98..0000000 Binary files a/static/img/solutions/mobilizon.png and /dev/null differ diff --git a/static/img/solutions/nextcloud.svg b/static/img/solutions/nextcloud.svg deleted file mode 100644 index 7d4003d..0000000 --- a/static/img/solutions/nextcloud.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/solutions/spip.png b/static/img/solutions/spip.png deleted file mode 100644 index e132f4f..0000000 Binary files a/static/img/solutions/spip.png and /dev/null differ diff --git a/static/img/solutions/sympa.png b/static/img/solutions/sympa.png deleted file mode 100644 index 1a95d31..0000000 Binary files a/static/img/solutions/sympa.png and /dev/null differ diff --git a/static/img/solutions/wordpress.svg b/static/img/solutions/wordpress.svg deleted file mode 100644 index 7182535..0000000 --- a/static/img/solutions/wordpress.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/solutions/yunohost.png b/static/img/solutions/yunohost.png deleted file mode 100644 index 00f8aac..0000000 Binary files a/static/img/solutions/yunohost.png and /dev/null differ diff --git a/static/img/team/djool.png b/static/img/team/djool.png deleted file mode 100644 index fe037c4..0000000 Binary files a/static/img/team/djool.png and /dev/null differ diff --git a/static/img/team/francis-drubigny.jpg b/static/img/team/francis-drubigny.jpg index 5d64ac2..7e5ed05 100644 Binary files a/static/img/team/francis-drubigny.jpg and b/static/img/team/francis-drubigny.jpg differ diff --git a/static/img/team/jjb.jpg b/static/img/team/jjb.jpg deleted file mode 100644 index ab212bc..0000000 Binary files a/static/img/team/jjb.jpg and /dev/null differ diff --git a/static/img/team/mathilde.jpg b/static/img/team/mathilde.jpg index 2f7568c..9a608e2 100644 Binary files a/static/img/team/mathilde.jpg and b/static/img/team/mathilde.jpg differ diff --git a/static/img/team/paidge.jpg b/static/img/team/paidge.jpg deleted file mode 100644 index 112bec5..0000000 Binary files a/static/img/team/paidge.jpg and /dev/null differ diff --git a/static/img/team/pierretux.jpg b/static/img/team/pierretux.jpg deleted file mode 100644 index 4273075..0000000 Binary files a/static/img/team/pierretux.jpg and /dev/null differ diff --git a/static/img/team/pierretux.png b/static/img/team/pierretux.png new file mode 100644 index 0000000..22cffaf Binary files /dev/null and b/static/img/team/pierretux.png differ diff --git a/static/img/team/sylvestre.png b/static/img/team/sylvestre.png deleted file mode 100644 index 0e1b09e..0000000 Binary files a/static/img/team/sylvestre.png and /dev/null differ diff --git a/static/js/carousel.js b/static/js/carousel.js deleted file mode 100644 index fb0a2b4..0000000 --- a/static/js/carousel.js +++ /dev/null @@ -1,51 +0,0 @@ -var carousels = []; - -class Carousel { - constructor(obj) { - this.obj = obj; - this.current = 0; - this.items = []; - this.items_widths = []; - for(var i = 0; i < this.obj.children.length; i ++) { - var item = this.obj.children[i]; - if(item.classList.contains("carousel-item")) { - this.items.push(item); - this.items_widths.push(Math.min(item.offsetWidth, 128)); - } - } - } - step() { - this.current = (this.current+1) % this.items.length; - var max_width = this.obj.offsetWidth; - var width = 16*this.items.length; - for(var i = 0; i < this.items.length; i ++) { - var j = (i + this.current) % this.items.length; - var item = this.items[j]; - if(!item.classList.contains("carousel-hidden")) { - // Update width - this.items_widths[j] = Math.min(item.offsetWidth, 128); - } - width += this.items_widths[j]; - if(width > max_width) { - item.classList.add("carousel-hidden"); - } else { - this.obj.appendChild(item); - item.classList.remove("carousel-hidden"); - } - } - } -} - -function step_carousels() { - for(carousel of carousels) { - carousel.step(); - } -} - -window.onload = function() { - for(obj of document.getElementsByClassName("carousel")) { - carousels.push(new Carousel(obj)) - } - step_carousels(); - setInterval(step_carousels, 2000); -}; diff --git a/static/js/square_box.js b/static/js/square_box.js deleted file mode 100644 index 4c2119f..0000000 --- a/static/js/square_box.js +++ /dev/null @@ -1,17 +0,0 @@ -var square_box_classes = ["square_box-inner-left", "square_box-inner-right", "square_box-inner-top", "square_box-inner-bottom"]; - -var randomize_square_box = function (elem) { - var r = Math.floor(Math.random()*4); - for(i in square_box_classes) { - if(i != r) - elem.classList.remove(square_box_classes[i]); - } - elem.classList.add(square_box_classes[r]); -} - -window.onload = function() { - for(elem of document.getElementsByClassName("square_box-inner")) { - var elem = elem; - randomize_square_box(elem); - } -}; diff --git a/static/vendor/leaflet/images/layers-2x.png b/static/vendor/leaflet/images/layers-2x.png deleted file mode 100644 index 200c333..0000000 Binary files a/static/vendor/leaflet/images/layers-2x.png and /dev/null differ diff --git a/static/vendor/leaflet/images/layers.png b/static/vendor/leaflet/images/layers.png deleted file mode 100644 index 1a72e57..0000000 Binary files a/static/vendor/leaflet/images/layers.png and /dev/null differ diff --git a/static/vendor/leaflet/images/marker-icon-2x.png b/static/vendor/leaflet/images/marker-icon-2x.png deleted file mode 100644 index 88f9e50..0000000 Binary files a/static/vendor/leaflet/images/marker-icon-2x.png and /dev/null differ diff --git a/static/vendor/leaflet/images/marker-icon.png b/static/vendor/leaflet/images/marker-icon.png deleted file mode 100644 index 950edf2..0000000 Binary files a/static/vendor/leaflet/images/marker-icon.png and /dev/null differ diff --git a/static/vendor/leaflet/images/marker-shadow.png b/static/vendor/leaflet/images/marker-shadow.png deleted file mode 100644 index 9fd2979..0000000 Binary files a/static/vendor/leaflet/images/marker-shadow.png and /dev/null differ diff --git a/static/vendor/leaflet/leaflet-src.esm.js b/static/vendor/leaflet/leaflet-src.esm.js deleted file mode 100644 index b166b96..0000000 --- a/static/vendor/leaflet/leaflet-src.esm.js +++ /dev/null @@ -1,14356 +0,0 @@ -/* @preserve - * Leaflet 1.9.3, a JS library for interactive maps. https://leafletjs.com - * (c) 2010-2022 Vladimir Agafonkin, (c) 2010-2011 CloudMade - */ - -var version = "1.9.3"; - -/* - * @namespace Util - * - * Various utility functions, used by Leaflet internally. - */ - -// @function extend(dest: Object, src?: Object): Object -// Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut. -function extend(dest) { - var i, j, len, src; - - for (j = 1, len = arguments.length; j < len; j++) { - src = arguments[j]; - for (i in src) { - dest[i] = src[i]; - } - } - return dest; -} - -// @function create(proto: Object, properties?: Object): Object -// Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create) -var create$2 = Object.create || (function () { - function F() {} - return function (proto) { - F.prototype = proto; - return new F(); - }; -})(); - -// @function bind(fn: Function, …): Function -// Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). -// Has a `L.bind()` shortcut. -function bind(fn, obj) { - var slice = Array.prototype.slice; - - if (fn.bind) { - return fn.bind.apply(fn, slice.call(arguments, 1)); - } - - var args = slice.call(arguments, 2); - - return function () { - return fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments); - }; -} - -// @property lastId: Number -// Last unique ID used by [`stamp()`](#util-stamp) -var lastId = 0; - -// @function stamp(obj: Object): Number -// Returns the unique ID of an object, assigning it one if it doesn't have it. -function stamp(obj) { - if (!('_leaflet_id' in obj)) { - obj['_leaflet_id'] = ++lastId; - } - return obj._leaflet_id; -} - -// @function throttle(fn: Function, time: Number, context: Object): Function -// Returns a function which executes function `fn` with the given scope `context` -// (so that the `this` keyword refers to `context` inside `fn`'s code). The function -// `fn` will be called no more than one time per given amount of `time`. The arguments -// received by the bound function will be any arguments passed when binding the -// function, followed by any arguments passed when invoking the bound function. -// Has an `L.throttle` shortcut. -function throttle(fn, time, context) { - var lock, args, wrapperFn, later; - - later = function () { - // reset lock and call if queued - lock = false; - if (args) { - wrapperFn.apply(context, args); - args = false; - } - }; - - wrapperFn = function () { - if (lock) { - // called too soon, queue to call later - args = arguments; - - } else { - // call and lock until later - fn.apply(context, arguments); - setTimeout(later, time); - lock = true; - } - }; - - return wrapperFn; -} - -// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number -// Returns the number `num` modulo `range` in such a way so it lies within -// `range[0]` and `range[1]`. The returned value will be always smaller than -// `range[1]` unless `includeMax` is set to `true`. -function wrapNum(x, range, includeMax) { - var max = range[1], - min = range[0], - d = max - min; - return x === max && includeMax ? x : ((x - min) % d + d) % d + min; -} - -// @function falseFn(): Function -// Returns a function which always returns `false`. -function falseFn() { return false; } - -// @function formatNum(num: Number, precision?: Number|false): Number -// Returns the number `num` rounded with specified `precision`. -// The default `precision` value is 6 decimal places. -// `false` can be passed to skip any processing (can be useful to avoid round-off errors). -function formatNum(num, precision) { - if (precision === false) { return num; } - var pow = Math.pow(10, precision === undefined ? 6 : precision); - return Math.round(num * pow) / pow; -} - -// @function trim(str: String): String -// Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim) -function trim(str) { - return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); -} - -// @function splitWords(str: String): String[] -// Trims and splits the string on whitespace and returns the array of parts. -function splitWords(str) { - return trim(str).split(/\s+/); -} - -// @function setOptions(obj: Object, options: Object): Object -// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut. -function setOptions(obj, options) { - if (!Object.prototype.hasOwnProperty.call(obj, 'options')) { - obj.options = obj.options ? create$2(obj.options) : {}; - } - for (var i in options) { - obj.options[i] = options[i]; - } - return obj.options; -} - -// @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String -// Converts an object into a parameter URL string, e.g. `{a: "foo", b: "bar"}` -// translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will -// be appended at the end. If `uppercase` is `true`, the parameter names will -// be uppercased (e.g. `'?A=foo&B=bar'`) -function getParamString(obj, existingUrl, uppercase) { - var params = []; - for (var i in obj) { - params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i])); - } - return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); -} - -var templateRe = /\{ *([\w_ -]+) *\}/g; - -// @function template(str: String, data: Object): String -// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'` -// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string -// `('Hello foo, bar')`. You can also specify functions instead of strings for -// data values — they will be evaluated passing `data` as an argument. -function template(str, data) { - return str.replace(templateRe, function (str, key) { - var value = data[key]; - - if (value === undefined) { - throw new Error('No value provided for variable ' + str); - - } else if (typeof value === 'function') { - value = value(data); - } - return value; - }); -} - -// @function isArray(obj): Boolean -// Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray) -var isArray = Array.isArray || function (obj) { - return (Object.prototype.toString.call(obj) === '[object Array]'); -}; - -// @function indexOf(array: Array, el: Object): Number -// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) -function indexOf(array, el) { - for (var i = 0; i < array.length; i++) { - if (array[i] === el) { return i; } - } - return -1; -} - -// @property emptyImageUrl: String -// Data URI string containing a base64-encoded empty GIF image. -// Used as a hack to free memory from unused images on WebKit-powered -// mobile devices (by setting image `src` to this string). -var emptyImageUrl = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='; - -// inspired by https://paulirish.com/2011/requestanimationframe-for-smart-animating/ - -function getPrefixed(name) { - return window['webkit' + name] || window['moz' + name] || window['ms' + name]; -} - -var lastTime = 0; - -// fallback for IE 7-8 -function timeoutDefer(fn) { - var time = +new Date(), - timeToCall = Math.max(0, 16 - (time - lastTime)); - - lastTime = time + timeToCall; - return window.setTimeout(fn, timeToCall); -} - -var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer; -var cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') || - getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); }; - -// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number -// Schedules `fn` to be executed when the browser repaints. `fn` is bound to -// `context` if given. When `immediate` is set, `fn` is called immediately if -// the browser doesn't have native support for -// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame), -// otherwise it's delayed. Returns a request ID that can be used to cancel the request. -function requestAnimFrame(fn, context, immediate) { - if (immediate && requestFn === timeoutDefer) { - fn.call(context); - } else { - return requestFn.call(window, bind(fn, context)); - } -} - -// @function cancelAnimFrame(id: Number): undefined -// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame). -function cancelAnimFrame(id) { - if (id) { - cancelFn.call(window, id); - } -} - -var Util = { - __proto__: null, - extend: extend, - create: create$2, - bind: bind, - get lastId () { return lastId; }, - stamp: stamp, - throttle: throttle, - wrapNum: wrapNum, - falseFn: falseFn, - formatNum: formatNum, - trim: trim, - splitWords: splitWords, - setOptions: setOptions, - getParamString: getParamString, - template: template, - isArray: isArray, - indexOf: indexOf, - emptyImageUrl: emptyImageUrl, - requestFn: requestFn, - cancelFn: cancelFn, - requestAnimFrame: requestAnimFrame, - cancelAnimFrame: cancelAnimFrame -}; - -// @class Class -// @aka L.Class - -// @section -// @uninheritable - -// Thanks to John Resig and Dean Edwards for inspiration! - -function Class() {} - -Class.extend = function (props) { - - // @function extend(props: Object): Function - // [Extends the current class](#class-inheritance) given the properties to be included. - // Returns a Javascript function that is a class constructor (to be called with `new`). - var NewClass = function () { - - setOptions(this); - - // call the constructor - if (this.initialize) { - this.initialize.apply(this, arguments); - } - - // call all constructor hooks - this.callInitHooks(); - }; - - var parentProto = NewClass.__super__ = this.prototype; - - var proto = create$2(parentProto); - proto.constructor = NewClass; - - NewClass.prototype = proto; - - // inherit parent's statics - for (var i in this) { - if (Object.prototype.hasOwnProperty.call(this, i) && i !== 'prototype' && i !== '__super__') { - NewClass[i] = this[i]; - } - } - - // mix static properties into the class - if (props.statics) { - extend(NewClass, props.statics); - } - - // mix includes into the prototype - if (props.includes) { - checkDeprecatedMixinEvents(props.includes); - extend.apply(null, [proto].concat(props.includes)); - } - - // mix given properties into the prototype - extend(proto, props); - delete proto.statics; - delete proto.includes; - - // merge options - if (proto.options) { - proto.options = parentProto.options ? create$2(parentProto.options) : {}; - extend(proto.options, props.options); - } - - proto._initHooks = []; - - // add method for calling all hooks - proto.callInitHooks = function () { - - if (this._initHooksCalled) { return; } - - if (parentProto.callInitHooks) { - parentProto.callInitHooks.call(this); - } - - this._initHooksCalled = true; - - for (var i = 0, len = proto._initHooks.length; i < len; i++) { - proto._initHooks[i].call(this); - } - }; - - return NewClass; -}; - - -// @function include(properties: Object): this -// [Includes a mixin](#class-includes) into the current class. -Class.include = function (props) { - var parentOptions = this.prototype.options; - extend(this.prototype, props); - if (props.options) { - this.prototype.options = parentOptions; - this.mergeOptions(props.options); - } - return this; -}; - -// @function mergeOptions(options: Object): this -// [Merges `options`](#class-options) into the defaults of the class. -Class.mergeOptions = function (options) { - extend(this.prototype.options, options); - return this; -}; - -// @function addInitHook(fn: Function): this -// Adds a [constructor hook](#class-constructor-hooks) to the class. -Class.addInitHook = function (fn) { // (Function) || (String, args...) - var args = Array.prototype.slice.call(arguments, 1); - - var init = typeof fn === 'function' ? fn : function () { - this[fn].apply(this, args); - }; - - this.prototype._initHooks = this.prototype._initHooks || []; - this.prototype._initHooks.push(init); - return this; -}; - -function checkDeprecatedMixinEvents(includes) { - /* global L: true */ - if (typeof L === 'undefined' || !L || !L.Mixin) { return; } - - includes = isArray(includes) ? includes : [includes]; - - for (var i = 0; i < includes.length; i++) { - if (includes[i] === L.Mixin.Events) { - console.warn('Deprecated include of L.Mixin.Events: ' + - 'this property will be removed in future releases, ' + - 'please inherit from L.Evented instead.', new Error().stack); - } - } -} - -/* - * @class Evented - * @aka L.Evented - * @inherits Class - * - * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event). - * - * @example - * - * ```js - * map.on('click', function(e) { - * alert(e.latlng); - * } ); - * ``` - * - * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function: - * - * ```js - * function onClick(e) { ... } - * - * map.on('click', onClick); - * map.off('click', onClick); - * ``` - */ - -var Events = { - /* @method on(type: String, fn: Function, context?: Object): this - * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`). - * - * @alternative - * @method on(eventMap: Object): this - * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` - */ - on: function (types, fn, context) { - - // types can be a map of types/handlers - if (typeof types === 'object') { - for (var type in types) { - // we don't process space-separated events here for performance; - // it's a hot path since Layer uses the on(obj) syntax - this._on(type, types[type], fn); - } - - } else { - // types can be a string of space-separated words - types = splitWords(types); - - for (var i = 0, len = types.length; i < len; i++) { - this._on(types[i], fn, context); - } - } - - return this; - }, - - /* @method off(type: String, fn?: Function, context?: Object): this - * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener. - * - * @alternative - * @method off(eventMap: Object): this - * Removes a set of type/listener pairs. - * - * @alternative - * @method off: this - * Removes all listeners to all events on the object. This includes implicitly attached events. - */ - off: function (types, fn, context) { - - if (!arguments.length) { - // clear all listeners if called without arguments - delete this._events; - - } else if (typeof types === 'object') { - for (var type in types) { - this._off(type, types[type], fn); - } - - } else { - types = splitWords(types); - - var removeAll = arguments.length === 1; - for (var i = 0, len = types.length; i < len; i++) { - if (removeAll) { - this._off(types[i]); - } else { - this._off(types[i], fn, context); - } - } - } - - return this; - }, - - // attach listener (without syntactic sugar now) - _on: function (type, fn, context, _once) { - if (typeof fn !== 'function') { - console.warn('wrong listener type: ' + typeof fn); - return; - } - - // check if fn already there - if (this._listens(type, fn, context) !== false) { - return; - } - - if (context === this) { - // Less memory footprint. - context = undefined; - } - - var newListener = {fn: fn, ctx: context}; - if (_once) { - newListener.once = true; - } - - this._events = this._events || {}; - this._events[type] = this._events[type] || []; - this._events[type].push(newListener); - }, - - _off: function (type, fn, context) { - var listeners, - i, - len; - - if (!this._events) { - return; - } - - listeners = this._events[type]; - if (!listeners) { - return; - } - - if (arguments.length === 1) { // remove all - if (this._firingCount) { - // Set all removed listeners to noop - // so they are not called if remove happens in fire - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].fn = falseFn; - } - } - // clear all listeners for a type if function isn't specified - delete this._events[type]; - return; - } - - if (typeof fn !== 'function') { - console.warn('wrong listener type: ' + typeof fn); - return; - } - - // find fn and remove it - var index = this._listens(type, fn, context); - if (index !== false) { - var listener = listeners[index]; - if (this._firingCount) { - // set the removed listener to noop so that's not called if remove happens in fire - listener.fn = falseFn; - - /* copy array in case events are being fired */ - this._events[type] = listeners = listeners.slice(); - } - listeners.splice(index, 1); - } - }, - - // @method fire(type: String, data?: Object, propagate?: Boolean): this - // Fires an event of the specified type. You can optionally provide a data - // object — the first argument of the listener function will contain its - // properties. The event can optionally be propagated to event parents. - fire: function (type, data, propagate) { - if (!this.listens(type, propagate)) { return this; } - - var event = extend({}, data, { - type: type, - target: this, - sourceTarget: data && data.sourceTarget || this - }); - - if (this._events) { - var listeners = this._events[type]; - if (listeners) { - this._firingCount = (this._firingCount + 1) || 1; - for (var i = 0, len = listeners.length; i < len; i++) { - var l = listeners[i]; - // off overwrites l.fn, so we need to copy fn to a var - var fn = l.fn; - if (l.once) { - this.off(type, fn, l.ctx); - } - fn.call(l.ctx || this, event); - } - - this._firingCount--; - } - } - - if (propagate) { - // propagate the event to parents (set with addEventParent) - this._propagateEvent(event); - } - - return this; - }, - - // @method listens(type: String, propagate?: Boolean): Boolean - // @method listens(type: String, fn: Function, context?: Object, propagate?: Boolean): Boolean - // Returns `true` if a particular event type has any listeners attached to it. - // The verification can optionally be propagated, it will return `true` if parents have the listener attached to it. - listens: function (type, fn, context, propagate) { - if (typeof type !== 'string') { - console.warn('"string" type argument expected'); - } - - // we don't overwrite the input `fn` value, because we need to use it for propagation - var _fn = fn; - if (typeof fn !== 'function') { - propagate = !!fn; - _fn = undefined; - context = undefined; - } - - var listeners = this._events && this._events[type]; - if (listeners && listeners.length) { - if (this._listens(type, _fn, context) !== false) { - return true; - } - } - - if (propagate) { - // also check parents for listeners if event propagates - for (var id in this._eventParents) { - if (this._eventParents[id].listens(type, fn, context, propagate)) { return true; } - } - } - return false; - }, - - // returns the index (number) or false - _listens: function (type, fn, context) { - if (!this._events) { - return false; - } - - var listeners = this._events[type] || []; - if (!fn) { - return !!listeners.length; - } - - if (context === this) { - // Less memory footprint. - context = undefined; - } - - for (var i = 0, len = listeners.length; i < len; i++) { - if (listeners[i].fn === fn && listeners[i].ctx === context) { - return i; - } - } - return false; - - }, - - // @method once(…): this - // Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed. - once: function (types, fn, context) { - - // types can be a map of types/handlers - if (typeof types === 'object') { - for (var type in types) { - // we don't process space-separated events here for performance; - // it's a hot path since Layer uses the on(obj) syntax - this._on(type, types[type], fn, true); - } - - } else { - // types can be a string of space-separated words - types = splitWords(types); - - for (var i = 0, len = types.length; i < len; i++) { - this._on(types[i], fn, context, true); - } - } - - return this; - }, - - // @method addEventParent(obj: Evented): this - // Adds an event parent - an `Evented` that will receive propagated events - addEventParent: function (obj) { - this._eventParents = this._eventParents || {}; - this._eventParents[stamp(obj)] = obj; - return this; - }, - - // @method removeEventParent(obj: Evented): this - // Removes an event parent, so it will stop receiving propagated events - removeEventParent: function (obj) { - if (this._eventParents) { - delete this._eventParents[stamp(obj)]; - } - return this; - }, - - _propagateEvent: function (e) { - for (var id in this._eventParents) { - this._eventParents[id].fire(e.type, extend({ - layer: e.target, - propagatedFrom: e.target - }, e), true); - } - } -}; - -// aliases; we should ditch those eventually - -// @method addEventListener(…): this -// Alias to [`on(…)`](#evented-on) -Events.addEventListener = Events.on; - -// @method removeEventListener(…): this -// Alias to [`off(…)`](#evented-off) - -// @method clearAllEventListeners(…): this -// Alias to [`off()`](#evented-off) -Events.removeEventListener = Events.clearAllEventListeners = Events.off; - -// @method addOneTimeEventListener(…): this -// Alias to [`once(…)`](#evented-once) -Events.addOneTimeEventListener = Events.once; - -// @method fireEvent(…): this -// Alias to [`fire(…)`](#evented-fire) -Events.fireEvent = Events.fire; - -// @method hasEventListeners(…): Boolean -// Alias to [`listens(…)`](#evented-listens) -Events.hasEventListeners = Events.listens; - -var Evented = Class.extend(Events); - -/* - * @class Point - * @aka L.Point - * - * Represents a point with `x` and `y` coordinates in pixels. - * - * @example - * - * ```js - * var point = L.point(200, 300); - * ``` - * - * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent: - * - * ```js - * map.panBy([200, 300]); - * map.panBy(L.point(200, 300)); - * ``` - * - * Note that `Point` does not inherit from Leaflet's `Class` object, - * which means new classes can't inherit from it, and new methods - * can't be added to it with the `include` function. - */ - -function Point(x, y, round) { - // @property x: Number; The `x` coordinate of the point - this.x = (round ? Math.round(x) : x); - // @property y: Number; The `y` coordinate of the point - this.y = (round ? Math.round(y) : y); -} - -var trunc = Math.trunc || function (v) { - return v > 0 ? Math.floor(v) : Math.ceil(v); -}; - -Point.prototype = { - - // @method clone(): Point - // Returns a copy of the current point. - clone: function () { - return new Point(this.x, this.y); - }, - - // @method add(otherPoint: Point): Point - // Returns the result of addition of the current and the given points. - add: function (point) { - // non-destructive, returns a new point - return this.clone()._add(toPoint(point)); - }, - - _add: function (point) { - // destructive, used directly for performance in situations where it's safe to modify existing point - this.x += point.x; - this.y += point.y; - return this; - }, - - // @method subtract(otherPoint: Point): Point - // Returns the result of subtraction of the given point from the current. - subtract: function (point) { - return this.clone()._subtract(toPoint(point)); - }, - - _subtract: function (point) { - this.x -= point.x; - this.y -= point.y; - return this; - }, - - // @method divideBy(num: Number): Point - // Returns the result of division of the current point by the given number. - divideBy: function (num) { - return this.clone()._divideBy(num); - }, - - _divideBy: function (num) { - this.x /= num; - this.y /= num; - return this; - }, - - // @method multiplyBy(num: Number): Point - // Returns the result of multiplication of the current point by the given number. - multiplyBy: function (num) { - return this.clone()._multiplyBy(num); - }, - - _multiplyBy: function (num) { - this.x *= num; - this.y *= num; - return this; - }, - - // @method scaleBy(scale: Point): Point - // Multiply each coordinate of the current point by each coordinate of - // `scale`. In linear algebra terms, multiply the point by the - // [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation) - // defined by `scale`. - scaleBy: function (point) { - return new Point(this.x * point.x, this.y * point.y); - }, - - // @method unscaleBy(scale: Point): Point - // Inverse of `scaleBy`. Divide each coordinate of the current point by - // each coordinate of `scale`. - unscaleBy: function (point) { - return new Point(this.x / point.x, this.y / point.y); - }, - - // @method round(): Point - // Returns a copy of the current point with rounded coordinates. - round: function () { - return this.clone()._round(); - }, - - _round: function () { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; - }, - - // @method floor(): Point - // Returns a copy of the current point with floored coordinates (rounded down). - floor: function () { - return this.clone()._floor(); - }, - - _floor: function () { - this.x = Math.floor(this.x); - this.y = Math.floor(this.y); - return this; - }, - - // @method ceil(): Point - // Returns a copy of the current point with ceiled coordinates (rounded up). - ceil: function () { - return this.clone()._ceil(); - }, - - _ceil: function () { - this.x = Math.ceil(this.x); - this.y = Math.ceil(this.y); - return this; - }, - - // @method trunc(): Point - // Returns a copy of the current point with truncated coordinates (rounded towards zero). - trunc: function () { - return this.clone()._trunc(); - }, - - _trunc: function () { - this.x = trunc(this.x); - this.y = trunc(this.y); - return this; - }, - - // @method distanceTo(otherPoint: Point): Number - // Returns the cartesian distance between the current and the given points. - distanceTo: function (point) { - point = toPoint(point); - - var x = point.x - this.x, - y = point.y - this.y; - - return Math.sqrt(x * x + y * y); - }, - - // @method equals(otherPoint: Point): Boolean - // Returns `true` if the given point has the same coordinates. - equals: function (point) { - point = toPoint(point); - - return point.x === this.x && - point.y === this.y; - }, - - // @method contains(otherPoint: Point): Boolean - // Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). - contains: function (point) { - point = toPoint(point); - - return Math.abs(point.x) <= Math.abs(this.x) && - Math.abs(point.y) <= Math.abs(this.y); - }, - - // @method toString(): String - // Returns a string representation of the point for debugging purposes. - toString: function () { - return 'Point(' + - formatNum(this.x) + ', ' + - formatNum(this.y) + ')'; - } -}; - -// @factory L.point(x: Number, y: Number, round?: Boolean) -// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values. - -// @alternative -// @factory L.point(coords: Number[]) -// Expects an array of the form `[x, y]` instead. - -// @alternative -// @factory L.point(coords: Object) -// Expects a plain object of the form `{x: Number, y: Number}` instead. -function toPoint(x, y, round) { - if (x instanceof Point) { - return x; - } - if (isArray(x)) { - return new Point(x[0], x[1]); - } - if (x === undefined || x === null) { - return x; - } - if (typeof x === 'object' && 'x' in x && 'y' in x) { - return new Point(x.x, x.y); - } - return new Point(x, y, round); -} - -/* - * @class Bounds - * @aka L.Bounds - * - * Represents a rectangular area in pixel coordinates. - * - * @example - * - * ```js - * var p1 = L.point(10, 10), - * p2 = L.point(40, 60), - * bounds = L.bounds(p1, p2); - * ``` - * - * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: - * - * ```js - * otherBounds.intersects([[10, 10], [40, 60]]); - * ``` - * - * Note that `Bounds` does not inherit from Leaflet's `Class` object, - * which means new classes can't inherit from it, and new methods - * can't be added to it with the `include` function. - */ - -function Bounds(a, b) { - if (!a) { return; } - - var points = b ? [a, b] : a; - - for (var i = 0, len = points.length; i < len; i++) { - this.extend(points[i]); - } -} - -Bounds.prototype = { - // @method extend(point: Point): this - // Extends the bounds to contain the given point. - - // @alternative - // @method extend(otherBounds: Bounds): this - // Extend the bounds to contain the given bounds - extend: function (obj) { - var min2, max2; - if (!obj) { return this; } - - if (obj instanceof Point || typeof obj[0] === 'number' || 'x' in obj) { - min2 = max2 = toPoint(obj); - } else { - obj = toBounds(obj); - min2 = obj.min; - max2 = obj.max; - - if (!min2 || !max2) { return this; } - } - - // @property min: Point - // The top left corner of the rectangle. - // @property max: Point - // The bottom right corner of the rectangle. - if (!this.min && !this.max) { - this.min = min2.clone(); - this.max = max2.clone(); - } else { - this.min.x = Math.min(min2.x, this.min.x); - this.max.x = Math.max(max2.x, this.max.x); - this.min.y = Math.min(min2.y, this.min.y); - this.max.y = Math.max(max2.y, this.max.y); - } - return this; - }, - - // @method getCenter(round?: Boolean): Point - // Returns the center point of the bounds. - getCenter: function (round) { - return toPoint( - (this.min.x + this.max.x) / 2, - (this.min.y + this.max.y) / 2, round); - }, - - // @method getBottomLeft(): Point - // Returns the bottom-left point of the bounds. - getBottomLeft: function () { - return toPoint(this.min.x, this.max.y); - }, - - // @method getTopRight(): Point - // Returns the top-right point of the bounds. - getTopRight: function () { // -> Point - return toPoint(this.max.x, this.min.y); - }, - - // @method getTopLeft(): Point - // Returns the top-left point of the bounds (i.e. [`this.min`](#bounds-min)). - getTopLeft: function () { - return this.min; // left, top - }, - - // @method getBottomRight(): Point - // Returns the bottom-right point of the bounds (i.e. [`this.max`](#bounds-max)). - getBottomRight: function () { - return this.max; // right, bottom - }, - - // @method getSize(): Point - // Returns the size of the given bounds - getSize: function () { - return this.max.subtract(this.min); - }, - - // @method contains(otherBounds: Bounds): Boolean - // Returns `true` if the rectangle contains the given one. - // @alternative - // @method contains(point: Point): Boolean - // Returns `true` if the rectangle contains the given point. - contains: function (obj) { - var min, max; - - if (typeof obj[0] === 'number' || obj instanceof Point) { - obj = toPoint(obj); - } else { - obj = toBounds(obj); - } - - if (obj instanceof Bounds) { - min = obj.min; - max = obj.max; - } else { - min = max = obj; - } - - return (min.x >= this.min.x) && - (max.x <= this.max.x) && - (min.y >= this.min.y) && - (max.y <= this.max.y); - }, - - // @method intersects(otherBounds: Bounds): Boolean - // Returns `true` if the rectangle intersects the given bounds. Two bounds - // intersect if they have at least one point in common. - intersects: function (bounds) { // (Bounds) -> Boolean - bounds = toBounds(bounds); - - var min = this.min, - max = this.max, - min2 = bounds.min, - max2 = bounds.max, - xIntersects = (max2.x >= min.x) && (min2.x <= max.x), - yIntersects = (max2.y >= min.y) && (min2.y <= max.y); - - return xIntersects && yIntersects; - }, - - // @method overlaps(otherBounds: Bounds): Boolean - // Returns `true` if the rectangle overlaps the given bounds. Two bounds - // overlap if their intersection is an area. - overlaps: function (bounds) { // (Bounds) -> Boolean - bounds = toBounds(bounds); - - var min = this.min, - max = this.max, - min2 = bounds.min, - max2 = bounds.max, - xOverlaps = (max2.x > min.x) && (min2.x < max.x), - yOverlaps = (max2.y > min.y) && (min2.y < max.y); - - return xOverlaps && yOverlaps; - }, - - // @method isValid(): Boolean - // Returns `true` if the bounds are properly initialized. - isValid: function () { - return !!(this.min && this.max); - }, - - - // @method pad(bufferRatio: Number): Bounds - // Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. - // For example, a ratio of 0.5 extends the bounds by 50% in each direction. - // Negative values will retract the bounds. - pad: function (bufferRatio) { - var min = this.min, - max = this.max, - heightBuffer = Math.abs(min.x - max.x) * bufferRatio, - widthBuffer = Math.abs(min.y - max.y) * bufferRatio; - - - return toBounds( - toPoint(min.x - heightBuffer, min.y - widthBuffer), - toPoint(max.x + heightBuffer, max.y + widthBuffer)); - }, - - - // @method equals(otherBounds: Bounds): Boolean - // Returns `true` if the rectangle is equivalent to the given bounds. - equals: function (bounds) { - if (!bounds) { return false; } - - bounds = toBounds(bounds); - - return this.min.equals(bounds.getTopLeft()) && - this.max.equals(bounds.getBottomRight()); - }, -}; - - -// @factory L.bounds(corner1: Point, corner2: Point) -// Creates a Bounds object from two corners coordinate pairs. -// @alternative -// @factory L.bounds(points: Point[]) -// Creates a Bounds object from the given array of points. -function toBounds(a, b) { - if (!a || a instanceof Bounds) { - return a; - } - return new Bounds(a, b); -} - -/* - * @class LatLngBounds - * @aka L.LatLngBounds - * - * Represents a rectangular geographical area on a map. - * - * @example - * - * ```js - * var corner1 = L.latLng(40.712, -74.227), - * corner2 = L.latLng(40.774, -74.125), - * bounds = L.latLngBounds(corner1, corner2); - * ``` - * - * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: - * - * ```js - * map.fitBounds([ - * [40.712, -74.227], - * [40.774, -74.125] - * ]); - * ``` - * - * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range. - * - * Note that `LatLngBounds` does not inherit from Leaflet's `Class` object, - * which means new classes can't inherit from it, and new methods - * can't be added to it with the `include` function. - */ - -function LatLngBounds(corner1, corner2) { // (LatLng, LatLng) or (LatLng[]) - if (!corner1) { return; } - - var latlngs = corner2 ? [corner1, corner2] : corner1; - - for (var i = 0, len = latlngs.length; i < len; i++) { - this.extend(latlngs[i]); - } -} - -LatLngBounds.prototype = { - - // @method extend(latlng: LatLng): this - // Extend the bounds to contain the given point - - // @alternative - // @method extend(otherBounds: LatLngBounds): this - // Extend the bounds to contain the given bounds - extend: function (obj) { - var sw = this._southWest, - ne = this._northEast, - sw2, ne2; - - if (obj instanceof LatLng) { - sw2 = obj; - ne2 = obj; - - } else if (obj instanceof LatLngBounds) { - sw2 = obj._southWest; - ne2 = obj._northEast; - - if (!sw2 || !ne2) { return this; } - - } else { - return obj ? this.extend(toLatLng(obj) || toLatLngBounds(obj)) : this; - } - - if (!sw && !ne) { - this._southWest = new LatLng(sw2.lat, sw2.lng); - this._northEast = new LatLng(ne2.lat, ne2.lng); - } else { - sw.lat = Math.min(sw2.lat, sw.lat); - sw.lng = Math.min(sw2.lng, sw.lng); - ne.lat = Math.max(ne2.lat, ne.lat); - ne.lng = Math.max(ne2.lng, ne.lng); - } - - return this; - }, - - // @method pad(bufferRatio: Number): LatLngBounds - // Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. - // For example, a ratio of 0.5 extends the bounds by 50% in each direction. - // Negative values will retract the bounds. - pad: function (bufferRatio) { - var sw = this._southWest, - ne = this._northEast, - heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, - widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio; - - return new LatLngBounds( - new LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer), - new LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); - }, - - // @method getCenter(): LatLng - // Returns the center point of the bounds. - getCenter: function () { - return new LatLng( - (this._southWest.lat + this._northEast.lat) / 2, - (this._southWest.lng + this._northEast.lng) / 2); - }, - - // @method getSouthWest(): LatLng - // Returns the south-west point of the bounds. - getSouthWest: function () { - return this._southWest; - }, - - // @method getNorthEast(): LatLng - // Returns the north-east point of the bounds. - getNorthEast: function () { - return this._northEast; - }, - - // @method getNorthWest(): LatLng - // Returns the north-west point of the bounds. - getNorthWest: function () { - return new LatLng(this.getNorth(), this.getWest()); - }, - - // @method getSouthEast(): LatLng - // Returns the south-east point of the bounds. - getSouthEast: function () { - return new LatLng(this.getSouth(), this.getEast()); - }, - - // @method getWest(): Number - // Returns the west longitude of the bounds - getWest: function () { - return this._southWest.lng; - }, - - // @method getSouth(): Number - // Returns the south latitude of the bounds - getSouth: function () { - return this._southWest.lat; - }, - - // @method getEast(): Number - // Returns the east longitude of the bounds - getEast: function () { - return this._northEast.lng; - }, - - // @method getNorth(): Number - // Returns the north latitude of the bounds - getNorth: function () { - return this._northEast.lat; - }, - - // @method contains(otherBounds: LatLngBounds): Boolean - // Returns `true` if the rectangle contains the given one. - - // @alternative - // @method contains (latlng: LatLng): Boolean - // Returns `true` if the rectangle contains the given point. - contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean - if (typeof obj[0] === 'number' || obj instanceof LatLng || 'lat' in obj) { - obj = toLatLng(obj); - } else { - obj = toLatLngBounds(obj); - } - - var sw = this._southWest, - ne = this._northEast, - sw2, ne2; - - if (obj instanceof LatLngBounds) { - sw2 = obj.getSouthWest(); - ne2 = obj.getNorthEast(); - } else { - sw2 = ne2 = obj; - } - - return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) && - (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); - }, - - // @method intersects(otherBounds: LatLngBounds): Boolean - // Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common. - intersects: function (bounds) { - bounds = toLatLngBounds(bounds); - - var sw = this._southWest, - ne = this._northEast, - sw2 = bounds.getSouthWest(), - ne2 = bounds.getNorthEast(), - - latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat), - lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng); - - return latIntersects && lngIntersects; - }, - - // @method overlaps(otherBounds: LatLngBounds): Boolean - // Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area. - overlaps: function (bounds) { - bounds = toLatLngBounds(bounds); - - var sw = this._southWest, - ne = this._northEast, - sw2 = bounds.getSouthWest(), - ne2 = bounds.getNorthEast(), - - latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat), - lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng); - - return latOverlaps && lngOverlaps; - }, - - // @method toBBoxString(): String - // Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. - toBBoxString: function () { - return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); - }, - - // @method equals(otherBounds: LatLngBounds, maxMargin?: Number): Boolean - // Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting `maxMargin` to a small number. - equals: function (bounds, maxMargin) { - if (!bounds) { return false; } - - bounds = toLatLngBounds(bounds); - - return this._southWest.equals(bounds.getSouthWest(), maxMargin) && - this._northEast.equals(bounds.getNorthEast(), maxMargin); - }, - - // @method isValid(): Boolean - // Returns `true` if the bounds are properly initialized. - isValid: function () { - return !!(this._southWest && this._northEast); - } -}; - -// TODO International date line? - -// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng) -// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle. - -// @alternative -// @factory L.latLngBounds(latlngs: LatLng[]) -// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds). -function toLatLngBounds(a, b) { - if (a instanceof LatLngBounds) { - return a; - } - return new LatLngBounds(a, b); -} - -/* @class LatLng - * @aka L.LatLng - * - * Represents a geographical point with a certain latitude and longitude. - * - * @example - * - * ``` - * var latlng = L.latLng(50.5, 30.5); - * ``` - * - * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent: - * - * ``` - * map.panTo([50, 30]); - * map.panTo({lon: 30, lat: 50}); - * map.panTo({lat: 50, lng: 30}); - * map.panTo(L.latLng(50, 30)); - * ``` - * - * Note that `LatLng` does not inherit from Leaflet's `Class` object, - * which means new classes can't inherit from it, and new methods - * can't be added to it with the `include` function. - */ - -function LatLng(lat, lng, alt) { - if (isNaN(lat) || isNaN(lng)) { - throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); - } - - // @property lat: Number - // Latitude in degrees - this.lat = +lat; - - // @property lng: Number - // Longitude in degrees - this.lng = +lng; - - // @property alt: Number - // Altitude in meters (optional) - if (alt !== undefined) { - this.alt = +alt; - } -} - -LatLng.prototype = { - // @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean - // Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overridden by setting `maxMargin` to a small number. - equals: function (obj, maxMargin) { - if (!obj) { return false; } - - obj = toLatLng(obj); - - var margin = Math.max( - Math.abs(this.lat - obj.lat), - Math.abs(this.lng - obj.lng)); - - return margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin); - }, - - // @method toString(): String - // Returns a string representation of the point (for debugging purposes). - toString: function (precision) { - return 'LatLng(' + - formatNum(this.lat, precision) + ', ' + - formatNum(this.lng, precision) + ')'; - }, - - // @method distanceTo(otherLatLng: LatLng): Number - // Returns the distance (in meters) to the given `LatLng` calculated using the [Spherical Law of Cosines](https://en.wikipedia.org/wiki/Spherical_law_of_cosines). - distanceTo: function (other) { - return Earth.distance(this, toLatLng(other)); - }, - - // @method wrap(): LatLng - // Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees. - wrap: function () { - return Earth.wrapLatLng(this); - }, - - // @method toBounds(sizeInMeters: Number): LatLngBounds - // Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`. - toBounds: function (sizeInMeters) { - var latAccuracy = 180 * sizeInMeters / 40075017, - lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); - - return toLatLngBounds( - [this.lat - latAccuracy, this.lng - lngAccuracy], - [this.lat + latAccuracy, this.lng + lngAccuracy]); - }, - - clone: function () { - return new LatLng(this.lat, this.lng, this.alt); - } -}; - - - -// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng -// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude). - -// @alternative -// @factory L.latLng(coords: Array): LatLng -// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead. - -// @alternative -// @factory L.latLng(coords: Object): LatLng -// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead. - -function toLatLng(a, b, c) { - if (a instanceof LatLng) { - return a; - } - if (isArray(a) && typeof a[0] !== 'object') { - if (a.length === 3) { - return new LatLng(a[0], a[1], a[2]); - } - if (a.length === 2) { - return new LatLng(a[0], a[1]); - } - return null; - } - if (a === undefined || a === null) { - return a; - } - if (typeof a === 'object' && 'lat' in a) { - return new LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt); - } - if (b === undefined) { - return null; - } - return new LatLng(a, b, c); -} - -/* - * @namespace CRS - * @crs L.CRS.Base - * Object that defines coordinate reference systems for projecting - * geographical points into pixel (screen) coordinates and back (and to - * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See - * [spatial reference system](https://en.wikipedia.org/wiki/Spatial_reference_system). - * - * Leaflet defines the most usual CRSs by default. If you want to use a - * CRS not defined by default, take a look at the - * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. - * - * Note that the CRS instances do not inherit from Leaflet's `Class` object, - * and can't be instantiated. Also, new classes can't inherit from them, - * and methods can't be added to them with the `include` function. - */ - -var CRS = { - // @method latLngToPoint(latlng: LatLng, zoom: Number): Point - // Projects geographical coordinates into pixel coordinates for a given zoom. - latLngToPoint: function (latlng, zoom) { - var projectedPoint = this.projection.project(latlng), - scale = this.scale(zoom); - - return this.transformation._transform(projectedPoint, scale); - }, - - // @method pointToLatLng(point: Point, zoom: Number): LatLng - // The inverse of `latLngToPoint`. Projects pixel coordinates on a given - // zoom into geographical coordinates. - pointToLatLng: function (point, zoom) { - var scale = this.scale(zoom), - untransformedPoint = this.transformation.untransform(point, scale); - - return this.projection.unproject(untransformedPoint); - }, - - // @method project(latlng: LatLng): Point - // Projects geographical coordinates into coordinates in units accepted for - // this CRS (e.g. meters for EPSG:3857, for passing it to WMS services). - project: function (latlng) { - return this.projection.project(latlng); - }, - - // @method unproject(point: Point): LatLng - // Given a projected coordinate returns the corresponding LatLng. - // The inverse of `project`. - unproject: function (point) { - return this.projection.unproject(point); - }, - - // @method scale(zoom: Number): Number - // Returns the scale used when transforming projected coordinates into - // pixel coordinates for a particular zoom. For example, it returns - // `256 * 2^zoom` for Mercator-based CRS. - scale: function (zoom) { - return 256 * Math.pow(2, zoom); - }, - - // @method zoom(scale: Number): Number - // Inverse of `scale()`, returns the zoom level corresponding to a scale - // factor of `scale`. - zoom: function (scale) { - return Math.log(scale / 256) / Math.LN2; - }, - - // @method getProjectedBounds(zoom: Number): Bounds - // Returns the projection's bounds scaled and transformed for the provided `zoom`. - getProjectedBounds: function (zoom) { - if (this.infinite) { return null; } - - var b = this.projection.bounds, - s = this.scale(zoom), - min = this.transformation.transform(b.min, s), - max = this.transformation.transform(b.max, s); - - return new Bounds(min, max); - }, - - // @method distance(latlng1: LatLng, latlng2: LatLng): Number - // Returns the distance between two geographical coordinates. - - // @property code: String - // Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`) - // - // @property wrapLng: Number[] - // An array of two numbers defining whether the longitude (horizontal) coordinate - // axis wraps around a given range and how. Defaults to `[-180, 180]` in most - // geographical CRSs. If `undefined`, the longitude axis does not wrap around. - // - // @property wrapLat: Number[] - // Like `wrapLng`, but for the latitude (vertical) axis. - - // wrapLng: [min, max], - // wrapLat: [min, max], - - // @property infinite: Boolean - // If true, the coordinate space will be unbounded (infinite in both axes) - infinite: false, - - // @method wrapLatLng(latlng: LatLng): LatLng - // Returns a `LatLng` where lat and lng has been wrapped according to the - // CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds. - wrapLatLng: function (latlng) { - var lng = this.wrapLng ? wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng, - lat = this.wrapLat ? wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat, - alt = latlng.alt; - - return new LatLng(lat, lng, alt); - }, - - // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds - // Returns a `LatLngBounds` with the same size as the given one, ensuring - // that its center is within the CRS's bounds. - // Only accepts actual `L.LatLngBounds` instances, not arrays. - wrapLatLngBounds: function (bounds) { - var center = bounds.getCenter(), - newCenter = this.wrapLatLng(center), - latShift = center.lat - newCenter.lat, - lngShift = center.lng - newCenter.lng; - - if (latShift === 0 && lngShift === 0) { - return bounds; - } - - var sw = bounds.getSouthWest(), - ne = bounds.getNorthEast(), - newSw = new LatLng(sw.lat - latShift, sw.lng - lngShift), - newNe = new LatLng(ne.lat - latShift, ne.lng - lngShift); - - return new LatLngBounds(newSw, newNe); - } -}; - -/* - * @namespace CRS - * @crs L.CRS.Earth - * - * Serves as the base for CRS that are global such that they cover the earth. - * Can only be used as the base for other CRS and cannot be used directly, - * since it does not have a `code`, `projection` or `transformation`. `distance()` returns - * meters. - */ - -var Earth = extend({}, CRS, { - wrapLng: [-180, 180], - - // Mean Earth Radius, as recommended for use by - // the International Union of Geodesy and Geophysics, - // see https://rosettacode.org/wiki/Haversine_formula - R: 6371000, - - // distance between two geographical points using spherical law of cosines approximation - distance: function (latlng1, latlng2) { - var rad = Math.PI / 180, - lat1 = latlng1.lat * rad, - lat2 = latlng2.lat * rad, - sinDLat = Math.sin((latlng2.lat - latlng1.lat) * rad / 2), - sinDLon = Math.sin((latlng2.lng - latlng1.lng) * rad / 2), - a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon, - c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - return this.R * c; - } -}); - -/* - * @namespace Projection - * @projection L.Projection.SphericalMercator - * - * Spherical Mercator projection — the most common projection for online maps, - * used by almost all free and commercial tile providers. Assumes that Earth is - * a sphere. Used by the `EPSG:3857` CRS. - */ - -var earthRadius = 6378137; - -var SphericalMercator = { - - R: earthRadius, - MAX_LATITUDE: 85.0511287798, - - project: function (latlng) { - var d = Math.PI / 180, - max = this.MAX_LATITUDE, - lat = Math.max(Math.min(max, latlng.lat), -max), - sin = Math.sin(lat * d); - - return new Point( - this.R * latlng.lng * d, - this.R * Math.log((1 + sin) / (1 - sin)) / 2); - }, - - unproject: function (point) { - var d = 180 / Math.PI; - - return new LatLng( - (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d, - point.x * d / this.R); - }, - - bounds: (function () { - var d = earthRadius * Math.PI; - return new Bounds([-d, -d], [d, d]); - })() -}; - -/* - * @class Transformation - * @aka L.Transformation - * - * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d` - * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing - * the reverse. Used by Leaflet in its projections code. - * - * @example - * - * ```js - * var transformation = L.transformation(2, 5, -1, 10), - * p = L.point(1, 2), - * p2 = transformation.transform(p), // L.point(7, 8) - * p3 = transformation.untransform(p2); // L.point(1, 2) - * ``` - */ - - -// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number) -// Creates a `Transformation` object with the given coefficients. -function Transformation(a, b, c, d) { - if (isArray(a)) { - // use array properties - this._a = a[0]; - this._b = a[1]; - this._c = a[2]; - this._d = a[3]; - return; - } - this._a = a; - this._b = b; - this._c = c; - this._d = d; -} - -Transformation.prototype = { - // @method transform(point: Point, scale?: Number): Point - // Returns a transformed point, optionally multiplied by the given scale. - // Only accepts actual `L.Point` instances, not arrays. - transform: function (point, scale) { // (Point, Number) -> Point - return this._transform(point.clone(), scale); - }, - - // destructive transform (faster) - _transform: function (point, scale) { - scale = scale || 1; - point.x = scale * (this._a * point.x + this._b); - point.y = scale * (this._c * point.y + this._d); - return point; - }, - - // @method untransform(point: Point, scale?: Number): Point - // Returns the reverse transformation of the given point, optionally divided - // by the given scale. Only accepts actual `L.Point` instances, not arrays. - untransform: function (point, scale) { - scale = scale || 1; - return new Point( - (point.x / scale - this._b) / this._a, - (point.y / scale - this._d) / this._c); - } -}; - -// factory L.transformation(a: Number, b: Number, c: Number, d: Number) - -// @factory L.transformation(a: Number, b: Number, c: Number, d: Number) -// Instantiates a Transformation object with the given coefficients. - -// @alternative -// @factory L.transformation(coefficients: Array): Transformation -// Expects an coefficients array of the form -// `[a: Number, b: Number, c: Number, d: Number]`. - -function toTransformation(a, b, c, d) { - return new Transformation(a, b, c, d); -} - -/* - * @namespace CRS - * @crs L.CRS.EPSG3857 - * - * The most common CRS for online maps, used by almost all free and commercial - * tile providers. Uses Spherical Mercator projection. Set in by default in - * Map's `crs` option. - */ - -var EPSG3857 = extend({}, Earth, { - code: 'EPSG:3857', - projection: SphericalMercator, - - transformation: (function () { - var scale = 0.5 / (Math.PI * SphericalMercator.R); - return toTransformation(scale, 0.5, -scale, 0.5); - }()) -}); - -var EPSG900913 = extend({}, EPSG3857, { - code: 'EPSG:900913' -}); - -// @namespace SVG; @section -// There are several static functions which can be called without instantiating L.SVG: - -// @function create(name: String): SVGElement -// Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement), -// corresponding to the class name passed. For example, using 'line' will return -// an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement). -function svgCreate(name) { - return document.createElementNS('http://www.w3.org/2000/svg', name); -} - -// @function pointsToPath(rings: Point[], closed: Boolean): String -// Generates a SVG path string for multiple rings, with each ring turning -// into "M..L..L.." instructions -function pointsToPath(rings, closed) { - var str = '', - i, j, len, len2, points, p; - - for (i = 0, len = rings.length; i < len; i++) { - points = rings[i]; - - for (j = 0, len2 = points.length; j < len2; j++) { - p = points[j]; - str += (j ? 'L' : 'M') + p.x + ' ' + p.y; - } - - // closes the ring for polygons; "x" is VML syntax - str += closed ? (Browser.svg ? 'z' : 'x') : ''; - } - - // SVG complains about empty path strings - return str || 'M0 0'; -} - -/* - * @namespace Browser - * @aka L.Browser - * - * A namespace with static properties for browser/feature detection used by Leaflet internally. - * - * @example - * - * ```js - * if (L.Browser.ielt9) { - * alert('Upgrade your browser, dude!'); - * } - * ``` - */ - -var style = document.documentElement.style; - -// @property ie: Boolean; `true` for all Internet Explorer versions (not Edge). -var ie = 'ActiveXObject' in window; - -// @property ielt9: Boolean; `true` for Internet Explorer versions less than 9. -var ielt9 = ie && !document.addEventListener; - -// @property edge: Boolean; `true` for the Edge web browser. -var edge = 'msLaunchUri' in navigator && !('documentMode' in document); - -// @property webkit: Boolean; -// `true` for webkit-based browsers like Chrome and Safari (including mobile versions). -var webkit = userAgentContains('webkit'); - -// @property android: Boolean -// **Deprecated.** `true` for any browser running on an Android platform. -var android = userAgentContains('android'); - -// @property android23: Boolean; **Deprecated.** `true` for browsers running on Android 2 or Android 3. -var android23 = userAgentContains('android 2') || userAgentContains('android 3'); - -/* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */ -var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit -// @property androidStock: Boolean; **Deprecated.** `true` for the Android stock browser (i.e. not Chrome) -var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window); - -// @property opera: Boolean; `true` for the Opera browser -var opera = !!window.opera; - -// @property chrome: Boolean; `true` for the Chrome browser. -var chrome = !edge && userAgentContains('chrome'); - -// @property gecko: Boolean; `true` for gecko-based browsers like Firefox. -var gecko = userAgentContains('gecko') && !webkit && !opera && !ie; - -// @property safari: Boolean; `true` for the Safari browser. -var safari = !chrome && userAgentContains('safari'); - -var phantom = userAgentContains('phantom'); - -// @property opera12: Boolean -// `true` for the Opera browser supporting CSS transforms (version 12 or later). -var opera12 = 'OTransition' in style; - -// @property win: Boolean; `true` when the browser is running in a Windows platform -var win = navigator.platform.indexOf('Win') === 0; - -// @property ie3d: Boolean; `true` for all Internet Explorer versions supporting CSS transforms. -var ie3d = ie && ('transition' in style); - -// @property webkit3d: Boolean; `true` for webkit-based browsers supporting CSS transforms. -var webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23; - -// @property gecko3d: Boolean; `true` for gecko-based browsers supporting CSS transforms. -var gecko3d = 'MozPerspective' in style; - -// @property any3d: Boolean -// `true` for all browsers supporting CSS transforms. -var any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom; - -// @property mobile: Boolean; `true` for all browsers running in a mobile device. -var mobile = typeof orientation !== 'undefined' || userAgentContains('mobile'); - -// @property mobileWebkit: Boolean; `true` for all webkit-based browsers in a mobile device. -var mobileWebkit = mobile && webkit; - -// @property mobileWebkit3d: Boolean -// `true` for all webkit-based browsers in a mobile device supporting CSS transforms. -var mobileWebkit3d = mobile && webkit3d; - -// @property msPointer: Boolean -// `true` for browsers implementing the Microsoft touch events model (notably IE10). -var msPointer = !window.PointerEvent && window.MSPointerEvent; - -// @property pointer: Boolean -// `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx). -var pointer = !!(window.PointerEvent || msPointer); - -// @property touchNative: Boolean -// `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events). -// **This does not necessarily mean** that the browser is running in a computer with -// a touchscreen, it only means that the browser is capable of understanding -// touch events. -var touchNative = 'ontouchstart' in window || !!window.TouchEvent; - -// @property touch: Boolean -// `true` for all browsers supporting either [touch](#browser-touch) or [pointer](#browser-pointer) events. -// Note: pointer events will be preferred (if available), and processed for all `touch*` listeners. -var touch = !window.L_NO_TOUCH && (touchNative || pointer); - -// @property mobileOpera: Boolean; `true` for the Opera browser in a mobile device. -var mobileOpera = mobile && opera; - -// @property mobileGecko: Boolean -// `true` for gecko-based browsers running in a mobile device. -var mobileGecko = mobile && gecko; - -// @property retina: Boolean -// `true` for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%. -var retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1; - -// @property passiveEvents: Boolean -// `true` for browsers that support passive events. -var passiveEvents = (function () { - var supportsPassiveOption = false; - try { - var opts = Object.defineProperty({}, 'passive', { - get: function () { // eslint-disable-line getter-return - supportsPassiveOption = true; - } - }); - window.addEventListener('testPassiveEventSupport', falseFn, opts); - window.removeEventListener('testPassiveEventSupport', falseFn, opts); - } catch (e) { - // Errors can safely be ignored since this is only a browser support test. - } - return supportsPassiveOption; -}()); - -// @property canvas: Boolean -// `true` when the browser supports [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). -var canvas$1 = (function () { - return !!document.createElement('canvas').getContext; -}()); - -// @property svg: Boolean -// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG). -var svg$1 = !!(document.createElementNS && svgCreate('svg').createSVGRect); - -var inlineSvg = !!svg$1 && (function () { - var div = document.createElement('div'); - div.innerHTML = ''; - return (div.firstChild && div.firstChild.namespaceURI) === 'http://www.w3.org/2000/svg'; -})(); - -// @property vml: Boolean -// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language). -var vml = !svg$1 && (function () { - try { - var div = document.createElement('div'); - div.innerHTML = ''; - - var shape = div.firstChild; - shape.style.behavior = 'url(#default#VML)'; - - return shape && (typeof shape.adj === 'object'); - - } catch (e) { - return false; - } -}()); - - -// @property mac: Boolean; `true` when the browser is running in a Mac platform -var mac = navigator.platform.indexOf('Mac') === 0; - -// @property mac: Boolean; `true` when the browser is running in a Linux platform -var linux = navigator.platform.indexOf('Linux') === 0; - -function userAgentContains(str) { - return navigator.userAgent.toLowerCase().indexOf(str) >= 0; -} - - -var Browser = { - ie: ie, - ielt9: ielt9, - edge: edge, - webkit: webkit, - android: android, - android23: android23, - androidStock: androidStock, - opera: opera, - chrome: chrome, - gecko: gecko, - safari: safari, - phantom: phantom, - opera12: opera12, - win: win, - ie3d: ie3d, - webkit3d: webkit3d, - gecko3d: gecko3d, - any3d: any3d, - mobile: mobile, - mobileWebkit: mobileWebkit, - mobileWebkit3d: mobileWebkit3d, - msPointer: msPointer, - pointer: pointer, - touch: touch, - touchNative: touchNative, - mobileOpera: mobileOpera, - mobileGecko: mobileGecko, - retina: retina, - passiveEvents: passiveEvents, - canvas: canvas$1, - svg: svg$1, - vml: vml, - inlineSvg: inlineSvg, - mac: mac, - linux: linux -}; - -/* - * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. - */ - -var POINTER_DOWN = Browser.msPointer ? 'MSPointerDown' : 'pointerdown'; -var POINTER_MOVE = Browser.msPointer ? 'MSPointerMove' : 'pointermove'; -var POINTER_UP = Browser.msPointer ? 'MSPointerUp' : 'pointerup'; -var POINTER_CANCEL = Browser.msPointer ? 'MSPointerCancel' : 'pointercancel'; -var pEvent = { - touchstart : POINTER_DOWN, - touchmove : POINTER_MOVE, - touchend : POINTER_UP, - touchcancel : POINTER_CANCEL -}; -var handle = { - touchstart : _onPointerStart, - touchmove : _handlePointer, - touchend : _handlePointer, - touchcancel : _handlePointer -}; -var _pointers = {}; -var _pointerDocListener = false; - -// Provides a touch events wrapper for (ms)pointer events. -// ref https://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 - -function addPointerListener(obj, type, handler) { - if (type === 'touchstart') { - _addPointerDocListener(); - } - if (!handle[type]) { - console.warn('wrong event specified:', type); - return falseFn; - } - handler = handle[type].bind(this, handler); - obj.addEventListener(pEvent[type], handler, false); - return handler; -} - -function removePointerListener(obj, type, handler) { - if (!pEvent[type]) { - console.warn('wrong event specified:', type); - return; - } - obj.removeEventListener(pEvent[type], handler, false); -} - -function _globalPointerDown(e) { - _pointers[e.pointerId] = e; -} - -function _globalPointerMove(e) { - if (_pointers[e.pointerId]) { - _pointers[e.pointerId] = e; - } -} - -function _globalPointerUp(e) { - delete _pointers[e.pointerId]; -} - -function _addPointerDocListener() { - // need to keep track of what pointers and how many are active to provide e.touches emulation - if (!_pointerDocListener) { - // we listen document as any drags that end by moving the touch off the screen get fired there - document.addEventListener(POINTER_DOWN, _globalPointerDown, true); - document.addEventListener(POINTER_MOVE, _globalPointerMove, true); - document.addEventListener(POINTER_UP, _globalPointerUp, true); - document.addEventListener(POINTER_CANCEL, _globalPointerUp, true); - - _pointerDocListener = true; - } -} - -function _handlePointer(handler, e) { - if (e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) { return; } - - e.touches = []; - for (var i in _pointers) { - e.touches.push(_pointers[i]); - } - e.changedTouches = [e]; - - handler(e); -} - -function _onPointerStart(handler, e) { - // IE10 specific: MsTouch needs preventDefault. See #2000 - if (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) { - preventDefault(e); - } - _handlePointer(handler, e); -} - -/* - * Extends the event handling code with double tap support for mobile browsers. - * - * Note: currently most browsers fire native dblclick, with only a few exceptions - * (see https://github.com/Leaflet/Leaflet/issues/7012#issuecomment-595087386) - */ - -function makeDblclick(event) { - // in modern browsers `type` cannot be just overridden: - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only - var newEvent = {}, - prop, i; - for (i in event) { - prop = event[i]; - newEvent[i] = prop && prop.bind ? prop.bind(event) : prop; - } - event = newEvent; - newEvent.type = 'dblclick'; - newEvent.detail = 2; - newEvent.isTrusted = false; - newEvent._simulated = true; // for debug purposes - return newEvent; -} - -var delay = 200; -function addDoubleTapListener(obj, handler) { - // Most browsers handle double tap natively - obj.addEventListener('dblclick', handler); - - // On some platforms the browser doesn't fire native dblclicks for touch events. - // It seems that in all such cases `detail` property of `click` event is always `1`. - // So here we rely on that fact to avoid excessive 'dblclick' simulation when not needed. - var last = 0, - detail; - function simDblclick(e) { - if (e.detail !== 1) { - detail = e.detail; // keep in sync to avoid false dblclick in some cases - return; - } - - if (e.pointerType === 'mouse' || - (e.sourceCapabilities && !e.sourceCapabilities.firesTouchEvents)) { - - return; - } - - // When clicking on an , the browser generates a click on its - //