reibs commited on
Commit
f91510c
1 Parent(s): 8012dfe

hugging face update

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .DS_Store +0 -0
  2. README.md +1 -13
  3. app.py +29 -8
  4. code.py +0 -160
  5. downloader.py +0 -68
  6. frontend/.editorconfig +16 -0
  7. frontend/.gitignore +42 -0
  8. frontend/.vscode/extensions.json +4 -0
  9. frontend/.vscode/launch.json +20 -0
  10. frontend/.vscode/tasks.json +42 -0
  11. frontend/README.md +27 -0
  12. frontend/angular.json +104 -0
  13. frontend/package-lock.json +0 -0
  14. frontend/package.json +39 -0
  15. frontend/src/app/app-routing.module.ts +10 -0
  16. frontend/src/app/app.component.html +314 -0
  17. frontend/src/app/app.component.scss +0 -0
  18. frontend/src/app/app.component.spec.ts +35 -0
  19. frontend/src/app/app.component.ts +10 -0
  20. frontend/src/app/app.module.ts +20 -0
  21. frontend/src/app/uploader/uploader.component.html +199 -0
  22. frontend/src/app/uploader/uploader.component.scss +285 -0
  23. frontend/src/app/uploader/uploader.component.spec.ts +23 -0
  24. frontend/src/app/uploader/uploader.component.ts +38 -0
  25. frontend/src/assets/.gitkeep +0 -0
  26. frontend/src/favicon.ico +0 -0
  27. frontend/src/index.html +13 -0
  28. frontend/src/main.ts +7 -0
  29. frontend/src/styles.scss +26 -0
  30. frontend/tsconfig.app.json +14 -0
  31. frontend/tsconfig.json +33 -0
  32. frontend/tsconfig.spec.json +14 -0
  33. frontend/yarn.lock +0 -0
  34. fronty/.editorconfig +16 -0
  35. fronty/.gitignore +42 -0
  36. fronty/.vscode/extensions.json +4 -0
  37. fronty/.vscode/launch.json +20 -0
  38. fronty/.vscode/tasks.json +42 -0
  39. fronty/README.md +27 -0
  40. fronty/angular.json +104 -0
  41. fronty/package-lock.json +0 -0
  42. fronty/package.json +39 -0
  43. fronty/src/app/app-routing.module.ts +10 -0
  44. fronty/src/app/app.component.html +316 -0
  45. fronty/src/app/app.component.scss +0 -0
  46. fronty/src/app/app.component.spec.ts +35 -0
  47. fronty/src/app/app.component.ts +10 -0
  48. fronty/src/app/app.module.ts +22 -0
  49. fronty/src/app/gym-setup/upload.component.html +16 -0
  50. fronty/src/app/gym-setup/upload.component.scss +289 -0
.DS_Store CHANGED
Binary files a/.DS_Store and b/.DS_Store differ
 
README.md CHANGED
@@ -1,13 +1 @@
1
- ---
2
- title: Paperstocode
3
- emoji: 😻
4
- colorFrom: indigo
5
- colorTo: indigo
6
- sdk: streamlit
7
- sdk_version: 1.17.0
8
- app_file: app.py
9
- pinned: false
10
- license: mit
11
- ---
12
-
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ # papertocode
 
 
 
 
 
 
 
 
 
 
 
 
app.py CHANGED
@@ -1,14 +1,35 @@
1
  import streamlit as st
2
- from transformers import pipeline
3
- from PIL import Image
4
 
5
- pipeline = pipeline(task="image-classification", model="julien-c/hotdog-not-hotdog")
6
 
7
- st.title("Hot Dog? Or Not?")
8
 
9
- file_name = st.file_uploader("Upload the paper you want to see code for")
10
 
11
- with open(file_name, "r") as f:
12
- text = f.read()
13
 
14
- st.write(text)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
+ from io import StringIO
3
+ import os
4
 
5
+ from retrieval.single_prompt import generate_code
6
 
 
7
 
8
+ st.title("Papers with Code")
9
 
10
+ uploaded_file = st.file_uploader("Choose a file")
 
11
 
12
+ if uploaded_file is not None:
13
+ col1, col2 = st.columns(2)
14
+ # To convert to a string based IO:
15
+ stringio = StringIO(uploaded_file.getvalue().decode("utf-8"))
16
+ # st.write(stringio)
17
+
18
+ # To read file as string:
19
+ string_data = stringio.read()
20
+ # col1.header(len(string_data))
21
+
22
+ with st.expander("Show LaTeX"):
23
+ st.header("Paper Contents")
24
+ st.code(rf"""{string_data} """, language="latex")
25
+
26
+
27
+ bar = st.progress(0, "Generating Code")
28
+ code = "import torch"
29
+ for complete in range(5):
30
+ code += generate_code(string_data, model_name=os.environ["OPENAI_MODEL_NAME"], code=code)
31
+ bar.progress((complete + 1) * 20)
32
+
33
+ with st.expander("Show Generated Code"):
34
+ st.header("Generated Code")
35
+ st.code(code)
code.py DELETED
@@ -1,160 +0,0 @@
1
- import streamlit as st
2
- from streamlit_embedcode import *
3
-
4
- st.set_page_config(page_title="streamlit-embedcode documentation",)
5
-
6
- choice = st.sidebar.radio(
7
- "Please choose a function to see its documentation",
8
- (
9
- "Home",
10
- "github_gist()",
11
- "gitlab_snippet()",
12
- "pastebin_snippet()",
13
- "codepen_snippet()",
14
- "ideone_snippet()",
15
- "tagmycode_snippet()",
16
- ),
17
- )
18
-
19
- if choice == "Home":
20
- """
21
- # streamlit-embedcode
22
-
23
- [streamlit-embedcode](https://github.com/randyzwitch/streamlit-embedcode) is the easiest way to embed code snippets into your Streamlit app! This component supports the following code sharing services:
24
-
25
- - [GitHub gist](https://gist.github.com/)
26
- - [GitLab snippets](https://gitlab.com/explore/snippets)
27
- - [Pastebin](https://pastebin.com/)
28
- - [CodePen](https://codepen.io/)
29
- - [Ideone](https://ideone.com/)
30
- - [TagMyCode](https://tagmycode.com/)
31
-
32
- ---
33
-
34
- ## Installation
35
-
36
- streamlit-embedcode is distributed via PyPI:
37
-
38
- ```python
39
- pip install streamlit-embedcode
40
- ```
41
- ---
42
-
43
- ## Examples
44
- To see examples for each function, please select using the radio button in the sidebar.
45
- """
46
-
47
- elif choice == "github_gist()":
48
- """## github_gist()"""
49
-
50
- github_gist
51
-
52
- "---"
53
- "### Example:"
54
- with st.echo():
55
-
56
- import streamlit as st
57
- from streamlit_embedcode import github_gist
58
-
59
- t = st.text_input(
60
- "Enter GitHub gist URL:",
61
- "https://gist.github.com/randyzwitch/934d502e53f2adcb48eea2423fe4a47e",
62
- )
63
-
64
- w = st.slider("width", 300, 800, 710)
65
- github_gist(t, width=w)
66
-
67
- elif choice == "gitlab_snippet()":
68
- """## gitlab_snippet()"""
69
-
70
- gitlab_snippet
71
-
72
- "---"
73
- "### Example:"
74
- with st.echo():
75
-
76
- import streamlit as st
77
- from streamlit_embedcode import gitlab_snippet
78
-
79
- t = st.text_input(
80
- "Enter GitLab snippet URL:", "https://gitlab.com/snippets/1995463",
81
- )
82
-
83
- w = st.slider("width", 300, 800, 710)
84
- gitlab_snippet(t, width=w)
85
-
86
- elif choice == "pastebin_snippet()":
87
- """## pastebin_snippet()"""
88
-
89
- pastebin_snippet
90
-
91
- "---"
92
- "### Example:"
93
- with st.echo():
94
-
95
- import streamlit as st
96
- from streamlit_embedcode import pastebin_snippet
97
-
98
- t = st.text_input(
99
- "Enter Pastebin snippet URL:", "https://pastebin.com/i1YQv94Q",
100
- )
101
-
102
- w = st.slider("width", 300, 800, 710)
103
- pastebin_snippet(t, width=w)
104
-
105
- elif choice == "codepen_snippet()":
106
- """## codepen_snippet()"""
107
-
108
- codepen_snippet
109
-
110
- "---"
111
- "### Example:"
112
- with st.echo():
113
-
114
- import streamlit as st
115
- from streamlit_embedcode import codepen_snippet
116
-
117
- t = st.text_input(
118
- "Enter CodePen snippet URL:", "https://codepen.io/ste-vg/pen/GRooLza",
119
- )
120
-
121
- w = st.slider("width", 300, 800, 750, key="1")
122
- h = st.slider("height", 500, 800, 600, key="2")
123
- codepen_snippet(t, width=w, height=h)
124
-
125
- elif choice == "ideone_snippet()":
126
- """## ideone_snippet()"""
127
-
128
- ideone_snippet
129
-
130
- "---"
131
- "### Example:"
132
- with st.echo():
133
-
134
- import streamlit as st
135
- from streamlit_embedcode import ideone_snippet
136
-
137
- t = st.text_input("Enter Ideone snippet URL:", "https://ideone.com/vQ54cr",)
138
-
139
- w = st.slider("width", 300, 800, 710, key="1")
140
- ideone_snippet(t, width=w)
141
-
142
- elif choice == "tagmycode_snippet()":
143
- """## tagmycode_snippet()"""
144
-
145
- tagmycode_snippet
146
-
147
- "---"
148
- "### Example:"
149
- with st.echo():
150
-
151
- import streamlit as st
152
- from streamlit_embedcode import tagmycode_snippet
153
-
154
- t = st.text_input(
155
- "Enter Ideone snippet URL:",
156
- "https://tagmycode.com/snippet/5965/recursive-list-files-in-a-dir#.Xwyc43VKglU",
157
- )
158
-
159
- w = st.slider("width", 300, 800, 710, key="1")
160
- tagmycode_snippet(t, width=w)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
downloader.py DELETED
@@ -1,68 +0,0 @@
1
- # python 3.8.5
2
- """
3
- Given an Arxiv url, downloads the Tex files from the e-print URL,
4
- opens the directory that was downloaded, and concatenatnes all the .tex files together
5
- """
6
- import os
7
- import sys
8
- import requests
9
- import shutil
10
- import gzip
11
- import glob
12
- import subprocess
13
- import time
14
- import re
15
- import argparse
16
- import logging
17
-
18
- logging.basicConfig(level=logging.INFO)
19
- logger = logging.getLogger(__name__)
20
-
21
-
22
- def download_arxiv(url, output_dir):
23
- """
24
- Given an Arxiv url, downloads the Tex files from the e-print URL
25
- For example, the url https://arxiv.org/abs/2206.13947
26
- """
27
- logger.info("Downloading %s", url)
28
- # Get the arxiv id from the url
29
- arxiv_id = re.search(r"arxiv\.org\/abs\/(.*)", url).group(1)
30
- # Download the gz archive
31
- filename = os.path.join(output_dir, f"{arxiv_id}.gz")
32
- with requests.get(f"https://arxiv.org/e-print/{arxiv_id}", stream=True) as r:
33
- with open(filename, "wb") as f:
34
- shutil.copyfileobj(r.raw, f)
35
- return filename
36
-
37
-
38
- def concat_tex_files_in_archive(archive_path, output_dir):
39
- """
40
- Given an archive path, extracts the tex files and concatenates them together
41
- """
42
- # Extract the gz archive
43
- with gzip.open(archive_path, "rb") as f_in:
44
- with open(archive_path[:-3], "wb") as f_out:
45
- shutil.copyfileobj(f_in, f_out)
46
- # Concatenate the tex files
47
- tex_files = glob.glob(f"{archive_path[:-3]}/*.tex")
48
- with open(os.path.join(output_dir, "concat.tex"), "w") as f:
49
- for tex_file in tex_files:
50
- with open(tex_file) as f_in:
51
- f.write(f_in.read())
52
- # Remove the extracted file and gz archive
53
- # os.remove(archive_path[:-3])
54
- # os.remove(archive_path)
55
-
56
-
57
- def main():
58
- parser = argparse.ArgumentParser()
59
- parser.add_argument("url", type=str, help="Arxiv URL")
60
- parser.add_argument("--output_dir", type=str, default=".", help="Output directory")
61
- args = parser.parse_args()
62
-
63
- archive_path = download_arxiv(args.url, args.output_dir)
64
- concat_tex_files_in_archive(archive_path, args.output_dir)
65
-
66
-
67
- if __name__ == "__main__":
68
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/.editorconfig ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Editor configuration, see https://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ indent_style = space
7
+ indent_size = 2
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.ts]
12
+ quote_type = single
13
+
14
+ [*.md]
15
+ max_line_length = off
16
+ trim_trailing_whitespace = false
frontend/.gitignore ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # See http://help.github.com/ignore-files/ for more about ignoring files.
2
+
3
+ # Compiled output
4
+ /dist
5
+ /tmp
6
+ /out-tsc
7
+ /bazel-out
8
+
9
+ # Node
10
+ /node_modules
11
+ npm-debug.log
12
+ yarn-error.log
13
+
14
+ # IDEs and editors
15
+ .idea/
16
+ .project
17
+ .classpath
18
+ .c9/
19
+ *.launch
20
+ .settings/
21
+ *.sublime-workspace
22
+
23
+ # Visual Studio Code
24
+ .vscode/*
25
+ !.vscode/settings.json
26
+ !.vscode/tasks.json
27
+ !.vscode/launch.json
28
+ !.vscode/extensions.json
29
+ .history/*
30
+
31
+ # Miscellaneous
32
+ /.angular/cache
33
+ .sass-cache/
34
+ /connect.lock
35
+ /coverage
36
+ /libpeerconnection.log
37
+ testem.log
38
+ /typings
39
+
40
+ # System files
41
+ .DS_Store
42
+ Thumbs.db
frontend/.vscode/extensions.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
3
+ "recommendations": ["angular.ng-template"]
4
+ }
frontend/.vscode/launch.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
3
+ "version": "0.2.0",
4
+ "configurations": [
5
+ {
6
+ "name": "ng serve",
7
+ "type": "pwa-chrome",
8
+ "request": "launch",
9
+ "preLaunchTask": "npm: start",
10
+ "url": "http://localhost:4200/"
11
+ },
12
+ {
13
+ "name": "ng test",
14
+ "type": "chrome",
15
+ "request": "launch",
16
+ "preLaunchTask": "npm: test",
17
+ "url": "http://localhost:9876/debug.html"
18
+ }
19
+ ]
20
+ }
frontend/.vscode/tasks.json ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
3
+ "version": "2.0.0",
4
+ "tasks": [
5
+ {
6
+ "type": "npm",
7
+ "script": "start",
8
+ "isBackground": true,
9
+ "problemMatcher": {
10
+ "owner": "typescript",
11
+ "pattern": "$tsc",
12
+ "background": {
13
+ "activeOnStart": true,
14
+ "beginsPattern": {
15
+ "regexp": "(.*?)"
16
+ },
17
+ "endsPattern": {
18
+ "regexp": "bundle generation complete"
19
+ }
20
+ }
21
+ }
22
+ },
23
+ {
24
+ "type": "npm",
25
+ "script": "test",
26
+ "isBackground": true,
27
+ "problemMatcher": {
28
+ "owner": "typescript",
29
+ "pattern": "$tsc",
30
+ "background": {
31
+ "activeOnStart": true,
32
+ "beginsPattern": {
33
+ "regexp": "(.*?)"
34
+ },
35
+ "endsPattern": {
36
+ "regexp": "bundle generation complete"
37
+ }
38
+ }
39
+ }
40
+ }
41
+ ]
42
+ }
frontend/README.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Frontend
2
+
3
+ This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.0.2.
4
+
5
+ ## Development server
6
+
7
+ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
8
+
9
+ ## Code scaffolding
10
+
11
+ Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
12
+
13
+ ## Build
14
+
15
+ Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
16
+
17
+ ## Running unit tests
18
+
19
+ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
20
+
21
+ ## Running end-to-end tests
22
+
23
+ Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
24
+
25
+ ## Further help
26
+
27
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
frontend/angular.json ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3
+ "version": 1,
4
+ "newProjectRoot": "projects",
5
+ "projects": {
6
+ "frontend": {
7
+ "projectType": "application",
8
+ "schematics": {
9
+ "@schematics/angular:component": {
10
+ "style": "scss"
11
+ }
12
+ },
13
+ "root": "",
14
+ "sourceRoot": "src",
15
+ "prefix": "app",
16
+ "architect": {
17
+ "build": {
18
+ "builder": "@angular-devkit/build-angular:browser",
19
+ "options": {
20
+ "outputPath": "dist/frontend",
21
+ "index": "src/index.html",
22
+ "main": "src/main.ts",
23
+ "polyfills": [
24
+ "zone.js"
25
+ ],
26
+ "tsConfig": "tsconfig.app.json",
27
+ "inlineStyleLanguage": "scss",
28
+ "assets": [
29
+ "src/favicon.ico",
30
+ "src/assets"
31
+ ],
32
+ "styles": [
33
+ "src/styles.scss"
34
+ ],
35
+ "scripts": []
36
+ },
37
+ "configurations": {
38
+ "production": {
39
+ "budgets": [
40
+ {
41
+ "type": "initial",
42
+ "maximumWarning": "500kb",
43
+ "maximumError": "1mb"
44
+ },
45
+ {
46
+ "type": "anyComponentStyle",
47
+ "maximumWarning": "2kb",
48
+ "maximumError": "4kb"
49
+ }
50
+ ],
51
+ "outputHashing": "all"
52
+ },
53
+ "development": {
54
+ "buildOptimizer": false,
55
+ "optimization": false,
56
+ "vendorChunk": true,
57
+ "extractLicenses": false,
58
+ "sourceMap": true,
59
+ "namedChunks": true
60
+ }
61
+ },
62
+ "defaultConfiguration": "production"
63
+ },
64
+ "serve": {
65
+ "builder": "@angular-devkit/build-angular:dev-server",
66
+ "configurations": {
67
+ "production": {
68
+ "browserTarget": "frontend:build:production"
69
+ },
70
+ "development": {
71
+ "browserTarget": "frontend:build:development"
72
+ }
73
+ },
74
+ "defaultConfiguration": "development"
75
+ },
76
+ "extract-i18n": {
77
+ "builder": "@angular-devkit/build-angular:extract-i18n",
78
+ "options": {
79
+ "browserTarget": "frontend:build"
80
+ }
81
+ },
82
+ "test": {
83
+ "builder": "@angular-devkit/build-angular:karma",
84
+ "options": {
85
+ "polyfills": [
86
+ "zone.js",
87
+ "zone.js/testing"
88
+ ],
89
+ "tsConfig": "tsconfig.spec.json",
90
+ "inlineStyleLanguage": "scss",
91
+ "assets": [
92
+ "src/favicon.ico",
93
+ "src/assets"
94
+ ],
95
+ "styles": [
96
+ "src/styles.scss"
97
+ ],
98
+ "scripts": []
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
frontend/package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
frontend/package.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "frontend",
3
+ "version": "0.0.0",
4
+ "scripts": {
5
+ "ng": "ng",
6
+ "start": "ng serve",
7
+ "build": "ng build",
8
+ "watch": "ng build --watch --configuration development",
9
+ "test": "ng test"
10
+ },
11
+ "private": true,
12
+ "dependencies": {
13
+ "@angular/animations": "^15.0.0",
14
+ "@angular/common": "^15.0.0",
15
+ "@angular/compiler": "^15.0.0",
16
+ "@angular/core": "^15.0.0",
17
+ "@angular/forms": "^15.0.0",
18
+ "@angular/platform-browser": "^15.0.0",
19
+ "@angular/platform-browser-dynamic": "^15.0.0",
20
+ "@angular/router": "^15.0.0",
21
+ "inter-ui": "^3.19.3",
22
+ "rxjs": "~7.5.0",
23
+ "tslib": "^2.3.0",
24
+ "zone.js": "~0.12.0"
25
+ },
26
+ "devDependencies": {
27
+ "@angular-devkit/build-angular": "^15.0.2",
28
+ "@angular/cli": "~15.0.2",
29
+ "@angular/compiler-cli": "^15.0.0",
30
+ "@types/jasmine": "~4.3.0",
31
+ "jasmine-core": "~4.5.0",
32
+ "karma": "~6.4.0",
33
+ "karma-chrome-launcher": "~3.1.0",
34
+ "karma-coverage": "~2.2.0",
35
+ "karma-jasmine": "~5.1.0",
36
+ "karma-jasmine-html-reporter": "~2.0.0",
37
+ "typescript": "~4.8.2"
38
+ }
39
+ }
frontend/src/app/app-routing.module.ts ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { NgModule } from '@angular/core';
2
+ import { RouterModule, Routes } from '@angular/router';
3
+
4
+ const routes: Routes = [];
5
+
6
+ @NgModule({
7
+ imports: [RouterModule.forRoot(routes)],
8
+ exports: [RouterModule]
9
+ })
10
+ export class AppRoutingModule { }
frontend/src/app/app.component.html ADDED
@@ -0,0 +1,314 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
2
+ <!-- * * * * * * * * * * * The content below * * * * * * * * * * * -->
3
+ <!-- * * * * * * * * * * is only a placeholder * * * * * * * * * * -->
4
+ <!-- * * * * * * * * * * and can be replaced. * * * * * * * * * * * -->
5
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
6
+ <!-- * * * * * * * * * Delete the template below * * * * * * * * * * -->
7
+ <!-- * * * * * * * to get started with your project! * * * * * * * * -->
8
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
9
+
10
+ <style>
11
+ :host {
12
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
13
+ font-size: 14px;
14
+ color: #333;
15
+ box-sizing: border-box;
16
+ -webkit-font-smoothing: antialiased;
17
+ -moz-osx-font-smoothing: grayscale;
18
+ }
19
+
20
+ h1,
21
+ h2,
22
+ h3,
23
+ h4,
24
+ h5,
25
+ h6 {
26
+ margin: 8px 0;
27
+ }
28
+
29
+ p {
30
+ margin: 0;
31
+ }
32
+
33
+ .spacer {
34
+ flex: 1;
35
+ }
36
+
37
+ .toolbar {
38
+ position: absolute;
39
+ top: 0;
40
+ left: 0;
41
+ right: 0;
42
+ height: 60px;
43
+ display: flex;
44
+ align-items: center;
45
+ background-color: #1976d2;
46
+ color: white;
47
+ font-weight: 600;
48
+ }
49
+
50
+ .toolbar img {
51
+ margin: 0 16px;
52
+ }
53
+
54
+ .toolbar #twitter-logo {
55
+ height: 40px;
56
+ margin: 0 8px;
57
+ }
58
+
59
+ .toolbar #youtube-logo {
60
+ height: 40px;
61
+ margin: 0 16px;
62
+ }
63
+
64
+ .toolbar #twitter-logo:hover,
65
+ .toolbar #youtube-logo:hover {
66
+ opacity: 0.8;
67
+ }
68
+
69
+ .content {
70
+ display: flex;
71
+ margin: 82px auto 32px;
72
+ padding: 0 16px;
73
+ max-width: 960px;
74
+ flex-direction: column;
75
+ align-items: center;
76
+ }
77
+
78
+ svg.material-icons {
79
+ height: 24px;
80
+ width: auto;
81
+ }
82
+
83
+ svg.material-icons:not(:last-child) {
84
+ margin-right: 8px;
85
+ }
86
+
87
+ .card svg.material-icons path {
88
+ fill: #888;
89
+ }
90
+
91
+ .card-container {
92
+ display: flex;
93
+ flex-wrap: wrap;
94
+ justify-content: center;
95
+ margin-top: 16px;
96
+ }
97
+
98
+ .card {
99
+ all: unset;
100
+ border-radius: 4px;
101
+ border: 1px solid #eee;
102
+ background-color: #fafafa;
103
+ height: 40px;
104
+ width: 200px;
105
+ margin: 0 8px 16px;
106
+ padding: 16px;
107
+ display: flex;
108
+ flex-direction: row;
109
+ justify-content: center;
110
+ align-items: center;
111
+ transition: all 0.2s ease-in-out;
112
+ line-height: 24px;
113
+ }
114
+
115
+ .card-container .card:not(:last-child) {
116
+ margin-right: 0;
117
+ }
118
+
119
+ .card.card-small {
120
+ height: 16px;
121
+ width: 168px;
122
+ }
123
+
124
+ .card-container .card:not(.highlight-card) {
125
+ cursor: pointer;
126
+ }
127
+
128
+ .card-container .card:not(.highlight-card):hover {
129
+ transform: translateY(-3px);
130
+ box-shadow: 0 4px 17px rgba(0, 0, 0, 0.35);
131
+ }
132
+
133
+ .card-container .card:not(.highlight-card):hover .material-icons path {
134
+ fill: rgb(105, 103, 103);
135
+ }
136
+
137
+ .card.highlight-card {
138
+ background-color: #1976d2;
139
+ color: white;
140
+ font-weight: 600;
141
+ border: none;
142
+ width: auto;
143
+ min-width: 30%;
144
+ position: relative;
145
+ }
146
+
147
+ .card.card.highlight-card span {
148
+ margin-left: 60px;
149
+ }
150
+
151
+ svg#rocket {
152
+ width: 80px;
153
+ position: absolute;
154
+ left: -10px;
155
+ top: -24px;
156
+ }
157
+
158
+ svg#rocket-smoke {
159
+ height: calc(100vh - 95px);
160
+ position: absolute;
161
+ top: 10px;
162
+ right: 180px;
163
+ z-index: -10;
164
+ }
165
+
166
+ a,
167
+ a:visited,
168
+ a:hover {
169
+ color: #1976d2;
170
+ text-decoration: none;
171
+ }
172
+
173
+ a:hover {
174
+ color: #125699;
175
+ }
176
+
177
+ .terminal {
178
+ position: relative;
179
+ width: 80%;
180
+ max-width: 600px;
181
+ border-radius: 6px;
182
+ padding-top: 45px;
183
+ margin-top: 8px;
184
+ overflow: hidden;
185
+ background-color: rgb(15, 15, 16);
186
+ }
187
+
188
+ .terminal::before {
189
+ content: "\2022 \2022 \2022";
190
+ position: absolute;
191
+ top: 0;
192
+ left: 0;
193
+ height: 4px;
194
+ background: rgb(58, 58, 58);
195
+ color: #c2c3c4;
196
+ width: 100%;
197
+ font-size: 2rem;
198
+ line-height: 0;
199
+ padding: 14px 0;
200
+ text-indent: 4px;
201
+ }
202
+
203
+ .terminal pre {
204
+ font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
205
+ color: white;
206
+ padding: 0 1rem 1rem;
207
+ margin: 0;
208
+ }
209
+
210
+ .circle-link {
211
+ height: 40px;
212
+ width: 40px;
213
+ border-radius: 40px;
214
+ margin: 8px;
215
+ background-color: white;
216
+ border: 1px solid #eeeeee;
217
+ display: flex;
218
+ justify-content: center;
219
+ align-items: center;
220
+ cursor: pointer;
221
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
222
+ transition: 1s ease-out;
223
+ }
224
+
225
+ .circle-link:hover {
226
+ transform: translateY(-0.25rem);
227
+ box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.2);
228
+ }
229
+
230
+ footer {
231
+ margin-top: 8px;
232
+ display: flex;
233
+ align-items: center;
234
+ line-height: 20px;
235
+ }
236
+
237
+ footer a {
238
+ display: flex;
239
+ align-items: center;
240
+ }
241
+
242
+ .github-star-badge {
243
+ color: #24292e;
244
+ display: flex;
245
+ align-items: center;
246
+ font-size: 12px;
247
+ padding: 3px 10px;
248
+ border: 1px solid rgba(27,31,35,.2);
249
+ border-radius: 3px;
250
+ background-image: linear-gradient(-180deg,#fafbfc,#eff3f6 90%);
251
+ margin-left: 4px;
252
+ font-weight: 600;
253
+ }
254
+
255
+ .github-star-badge:hover {
256
+ background-image: linear-gradient(-180deg,#f0f3f6,#e6ebf1 90%);
257
+ border-color: rgba(27,31,35,.35);
258
+ background-position: -.5em;
259
+ }
260
+
261
+ .github-star-badge .material-icons {
262
+ height: 16px;
263
+ width: 16px;
264
+ margin-right: 4px;
265
+ }
266
+
267
+ svg#clouds {
268
+ position: fixed;
269
+ bottom: -160px;
270
+ left: -230px;
271
+ z-index: -10;
272
+ width: 1920px;
273
+ }
274
+
275
+ /* Responsive Styles */
276
+ @media screen and (max-width: 767px) {
277
+ .card-container > *:not(.circle-link) ,
278
+ .terminal {
279
+ width: 100%;
280
+ }
281
+
282
+ .card:not(.highlight-card) {
283
+ height: 16px;
284
+ margin: 8px 0;
285
+ }
286
+
287
+ .card.highlight-card span {
288
+ margin-left: 72px;
289
+ }
290
+
291
+ svg#rocket-smoke {
292
+ right: 120px;
293
+ transform: rotate(-5deg);
294
+ }
295
+ }
296
+
297
+ @media screen and (max-width: 575px) {
298
+ svg#rocket-smoke {
299
+ display: none;
300
+ visibility: hidden;
301
+ }
302
+ }
303
+ </style>
304
+ <UploaderComponent></UploaderComponent>
305
+
306
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
307
+ <!-- * * * * * * * * * * * The content above * * * * * * * * * * * -->
308
+ <!-- * * * * * * * * * * is only a placeholder * * * * * * * * * * -->
309
+ <!-- * * * * * * * * * * and can be replaced. * * * * * * * * * * * -->
310
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
311
+ <!-- * * * * * * * * * * End of Placeholder * * * * * * * * * * * -->
312
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
313
+
314
+ <router-outlet></router-outlet>
frontend/src/app/app.component.scss ADDED
File without changes
frontend/src/app/app.component.spec.ts ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { RouterTestingModule } from '@angular/router/testing';
3
+ import { AppComponent } from './app.component';
4
+
5
+ describe('AppComponent', () => {
6
+ beforeEach(async () => {
7
+ await TestBed.configureTestingModule({
8
+ imports: [
9
+ RouterTestingModule
10
+ ],
11
+ declarations: [
12
+ AppComponent
13
+ ],
14
+ }).compileComponents();
15
+ });
16
+
17
+ it('should create the app', () => {
18
+ const fixture = TestBed.createComponent(AppComponent);
19
+ const app = fixture.componentInstance;
20
+ expect(app).toBeTruthy();
21
+ });
22
+
23
+ it(`should have as title 'frontend'`, () => {
24
+ const fixture = TestBed.createComponent(AppComponent);
25
+ const app = fixture.componentInstance;
26
+ expect(app.title).toEqual('frontend');
27
+ });
28
+
29
+ it('should render title', () => {
30
+ const fixture = TestBed.createComponent(AppComponent);
31
+ fixture.detectChanges();
32
+ const compiled = fixture.nativeElement as HTMLElement;
33
+ expect(compiled.querySelector('.content span')?.textContent).toContain('frontend app is running!');
34
+ });
35
+ });
frontend/src/app/app.component.ts ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Component } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'app-root',
5
+ templateUrl: './app.component.html',
6
+ styleUrls: ['./app.component.scss']
7
+ })
8
+ export class AppComponent {
9
+ title = 'frontend';
10
+ }
frontend/src/app/app.module.ts ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { NgModule } from '@angular/core';
2
+ import { BrowserModule } from '@angular/platform-browser';
3
+
4
+ import { AppRoutingModule } from './app-routing.module';
5
+ import { AppComponent } from './app.component';
6
+ import { UploaderComponent } from './uploader/uploader.component';
7
+
8
+ @NgModule({
9
+ declarations: [
10
+ AppComponent,
11
+ UploaderComponent
12
+ ],
13
+ imports: [
14
+ BrowserModule,
15
+ AppRoutingModule
16
+ ],
17
+ providers: [],
18
+ bootstrap: [AppComponent]
19
+ })
20
+ export class AppModule { }
frontend/src/app/uploader/uploader.component.html ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="GymSetup__flexParent">
2
+ <div *ngIf="currStep ===1" class="GymSetup__stepOne" [ngClass]="{'GymSteup__stepHidden': stepOne !== 1}">
3
+ <div class="GymSetup__stepOneDescription">First Lets learn a bit about your gym</div>
4
+ <div class="GymSetup__stepOneadditionalInfo">The info we collect will be shown to in the app to people looking for a gym</div>
5
+ <div class="GymSetup__stepBox">
6
+ <form class="GymSetup__stepOneForm">
7
+ <label class="GymSetup__LabelText GymSetup__stepOneGymNameLabelSpacer">Gym Name</label>
8
+ <input class="GymSetup__textInput GymSetup__stepOneInputSpacer" type="text">
9
+ <label class="GymSetup__LabelText GymSetup__stepOneLabelSpacer">Gym Phone Number</label>
10
+ <input class="GymSetup__textInput GymSetup__stepOneInputSpacer" type="text" appPhoneMask>
11
+ <label class="GymSetup__LabelText GymSetup__stepOneLabelSpacer">Address</label>
12
+ <input class="GymSetup__textInput GymSetup__stepOneInputSpacer" type="text">
13
+ <label class="GymSetup__LabelText GymSetup__stepOneLabelSpacer">Website</label>
14
+ <input class="GymSetup__textInput GymSetup__stepOneInputSpacer" type="text">
15
+ <label class="GymSetup__LabelText GymSetup__stepOneLabelSpacer">Description: tell people a little about your gym</label>
16
+ <textarea class="GymSetup__textInput GymSetup__stepOneInputSpacer GymSetup__descriptionTextBox"></textarea>
17
+ </form>
18
+ </div>
19
+ <button class="GymSetup__StepOneButton" (click)="stepOneContinue()">Continue</button>
20
+
21
+ </div>
22
+
23
+ <div *ngIf="currStep ===2" class="GymSetup__stepOne" [ngClass]="{'GymSteup__stepHidden': stepOne !== 2}">
24
+ <div class="GymSetup__stepOneDescription">What are your hours of operation?</div>
25
+ <div class="GymSetup__stepOneadditionalInfo">Please only enter hours someone will need to be present to check people in for a workout</div>
26
+ <div class="GymSetup__stepTwoBox">
27
+ <form class="GymSetup__stepOneForm">
28
+
29
+ <div class="GymSetup__stepTwoDayOfWeek">
30
+ <label class="GymSetup__dayLabelText">Monday</label>
31
+ <div class="GymSetup__StepTwoHoursInputFlex">
32
+ <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required> <span>-</span> <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required>
33
+ </div>
34
+ <input class="GymSetup__closeCheckboxInput" type="checkbox"><label class="GymSetup__openClose">Closed</label>
35
+ </div>
36
+
37
+
38
+ <div class="GymSetup__stepTwoDayOfWeek">
39
+ <label class="GymSetup__dayLabelText">Tuesday</label>
40
+ <div class="GymSetup__StepTwoHoursInputFlex">
41
+ <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required> <span>-</span> <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required>
42
+ </div>
43
+ <input class="GymSetup__closeCheckboxInput" type="checkbox"><label class="GymSetup__openClose">Closed</label>
44
+ </div>
45
+
46
+
47
+ <div class="GymSetup__stepTwoDayOfWeek">
48
+ <label class="GymSetup__dayLabelText">Wednesday</label>
49
+ <div class="GymSetup__StepTwoHoursInputFlex">
50
+ <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required> <span>-</span> <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required>
51
+ </div>
52
+ <input class="GymSetup__closeCheckboxInput" type="checkbox"><label class="GymSetup__openClose">Closed</label>
53
+ </div>
54
+
55
+
56
+ <div class="GymSetup__stepTwoDayOfWeek">
57
+ <label class="GymSetup__dayLabelText">Thursday</label>
58
+ <div class="GymSetup__StepTwoHoursInputFlex">
59
+ <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required> <span>-</span> <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required>
60
+ </div>
61
+ <input class="GymSetup__closeCheckboxInput" type="checkbox"><label class="GymSetup__openClose">Closed</label>
62
+ </div>
63
+
64
+
65
+ <div class="GymSetup__stepTwoDayOfWeek">
66
+ <label class="GymSetup__dayLabelText">Friday</label>
67
+ <div class="GymSetup__StepTwoHoursInputFlex">
68
+ <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required> <span>-</span> <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required>
69
+ </div>
70
+ <input class="GymSetup__closeCheckboxInput" type="checkbox"><label class="GymSetup__openClose">Closed</label>
71
+ </div>
72
+
73
+
74
+ <div class="GymSetup__stepTwoDayOfWeek">
75
+ <label class="GymSetup__dayLabelText">Saturday</label>
76
+ <div class="GymSetup__StepTwoHoursInputFlex">
77
+ <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required> <span>-</span> <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required>
78
+ </div>
79
+ <input class="GymSetup__closeCheckboxInput" type="checkbox"><label class="GymSetup__openClose">Closed</label>
80
+ </div>
81
+
82
+
83
+ <div class="GymSetup__stepTwoDayOfWeek">
84
+ <label class="GymSetup__dayLabelText">Sunday</label>
85
+ <div class="GymSetup__StepTwoHoursInputFlex">
86
+ <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required> <span>-</span> <input class="GymSetup__hoursInput GymSetup__stepTwoInputSpacer" type="time" name="mondayOpen" required>
87
+ </div>
88
+ <input class="GymSetup__closeCheckboxInput" type="checkbox"><label class="GymSetup__openClose">Closed</label>
89
+ </div>
90
+
91
+
92
+ <label class="GymSetup__LabelText GymSetup__stepOneLabelSpacer">Holiday Schedule: Please list any holiday hours or closures. You can always update your hours later if they change.</label>
93
+ <textarea class="GymSetup__textInput GymSetup__stepOneInputSpacer GymSetup__descriptionTextBox"></textarea>
94
+ </form>
95
+ </div>
96
+ <button class="GymSetup__StepOneButton" (click)="stepOneContinue()">Continue</button>
97
+
98
+ </div>
99
+
100
+ <div *ngIf="currStep ===3" class="GymSetup__stepOne" [ngClass]="{'GymSteup__stepHidden': stepOne !== 3}">
101
+ <div class="GymSetup__stepOneDescription">What equipment and amenities are available?</div>
102
+ <div class="GymSetup__stepOneadditionalInfo">Be sure to include available services and items for purchase</div>
103
+ <div class="GymSetup__stepTwoBox">
104
+ <form class="GymSetup__amenitiesForm">
105
+ <div class="GymSetup__ammenitiesFlexRow">
106
+
107
+ <!-- Column #2-->
108
+ <div class="GymSetup__ammenitiesColumnOne">
109
+ <div class="GymSetup__stepThreeAmenitiesFlex">
110
+ <input class="GymSetup__amenitiesCheckboxInput" type="checkbox"><label class="GymSetup__amenitiesCheckboxLabel">Dumbells</label>
111
+ </div>
112
+ <div class="GymSetup__stepThreeAmenitiesFlex">
113
+ <input class="GymSetup__amenitiesCheckboxInput" type="checkbox"><label class="GymSetup__amenitiesCheckboxLabel">Dumbells</label>
114
+ </div>
115
+ <div class="GymSetup__stepThreeAmenitiesFlex">
116
+ <input class="GymSetup__amenitiesCheckboxInput" type="checkbox"><label class="GymSetup__amenitiesCheckboxLabel">Dumbells</label>
117
+ </div>
118
+ <div class="GymSetup__stepThreeAmenitiesFlex">
119
+ <input class="GymSetup__amenitiesCheckboxInput" type="checkbox"><label class="GymSetup__amenitiesCheckboxLabel">Dumbells</label>
120
+ </div>
121
+ </div>
122
+
123
+ <!-- Column #2-->
124
+ <div class="GymSetup__ammenitiesColumnTwo">
125
+ <div class="GymSetup__stepThreeAmenitiesFlex">
126
+ <input class="GymSetup__amenitiesCheckboxInput" type="checkbox"><label class="GymSetup__amenitiesCheckboxLabel">Dumbells</label>
127
+ </div>
128
+ <div class="GymSetup__stepThreeAmenitiesFlex">
129
+ <input class="GymSetup__amenitiesCheckboxInput" type="checkbox"><label class="GymSetup__amenitiesCheckboxLabel">Dumbells</label>
130
+ </div>
131
+ <div class="GymSetup__stepThreeAmenitiesFlex">
132
+ <input class="GymSetup__amenitiesCheckboxInput" type="checkbox"><label class="GymSetup__amenitiesCheckboxLabel">Dumbells</label>
133
+ </div>
134
+ <div class="GymSetup__stepThreeAmenitiesFlex">
135
+ <input class="GymSetup__amenitiesCheckboxInput" type="checkbox"><label class="GymSetup__amenitiesCheckboxLabel">Dumbells</label>
136
+ </div>
137
+ </div>
138
+
139
+
140
+
141
+
142
+
143
+ </div>
144
+ <label class="GymSetup__LabelText GymSetup__stepOneLabelSpacer">Additional Amenities</label><textarea class="GymSetup__textInput GymSetup__stepOneInputSpacer GymSetup__descriptionTextBox"></textarea>
145
+ </form>
146
+ </div>
147
+ <button class="GymSetup__StepOneButton" (click)="stepOneContinue()">Continue</button>
148
+
149
+ </div>
150
+
151
+ <div *ngIf="currStep ===4" class="GymSetup__stepOne" [ngClass]="{'GymSteup__stepHidden': stepOne !== 4}">
152
+ <div class="GymSetup__stepOneDescription">Pictures</div>
153
+ <div class="GymSetup__stepOneadditionalInfo">Pictures are optional but highly recommended</div>
154
+ <div class="GymSetup__stepTwoBox">
155
+ <form class="GymSetup__amenitiesForm">
156
+ <input type="file" data-multiple-caption="{count} files selected" multiple>
157
+ </form>
158
+ </div>
159
+ <button class="GymSetup__StepOneButton" (click)="stepOneContinue()">Continue</button>
160
+
161
+ </div>
162
+
163
+ <div *ngIf="currStep ===5" class="GymSetup__stepOne" [ngClass]="{'GymSteup__stepHidden': stepOne !== 5}">
164
+ <div class="GymSetup__stepOneDescription">Liability Waiver</div>
165
+ <div class="GymSetup__stepOneadditionalInfo">If you have a liability waiver which you need signed before a workout you can upload it here to have members agree before checking in. You can always update this later if required.</div>
166
+ <div class="GymSetup__stepTwoBox">
167
+ <form class="GymSetup__amenitiesForm">
168
+ <input type="file" data-multiple-caption="{count} files selected" multiple>
169
+ </form>
170
+ </div>
171
+ <button class="GymSetup__StepOneButton" (click)="stepOneContinue()">Continue</button>
172
+
173
+ </div>
174
+
175
+ <div *ngIf="currStep ===6" class="GymSetup__stepOne" [ngClass]="{'GymSteup__stepHidden': stepOne !== 6}">
176
+ <div class="GymSetup__stepOneDescription">Members</div>
177
+ <div class="GymSetup__stepOneadditionalInfo">This helps up understand the needs of your gym and grow its membership</div>
178
+ <div class="GymSetup__stepTwoBox">
179
+ <form class="GymSetup__amenitiesForm">
180
+ <label class="GymSetup__LabelText GymSetup__stepOneLabelSpacer">How many members does your gym have today?</label><textarea class="GymSetup__textInput GymSetup__stepOneInputSpacer GymSetup__descriptionTextBox"></textarea>
181
+ </form>
182
+ </div>
183
+ <button class="GymSetup__StepOneButton" (click)="stepOneContinue()">Continue</button>
184
+
185
+ </div>
186
+
187
+
188
+ <div class="GymSetup__stepsSectionFlexParent">
189
+ <div class="GymSetup__stepsHeader">Steps</div>
190
+ <div class="GymSetup__stepsStateFlex">
191
+ <span class="GymSetup__upcomingStep" [ngClass]="{'GymSetup__currentStep' : stepOne === 1}">Basic Info</span>
192
+ <span class="GymSetup__upcomingStep" [ngClass]="{'GymSetup__currentStep' : stepOne === 2}">Hours</span>
193
+ <span class="GymSetup__upcomingStep" [ngClass]="{'GymSetup__currentStep' : stepOne === 3}">Amenities</span>
194
+ <span class="GymSetup__upcomingStep" [ngClass]="{'GymSetup__currentStep' : stepOne === 4}">Pictures</span>
195
+ <span class="GymSetup__upcomingStep" [ngClass]="{'GymSetup__currentStep' : stepOne === 5}">Liability Waiver</span>
196
+ <span class="GymSetup__upcomingStep" [ngClass]="{'GymSetup__currentStep' : stepOne === 6 }">Members</span>
197
+ </div>
198
+ </div>
199
+ </div>
frontend/src/app/uploader/uploader.component.scss ADDED
@@ -0,0 +1,285 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .GymSetup__flexParent {
2
+ display: flex;
3
+ flex-direction: column;
4
+ justify-content: center;
5
+ height: 100vh;
6
+
7
+
8
+ font-family: 'Inter UI', Inter;
9
+ font-style: normal;
10
+ font-weight: 500;
11
+ color: rgb(40, 42, 48);
12
+ letter-spacing: -0.24px;
13
+ text-rendering: optimizeLegibility;
14
+ -webkit-font-smoothing: antialiased;
15
+ }
16
+ .GymSteup__stepHidden {
17
+ opacity: 0 !important;
18
+ }
19
+ .GymSetup__stepOne {
20
+ display: flex;
21
+ flex-direction: column;
22
+ margin-left: auto;
23
+ margin-right: auto;
24
+ padding-left: 24px;
25
+ padding-right: 24px;
26
+ opacity: 1;
27
+ transition: opacity 250ms ease 0ms;
28
+ }
29
+ .GymSetup__stepOneDescription {
30
+ font-family: 'Inter UI', Inter;
31
+ font-style: normal;
32
+ font-weight: 500;
33
+ line-height: 32px;
34
+ font-size: 24px;
35
+ color: rgb(40, 42, 48);
36
+ letter-spacing: -0.24px;
37
+ text-rendering: optimizeLegibility;
38
+ -webkit-font-smoothing: antialiased;
39
+ margin-bottom: 12px;
40
+ text-align: center;
41
+ }
42
+ .GymSetup__stepBox {
43
+ //width: 90%;
44
+ max-width: 564px;
45
+ height: 356px;
46
+ //background: lightgray;
47
+ box-shadow: rgb(0 0 0 / 15%) 0px 5px 20px;
48
+ border-radius: 8px;
49
+ margin-top: 32px;
50
+ display: flex;
51
+ flex-direction: column;
52
+ padding: 24px 32px;
53
+ }
54
+ .GymSetup__stepOneForm {
55
+ display: flex;
56
+ flex-direction: column;
57
+ }
58
+ .GymSetup__StepOneButton {
59
+ font-family: 'Inter UI', Inter;
60
+ height: 48px;
61
+ width: 336px;
62
+ max-width: 90vw;
63
+ align-items: center;
64
+ justify-content: center;
65
+ margin-left: auto;
66
+ margin-right: auto;
67
+ margin-top: 48px;
68
+ background-color: rgb(0,0,0, 0);
69
+ font-size: 15px;
70
+ font-style: normal;
71
+ color: rgb(60, 65, 73);
72
+ font-weight: 500;
73
+ border-radius: 4px;
74
+ line-height: normal;
75
+ animation: 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s 1 normal both running;
76
+ transition-property: border, background-color, color, box-shadow, opacity;
77
+ transition-duration: 500ms;
78
+ padding: 0px 14px;
79
+ border: 1px solid rgb(223, 225,228)
80
+ }
81
+ .GymSetup__stepOneadditionalInfo {
82
+ margin-right: auto;
83
+ margin-left: auto;
84
+
85
+ color: rgb(107, 111, 118);
86
+ font-size: 15px;
87
+ font-style: normal;
88
+ font-weight: 400;
89
+ line-height: 23px;
90
+ text-rendering: optimizeLegibility;
91
+ -webkit-text-size-adjust: 100%;
92
+ text-align: center;
93
+ max-width: 600px;
94
+ }
95
+ .GymSetup__LabelText {
96
+ font-family: 'Inter UI', Inter;
97
+ font-style: normal;
98
+ line-height: normal;
99
+ text-align: left;
100
+ color: rgb(60, 65, 73);
101
+ font-size: 13px;
102
+ font-weight: 500;
103
+ }
104
+ .GymSetup__stepOneGymNameLabelSpacer {
105
+ margin-bottom: 6px;
106
+ }
107
+ .GymSetup__stepTwoBox {
108
+ //width: 90%;
109
+ max-width: 564px;
110
+ height: 390px;
111
+ //background: lightgray;
112
+ box-shadow: rgb(0 0 0 / 15%) 0px 5px 20px;
113
+ border-radius: 8px;
114
+ margin-top: 32px;
115
+ display: flex;
116
+ flex-direction: column;
117
+ padding: 24px 32px;
118
+ }
119
+ .GymSetup__stepTwoDayOfWeek {
120
+ display: flex;
121
+ margin-bottom: 12px;
122
+ }
123
+ .GymSetup__dayLabelText {
124
+ font-family: 'Inter UI', Inter;
125
+ font-style: normal;
126
+ line-height: normal;
127
+ text-align: left;
128
+ color: rgb(60, 65, 73);
129
+ font-size: 14px;
130
+ font-weight: 500;
131
+ margin-top: 3px;
132
+ margin-right: 12px;
133
+ width: 80px;
134
+ }
135
+
136
+ .GymSetup__StepTwoHoursInputFlex {
137
+ display: flex;
138
+ justify-content: space-between;
139
+ width: 220px;
140
+ }
141
+ .GymSetup__closeCheckboxInput {
142
+ margin-left: 24px;
143
+ }
144
+ .GymSetup__openClose {
145
+ color: rgb(107, 111, 118);
146
+ font-size: 12.5px;
147
+ font-style: normal;
148
+ font-weight: 400;
149
+ line-height: 23px;
150
+ text-rendering: optimizeLegibility;
151
+ -webkit-text-size-adjust: 100%;
152
+ text-align: center;
153
+ margin-top: 1.5px;
154
+ margin-left: 2px;
155
+ }
156
+ .GymSetup__stepOneLabelSpacer {
157
+ margin-bottom: 6px;
158
+ margin-top: 12px;
159
+ }
160
+ .GymSetup__stepOneInputSpacer {
161
+
162
+ }
163
+ .GymSetup__textInput {
164
+ appearance: none;
165
+ padding-left: 6px;
166
+ padding-right: 6px;
167
+ padding-top: 4px;
168
+ padding-bottom: 4px;
169
+ background: rgb(255, 255, 255);
170
+ border: 1px solid rgb(223, 225, 228);
171
+ border-radius: 4px;
172
+ font-family: 'Inter UI', Inter;
173
+ font-size: 0.8125rem;
174
+ color: rgb(40, 42, 48);
175
+ margin: 0px;
176
+ appearance: none;
177
+ transition: border 0.3s;
178
+ app-region: no-drag;
179
+ resize: none;
180
+ }
181
+ .GymSetup__textInput:focus {
182
+ outline: none;
183
+ box-shadow: none;
184
+ border-color: rgb(33, 96, 220)
185
+ }
186
+ .GymSetup__descriptionTextBox {
187
+ height: 60px;
188
+ }
189
+ .GymSetup__stepsSectionFlexParent {
190
+ display: flex;
191
+ flex-direction: column;
192
+ justify-content: center;
193
+
194
+ margin-top: 24px;
195
+ }
196
+ .GymSetup__stepsHeader {
197
+ text-align: center;
198
+ }
199
+ .GymSetup__stepsStateFlex {
200
+ display: flex;
201
+ justify-content: center;
202
+ margin-top: 12px;
203
+ }
204
+ .GymSetup__upcomingStep {
205
+ margin-left: 12px;
206
+ padding: 4px;
207
+ //font
208
+ color: rgb(107, 111, 118);
209
+ font-size: 15px;
210
+ font-style: normal;
211
+ font-weight: 500;
212
+ line-height: 23px;
213
+ text-rendering: optimizeLegibility;
214
+ border: 1px solid transparent;
215
+ -webkit-text-size-adjust: 100%;
216
+ //transition: border 5s ease;
217
+ -webkit-transition: all .3s ease-in-out;
218
+ transition: all .3s ease-in-out;
219
+
220
+ }
221
+ .GymSetup__currentStep {
222
+ border: 1px solid rgb(223, 225, 228);
223
+ border-radius: 4px;
224
+ box-shadow: rgba(0, 0, 0, 0.11) 0px 5px 20px;
225
+ -webkit-transition: all .3s ease-in-out;
226
+ transition: all .3s ease-in-out;
227
+ }
228
+
229
+ .GymSetup__hoursInput {
230
+ appearance: none;
231
+ padding-left: 6px;
232
+ padding-right: 6px;
233
+ padding-top: 4px;
234
+ padding-bottom: 4px;
235
+ background: rgb(255, 255, 255);
236
+ border: 1px solid rgb(223, 225, 228);
237
+ border-radius: 4px;
238
+ color: rgb(40, 42, 48);
239
+ margin: 0px;
240
+ appearance: none;
241
+ transition: border 0.3s;
242
+ //app-region: no-drag;
243
+ resize: none;
244
+ //width: 45%;
245
+ font-size: 10px;
246
+ font-family: 'Inter UI', Inter;
247
+ }
248
+ .GymSetup__hoursInput:focus {
249
+ outline: none;
250
+ box-shadow: none;
251
+ border-color: rgb(33, 96, 220)
252
+ }
253
+ .GymSetup__stepTwoInputSpacer {
254
+ display: inline;
255
+ }
256
+ .GymSetup__amenitiesForm {
257
+ display: flex;
258
+ flex-direction: column;
259
+ }
260
+ .GymSetup__ammenitiesFlexRow {
261
+ display: flex;
262
+ }
263
+ .GymSetup__ammenitiesColumnOne {
264
+ display: flex;
265
+ flex-direction: column;
266
+ }
267
+ .GymSetup__stepThreeAmenitiesFlex {
268
+ display: flex;
269
+ width: 150px;
270
+ }
271
+ .GymSetup__amenitiesCheckboxInput {
272
+ margin-top: 2px;
273
+ }
274
+ .GymSetup__amenitiesCheckboxLabel {
275
+ color: rgb(107, 111, 118);
276
+ font-size: 12.5px;
277
+ font-style: normal;
278
+ font-weight: 400;
279
+ line-height: 23px;
280
+ text-rendering: optimizeLegibility;
281
+ -webkit-text-size-adjust: 100%;
282
+ text-align: center;
283
+ margin-top: 0px;
284
+ margin-left: 4px;
285
+ }
frontend/src/app/uploader/uploader.component.spec.ts ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { UploaderComponent } from './uploader.component';
4
+
5
+ describe('UploaderComponent', () => {
6
+ let component: UploaderComponent;
7
+ let fixture: ComponentFixture<UploaderComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ UploaderComponent ]
12
+ })
13
+ .compileComponents();
14
+
15
+ fixture = TestBed.createComponent(UploaderComponent);
16
+ component = fixture.componentInstance;
17
+ fixture.detectChanges();
18
+ });
19
+
20
+ it('should create', () => {
21
+ expect(component).toBeTruthy();
22
+ });
23
+ });
frontend/src/app/uploader/uploader.component.ts ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Component, OnInit } from '@angular/core';
2
+ //import {RequestService} from "../services/request-service/request.service";
3
+ import {take} from "rxjs/operators";
4
+ import {ActivatedRoute} from "@angular/router";
5
+
6
+ @Component({
7
+ selector: 'UploaderComponent',
8
+ templateUrl: './uploader.component.html',
9
+ styleUrls: ['./uploader.component.scss']
10
+ })
11
+ export class UploaderComponent implements OnInit {
12
+ public readonly numberOfSteps: number = 6;
13
+ public stepOne: number = 1;
14
+ public currStep: number = 1;
15
+
16
+
17
+ constructor(//private requestService: RequestService,
18
+ private activatedRoute: ActivatedRoute,
19
+ ) { }
20
+
21
+ public ngOnInit(): void {
22
+
23
+ }
24
+ public stepOneContinue() {
25
+ if(this.stepOne < this.numberOfSteps) {
26
+ this.stepOne++;
27
+ } else {
28
+ this.stepOne = 1
29
+ }
30
+ setTimeout(() => {
31
+ if(this.currStep < this.numberOfSteps) {
32
+ this.currStep++;
33
+ } else {
34
+ this.currStep = 1
35
+ }
36
+ }, 250);
37
+ }
38
+ }
frontend/src/assets/.gitkeep ADDED
File without changes
frontend/src/favicon.ico ADDED
frontend/src/index.html ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Frontend</title>
6
+ <base href="/">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1">
8
+ <link rel="icon" type="image/x-icon" href="favicon.ico">
9
+ </head>
10
+ <body>
11
+ <app-root></app-root>
12
+ </body>
13
+ </html>
frontend/src/main.ts ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
2
+
3
+ import { AppModule } from './app/app.module';
4
+
5
+
6
+ platformBrowserDynamic().bootstrapModule(AppModule)
7
+ .catch(err => console.error(err));
frontend/src/styles.scss ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* You can add global styles to this file, and also import other style files */
2
+ //https://www.npmjs.com/package/inter-ui
3
+ @use "~inter-ui/default" with (
4
+ $inter-font-display: swap,
5
+ $inter-font-path: '~inter-ui/Inter (web)'
6
+ );
7
+ @use "~inter-ui/variable" with (
8
+ $inter-font-display: swap,
9
+ $inter-font-path: '~inter-ui/Inter (web)'
10
+ );
11
+ @include default.all;
12
+ @include variable.all;
13
+
14
+ html { font-family: "Inter", "system-ui"; }
15
+
16
+ @supports (font-variation-settings: normal) {
17
+ html { font-family: "Inter var", "system-ui"; }
18
+ }
19
+
20
+
21
+
22
+ body {
23
+ margin: 0; //Apparently there is a default 8px margin... I dislike this...
24
+ font-family: "Inter", sans-serif;
25
+ }
26
+
frontend/tsconfig.app.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "./tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "./out-tsc/app",
6
+ "types": []
7
+ },
8
+ "files": [
9
+ "src/main.ts"
10
+ ],
11
+ "include": [
12
+ "src/**/*.d.ts"
13
+ ]
14
+ }
frontend/tsconfig.json ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "compileOnSave": false,
4
+ "compilerOptions": {
5
+ "baseUrl": "./",
6
+ "outDir": "./dist/out-tsc",
7
+ "forceConsistentCasingInFileNames": true,
8
+ "strict": true,
9
+ "noImplicitOverride": true,
10
+ "noPropertyAccessFromIndexSignature": true,
11
+ "noImplicitReturns": true,
12
+ "noFallthroughCasesInSwitch": true,
13
+ "sourceMap": true,
14
+ "declaration": false,
15
+ "downlevelIteration": true,
16
+ "experimentalDecorators": true,
17
+ "moduleResolution": "node",
18
+ "importHelpers": true,
19
+ "target": "ES2022",
20
+ "module": "ES2022",
21
+ "useDefineForClassFields": false,
22
+ "lib": [
23
+ "ES2022",
24
+ "dom"
25
+ ]
26
+ },
27
+ "angularCompilerOptions": {
28
+ "enableI18nLegacyMessageIdFormat": false,
29
+ "strictInjectionParameters": true,
30
+ "strictInputAccessModifiers": true,
31
+ "strictTemplates": true
32
+ }
33
+ }
frontend/tsconfig.spec.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "./tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "./out-tsc/spec",
6
+ "types": [
7
+ "jasmine"
8
+ ]
9
+ },
10
+ "include": [
11
+ "src/**/*.spec.ts",
12
+ "src/**/*.d.ts"
13
+ ]
14
+ }
frontend/yarn.lock ADDED
The diff for this file is too large to render. See raw diff
 
fronty/.editorconfig ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Editor configuration, see https://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ indent_style = space
7
+ indent_size = 2
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.ts]
12
+ quote_type = single
13
+
14
+ [*.md]
15
+ max_line_length = off
16
+ trim_trailing_whitespace = false
fronty/.gitignore ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # See http://help.github.com/ignore-files/ for more about ignoring files.
2
+
3
+ # Compiled output
4
+ /dist
5
+ /tmp
6
+ /out-tsc
7
+ /bazel-out
8
+
9
+ # Node
10
+ /node_modules
11
+ npm-debug.log
12
+ yarn-error.log
13
+
14
+ # IDEs and editors
15
+ .idea/
16
+ .project
17
+ .classpath
18
+ .c9/
19
+ *.launch
20
+ .settings/
21
+ *.sublime-workspace
22
+
23
+ # Visual Studio Code
24
+ .vscode/*
25
+ !.vscode/settings.json
26
+ !.vscode/tasks.json
27
+ !.vscode/launch.json
28
+ !.vscode/extensions.json
29
+ .history/*
30
+
31
+ # Miscellaneous
32
+ /.angular/cache
33
+ .sass-cache/
34
+ /connect.lock
35
+ /coverage
36
+ /libpeerconnection.log
37
+ testem.log
38
+ /typings
39
+
40
+ # System files
41
+ .DS_Store
42
+ Thumbs.db
fronty/.vscode/extensions.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
3
+ "recommendations": ["angular.ng-template"]
4
+ }
fronty/.vscode/launch.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
3
+ "version": "0.2.0",
4
+ "configurations": [
5
+ {
6
+ "name": "ng serve",
7
+ "type": "pwa-chrome",
8
+ "request": "launch",
9
+ "preLaunchTask": "npm: start",
10
+ "url": "http://localhost:4200/"
11
+ },
12
+ {
13
+ "name": "ng test",
14
+ "type": "chrome",
15
+ "request": "launch",
16
+ "preLaunchTask": "npm: test",
17
+ "url": "http://localhost:9876/debug.html"
18
+ }
19
+ ]
20
+ }
fronty/.vscode/tasks.json ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
3
+ "version": "2.0.0",
4
+ "tasks": [
5
+ {
6
+ "type": "npm",
7
+ "script": "start",
8
+ "isBackground": true,
9
+ "problemMatcher": {
10
+ "owner": "typescript",
11
+ "pattern": "$tsc",
12
+ "background": {
13
+ "activeOnStart": true,
14
+ "beginsPattern": {
15
+ "regexp": "(.*?)"
16
+ },
17
+ "endsPattern": {
18
+ "regexp": "bundle generation complete"
19
+ }
20
+ }
21
+ }
22
+ },
23
+ {
24
+ "type": "npm",
25
+ "script": "test",
26
+ "isBackground": true,
27
+ "problemMatcher": {
28
+ "owner": "typescript",
29
+ "pattern": "$tsc",
30
+ "background": {
31
+ "activeOnStart": true,
32
+ "beginsPattern": {
33
+ "regexp": "(.*?)"
34
+ },
35
+ "endsPattern": {
36
+ "regexp": "bundle generation complete"
37
+ }
38
+ }
39
+ }
40
+ }
41
+ ]
42
+ }
fronty/README.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Fronty
2
+
3
+ This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.0.2.
4
+
5
+ ## Development server
6
+
7
+ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
8
+
9
+ ## Code scaffolding
10
+
11
+ Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
12
+
13
+ ## Build
14
+
15
+ Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
16
+
17
+ ## Running unit tests
18
+
19
+ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
20
+
21
+ ## Running end-to-end tests
22
+
23
+ Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
24
+
25
+ ## Further help
26
+
27
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
fronty/angular.json ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3
+ "version": 1,
4
+ "newProjectRoot": "projects",
5
+ "projects": {
6
+ "fronty": {
7
+ "projectType": "application",
8
+ "schematics": {
9
+ "@schematics/angular:component": {
10
+ "style": "scss"
11
+ }
12
+ },
13
+ "root": "",
14
+ "sourceRoot": "src",
15
+ "prefix": "app",
16
+ "architect": {
17
+ "build": {
18
+ "builder": "@angular-devkit/build-angular:browser",
19
+ "options": {
20
+ "outputPath": "dist/fronty",
21
+ "index": "src/index.html",
22
+ "main": "src/main.ts",
23
+ "polyfills": [
24
+ "zone.js"
25
+ ],
26
+ "tsConfig": "tsconfig.app.json",
27
+ "inlineStyleLanguage": "scss",
28
+ "assets": [
29
+ "src/favicon.ico",
30
+ "src/assets"
31
+ ],
32
+ "styles": [
33
+ "src/styles.scss"
34
+ ],
35
+ "scripts": []
36
+ },
37
+ "configurations": {
38
+ "production": {
39
+ "budgets": [
40
+ {
41
+ "type": "initial",
42
+ "maximumWarning": "500kb",
43
+ "maximumError": "1mb"
44
+ },
45
+ {
46
+ "type": "anyComponentStyle",
47
+ "maximumWarning": "2kb",
48
+ "maximumError": "4kb"
49
+ }
50
+ ],
51
+ "outputHashing": "all"
52
+ },
53
+ "development": {
54
+ "buildOptimizer": false,
55
+ "optimization": false,
56
+ "vendorChunk": true,
57
+ "extractLicenses": false,
58
+ "sourceMap": true,
59
+ "namedChunks": true
60
+ }
61
+ },
62
+ "defaultConfiguration": "production"
63
+ },
64
+ "serve": {
65
+ "builder": "@angular-devkit/build-angular:dev-server",
66
+ "configurations": {
67
+ "production": {
68
+ "browserTarget": "fronty:build:production"
69
+ },
70
+ "development": {
71
+ "browserTarget": "fronty:build:development"
72
+ }
73
+ },
74
+ "defaultConfiguration": "development"
75
+ },
76
+ "extract-i18n": {
77
+ "builder": "@angular-devkit/build-angular:extract-i18n",
78
+ "options": {
79
+ "browserTarget": "fronty:build"
80
+ }
81
+ },
82
+ "test": {
83
+ "builder": "@angular-devkit/build-angular:karma",
84
+ "options": {
85
+ "polyfills": [
86
+ "zone.js",
87
+ "zone.js/testing"
88
+ ],
89
+ "tsConfig": "tsconfig.spec.json",
90
+ "inlineStyleLanguage": "scss",
91
+ "assets": [
92
+ "src/favicon.ico",
93
+ "src/assets"
94
+ ],
95
+ "styles": [
96
+ "src/styles.scss"
97
+ ],
98
+ "scripts": []
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
fronty/package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
fronty/package.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "fronty",
3
+ "version": "0.0.0",
4
+ "scripts": {
5
+ "ng": "ng",
6
+ "start": "ng serve",
7
+ "build": "ng build",
8
+ "watch": "ng build --watch --configuration development",
9
+ "test": "ng test"
10
+ },
11
+ "private": true,
12
+ "dependencies": {
13
+ "@angular/animations": "^15.0.0",
14
+ "@angular/common": "^15.0.0",
15
+ "@angular/compiler": "^15.0.0",
16
+ "@angular/core": "^15.0.0",
17
+ "@angular/forms": "^15.0.0",
18
+ "@angular/platform-browser": "^15.0.0",
19
+ "@angular/platform-browser-dynamic": "^15.0.0",
20
+ "@angular/router": "^15.0.0",
21
+ "inter-ui": "^3.19.3",
22
+ "rxjs": "~7.5.0",
23
+ "tslib": "^2.3.0",
24
+ "zone.js": "~0.12.0"
25
+ },
26
+ "devDependencies": {
27
+ "@angular-devkit/build-angular": "^15.0.2",
28
+ "@angular/cli": "~15.0.2",
29
+ "@angular/compiler-cli": "^15.0.0",
30
+ "@types/jasmine": "~4.3.0",
31
+ "jasmine-core": "~4.5.0",
32
+ "karma": "~6.4.0",
33
+ "karma-chrome-launcher": "~3.1.0",
34
+ "karma-coverage": "~2.2.0",
35
+ "karma-jasmine": "~5.1.0",
36
+ "karma-jasmine-html-reporter": "~2.0.0",
37
+ "typescript": "~4.8.2"
38
+ }
39
+ }
fronty/src/app/app-routing.module.ts ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { NgModule } from '@angular/core';
2
+ import { RouterModule, Routes } from '@angular/router';
3
+
4
+ const routes: Routes = [];
5
+
6
+ @NgModule({
7
+ imports: [RouterModule.forRoot(routes)],
8
+ exports: [RouterModule]
9
+ })
10
+ export class AppRoutingModule { }
fronty/src/app/app.component.html ADDED
@@ -0,0 +1,316 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
2
+ <!-- * * * * * * * * * * * The content below * * * * * * * * * * * -->
3
+ <!-- * * * * * * * * * * is only a placeholder * * * * * * * * * * -->
4
+ <!-- * * * * * * * * * * and can be replaced. * * * * * * * * * * * -->
5
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
6
+ <!-- * * * * * * * * * Delete the template below * * * * * * * * * * -->
7
+ <!-- * * * * * * * to get started with your project! * * * * * * * * -->
8
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
9
+
10
+ <style>
11
+ :host {
12
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
13
+ font-size: 14px;
14
+ color: #333;
15
+ box-sizing: border-box;
16
+ -webkit-font-smoothing: antialiased;
17
+ -moz-osx-font-smoothing: grayscale;
18
+ }
19
+
20
+ h1,
21
+ h2,
22
+ h3,
23
+ h4,
24
+ h5,
25
+ h6 {
26
+ margin: 8px 0;
27
+ }
28
+
29
+ p {
30
+ margin: 0;
31
+ }
32
+
33
+ .spacer {
34
+ flex: 1;
35
+ }
36
+
37
+ .toolbar {
38
+ position: absolute;
39
+ top: 0;
40
+ left: 0;
41
+ right: 0;
42
+ height: 60px;
43
+ display: flex;
44
+ align-items: center;
45
+ background-color: #1976d2;
46
+ color: white;
47
+ font-weight: 600;
48
+ }
49
+
50
+ .toolbar img {
51
+ margin: 0 16px;
52
+ }
53
+
54
+ .toolbar #twitter-logo {
55
+ height: 40px;
56
+ margin: 0 8px;
57
+ }
58
+
59
+ .toolbar #youtube-logo {
60
+ height: 40px;
61
+ margin: 0 16px;
62
+ }
63
+
64
+ .toolbar #twitter-logo:hover,
65
+ .toolbar #youtube-logo:hover {
66
+ opacity: 0.8;
67
+ }
68
+
69
+ .content {
70
+ display: flex;
71
+ margin: 82px auto 32px;
72
+ padding: 0 16px;
73
+ max-width: 960px;
74
+ flex-direction: column;
75
+ align-items: center;
76
+ }
77
+
78
+ svg.material-icons {
79
+ height: 24px;
80
+ width: auto;
81
+ }
82
+
83
+ svg.material-icons:not(:last-child) {
84
+ margin-right: 8px;
85
+ }
86
+
87
+ .card svg.material-icons path {
88
+ fill: #888;
89
+ }
90
+
91
+ .card-container {
92
+ display: flex;
93
+ flex-wrap: wrap;
94
+ justify-content: center;
95
+ margin-top: 16px;
96
+ }
97
+
98
+ .card {
99
+ all: unset;
100
+ border-radius: 4px;
101
+ border: 1px solid #eee;
102
+ background-color: #fafafa;
103
+ height: 40px;
104
+ width: 200px;
105
+ margin: 0 8px 16px;
106
+ padding: 16px;
107
+ display: flex;
108
+ flex-direction: row;
109
+ justify-content: center;
110
+ align-items: center;
111
+ transition: all 0.2s ease-in-out;
112
+ line-height: 24px;
113
+ }
114
+
115
+ .card-container .card:not(:last-child) {
116
+ margin-right: 0;
117
+ }
118
+
119
+ .card.card-small {
120
+ height: 16px;
121
+ width: 168px;
122
+ }
123
+
124
+ .card-container .card:not(.highlight-card) {
125
+ cursor: pointer;
126
+ }
127
+
128
+ .card-container .card:not(.highlight-card):hover {
129
+ transform: translateY(-3px);
130
+ box-shadow: 0 4px 17px rgba(0, 0, 0, 0.35);
131
+ }
132
+
133
+ .card-container .card:not(.highlight-card):hover .material-icons path {
134
+ fill: rgb(105, 103, 103);
135
+ }
136
+
137
+ .card.highlight-card {
138
+ background-color: #1976d2;
139
+ color: white;
140
+ font-weight: 600;
141
+ border: none;
142
+ width: auto;
143
+ min-width: 30%;
144
+ position: relative;
145
+ }
146
+
147
+ .card.card.highlight-card span {
148
+ margin-left: 60px;
149
+ }
150
+
151
+ svg#rocket {
152
+ width: 80px;
153
+ position: absolute;
154
+ left: -10px;
155
+ top: -24px;
156
+ }
157
+
158
+ svg#rocket-smoke {
159
+ height: calc(100vh - 95px);
160
+ position: absolute;
161
+ top: 10px;
162
+ right: 180px;
163
+ z-index: -10;
164
+ }
165
+
166
+ a,
167
+ a:visited,
168
+ a:hover {
169
+ color: #1976d2;
170
+ text-decoration: none;
171
+ }
172
+
173
+ a:hover {
174
+ color: #125699;
175
+ }
176
+
177
+ .terminal {
178
+ position: relative;
179
+ width: 80%;
180
+ max-width: 600px;
181
+ border-radius: 6px;
182
+ padding-top: 45px;
183
+ margin-top: 8px;
184
+ overflow: hidden;
185
+ background-color: rgb(15, 15, 16);
186
+ }
187
+
188
+ .terminal::before {
189
+ content: "\2022 \2022 \2022";
190
+ position: absolute;
191
+ top: 0;
192
+ left: 0;
193
+ height: 4px;
194
+ background: rgb(58, 58, 58);
195
+ color: #c2c3c4;
196
+ width: 100%;
197
+ font-size: 2rem;
198
+ line-height: 0;
199
+ padding: 14px 0;
200
+ text-indent: 4px;
201
+ }
202
+
203
+ .terminal pre {
204
+ font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
205
+ color: white;
206
+ padding: 0 1rem 1rem;
207
+ margin: 0;
208
+ }
209
+
210
+ .circle-link {
211
+ height: 40px;
212
+ width: 40px;
213
+ border-radius: 40px;
214
+ margin: 8px;
215
+ background-color: white;
216
+ border: 1px solid #eeeeee;
217
+ display: flex;
218
+ justify-content: center;
219
+ align-items: center;
220
+ cursor: pointer;
221
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
222
+ transition: 1s ease-out;
223
+ }
224
+
225
+ .circle-link:hover {
226
+ transform: translateY(-0.25rem);
227
+ box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.2);
228
+ }
229
+
230
+ footer {
231
+ margin-top: 8px;
232
+ display: flex;
233
+ align-items: center;
234
+ line-height: 20px;
235
+ }
236
+
237
+ footer a {
238
+ display: flex;
239
+ align-items: center;
240
+ }
241
+
242
+ .github-star-badge {
243
+ color: #24292e;
244
+ display: flex;
245
+ align-items: center;
246
+ font-size: 12px;
247
+ padding: 3px 10px;
248
+ border: 1px solid rgba(27,31,35,.2);
249
+ border-radius: 3px;
250
+ background-image: linear-gradient(-180deg,#fafbfc,#eff3f6 90%);
251
+ margin-left: 4px;
252
+ font-weight: 600;
253
+ }
254
+
255
+ .github-star-badge:hover {
256
+ background-image: linear-gradient(-180deg,#f0f3f6,#e6ebf1 90%);
257
+ border-color: rgba(27,31,35,.35);
258
+ background-position: -.5em;
259
+ }
260
+
261
+ .github-star-badge .material-icons {
262
+ height: 16px;
263
+ width: 16px;
264
+ margin-right: 4px;
265
+ }
266
+
267
+ svg#clouds {
268
+ position: fixed;
269
+ bottom: -160px;
270
+ left: -230px;
271
+ z-index: -10;
272
+ width: 1920px;
273
+ }
274
+
275
+ /* Responsive Styles */
276
+ @media screen and (max-width: 767px) {
277
+ .card-container > *:not(.circle-link) ,
278
+ .terminal {
279
+ width: 100%;
280
+ }
281
+
282
+ .card:not(.highlight-card) {
283
+ height: 16px;
284
+ margin: 8px 0;
285
+ }
286
+
287
+ .card.highlight-card span {
288
+ margin-left: 72px;
289
+ }
290
+
291
+ svg#rocket-smoke {
292
+ right: 120px;
293
+ transform: rotate(-5deg);
294
+ }
295
+ }
296
+
297
+ @media screen and (max-width: 575px) {
298
+ svg#rocket-smoke {
299
+ display: none;
300
+ visibility: hidden;
301
+ }
302
+ }
303
+ </style>
304
+
305
+ <!-- Toolbar -->
306
+ <uploader></uploader>
307
+
308
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
309
+ <!-- * * * * * * * * * * * The content above * * * * * * * * * * * -->
310
+ <!-- * * * * * * * * * * is only a placeholder * * * * * * * * * * -->
311
+ <!-- * * * * * * * * * * and can be replaced. * * * * * * * * * * * -->
312
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
313
+ <!-- * * * * * * * * * * End of Placeholder * * * * * * * * * * * -->
314
+ <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
315
+
316
+ <router-outlet></router-outlet>
fronty/src/app/app.component.scss ADDED
File without changes
fronty/src/app/app.component.spec.ts ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { RouterTestingModule } from '@angular/router/testing';
3
+ import { AppComponent } from './app.component';
4
+
5
+ describe('AppComponent', () => {
6
+ beforeEach(async () => {
7
+ await TestBed.configureTestingModule({
8
+ imports: [
9
+ RouterTestingModule
10
+ ],
11
+ declarations: [
12
+ AppComponent
13
+ ],
14
+ }).compileComponents();
15
+ });
16
+
17
+ it('should create the app', () => {
18
+ const fixture = TestBed.createComponent(AppComponent);
19
+ const app = fixture.componentInstance;
20
+ expect(app).toBeTruthy();
21
+ });
22
+
23
+ it(`should have as title 'fronty'`, () => {
24
+ const fixture = TestBed.createComponent(AppComponent);
25
+ const app = fixture.componentInstance;
26
+ expect(app.title).toEqual('fronty');
27
+ });
28
+
29
+ it('should render title', () => {
30
+ const fixture = TestBed.createComponent(AppComponent);
31
+ fixture.detectChanges();
32
+ const compiled = fixture.nativeElement as HTMLElement;
33
+ expect(compiled.querySelector('.content span')?.textContent).toContain('fronty app is running!');
34
+ });
35
+ });
fronty/src/app/app.component.ts ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Component } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'app-root',
5
+ templateUrl: './app.component.html',
6
+ styleUrls: ['./app.component.scss']
7
+ })
8
+ export class AppComponent {
9
+ title = 'fronty';
10
+ }
fronty/src/app/app.module.ts ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { NgModule } from '@angular/core';
2
+ import { BrowserModule } from '@angular/platform-browser';
3
+
4
+ import { AppRoutingModule } from './app-routing.module';
5
+ import { AppComponent } from './app.component';
6
+ import {UploadComponent} from "./gym-setup/upload.component";
7
+ import {ReactiveFormsModule} from "@angular/forms";
8
+
9
+ @NgModule({
10
+ declarations: [
11
+ AppComponent,
12
+ UploadComponent
13
+ ],
14
+ imports: [
15
+ BrowserModule,
16
+ AppRoutingModule,
17
+ ReactiveFormsModule
18
+ ],
19
+ providers: [],
20
+ bootstrap: [AppComponent]
21
+ })
22
+ export class AppModule { }
fronty/src/app/gym-setup/upload.component.html ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="GymSetup__flexParent">
2
+ <div *ngIf="currStep ===1" class="GymSetup__stepOne" [ngClass]="{'GymSteup__stepHidden': stepOne !== 1}">
3
+ <div class="GymSetup__stepOneDescription">Paper to Code</div>
4
+ <div class="GymSetup__stepOneadditionalInfo">We will generate the code for this paper</div>
5
+ <div class="GymSetup__stepBox">
6
+ <form class="OpLogin__form" [formGroup]="form" (ngSubmit)="stepOneContinue()">
7
+ <div class="inputFlexbox"><label class="GymSetup__LabelText GymSetup__stepOneGymNameLabelSpacer">Paper</label>
8
+ <input class="GymSetup__textInput GymSetup__stepOneInputSpacer GymSetup__descriptionTextBox" id="paper" name="paper" type="text" required formControlName="paper">
9
+ </div>
10
+ </form>
11
+ </div>
12
+ <button class="GymSetup__StepOneButton" (click)="stepOneContinue()">Continue</button>
13
+
14
+ </div>
15
+
16
+ </div>
fronty/src/app/gym-setup/upload.component.scss ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .GymSetup__flexParent {
2
+ display: flex;
3
+ flex-direction: column;
4
+ justify-content: center;
5
+ height: 100vh;
6
+
7
+
8
+ font-family: 'Inter UI', Inter;
9
+ font-style: normal;
10
+ font-weight: 500;
11
+ color: rgb(40, 42, 48);
12
+ letter-spacing: -0.24px;
13
+ text-rendering: optimizeLegibility;
14
+ -webkit-font-smoothing: antialiased;
15
+ }
16
+ .inputFlexbox {
17
+ display: flex;
18
+ flex-direction: column;
19
+ }
20
+ .GymSteup__stepHidden {
21
+ opacity: 0 !important;
22
+ }
23
+ .GymSetup__stepOne {
24
+ display: flex;
25
+ flex-direction: column;
26
+ margin-left: auto;
27
+ margin-right: auto;
28
+ padding-left: 24px;
29
+ padding-right: 24px;
30
+ opacity: 1;
31
+ transition: opacity 250ms ease 0ms;
32
+ }
33
+ .GymSetup__stepOneDescription {
34
+ font-family: Inter;
35
+ font-style: normal;
36
+ font-weight: 500;
37
+ line-height: 32px;
38
+ font-size: 24px;
39
+ color: rgb(40, 42, 48);
40
+ letter-spacing: -0.24px;
41
+ text-rendering: optimizeLegibility;
42
+ -webkit-font-smoothing: antialiased;
43
+ margin-bottom: 12px;
44
+ text-align: center;
45
+ }
46
+ .GymSetup__stepBox {
47
+ //width: 90%;
48
+ max-width: 564px;
49
+ height: 356px;
50
+ //background: lightgray;
51
+ box-shadow: rgb(0 0 0 / 15%) 0px 5px 20px;
52
+ border-radius: 8px;
53
+ margin-top: 32px;
54
+ display: flex;
55
+ flex-direction: column;
56
+ padding: 24px 32px;
57
+ }
58
+ .GymSetup__stepOneForm {
59
+ display: flex;
60
+ flex-direction: column;
61
+ }
62
+ .GymSetup__StepOneButton {
63
+ font-family: 'Inter UI', Inter;
64
+ height: 48px;
65
+ width: 336px;
66
+ max-width: 90vw;
67
+ align-items: center;
68
+ justify-content: center;
69
+ margin-left: auto;
70
+ margin-right: auto;
71
+ margin-top: 48px;
72
+ background-color: rgb(0,0,0, 0);
73
+ font-size: 15px;
74
+ font-style: normal;
75
+ color: rgb(60, 65, 73);
76
+ font-weight: 500;
77
+ border-radius: 4px;
78
+ line-height: normal;
79
+ animation: 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s 1 normal both running;
80
+ transition-property: border, background-color, color, box-shadow, opacity;
81
+ transition-duration: 500ms;
82
+ padding: 0px 14px;
83
+ border: 1px solid rgb(223, 225,228)
84
+ }
85
+ .GymSetup__stepOneadditionalInfo {
86
+ margin-right: auto;
87
+ margin-left: auto;
88
+
89
+ color: rgb(107, 111, 118);
90
+ font-size: 15px;
91
+ font-style: normal;
92
+ font-weight: 400;
93
+ line-height: 23px;
94
+ text-rendering: optimizeLegibility;
95
+ -webkit-text-size-adjust: 100%;
96
+ text-align: center;
97
+ max-width: 600px;
98
+ }
99
+ .GymSetup__LabelText {
100
+ font-family: 'Inter UI', Inter;
101
+ font-style: normal;
102
+ line-height: normal;
103
+ text-align: left;
104
+ color: rgb(60, 65, 73);
105
+ font-size: 13px;
106
+ font-weight: 500;
107
+ }
108
+ .GymSetup__stepOneGymNameLabelSpacer {
109
+ margin-bottom: 6px;
110
+ }
111
+ .GymSetup__stepTwoBox {
112
+ //width: 90%;
113
+ max-width: 564px;
114
+ height: 390px;
115
+ //background: lightgray;
116
+ box-shadow: rgb(0 0 0 / 15%) 0px 5px 20px;
117
+ border-radius: 8px;
118
+ margin-top: 32px;
119
+ display: flex;
120
+ flex-direction: column;
121
+ padding: 24px 32px;
122
+ }
123
+ .GymSetup__stepTwoDayOfWeek {
124
+ display: flex;
125
+ margin-bottom: 12px;
126
+ }
127
+ .GymSetup__dayLabelText {
128
+ font-family: 'Inter UI', Inter;
129
+ font-style: normal;
130
+ line-height: normal;
131
+ text-align: left;
132
+ color: rgb(60, 65, 73);
133
+ font-size: 14px;
134
+ font-weight: 500;
135
+ margin-top: 3px;
136
+ margin-right: 12px;
137
+ width: 80px;
138
+ }
139
+
140
+ .GymSetup__StepTwoHoursInputFlex {
141
+ display: flex;
142
+ justify-content: space-between;
143
+ width: 220px;
144
+ }
145
+ .GymSetup__closeCheckboxInput {
146
+ margin-left: 24px;
147
+ }
148
+ .GymSetup__openClose {
149
+ color: rgb(107, 111, 118);
150
+ font-size: 12.5px;
151
+ font-style: normal;
152
+ font-weight: 400;
153
+ line-height: 23px;
154
+ text-rendering: optimizeLegibility;
155
+ -webkit-text-size-adjust: 100%;
156
+ text-align: center;
157
+ margin-top: 1.5px;
158
+ margin-left: 2px;
159
+ }
160
+ .GymSetup__stepOneLabelSpacer {
161
+ margin-bottom: 6px;
162
+ margin-top: 12px;
163
+ }
164
+ .GymSetup__stepOneInputSpacer {
165
+
166
+ }
167
+ .GymSetup__textInput {
168
+ appearance: none;
169
+ padding-left: 6px;
170
+ padding-right: 6px;
171
+ padding-top: 4px;
172
+ padding-bottom: 4px;
173
+ background: rgb(255, 255, 255);
174
+ border: 1px solid rgb(223, 225, 228);
175
+ border-radius: 4px;
176
+ font-family: 'Inter UI', Inter;
177
+ font-size: 0.8125rem;
178
+ color: rgb(40, 42, 48);
179
+ margin: 0px;
180
+ appearance: none;
181
+ transition: border 0.3s;
182
+ app-region: no-drag;
183
+ resize: none;
184
+ }
185
+ .GymSetup__textInput:focus {
186
+ outline: none;
187
+ box-shadow: none;
188
+ border-color: rgb(33, 96, 220)
189
+ }
190
+ .GymSetup__descriptionTextBox {
191
+ height: 60px;
192
+ }
193
+ .GymSetup__stepsSectionFlexParent {
194
+ display: flex;
195
+ flex-direction: column;
196
+ justify-content: center;
197
+
198
+ margin-top: 24px;
199
+ }
200
+ .GymSetup__stepsHeader {
201
+ text-align: center;
202
+ }
203
+ .GymSetup__stepsStateFlex {
204
+ display: flex;
205
+ justify-content: center;
206
+ margin-top: 12px;
207
+ }
208
+ .GymSetup__upcomingStep {
209
+ margin-left: 12px;
210
+ padding: 4px;
211
+ //font
212
+ color: rgb(107, 111, 118);
213
+ font-size: 15px;
214
+ font-style: normal;
215
+ font-weight: 500;
216
+ line-height: 23px;
217
+ text-rendering: optimizeLegibility;
218
+ border: 1px solid transparent;
219
+ -webkit-text-size-adjust: 100%;
220
+ //transition: border 5s ease;
221
+ -webkit-transition: all .3s ease-in-out;
222
+ transition: all .3s ease-in-out;
223
+
224
+ }
225
+ .GymSetup__currentStep {
226
+ border: 1px solid rgb(223, 225, 228);
227
+ border-radius: 4px;
228
+ box-shadow: rgba(0, 0, 0, 0.11) 0px 5px 20px;
229
+ -webkit-transition: all .3s ease-in-out;
230
+ transition: all .3s ease-in-out;
231
+ }
232
+
233
+ .GymSetup__hoursInput {
234
+ appearance: none;
235
+ padding-left: 6px;
236
+ padding-right: 6px;
237
+ padding-top: 4px;
238
+ padding-bottom: 4px;
239
+ background: rgb(255, 255, 255);
240
+ border: 1px solid rgb(223, 225, 228);
241
+ border-radius: 4px;
242
+ color: rgb(40, 42, 48);
243
+ margin: 0px;
244
+ appearance: none;
245
+ transition: border 0.3s;
246
+ //app-region: no-drag;
247
+ resize: none;
248
+ //width: 45%;
249
+ font-size: 10px;
250
+ font-family: 'Inter UI', Inter;
251
+ }
252
+ .GymSetup__hoursInput:focus {
253
+ outline: none;
254
+ box-shadow: none;
255
+ border-color: rgb(33, 96, 220)
256
+ }
257
+ .GymSetup__stepTwoInputSpacer {
258
+ display: inline;
259
+ }
260
+ .GymSetup__amenitiesForm {
261
+ display: flex;
262
+ flex-direction: column;
263
+ }
264
+ .GymSetup__ammenitiesFlexRow {
265
+ display: flex;
266
+ }
267
+ .GymSetup__ammenitiesColumnOne {
268
+ display: flex;
269
+ flex-direction: column;
270
+ }
271
+ .GymSetup__stepThreeAmenitiesFlex {
272
+ display: flex;
273
+ width: 150px;
274
+ }
275
+ .GymSetup__amenitiesCheckboxInput {
276
+ margin-top: 2px;
277
+ }
278
+ .GymSetup__amenitiesCheckboxLabel {
279
+ color: rgb(107, 111, 118);
280
+ font-size: 12.5px;
281
+ font-style: normal;
282
+ font-weight: 400;
283
+ line-height: 23px;
284
+ text-rendering: optimizeLegibility;
285
+ -webkit-text-size-adjust: 100%;
286
+ text-align: center;
287
+ margin-top: 0px;
288
+ margin-left: 4px;
289
+ }