From 4f8275f85eca8f501046f9e69c32a76aa58622e7 Mon Sep 17 00:00:00 2001
From: Mark Cherepovskyi <88227619+MarkCherepovskyi@users.noreply.github.com>
Date: Wed, 27 Mar 2024 14:03:13 +0200
Subject: [PATCH] Dev (#1)
* init home page and impelement qr gen
* update types
* update api and prepare ci
* voting page
* buffer
* jwt
* update vote system
* update qr
* update logo and main page
* Add docker build
---------
Co-authored-by: Nazarii Shcherbak <52297843+Nazarevsky@users.noreply.github.com>
---
.env.example | 4 -
.github/workflows/actions.yaml | 35 +
.github/workflows/tag.yaml | 34 +
README.md | 2 +-
package.json | 13 +-
src/App.vue | 7 +-
src/api/api.ts | 8 +
src/api/apiInterceptors.ts | 48 +
src/api/index.ts | 1 +
src/common/AppLogo.vue | 9 +-
src/common/AppNavbar.vue | 11 +-
src/common/Modal.vue | 3 +-
src/common/Optionitem.vue | 34 +
src/common/VoteCard.vue | 80 +
src/common/VoteCardList.vue | 34 +
src/common/index.ts | 23 +-
src/common/modals/QrAuthModal.vue | 58 +
src/common/modals/index.ts | 3 +-
src/enums/route-names.enum.ts | 3 +-
src/errors/index.ts | 7 +
src/errors/runtime.errors.ts | 8 +
src/helpers/auth.helpers.ts | 3 +
src/helpers/index.ts | 2 +
src/helpers/vote.helpers.ts | 28 +
src/localization/resources/en.json | 34 +-
src/pages/Home.vue | 52 +
src/pages/Vote.vue | 238 ++
src/router/index.ts | 11 +
src/styles/_app-colors.scss | 12 +-
src/styles/global.scss | 10 +-
src/styles/variables.scss | 4 +-
src/types/api.types.ts | 18 +
src/types/auth.types.ts | 6 +
src/types/index.ts | 2 +
src/types/vote.types.ts | 24 +
static/branding/fonts/Tauri/OFL.txt | 93 +
static/branding/fonts/Tauri/Tauri-Regular.ttf | Bin 0 -> 33236 bytes
static/branding/fonts/index.css | 8 +
static/branding/logo.png | Bin 0 -> 192084 bytes
yarn.lock | 2017 ++++++++++-------
40 files changed, 2066 insertions(+), 921 deletions(-)
delete mode 100644 .env.example
create mode 100644 .github/workflows/actions.yaml
create mode 100644 .github/workflows/tag.yaml
create mode 100644 src/api/api.ts
create mode 100644 src/api/apiInterceptors.ts
create mode 100644 src/api/index.ts
create mode 100644 src/common/Optionitem.vue
create mode 100644 src/common/VoteCard.vue
create mode 100644 src/common/VoteCardList.vue
create mode 100644 src/common/modals/QrAuthModal.vue
create mode 100644 src/errors/index.ts
create mode 100644 src/errors/runtime.errors.ts
create mode 100644 src/helpers/auth.helpers.ts
create mode 100644 src/helpers/vote.helpers.ts
create mode 100644 src/pages/Home.vue
create mode 100644 src/pages/Vote.vue
create mode 100644 src/types/api.types.ts
create mode 100644 src/types/auth.types.ts
create mode 100644 src/types/vote.types.ts
create mode 100644 static/branding/fonts/Tauri/OFL.txt
create mode 100644 static/branding/fonts/Tauri/Tauri-Regular.ttf
create mode 100644 static/branding/logo.png
diff --git a/.env.example b/.env.example
deleted file mode 100644
index aa81f98..0000000
--- a/.env.example
+++ /dev/null
@@ -1,4 +0,0 @@
-VITE_ENVIRONMENT=development
-VITE_PORT=8095
-VITE_API_URL='http://localhost:1337'
-VITE_APP_NAME='DeBabko'
diff --git a/.github/workflows/actions.yaml b/.github/workflows/actions.yaml
new file mode 100644
index 0000000..09040b6
--- /dev/null
+++ b/.github/workflows/actions.yaml
@@ -0,0 +1,35 @@
+on:
+ push:
+ branches:
+ - '*'
+
+jobs:
+ converge:
+ name: Converge
+ runs-on: ubuntu-latest
+ steps:
+
+ - name: Checkout code
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+
+ - name: Install werf
+ uses: werf/actions/install@v1.2
+
+ - name: Log in to registry
+ # This is where you will update the personal access token to GITHUB_TOKEN
+ run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin
+
+ - name: Run echo
+ run: |
+ werf version
+ docker version
+ echo $GITHUB_REPOSITORY
+ echo $GITHUB_SHA
+ - name: Run Build
+ run: |
+ . $(werf ci-env github --as-file)
+ werf export web --tag ghcr.io/debabky/web-client:$GITHUB_SHA
+ - name: Build the Docker image
+ run: docker build . --file Dockerfile --tag ghcr.io/debabky/web-client && docker push ghcr.io/debabky/web-client
diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml
new file mode 100644
index 0000000..7329911
--- /dev/null
+++ b/.github/workflows/tag.yaml
@@ -0,0 +1,34 @@
+on:
+ push:
+ tags:
+ - '[0-9]+.[0-9]+.[0-9]+'
+
+jobs:
+ converge:
+ name: Converge
+ runs-on: ubuntu-latest
+ steps:
+
+ - name: Checkout code
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+
+ - name: Install werf
+ uses: werf/actions/install@v1.2
+
+ - name: Log in to registry
+ # This is where you will update the personal access token to GITHUB_TOKEN
+ run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin
+
+ - name: Run echo
+ run: |
+ werf version
+ docker version
+ echo $GITHUB_REPOSITORY
+ echo $GITHUB_REF_NAME
+ - name: Run Build
+ run: |
+ . $(werf ci-env github --as-file)
+ werf export web --tag ghcr.io/debabky/web-client:$GITHUB_REF_NAME
+
diff --git a/README.md b/README.md
index 97551b1..c20d787 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ yarn rsc %release-version%
```
### Dealing with env variables
-Env variables can be rewritten by [env.is] (./static/env.js) file in runtime. To do so, we need to provide same [env variables](.env.example) there in json format
+Env variables can be rewritten by [env.is] (./static/env.js) file in runtime. To do so, we need to provide same [env variables](.env.local) there in json format
## Some additional features
diff --git a/package.json b/package.json
index a0b46ff..3f2b0d3 100644
--- a/package.json
+++ b/package.json
@@ -13,30 +13,39 @@
"analyze": "dotenv -e .env.analyze yarn vite-build",
"lint": "yarn lint:styles && yarn lint:scripts",
"lint:styles": "stylelint \"src/**/*.{vue,scss,css}\" --max-warnings=0",
- "lint:scripts": "eslint \"{src,config}/**/*.{vue,js,ts}\" --cache --fix --max-warnings=0",
+ "lint:scripts": "tsc --noEmit && vue-tsc --noEmit && eslint \"{src,config}/**/*.{vue,js,ts}\" --max-warnings=0",
"preview": "vite preview",
"rsc": "node scripts/release-sanity-check.mjs"
},
"dependencies": {
+ "@big-whale-labs/poseidon": "^0.0.5",
+ "@distributedlab/fetcher": "^1.0.0-rc.14",
+ "@distributedlab/jac": "^1.0.0-rc.14",
"@distributedlab/tools": "^1.0.0-rc.4",
+ "@types/qrcode": "^1.5.5",
"@vuelidate/core": "^2.0.0",
"@vuelidate/validators": "^2.0.0",
"@vueuse/core": "^10.1.2",
+ "humps": "^2.0.1",
"lodash": "^4.17.21",
"loglevel": "^1.8.1",
"pinia": "^2.0.28",
"postcss": "^8.4.20",
+ "qrcode": "^1.5.3",
+ "sha3": "^2.1.4",
"uuid": "^9.0.0",
"vue": "^3.3.2",
"vue-i18n": "^9.2.2",
"vue-router": "^4.1.6",
- "vue-toastification": "^2.0.0-rc.5"
+ "vue-toastification": "^2.0.0-rc.5",
+ "vue-tsc": "^2.0.7"
},
"devDependencies": {
"@esbuild-plugins/node-globals-polyfill": "^0.2.3",
"@esbuild-plugins/node-modules-polyfill": "^0.2.2",
"@originjs/vite-plugin-commonjs": "^1.0.3",
"@rushstack/eslint-patch": "^1.1.3",
+ "@types/humps": "^2.0.6",
"@types/lodash": "^4.14.194",
"@types/node": "^20.1.3",
"@types/uuid": "^9.0.2",
diff --git a/src/App.vue b/src/App.vue
index 21573ce..55ef8c8 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -2,7 +2,10 @@
-
+
@@ -57,6 +60,8 @@ init()
display: grid;
grid-template-rows: toRem(85) 1fr max-content;
flex: 1;
+ max-width: var(--large-page);
+ margin: auto;
@include respond-to(small) {
grid-template-rows: max-content 1fr max-content;
diff --git a/src/api/api.ts b/src/api/api.ts
new file mode 100644
index 0000000..897fa9e
--- /dev/null
+++ b/src/api/api.ts
@@ -0,0 +1,8 @@
+import { config } from '@/config'
+import { JsonApiClient } from '@distributedlab/jac'
+import { attachErrorHandler, attachCaseConverter } from './apiInterceptors'
+
+export const api = new JsonApiClient(
+ { baseUrl: config.API_URL, credentials: 'include' },
+ [{ error: attachErrorHandler }, { response: attachCaseConverter }],
+)
diff --git a/src/api/apiInterceptors.ts b/src/api/apiInterceptors.ts
new file mode 100644
index 0000000..0a2b5d7
--- /dev/null
+++ b/src/api/apiInterceptors.ts
@@ -0,0 +1,48 @@
+import {
+ HTTP_STATUS_CODES,
+ JsonApiResponseErrors,
+ JsonApiRecord,
+} from '@distributedlab/jac'
+import { errors } from '@/errors'
+import { FetcherResponse } from '@distributedlab/fetcher'
+import { camelizeKeys } from 'humps'
+
+export const attachErrorHandler = async (
+ response: FetcherResponse
,
+) => {
+ const isUnauthorized = response?.status === HTTP_STATUS_CODES.UNAUTHORIZED
+
+ if (!isUnauthorized) {
+ switch (response?.status) {
+ case HTTP_STATUS_CODES.METHOD_NOT_ALLOWED:
+ throw errors.MethodNotAllowed
+
+ case HTTP_STATUS_CODES.BAD_REQUEST:
+ throw errors.BadRequestError
+
+ case HTTP_STATUS_CODES.CONFLICT:
+ throw errors.ConflictError
+
+ case HTTP_STATUS_CODES.UNAUTHORIZED:
+ throw errors.UnauthorizedError
+
+ case HTTP_STATUS_CODES.FORBIDDEN:
+ throw errors.ForbiddenError
+
+ case HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR:
+ throw errors.InternalServerError
+
+ default:
+ throw errors.RuntimeError
+ }
+ }
+ throw errors.TokenExpiredError
+}
+
+export const attachCaseConverter = (
+ response: FetcherResponse,
+) => {
+ return new Promise>(resolve => {
+ resolve(camelizeKeys(response) as FetcherResponse)
+ })
+}
diff --git a/src/api/index.ts b/src/api/index.ts
new file mode 100644
index 0000000..3318fdb
--- /dev/null
+++ b/src/api/index.ts
@@ -0,0 +1 @@
+export * from './api'
diff --git a/src/common/AppLogo.vue b/src/common/AppLogo.vue
index cf09433..750e61f 100644
--- a/src/common/AppLogo.vue
+++ b/src/common/AppLogo.vue
@@ -2,10 +2,10 @@

-
+
@@ -18,6 +18,11 @@
position: relative;
}
+.app-logo__img {
+ max-width: toRem(60);
+ max-height: toRem(60);
+}
+
.app-logo__link {
position: absolute;
top: 0;
diff --git a/src/common/AppNavbar.vue b/src/common/AppNavbar.vue
index 6f27881..86eb8cd 100644
--- a/src/common/AppNavbar.vue
+++ b/src/common/AppNavbar.vue
@@ -5,15 +5,8 @@
-
-
diff --git a/src/common/Modal.vue b/src/common/Modal.vue
index c0485bd..7e63c7d 100644
--- a/src/common/Modal.vue
+++ b/src/common/Modal.vue
@@ -69,7 +69,8 @@ $z-index-local: 100;
align-items: center;
justify-content: center;
position: relative;
- height: auto;
+ height: 100%;
+ width: 100%;
max-width: var(--max-width);
}
diff --git a/src/common/Optionitem.vue b/src/common/Optionitem.vue
new file mode 100644
index 0000000..ad2bd4c
--- /dev/null
+++ b/src/common/Optionitem.vue
@@ -0,0 +1,34 @@
+
+
+
{{ item.attributes.name }}
+
+
+
+
+
+
+
diff --git a/src/common/VoteCard.vue b/src/common/VoteCard.vue
new file mode 100644
index 0000000..0e4764d
--- /dev/null
+++ b/src/common/VoteCard.vue
@@ -0,0 +1,80 @@
+
+
+
+
+ {{ field.lbl }}
+
+
+ {{ field.value }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/common/VoteCardList.vue b/src/common/VoteCardList.vue
new file mode 100644
index 0000000..90c0e41
--- /dev/null
+++ b/src/common/VoteCardList.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/common/index.ts b/src/common/index.ts
index 429323b..c262e9a 100644
--- a/src/common/index.ts
+++ b/src/common/index.ts
@@ -1,13 +1,16 @@
-export { default as Icon } from '@/common/Icon.vue'
-export { default as AppButton } from '@/common/AppButton.vue'
-export { default as Collapse } from '@/common/Collapse.vue'
-export { default as Accordion } from '@/common/Accordion.vue'
-export { default as NoDataMessage } from '@/common/NoDataMessage.vue'
-export { default as ErrorMessage } from '@/common/ErrorMessage.vue'
-export { default as Loader } from '@/common/Loader.vue'
-export { default as AppLogo } from '@/common/AppLogo.vue'
-export { default as AppNavbar } from '@/common/AppNavbar.vue'
-export { default as Modal } from '@/common/Modal.vue'
+export { default as Icon } from './Icon.vue'
+export { default as AppButton } from './AppButton.vue'
+export { default as Collapse } from './Collapse.vue'
+export { default as Accordion } from './Accordion.vue'
+export { default as NoDataMessage } from './NoDataMessage.vue'
+export { default as ErrorMessage } from './ErrorMessage.vue'
+export { default as Loader } from './Loader.vue'
+export { default as AppLogo } from './AppLogo.vue'
+export { default as VoteCard } from './VoteCard.vue'
+export { default as VoteCardList } from './VoteCardList.vue'
+export { default as AppNavbar } from './AppNavbar.vue'
+export { default as Modal } from './Modal.vue'
+export { default as Optionitem } from './Optionitem.vue'
export * from './modals'
export * from './loaders'
diff --git a/src/common/modals/QrAuthModal.vue b/src/common/modals/QrAuthModal.vue
new file mode 100644
index 0000000..791b031
--- /dev/null
+++ b/src/common/modals/QrAuthModal.vue
@@ -0,0 +1,58 @@
+
+
+
+
![]()
+
+
+
+
+
+
+
diff --git a/src/common/modals/index.ts b/src/common/modals/index.ts
index 49d0a12..9286342 100644
--- a/src/common/modals/index.ts
+++ b/src/common/modals/index.ts
@@ -1 +1,2 @@
-export { default as BasicModal } from '@/common/modals/BasicModal.vue'
+export { default as BasicModal } from './BasicModal.vue'
+export { default as QrAuthModal } from './QrAuthModal.vue'
diff --git a/src/enums/route-names.enum.ts b/src/enums/route-names.enum.ts
index d707279..352a324 100644
--- a/src/enums/route-names.enum.ts
+++ b/src/enums/route-names.enum.ts
@@ -1,4 +1,5 @@
export enum ROUTE_NAMES {
app = 'app',
- home='home'
+ home = 'home',
+ vote = 'vote',
}
diff --git a/src/errors/index.ts b/src/errors/index.ts
new file mode 100644
index 0000000..5da0b5e
--- /dev/null
+++ b/src/errors/index.ts
@@ -0,0 +1,7 @@
+import * as runtimeErrors from './runtime.errors'
+import { errors as dlErrors } from '@distributedlab/jac'
+
+export const errors = {
+ ...runtimeErrors,
+ ...dlErrors,
+}
diff --git a/src/errors/runtime.errors.ts b/src/errors/runtime.errors.ts
new file mode 100644
index 0000000..95e915f
--- /dev/null
+++ b/src/errors/runtime.errors.ts
@@ -0,0 +1,8 @@
+/**
+ * General runtime error
+ */
+export class RuntimeError extends Error {}
+
+export class TokenExpiredError extends RuntimeError {}
+
+export class MethodNotAllowed extends RuntimeError {}
diff --git a/src/helpers/auth.helpers.ts b/src/helpers/auth.helpers.ts
new file mode 100644
index 0000000..b64ee48
--- /dev/null
+++ b/src/helpers/auth.helpers.ts
@@ -0,0 +1,3 @@
+import { api } from '@/api'
+
+export const auth = (nonce: string) => api.get(`/auth-data/${nonce}`)
diff --git a/src/helpers/index.ts b/src/helpers/index.ts
index c44f3ea..74af1f1 100644
--- a/src/helpers/index.ts
+++ b/src/helpers/index.ts
@@ -1,5 +1,7 @@
export * from './clipboard.helpers'
export * from './error-handler'
export * from './event-bus'
+export * from './vote.helpers'
+export * from './auth.helpers'
export * from './promise.helpers'
export * from './validators.helpers'
diff --git a/src/helpers/vote.helpers.ts b/src/helpers/vote.helpers.ts
new file mode 100644
index 0000000..b8a0ff0
--- /dev/null
+++ b/src/helpers/vote.helpers.ts
@@ -0,0 +1,28 @@
+import { api } from '@/api'
+import { VotingListResponse, VotingResponse } from '@/types'
+import { JsonApiBodyBuilder } from '@distributedlab/jac'
+
+export const getVotingList = async () =>
+ api.get('/voting/list?include=options')
+
+export const getVotingById = async (voteId: number | string) =>
+ api.get(`/voting/${voteId}?include=options`)
+
+export const postVote = async (
+ vote: { votingOption: string }[],
+ token: string,
+) => {
+ const body = new JsonApiBodyBuilder()
+ .setData({
+ type: 'revoke-admin',
+ attributes: {
+ votes: vote.map(i => ({ voting_option: i.votingOption })),
+ },
+ })
+ .build()
+
+ return api.post('/voting/vote', {
+ body,
+ headers: { authorization: token ?? 'test' },
+ })
+}
diff --git a/src/localization/resources/en.json b/src/localization/resources/en.json
index 3159a92..42ed4be 100644
--- a/src/localization/resources/en.json
+++ b/src/localization/resources/en.json
@@ -18,21 +18,25 @@
"default-message-info": "Something is happening. Just want you to know that",
"default-message-default": "Just a message"
},
- "login-form": {
- "login-lbl": "Login",
- "password-lbl": "Password",
- "login-success-msg": "Access granted",
- "submit-btn": "Submit"
+ "option-item": {
+ "toggle-btn-txt": "Select"
},
- "ui-kit-page": {
- "button": "Button",
- "some-placeholder": "placeholder",
- "some-label": "label",
- "some-error-message": "error-message",
- "modal-btn": "Open modal",
- "accordion-btn": "Toggle Accordion",
- "collapse-text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
- "loading-error-msg": "Oops, something went wrong",
- "no-data-msg": "Empty data, please add new"
+ "vote": {
+ "title": "Voting page",
+ "vote-btn-txt": "Vote",
+ "selected-part-title": "Selected items",
+ "all-items-title": "All options"
+ },
+ "vote-card": {
+ "name-lbl": "Name",
+ "created-at-lbl": "Created at",
+ "active-until-lbl": "Active until",
+ "first-place": "First choice",
+ "second-place": "Second choice",
+ "third-place": "Third choice",
+ "select-btn-txt": "Select"
+ },
+ "home": {
+ "title": "Voting platform"
}
}
diff --git a/src/pages/Home.vue b/src/pages/Home.vue
new file mode 100644
index 0000000..c5df390
--- /dev/null
+++ b/src/pages/Home.vue
@@ -0,0 +1,52 @@
+
+
+
+ {{ $t('home.title') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/Vote.vue b/src/pages/Vote.vue
new file mode 100644
index 0000000..6d69231
--- /dev/null
+++ b/src/pages/Vote.vue
@@ -0,0 +1,238 @@
+
+
+
+
+ {{ $t('vote.selected-part-title') }}
+
+
+
+
+
{{ item.lbl }}
+
{{ item.value }}
+
+
+
+
+
+
+
+
+ {{ $t('vote.all-items-title') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/router/index.ts b/src/router/index.ts
index e15cf86..ab539d6 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -13,6 +13,17 @@ const routes: Array = [
path: '/:catchAll(.*)',
redirect: { name: ROUTE_NAMES.home },
},
+ {
+ path: '/home',
+ name: ROUTE_NAMES.home,
+ component: () => import('@/pages/Home.vue'),
+ },
+ {
+ path: '/vote/:id',
+ name: ROUTE_NAMES.vote,
+ component: () => import('@/pages/Vote.vue'),
+ props: true,
+ },
]
const router = createRouter({
diff --git a/src/styles/_app-colors.scss b/src/styles/_app-colors.scss
index 036a8f8..a5184d8 100644
--- a/src/styles/_app-colors.scss
+++ b/src/styles/_app-colors.scss
@@ -4,8 +4,8 @@ $black: #000000;
$black-rgb: hexToRGB($black);
$background-primary-light: #ffffff;
-$background-primary-main: #fbfcff;
-$background-primary-dark: #f5f6ff;
+$background-primary-main: #FFE7F1;
+$background-primary-dark: #FFD2F9;
$background-secondary-light: #eff2ff;
$background-secondary-main: #dfe5f8;
@@ -31,8 +31,8 @@ $info-dark: #0094cc;
/* brand colors */
-$primary-light: #e2ecfc;
-$primary-main: #01579b;
+$primary-light: #F7AEF8;
+$primary-main: #B388EB;
$primary-dark: #054679;
$primary-light-rgb: hexToRGB($primary-light);
@@ -58,8 +58,8 @@ $text-primary-invert-main: #fbfcff;
$text-primary-invert-dark: #fbfbff;
$text-secondary-invert-light: rgba(#fffbfe, 0.5);
-$text-secondary-invert-main: rgba(#fffbfe, 0.5);
-$text-secondary-invert-dark: rgba(#fffbfe, 0.5);
+$text-secondary-invert-main: rgba(#A587DA, 0.5);
+$text-secondary-invert-dark: rgba(#A56FFF, 0.5);
/* border colors */
diff --git a/src/styles/global.scss b/src/styles/global.scss
index d4d732f..4a4aae1 100644
--- a/src/styles/global.scss
+++ b/src/styles/global.scss
@@ -97,23 +97,23 @@ h5 {
}
h1 {
- font-size: toRem(24);
+ font-size: toRem(40);
}
h2 {
- font-size: toRem(24);
+ font-size: toRem(36);
}
h3 {
- font-size: toRem(18);
+ font-size: toRem(30);
}
h4 {
- font-size: toRem(16);
+ font-size: toRem(24);
}
h5 {
- font-size: toRem(14);
+ font-size: toRem(18);
}
a {
diff --git a/src/styles/variables.scss b/src/styles/variables.scss
index 5d0d986..e1843c5 100644
--- a/src/styles/variables.scss
+++ b/src/styles/variables.scss
@@ -75,7 +75,7 @@
/* App variables */
--app-txt: #{$text-primary-main};
- --app-font-family: 'Roboto', 'Arial', sans-serif;
+ --app-font-family: 'Tauri';
--app-padding-right: #{toRem(64)};
--app-padding-left: #{toRem(64)};
@@ -130,4 +130,6 @@
var(--field-padding-left);
--field-error: var(--error-main);
+
+ --large-page: #{toRem(1400)}
}
diff --git a/src/types/api.types.ts b/src/types/api.types.ts
new file mode 100644
index 0000000..640f8fc
--- /dev/null
+++ b/src/types/api.types.ts
@@ -0,0 +1,18 @@
+import { Voting } from '@/types'
+
+export type JsonApiRelationship = Record
+export type Uuid = string
+export type JsonApiRelationships = Record<
+ string,
+ JsonApiRelationship | JsonApiRelationship[]
+>
+
+export type JsonApiRecordBase = {
+ id: Uuid
+ type: T
+ relationship_names?: JsonApiRelationships
+}
+
+export type VotingListResponse = JsonApiRecordBase<'vote'> & Voting[]
+
+export type VotingResponse = JsonApiRecordBase<'vote'> & Voting
diff --git a/src/types/auth.types.ts b/src/types/auth.types.ts
new file mode 100644
index 0000000..b62b7f4
--- /dev/null
+++ b/src/types/auth.types.ts
@@ -0,0 +1,6 @@
+export type AccessToken = {
+ accessToken: {
+ token: string
+ tokenType: string
+ }
+}
diff --git a/src/types/index.ts b/src/types/index.ts
index 3da8f9f..2bd57da 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -1 +1,3 @@
export * from './common.types'
+export * from './vote.types'
+export * from './api.types'
diff --git a/src/types/vote.types.ts b/src/types/vote.types.ts
new file mode 100644
index 0000000..513c275
--- /dev/null
+++ b/src/types/vote.types.ts
@@ -0,0 +1,24 @@
+export type VotePayload = {
+ votingOption: string
+ rank: number
+}
+
+export type Voting = {
+ name: string
+ id: string
+ description: string
+ createdAt: string
+ activeUntil: string
+ options: VoteOptions[]
+}
+
+export type VoteOptions = {
+ id: string
+ type: string
+ attributes: {
+ id: number
+ name: string
+ points: number
+ votingId: string
+ }
+}
diff --git a/static/branding/fonts/Tauri/OFL.txt b/static/branding/fonts/Tauri/OFL.txt
new file mode 100644
index 0000000..ac6386c
--- /dev/null
+++ b/static/branding/fonts/Tauri/OFL.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2013 by Sorkin Type Co (www.sorkintype.com), with Reserved Font Name 'Tauri'
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/static/branding/fonts/Tauri/Tauri-Regular.ttf b/static/branding/fonts/Tauri/Tauri-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..608082d35beec83614d76fb9caf1bd1adda6f6e8
GIT binary patch
literal 33236
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