diff --git a/.coderabbit.yaml b/.coderabbit.yaml index f69abfe..5754fec 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -173,7 +173,7 @@ reviews: - Ensure that "use client" is being used - Ensure that only features that allow pure client-side rendering are used - NextJS best practices (including file structure, API routes, and static generation methods) are used. - + TypeScript: - Avoid 'any', use explicit types - Prefer 'import type' for type imports @@ -217,7 +217,7 @@ reviews: - path: "**/*.{py}" instructions: | Python: - - Check for major PEP 8 violations and Python best practices. + - Check for major PEP 8 violations and Python best practices. # Solidity Smart Contract files - path: "**/*.sol" @@ -244,7 +244,6 @@ reviews: - Integer overflows/underflows (if using unchecked blocks) - Front-running risks where applicable - # Javascript/Typescript test files - path: "**/*.test.{ts,tsx,js,jsx}" instructions: | @@ -254,7 +253,7 @@ reviews: - Async behavior is properly tested - Accessibility testing is included - Test descriptions are sufficiently detailed to clarify the purpose of each test - - The tests are not tautological + - The tests are not tautological # Solidity test files - path: "**/*.test.{sol}" @@ -269,7 +268,6 @@ reviews: - Deterministic behavior (tests should not rely on implicit execution order or shared mutable state). - Clear and descriptive test names that reflect the intended behavior being validated. - # Asset files (images, fonts, etc.) - path: "assets/**/*" instructions: | diff --git a/.github/ISSUE_TEMPLATE/good_first_issue.yml b/.github/ISSUE_TEMPLATE/good_first_issue.yml index 6f1ae36..c01d8ee 100644 --- a/.github/ISSUE_TEMPLATE/good_first_issue.yml +++ b/.github/ISSUE_TEMPLATE/good_first_issue.yml @@ -45,7 +45,7 @@ body: attributes: value: | ## AI Notice - Important! - + We encourage contributors to use AI tools responsibly when creating Pull Requests. While AI can be a valuable aid, it is essential to ensure that your contributions meet the task requirements, build successfully, include relevant tests, and pass all linters. Submissions that do not meet these standards may be closed without warning to maintain the quality and integrity of the project. Please take the time to understand the changes you are proposing and their impact. - type: checkboxes diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 68c5334..de13795 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,18 +1,21 @@ -### Addressed Issues: +### Addressed Issues: + + Fixes #(issue number) +### Screenshots/Recordings: -### Screenshots/Recordings: +### Additional Notes: -### Additional Notes: - ## Checklist + + - [ ] My code follows the project's code style and conventions - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings or errors @@ -21,4 +24,4 @@ Fixes #(issue number) ## โ ๏ธ AI Notice - Important! - We encourage contributors to use AI tools responsibly when creating Pull Requests. While AI can be a valuable aid, it is essential to ensure that your contributions meet the task requirements, build successfully, include relevant tests, and pass all linters. Submissions that do not meet these standards may be closed without warning to maintain the quality and integrity of the project. Please take the time to understand the changes you are proposing and their impact. +We encourage contributors to use AI tools responsibly when creating Pull Requests. While AI can be a valuable aid, it is essential to ensure that your contributions meet the task requirements, build successfully, include relevant tests, and pass all linters. Submissions that do not meet these standards may be closed without warning to maintain the quality and integrity of the project. Please take the time to understand the changes you are proposing and their impact. diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 5df0eb4..f24b7d3 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -1,62 +1,62 @@ -name-template: 'v$RESOLVED_VERSION' -tag-template: 'v$RESOLVED_VERSION' +name-template: "v$RESOLVED_VERSION" +tag-template: "v$RESOLVED_VERSION" categories: - - title: '๐ Features' + - title: "๐ Features" labels: - - 'feature' - - 'enhancement' - - 'feat' - - title: '๐ Bug Fixes' + - "feature" + - "enhancement" + - "feat" + - title: "๐ Bug Fixes" labels: - - 'fix' - - 'bugfix' - - 'bug' - - title: '๐งฐ Maintenance' + - "fix" + - "bugfix" + - "bug" + - title: "๐งฐ Maintenance" labels: - - 'chore' - - 'maintenance' - - 'refactor' - - title: '๐ Documentation' + - "chore" + - "maintenance" + - "refactor" + - title: "๐ Documentation" labels: - - 'documentation' - - 'docs' - - title: '๐ง Configuration' + - "documentation" + - "docs" + - title: "๐ง Configuration" labels: - - 'configuration' - - 'config' - - title: '๐งช Tests' + - "configuration" + - "config" + - title: "๐งช Tests" labels: - - 'tests' - - 'test' - - title: 'โฌ๏ธ Dependencies' + - "tests" + - "test" + - title: "โฌ๏ธ Dependencies" labels: - - 'dependencies' - - 'deps' - - title: '๐จ Frontend' + - "dependencies" + - "deps" + - title: "๐จ Frontend" labels: - - 'frontend' - - 'ui' - - title: 'โ๏ธ Backend' + - "frontend" + - "ui" + - title: "โ๏ธ Backend" labels: - - 'backend' - - 'api' - - title: '๐ Security' + - "backend" + - "api" + - title: "๐ Security" labels: - - 'security' - - title: '๐ณ Docker' + - "security" + - title: "๐ณ Docker" labels: - - 'docker' - - title: '๐ CI/CD' + - "docker" + - title: "๐ CI/CD" labels: - - 'ci-cd' - - 'github-actions' - - title: '๐ฅ Contributors' + - "ci-cd" + - "github-actions" + - title: "๐ฅ Contributors" labels: - - 'first-time-contributor' - - 'external-contributor' + - "first-time-contributor" + - "external-contributor" -change-template: '- $TITLE @$AUTHOR (#$NUMBER)' +change-template: "- $TITLE @$AUTHOR (#$NUMBER)" change-title-escapes: '\<*_&' template: | @@ -71,14 +71,14 @@ template: | **Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION exclude-labels: - - 'skip-changelog' - - 'no-changelog' - - 'duplicate' - - 'invalid' - - 'wontfix' + - "skip-changelog" + - "no-changelog" + - "duplicate" + - "invalid" + - "wontfix" replacers: - search: '/CVE-(\d{4})-(\d+)/g' - replace: '[CVE-$1-$2](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-$1-$2)' + replace: "[CVE-$1-$2](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-$1-$2)" include-pre-releases: false diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b2622c6..27e6122 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,90 +1,60 @@ # Workflow for building and deploying to GitHub Pages -name: Deploy site to Pages +name: Deploy Vite App to GitHub Pages on: - # Runs on pushes targeting the default branch push: - branches: ["main"] + branches: + - main - # Allows you to run this workflow manually from the Actions tab workflow_dispatch: -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: - group: "pages" - cancel-in-progress: false + group: github-pages + cancel-in-progress: true jobs: - # Build job build: runs-on: ubuntu-latest + steps: - - name: Checkout + - name: Checkout repository uses: actions/checkout@v4 - - name: Detect package manager - id: detect-package-manager - run: | - if [ -f "${{ github.workspace }}/yarn.lock" ]; then - echo "manager=yarn" >> $GITHUB_OUTPUT - echo "command=install" >> $GITHUB_OUTPUT - echo "runner=yarn" >> $GITHUB_OUTPUT - exit 0 - elif [ -f "${{ github.workspace }}/package.json" ]; then - echo "manager=npm" >> $GITHUB_OUTPUT - echo "command=ci" >> $GITHUB_OUTPUT - echo "runner=npx --no-install" >> $GITHUB_OUTPUT - exit 0 - else - echo "Unable to determine package manager" - exit 1 - fi - - name: Setup Node + + - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "20" - cache: ${{ steps.detect-package-manager.outputs.manager }} - - name: Setup Pages + node-version: 22 + cache: npm + + - name: Setup GitHub Pages uses: actions/configure-pages@v5 - with: - # Automatically inject basePath in your Next.js configuration file and disable - # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized). - # - # You may remove this line if you want to manage the configuration yourself. - static_site_generator: next - - name: Restore cache - uses: actions/cache@v4 - with: - path: | - .next/cache - # Generate a new cache whenever packages or source files change. - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} - # If source files changed but packages didn't, rebuild from a prior cache. - restore-keys: | - ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}- + - name: Install dependencies - run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }} - - name: Build - run: ${{ steps.detect-package-manager.outputs.runner }} next build - - name: Upload artifact + run: npm ci + + - name: Build application + run: npm run build + + - name: Upload build artifact uses: actions/upload-pages-artifact@v3 with: - path: ./out + path: ./dist - # Deployment job deploy: + needs: build + + runs-on: ubuntu-latest + environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build + steps: - name: Deploy to GitHub Pages id: deployment diff --git a/.github/workflows/sync-pr-labels.yml b/.github/workflows/sync-pr-labels.yml index 97155c8..97b1184 100644 --- a/.github/workflows/sync-pr-labels.yml +++ b/.github/workflows/sync-pr-labels.yml @@ -93,13 +93,13 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const prBody = context.payload.pull_request.body || ''; - + // Match patterns: Fixes #123, Closes #123, Resolves #123, etc. const issuePatterns = [ /(?:fix|fixes|fixed|close|closes|closed|resolve|resolves|resolved)\s+#(\d+)/gi, /#(\d+)/g ]; - + let issueNumber = null; for (const pattern of issuePatterns) { const match = prBody.match(pattern); @@ -109,7 +109,7 @@ jobs: break; } } - + core.setOutput('issue_number', issueNumber || ''); return issueNumber; @@ -121,7 +121,7 @@ jobs: script: | const issueNumber = '${{ steps.extract-issue.outputs.issue_number }}'; const prNumber = context.payload.pull_request.number; - + try { const issue = await github.rest.issues.get({ owner: context.repo.owner, @@ -185,7 +185,7 @@ jobs: script: | const prNumber = context.payload.pull_request.number; const changedFiles = JSON.parse('${{ steps.changed-files.outputs.files }}'); - + const fileLabels = []; const labelMappings = { 'documentation': ['.md', 'README', 'CONTRIBUTING', 'LICENSE', '.txt'], @@ -200,7 +200,7 @@ jobs: 'docker': ['Dockerfile', 'docker-compose', '.dockerignore'], 'ci-cd': ['.github/', '.gitlab-ci', 'Jenkinsfile', '.circleci'] }; - + for (const file of changedFiles) { for (const [label, patterns] of Object.entries(labelMappings)) { for (const pattern of patterns) { @@ -212,7 +212,7 @@ jobs: } } } - + if (fileLabels.length > 0) { console.log(`Applying file-based labels: ${fileLabels.join(', ')}`); await github.rest.issues.addLabels({ @@ -237,12 +237,12 @@ jobs: repo: context.repo.repo, pull_number: prNumber }); - + const additions = pr.data.additions; const deletions = pr.data.deletions; const totalChanges = additions + deletions; console.log(`PR has ${additions} additions and ${deletions} deletions (${totalChanges} total changes)`); - + let sizeLabel = ''; if (totalChanges <= 10) { sizeLabel = 'size/XS'; @@ -255,19 +255,19 @@ jobs: } else { sizeLabel = 'size/XL'; } - + console.log(`Applying size label: ${sizeLabel}`); - + const currentLabels = await github.rest.issues.listLabelsOnIssue({ owner: context.repo.owner, repo: context.repo.repo, issue_number: prNumber }); - + const sizeLabelsToRemove = currentLabels.data .map(label => label.name) .filter(name => name.startsWith('size/')); - + for (const label of sizeLabelsToRemove) { await github.rest.issues.removeLabel({ owner: context.repo.owner, @@ -276,7 +276,7 @@ jobs: name: label }); } - + await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, @@ -294,7 +294,7 @@ jobs: script: | const prNumber = context.payload.pull_request.number; const prAuthor = context.payload.pull_request.user.login; - + try { const commits = await github.rest.repos.listCommits({ owner: context.repo.owner, @@ -362,4 +362,4 @@ jobs: console.log('='.repeat(50)); console.log(`Current labels on PR #${prNumber}:`); console.log(currentLabels.join(', ') || 'No labels'); - console.log('='.repeat(50)); \ No newline at end of file + console.log('='.repeat(50)); diff --git a/.github/workflows/version-release.yml b/.github/workflows/version-release.yml index 981ebab..26f103a 100644 --- a/.github/workflows/version-release.yml +++ b/.github/workflows/version-release.yml @@ -5,7 +5,7 @@ on: branches: - main paths: - - 'VERSION' + - "VERSION" permissions: contents: write @@ -14,7 +14,7 @@ jobs: release: if: ${{ github.repository_owner == 'AOSSIE-Org' }} runs-on: ubuntu-latest - + steps: - name: Checkout code uses: actions/checkout@v4 @@ -62,16 +62,16 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const version = 'v${{ steps.get_version.outputs.version }}'; - + // Get all releases const { data: releases } = await github.rest.repos.listReleases({ owner: context.repo.owner, repo: context.repo.repo, }); - + // Find the draft release const draftRelease = releases.find(release => release.draft === true); - + if (draftRelease) { console.log(`Found draft release: ${draftRelease.name}`); diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2a9b56d..6b830ba 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,7 @@ repos: - id: check-merge-conflict - id: check-added-large-files - id: mixed-line-ending - args: ['--fix=lf'] + args: ["--fix=lf"] # ---------------------------------- # 2. Config & data files validation @@ -42,11 +42,11 @@ repos: rev: v1.4.0 hooks: - id: detect-secrets - + # args: ['--baseline', '.secrets.baseline'] (Maintainers should add a .secrets.baseline file for secret scanning.) # ============================================================================== -# IMPORTANT: +# IMPORTANT: # Pre-commit runs locally every time you commit; only simple logic should be included here. # Heavy operations should be handled by CI/CD pipelines (GitHub Actions, etc.) # ============================================================================== diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..33c4a87 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +node_modules +dist +build +package-lock.json +yarn.lock \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..cd32a12 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "semi": true, + "singleQuote": false, + "tabWidth": 2, + "useTabs": false, + "trailingComma": "es5", + "printWidth": 80, + "bracketSpacing": true, + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 286b79e..e2bb064 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,12 +50,12 @@ Before opening an issue, search existing ones to avoid duplicates. Useful bug re OrgExplorer is a **single-package frontend** application: -| Area | Stack | -|------|--------| -| UI | [React](https://react.dev/) 19 | -| Language | [TypeScript](https://www.typescriptlang.org/) | -| Build & dev server | [Vite](https://vite.dev/) (with `@vitejs/plugin-react`) | -| Linting | [ESLint](https://eslint.org/) 9 (flat config in `eslint.config.js`) | +| Area | Stack | +| ------------------ | ------------------------------------------------------------------- | +| UI | [React](https://react.dev/) 19 | +| Language | [TypeScript](https://www.typescriptlang.org/) | +| Build & dev server | [Vite](https://vite.dev/) (with `@vitejs/plugin-react`) | +| Linting | [ESLint](https://eslint.org/) 9 (flat config in `eslint.config.js`) | Approximate layout: @@ -163,14 +163,14 @@ Fix any ESLint or TypeScript errors reported by these commands. Conventional prefixes help scan history: -| Prefix | Use for | -|--------|---------| -| `feat:` | New user-facing behavior | -| `fix:` | Bug fixes | -| `docs:` | Documentation only | -| `style:` | Formatting, no logic change | -| `refactor:` | Internal restructuring | -| `chore:` | Tooling, config, dependencies | +| Prefix | Use for | +| ----------- | ----------------------------- | +| `feat:` | New user-facing behavior | +| `fix:` | Bug fixes | +| `docs:` | Documentation only | +| `style:` | Formatting, no logic change | +| `refactor:` | Internal restructuring | +| `chore:` | Tooling, config, dependencies | Example: @@ -224,17 +224,21 @@ Use rebase or merge according to what maintainers prefer; rebasing keeps history ```markdown ## Description + Brief summary of changes. ## Related issue + Fixes #23 ## Testing + - `npm run lint` - `npm run build` - Manual: โฆ ## Checklist + See PR template. ``` diff --git a/README.md b/README.md index 3c5adf2..a3fcd5c 100644 --- a/README.md +++ b/README.md @@ -71,21 +71,25 @@ TODO: List your main features here: TODO: Update based on your project ### Frontend + - React / Next.js / Flutter / React Native - TypeScript - TailwindCSS ### Backend + - Flask / FastAPI / Node.js / Supabase - Database: PostgreSQL / SQLite / MongoDB ### AI/ML (if applicable) + - LangChain / LangGraph / LlamaIndex - Google Gemini / OpenAI / Anthropic Claude - Vector Database: Weaviate / Pinecone / Chroma - RAG / Prompt Engineering / Agent Frameworks ### Blockchain (if applicable) + - Solidity / solana / cardano / ergo Smart Contracts - Hardhat / Truffle / foundry - Web3.js / Ethers.js / Wagmi @@ -98,21 +102,21 @@ TODO: Update based on your project TODO: Complete applicable items based on your project type - [ ] **The protocol** (if applicable): - - [ ] has been described and formally specified in a paper. - - [ ] has had its main properties mathematically proven. - - [ ] has been formally verified. + - [ ] has been described and formally specified in a paper. + - [ ] has had its main properties mathematically proven. + - [ ] has been formally verified. - [ ] **The smart contracts** (if applicable): - - [ ] were thoroughly reviewed by at least two knights of The Stable Order. - - [ ] were deployed to: [Add deployment details] + - [ ] were thoroughly reviewed by at least two knights of The Stable Order. + - [ ] were deployed to: [Add deployment details] - [ ] **The mobile app** (if applicable): - - [ ] has an _About_ page containing the Stability Nexus's logo and pointing to the social media accounts of the Stability Nexus. - - [ ] is available for download as a release in this repo. - - [ ] is available in the relevant app stores. + - [ ] has an _About_ page containing the Stability Nexus's logo and pointing to the social media accounts of the Stability Nexus. + - [ ] is available for download as a release in this repo. + - [ ] is available in the relevant app stores. - [ ] **The AI/ML components** (if applicable): - - [ ] LLM/model selection and configuration are documented. - - [ ] Prompts and system instructions are version-controlled. - - [ ] Content safety and moderation mechanisms are implemented. - - [ ] API keys and rate limits are properly managed. + - [ ] LLM/model selection and configuration are documented. + - [ ] Prompts and system instructions are version-controlled. + - [ ] Content safety and moderation mechanisms are implemented. + - [ ] API keys and rate limits are properly managed. --- @@ -135,12 +139,14 @@ TODO: Add your system architecture diagram here ``` You can create architecture diagrams using: + - [Draw.io](https://draw.io) - [Excalidraw](https://excalidraw.com) - [Lucidchart](https://lucidchart.com) - [Mermaid](https://mermaid.js.org) (for code-based diagrams) Example structure to include: + - Frontend components - Backend services - Database architecture @@ -241,8 +247,8 @@ For detailed setup instructions, please refer to our [Installation Guide](./docs TODO: Add screenshots showcasing your application -| | | | -|---|---|---| +| | | | +| ------------ | ------------ | ------------ | | Screenshot 1 | Screenshot 2 | Screenshot 3 | --- @@ -277,4 +283,4 @@ Thanks a lot for spending your time helping TODO grow. Keep rocking ๐ฅ [](https://github.com/AOSSIE-Org/TODO/graphs/contributors) -ยฉ 2025 AOSSIE +ยฉ 2025 AOSSIE diff --git a/eslint.config.js b/eslint.config.js index 5e6b472..75d3c46 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,14 +1,14 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' -import { defineConfig, globalIgnores } from 'eslint/config' +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; +import { defineConfig, globalIgnores } from "eslint/config"; export default defineConfig([ - globalIgnores(['dist']), + globalIgnores(["dist"]), { - files: ['**/*.{ts,tsx}'], + files: ["**/*.{ts,tsx}"], extends: [ js.configs.recommended, tseslint.configs.recommended, @@ -20,4 +20,4 @@ export default defineConfig([ globals: globals.browser, }, }, -]) +]); diff --git a/package.json b/package.json index 73ab888..f070819 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "scripts": { "dev": "vite", "build": "vite build", - "preview": "vite preview" + "preview": "vite preview", + "format": "prettier . --write", + "format:check": "prettier . --check" }, "dependencies": { "react": "^18.3.1", diff --git a/src/App.jsx b/src/App.jsx index 28cce36..923a9c0 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,38 +1,42 @@ -import React from 'react' -import { Routes, Route, Navigate } from 'react-router-dom' -import { AppProvider } from './context/AppContext' -import Navbar from './components/Navbar' -import RateLimitBanner from './components/RateLimitBanner' -import HomePage from './pages/HomePage' -import OverviewPage from './pages/OverviewPage' -import RepositoriesPage from './pages/RepositoriesPage' -import ContributorsPage from './pages/ContributorsPage' -import NetworkPage from './pages/NetworkPage' -import AnalyticsPage from './pages/AnalyticsPage' -import GovernancePage from './pages/GovernancePage' -import SettingsPage from './pages/SettingsPage' +import React from "react"; +import { Routes, Route, Navigate } from "react-router-dom"; +import { AppProvider } from "./context/AppContext"; +import Navbar from "./components/Navbar"; +import RateLimitBanner from "./components/RateLimitBanner"; +import HomePage from "./pages/HomePage"; +import OverviewPage from "./pages/OverviewPage"; +import RepositoriesPage from "./pages/RepositoriesPage"; +import ContributorsPage from "./pages/ContributorsPage"; +import NetworkPage from "./pages/NetworkPage"; +import AnalyticsPage from "./pages/AnalyticsPage"; +import GovernancePage from "./pages/GovernancePage"; +import SettingsPage from "./pages/SettingsPage"; function Layout({ children }) { return ( -