diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 13acb96..dbf6914 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,31 +1,19 @@ -# Simple workflow for deploying static content to GitHub Pages name: Deploy to GitHub Pages on: - # Runs on pushes targeting the default branch push: branches: ["master"] - - # Allows you to run this workflow manually from the Actions tab workflow_dispatch: -# Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages permissions: - contents: read - pages: write - id-token: write + contents: write -# Allow only one concurrent deployment concurrency: group: "pages" cancel-in-progress: true jobs: - # Single deploy job since we're just deploying deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Checkout @@ -39,12 +27,9 @@ jobs: run: npm install - name: Build run: npm run build - - name: Setup Pages - uses: actions/configure-pages@v4 - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: './dist' - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./dist + keep_files: true diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml new file mode 100644 index 0000000..6fe553d --- /dev/null +++ b/.github/workflows/preview.yml @@ -0,0 +1,26 @@ +name: PR Preview + +on: + pull_request: + types: [opened, synchronize, reopened, closed] + +concurrency: preview-${{ github.ref }} + +permissions: + contents: write + pull-requests: write + +jobs: + preview: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: "npm" + - run: npm install + - run: npm run build + - uses: rossjrw/pr-preview-action@v1 + with: + source-dir: ./dist/ diff --git a/en/index.html b/en/index.html index 8126822..10f1c41 100644 --- a/en/index.html +++ b/en/index.html @@ -3,7 +3,7 @@ - +
- OKDP Logo + OKDP Logo OKDP
+ + + \ No newline at end of file diff --git a/index.html b/index.html index 8c5f758..4b4b2ae 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ - +
- OKDP Logo + OKDP Logo OKDP
+ + + \ No newline at end of file diff --git a/scripts/generate.js b/scripts/generate.js index b479e97..e1e2f74 100644 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -4,13 +4,21 @@ const path = require('path'); const srcDir = path.join(__dirname, '../src'); const localesDir = path.join(srcDir, 'locales'); +const partialsDir = path.join(srcDir, 'partials'); const templatePath = path.join(srcDir, 'template.html'); +const roadmapTemplatePath = path.join(srcDir, 'roadmap-template.html'); console.log('Generating sites...'); -const templateSource = fs.readFileSync(templatePath, 'utf8'); -const template = Handlebars.compile(templateSource); +// Register partials +const partialFiles = fs.readdirSync(partialsDir).filter(f => f.endsWith('.html')); +partialFiles.forEach(file => { + const name = path.basename(file, '.html'); + const content = fs.readFileSync(path.join(partialsDir, file), 'utf8'); + Handlebars.registerPartial(name, content); +}); +// Register helpers Handlebars.registerHelper('eq', function (a, b) { return a === b; }); @@ -19,42 +27,76 @@ Handlebars.registerHelper('neq', function (a, b) { return a !== b; }); +Handlebars.registerHelper('computeStatus', function (features) { + if (!features || !features.length) return 'todo'; + const allComplete = features.every(f => f.status === 'complete'); + const allTodo = features.every(f => f.status === 'todo'); + if (allComplete) return 'complete'; + if (allTodo) return 'todo'; + return 'inProgress'; +}); + +const mainTemplate = Handlebars.compile(fs.readFileSync(templatePath, 'utf8')); +const roadmapTemplate = Handlebars.compile(fs.readFileSync(roadmapTemplatePath, 'utf8')); + const languages = [ { code: 'fr', isDefault: true }, { code: 'en', isDefault: false } ]; +function ensureDir(dirPath) { + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + } +} + languages.forEach(lang => { const content = JSON.parse(fs.readFileSync(path.join(localesDir, `${lang.code}.json`), 'utf8')); - // Add metadata for language switching and paths + const relativePrefix = lang.isDefault ? './' : '../'; + const context = { ...content, currentLang: lang.code, frUrl: lang.code === 'fr' ? '#' : '../', enUrl: lang.code === 'en' ? '#' : (lang.isDefault ? 'en/' : '../en/'), - relativePrefix: lang.isDefault ? './' : '../', - // otherLangUrl kept for backward compatibility if needed, but we'll use specific URLs - otherLangUrl: lang.isDefault ? 'en/' : '../', - otherLangLabel: lang.isDefault ? 'EN' : 'FR' + relativePrefix, + roadmapUrl: lang.isDefault ? 'roadmap/' : (lang.code === 'en' ? 'roadmap/' : '../en/roadmap/'), }; - const html = template(context); - - let outputPath; + // Generate main page + const mainHtml = mainTemplate(context); + let mainOutputPath; if (lang.isDefault) { - outputPath = path.join(__dirname, '../index.html'); + mainOutputPath = path.join(__dirname, '../index.html'); } else { - // Ensure 'en' directory exists const langDir = path.join(__dirname, `../${lang.code}`); - if (!fs.existsSync(langDir)) { - fs.mkdirSync(langDir); - } - outputPath = path.join(langDir, 'index.html'); + ensureDir(langDir); + mainOutputPath = path.join(langDir, 'index.html'); } + fs.writeFileSync(mainOutputPath, mainHtml); + console.log(`Generated ${lang.code} main page at ${mainOutputPath}`); + + // Generate roadmap page + const roadmapContext = { + ...context, + frUrl: lang.code === 'fr' ? '#' : '../../roadmap/', + enUrl: lang.code === 'en' ? '#' : '../en/roadmap/', + relativePrefix: lang.isDefault ? '../' : '../../', + roadmapUrl: '#', + }; - fs.writeFileSync(outputPath, html); - console.log(`Generated ${lang.code} site at ${outputPath}`); + const roadmapHtml = roadmapTemplate(roadmapContext); + let roadmapDir; + if (lang.isDefault) { + roadmapDir = path.join(__dirname, '../roadmap'); + } else { + roadmapDir = path.join(__dirname, `../${lang.code}/roadmap`); + } + ensureDir(roadmapDir); + const roadmapOutputPath = path.join(roadmapDir, 'index.html'); + fs.writeFileSync(roadmapOutputPath, roadmapHtml); + console.log(`Generated ${lang.code} roadmap page at ${roadmapOutputPath}`); }); console.log('Done.'); diff --git a/src/locales/en.json b/src/locales/en.json index 0925556..75bf042 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -64,160 +64,318 @@ }, "architecture": { "title": "Modular Architecture", - "subtitle": "OKDP offers a modular architecture that allows you to select and deploy only the components you need for your specific use case.", - "query": { - "title": "Query Engine", - "desc": "High-performance SQL query engines for distributed data." - }, - "ml": { - "title": "ML/AI", - "desc": "Complete MLOps platform for data science workflows." - }, - "processing": { - "title": "Processing & Orchestration", - "desc": "Data processing engines and workflow orchestration." - }, - "storage": { - "title": "Storage & Catalog", - "desc": "Modern lakehouse with transactional tables and metadata management." - }, - "viz": { - "title": "Visualization & Database" - }, + "subtitle": "OKDP's architecture is built around two major layers: an ecosystem of reference Data & AI Modules and a unified Control Plane.", + "modulesTitle": "Data & AI Modules", + "modulesSubtitle": "A catalog of reference open source tools. Usable individually or combined, without depending on the OKDP Control Plane.", + "modules": [ + { + "icon": "⚡", + "title": "Ingestion & Streaming", + "desc": "Connectivity, ETL ingestion and real-time processing.", + "tools": [ + { "name": "Apache NiFi", "logo": "logos/nifi.svg", "url": "https://nifi.apache.org/" }, + { "name": "Apache Kafka", "logo": "logos/kafka.svg", "url": "https://kafka.apache.org/" }, + { "name": "Apache Flink", "logo": "logos/flink.svg", "url": "https://flink.apache.org/" } + ], + "future": true + }, + { + "icon": "🚀", + "title": "Lakehouse & Analytics", + "desc": "High-performance SQL engines and modern lakehouse.", + "tools": [ + { "name": "Apache Spark", "logo": "logos/spark.svg", "url": "https://spark.apache.org/" }, + { "name": "Trino", "logo": "logos/trino.svg", "url": "https://trino.io/" }, + { "name": "Polaris Catalog", "logo": "logos/polaris.svg", "url": "https://polaris.apache.org/", "invertLogo": true } + ], + "future": false + }, + { + "icon": "🧪", + "title": "Data Science", + "desc": "Interactive environments for exploration and analysis.", + "tools": [ + { "name": "JupyterLab", "logo": "logos/jupyter.svg", "url": "https://jupyter.org/" } + ], + "future": false + }, + { + "icon": "🤖", + "title": "AI & MLOps", + "desc": "MLOps platform and language model inference.", + "tools": [ + { "name": "Kubeflow", "logo": "logos/kubeflow.svg", "url": "https://kubeflow.org/" }, + { "name": "MLflow", "logo": "logos/mlflow.svg", "url": "https://mlflow.org/" }, + { "name": "LLM Serving", "logo": "", "url": "" } + ], + "future": true + }, + { + "icon": "📊", + "title": "Visualization & BI", + "desc": "Dashboards and visual data exploration.", + "tools": [ + { "name": "Apache Superset", "logo": "logos/superset.svg", "url": "https://superset.apache.org/" } + ], + "future": false + }, + { + "icon": "⚙️", + "title": "Orchestration & Governance", + "desc": "Workflow automation and metadata cataloging.", + "tools": [ + { "name": "Apache Airflow", "logo": "logos/airflow.svg", "url": "https://airflow.apache.org/" }, + { "name": "OpenMetadata", "logo": "", "url": "https://open-metadata.org/" } + ], + "future": false + } + ], + "controlPlaneTitle": "OKDP Control Plane", + "controlPlaneSubtitle": "OKDP's automation layer: orchestration, multi-tenant isolation, and governance for a turnkey experience across the entire stack.", + "controlPlane": [ + { + "icon": "🖥️", + "title": "Server / UI / CLI", + "desc": "Unified web portal and interfaces for administrators and users." + }, + { + "icon": "🗂️", + "title": "Project & Quota Management", + "desc": "Secure multi-tenant isolation and per-project resource limit management." + }, + { + "icon": "🔒", + "title": "Auth & Secrets Management", + "desc": "End-to-end OIDC authentication and secure secrets and RBAC management." + }, + { + "icon": "📈", + "title": "Observability", + "desc": "Centralized collection of metrics, logs and traces across the entire platform." + } + ], "k8s": { - "title": "Built on Kubernetes", - "desc": "Running on any Kubernetes distribution (RKE, EKS, AKS, GKE) with comprehensive security, observability, and resource management.", - "features": [ - "Security & RBAC", - "TLS/Certificates", - "SSO & LDAP", - "Monitoring", - "Backup & DRP", - "Load Balancing", - "Ingress Control", - "Resource Scheduling" - ] + "title": "Kubernetes Foundation", + "desc": "Kubernetes cluster required." }, - "outro": "Each component can be deployed independently, allowing you to build a customized data platform that meets your specific needs." + "outro": "" }, "roadmap": { "title": "Roadmap", - "y2026": { - "title": "2026: Evolution & Scale", - "items": [ + "teaser": "First release v1.0.0 planned for June 2026.", + "cta": "View the full roadmap" + }, + "community": { + "title": "Join Our Community", + "subtitle": "OKDP is built by the community, for the community. Join us in shaping the future of open-source data platforms.", + "meeting": { + "title": "Weekly Technical Meeting", + "desc": "Every Wednesday at 10:00 AM (CET) - Contact us to receive the meeting details.", + "cta": "Contact Us to Join" + }, + "contribute": { + "title": "Call for Contributions", + "desc": "Help us build the Open Kubernetes Data Platform. Whether you enjoy infrastructure, data engineering, or docs, there is room for you.", + "cta": "Contribute on GitHub" + } + }, + "tosit": { + "title": "About TOSIT", + "desc1": "OKDP is a project initiated by DGFiP, joined by Orange and other organizations, within the TOSIT association (The Open Source I Trust). The goal is to provide a sovereign, powerful, and fully open-source data & AI technology stack accessible to all.", + "desc2": "The association brings together numerous companies and administrations, including BPCE (Banque Populaire, Caisse d'Epargne et Natixis), Société Générale, among others. It also hosts the TDP project, initiated by DGFiP and EDF.", + "desc3": "Participation in TOSIT projects is open to all." + }, + "footer": { + "copyright": "© 2026 TOSIT — The Open Source I Trust.", + "license": "Crafted by the community • Licensed under Apache License v2.0" + }, + "roadmapPage": { + "meta": { + "title": "Roadmap — OKDP | Open Kubernetes Data Platform", + "description": "Track the content, priorities and progress of the OKDP platform by version." + }, + "title": "OKDP Roadmap", + "subtitle": "Track the content, priorities and progress by version.", + "legend": { + "title": "Status legend", + "complete": "Complete — delivered, tested and usable", + "inProgress": "In progress — active development or integration", + "todo": "To do — identified, but not started for this version" + }, + "v1": { + "title": "v1.0.0", + "date": "June 2026", + "modulesTitle": "Data & AI Modules", + "modulesSubtitle": "A catalog of reference open source tools. Usable individually or combined, without depending on the OKDP Control Plane (UI/Server).", + "categories": [ { - "icon": "🔨", - "title": "Technology Builds", - "badge": "Ongoing", - "badgeColor": "bg-blue-100", - "badgeTextColor": "text-blue-800", - "borderColor": "border-blue-500", - "desc": "Continuous building of source code and Docker images for all platform technologies." + "title": "Lakehouse & Analytics", + "items": [ + { + "name": "Apache Spark", + "status": "complete", + "features": [ + { "text": "Dedicated Helm chart for Spark History Server", "status": "complete" }, + { "text": "Dedicated authentication plugin (Spark Auth Proxy)", "status": "complete" }, + { "text": "Spark Web Proxy extension (real-time job UI access)", "status": "complete" }, + { "text": "Spark Docker images with automated build pipeline", "status": "complete" } + ] + }, + { + "name": "Trino", + "status": "inProgress", + "features": [ + { "text": "Community Images & Helm Charts", "status": "complete" }, + { "text": "OIDC Authentication", "status": "complete" }, + { "text": "Polaris Catalog integration (Lakehouse connectivity)", "status": "inProgress" }, + { "text": "Fine-grained authorization via OPA (Open Policy Agent)", "status": "inProgress" } + ] + }, + { + "name": "Polaris Catalog (Apache Iceberg)", + "status": "inProgress", + "features": [ + { "text": "Community Images & Helm Charts", "status": "complete" }, + { "text": "Full integration with Trino", "status": "complete" }, + { "text": "Native OIDC authentication", "status": "complete" }, + { "text": "S3 Integration & Connectivity (STS)", "status": "complete" }, + { "text": "Identity propagation from Trino to Polaris", "status": "inProgress" }, + { "text": "Fine-grained OPA integration (Open Policy Agent)", "status": "inProgress" }, + { "text": "Make STS support optional (infrastructure flexibility)", "status": "todo" } + ] + } + ] }, { - "icon": "🧊", - "title": "Apache Polaris & Iceberg", - "badge": "Q1-Q2", - "badgeColor": "bg-yellow-100", - "badgeTextColor": "text-yellow-800", - "borderColor": "border-yellow-500", - "desc": "Integration of Apache Iceberg and Polaris catalog with STS S3 support and RBAC." + "title": "Visualization & BI", + "items": [ + { + "name": "Apache Superset", + "status": "inProgress", + "features": [ + { "text": "Community Images & Helm Charts", "status": "complete" }, + { "text": "OIDC Authentication", "status": "complete" }, + { "text": "JWT token propagation or Impersonation (Trino Auth)", "status": "inProgress" } + ] + } + ] }, { - "icon": "\uD83D\uDCBB", - "title": "New Frontend & Server", - "badge": "Q2-Q3", - "badgeColor": "bg-yellow-100", - "badgeTextColor": "text-yellow-800", - "borderColor": "border-yellow-500", - "desc": "Overhaul of the user interface and server for a unified and high-performance experience." + "title": "Orchestration & Governance", + "items": [ + { + "name": "Apache Airflow", + "status": "inProgress", + "features": [ + { "text": "Community Images & Helm Charts", "status": "complete" }, + { "text": "OIDC Authentication", "status": "inProgress" } + ] + } + ] }, { - "icon": "🔄", - "title": "Apache Airflow", - "badge": "Q3-Q4", - "badgeColor": "bg-yellow-100", - "badgeTextColor": "text-yellow-800", - "borderColor": "border-yellow-500", - "desc": "Implementation of Apache Airflow for workflow automation and orchestration." + "title": "Data Science", + "items": [ + { + "name": "JupyterHub / JupyterLab", + "status": "complete", + "features": [ + { "text": "Community Images & Helm Charts", "status": "complete" }, + { "text": "Helm Values tuning", "status": "complete" }, + { "text": "OKDP-optimized Docker images for JupyterLab environments", "status": "complete" }, + { "text": "Community images (Hub, Proxy, Culler)", "status": "complete" } + ] + } + ] } - ] - }, - "themes": { - "title": "Cross-Cutting Themes", - "items": [ + ], + "controlPlaneTitle": "Control Plane / Platform", + "controlPlaneSubtitle": "OKDP's automation layer: orchestration, multi-tenant isolation, and developer experience (DX) for a turnkey experience across the entire stack.", + "controlPlane": [ { - "icon": "🔒", - "title": "Security", - "desc": "End-to-end OIDC authentication" + "title": "Admin Console", + "features": [ + { "text": "Global project management (UI/Backend)", "status": "complete" }, + { "text": "Target Kubernetes cluster configuration", "status": "complete" }, + { "text": "Local users and groups management (via Kubauth)", "status": "complete" }, + { "text": "Project membership management", "status": "inProgress" } + ] }, { - "icon": "⚖️", - "title": "Resources", - "desc": "Queue management system" + "title": "Project Console", + "features": [ + { "text": "Isolated spaces creation via Project CRD (basic RBAC)", "status": "complete" }, + { "text": "JupyterHub environment provisioning", "status": "complete" }, + { "text": "Spark History Server instance deployment", "status": "complete" }, + { "text": "Project Secrets management (Vault via token only)", "status": "complete" }, + { "text": "Application submission via Spark Operator (UI and kubectl)", "status": "inProgress" }, + { "text": "Running jobs listing and monitoring", "status": "todo" }, + { "text": "Control Plane integration: Trino, Superset, Polaris and Airflow", "status": "todo" } + ] }, { - "icon": "🤖", - "title": "MLOps", - "desc": "Kubeflow & MLflow" + "title": "Test Sandbox", + "features": [ + { "text": "Local sandbox (Kind + Flux) with legacy components", "status": "complete" }, + { "text": "Sandbox Object Storage (SeaweedFS)", "status": "complete" }, + { "text": "Ingress / API Gateway migration", "status": "inProgress" }, + { "text": "New okdp-server & okdp-ui versions", "status": "todo" }, + { "text": "New okdp-operator component", "status": "todo" } + ] }, { - "icon": "📊", - "title": "Observability", - "desc": "Logs, monitoring, audit" + "title": "Installation & Guides", + "features": [ + { "text": "Demo Application: End-to-end use case (Ingestion, Spark & Airflow)", "status": "complete" }, + { "text": "Control Plane Helm chart (okdp-platform)", "status": "todo" }, + { "text": "Admin Guide: Platform Deployment & Configuration", "status": "todo" }, + { "text": "User Guide: Module & service usage via console", "status": "todo" } + ] } ] }, - "previous": { - "title": "2024-25: Foundation", - "label": "2024 Roadmap", - "expand": "View previous milestones", - "items": [ + "future": { + "title": "Future Evolutions", + "subtitle": "Themes and modules identified to enrich the platform after the v1.0.0 release.", + "modules": [ { - "time": "Q1-Q2 2024 ✓", - "title": "Initial Data Technologies", - "desc": "Successfully integrated core data technologies: JupyterHub, Apache Spark, Trino, Hive Metastore, and Superset." + "title": "AI & MLOps", + "features": [ + { "text": "Kubeflow — Initial integration (Core components)", "status": "inProgress" }, + { "text": "MLflow — Lifecycle & Experiment Tracking", "status": "todo" }, + { "text": "LLM Serving — Language model inference (vLLM, TGI)", "status": "todo" } + ] }, { - "time": "Q3 2024 ✓", - "title": "Spark & Jupyter Images", - "desc": "Provision and support of official base images for Apache Spark and JupyterLab." - }, + "title": "Ingestion, Streaming & Governance", + "features": [ + { "text": "Apache NiFi — Connectivity & ETL Ingestion", "status": "todo" }, + { "text": "Apache Kafka — Messaging & Event Streaming", "status": "todo" }, + { "text": "Apache Flink — Real-time Processing", "status": "todo" }, + { "text": "OpenMetadata — Discovery & Global Cataloging", "status": "todo" } + ] + } + ], + "controlPlaneTitle": "Control Plane / Platform", + "controlPlaneSubtitle": "", + "controlPlane": [ { - "time": "Q3 2024 ✓", - "title": "OKDP Server/UI", - "desc": "Published the first version of OKDP Server and user interface for platform management." + "title": "Platform", + "features": [ + { "text": "Platform RBAC — Fine-grained permission management", "status": "todo" }, + { "text": "Generic Service Catalog — Self-service interface for deploying custom extra services", "status": "todo" }, + { "text": "Quota Management — Fine-grained Kubernetes resource management", "status": "todo" }, + { "text": "Marketplace — Expose custom modules or components", "status": "todo" } + ] }, { - "time": "Q4 2024 ✓", - "title": "Sandbox & Documentation", - "desc": "Released comprehensive sandbox environment with user guide and end-to-end test application." + "title": "Observability & Deployment", + "features": [ + { "text": "Platform Health — Centralized module metrics & logs collection", "status": "todo" }, + { "text": "Full GitOps Mode — Support for full GitOps deployment mode", "status": "todo" } + ] } ] } - }, - "community": { - "title": "Join Our Community", - "subtitle": "OKDP is built by the community, for the community. Join us in shaping the future of open-source data platforms.", - "meeting": { - "title": "Weekly Technical Meeting", - "desc": "Every Wednesday at 10:00 AM (CET) - Contact us to receive the meeting details.", - "cta": "Contact Us to Join" - }, - "contribute": { - "title": "Call for Contributions", - "desc": "Help us build the Open Kubernetes Data Platform. Whether you enjoy infrastructure, data engineering, or docs, there is room for you.", - "cta": "Contribute on GitHub" - } - }, - "tosit": { - "title": "About TOSIT", - "desc1": "TOSIT is an association that promotes community-driven initiatives to create truly open-source technologies and platforms. It hosts the TDP project, which was initiated by DGFiP and EDF.", - "desc2": "Since January 2024, DGFiP started the OKDP adventure, which was later joined by Orange. The association brings together numerous companies and administrations including BPCE (Banque Populaire, Caisse d'Epargne et Natixis), Société Générale, among others.", - "desc3": "Participation in TOSIT projects is open to all, with the aim of ensuring that the technology stack is accessible, efficient, and powerful for everyone." - }, - "footer": { - "copyright": "© 2026 TOSIT — The Open Source I Trust.", - "license": "Crafted by the community • Licensed under Apache License v2.0" } } \ No newline at end of file diff --git a/src/locales/fr.json b/src/locales/fr.json index c145607..bf18f74 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -64,160 +64,318 @@ }, "architecture": { "title": "Architecture Modulaire", - "subtitle": "OKDP offre une architecture modulaire vous permettant de sélectionner et déployer uniquement les composants nécessaires à votre cas d'usage.", - "query": { - "title": "Moteur de Requêtes", - "desc": "Moteurs SQL haute performance pour données distribuées." - }, - "ml": { - "title": "IA & Machine Learning", - "desc": "Plateforme MLOps complète pour les workflows de data science." - }, - "processing": { - "title": "Traitement & Orchestration", - "desc": "Moteurs de traitement de données et orchestration de workflows." - }, - "storage": { - "title": "Stockage & Catalogue", - "desc": "Lakehouse moderne avec tables transactionnelles et gestion des métadonnées." - }, - "viz": { - "title": "Visualisation & Base de données" - }, + "subtitle": "L'architecture d'OKDP est articulée autour de deux couches majeures : un écosystème de Modules Data & IA de référence et un Control Plane unifié.", + "modulesTitle": "Modules Data & IA", + "modulesSubtitle": "Un catalogue d'outils open source de référence. Utilisables unitairement ou combinés, sans dépendre du Control Plane OKDP.", + "modules": [ + { + "icon": "⚡", + "title": "Ingestion & Streaming", + "desc": "Connectivité, ingestion ETL et traitement temps réel.", + "tools": [ + { "name": "Apache NiFi", "logo": "logos/nifi.svg", "url": "https://nifi.apache.org/" }, + { "name": "Apache Kafka", "logo": "logos/kafka.svg", "url": "https://kafka.apache.org/" }, + { "name": "Apache Flink", "logo": "logos/flink.svg", "url": "https://flink.apache.org/" } + ], + "future": true + }, + { + "icon": "🚀", + "title": "Lakehouse & Analytics", + "desc": "Moteurs SQL haute performance et lakehouse moderne.", + "tools": [ + { "name": "Apache Spark", "logo": "logos/spark.svg", "url": "https://spark.apache.org/" }, + { "name": "Trino", "logo": "logos/trino.svg", "url": "https://trino.io/" }, + { "name": "Polaris Catalog", "logo": "logos/polaris.svg", "url": "https://polaris.apache.org/", "invertLogo": true } + ], + "future": false + }, + { + "icon": "🧪", + "title": "Data Science", + "desc": "Environnements interactifs pour l'exploration et l'analyse.", + "tools": [ + { "name": "JupyterLab", "logo": "logos/jupyter.svg", "url": "https://jupyter.org/" } + ], + "future": false + }, + { + "icon": "🤖", + "title": "IA & MLOps", + "desc": "Plateforme MLOps et inférence de modèles de langage.", + "tools": [ + { "name": "Kubeflow", "logo": "logos/kubeflow.svg", "url": "https://kubeflow.org/" }, + { "name": "MLflow", "logo": "logos/mlflow.svg", "url": "https://mlflow.org/" }, + { "name": "LLM Serving", "logo": "", "url": "" } + ], + "future": true + }, + { + "icon": "📊", + "title": "Visualisation & BI", + "desc": "Tableaux de bord et exploration visuelle des données.", + "tools": [ + { "name": "Apache Superset", "logo": "logos/superset.svg", "url": "https://superset.apache.org/" } + ], + "future": false + }, + { + "icon": "⚙️", + "title": "Orchestration & Gouvernance", + "desc": "Automatisation des workflows et catalogage des métadonnées.", + "tools": [ + { "name": "Apache Airflow", "logo": "logos/airflow.svg", "url": "https://airflow.apache.org/" }, + { "name": "OpenMetadata", "logo": "", "url": "https://open-metadata.org/" } + ], + "future": false + } + ], + "controlPlaneTitle": "OKDP Control Plane", + "controlPlaneSubtitle": "La couche d'automatisation d'OKDP : orchestration, isolation multi-tenant et gouvernance pour une utilisation clé en main de toute la stack.", + "controlPlane": [ + { + "icon": "🖥️", + "title": "Server / UI / CLI", + "desc": "Portail Web et interfaces unifiées pour les administrateurs et les utilisateurs." + }, + { + "icon": "🗂️", + "title": "Project & Quota Management", + "desc": "Isolation multi-tenant sécurisée et gestion des limites de ressources par projet." + }, + { + "icon": "🔒", + "title": "Auth & Secrets Management", + "desc": "Authentification OIDC de bout en bout et gestion sécurisée des secrets et du RBAC." + }, + { + "icon": "📈", + "title": "Observability", + "desc": "Collecte centralisée des métriques, logs et traces pour l'ensemble de la plateforme." + } + ], "k8s": { "title": "Fondation Kubernetes", - "desc": "Compatible avec toutes les distributions Kubernetes (RKE, EKS, AKS, GKE) avec gestion intégrée de la sécurité, de l'observabilité et des ressources.", - "features": [ - "Sécurité & RBAC", - "TLS/Certificats", - "SSO & LDAP", - "Monitoring", - "Backup & DRP", - "Load Balancing", - "Contrôle Ingress", - "Ordonnancement" - ] + "desc": "Cluster Kubernetes requis." }, - "outro": "Chaque composant peut être déployé indépendamment, vous permettant de construire une plateforme de données sur mesure." + "outro": "" }, "roadmap": { "title": "Roadmap", - "y2026": { - "title": "2026 : Évolution & Échelle", - "items": [ + "teaser": "Première release v1.0.0 prévue pour Juin 2026.", + "cta": "Consulter la roadmap complète" + }, + "community": { + "title": "Rejoignez la communauté", + "subtitle": "OKDP est construit par la communauté, pour la communauté. Participez à l'avenir des plateformes de données open source.", + "meeting": { + "title": "Réunion Technique Hebdomadaire", + "desc": "Tous les mercredis à 10h00 (CET) - Contactez-nous pour recevoir les détails.", + "cta": "Nous contacter pour participer" + }, + "contribute": { + "title": "Appel à contribution", + "desc": "Aidez-nous à construire la plateforme. Que vous soyez expert en infrastructure, data engineering ou documentation, vous avez votre place.", + "cta": "Contribuer sur GitHub" + } + }, + "tosit": { + "title": "À propos de TOSIT", + "desc1": "OKDP est un projet initié par la DGFiP, rejoint par Orange et d'autres entreprises, au sein de l'association TOSIT (The Open Source I Trust). L'objectif est de garantir une stack technologique data & IA souveraine, puissante, accessible à tous et sous licence libre.", + "desc2": "L'association rassemble de nombreuses entreprises et administrations, dont BPCE (Banque Populaire, Caisse d'Epargne et Natixis), Société Générale, entre autres. Elle héberge également le projet TDP, initié par la DGFiP et EDF.", + "desc3": "La participation aux projets TOSIT est ouverte à tous." + }, + "footer": { + "copyright": "© 2026 TOSIT — The Open Source I Trust.", + "license": "Façonné par la communauté • Sous licence Apache V2.0" + }, + "roadmapPage": { + "meta": { + "title": "Roadmap — OKDP | Open Kubernetes Data Platform", + "description": "Suivi du contenu, des priorités et de l'avancement de la plateforme OKDP par version." + }, + "title": "Roadmap OKDP", + "subtitle": "Suivi du contenu, des priorités et de l'avancement par version.", + "legend": { + "title": "Légende des statuts", + "complete": "Complet — livré, testé et utilisable", + "inProgress": "En cours — développement ou intégration active", + "todo": "À faire — identifié, mais non démarré pour cette version" + }, + "v1": { + "title": "v1.0.0", + "date": "Juin 2026", + "modulesTitle": "Modules Data & IA", + "modulesSubtitle": "Un catalogue d'outils open source de référence. Utilisables unitairement ou combinés, sans dépendre du Control Plane OKDP (UI/Server).", + "categories": [ { - "icon": "🔨", - "title": "Construction Technologique", - "badge": "Continu", - "badgeColor": "bg-blue-100", - "badgeTextColor": "text-blue-800", - "borderColor": "border-blue-500", - "desc": "Construction continue du code source et des images Docker pour l'ensemble des technologies de la plateforme." + "title": "Lakehouse & Analytics", + "items": [ + { + "name": "Apache Spark", + "status": "complete", + "features": [ + { "text": "Fourniture d'une chart Helm propre pour le Spark History Server", "status": "complete" }, + { "text": "Plugin d'authentification dédié (Spark Auth Proxy)", "status": "complete" }, + { "text": "Extension Spark Web Proxy (accès UI jobs en temps réel)", "status": "complete" }, + { "text": "Images Docker Spark avec usine de build automatisée", "status": "complete" } + ] + }, + { + "name": "Trino", + "status": "inProgress", + "features": [ + { "text": "Utilisation des Images & Charts Helm communautaires", "status": "complete" }, + { "text": "Authentification OIDC", "status": "complete" }, + { "text": "Intégration à Polaris Catalog (Lakehouse connectivity)", "status": "inProgress" }, + { "text": "Autorisation fine via OPA (Open Policy Agent)", "status": "inProgress" } + ] + }, + { + "name": "Polaris Catalog (Apache Iceberg)", + "status": "inProgress", + "features": [ + { "text": "Utilisation des Images & Charts Helm communautaires", "status": "complete" }, + { "text": "Intégration complète avec Trino", "status": "complete" }, + { "text": "Authentification OIDC native", "status": "complete" }, + { "text": "Intégration & Connectivité S3 (STS)", "status": "complete" }, + { "text": "Propagation d'identité depuis Trino vers Polaris", "status": "inProgress" }, + { "text": "Intégration fine avec OPA (Open Policy Agent)", "status": "inProgress" }, + { "text": "Rendre le support STS optionnel (flexibilité infrastructure)", "status": "todo" } + ] + } + ] }, { - "icon": "🧊", - "title": "Apache Polaris & Iceberg", - "badge": "T1-T2", - "badgeColor": "bg-yellow-100", - "badgeTextColor": "text-yellow-800", - "borderColor": "border-yellow-500", - "desc": "Intégration d'Apache Iceberg et du catalogue Polaris avec support STS S3 et RBAC." + "title": "Visualisation & BI", + "items": [ + { + "name": "Apache Superset", + "status": "inProgress", + "features": [ + { "text": "Utilisation des Images & Charts Helm communautaires", "status": "complete" }, + { "text": "Authentification OIDC", "status": "complete" }, + { "text": "Propagation de token JWT ou Impersonification (Trino Auth)", "status": "inProgress" } + ] + } + ] }, { - "icon": "\uD83D\uDCBB", - "title": "Nouvelle Interface & Serveur", - "badge": "T2-T3", - "badgeColor": "bg-yellow-100", - "badgeTextColor": "text-yellow-800", - "borderColor": "border-yellow-500", - "desc": "Refonte de l'interface utilisateur et du serveur pour une expérience unifiée et performante." + "title": "Orchestration & Gouvernance", + "items": [ + { + "name": "Apache Airflow", + "status": "inProgress", + "features": [ + { "text": "Utilisation des Images & Charts Helm communautaires", "status": "complete" }, + { "text": "Authentification OIDC", "status": "inProgress" } + ] + } + ] }, { - "icon": "🔄", - "title": "Apache Airflow", - "badge": "T3-T4", - "badgeColor": "bg-yellow-100", - "badgeTextColor": "text-yellow-800", - "borderColor": "border-yellow-500", - "desc": "Implémentation d'Apache Airflow pour l'automatisation et l'orchestration des workflows." + "title": "Data Science", + "items": [ + { + "name": "JupyterHub / JupyterLab", + "status": "complete", + "features": [ + { "text": "Utilisation des Images & Charts Helm communautaires", "status": "complete" }, + { "text": "Tuning des Helm Values", "status": "complete" }, + { "text": "Images Docker OKDP optimisées pour les environnements JupyterLab", "status": "complete" }, + { "text": "Images communautaires (Hub, Proxy, Culler)", "status": "complete" } + ] + } + ] } - ] - }, - "themes": { - "title": "Thèmes Traverses", - "items": [ + ], + "controlPlaneTitle": "Control Plane / Plateforme", + "controlPlaneSubtitle": "La couche d'automatisation d'OKDP : orchestration, isolation multi-tenant et expérience utilisateur (DX) pour une utilisation clé en main de toute la stack.", + "controlPlane": [ { - "icon": "🔒", - "title": "Sécurité", - "desc": "Authentification OIDC de bout en bout" + "title": "Admin Console", + "features": [ + { "text": "Gestion globale des projets (UI/Backend)", "status": "complete" }, + { "text": "Configuration des clusters Kubernetes \"target\"", "status": "complete" }, + { "text": "Gestion des utilisateurs et groupes locaux (via Kubauth)", "status": "complete" }, + { "text": "Gestion du membership des projets", "status": "inProgress" } + ] }, { - "icon": "⚖️", - "title": "Ressources", - "desc": "Système de gestion de files d'attente" + "title": "Project Console", + "features": [ + { "text": "Création d'espaces isolés via CRD Project (RBAC de base)", "status": "complete" }, + { "text": "Instanciation d'environnements JupyterHub", "status": "complete" }, + { "text": "Déploiement d'instances Spark History Server", "status": "complete" }, + { "text": "Gestion des Secrets projets (Vault via token seulement)", "status": "complete" }, + { "text": "Soumission d'applications via Spark Operator (UI et kubectl)", "status": "inProgress" }, + { "text": "Listing et monitoring des jobs en cours d'exécution", "status": "todo" }, + { "text": "Intégration Control Plane : Trino, Superset, Polaris et Airflow", "status": "todo" } + ] }, { - "icon": "🤖", - "title": "MLOps", - "desc": "Kubeflow & MLflow" + "title": "Test Sandbox", + "features": [ + { "text": "Sandbox locale (Kind + Flux) avec composants legacy", "status": "complete" }, + { "text": "Sandbox Object Storage (SeaweedFS)", "status": "complete" }, + { "text": "Migration Ingress / API Gateway", "status": "inProgress" }, + { "text": "Nouvelles versions okdp-server & okdp-ui", "status": "todo" }, + { "text": "Nouveau composant okdp-operator", "status": "todo" } + ] }, { - "icon": "📊", - "title": "Observabilité", - "desc": "Logs, monitoring, audit" + "title": "Installation & Guides", + "features": [ + { "text": "Application Démo : Cas d'usage de bout en bout (Ingestion, Spark & Airflow)", "status": "complete" }, + { "text": "Chart Helm d'installation du Control Plane (okdp-platform)", "status": "todo" }, + { "text": "Admin Guide : Déploiement & Configuration plateforme", "status": "todo" }, + { "text": "User Guide : Utilisation des modules & services via la console", "status": "todo" } + ] } ] }, - "previous": { - "title": "2024-25 : Fondation", - "label": "Roadmap 2024", - "expand": "Voir les jalons précédents", - "items": [ + "future": { + "title": "Évolutions futures", + "subtitle": "Thématiques et modules identifiés pour enrichir la plateforme après la sortie de la v1.0.0.", + "modules": [ { - "time": "T1-T2 2024 ✓", - "title": "Technologies Data Initiales", - "desc": "Intégration réussie des technologies cœur : JupyterHub, Apache Spark, Trino, Hive Metastore et Superset." + "title": "IA & MLOps", + "features": [ + { "text": "Kubeflow — Intégration initiale (Core components)", "status": "inProgress" }, + { "text": "MLflow — Lifecycle & Experiment Tracking", "status": "todo" }, + { "text": "LLM Serving — Inférence de modèles de langage (vLLM, TGI)", "status": "todo" } + ] }, { - "time": "T3 2024 ✓", - "title": "Images Spark & Jupyter", - "desc": "Fourniture et support des images de base officielles pour Apache Spark et JupyterLab." - }, + "title": "Ingestion, Streaming & Gouvernance", + "features": [ + { "text": "Apache NiFi — Connectivité & Ingestion ETL", "status": "todo" }, + { "text": "Apache Kafka — Messaging & Event Streaming", "status": "todo" }, + { "text": "Apache Flink — Real-time Processing", "status": "todo" }, + { "text": "OpenMetadata — Discovery & Cataloging global", "status": "todo" } + ] + } + ], + "controlPlaneTitle": "Control Plane / Plateforme", + "controlPlaneSubtitle": "", + "controlPlane": [ { - "time": "T3 2024 ✓", - "title": "OKDP Serveur/UI", - "desc": "Publication de la première version d'OKDP Serveur et de l'interface utilisateur de gestion." + "title": "Plateforme", + "features": [ + { "text": "RBAC Plateforme — Gestion fine des permissions", "status": "todo" }, + { "text": "Catalogue de services générique — Interface self-service pour déployer des services extra personnalisés", "status": "todo" }, + { "text": "Quota Management — Pilotage fin des ressources Kubernetes", "status": "todo" }, + { "text": "Marketplace — Possibilité d'exposer des modules ou composants personnalisés", "status": "todo" } + ] }, { - "time": "T4 2024 ✓", - "title": "Sandbox & Documentation", - "desc": "Lancement d'un environnement sandbox complet avec guide utilisateur et application de test de bout en bout." + "title": "Observabilité & Déploiement", + "features": [ + { "text": "Platform Health — Collecte centralisée des métriques & logs des modules", "status": "todo" }, + { "text": "Full GitOps Mode — Support du mode de déploiement full GitOps", "status": "todo" } + ] } ] } - }, - "community": { - "title": "Rejoignez la communauté", - "subtitle": "OKDP est construit par la communauté, pour la communauté. Participez à l'avenir des plateformes de données open source.", - "meeting": { - "title": "Réunion Technique Hebdomadaire", - "desc": "Tous les mercredis à 10h00 (CET) - Contactez-nous pour recevoir les détails.", - "cta": "Nous contacter pour participer" - }, - "contribute": { - "title": "Appel à contribution", - "desc": "Aidez-nous à construire la plateforme. Que vous soyez expert en infrastructure, data engineering ou documentation, vous avez votre place.", - "cta": "Contribuer sur GitHub" - } - }, - "tosit": { - "title": "À propos de TOSIT", - "desc1": "TOSIT est une association qui promeut les initiatives communautaires pour créer des technologies et plateformes véritablement open source. Elle héberge le projet TDP, initié par la DGFiP et EDF.", - "desc2": "Depuis janvier 2024, la DGFiP a lancé l'aventure OKDP, rejointe par la suite par Orange. L'association rassemble de nombreuses entreprises et administrations, dont BPCE (Banque Populaire, Caisse d'Epargne et Natixis), Société Générale, entre autres.", - "desc3": "La participation aux projets TOSIT est ouverte à tous, avec pour objectif de garantir une stack technologique accessible, performante et puissante pour tous." - }, - "footer": { - "copyright": "© 2026 TOSIT — The Open Source I Trust.", - "license": "Façonné par la communauté • Sous licence Apache V2.0" } } \ No newline at end of file diff --git a/src/partials/footer.html b/src/partials/footer.html new file mode 100644 index 0000000..003341a --- /dev/null +++ b/src/partials/footer.html @@ -0,0 +1,12 @@ + + diff --git a/src/partials/header.html b/src/partials/header.html new file mode 100644 index 0000000..ac72d94 --- /dev/null +++ b/src/partials/header.html @@ -0,0 +1,92 @@ + +
+
+ + + +
+
diff --git a/src/partials/scripts.html b/src/partials/scripts.html new file mode 100644 index 0000000..1cb1bee --- /dev/null +++ b/src/partials/scripts.html @@ -0,0 +1,75 @@ + diff --git a/src/roadmap-template.html b/src/roadmap-template.html new file mode 100644 index 0000000..72e0d92 --- /dev/null +++ b/src/roadmap-template.html @@ -0,0 +1,245 @@ + + + + + + + + + + + + {{ roadmapPage.meta.title }} + + + + +
+ {{> header }} + +
+ +
+
+
+

{{ roadmapPage.title }}

+

{{ roadmapPage.subtitle }}

+
+
+ + {{ roadmapPage.legend.complete }} +
+
+ + {{ roadmapPage.legend.inProgress }} +
+
+ + {{ roadmapPage.legend.todo }} +
+
+
+
+
+ + +
+
+
+
+

{{ roadmapPage.v1.title }}

+ {{ roadmapPage.v1.date }} +
+ + +
+

{{ roadmapPage.v1.modulesTitle }}

+

{{ roadmapPage.v1.modulesSubtitle }}

+ + {{#each roadmapPage.v1.categories}} +
+

{{ title }}

+ {{#each items}} +
+
+
{{ name }}
+ {{#if (eq status 'complete')}} + + {{/if}} + {{#if (eq status 'inProgress')}} + + {{/if}} + {{#if (eq status 'todo')}} + + {{/if}} +
+
    + {{#each features}} +
  • + {{#if (eq status 'complete')}} + + {{/if}} + {{#if (eq status 'inProgress')}} + + {{/if}} + {{#if (eq status 'todo')}} + + {{/if}} + {{ text }} +
  • + {{/each}} +
+
+ {{/each}} +
+ {{/each}} +
+ + +
+

{{ roadmapPage.v1.controlPlaneTitle }}

+

{{ roadmapPage.v1.controlPlaneSubtitle }}

+ +
+ {{#each roadmapPage.v1.controlPlane}} +
+
+

{{ title }}

+ {{#if (eq (computeStatus features) 'complete')}} + + {{/if}} + {{#if (eq (computeStatus features) 'inProgress')}} + + {{/if}} + {{#if (eq (computeStatus features) 'todo')}} + + {{/if}} +
+
    + {{#each features}} +
  • + {{#if (eq status 'complete')}} + + {{/if}} + {{#if (eq status 'inProgress')}} + + {{/if}} + {{#if (eq status 'todo')}} + + {{/if}} + {{ text }} +
  • + {{/each}} +
+
+ {{/each}} +
+
+
+
+
+ + +

+ + +
+
+
+

{{ roadmapPage.future.title }}

+

{{ roadmapPage.future.subtitle }}

+ + +
+

{{ roadmapPage.v1.modulesTitle }}

+ +
+ {{#each roadmapPage.future.modules}} +
+
+

{{ title }}

+ {{#if (eq (computeStatus features) 'complete')}} + + {{/if}} + {{#if (eq (computeStatus features) 'inProgress')}} + + {{/if}} + {{#if (eq (computeStatus features) 'todo')}} + + {{/if}} +
+
    + {{#each features}} +
  • + {{#if (eq status 'complete')}} + + {{/if}} + {{#if (eq status 'inProgress')}} + + {{/if}} + {{#if (eq status 'todo')}} + + {{/if}} + {{ text }} +
  • + {{/each}} +
+
+ {{/each}} +
+
+ + +
+

{{ roadmapPage.future.controlPlaneTitle }}

+ +
+ {{#each roadmapPage.future.controlPlane}} +
+
+

{{ title }}

+ {{#if (eq (computeStatus features) 'complete')}} + + {{/if}} + {{#if (eq (computeStatus features) 'inProgress')}} + + {{/if}} + {{#if (eq (computeStatus features) 'todo')}} + + {{/if}} +
+
    + {{#each features}} +
  • + {{#if (eq status 'complete')}} + + {{/if}} + {{#if (eq status 'inProgress')}} + + {{/if}} + {{#if (eq status 'todo')}} + + {{/if}} + {{ text }} +
  • + {{/each}} +
+
+ {{/each}} +
+
+
+
+
+ +
+ + {{> footer }} +
+ + {{> scripts }} + + + \ No newline at end of file diff --git a/src/template.html b/src/template.html index c61a213..b42b933 100644 --- a/src/template.html +++ b/src/template.html @@ -3,7 +3,7 @@ - +
- -
- -
+ {{> header }}
@@ -151,7 +60,6 @@

{{ hero.title }}

-

{{ about.title }}

@@ -162,7 +70,6 @@

{{ about.title }}

-

{{ why.title }}

@@ -180,224 +87,76 @@

{{ title }}

-
+
-

{{ architecture.title }}

-

{{ - architecture.subtitle }}

- -
- - -
-

{{ architecture.query.title - }}

-

- {{ architecture.query.desc }} -

-
- - Trino - -
+

{{ architecture.title }}

+

{{ architecture.subtitle }}

+ + +
+
+

{{ architecture.modulesTitle }}

+

{{ architecture.modulesSubtitle }}

- - -
-

{{ architecture.ml.title }} -

-

- {{ architecture.ml.desc }} -

- -
- - -
-

{{ - architecture.processing.title }}

-

- {{ architecture.processing.desc }} -

- -
- - -
-

{{ - architecture.storage.title }}

-

- {{ architecture.storage.desc }} -

- -
-
- - -
-

{{ architecture.viz.title }}

-
- -
- Superset + - -
-

{{ architecture.k8s.title }}

-

- {{ architecture.k8s.desc }} -

-
- {{#each architecture.k8s.features}} - {{ this }} + +
+
+

{{ architecture.controlPlaneTitle }}

+

{{ architecture.controlPlaneSubtitle }}

+
+
+ {{#each architecture.controlPlane}} +
+ {{ icon }} +

{{ title }}

+

{{ desc }}

+
{{/each}}
-

{{ architecture.outro }}

+

{{ architecture.k8s.desc }}

- +
-
-

{{ roadmap.title }}

-
- -
- -
-

{{ roadmap.y2026.title }}

- -
- {{#each roadmap.y2026.items}} -
-
- {{ icon }} -

{{ title }}

- {{ - badge }} -
-

{{ desc }}

-
- {{/each}} -
- - -
-

{{ roadmap.themes.title }}

-
- {{#each roadmap.themes.items}} -
-
{{ icon }}
-
{{ title }}
-

{{ desc }}

-
- {{/each}} -
-
-
- - -
- -
- {{ roadmap.previous.title }} - - - -
- {{ roadmap.previous.expand }} -
- -
- {{#each roadmap.previous.items}} -
- -

{{ title }}

-

{{ desc }}

-
- {{/each}} -
-
+
+

{{ roadmap.title }}

+

{{{ roadmap.teaser }}}

+ + {{ roadmap.cta }} + + + +
@@ -506,112 +265,25 @@

{{ community.contribute.title }}

class="btn btn-primary text-sm px-4 py-2">{{ community.contribute.cta }}
- - - - -
-
-
-

{{ tosit.title }}

-

{{{ tosit.desc1 }}}

-

{{{ tosit.desc2 }}}

-

{{ tosit.desc3 }}

-
-
-
- + - - - - - + {{> scripts }} \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js index 076bc4f..cd6097c 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -2,7 +2,7 @@ const defaultTheme = require("tailwindcss/defaultTheme"); /** @type {import('tailwindcss').Config} */ module.exports = { - content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + content: ["./index.html", "./en/**/*.html", "./roadmap/**/*.html", "./src/**/*.{html,js,ts,jsx,tsx}"], theme: { extend: { colors: { diff --git a/vite.config.js b/vite.config.js index fbc5c72..17fc986 100644 --- a/vite.config.js +++ b/vite.config.js @@ -2,11 +2,14 @@ const { resolve } = require('path') const { defineConfig } = require('vite') module.exports = defineConfig({ + base: './', build: { rollupOptions: { input: { main: resolve(__dirname, 'index.html'), en: resolve(__dirname, 'en/index.html'), + roadmap: resolve(__dirname, 'roadmap/index.html'), + enRoadmap: resolve(__dirname, 'en/roadmap/index.html'), }, }, },