diff --git a/public/strategie-script.js b/public/strategie-script.js
index 2ab4d0b..ab4641b 100644
--- a/public/strategie-script.js
+++ b/public/strategie-script.js
@@ -1,7 +1,8 @@
-// Script pour la stratégie - avec contenu complet du fichier Markdown
+// Script pour la gestion des pages de stratégie
(function() {
- // Contenu de la stratégie (extrait de docs/strategie-evolution-technique.md)
- const strategieMarkdown = `# Stratégie d'Évolution Technique - Laplank
+ // Contenu des pages Markdown
+ const pagesContent = {
+ 'strategie': `# Stratégie d'Évolution Technique - Laplank
**Date de mise à jour** : 02/12/2025
@@ -289,12 +290,231 @@ Aucune migration urgente identifiée actuellement.
Cette stratégie d'évolution technique vise à aligner les choix technologiques avec les objectifs business, réduire les risques, optimiser les coûts et favoriser l'innovation.
-La mise en œuvre de cette stratégie nécessite un engagement continu de l'équipe et un suivi régulier des métriques définies.`;
+La mise en œuvre de cette stratégie nécessite un engagement continu de l'équipe et un suivi régulier des métriques définies.`,
+
+ 'business': `# Stratégie Business : Data Visualization & Flux Économiques
+
+**Date** : 02/12/2025
+**Contexte** : En marge de l'écosystème Duniter/Ğ1, exploration des opportunités de marché autour de la visualisation de données économiques et logistiques.
+
+---
+
+## 1. Analyse du Marché de la Data Visualization
+
+### Vue d'ensemble
+Le marché de la visualisation de données est en pleine expansion, porté par la complexité croissante des flux d'informations et le besoin de transparence.
+
+**Taille du marché** : En croissance constante (CAGR estimé à >10% annuel).
+**Moteurs** :
+- Besoin de prise de décision basée sur les données (Data-Driven Decision Making).
+- Complexité des chaînes d'approvisionnement (Supply Chain).
+- Demande de transparence financière et RSE (Responsabilité Sociétale des Entreprises).
+
+### Segments Pertinents pour Laplank
+
+1. **Visualisation de Flux Financiers Complexes (FinTech / DeFi)**
+ * **Besoin** : Comprendre les mouvements de fonds, la création monétaire, les graphes de transactions.
+ * **Cible** : DAOs, projets Blockchain, ONG, Auditeurs financiers.
+ * **Offre** : Dashboards interactifs de transparence, explorateurs de blockchain visuels (au-delà des simples listes de transactions).
+
+2. **Transparence de la Supply Chain (Flux de Marchandises)**
+ * **Besoin** : Tracer l'origine et le parcours des produits (traçabilité).
+ * **Cible** : Coopératives, circuits courts, commerce équitable, industrie agroalimentaire.
+ * **Lien avec Duniter** : Utilisation possible de la blockchain pour certifier les étapes, visualisées ensuite pour le consommateur final.
+
+3. **Visualisation de Réseaux et Communautés (Web of Trust)**
+ * **Besoin** : Cartographier les relations humaines, la confiance, la gouvernance décentralisée.
+ * **Cible** : Associations, collectifs, réseaux sociaux décentralisés.
+
+---
+
+## 2. Opportunité : Flux Économiques & Marchandises
+
+C'est le segment le plus prometteur "en marge" de la crypto pure, car il touche l'économie réelle.
+
+### Le Problème
+- Les ERP (Enterprise Resource Planning) classiques sont austères et peu visuels.
+- La donnée est silotée.
+- Le consommateur ou le décideur ne "voit" pas le flux global.
+
+### La Solution Laplank
+Proposer une **plateforme de visualisation unifiée** capable de représenter graphiquement :
+- **Flux monétaires** (€, Ğ1, Crypto)
+- **Flux physiques** (Marchandises, Stocks, Logistique)
+
+### Cas d'Usage Concret : "Le Circuit Court Augmenté"
+Imaginez une coopérative de producteurs.
+- **Input** : Données de production, transport, vente.
+- **Visualisation** :
+ - **Carte interactive (Leaflet)** : Localisation des producteurs et trajets.
+ - **Graphe de flux (Sankey Diagram)** : Répartition de la valeur (combien va au producteur, au transporteur, à la coopérative). *Transparence radicale.*
+ - **Tableau de bord (ECharts/D3)** : Saisonnalité, stocks en temps réel.
+
+### Avantage Concurrentiel (Différenciation)
+- **Expertise Technique** : Maîtrise de technologies avancées (D3.js, Rust/Wasm pour la perf, ThreeFold pour l'hébergement souverain).
+- **Approche Éthique/Souveraine** : Hébergement décentralisé (ThreeFold), pas de GAFAM, respect des données.
+- **Double Compétence** : Capacité à lier Blockchain (certitude de la donnée) et DataViz (lisibilité de la donnée).
+
+---
+
+## 3. Modèle Économique Potentiel
+
+1. **Service B2B (SaaS / On-Premise)**
+ - Abonnement pour les entreprises/coopératives souhaitant visualiser leurs données.
+ - Hébergement sur ThreeFold (revenus récurrents).
+
+2. **Prestation de Conseil & Développement**
+ - Création de dashboards sur mesure pour des clients spécifiques.
+ - Audit de données et mise en qualité avant visualisation.
+
+3. **Produit "Open Core"**
+ - Version de base open-source (attraction communautaire).
+ - Modules "Premium" pour connecteurs spécifiques (ERP propriétaires, Banques) ou fonctionnalités avancées d'analyse prédictive (IA).
+
+---
+
+## 4. Roadmap Business (Piste)
+
+### Phase 1 : POC & Vitrine (6 mois)
+- Utiliser l'écosystème Duniter/Ğ1 comme "Client Zéro".
+- Développer l'explorateur visuel de Web of Trust et de flux monétaires.
+- **Objectif** : Démontrer la capacité technique et l'impact visuel. "Rendre sexy la donnée complexe".
+
+### Phase 2 : Extension aux Flux Physiques (6-12 mois)
+- Trouver un partenaire dans l'économie réelle (ex: coopérative bio, réseau de logistique locale).
+- Adapter les outils de visualisation pour tracer des produits physiques.
+- **Objectif** : Valider le marché hors crypto.
+
+### Phase 3 : Plateforme de Transparence Économique (12+ mois)
+- Lancer une offre packagée.
+- "Visualisez votre impact économique et écologique en temps réel".
+
+---
+
+## 5. Technologies Clés à Surveiller
+
+- **Digital Twins (Jumeaux Numériques)** : Représentation virtuelle d'objets physiques.
+- **IoT (Internet of Things)** : Capteurs pour alimenter les données de flux physiques.
+- **Standardisation (GS1 / EPCIS)** : Normes d'échange de données logistiques.
+
+---
+
+## Conclusion
+
+Le marché de la DataViz appliquée aux **flux économiques mixtes (monnaie + matière)** est une niche stratégique pertinente. Elle valorise l'expertise technique de l'équipe tout en s'ouvrant à des clients "traditionnels" cherchant transparence et optimisation. L'infrastructure ThreeFold apporte la couche de souveraineté nécessaire pour traiter ces données sensibles.`,
+
+ 'dataviz': `# Opportunités d'Extension : Data Visualization
+
+**Date** : 02/12/2025
+**Objectif** : Identifier les secteurs porteurs pour l'expertise DataViz de l'équipe, au-delà des flux économiques.
+
+---
+
+## 1. Territoires & Open Data (Smart Cities Souveraines)
+
+Les collectivités locales disposent de plus en plus de données (Open Data) mais manquent d'outils pour les rendre intelligibles aux citoyens.
+
+* **Opportunité** : Créer des portails de transparence pour les mairies/collectivités.
+* **Cas d'usage** :
+ * **Visualisation budgétaire** : "Où vont mes impôts ?" (Diagrammes de Sankey, Treemaps).
+ * **Urbanisme** : Cartographie des travaux, permis de construire, zones inondables.
+ * **Démocratie participative** : Visualiser les résultats de consultations citoyennes.
+* **Synergie Technique** : Leaflet (cartes), D3.js (budgets), ThreeFold (hébergement local et souverain des données citoyennes).
+
+## 2. Green Tech & Impact Environnemental
+
+La mesure et la communication de l'impact écologique deviennent obligatoires (CSRD) et stratégiques.
+
+* **Opportunité** : Tableaux de bord RSE (Responsabilité Sociétale des Entreprises) et empreinte carbone.
+* **Cas d'usage** :
+ * **Visualisation de l'empreinte carbone** : Scope 1, 2, 3. Graphiques d'évolution.
+ * **Monitoring énergétique** : Visualisation temps réel de la consommation (bâtiments, serveurs). *Lien direct avec l'offre ThreeFold "Green IT".*
+ * **Traçabilité des déchets** : Suivre le cycle de vie des produits.
+* **Synergie Technique** : IoT (capteurs), ECharts (séries temporelles), Rust (traitement performant de gros volumes de données capteurs).
+
+## 3. Visualisation de la Connaissance (Knowledge Management)
+
+Dans un monde infobèse, organiser et visualiser l'information est une valeur clé.
+
+* **Opportunité** : Outils de "Second Cerveau" ou de gestion des connaissances pour entreprises/recherche.
+* **Cas d'usage** :
+ * **Graphes de connaissances** : Visualiser les liens entre documents, personnes, projets (comme Obsidian ou Roam, mais version web/collaborative).
+ * **Cartographie des compétences** : Version avancée du Radar Technologique pour les RH (gestion des talents).
+ * **Exploration documentaire** : Naviguer visuellement dans des bases documentaires complexes (juridique, technique).
+* **Synergie Technique** : Cytoscape.js (graphes), ElasticSearch/MeiliSearch (indexation), IA (pour générer les liens).
+
+## 4. Cybersécurité & Réseaux
+
+Visualiser l'invisible pour mieux protéger.
+
+* **Opportunité** : Interfaces de monitoring sécurité pour PME.
+* **Cas d'usage** :
+ * **Cartographie du réseau** : Visualiser tous les appareils connectés et leurs communications.
+ * **Visualisation d'attaques** : Représenter les tentatives d'intrusion en temps réel (cartes de chaleur, flux).
+ * **Analyse de logs** : Rendre les logs serveurs lisibles graphiquement.
+* **Synergie Technique** : Rust (sondes réseau), WebGL/Canvas (visualisation haute performance), ThreeFold (réseau overlay).
+
+---
+
+## Matrice de Priorisation
+
+| Secteur | Potentiel Marché | Synergie Technique Actuelle | Complexité Métier | Priorité |
+| :--- | :---: | :---: | :---: | :---: |
+| **Flux Éco (Business)** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Moyenne | **1** |
+| **Territoires (Smart City)** | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Élevée (Politique) | **2** |
+| **Green Tech** | ⭐⭐⭐⭐ | ⭐⭐⭐ | Moyenne | **3** |
+| **Connaissance (KM)** | ⭐⭐⭐ | ⭐⭐⭐⭐ | Faible | **2** (Interne d'abord) |
+| **Cybersécurité** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | Très Élevée | **4** |
+
+## Conclusion
+
+Si le focus principal reste les **Flux Économiques** (cohérent avec l'historique Duniter), l'axe **Territoires/Open Data** est le pivot le plus naturel : il s'agit toujours de visualiser des ressources et des flux, mais appliqués à la cité. De plus, l'argument de la "Souveraineté Numérique" (ThreeFold) y résonne très fort.`
+ };
+
+ const pageTitles = {
+ 'strategie': 'Stratégie Technique',
+ 'business': 'Business',
+ 'dataviz': 'Opportunités DataViz'
+ };
// Fonction pour convertir Markdown en HTML
function markdownToHtml(md) {
let html = md;
+ // Tableaux
+ html = html.replace(/\|(.+)\|/g, function(match) {
+ // Gestion basique des tableaux markdown
+ if (match.includes('---')) return ''; // Ignore la ligne de séparation
+ const cells = match.split('|').filter(c => c.trim() !== '');
+ const cellTag = match.includes('Secteur') || match.includes('Potentiel') ? 'th' : 'td';
+ return '
' + cells.map(c => `<${cellTag} style="border: 1px solid #ddd; padding: 8px; text-align: left;">${c.trim()}${cellTag}>`).join('') + '
';
+ });
+
+ // Envelopper les lignes de tableau dans une table si nécessaire (simplifié)
+ // Pour une vraie implémentation, utiliser une lib comme marked ou showdown
+ // Ici on fait un fix rapide pour que les tableaux s'affichent à peu près correctement
+ if (html.includes('')) {
+ // C'est très rudimentaire, idéalement on utiliserait une vraie lib
+ const parts = html.split('\n');
+ let inTable = false;
+ html = parts.map(line => {
+ if (line.startsWith('
')) {
+ if (!inTable) {
+ inTable = true;
+ return '' + line;
+ }
+ return line;
+ } else {
+ if (inTable && line.trim() === '') {
+ inTable = false;
+ return '
';
+ }
+ return line;
+ }
+ }).join('\n');
+ if (inTable) html += '';
+ }
+
// Titres
html = html.replace(/^# (.*$)/gim, '$1
');
html = html.replace(/^## (.*$)/gim, '$1
');
@@ -314,14 +534,16 @@ La mise en œuvre de cette stratégie nécessite un engagement continu de l'équ
// Paragraphes
html = html.split('\n\n').map(block => {
- if (block.trim().startsWith('' + block.trim() + '';
+ return '' + trimmed + '
';
}).join('\n');
// Grouper les listes
- html = html.replace(/(.*?<\/li>)/gim, function(match) {
+ html = html.replace(/(.*?<\/li>(\s*.*?<\/li>)*)/gim, function(match) {
return '';
});
html = html.replace(/<\/ul>\s*/gim, '');
@@ -330,209 +552,166 @@ La mise en œuvre de cette stratégie nécessite un engagement continu de l'équ
}
function initStrategyLinks() {
- addStrategyLinkToHeader();
- interceptStrategyLinks();
- handleStrategyRoute();
+ addLinksToHeader();
+ handleRoute();
}
- function handleStrategyRoute() {
- if (window.location.pathname === '/business/strategie' || window.location.pathname === '/business/strategie.html' || window.location.hash === '#strategie') {
- createStrategyPage();
- }
+ function handleRoute() {
+ const path = window.location.pathname;
+ const hash = window.location.hash;
+
+ // Détection simple
+ if (hash === '#strategie' || path.includes('/strategie')) showPage('strategie');
+ else if (hash === '#business' || path.includes('/business-strat')) showPage('business');
+ else if (hash === '#dataviz' || path.includes('/dataviz')) showPage('dataviz');
}
- function interceptStrategyLinks() {
- document.addEventListener('click', function(e) {
- const link = e.target.closest('a');
- if (link && (link.href.includes('/business/strategie') || link.getAttribute('href') === '/business/strategie' || link.id === 'strategie-link' || link.classList.contains('strategie-link'))) {
- e.preventDefault();
- e.stopPropagation();
- createStrategyPage();
- return false;
- }
- }, true);
- }
+ function showPage(pageId) {
+ if (!pagesContent[pageId]) return;
- function createStrategyPage() {
if (!window.originalBodyContent) {
window.originalBodyContent = document.body.innerHTML;
}
- // Convertir le Markdown en HTML
- const htmlContent = markdownToHtml(strategieMarkdown);
+ const htmlContent = markdownToHtml(pagesContent[pageId]);
document.body.innerHTML = `
`;
- // Appliquer des styles pour le contenu Markdown
- const contentDiv = document.getElementById('strategie-content');
- if (contentDiv) {
- contentDiv.querySelectorAll('h1').forEach(h => {
+ // Styles
+ styleContent();
+
+ // Event listeners
+ document.getElementById('back-to-radar').addEventListener('click', function(e) {
+ e.preventDefault();
+ if (window.originalBodyContent) {
+ document.body.innerHTML = window.originalBodyContent;
+ window.history.pushState(null, null, window.location.pathname.replace(/\/business\/.*$/, '/business/'));
+ setTimeout(initStrategyLinks, 100);
+ } else {
+ window.location.href = '/business/';
+ }
+ });
+
+ document.querySelectorAll('.nav-link').forEach(link => {
+ link.addEventListener('click', function(e) {
+ e.preventDefault();
+ const target = this.getAttribute('data-page');
+ showPage(target);
+ });
+ });
+
+ window.history.pushState({page: pageId}, pageTitles[pageId], `/business/${pageId}`);
+ }
+
+ function styleContent() {
+ const contentDiv = document.getElementById('page-content');
+ if (!contentDiv) return;
+
+ contentDiv.querySelectorAll('h1').forEach(h => {
h.style.color = '#1a4d3a';
h.style.borderBottom = '3px solid #2ecc71';
h.style.paddingBottom = '10px';
h.style.marginTop = '30px';
- h.style.marginBottom = '20px';
- });
- contentDiv.querySelectorAll('h2').forEach(h => {
+ });
+ contentDiv.querySelectorAll('h2').forEach(h => {
h.style.color = '#2ecc71';
h.style.marginTop = '30px';
h.style.marginBottom = '15px';
- });
- contentDiv.querySelectorAll('h3').forEach(h => {
+ });
+ contentDiv.querySelectorAll('h3').forEach(h => {
h.style.color = '#3498db';
h.style.marginTop = '20px';
- h.style.marginBottom = '10px';
- });
- contentDiv.querySelectorAll('h4').forEach(h => {
- h.style.color = '#555';
- h.style.marginTop = '15px';
- h.style.marginBottom = '8px';
- });
- contentDiv.querySelectorAll('ul').forEach(ul => {
- ul.style.margin = '10px 0';
- ul.style.paddingLeft = '30px';
- ul.style.listStyleType = 'disc';
- });
- contentDiv.querySelectorAll('li').forEach(li => {
- li.style.margin = '5px 0';
- });
- contentDiv.querySelectorAll('p').forEach(p => {
- p.style.margin = '10px 0';
- });
- contentDiv.querySelectorAll('a').forEach(a => {
+ });
+ contentDiv.querySelectorAll('ul, ol').forEach(l => {
+ l.style.marginLeft = '20px';
+ l.style.marginBottom = '15px';
+ });
+ contentDiv.querySelectorAll('li').forEach(li => {
+ li.style.marginBottom = '5px';
+ });
+ contentDiv.querySelectorAll('p').forEach(p => {
+ p.style.marginBottom = '15px';
+ });
+ contentDiv.querySelectorAll('a').forEach(a => {
a.style.color = '#2ecc71';
a.style.textDecoration = 'none';
- });
- contentDiv.querySelectorAll('a').forEach(a => {
- a.addEventListener('mouseenter', function() {
- this.style.textDecoration = 'underline';
- });
- a.addEventListener('mouseleave', function() {
- this.style.textDecoration = 'none';
- });
- });
- contentDiv.querySelectorAll('hr').forEach(hr => {
- hr.style.border = 'none';
- hr.style.borderTop = '2px solid #2ecc71';
- hr.style.margin = '30px 0';
- });
- contentDiv.querySelectorAll('strong').forEach(s => {
- s.style.color = '#1a4d3a';
- });
- }
-
- const backLink = document.getElementById('back-to-radar');
- if (backLink) {
- backLink.addEventListener('click', function(e) {
- e.preventDefault();
- if (window.originalBodyContent) {
- document.body.innerHTML = window.originalBodyContent;
- setTimeout(initStrategyLinks, 100);
- } else {
- window.location.href = '/business/';
- }
- });
- }
-
- window.history.pushState({page: 'strategie'}, 'Stratégie', '/business/strategie');
+ });
}
- function addStrategyLinkToHeader() {
- // Chercher le header ou la barre de navigation
+ function addLinksToHeader() {
+ // Chercher le header
const header = document.querySelector('header') ||
document.querySelector('nav') ||
- document.querySelector('[class*="header"]') ||
- document.querySelector('[class*="nav"]') ||
- document.querySelector('[class*="Header"]') ||
- document.querySelector('[class*="Nav"]') ||
document.querySelector('div[role="banner"]');
- if (header) {
- if (header.querySelector('#strategie-link') || header.querySelector('a[href*="strategie"]')) {
- return;
- }
- const strategyLink = document.createElement('a');
- strategyLink.id = 'strategie-link';
- strategyLink.className = 'strategie-link';
- strategyLink.href = '#strategie';
- strategyLink.textContent = '📋 Stratégie';
- strategyLink.style.marginLeft = '15px';
- strategyLink.style.color = '#2ecc71';
- strategyLink.style.textDecoration = 'none';
- strategyLink.style.fontWeight = 'bold';
- strategyLink.style.cursor = 'pointer';
- strategyLink.style.display = 'inline-block';
- strategyLink.style.padding = '5px 10px';
- strategyLink.style.borderRadius = '4px';
- strategyLink.style.transition = 'background 0.2s';
- strategyLink.addEventListener('mouseenter', function() {
- this.style.background = 'rgba(46, 204, 113, 0.1)';
- });
- strategyLink.addEventListener('mouseleave', function() {
- this.style.background = 'transparent';
- });
- strategyLink.addEventListener('click', function(e) {
- e.preventDefault();
- createStrategyPage();
- });
- header.appendChild(strategyLink);
+ let container = header;
+
+ // Si pas de header, créer une barre fixe
+ if (!header) {
+ let fixedBar = document.getElementById('custom-nav-bar');
+ if (!fixedBar) {
+ fixedBar = document.createElement('div');
+ fixedBar.id = 'custom-nav-bar';
+ fixedBar.style.cssText = 'position: fixed; top: 0; right: 0; padding: 10px 20px; z-index: 9999; display: flex; gap: 15px; background: rgba(255,255,255,0.9); border-bottom-left-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);';
+ document.body.appendChild(fixedBar);
+ }
+ container = fixedBar;
} else {
- // Si pas de header trouvé, créer une barre en haut de page
- const existingTopBar = document.getElementById('strategie-top-bar');
- if (existingTopBar) {
- return;
- }
-
- const topBar = document.createElement('div');
- topBar.id = 'strategie-top-bar';
- topBar.style.cssText = 'position: fixed; top: 0; left: 0; right: 0; background: rgba(26, 77, 58, 0.95); padding: 10px 20px; z-index: 1000; text-align: right; box-shadow: 0 2px 4px rgba(0,0,0,0.1);';
-
- const strategyLink = document.createElement('a');
- strategyLink.id = 'strategie-link';
- strategyLink.className = 'strategie-link';
- strategyLink.href = '#strategie';
- strategyLink.textContent = '📋 Stratégie';
- strategyLink.style.color = '#2ecc71';
- strategyLink.style.textDecoration = 'none';
- strategyLink.style.fontWeight = 'bold';
- strategyLink.style.cursor = 'pointer';
- strategyLink.style.padding = '5px 15px';
- strategyLink.style.borderRadius = '4px';
- strategyLink.style.transition = 'background 0.2s';
- strategyLink.addEventListener('mouseenter', function() {
- this.style.background = 'rgba(46, 204, 113, 0.2)';
- });
- strategyLink.addEventListener('mouseleave', function() {
- this.style.background = 'transparent';
- });
- strategyLink.addEventListener('click', function(e) {
- e.preventDefault();
- createStrategyPage();
- });
-
- topBar.appendChild(strategyLink);
- document.body.insertBefore(topBar, document.body.firstChild);
-
- // Ajouter un padding au body pour compenser la barre fixe
- if (!document.body.style.paddingTop || document.body.style.paddingTop === '0px') {
- document.body.style.paddingTop = '50px';
- }
+ // Si header existant, on s'assure qu'on n'a pas déjà ajouté les liens
+ if (header.querySelector('.custom-nav-link')) return;
+
+ // Créer un conteneur pour nos liens s'il n'existe pas
+ let linkContainer = document.createElement('div');
+ linkContainer.style.cssText = 'display: flex; gap: 15px; margin-left: auto; align-items: center; padding-right: 20px;';
+ header.appendChild(linkContainer);
+ container = linkContainer;
}
+
+ // Ajouter les liens
+ Object.keys(pageTitles).forEach(key => {
+ if (document.getElementById(`link-${key}`)) return;
+
+ const link = document.createElement('a');
+ link.id = `link-${key}`;
+ link.className = 'custom-nav-link';
+ link.href = `#${key}`;
+ link.textContent = pageTitles[key];
+ link.style.cssText = 'color: #2ecc71; text-decoration: none; font-weight: bold; cursor: pointer; font-size: 14px; padding: 5px 8px; border-radius: 4px; transition: background 0.2s;';
+
+ link.addEventListener('mouseenter', () => link.style.background = 'rgba(46, 204, 113, 0.1)');
+ link.addEventListener('mouseleave', () => link.style.background = 'transparent');
+
+ link.addEventListener('click', (e) => {
+ e.preventDefault();
+ showPage(key);
+ });
+
+ container.appendChild(link);
+ });
}
window.addEventListener('popstate', function(event) {
- if (window.originalBodyContent && !event.state) {
- document.body.innerHTML = window.originalBodyContent;
- setTimeout(initStrategyLinks, 100);
+ if (event.state && event.state.page) {
+ showPage(event.state.page);
+ } else if (window.originalBodyContent) {
+ document.body.innerHTML = window.originalBodyContent;
+ setTimeout(initStrategyLinks, 100);
}
});