Page Menu
Home
DevCentral
Search
Configure Global Search
Log In
Files
F3942676
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
27 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d713541
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+# Node modules
+node_modules/
+package-lock.json
+
+# Environment files
+.env
diff --git a/backend/.gitkeep b/backend/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/backend/servpulse-backend/index.js b/backend/servpulse-backend/index.js
new file mode 100644
index 0000000..cf5d04b
--- /dev/null
+++ b/backend/servpulse-backend/index.js
@@ -0,0 +1,11 @@
+const express = require('express')
+const app = express()
+const port = 3000
+
+app.get('/', (req, res) => {
+ res.send('Hello World!')
+})
+
+app.listen(port, () => {
+ console.log(`Example app listening on port ${port}`)
+})
diff --git a/backend/servpulse-backend/package.json b/backend/servpulse-backend/package.json
new file mode 100644
index 0000000..b8eed48
--- /dev/null
+++ b/backend/servpulse-backend/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "servpulse-backend",
+ "version": "1.0.0",
+ "description": "Backend API for the ServPulse frontend.",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "express": "^4.18.2"
+ }
+}
diff --git a/frontend/.gitkeep b/frontend/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/frontend/servpulse-frontend/.eslintrc.cjs b/frontend/servpulse-frontend/.eslintrc.cjs
new file mode 100644
index 0000000..b64731a
--- /dev/null
+++ b/frontend/servpulse-frontend/.eslintrc.cjs
@@ -0,0 +1,14 @@
+/* eslint-env node */
+require('@rushstack/eslint-patch/modern-module-resolution')
+
+module.exports = {
+ root: true,
+ 'extends': [
+ 'plugin:vue/vue3-essential',
+ 'eslint:recommended',
+ '@vue/eslint-config-prettier/skip-formatting'
+ ],
+ parserOptions: {
+ ecmaVersion: 'latest'
+ }
+}
diff --git a/frontend/servpulse-frontend/.prettierrc.json b/frontend/servpulse-frontend/.prettierrc.json
new file mode 100644
index 0000000..ecdf3e0
--- /dev/null
+++ b/frontend/servpulse-frontend/.prettierrc.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "https://json.schemastore.org/prettierrc",
+ "semi": false,
+ "tabWidth": 2,
+ "singleQuote": true,
+ "printWidth": 100,
+ "trailingComma": "none"
+}
diff --git a/frontend/servpulse-frontend/README.md b/frontend/servpulse-frontend/README.md
new file mode 100644
index 0000000..cc02d49
--- /dev/null
+++ b/frontend/servpulse-frontend/README.md
@@ -0,0 +1,41 @@
+# servpulse-frontend
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VSCode](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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Compile and Minify for Production
+
+```sh
+npm run build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+npm run test:unit
+```
+
+### Lint with [ESLint](https://eslint.org/)
+
+```sh
+npm run lint
+```
diff --git a/frontend/servpulse-frontend/index.html b/frontend/servpulse-frontend/index.html
new file mode 100644
index 0000000..99f583a
--- /dev/null
+++ b/frontend/servpulse-frontend/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8">
+ <link rel="icon" href="/favicon.ico">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Vite App</title>
+ </head>
+ <body>
+ <div id="app"></div>
+ <script type="module" src="/src/main.js"></script>
+ </body>
+</html>
diff --git a/frontend/servpulse-frontend/package.json b/frontend/servpulse-frontend/package.json
new file mode 100644
index 0000000..96de107
--- /dev/null
+++ b/frontend/servpulse-frontend/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "servpulse-frontend",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview",
+ "test:unit": "vitest",
+ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
+ "format": "prettier --write src/"
+ },
+ "dependencies": {
+ "vue": "^3.3.2",
+ "vue-router": "^4.2.0"
+ },
+ "devDependencies": {
+ "@rushstack/eslint-patch": "^1.2.0",
+ "@vitejs/plugin-vue": "^4.2.3",
+ "@vue/eslint-config-prettier": "^7.1.0",
+ "@vue/test-utils": "^2.3.2",
+ "eslint": "^8.39.0",
+ "eslint-plugin-vue": "^9.11.0",
+ "jsdom": "^22.0.0",
+ "prettier": "^2.8.8",
+ "vite": "^4.3.5",
+ "vitest": "^0.31.0"
+ }
+}
diff --git a/frontend/servpulse-frontend/public/favicon.ico b/frontend/servpulse-frontend/public/favicon.ico
new file mode 100644
index 0000000..df36fcf
Binary files /dev/null and b/frontend/servpulse-frontend/public/favicon.ico differ
diff --git a/frontend/servpulse-frontend/src/App.vue b/frontend/servpulse-frontend/src/App.vue
new file mode 100644
index 0000000..e864195
--- /dev/null
+++ b/frontend/servpulse-frontend/src/App.vue
@@ -0,0 +1,85 @@
+<script setup>
+import { RouterLink, RouterView } from 'vue-router'
+import HelloWorld from './components/HelloWorld.vue'
+</script>
+
+<template>
+ <header>
+ <img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" />
+
+ <div class="wrapper">
+ <HelloWorld msg="You did it!" />
+
+ <nav>
+ <RouterLink to="/">Home</RouterLink>
+ <RouterLink to="/about">About</RouterLink>
+ </nav>
+ </div>
+ </header>
+
+ <RouterView />
+</template>
+
+<style scoped>
+header {
+ line-height: 1.5;
+ max-height: 100vh;
+}
+
+.logo {
+ display: block;
+ margin: 0 auto 2rem;
+}
+
+nav {
+ width: 100%;
+ font-size: 12px;
+ text-align: center;
+ margin-top: 2rem;
+}
+
+nav a.router-link-exact-active {
+ color: var(--color-text);
+}
+
+nav a.router-link-exact-active:hover {
+ background-color: transparent;
+}
+
+nav a {
+ display: inline-block;
+ padding: 0 1rem;
+ border-left: 1px solid var(--color-border);
+}
+
+nav a:first-of-type {
+ border: 0;
+}
+
+@media (min-width: 1024px) {
+ header {
+ display: flex;
+ place-items: center;
+ padding-right: calc(var(--section-gap) / 2);
+ }
+
+ .logo {
+ margin: 0 2rem 0 0;
+ }
+
+ header .wrapper {
+ display: flex;
+ place-items: flex-start;
+ flex-wrap: wrap;
+ }
+
+ nav {
+ text-align: left;
+ margin-left: -1rem;
+ font-size: 1rem;
+
+ padding: 1rem 0;
+ margin-top: 1rem;
+ }
+}
+</style>
diff --git a/frontend/servpulse-frontend/src/assets/base.css b/frontend/servpulse-frontend/src/assets/base.css
new file mode 100644
index 0000000..d3de42e
--- /dev/null
+++ b/frontend/servpulse-frontend/src/assets/base.css
@@ -0,0 +1,73 @@
+/* color palette from <https://github.com/vuejs/theme> */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/frontend/servpulse-frontend/src/assets/logo.svg b/frontend/servpulse-frontend/src/assets/logo.svg
new file mode 100644
index 0000000..7565660
--- /dev/null
+++ b/frontend/servpulse-frontend/src/assets/logo.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>
diff --git a/frontend/servpulse-frontend/src/assets/main.css b/frontend/servpulse-frontend/src/assets/main.css
new file mode 100644
index 0000000..e8667cd
--- /dev/null
+++ b/frontend/servpulse-frontend/src/assets/main.css
@@ -0,0 +1,35 @@
+@import './base.css';
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/frontend/servpulse-frontend/src/components/HelloWorld.vue b/frontend/servpulse-frontend/src/components/HelloWorld.vue
new file mode 100644
index 0000000..0a0988b
--- /dev/null
+++ b/frontend/servpulse-frontend/src/components/HelloWorld.vue
@@ -0,0 +1,43 @@
+<script setup>
+defineProps({
+ msg: {
+ type: String,
+ required: true
+ }
+})
+</script>
+
+<template>
+ <div class="greetings">
+ <h1 class="green">{{ msg }}</h1>
+ <h3>
+ You’ve successfully created a project with
+ <a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> +
+ <a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>.
+ </h3>
+ </div>
+</template>
+
+<style scoped>
+h1 {
+ font-weight: 500;
+ font-size: 2.6rem;
+ top: -10px;
+}
+
+h3 {
+ font-size: 1.2rem;
+}
+
+.greetings h1,
+.greetings h3 {
+ text-align: center;
+}
+
+@media (min-width: 1024px) {
+ .greetings h1,
+ .greetings h3 {
+ text-align: left;
+ }
+}
+</style>
diff --git a/frontend/servpulse-frontend/src/components/TheWelcome.vue b/frontend/servpulse-frontend/src/components/TheWelcome.vue
new file mode 100644
index 0000000..5e64625
--- /dev/null
+++ b/frontend/servpulse-frontend/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+<script setup>
+import WelcomeItem from './WelcomeItem.vue'
+import DocumentationIcon from './icons/IconDocumentation.vue'
+import ToolingIcon from './icons/IconTooling.vue'
+import EcosystemIcon from './icons/IconEcosystem.vue'
+import CommunityIcon from './icons/IconCommunity.vue'
+import SupportIcon from './icons/IconSupport.vue'
+</script>
+
+<template>
+ <WelcomeItem>
+ <template #icon>
+ <DocumentationIcon />
+ </template>
+ <template #heading>Documentation</template>
+
+ Vue’s
+ <a href="https://vuejs.org/" target="_blank" rel="noopener">official documentation</a>
+ provides you with all information you need to get started.
+ </WelcomeItem>
+
+ <WelcomeItem>
+ <template #icon>
+ <ToolingIcon />
+ </template>
+ <template #heading>Tooling</template>
+
+ This project is served and bundled with
+ <a href="https://vitejs.dev/guide/features.html" target="_blank" rel="noopener">Vite</a>. The
+ recommended IDE setup is
+ <a href="https://code.visualstudio.com/" target="_blank" rel="noopener">VSCode</a> +
+ <a href="https://github.com/johnsoncodehk/volar" target="_blank" rel="noopener">Volar</a>. If
+ you need to test your components and web pages, check out
+ <a href="https://www.cypress.io/" target="_blank" rel="noopener">Cypress</a> and
+ <a href="https://on.cypress.io/component" target="_blank">Cypress Component Testing</a>.
+
+ <br />
+
+ More instructions are available in <code>README.md</code>.
+ </WelcomeItem>
+
+ <WelcomeItem>
+ <template #icon>
+ <EcosystemIcon />
+ </template>
+ <template #heading>Ecosystem</template>
+
+ Get official tools and libraries for your project:
+ <a href="https://pinia.vuejs.org/" target="_blank" rel="noopener">Pinia</a>,
+ <a href="https://router.vuejs.org/" target="_blank" rel="noopener">Vue Router</a>,
+ <a href="https://test-utils.vuejs.org/" target="_blank" rel="noopener">Vue Test Utils</a>, and
+ <a href="https://github.com/vuejs/devtools" target="_blank" rel="noopener">Vue Dev Tools</a>. If
+ you need more resources, we suggest paying
+ <a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">Awesome Vue</a>
+ a visit.
+ </WelcomeItem>
+
+ <WelcomeItem>
+ <template #icon>
+ <CommunityIcon />
+ </template>
+ <template #heading>Community</template>
+
+ Got stuck? Ask your question on
+ <a href="https://chat.vuejs.org" target="_blank" rel="noopener">Vue Land</a>, our official
+ Discord server, or
+ <a href="https://stackoverflow.com/questions/tagged/vue.js" target="_blank" rel="noopener"
+ >StackOverflow</a
+ >. You should also subscribe to
+ <a href="https://news.vuejs.org" target="_blank" rel="noopener">our mailing list</a> and follow
+ the official
+ <a href="https://twitter.com/vuejs" target="_blank" rel="noopener">@vuejs</a>
+ twitter account for latest news in the Vue world.
+ </WelcomeItem>
+
+ <WelcomeItem>
+ <template #icon>
+ <SupportIcon />
+ </template>
+ <template #heading>Support Vue</template>
+
+ As an independent project, Vue relies on community backing for its sustainability. You can help
+ us by
+ <a href="https://vuejs.org/sponsor/" target="_blank" rel="noopener">becoming a sponsor</a>.
+ </WelcomeItem>
+</template>
diff --git a/frontend/servpulse-frontend/src/components/WelcomeItem.vue b/frontend/servpulse-frontend/src/components/WelcomeItem.vue
new file mode 100644
index 0000000..a5eca70
--- /dev/null
+++ b/frontend/servpulse-frontend/src/components/WelcomeItem.vue
@@ -0,0 +1,85 @@
+<template>
+ <div class="item">
+ <i>
+ <slot name="icon"></slot>
+ </i>
+ <div class="details">
+ <h3>
+ <slot name="heading"></slot>
+ </h3>
+ <slot></slot>
+ </div>
+ </div>
+</template>
+
+<style scoped>
+.item {
+ margin-top: 2rem;
+ display: flex;
+}
+
+.details {
+ flex: 1;
+ margin-left: 1rem;
+}
+
+i {
+ display: flex;
+ place-items: center;
+ place-content: center;
+ width: 32px;
+ height: 32px;
+ color: var(--color-text);
+}
+
+h3 {
+ font-size: 1.2rem;
+ font-weight: 500;
+ margin-bottom: 0.4rem;
+ color: var(--color-heading);
+}
+
+@media (min-width: 1024px) {
+ .item {
+ margin-top: 0;
+ padding: 0.4rem 0 1rem calc(var(--section-gap) / 2);
+ }
+
+ i {
+ top: calc(50% - 25px);
+ left: -26px;
+ position: absolute;
+ border: 1px solid var(--color-border);
+ background: var(--color-background);
+ border-radius: 8px;
+ width: 50px;
+ height: 50px;
+ }
+
+ .item:before {
+ content: ' ';
+ border-left: 1px solid var(--color-border);
+ position: absolute;
+ left: 0;
+ bottom: calc(50% + 25px);
+ height: calc(50% - 25px);
+ }
+
+ .item:after {
+ content: ' ';
+ border-left: 1px solid var(--color-border);
+ position: absolute;
+ left: 0;
+ top: calc(50% + 25px);
+ height: calc(50% - 25px);
+ }
+
+ .item:first-of-type:before {
+ display: none;
+ }
+
+ .item:last-of-type:after {
+ display: none;
+ }
+}
+</style>
diff --git a/frontend/servpulse-frontend/src/components/__tests__/HelloWorld.spec.js b/frontend/servpulse-frontend/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 0000000..2533202
--- /dev/null
+++ b/frontend/servpulse-frontend/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { props: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/frontend/servpulse-frontend/src/components/icons/IconCommunity.vue b/frontend/servpulse-frontend/src/components/icons/IconCommunity.vue
new file mode 100644
index 0000000..2dc8b05
--- /dev/null
+++ b/frontend/servpulse-frontend/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+<template>
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor">
+ <path
+ d="M15 4a1 1 0 1 0 0 2V4zm0 11v-1a1 1 0 0 0-1 1h1zm0 4l-.707.707A1 1 0 0 0 16 19h-1zm-4-4l.707-.707A1 1 0 0 0 11 14v1zm-4.707-1.293a1 1 0 0 0-1.414 1.414l1.414-1.414zm-.707.707l-.707-.707.707.707zM9 11v-1a1 1 0 0 0-.707.293L9 11zm-4 0h1a1 1 0 0 0-1-1v1zm0 4H4a1 1 0 0 0 1.707.707L5 15zm10-9h2V4h-2v2zm2 0a1 1 0 0 1 1 1h2a3 3 0 0 0-3-3v2zm1 1v6h2V7h-2zm0 6a1 1 0 0 1-1 1v2a3 3 0 0 0 3-3h-2zm-1 1h-2v2h2v-2zm-3 1v4h2v-4h-2zm1.707 3.293l-4-4-1.414 1.414 4 4 1.414-1.414zM11 14H7v2h4v-2zm-4 0c-.276 0-.525-.111-.707-.293l-1.414 1.414C5.42 15.663 6.172 16 7 16v-2zm-.707 1.121l3.414-3.414-1.414-1.414-3.414 3.414 1.414 1.414zM9 12h4v-2H9v2zm4 0a3 3 0 0 0 3-3h-2a1 1 0 0 1-1 1v2zm3-3V3h-2v6h2zm0-6a3 3 0 0 0-3-3v2a1 1 0 0 1 1 1h2zm-3-3H3v2h10V0zM3 0a3 3 0 0 0-3 3h2a1 1 0 0 1 1-1V0zM0 3v6h2V3H0zm0 6a3 3 0 0 0 3 3v-2a1 1 0 0 1-1-1H0zm3 3h2v-2H3v2zm1-1v4h2v-4H4zm1.707 4.707l.586-.586-1.414-1.414-.586.586 1.414 1.414z"
+ />
+ </svg>
+</template>
diff --git a/frontend/servpulse-frontend/src/components/icons/IconDocumentation.vue b/frontend/servpulse-frontend/src/components/icons/IconDocumentation.vue
new file mode 100644
index 0000000..6d4791c
--- /dev/null
+++ b/frontend/servpulse-frontend/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+<template>
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="17" fill="currentColor">
+ <path
+ d="M11 2.253a1 1 0 1 0-2 0h2zm-2 13a1 1 0 1 0 2 0H9zm.447-12.167a1 1 0 1 0 1.107-1.666L9.447 3.086zM1 2.253L.447 1.42A1 1 0 0 0 0 2.253h1zm0 13H0a1 1 0 0 0 1.553.833L1 15.253zm8.447.833a1 1 0 1 0 1.107-1.666l-1.107 1.666zm0-14.666a1 1 0 1 0 1.107 1.666L9.447 1.42zM19 2.253h1a1 1 0 0 0-.447-.833L19 2.253zm0 13l-.553.833A1 1 0 0 0 20 15.253h-1zm-9.553-.833a1 1 0 1 0 1.107 1.666L9.447 14.42zM9 2.253v13h2v-13H9zm1.553-.833C9.203.523 7.42 0 5.5 0v2c1.572 0 2.961.431 3.947 1.086l1.107-1.666zM5.5 0C3.58 0 1.797.523.447 1.42l1.107 1.666C2.539 2.431 3.928 2 5.5 2V0zM0 2.253v13h2v-13H0zm1.553 13.833C2.539 15.431 3.928 15 5.5 15v-2c-1.92 0-3.703.523-5.053 1.42l1.107 1.666zM5.5 15c1.572 0 2.961.431 3.947 1.086l1.107-1.666C9.203 13.523 7.42 13 5.5 13v2zm5.053-11.914C11.539 2.431 12.928 2 14.5 2V0c-1.92 0-3.703.523-5.053 1.42l1.107 1.666zM14.5 2c1.573 0 2.961.431 3.947 1.086l1.107-1.666C18.203.523 16.421 0 14.5 0v2zm3.5.253v13h2v-13h-2zm1.553 12.167C18.203 13.523 16.421 13 14.5 13v2c1.573 0 2.961.431 3.947 1.086l1.107-1.666zM14.5 13c-1.92 0-3.703.523-5.053 1.42l1.107 1.666C11.539 15.431 12.928 15 14.5 15v-2z"
+ />
+ </svg>
+</template>
diff --git a/frontend/servpulse-frontend/src/components/icons/IconEcosystem.vue b/frontend/servpulse-frontend/src/components/icons/IconEcosystem.vue
new file mode 100644
index 0000000..c3a4f07
--- /dev/null
+++ b/frontend/servpulse-frontend/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+<template>
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="20" fill="currentColor">
+ <path
+ d="M11.447 8.894a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm0 1.789a1 1 0 1 0 .894-1.789l-.894 1.789zM7.447 7.106a1 1 0 1 0-.894 1.789l.894-1.789zM10 9a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0H8zm9.447-5.606a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm2 .789a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zM18 5a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0h-2zm-5.447-4.606a1 1 0 1 0 .894-1.789l-.894 1.789zM9 1l.447-.894a1 1 0 0 0-.894 0L9 1zm-2.447.106a1 1 0 1 0 .894 1.789l-.894-1.789zm-6 3a1 1 0 1 0 .894 1.789L.553 4.106zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zm-2-.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 2.789a1 1 0 1 0 .894-1.789l-.894 1.789zM2 5a1 1 0 1 0-2 0h2zM0 7.5a1 1 0 1 0 2 0H0zm8.553 12.394a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 1a1 1 0 1 0 .894 1.789l-.894-1.789zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zM8 19a1 1 0 1 0 2 0H8zm2-2.5a1 1 0 1 0-2 0h2zm-7.447.394a1 1 0 1 0 .894-1.789l-.894 1.789zM1 15H0a1 1 0 0 0 .553.894L1 15zm1-2.5a1 1 0 1 0-2 0h2zm12.553 2.606a1 1 0 1 0 .894 1.789l-.894-1.789zM17 15l.447.894A1 1 0 0 0 18 15h-1zm1-2.5a1 1 0 1 0-2 0h2zm-7.447-5.394l-2 1 .894 1.789 2-1-.894-1.789zm-1.106 1l-2-1-.894 1.789 2 1 .894-1.789zM8 9v2.5h2V9H8zm8.553-4.894l-2 1 .894 1.789 2-1-.894-1.789zm.894 0l-2-1-.894 1.789 2 1 .894-1.789zM16 5v2.5h2V5h-2zm-4.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zm-2.894-1l-2 1 .894 1.789 2-1L8.553.106zM1.447 5.894l2-1-.894-1.789-2 1 .894 1.789zm-.894 0l2 1 .894-1.789-2-1-.894 1.789zM0 5v2.5h2V5H0zm9.447 13.106l-2-1-.894 1.789 2 1 .894-1.789zm0 1.789l2-1-.894-1.789-2 1 .894 1.789zM10 19v-2.5H8V19h2zm-6.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zM2 15v-2.5H0V15h2zm13.447 1.894l2-1-.894-1.789-2 1 .894 1.789zM18 15v-2.5h-2V15h2z"
+ />
+ </svg>
+</template>
diff --git a/frontend/servpulse-frontend/src/components/icons/IconSupport.vue b/frontend/servpulse-frontend/src/components/icons/IconSupport.vue
new file mode 100644
index 0000000..7452834
--- /dev/null
+++ b/frontend/servpulse-frontend/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+<template>
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor">
+ <path
+ d="M10 3.22l-.61-.6a5.5 5.5 0 0 0-7.666.105 5.5 5.5 0 0 0-.114 7.665L10 18.78l8.39-8.4a5.5 5.5 0 0 0-.114-7.665 5.5 5.5 0 0 0-7.666-.105l-.61.61z"
+ />
+ </svg>
+</template>
diff --git a/frontend/servpulse-frontend/src/components/icons/IconTooling.vue b/frontend/servpulse-frontend/src/components/icons/IconTooling.vue
new file mode 100644
index 0000000..660598d
--- /dev/null
+++ b/frontend/servpulse-frontend/src/components/icons/IconTooling.vue
@@ -0,0 +1,19 @@
+<!-- This icon is from <https://github.com/Templarian/MaterialDesign>, distributed under Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) license-->
+<template>
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ aria-hidden="true"
+ role="img"
+ class="iconify iconify--mdi"
+ width="24"
+ height="24"
+ preserveAspectRatio="xMidYMid meet"
+ viewBox="0 0 24 24"
+ >
+ <path
+ d="M20 18v-4h-3v1h-2v-1H9v1H7v-1H4v4h16M6.33 8l-1.74 4H7v-1h2v1h6v-1h2v1h2.41l-1.74-4H6.33M9 5v1h6V5H9m12.84 7.61c.1.22.16.48.16.8V18c0 .53-.21 1-.6 1.41c-.4.4-.85.59-1.4.59H4c-.55 0-1-.19-1.4-.59C2.21 19 2 18.53 2 18v-4.59c0-.32.06-.58.16-.8L4.5 7.22C4.84 6.41 5.45 6 6.33 6H7V5c0-.55.18-1 .57-1.41C7.96 3.2 8.44 3 9 3h6c.56 0 1.04.2 1.43.59c.39.41.57.86.57 1.41v1h.67c.88 0 1.49.41 1.83 1.22l2.34 5.39z"
+ fill="currentColor"
+ ></path>
+ </svg>
+</template>
diff --git a/frontend/servpulse-frontend/src/main.js b/frontend/servpulse-frontend/src/main.js
new file mode 100644
index 0000000..5a5dbdb
--- /dev/null
+++ b/frontend/servpulse-frontend/src/main.js
@@ -0,0 +1,11 @@
+import './assets/main.css'
+
+import { createApp } from 'vue'
+import App from './App.vue'
+import router from './router'
+
+const app = createApp(App)
+
+app.use(router)
+
+app.mount('#app')
diff --git a/frontend/servpulse-frontend/src/router/index.js b/frontend/servpulse-frontend/src/router/index.js
new file mode 100644
index 0000000..a49ae50
--- /dev/null
+++ b/frontend/servpulse-frontend/src/router/index.js
@@ -0,0 +1,23 @@
+import { createRouter, createWebHistory } from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+const router = createRouter({
+ history: createWebHistory(import.meta.env.BASE_URL),
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/frontend/servpulse-frontend/src/views/AboutView.vue b/frontend/servpulse-frontend/src/views/AboutView.vue
new file mode 100644
index 0000000..756ad2a
--- /dev/null
+++ b/frontend/servpulse-frontend/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+<template>
+ <div class="about">
+ <h1>This is an about page</h1>
+ </div>
+</template>
+
+<style>
+@media (min-width: 1024px) {
+ .about {
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ }
+}
+</style>
diff --git a/frontend/servpulse-frontend/src/views/HomeView.vue b/frontend/servpulse-frontend/src/views/HomeView.vue
new file mode 100644
index 0000000..6bb706f
--- /dev/null
+++ b/frontend/servpulse-frontend/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+<script setup>
+import TheWelcome from '../components/TheWelcome.vue'
+</script>
+
+<template>
+ <main>
+ <TheWelcome />
+ </main>
+</template>
diff --git a/frontend/servpulse-frontend/vite.config.js b/frontend/servpulse-frontend/vite.config.js
new file mode 100644
index 0000000..de5cb31
--- /dev/null
+++ b/frontend/servpulse-frontend/vite.config.js
@@ -0,0 +1,14 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [vue()],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/frontend/servpulse-frontend/vitest.config.js b/frontend/servpulse-frontend/vitest.config.js
new file mode 100644
index 0000000..3d91921
--- /dev/null
+++ b/frontend/servpulse-frontend/vitest.config.js
@@ -0,0 +1,18 @@
+import { fileURLToPath } from 'node:url'
+import { mergeConfig } from 'vite'
+import { configDefaults, defineConfig } from 'vitest/config'
+import viteConfig from './vite.config'
+
+export default mergeConfig(
+ viteConfig,
+ defineConfig({
+ test: {
+ environment: 'jsdom',
+ exclude: [...configDefaults.exclude, 'e2e/*'],
+ root: fileURLToPath(new URL('./', import.meta.url)),
+ transformMode: {
+ web: [/\.[jt]sx$/],
+ },
+ }
+ })
+)
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, Dec 26, 20:55 (12 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2315304
Default Alt Text
(27 KB)
Attached To
Mode
rSP ServPulse
Attached
Detach File
Event Timeline
Log In to Comment