Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0c2423c379 | |||
| 95e7bb895e |
@@ -1,34 +0,0 @@
|
|||||||
name: Build Docker image and push to release
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [published]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
docker:
|
|
||||||
if: "!github.event.release.prerelease"
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Connect to Tailscale
|
|
||||||
uses: tailscale/github-action@v4
|
|
||||||
with:
|
|
||||||
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
|
|
||||||
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
|
|
||||||
tags: tag:ci
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
with:
|
|
||||||
driver: docker
|
|
||||||
- name: Login to Docker Registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ secrets.REGISTRY_URL }}
|
|
||||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
|
||||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
|
||||||
- name: Build and push
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
push: true
|
|
||||||
tags: ${{ secrets.REGISTRY_URL }}/beammp/website:${{ github.REF_NAME }}, ${{ secrets.REGISTRY_URL }}/beammp/website:latest, ${{ secrets.REGISTRY_URL }}/beammp/website:production
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
name: Build Docker image and push to prerelease
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [published]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
docker:
|
|
||||||
if: github.event.release.prerelease
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Connect to Tailscale
|
|
||||||
uses: tailscale/github-action@v4
|
|
||||||
with:
|
|
||||||
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
|
|
||||||
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
|
|
||||||
tags: tag:ci
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
with:
|
|
||||||
driver: docker
|
|
||||||
- name: Login to Docker Registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ secrets.REGISTRY_URL }}
|
|
||||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
|
||||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
|
||||||
- name: Build and push
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
push: true
|
|
||||||
tags: ${{ secrets.REGISTRY_URL }}/beammp/website:${{ github.REF_NAME }}, ${{ secrets.REGISTRY_URL }}/beammp/website:latest
|
|
||||||
@@ -102,6 +102,7 @@ dist
|
|||||||
|
|
||||||
# TernJS port file
|
# TernJS port file
|
||||||
.tern-port
|
.tern-port
|
||||||
|
*.exe
|
||||||
*.zip
|
*.zip
|
||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
@@ -128,4 +129,3 @@ frontend/*.ntvs*
|
|||||||
frontend/*.njsproj
|
frontend/*.njsproj
|
||||||
frontend/*.sln
|
frontend/*.sln
|
||||||
frontend/*.sw?
|
frontend/*.sw?
|
||||||
.DS_Store
|
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
node_modules
|
|
||||||
dist
|
|
||||||
*.log
|
|
||||||
.DS_Store
|
|
||||||
pnpm-lock.yaml
|
|
||||||
package-lock.json
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"semi": false,
|
|
||||||
"singleQuote": true,
|
|
||||||
"tabWidth": 2,
|
|
||||||
"useTabs": false,
|
|
||||||
"trailingComma": "es5",
|
|
||||||
"printWidth": 100,
|
|
||||||
"arrowParens": "always",
|
|
||||||
"endOfLine": "lf",
|
|
||||||
"vueIndentScriptAndStyle": false
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"cSpell.words": [
|
|
||||||
"beammp",
|
|
||||||
"beammpservers",
|
|
||||||
"beamng",
|
|
||||||
"Deutsch",
|
|
||||||
"Español",
|
|
||||||
"Français",
|
|
||||||
"freeroam",
|
|
||||||
"gridlines",
|
|
||||||
"Italiano",
|
|
||||||
"Lucide",
|
|
||||||
"maxplayers",
|
|
||||||
"modlist",
|
|
||||||
"modstotal",
|
|
||||||
"modstotalsize",
|
|
||||||
"Offroad",
|
|
||||||
"playerslist",
|
|
||||||
"reka",
|
|
||||||
"rels",
|
|
||||||
"roleplay",
|
|
||||||
"sdesc",
|
|
||||||
"sname",
|
|
||||||
"vueuse",
|
|
||||||
"Русский"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,30 +1,25 @@
|
|||||||
# Step 1: Build stage
|
FROM node:18.16.0-alpine3.17
|
||||||
FROM node:lts-alpine AS build
|
|
||||||
|
|
||||||
|
# Create app directory
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package*.json ./
|
|
||||||
RUN npm ci
|
|
||||||
COPY . .
|
|
||||||
ENV NODE_ENV=production
|
|
||||||
RUN npm run build
|
|
||||||
|
|
||||||
# Step 2: Serve stage
|
RUN apk --no-cache add curl
|
||||||
FROM nginx:stable
|
|
||||||
|
|
||||||
# Remove default nginx static assets
|
# Install app dependencies
|
||||||
RUN rm -rf /usr/share/nginx/html/*
|
# A wildcard is used to ensure both package.json AND package-lock.json are copied
|
||||||
|
# where available (npm@5+)
|
||||||
|
COPY package*.json /app
|
||||||
|
|
||||||
# Copy built files from the previous stage
|
# General Install of Deps
|
||||||
COPY --from=build /app/dist /usr/share/nginx/html
|
# RUN npm install
|
||||||
|
# If you are building your code for production
|
||||||
|
RUN npm ci --only=production
|
||||||
|
|
||||||
# Copy secure nginx configs
|
# Bundle app source
|
||||||
COPY nginx.main.conf /etc/nginx/nginx.conf
|
COPY . /app
|
||||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
||||||
|
|
||||||
# Use non-root user for security
|
EXPOSE 3599
|
||||||
USER nginx
|
|
||||||
|
|
||||||
# Expose port 80
|
HEALTHCHECK CMD curl --fail http://localhost:3599/ping || exit 1
|
||||||
EXPOSE 80
|
|
||||||
|
|
||||||
CMD ["nginx", "-g", "daemon off;"]
|
CMD [ "node", "index.js" ]
|
||||||
@@ -1,112 +1 @@
|
|||||||
# BeamMP Website
|
# BeamMP-Website
|
||||||
|
|
||||||
This repository is home for the BeamMP website. The website features support for translations too now!
|
|
||||||
|
|
||||||
**Tech Stack**
|
|
||||||
- **Framework:** Vue 3 (`vue`, `vue-router`)
|
|
||||||
- **Build:** Vite 7 (`vite`, `@vitejs/plugin-vue`)
|
|
||||||
- **Styling:** Tailwind CSS 4 + `tailwindcss-animate`, `tailwind-merge`
|
|
||||||
- **UI Icons/Utils:** `lucide-vue-next`, `clsx`, `class-variance-authority`
|
|
||||||
- **Radix-style Components:** `reka-ui` through `shadcn-vue`
|
|
||||||
- **Composable utilities:** `@vueuse/core`
|
|
||||||
|
|
||||||
**Theming and Colour Guide**
|
|
||||||
- BeamMP Orange `#F36D24`
|
|
||||||
- BeamMP Blue `#4470B6`
|
|
||||||
- BeamMP Green `#1D9749`
|
|
||||||
- Gray `#333333`
|
|
||||||
- Black `#000000`
|
|
||||||
- White `#FFFFFF`
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
Prerequisites:
|
|
||||||
- Node.js 22+
|
|
||||||
- pnpm, npm, or yarn (examples use npm)
|
|
||||||
|
|
||||||
Install dependencies and run the dev server:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
# from this folder (repo root)
|
|
||||||
npm install
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
Build for production and preview locally:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
npm run build
|
|
||||||
npm run preview
|
|
||||||
```
|
|
||||||
|
|
||||||
Vite will print the local dev URL (usually `http://localhost:5173`).
|
|
||||||
|
|
||||||
## Project Scripts
|
|
||||||
- `npm run dev`: Start Vite development server
|
|
||||||
- `npm run build`: Production build
|
|
||||||
- `npm run preview`: Preview the production build locally
|
|
||||||
- `npm run lint`: Lint and auto-fix Vue/JS files with ESLint
|
|
||||||
- `npm run format`: Format all source files with Prettier
|
|
||||||
|
|
||||||
## Directory Overview
|
|
||||||
- `src/` – App source (styles, components, pages, routing)
|
|
||||||
- `src/components/ui/` – UI components (e.g., `button`, `navigation-menu`)
|
|
||||||
- `src/lib/` – Utilities and helpers
|
|
||||||
- `routes/` - vue-router routes
|
|
||||||
- `views/` - Pages of the website
|
|
||||||
- `index.html` – Vite HTML entry
|
|
||||||
- `tailwind.config.js` – Tailwind configuration
|
|
||||||
- `vite.config.js` – Vite configuration
|
|
||||||
- `components.json` – Shadcn-Vue component registry
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
We welcome contributions! Here’s how to get started.
|
|
||||||
|
|
||||||
### 1) Pick an Issue or Open One
|
|
||||||
- Browse issues or propose an enhancement/bug. Share context and repro steps.
|
|
||||||
|
|
||||||
### 2) Create a Branch
|
|
||||||
- Use a descriptive branch name:
|
|
||||||
- `feature/<short-description>`
|
|
||||||
- `fix/<short-description>`
|
|
||||||
- `docs/<short-description>`
|
|
||||||
|
|
||||||
### 3) Dev Environment
|
|
||||||
- Install deps with `npm install` and run `npm run dev`.
|
|
||||||
- Keep changes scoped and focused; avoid drive-by refactors unless agreed.
|
|
||||||
|
|
||||||
### 4) Code Style & Patterns
|
|
||||||
- **Vue 3 + `<script setup>`** preferred for new components.
|
|
||||||
- **Linting**: Run `npm run lint` before committing to catch errors. ESLint is configured for Vue 3 best practices.
|
|
||||||
- **Formatting**: Run `npm run format` to auto-format code with Prettier (or use an editor extension).
|
|
||||||
- **Type safety**: If/when TypeScript is introduced, prefer explicit props and emits.
|
|
||||||
- **Tailwind**: Use utility classes; extract variants with `class-variance-authority` when patterns repeat.
|
|
||||||
- **Accessibility**: Prefer accessible primitives (e.g., `reka-ui`) and keyboard support.
|
|
||||||
- **File naming**: `PascalCase.vue` for components; avoid one-letter variable names.
|
|
||||||
|
|
||||||
### 5) Testing & Checks
|
|
||||||
- Run the app locally and verify core flows.
|
|
||||||
- Ensure components render on both light/dark themes if relevant.
|
|
||||||
- If you add dependencies, update this README and relevant configs.
|
|
||||||
|
|
||||||
### 6) Commit & PR
|
|
||||||
- Write clear, imperative commit messages, e.g., `feat: add NavigationMenu component`.
|
|
||||||
- Open a PR describing the problem, solution, screenshots if UI changes, and any follow-ups.
|
|
||||||
- Link related issues. Keep PRs small; big changes should be split.
|
|
||||||
|
|
||||||
|
|
||||||
# Translations
|
|
||||||
BeamMP makes an effort to be maintained for multiple languages.
|
|
||||||
The current progress of this sits at:
|
|
||||||
[](https://gitlocalize.com/repo/10617?utm_source=badge)
|
|
||||||
We use [GitLocalize](https://gitlocalize.com/) for managing this. You can contribute if you wish here: https://gitlocalize.com/repo/10617.
|
|
||||||
|
|
||||||
The individual language progress is as follows:
|
|
||||||
|
|
||||||
| Language | Badge |
|
|
||||||
|-----------------------|---------------------------------------------------------------------------------------------------------------------------------|
|
|
||||||
| French | [](https://gitlocalize.com/repo/10617/fr?utm_source=badge) |
|
|
||||||
| German | [](https://gitlocalize.com/repo/10617/de?utm_source=badge) |
|
|
||||||
| Italian | [](https://gitlocalize.com/repo/10617/it?utm_source=badge) |
|
|
||||||
| Russian | [](https://gitlocalize.com/repo/10617/ru?utm_source=badge) |
|
|
||||||
| Spanish | [](https://gitlocalize.com/repo/10617/es?utm_source=badge) |
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://shadcn-vue.com/schema.json",
|
|
||||||
"style": "new-york",
|
|
||||||
"typescript": false,
|
|
||||||
"tailwind": {
|
|
||||||
"config": "tailwind.config.js",
|
|
||||||
"css": "src/style.css",
|
|
||||||
"baseColor": "gray",
|
|
||||||
"cssVariables": true,
|
|
||||||
"prefix": ""
|
|
||||||
},
|
|
||||||
"iconLibrary": "lucide",
|
|
||||||
"aliases": {
|
|
||||||
"components": "@/components",
|
|
||||||
"utils": "@/lib/utils",
|
|
||||||
"ui": "@/components/ui",
|
|
||||||
"lib": "@/lib",
|
|
||||||
"composables": "@/composables"
|
|
||||||
},
|
|
||||||
"registries": {}
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
services:
|
|
||||||
website:
|
|
||||||
build:
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
container_name: website
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "127.0.0.1:3000:80"
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
import pluginVue from 'eslint-plugin-vue'
|
|
||||||
import js from '@eslint/js'
|
|
||||||
import prettier from 'eslint-plugin-prettier'
|
|
||||||
import configPrettier from 'eslint-config-prettier'
|
|
||||||
|
|
||||||
export default [
|
|
||||||
// Ignore patterns (replaces .eslintignore)
|
|
||||||
{
|
|
||||||
ignores: ['node_modules', 'dist', '*.log', '.DS_Store'],
|
|
||||||
},
|
|
||||||
|
|
||||||
// Base JavaScript config
|
|
||||||
js.configs.recommended,
|
|
||||||
|
|
||||||
// Vue 3 recommended config
|
|
||||||
...pluginVue.configs['flat/recommended'],
|
|
||||||
|
|
||||||
// Global configuration
|
|
||||||
{
|
|
||||||
plugins: {
|
|
||||||
prettier,
|
|
||||||
},
|
|
||||||
languageOptions: {
|
|
||||||
ecmaVersion: 'latest',
|
|
||||||
sourceType: 'module',
|
|
||||||
globals: {
|
|
||||||
// Browser globals
|
|
||||||
window: 'readonly',
|
|
||||||
document: 'readonly',
|
|
||||||
navigator: 'readonly',
|
|
||||||
console: 'readonly',
|
|
||||||
localStorage: 'readonly',
|
|
||||||
fetch: 'readonly',
|
|
||||||
alert: 'readonly',
|
|
||||||
prompt: 'readonly',
|
|
||||||
getComputedStyle: 'readonly',
|
|
||||||
// Node globals
|
|
||||||
process: 'readonly',
|
|
||||||
__dirname: 'readonly',
|
|
||||||
__filename: 'readonly',
|
|
||||||
module: 'readonly',
|
|
||||||
require: 'readonly',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
// Prettier integration
|
|
||||||
...configPrettier.rules,
|
|
||||||
'prettier/prettier': 'error',
|
|
||||||
|
|
||||||
// Vue-specific rules
|
|
||||||
'vue/multi-word-component-names': 'off',
|
|
||||||
'vue/no-v-html': 'warn',
|
|
||||||
'vue/require-default-prop': 'off',
|
|
||||||
'vue/require-prop-types': 'warn',
|
|
||||||
'vue/component-name-in-template-casing': ['error', 'PascalCase'],
|
|
||||||
'vue/html-self-closing': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
html: {
|
|
||||||
void: 'always',
|
|
||||||
normal: 'always',
|
|
||||||
component: 'always',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
// General JavaScript rules
|
|
||||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
|
||||||
'prefer-const': 'error',
|
|
||||||
'no-var': 'error',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
INSTANCES=3
|
||||||
|
DEBUG=false
|
||||||
|
PORT=3000
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# Vue 3 + Vite
|
||||||
|
|
||||||
|
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
|
||||||
|
|
||||||
|
## Recommended IDE Setup
|
||||||
|
|
||||||
|
- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>BeamMP</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"name": "beammp-website-frontend",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@headlessui/vue": "^1.7.16",
|
||||||
|
"@heroicons/vue": "^2.0.18",
|
||||||
|
"@statnett/vue-plotly": "^0.3.2",
|
||||||
|
"axios": "^1.6.2",
|
||||||
|
"plotly.js": "^2.27.1",
|
||||||
|
"plotly.js-dist": "^2.27.1",
|
||||||
|
"plotly.js-dist-min": "^2.27.1",
|
||||||
|
"uuid": "^9.0.1",
|
||||||
|
"vue": "^3.3.8",
|
||||||
|
"vue-router": "^4.2.5"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@vitejs/plugin-vue": "^4.5.0",
|
||||||
|
"autoprefixer": "^10.4.16",
|
||||||
|
"postcss": "^8.4.32",
|
||||||
|
"tailwindcss": "^3.3.6",
|
||||||
|
"vite": "^5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
<script setup>
|
||||||
|
import Navbar from '@/components/NavBar.vue'
|
||||||
|
import Footer from '@/components/Footer.vue'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Navbar />
|
||||||
|
<router-view />
|
||||||
|
<Footer />
|
||||||
|
</template>
|
||||||
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 4.0 MiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 207 B After Width: | Height: | Size: 207 B |
|
Before Width: | Height: | Size: 280 B After Width: | Height: | Size: 280 B |
|
Before Width: | Height: | Size: 122 B After Width: | Height: | Size: 122 B |
|
Before Width: | Height: | Size: 339 B After Width: | Height: | Size: 339 B |
|
Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 362 B |
|
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 369 B |
|
Before Width: | Height: | Size: 217 B After Width: | Height: | Size: 217 B |
|
Before Width: | Height: | Size: 114 B After Width: | Height: | Size: 114 B |
|
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 235 B |
|
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 239 B |
|
Before Width: | Height: | Size: 162 B After Width: | Height: | Size: 162 B |
|
Before Width: | Height: | Size: 448 B After Width: | Height: | Size: 448 B |
|
Before Width: | Height: | Size: 104 B After Width: | Height: | Size: 104 B |
|
Before Width: | Height: | Size: 312 B After Width: | Height: | Size: 312 B |
|
Before Width: | Height: | Size: 166 B After Width: | Height: | Size: 166 B |
|
Before Width: | Height: | Size: 153 B After Width: | Height: | Size: 153 B |
|
Before Width: | Height: | Size: 167 B After Width: | Height: | Size: 167 B |
|
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 235 B |
|
Before Width: | Height: | Size: 179 B After Width: | Height: | Size: 179 B |
|
Before Width: | Height: | Size: 190 B After Width: | Height: | Size: 190 B |
|
Before Width: | Height: | Size: 114 B After Width: | Height: | Size: 114 B |
|
Before Width: | Height: | Size: 145 B After Width: | Height: | Size: 145 B |
|
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 117 B |
|
Before Width: | Height: | Size: 125 B After Width: | Height: | Size: 125 B |
|
Before Width: | Height: | Size: 383 B After Width: | Height: | Size: 383 B |
|
Before Width: | Height: | Size: 102 B After Width: | Height: | Size: 102 B |
|
Before Width: | Height: | Size: 627 B After Width: | Height: | Size: 627 B |
|
Before Width: | Height: | Size: 536 B After Width: | Height: | Size: 536 B |
|
Before Width: | Height: | Size: 685 B After Width: | Height: | Size: 685 B |
|
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 117 B |
|
Before Width: | Height: | Size: 352 B After Width: | Height: | Size: 352 B |
|
Before Width: | Height: | Size: 344 B After Width: | Height: | Size: 344 B |
|
Before Width: | Height: | Size: 211 B After Width: | Height: | Size: 211 B |
|
Before Width: | Height: | Size: 451 B After Width: | Height: | Size: 451 B |
|
Before Width: | Height: | Size: 152 B After Width: | Height: | Size: 152 B |
|
Before Width: | Height: | Size: 113 B After Width: | Height: | Size: 113 B |
|
Before Width: | Height: | Size: 228 B After Width: | Height: | Size: 228 B |
|
Before Width: | Height: | Size: 428 B After Width: | Height: | Size: 428 B |
|
Before Width: | Height: | Size: 249 B After Width: | Height: | Size: 249 B |
|
Before Width: | Height: | Size: 299 B After Width: | Height: | Size: 299 B |
|
Before Width: | Height: | Size: 360 B After Width: | Height: | Size: 360 B |
|
Before Width: | Height: | Size: 176 B After Width: | Height: | Size: 176 B |
|
Before Width: | Height: | Size: 142 B After Width: | Height: | Size: 142 B |
|
Before Width: | Height: | Size: 129 B After Width: | Height: | Size: 129 B |
|
Before Width: | Height: | Size: 97 B After Width: | Height: | Size: 97 B |
|
Before Width: | Height: | Size: 367 B After Width: | Height: | Size: 367 B |
|
Before Width: | Height: | Size: 132 B After Width: | Height: | Size: 132 B |
|
Before Width: | Height: | Size: 133 B After Width: | Height: | Size: 133 B |
|
Before Width: | Height: | Size: 144 B After Width: | Height: | Size: 144 B |
|
Before Width: | Height: | Size: 101 B After Width: | Height: | Size: 101 B |
|
Before Width: | Height: | Size: 223 B After Width: | Height: | Size: 223 B |
|
Before Width: | Height: | Size: 258 B After Width: | Height: | Size: 258 B |
|
Before Width: | Height: | Size: 208 B After Width: | Height: | Size: 208 B |
|
Before Width: | Height: | Size: 165 B After Width: | Height: | Size: 165 B |
|
Before Width: | Height: | Size: 373 B After Width: | Height: | Size: 373 B |
|
Before Width: | Height: | Size: 254 B After Width: | Height: | Size: 254 B |
|
Before Width: | Height: | Size: 189 B After Width: | Height: | Size: 189 B |
|
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 117 B |
|
Before Width: | Height: | Size: 296 B After Width: | Height: | Size: 296 B |
|
Before Width: | Height: | Size: 132 B After Width: | Height: | Size: 132 B |
|
Before Width: | Height: | Size: 290 B After Width: | Height: | Size: 290 B |
|
Before Width: | Height: | Size: 165 B After Width: | Height: | Size: 165 B |
|
Before Width: | Height: | Size: 197 B After Width: | Height: | Size: 197 B |
|
Before Width: | Height: | Size: 349 B After Width: | Height: | Size: 349 B |
|
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 117 B |
|
Before Width: | Height: | Size: 173 B After Width: | Height: | Size: 173 B |
|
Before Width: | Height: | Size: 284 B After Width: | Height: | Size: 284 B |
|
Before Width: | Height: | Size: 304 B After Width: | Height: | Size: 304 B |
|
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 239 B |
|
Before Width: | Height: | Size: 314 B After Width: | Height: | Size: 314 B |
|
Before Width: | Height: | Size: 135 B After Width: | Height: | Size: 135 B |
|
Before Width: | Height: | Size: 477 B After Width: | Height: | Size: 477 B |
|
Before Width: | Height: | Size: 560 B After Width: | Height: | Size: 560 B |
|
Before Width: | Height: | Size: 147 B After Width: | Height: | Size: 147 B |