zaanind commited on
Commit
f710fc8
1 Parent(s): 1556c03

Upload 27 files

Browse files
.gitattributes CHANGED
@@ -1,28 +1,3 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bin.* filter=lfs diff=lfs merge=lfs -text
5
- *.bz2 filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.model filter=lfs diff=lfs merge=lfs -text
12
- *.msgpack filter=lfs diff=lfs merge=lfs -text
13
- *.onnx filter=lfs diff=lfs merge=lfs -text
14
- *.ot filter=lfs diff=lfs merge=lfs -text
15
- *.parquet filter=lfs diff=lfs merge=lfs -text
16
- *.pb filter=lfs diff=lfs merge=lfs -text
17
- *.pt filter=lfs diff=lfs merge=lfs -text
18
- *.pth filter=lfs diff=lfs merge=lfs -text
19
- *.rar filter=lfs diff=lfs merge=lfs -text
20
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
21
- *.tar.* filter=lfs diff=lfs merge=lfs -text
22
- *.tflite filter=lfs diff=lfs merge=lfs -text
23
- *.tgz filter=lfs diff=lfs merge=lfs -text
24
- *.wasm filter=lfs diff=lfs merge=lfs -text
25
- *.xz filter=lfs diff=lfs merge=lfs -text
26
- *.zip filter=lfs diff=lfs merge=lfs -text
27
- *.zstandard filter=lfs diff=lfs merge=lfs -text
28
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
3
+ static/users/uploaded_images/410068c0-edce-4542-8f97-9d0d1cbb1d1cIMG_20240116_124952corpdp.jpg filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ instance
2
+ later
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2023 ItzSimplyJoe
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
instance/database.db ADDED
Binary file (41 kB). View file
 
readme.md ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Flask Social Media App
2
+
3
+ [![Repo Size](https://img.shields.io/github/repo-size/ItzSimplyJoe/Social-Media-App)]()
4
+ [![Code Size](https://img.shields.io/github/languages/code-size/ItzSimplyJoe/Social-Media-App)]()
5
+ [![GitHub Last Commit](https://img.shields.io/github/last-commit/ItzSimplyJoe/Social-Media-App)]()
6
+ [![GitHub Issues](https://img.shields.io/github/issues/ItzSimplyJoe/Social-Media-App)]()
7
+
8
+
9
+ ## Information
10
+ A simple social media app called Simplz made with Flask, HTML, CSS and JS.
11
+
12
+ ## Installation
13
+ If you want to run the program and change it for yourself then
14
+ - `git clone https://github.com/ItzSimplyJoe/Social-Media-App.git`
15
+ - `cd social_network`
16
+ - `pip install -r requirements.txt`
17
+ - `python app.py`
18
+ <div align="center">
19
+
20
+ ## What it can do
21
+ ### Register Page
22
+ <p>Create an Account with the easy-to-follow and easy-to-understand Register Page</p>
23
+ <img src="Images_for_Github/register.png" width=640 height=360>
24
+
25
+ ### Login Page
26
+ <p>Log into your account with the Login Page</p>
27
+ <img src="Images_for_Github/login.png" width=640 height=360>
28
+
29
+ ### Home Page
30
+ <p>See all the posts from the people you follow on the Home Page</p>
31
+ <p>Here you can also create your own posts by clicking the + button in the bottom right corner</p>
32
+ <img src="Images_for_Github/index.png" width=640 height=360>
33
+
34
+ ### Account Settings Page
35
+ <p>Change your account settings on the Account Settings Page</p>
36
+ <img src="Images_for_Github/account.png" width=640 height=360>
37
+
38
+ ### Messages Page
39
+ <p>Send messages to other users on the Messages Page</p>
40
+ <img src="Images_for_Github/Conversations.png" width=640 height=360>
41
+ <img src="Images_for_Github/conversation.png" width=640 height=360>
42
+ <img src="Images_for_Github/new_conversation.png" width=640 height=360>
43
+
44
+ ### Search For other Users Page
45
+ <p>Search for other users on the Search Page</p>
46
+ <img src="Images_for_Github/User_search.png" width=640 height=360>
47
+ <img src="Images_for_Github/profile.png" width=640 height=360>
48
+ </div>
49
+
50
+ ## License
51
+ [MIT](https://choosealicense.com/licenses/mit/)
52
+
53
+ ## Contact
54
+ If you want to contact me you can reach me at [my email](mailto:joebostock30@gmail.com) or [my website](https://www.itzsimplyjoe.me).
55
+
56
+ ## Contributing
57
+ If you want to contribute to this project you can by making a Pull Request.
58
+
59
+ ## Acknowledgements
60
+ - [Python](https://www.python.org/)
61
+ - [Flask](https://flask.palletsprojects.com/en/2.0.x/)
62
+ - [SQLAlchemy](https://www.sqlalchemy.org/)
63
+ - [Flask Login](https://flask-login.readthedocs.io/en/latest/)
64
+ - [Flask WTF](https://flask-wtf.readthedocs.io/en/0.15.x/)
65
+ - [Flask Migrate](https://flask-migrate.readthedocs.io/en/latest/)
66
+ - [Bootstrap](https://getbootstrap.com/)
67
+ - [Font Awesome](https://fontawesome.com/)
68
+ - [JQuery](https://jquery.com/)
69
+ - [Popper.js](https://popper.js.org/)
70
+ - [werkzeug](https://werkzeug.palletsprojects.com/en/2.0.x/)
static/css/style.css ADDED
@@ -0,0 +1,1319 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *{
2
+ box-sizing: border-box;
3
+ margin: 0;
4
+ padding: 0;
5
+ font-family: 'Poppins', sans-serif;
6
+ }
7
+ html{
8
+ scroll-behavior: smooth;
9
+ background-color: #131313;
10
+ overflow-x: hidden;
11
+ }
12
+ .contents {
13
+ background-color: #131313;
14
+ height: 100%;
15
+ }
16
+ .stick{
17
+ position: sticky;
18
+ top: 0;
19
+ z-index: 999;
20
+ }
21
+ .page{
22
+ background-color: #131313;
23
+ }
24
+
25
+
26
+
27
+ .post-interactions {
28
+ font-size: 22px;
29
+ margin-left: 10px;
30
+ }
31
+ /* ---------------------------------------- nav bar ----------------------------------------*/
32
+ .navbar{
33
+ background: #131313;
34
+ height: 80px;
35
+ display: flex;
36
+ justify-content: center;
37
+ align-items: center;
38
+ font-size: 1.2rem;
39
+ position: sticky;
40
+ top:0;
41
+ z-index: 999;
42
+ }
43
+
44
+ .navbar__container {
45
+ display: flex;
46
+ justify-content: space-between;
47
+ height: 80px;
48
+ z-index: 1;
49
+ width: 100%;
50
+ max-width: 1800px;
51
+ margin: 0 auto;
52
+ padding: 0 50px;
53
+ }
54
+
55
+ #navbar__logo {
56
+ background-image: linear-gradient(to right, #7700ff 30%, #001eff 100%);
57
+ background-size: 100%;
58
+ -webkit-background-clip: text;
59
+ -moz-background-clip: text;
60
+ -webkit-text-fill-color: transparent;
61
+ -moz-text-fill-color: transparent;
62
+ display: flex;
63
+ align-items: center;
64
+ cursor: pointer;
65
+ text-decoration: none;
66
+ font-size: 2rem;
67
+ font-weight: 800;
68
+ }
69
+
70
+ .logo {
71
+ margin-right: 2rem;
72
+ }
73
+
74
+ .navbar__menu{
75
+ display: flex;
76
+ align-items: center;
77
+ list-style: none;
78
+ text-align: center;
79
+ }
80
+
81
+ .navbar__item{
82
+ height: 80px;
83
+ }
84
+
85
+ .navbar__links{
86
+ color: #fff;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ text-decoration: none;
91
+ padding: 0 1rem;
92
+ height: 100%;
93
+ transition: all 0.5s ease;
94
+ }
95
+
96
+ .navbar__links:hover{
97
+ background-image: linear-gradient(to right, #7700ff 30%, #001eff 100%);
98
+ background-size: 100%;
99
+ -webkit-background-clip: text;
100
+ -moz-background-clip: text;
101
+ -webkit-text-fill-color: transparent;
102
+ -moz-text-fill-color: transparent;
103
+ text-decoration: none;
104
+ }
105
+
106
+ @media screen and (max-width:960px){
107
+ .navbar__container{
108
+ display: flex;
109
+ justify-content: space-between;
110
+ height: 80px;
111
+ z-index: 1;
112
+ width: 100%;
113
+ max-width: 1300px;
114
+ padding: 0;
115
+ }
116
+ .navbar__menu{
117
+ display: grid;
118
+ grid-template-columns: auto;
119
+ margin: 0;
120
+ width: 100%;
121
+ position: absolute;
122
+ top: -1000px;
123
+ left: 0;
124
+ opacity: 0;
125
+ transition: all 0.5s ease;
126
+ height: 50vh;
127
+ z-index: -1;
128
+ background: #131313;
129
+ }
130
+ .navbar__menu.active{
131
+ background: #131313;
132
+ top: 80px;
133
+ opacity: 1;
134
+ transition: all 0.5s ease;
135
+ z-index: 10000;
136
+ height: 50vh;
137
+ font-size: 1.6rem;
138
+ }
139
+ #navbar__logo{
140
+ padding-left: 25px;
141
+ }
142
+ .navbar__toggle .bar:nth-child(1){
143
+ width: 25px;
144
+ height: 3px;
145
+ margin: 5px auto;
146
+ transition: all 0.3s ease-in-out;
147
+ background: #fff;
148
+ }
149
+ .navbar__toggle .bar:nth-child(2){
150
+ width: 23px;
151
+ height: 3px;
152
+ margin: 5px auto;
153
+ transition: all 0.3s ease-in-out;
154
+ background: #fff;
155
+ }
156
+ .navbar__toggle .bar:nth-child(3){
157
+ width: 20px;
158
+ height: 3px;
159
+ margin: 5px auto;
160
+ transition: all 0.3s ease-in-out;
161
+ background: #fff;
162
+ }
163
+
164
+ .navbar__item{
165
+ width: 100%;
166
+ }
167
+ .navbar__links{
168
+ text-align: center;
169
+ padding: 2rem;
170
+ width: 100%;
171
+ display: table;
172
+ }
173
+
174
+ #mobile-menu{
175
+ position: absolute;
176
+ top: 20%;
177
+ right: 5%;
178
+ transform: translate(5%, 20%);
179
+ }
180
+ .navbar__toggle .bar{
181
+ display: block;
182
+ cursor: pointer;
183
+ background-color: #fff;
184
+ }
185
+
186
+ #mobile-menu.is-active .bar:nth-child(2){
187
+ opacity: 0;
188
+ }
189
+ #mobile-menu.is-active .bar:nth-child(1){
190
+ transform: translateY(8px) rotate(45deg);
191
+ background-color: #7700ff;
192
+ width: 25px;
193
+
194
+ }
195
+ #mobile-menu.is-active .bar:nth-child(3){
196
+ transform: translateY(-8px) rotate(-45deg);
197
+ background-color: #7700ff;
198
+ width: 25px;
199
+ }
200
+ }
201
+ /* ---------------------------------------- Search Bar ----------------------------------------*/
202
+
203
+ header{
204
+ background-color: #131313;
205
+ height: 50px;
206
+ width: 100%;
207
+ display: flex;
208
+ justify-content: center;
209
+ align-items: center;
210
+ font-size: 1.2rem;
211
+ position: sticky;
212
+ top: 0;
213
+ z-index: 10;
214
+ }
215
+
216
+ header form{
217
+ display: flex;
218
+ justify-content: center;
219
+ align-items: center;
220
+ }
221
+
222
+ header form input{
223
+ width: 50%;
224
+ height: 40px;
225
+ border: none;
226
+ border-radius: 5px 0 0 5px;
227
+ padding: 0 10px;
228
+ font-size: 1rem;
229
+ }
230
+
231
+ header form button{
232
+ width: 10%;
233
+ height: 40px;
234
+ border: none;
235
+ border-radius: 0 5px 5px 0;
236
+ background-color: #7700ff;
237
+ color: #fff;
238
+ font-size: 1rem;
239
+ cursor: pointer;
240
+ transition: all 0.5s ease;
241
+ text-decoration: none;
242
+ }
243
+
244
+ header form button:hover{
245
+ background-color: #9e4bfd;
246
+ }
247
+
248
+ /* ---------------------------------------- Posts ----------------------------------------*/
249
+ .post {
250
+ position: unset;
251
+ width: 80%;
252
+ max-width: 1000px;
253
+ margin: 0 auto;
254
+ padding: 20px;
255
+ background-color: #242424;
256
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
257
+ max-height: 500px;
258
+ border-radius: 15px;
259
+ margin-top: 10px;
260
+ }
261
+
262
+ .post-info {
263
+ float: right;
264
+ font-size: 12px;
265
+ color: #606060;
266
+ margin-left: 10px;
267
+ }
268
+ .top{
269
+ display:flex;
270
+ flex-direction: row;
271
+ justify-content: space-between;
272
+ align-items: center;
273
+ }
274
+ .post a{
275
+ text-decoration: none;
276
+ }
277
+
278
+ .post-image {
279
+ /*width: 100%;*/
280
+ height: auto;
281
+ /*object-fit: cover;*/
282
+ border-radius: 15px;
283
+ margin-bottom: 10px;
284
+ max-height: 300px;
285
+ max-width: 100%;
286
+ display: block;
287
+ margin-left: auto;
288
+ margin-right: auto;
289
+ margin-top: 10px;
290
+ margin-bottom: 10px;
291
+ border: 1px solid #7700ff;
292
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
293
+ transition: all 0.5s ease;
294
+ }
295
+
296
+ .post-image:hover {
297
+ transform: scale(1.01);
298
+ }
299
+
300
+ .caption {
301
+ margin-bottom: 10px;
302
+ color: #fff;
303
+ font-size: 16px;
304
+ line-height: 1.5;
305
+ text-align: justify;
306
+ text-justify: inter-word;
307
+ max-height: 100px;
308
+ position: relative;
309
+ word-wrap: break-word;
310
+ overflow: hidden;
311
+ }
312
+ .profile_name{
313
+ background-image: linear-gradient(to right, #7700ff 30%, #001eff 100%);
314
+ background-size: 100%;
315
+ -webkit-background-clip: text;
316
+ -moz-background-clip: text;
317
+ -webkit-text-fill-color: transparent;
318
+ -moz-text-fill-color: transparent;
319
+ font-size: 16px;
320
+ line-height: 1.5;
321
+ text-align: justify;
322
+ text-justify: inter-word;
323
+ max-height: 100px;
324
+ position: relative;
325
+ overflow: hidden;
326
+ margin-top: 10px;
327
+ margin-left: 10px;
328
+ margin-right: 10px;
329
+ text-decoration: none;
330
+ }
331
+ .profile_name:hover{
332
+ text-decoration: none;
333
+ }
334
+ .post_profile_a{
335
+ text-decoration: none;
336
+ }
337
+ .post_profile_a:hover{
338
+ text-decoration: none;
339
+ }
340
+ .circle{
341
+ border-radius: 50%;
342
+ width: 30px;
343
+ height: 30px;
344
+ margin-right: 10px;
345
+ margin-top: 5px;
346
+ align-items: center;
347
+ justify-content: center;
348
+ float: left;
349
+ background-color: #7700ff;
350
+ }
351
+ .inner_circle_icon{
352
+ color: #fff;
353
+ top: 0;
354
+ left: 0;
355
+ transform: translate(50%, 20%);
356
+ }
357
+ .post_profile_picture {
358
+ width: 30px;
359
+ height: 30px;
360
+ border-radius: 50%;
361
+ margin-right: 10px;
362
+ float: left;
363
+ margin-top: 5px;
364
+ }
365
+
366
+ .post-profile-content {
367
+ display: flex;
368
+ align-items: center;
369
+ }
370
+
371
+ .post-profile-content a {
372
+ display: flex;
373
+ align-items: center;
374
+ }
375
+
376
+ .post-interactions {
377
+ display: flex;
378
+ justify-content: left;
379
+ flex-direction: row;
380
+ align-items: center;
381
+ margin-top: 10px;
382
+ }
383
+
384
+
385
+
386
+ .heartIcon {
387
+ color: #fff;
388
+ cursor: pointer;
389
+ transition: all 0.5s ease;
390
+ }
391
+
392
+ .post-comments {
393
+ color: #fff;
394
+ cursor: pointer;
395
+ transition: all 0.5s ease;
396
+ }
397
+
398
+ .likes {
399
+ margin-right: 10px;
400
+ color: #fff;
401
+ }
402
+
403
+ .liked {
404
+ color: #7700ff;
405
+ animation: pulseAnimation 1s;
406
+ cursor: pointer;
407
+ }
408
+
409
+ .dropdown {
410
+ position: absolute;
411
+ top: 5px;
412
+ right: 5px;
413
+ }
414
+
415
+ .dropdown-toggle {
416
+ cursor: pointer;
417
+ }
418
+
419
+ .dropdown-menu {
420
+ background-color: #fff;
421
+ border-radius: 15px;
422
+ padding: 5px 0;
423
+ min-width: 150px;
424
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
425
+ z-index: 1000;
426
+ }
427
+
428
+ .dropdown-item {
429
+ display: block;
430
+ padding: 10px 15px;
431
+ color: #333;
432
+ text-decoration: none;
433
+ transition: background-color 0.3s;
434
+ }
435
+
436
+ .dropdown-item:hover {
437
+ background-color: #f5f5f5;
438
+ }
439
+
440
+ .fa-ellipsis-vertical {
441
+ font-size: 1.2rem;
442
+ color: #888;
443
+ }
444
+
445
+
446
+ /* ---------------------------------------- Index ----------------------------------------*/
447
+ .title{
448
+ font-weight: 800;
449
+ }
450
+ .subtitle{
451
+ font-weight: 500;
452
+ }
453
+ h1{
454
+ background-image: linear-gradient(to right, #7700ff 30%, #001eff 100%);
455
+ background-size: 100%;
456
+ -webkit-background-clip: text;
457
+ -moz-background-clip: text;
458
+ -webkit-text-fill-color: transparent;
459
+ -moz-text-fill-color: transparent;
460
+ text-align: center;
461
+ margin-top: 10px;
462
+ margin-bottom: 10px;
463
+ justify-content: center;
464
+ font-size: 4rem;
465
+ font-weight: 800;
466
+ text-decoration: none;
467
+ }
468
+ h2{
469
+ background-image: linear-gradient(to right, #7700ff 30%, #001eff 100%);
470
+ background-size: 100%;
471
+ -webkit-background-clip: text;
472
+ -moz-background-clip: text;
473
+ -webkit-text-fill-color: transparent;
474
+ -moz-text-fill-color: transparent;
475
+ text-align: center;
476
+ margin-top: 10px;
477
+ margin-bottom: 10px;
478
+ justify-content: center;
479
+ font-size: 30px;
480
+ font-weight: 500;
481
+ text-decoration: none;
482
+ }
483
+ .newpost-button{
484
+ border-radius: 50%;
485
+ background-color: #7700ff;
486
+ width: 50px;
487
+ height: 50px;
488
+ position: fixed;
489
+ bottom: 20px;
490
+ right: 20px;
491
+ cursor: pointer;
492
+ transition: all 0.5s ease;
493
+ border: 1px solid #7700ff;
494
+ }
495
+ .newpost-button i{
496
+ color: #fff;
497
+ font-size: 30px;
498
+ align-items: center;
499
+ justify-content: center;
500
+ }
501
+
502
+ .newpost-button:hover{
503
+ transform: translateY(-5px);
504
+ }
505
+ /* ---------------------------------------- Login Page ----------------------------------------*/
506
+ .loginpage {
507
+ max-width: 300px;
508
+ margin: 0 auto;
509
+ padding: 20px;
510
+ border-radius: 15px;
511
+ background-color: #222;
512
+ }
513
+
514
+
515
+ label {
516
+ display: block;
517
+ margin-bottom: 5px;
518
+ color: #fff;
519
+ }
520
+
521
+ .login-input {
522
+ width: 100%;
523
+ padding: 10px;
524
+ margin-bottom: 10px;
525
+ border: 1px solid #7700ff;
526
+ border-radius: 15px;
527
+ background-color: #333;
528
+ color: #fff;
529
+ }
530
+
531
+ .login-button {
532
+ width: 100%;
533
+ padding: 10px;
534
+ background-color: #7700ff;
535
+ color: #fff;
536
+ border: none;
537
+ border-radius: 15px;
538
+ cursor: pointer;
539
+ }
540
+
541
+ .login-button:hover {
542
+ background-color: #4400aa;
543
+ }
544
+
545
+ .form-button {
546
+ width: 20px;
547
+ text-align: center;
548
+ color: #7700ff;
549
+ }
550
+ /* ---------------------------------------- Register Page ----------------------------------------*/
551
+
552
+ .registerpage {
553
+ max-width: 300px;
554
+ margin: 0 auto;
555
+ padding: 20px;
556
+ border-radius: 15px;
557
+ background-color: #222;
558
+ }
559
+
560
+ .register-input {
561
+ width: 100%;
562
+ padding: 10px;
563
+ margin-bottom: 10px;
564
+ border: 1px solid #7700ff;
565
+ border-radius: 15px;
566
+ background-color: #333;
567
+ color: #fff;
568
+ }
569
+
570
+ .register-button {
571
+ width: 100%;
572
+ padding: 10px;
573
+ background-color: #7700ff;
574
+ color: #fff;
575
+ border: none;
576
+ border-radius: 15px;
577
+ cursor: pointer;
578
+ }
579
+
580
+ .register-button:hover {
581
+ background-color: #4400aa;
582
+ }
583
+
584
+ /* ---------------------------------------- Account Page ----------------------------------------*/
585
+ .account-form {
586
+ display: flex;
587
+ flex-wrap: wrap;
588
+ justify-content: center;
589
+ max-width: 800px;
590
+ margin: 0 auto;
591
+ padding: 20px;
592
+ border-radius: 15px;
593
+ background-color: #222;
594
+ color: #fff;
595
+ }
596
+
597
+ .form-column {
598
+ flex: 1;
599
+ padding-right: 20px;
600
+ }
601
+
602
+ .account-input {
603
+ width: 100%;
604
+ padding: 10px;
605
+ margin-bottom: 10px;
606
+ border: 1px solid #7700ff;
607
+ border-radius: 15px;
608
+ background-color: #333;
609
+ color: #fff;
610
+ }
611
+
612
+ .account-buttons {
613
+ width: 100%;
614
+ padding: 10px;
615
+ margin-bottom: 10px;
616
+ color: #fff;
617
+ border: none;
618
+ border-radius: 15px;
619
+ background-color: #7700ff;
620
+ cursor: pointer;
621
+ }
622
+
623
+ .account-textarea {
624
+ resize: vertical;
625
+ }
626
+
627
+ .account-img {
628
+ max-width: 100px;
629
+ max-height: 100px;
630
+ width: 100%;
631
+ height: 100%;
632
+ margin-top: 10px;
633
+ margin-bottom: 20px;
634
+ display: block;
635
+ margin-left: auto;
636
+ margin-right: auto;
637
+ border-radius: 50%;
638
+ border: 2px solid #7700ff;
639
+ background-color: #333;
640
+ color: #fff;
641
+ }
642
+
643
+
644
+ .profile-pics{
645
+ display: flex;
646
+ flex-direction: row;
647
+ justify-content: center;
648
+ flex-wrap: wrap;
649
+ }
650
+
651
+ .account-submit {
652
+ width: 100%;
653
+ padding: 10px;
654
+ background-color: #7700ff;
655
+ color: #fff;
656
+ border: none;
657
+ border-radius: 15px;
658
+ cursor: pointer;
659
+ }
660
+
661
+ .account-submit:hover {
662
+ background-color: #4400aa;
663
+ }
664
+
665
+ .account-form::after {
666
+ content: "";
667
+ flex: auto;
668
+ }
669
+
670
+ .account-form > .form-column:last-child {
671
+ flex: 1 1 100%;
672
+ }
673
+ /* ---------------------------------------- Flash Messages ----------------------------------------*/
674
+
675
+ .flash-messages{
676
+ position: absolute;
677
+ margin-top: 20px;
678
+ align-items: center;
679
+ justify-content: center;
680
+ width: 100%;
681
+ display: flex;
682
+ flex-direction: column;
683
+ text-align: center;
684
+ z-index: 1000;
685
+ }
686
+ .flash-message{
687
+ padding: 10px 20px;
688
+ border-radius: 15px;
689
+ margin-bottom: 10px;
690
+ color: #fff;
691
+ font-weight: 600;
692
+ font-size: 16px;
693
+ display: flex;
694
+ align-items: center;
695
+ justify-content: space-between;
696
+ width: 300px;
697
+ background-color: #7700ff;
698
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
699
+ }
700
+ /* ---------------------------------------- Search Results ----------------------------------------*/
701
+ .searchresults_ul {
702
+ list-style: none;
703
+ padding: 0;
704
+ margin: 0;
705
+ }
706
+
707
+ .searchresults_container {
708
+ max-width: 800px;
709
+ margin: 0 auto;
710
+ padding: 20px;
711
+ border-radius: 15px;
712
+ background-color: #222;
713
+ color: #fff;
714
+ margin-bottom: 10px;
715
+ }
716
+
717
+ .searchresults_img {
718
+ max-width: 100px;
719
+ max-height: 100px;
720
+ width: 100%;
721
+ height: 100%;
722
+ margin-top: 10px;
723
+ display: block;
724
+ margin-right: 10px;
725
+ border-radius: 50%;
726
+ border: 2px solid #7700ff;
727
+ background-color: #333;
728
+ color: #fff;
729
+ }
730
+
731
+ .searchresults_h2 {
732
+ flex: 1;
733
+ }
734
+
735
+ .searchresults_li {
736
+ margin-bottom: 10px;
737
+ }
738
+
739
+ .searchresults_a {
740
+ display: inline-block;
741
+ padding: 10px 15px;
742
+ background-color: #7700ff;
743
+ color: #fff;
744
+ text-decoration: none;
745
+ border-radius: 15px;
746
+ transition: background-color 0.3s;
747
+ }
748
+ .searchresults_a:hover {
749
+ background-color: #4400aa;
750
+ color: #fff;
751
+ text-decoration: none;
752
+ }
753
+
754
+ .searchresults_p {
755
+ margin-bottom: 0;
756
+ max-width: 75%;
757
+ }
758
+
759
+ .toprow {
760
+ display: flex;
761
+ flex-direction: row;
762
+ justify-content: space-between;
763
+ align-items: center;
764
+ }
765
+
766
+ .bottomrow {
767
+ display: flex;
768
+ flex-direction: row;
769
+ justify-content: space-between;
770
+ align-items: center;
771
+ }
772
+
773
+ .follow_button{
774
+ display: inline-block;
775
+ padding: 10px 15px;
776
+ background-color: #7700ff;
777
+ color: #fff;
778
+ text-decoration: none;
779
+ border-radius: 15px;
780
+ transition: background-color 0.3s;
781
+ }
782
+
783
+ .follow_button:hover {
784
+ background-color: #4400aa;
785
+ color: #fff;
786
+ text-decoration: none;
787
+ }
788
+ /* ---------------------------------------- User Profiles ----------------------------------------*/
789
+ .userprofile_container {
790
+ max-width: 90%;
791
+ margin: 0 auto;
792
+ padding: 20px;
793
+ border-radius: 15px;
794
+ background-color: #222;
795
+ color: #fff;
796
+ margin-bottom: 10px;
797
+ }
798
+
799
+ .user-profile__rows {
800
+ display: flex;
801
+ flex-direction: row;
802
+ justify-content: center;
803
+ align-items: center;
804
+ }
805
+
806
+ .user-profile__left-column {
807
+ margin-right: 5%;
808
+ width: 35%;
809
+ display: flex;
810
+ flex-direction: column;
811
+ align-items: right;
812
+ background: #131313;
813
+ }
814
+
815
+ .user-profile__right_column {
816
+ width: 40%;
817
+ }
818
+
819
+ .user-profile__profile-picture {
820
+ max-width: 100%;
821
+ max-height: 100%;
822
+ width: 250px;
823
+ height: 250px;
824
+ margin-top: 10px;
825
+ border-radius: 50%;
826
+ border: 2px solid #7700ff;
827
+ background-color: #131313;
828
+ color: #131313;
829
+ }
830
+ .user-profile__profile-picture img{
831
+ background-color: #131313;
832
+ color: #131313;
833
+ }
834
+ .text-center img{
835
+ background-color: #131313;
836
+ color: #131313;
837
+ border-radius: 50%;
838
+ height: 50%;
839
+ width: 50%;
840
+ border: none;
841
+ }
842
+
843
+ .user-profile__a,
844
+ .user-profile__follow_button {
845
+ display: inline-block;
846
+ padding: 10px 15px;
847
+ background-color: #7700ff;
848
+ color: #fff;
849
+ text-decoration: none;
850
+ border-radius: 15px;
851
+ transition: background-color 0.3s;
852
+ margin-top: 10px;
853
+ }
854
+
855
+ .user-profile__a:hover,
856
+ .user-profile__follow_button:hover {
857
+ background-color: #4400aa;
858
+ color: #fff;
859
+ text-decoration: none;
860
+ }
861
+
862
+ .user-profile__p {
863
+ margin-bottom: 0;
864
+ max-width: 75%;
865
+ }
866
+ h3{
867
+ color: #7700ff;
868
+ background-image: linear-gradient(to right, #7700ff 30%, #001eff 100%);
869
+ background-size: 100%;
870
+ -webkit-background-clip: text;
871
+ -moz-background-clip: text;
872
+ -webkit-text-fill-color: transparent;
873
+ -moz-text-fill-color: transparent;
874
+ text-decoration: none;
875
+ text-align: center;
876
+ }
877
+ .user-profile__email,
878
+ .user-profile__username,
879
+ .user-profile__name,
880
+ .user-profile__bio,
881
+ .user-profile__profession,
882
+ .user-profile__location {
883
+ color: #fff;
884
+ }
885
+
886
+
887
+ /* ---------------------------------------- Modals ----------------------------------------*/
888
+
889
+ .modal.fade.dark-modal .modal-content {
890
+ background-color: #333;
891
+ color: #fff;
892
+ }
893
+
894
+ .modal.fade.dark-modal .modal-header {
895
+ background-color: #555;
896
+ border-bottom: 1px solid #888;
897
+ }
898
+
899
+ .modal.fade.dark-modal .modal-title {
900
+ color: #fff;
901
+ }
902
+
903
+ .modal.fade.dark-modal .close {
904
+ color: #fff;
905
+ }
906
+
907
+ .modal.fade.dark-modal .modal-body {
908
+ /* Customize modal body styles if needed */
909
+ }
910
+
911
+ .modal.fade.dark-modal .list-group-item {
912
+ background-color: #444;
913
+ border-color: #666;
914
+ color: #fff;
915
+ }
916
+
917
+ .modal.fade.dark-modal .list-group-item strong {
918
+ color: #7700ff;
919
+ }
920
+
921
+ .modal.fade.dark-modal .modal-footer {
922
+ background-color: #555;
923
+ border-top: 1px solid #888;
924
+ }
925
+
926
+ .modal.fade.dark-modal .form-control {
927
+ background-color: #555;
928
+ color: #fff;
929
+ }
930
+
931
+ .modal.fade.dark-modal .btn-primary {
932
+ background-color: #7700ff;
933
+ border-color: #7700ff;
934
+ transition: all 0.5s ease;
935
+ }
936
+
937
+ .modal.fade.dark-modal .btn-primary:hover {
938
+ background-color: #9131ff;
939
+ border-color: #9131ff;
940
+ }
941
+
942
+ .modal.fade.dark-modal .modal-body::-webkit-scrollbar {
943
+ width: 8px;
944
+ }
945
+
946
+ .modal.fade.dark-modal .modal-body::-webkit-scrollbar-thumb {
947
+ background-color: #666;
948
+ }
949
+
950
+ .modal.fade.dark-modal .modal-body::-webkit-scrollbar-thumb:hover {
951
+ background-color: #888;
952
+ }
953
+ /* ---------------------------------------- Conversations ----------------------------------------*/
954
+ .ablankgap{
955
+ display: absolute;
956
+ height: 30px;
957
+ }
958
+ .conversations__container{
959
+ max-width: 90%;
960
+ margin: 0 auto;
961
+ padding: 20px;
962
+ border-radius: 15px;
963
+ background-color: #242424;
964
+ color: #fff;
965
+ margin-bottom: 10px;
966
+ height: 400px;
967
+ margin-top: 30px;
968
+ }
969
+ .conversations__ul {
970
+ list-style: none;
971
+ display: grid;
972
+ grid-template-columns: 1fr 1fr 1fr 1fr;
973
+ grid-gap: 10px;
974
+ grid-template-rows: 1fr;
975
+ }
976
+
977
+ .conversations__li {
978
+ display: flex;
979
+ align-items: center;
980
+ margin-bottom: 10px;
981
+ }
982
+
983
+ .conversations__user__box {
984
+ display: flex;
985
+ align-items: center;
986
+ text-decoration: none;
987
+ color: #fff;
988
+ background-color: #333;
989
+ box-shadow: 10px 10px 5px 0px rgba(0,0,0,0.75);
990
+ height: 75px;
991
+ padding: 10px;
992
+ width: 300px;
993
+ border-radius: 15px;
994
+ transition: 0.5s all ease;
995
+ }
996
+
997
+ .conversations__user__box:hover {
998
+ background-color: #282828;
999
+ color: #7700ff;
1000
+ text-decoration: none;
1001
+
1002
+ }
1003
+
1004
+ .conversations__user__image {
1005
+ width: 40px;
1006
+ height: 40px;
1007
+ border-radius: 50%;
1008
+ margin-right: 10px;
1009
+ object-fit: cover;
1010
+ align-items: center;
1011
+ }
1012
+ .conversations__name_and_icon{
1013
+ display: flex;
1014
+ align-items: center;
1015
+ justify-content: space-between;
1016
+ width: 90%;
1017
+ }
1018
+
1019
+ .conversations__username {
1020
+ font-weight: bold;
1021
+ margin-bottom: 0;
1022
+ margin-right: 10px;
1023
+ }
1024
+
1025
+ .conversations__new {
1026
+ display: flex;
1027
+ justify-content: center;
1028
+ }
1029
+
1030
+ .conversations__new__button {
1031
+ display: inline-block;
1032
+ padding: 10px 20px;
1033
+ border: none;
1034
+ border-radius: 15px;
1035
+ margin-bottom: 20px;
1036
+ background-color: #7700ff;
1037
+ color: #fff;
1038
+ text-decoration: none;
1039
+ font-weight: bold;
1040
+ cursor: pointer;
1041
+ transition: background-color 0.3s ease;
1042
+ }
1043
+
1044
+ .conversations__new__button:hover {
1045
+ background-color: #4400aa;
1046
+ text-decoration: none;
1047
+ color: #fff;
1048
+ }
1049
+ @media screen and (max-width: 600px) {
1050
+ .conversations__user__box {
1051
+ width: 100%;
1052
+ }
1053
+ .conversations__container{
1054
+ align-items: center;
1055
+ height: 100%;
1056
+ }
1057
+ .conversations__ul{
1058
+ grid-template-columns: 1fr;
1059
+ }
1060
+ }
1061
+ /* ---------------------------------------- Conversation ----------------------------------------*/
1062
+ .conversation__container{
1063
+ max-width: 90%;
1064
+ margin: 0 auto;
1065
+ padding: 20px;
1066
+ border-radius: 15px;
1067
+ background-color: #242424;
1068
+ color: #fff;
1069
+ margin-bottom: 10px;
1070
+ height: 400px;
1071
+ margin-top: 30px;
1072
+ }
1073
+ .conversation__messages{
1074
+ height: 300px;
1075
+ overflow-y: scroll;
1076
+ overflow-x: hidden;
1077
+ align-items: center;
1078
+ }
1079
+ .conversation__messages::-webkit-scrollbar {
1080
+ width: 8px;
1081
+ }
1082
+ .conversation__messages::-webkit-scrollbar-thumb {
1083
+ background-color: #666;
1084
+ }
1085
+ .conversation__messages::-webkit-scrollbar-thumb:hover {
1086
+ background-color: #888;
1087
+ }
1088
+ .conversation__message__top__row{
1089
+ margin-left: 30px;
1090
+ display: flex;
1091
+ justify-content: left;
1092
+ width: 100%;
1093
+ margin-bottom: 5px;
1094
+ }
1095
+ .conversation__message{
1096
+ display: flex;
1097
+ flex-direction: column;
1098
+ margin: auto 30px;
1099
+ border-radius: 15px;
1100
+ align-items: left;
1101
+ margin-bottom: 10px;
1102
+ background-color: #333;
1103
+ }
1104
+ .conversation__content{
1105
+ margin-left: 30px;
1106
+ margin-right: 30px;
1107
+ margin-bottom: 10px;
1108
+ }
1109
+ .conversation__message__box{
1110
+ display: flex;
1111
+ align-items: center;
1112
+ text-decoration: none;
1113
+ color: #fff;
1114
+ background-color: #333;
1115
+ box-shadow: 10px 10px 5px 0px rgba(0,0,0,0.75);
1116
+ height: 75px;
1117
+ padding: 10px;
1118
+ width: 75%;
1119
+ border-radius: 15px;
1120
+ transition: 0.5s all ease;
1121
+ }
1122
+ .conversation__send__message{
1123
+ display: flex;
1124
+ align-items: center;
1125
+ margin-bottom: 10px;
1126
+ background-color: #242424;
1127
+ gap: 5%;
1128
+ }
1129
+ .conversation__message__info{
1130
+ display: flex;
1131
+ flex-direction: column;
1132
+ align-items: flex-start;
1133
+ justify-content: center;
1134
+ margin-left: 20px;
1135
+ opacity: 0.6;
1136
+ }
1137
+ .conversation__message__button{
1138
+ display: flex;
1139
+ align-items: center;
1140
+ text-decoration: none;
1141
+ color: #fff;
1142
+ background-color: #333;
1143
+ box-shadow: 10px 10px 5px 0px rgba(0,0,0,0.75);
1144
+ height: 75px;
1145
+ padding: 10px;
1146
+ width: 300px;
1147
+ border-radius: 15px;
1148
+ transition: 0.5s all ease;
1149
+ }
1150
+ .conversation__message__button:hover{
1151
+ background-color: #282828;
1152
+ color: #7700ff;
1153
+ text-decoration: none;
1154
+ }
1155
+ /* ---------------------------------------- New Conversation ----------------------------------------*/
1156
+ .new_conversation__form{
1157
+ display: flex;
1158
+ flex-direction: column;
1159
+ align-items: center;
1160
+ justify-content: center;
1161
+ margin-top: 30px;
1162
+ }
1163
+ .new_conversation__label{
1164
+ margin-bottom: 10px;
1165
+ }
1166
+ .new_conversation__input{
1167
+ margin-bottom: 10px;
1168
+ padding: 10px;
1169
+ border-radius: 15px;
1170
+ width: 50%;
1171
+ border: none;
1172
+ background-color: #333;
1173
+ color: #fff;
1174
+ }
1175
+ .new_conversation__textarea{
1176
+ margin-bottom: 10px;
1177
+ padding: 10px;
1178
+ border-radius: 15px;
1179
+ border: none;
1180
+ background-color: #333;
1181
+ color: #fff;
1182
+ resize: none;
1183
+ height: 100px;
1184
+ width: 50%;
1185
+
1186
+ }
1187
+ .new_conversation__button{
1188
+ display: inline-block;
1189
+ padding: 10px 20px;
1190
+ border: none;
1191
+ border-radius: 15px;
1192
+ margin-bottom: 20px;
1193
+ background-color: #7700ff;
1194
+ color: #fff;
1195
+ text-decoration: none;
1196
+ font-weight: bold;
1197
+ cursor: pointer;
1198
+ transition: background-color 0.3s ease;
1199
+ }
1200
+
1201
+ /* ---------------------------------------- Animations ----------------------------------------*/
1202
+
1203
+ .footer{
1204
+ margin-top: 150px;
1205
+ background-color: #242424;
1206
+ color: #fff;
1207
+ padding: 80px 0;
1208
+ }
1209
+ .footer__container{
1210
+ display: flex;
1211
+ flex-direction: column;
1212
+ justify-content: center;
1213
+ align-items: center;
1214
+ max-width: 1000px;
1215
+ margin: 0 auto;
1216
+ }
1217
+ .footer__links{
1218
+ width: 100%;
1219
+ max-width: 1000px;
1220
+ display: flex;
1221
+ justify-content: center;
1222
+ }
1223
+ .footer__link--wrapper{
1224
+ display: flex;
1225
+ }
1226
+ .footer__link--items{
1227
+ display: flex;
1228
+ flex-direction: column;
1229
+ align-items: flex-start;
1230
+ margin: 16px;
1231
+ text-align: left;
1232
+ width: 160px;
1233
+ box-sizing: border-box;
1234
+ }
1235
+ .footer__link--items h2{
1236
+ margin-bottom: 16px;
1237
+ }
1238
+ .footer__link--items > h2{
1239
+ color: #fff;
1240
+ }
1241
+ .footer__link--items a{
1242
+ color: #fff;
1243
+ text-decoration: none;
1244
+ margin-bottom: 0.5rem;
1245
+ }
1246
+ .footer__link--items a:hover{
1247
+ color: #7700ff;
1248
+ transition: 0.3s ease-out;
1249
+ text-decoration: none;
1250
+ }
1251
+ .footer__logo{
1252
+ display: flex;
1253
+ align-items: center;
1254
+ justify-self: flex-start;
1255
+ margin-bottom: 16px;
1256
+ }
1257
+ .footer__logo > img{
1258
+ margin-right: 10px;
1259
+ }
1260
+ .social__media{
1261
+ max-width: 1000px;
1262
+ width: 100%;
1263
+ }
1264
+ .social__media--wrap{
1265
+ display: flex;
1266
+ justify-content: space-between;
1267
+ align-items: center;
1268
+ width: 90%;
1269
+ max-width: 1000px;
1270
+ margin: 40px auto 0 auto;
1271
+ }
1272
+ .social__logo{
1273
+ color: #fff;
1274
+ justify-self: start;
1275
+ cursor: pointer;
1276
+ text-decoration: none;
1277
+ font-size: 2rem;
1278
+ display: flex;
1279
+ align-items: center;
1280
+ margin-bottom: 16px;
1281
+ font-weight: bold;
1282
+ }
1283
+ .social__logo > img{
1284
+ margin-right: 10px;
1285
+ }
1286
+ .website__rights{
1287
+ color: #fff;
1288
+ margin-bottom: 16px;
1289
+ }
1290
+ .social__icons{
1291
+ display: flex;
1292
+ justify-content: space-between;
1293
+ align-items: center;
1294
+ width: 240px;
1295
+ }
1296
+ .social__icon--link{
1297
+ color: #fff;
1298
+ font-size: 24px;
1299
+ }
1300
+ /* ---------------------------------------- Animations ----------------------------------------*/
1301
+
1302
+ @keyframes pulseAnimation {
1303
+ 0% {
1304
+ transform: scale(1);
1305
+ }
1306
+ 25% {
1307
+ transform: scale(1.5);
1308
+ }
1309
+ 50% {
1310
+ transform: scale(1);
1311
+ }
1312
+ 75% {
1313
+ transform: scale(1.25);
1314
+ }
1315
+ 100% {
1316
+ transform: scale(1);
1317
+ }
1318
+ }
1319
+
static/images/favicon.ico ADDED
static/images/logo.png ADDED
static/images/orangelogo.png ADDED
static/js/app.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ const menu = document.querySelector('#mobile-menu')
2
+ const menuLinks = document.querySelector('.navbar__menu')
3
+ menu.addEventListener('click', function() {
4
+ menu.classList.toggle('is-active')
5
+ menuLinks.classList.toggle('active')
6
+ })
static/js/deletePost.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ function deletePost(postId) {
2
+ fetch(`/delete_post/${postId}`, { method: 'POST' })
3
+ .then((response) => {
4
+ if (response.ok) {
5
+ const postElement = document.querySelector(`.post[data-post-id="${postId}"]`);
6
+ if (postElement) {
7
+ postElement.remove();
8
+ }
9
+ } else {
10
+ console.error('Error deleting post:', response);
11
+ }
12
+ })
13
+ .catch((error) => {
14
+ console.error('Error deleting post:', error);
15
+ });
16
+ }
static/js/dropdown.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ document.addEventListener('click', function (event) {
2
+ const dropdownToggle = event.target.closest('.dropdown-toggle');
3
+ if (dropdownToggle) {
4
+ const dropdownMenu = dropdownToggle.nextElementSibling;
5
+ if (dropdownMenu) {
6
+ dropdownMenu.classList.toggle('show');
7
+ }
8
+ } else {
9
+ const dropdownMenus = document.querySelectorAll('.dropdown-menu');
10
+ dropdownMenus.forEach((menu) => {
11
+ menu.classList.remove('show');
12
+ });
13
+ }
14
+ });
static/js/likePost.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ function likePost(postId) {
2
+ fetch(`/like_post/${postId}`, { method: 'POST' })
3
+ .then((response) => response.json())
4
+ .then((data) => {
5
+ const likeCountSpan = document.getElementById(`likeCount${postId}`);
6
+ likeCountSpan.textContent = data.likes_count;
7
+
8
+ const heartIcon = document.getElementById(`heartIcon${postId}`);
9
+ if (data.liked) {
10
+ heartIcon.classList.add('liked');
11
+ heartIcon.classList.remove('heartIcon');
12
+ } else {
13
+ heartIcon.classList.remove('liked');
14
+ heartIcon.classList.add('heartIcon');
15
+ }
16
+ });
17
+ }
static/js/showComments.js ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ function showComments(postId) {
2
+ $(`#commentsModal${postId}`).modal('show');
3
+ }
static/users/uploaded_images/410068c0-edce-4542-8f97-9d0d1cbb1d1cIMG_20240116_124952corpdp.jpg ADDED

Git LFS Details

  • SHA256: 8b58bfa783bd77c3964c036c344fd7456e287b41a8aeb8ac060b4ea5b14cd377
  • Pointer size: 132 Bytes
  • Size of remote file: 1.35 MB
static/users/uploaded_images/default.jpg ADDED
templates/account.html ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <h1 class="title">Account</h1>
5
+ <form class="account-form" action="{{ url_for('account') }}" method="post" enctype="multipart/form-data">
6
+ <div class="form-column">
7
+
8
+ <label for="username"><i class="fa-solid fa-at form-button"></i> Username:</label>
9
+ <input class="account-input" type="text" id="username" name="username" value="{{ current_user.username }}" required>
10
+
11
+ <label for="email"><i class="fa-solid fa-envelope form-button"></i> Email:</label>
12
+ <input class="account-input" type="email" id="email" name="email" value="{{ current_user.email }}" required>
13
+
14
+ <label for="first_name"><i class="fa-solid fa-signature form-button"></i> First Name:</label>
15
+ <input class="account-input" type="text" id="first_name" name="first_name" value="{{ current_user.first_name }}">
16
+
17
+ <label for="last_name"><i class="fa-solid fa-signature form-button"></i> Last Name:</label>
18
+ <input class="account-input" type="text" id="last_name" name="last_name" value="{{ current_user.last_name }}">
19
+
20
+ <label for="new_password"><i class="fa-solid fa-lock form-button"> </i>New Password:</label>
21
+ <input class="account-input" type="password" id="new_password" name="new_password">
22
+ </div>
23
+
24
+ <div class="form-column">
25
+ <label for="profile_picture"><i class="fa-solid fa-camera form-button"></i> Profile Picture:</label>
26
+ <div class="profile-pics">
27
+ {% if current_user.profile_pic %}
28
+ <img id="profilePicture" class="account-img" src="{{ url_for('static', filename='users/uploaded_images/' + current_user.profile_pic) }}" alt="Profile Picture">
29
+ {% else %}
30
+ <img id="profilePicture" class="account-img" src="{{ url_for('static', filename='users/uploaded_images/default.jpg') }}" alt="Profile Picture">
31
+ {% endif %}
32
+ <input class="account-buttons" type="file" id="profile_picture" name="profile_picture" onchange="previewProfilePicture(event)">
33
+ </div>
34
+ <label for="bio"><i class="fa-solid fa-circle-info form-button"></i> Bio:</label>
35
+ <textarea class="account-input account-textarea" id="bio" name="bio">{{ current_user.bio }}</textarea>
36
+
37
+ <label for="location"><i class="fa-solid fa-location-dot form-button"></i> Location:</label>
38
+ <input class="account-input" type="text" id="location" name="location" value="{{ current_user.location }}">
39
+
40
+ <label for="profession"><i class="fa-solid fa-user-tie form-button"></i> Profession:</label>
41
+ <input class="account-input" type="text" id="profession" name="profession" value="{{ current_user.profession }}">
42
+
43
+ <input class="account-submit" type="submit" value="Update Profile">
44
+ </div>
45
+ </form>
46
+ <script>
47
+ // Function to update the profile picture preview
48
+ function previewProfilePicture(event) {
49
+ const fileInput = event.target;
50
+ const profilePicture = document.getElementById('profilePicture');
51
+
52
+ if (fileInput.files && fileInput.files[0]) {
53
+ const reader = new FileReader();
54
+
55
+ reader.onload = function (e) {
56
+ profilePicture.src = e.target.result;
57
+ };
58
+
59
+ reader.readAsDataURL(fileInput.files[0]);
60
+ }
61
+ }
62
+ </script>
63
+
64
+ {% endblock %}
templates/conversation.html ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <h1 class="title">Conversation with {{ recipient.username }}</h1>
5
+ <div class="conversation__container">
6
+ <div class="conversation__messages">
7
+ {% for message in messages %}
8
+ <div class="conversation__message">
9
+ <div class="conversation__message__top__row"><img class="post_profile_picture" src="{{ url_for('static', filename='users/uploaded_images/' + message.sender.profile_pic) }}" alt="Profile Image"><p class="profile_name">{{ message.sender.username }}</p></div>
10
+ <p class="conversation__content">{{ message.content }}</p>
11
+ <p class="conversation__message__info">Time: {{ message.timestamp.strftime('%Y-%m-%d %H:%M') }}</p>
12
+ </div>
13
+ {% endfor %}
14
+ </div>
15
+ <form action="{{ url_for('conversation', recipient_id=recipient.id) }}" method="post">
16
+ <div class="conversation__send__message">
17
+ <textarea class="conversation__message__box" name="message_content" placeholder="Message" required></textarea>
18
+ <input class="conversation__message__button" type="submit" value="Send Message">
19
+ </div>
20
+ </form>
21
+ </div>
22
+ {% endblock %}
templates/conversations.html ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <div class="ablankgap"></div>
5
+ <div class="conversations__container">
6
+ <h1 class="title">Private Messages</h1>
7
+ <div class="conversations__new">
8
+ <a class="conversations__new__button" href="{{ url_for('new_conversation') }}">Start a New Conversation</a>
9
+ </div>
10
+ <div class="conversations__list">
11
+ <ul class="conversations__ul">
12
+ {% for user in conversations %}
13
+ <li class="conversations__li">
14
+ <a class="conversations__user__box" href="{{ url_for('conversation', recipient_id=user.id) }}">
15
+ <img class="conversations__user__image" src="{{ url_for('static', filename='users/uploaded_images/' + user.profile_pic) }}" alt="User Image">
16
+ <div class="conversations__name_and_icon">
17
+ <p class="conversations__username">{{ user.username }}</p>
18
+ <div class="circle">
19
+ <i class="fa-solid fa-arrow-up-right-from-square inner_circle_icon"></i>
20
+ </div>
21
+ </div>
22
+ </a>
23
+ </li>
24
+ {% endfor %}
25
+ </ul>
26
+ </div>
27
+ </div>
28
+ {% endblock %}
templates/index.html ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <h1 class="title">Hello, {{ current_user.username }}!</h1>
5
+ <h2 class="subtitle">Recent Posts:</h2>
6
+ <button type="button" title="New Post" class="newpost-button" data-toggle="modal" data-target="#createPostModal">
7
+ <i class="fa-solid fa-plus"></i>
8
+ </button>
9
+ <!-- Modals -->
10
+ <div class="modal fade dark-modal" id="createPostModal" tabindex="-1" role="dialog" aria-labelledby="createPostModalLabel" aria-hidden="true">
11
+ <div class="modal-dialog" role="document">
12
+ <div class="modal-content">
13
+ <div class="modal-header">
14
+ <h5 class="modal-title" id="createPostModalLabel">Create New Post</h5>
15
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
16
+ <span aria-hidden="true">&times;</span>
17
+ </button>
18
+ </div>
19
+ <div class="modal-body">
20
+ <form method="POST" action="{{ url_for('create_post') }}" enctype="multipart/form-data">
21
+ <div class="form-group">
22
+ <label for="postCaption">Caption</label>
23
+ <textarea id="postCaption" name="content" class="form-control" required></textarea>
24
+ </div>
25
+ <div class="form-group">
26
+ <label for="postImage">Image</label>
27
+ <input type="file" id="postImage" name="image" class="form-control-file">
28
+ </div>
29
+ <div class="modal-footer">
30
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
31
+ <button type="submit" class="btn btn-primary">Create Post</button>
32
+ </div>
33
+ </form>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </div>
38
+
39
+ {% for post in posts %}
40
+ <div class="post">
41
+ <div class="top">
42
+ <a class="post_profile_a" href="user/{{post.author.id}}"><img class="post_profile_picture" src="{{ url_for('static', filename='users/uploaded_images/' + post.author.profile_pic) }}" alt="Profile Image"><p class="profile_name">{{ post.author.username }}</p></a>
43
+ <div class="dropdown">
44
+ <button class="btn dropdown-toggle" type="button" id="dropdownMenuButton{{ post.id }}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
45
+ <i class="fas fa-ellipsis-vertical"></i>
46
+ </button>
47
+ <div class="dropdown-menu" aria-labelledby="dropdownMenuButton{{ post.id }}">
48
+ <a class="dropdown-item" href="/" onclick="deletePost({{ post.id }})">Delete Post</a>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ <p class="caption">{{ post.content }}</p>
53
+ {% if post.filename %}
54
+ <img class="post-image" src="{{ url_for('static', filename='users/uploaded_images/' + post.filename) }}" alt="Post Image">
55
+ {% endif %}
56
+
57
+
58
+
59
+ <div class="post-interactions">
60
+ <p class="post-likes">
61
+ <i class="fas fa-heart {% if not current_user.has_liked_post(post) %}heartIcon{% endif %}{% if current_user.has_liked_post(post) %}liked{% endif %}" onclick="likePost({{ post.id }})" id="heartIcon{{ post.id }}"></i>
62
+ <span class="likes" id="likeCount{{ post.id }}">{{ post.likes_count }}</span>
63
+ </p>
64
+ <p class="post-comments" onclick="showComments({{ post.id }})">
65
+ <i class="fas fa-comment CommentIcon"></i> {{ post.comments | length }}
66
+ </p>
67
+ <p class="post-info">Posted by {{ post.author.username }} on {{ post.created_at.strftime('%Y-%m-%d') }}</p>
68
+ </div>
69
+ <div class="modal fade dark-modal" id="commentsModal{{ post.id }}" tabindex="-1" role="dialog" aria-labelledby="commentsModalLabel" aria-hidden="true">
70
+ <div class="modal-dialog" role="document">
71
+ <div class="modal-content">
72
+ <div class="modal-header">
73
+ <h5 class="modal-title" id="commentsModalLabel">Comments</h5>
74
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
75
+ <span aria-hidden="true">&times;</span>
76
+ </button>
77
+ </div>
78
+ <div class="modal-body">
79
+ <ul class="list-group">
80
+ {% for comment in post.comments %}
81
+ <li class="list-group-item">
82
+ <strong>{{ comment.author.username }}:</strong> {{ comment.content }}
83
+ </li>
84
+ {% endfor %}
85
+ </ul>
86
+ </div>
87
+ <div class="modal-footer">
88
+ <form method="POST" action="{{ url_for('add_comment', post_id=post.id) }}">
89
+ <div class="form-group">
90
+ <textarea name="content" class="form-control" placeholder="Write your comment here" required></textarea>
91
+ </div>
92
+ <button type="submit" class="btn btn-primary">Submit Comment</button>
93
+ </form>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+
100
+ {% endfor %}
101
+ <script src="{{ url_for('static', filename='js/editPost.js') }}"></script>
102
+ <script src="{{ url_for('static', filename='js/deletePost.js') }}"></script>
103
+ <script src="{{ url_for('static', filename='js/likePost.js') }}"></script>
104
+ <script src="{{ url_for('static', filename='js/showComments.js') }}"></script>
105
+ <script src="{{ url_for('static', filename='js/dropdown.js') }}"></script>
106
+ {% endblock %}
107
+
templates/layout.html ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Simplz</title>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
8
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
9
+ <meta name="icon" type="image/ico" href="{{ url_for('static', filename='images/favicon.ico') }}">
10
+ <script src="https://kit.fontawesome.com/c76bc25f8c.js" crossorigin="anonymous"></script>
11
+ </head>
12
+ <body>
13
+ <div class="page">
14
+ <div class="stick">
15
+ <nav class="navbar">
16
+ <div class="navbar__container">
17
+ <a href="/" id="navbar__logo"><img class="logo" src="{{ url_for('static', filename='images/logo.png')}}" width="60">Simplz</a>
18
+ <div class="navbar__toggle" id="mobile-menu">
19
+ <span class="bar"></span>
20
+ <span class="bar"></span>
21
+ <span class="bar"></span>
22
+ </div>
23
+ <ul class="navbar__menu">
24
+ <li class="navbar__item"><a class="navbar__links" href="{{ url_for('index') }}" title="Home"><i class="fa-solid fa-house"></i></a></li>
25
+ {% if current_user.is_authenticated %}
26
+ <li class="navbar__item"><a class="navbar__links" href="{{ url_for('account') }}" title="Account Settings"><i class="fa-solid fa-user"></i></a></li>
27
+ <li class="navbar__item"><a class="navbar__links" href="{{ url_for('conversations') }}" title="Messages"><i class="fa-solid fa-envelope"></i></a></li>
28
+ <li class="navbar__item"><a class="navbar__links" href="{{ url_for('logout') }}" title="Logout"><i class="fa-solid fa-right-from-bracket"></i></a></li>
29
+ {% else %}
30
+ <li class="navbar__item"><a class="navbar__links" href="{{ url_for('login') }}">Login</a></li>
31
+ <li class="navbar__item"><a class="navbar__links" href="{{ url_for('register') }}">Register</a></li>
32
+ {% endif %}
33
+ </ul>
34
+ </div>
35
+ </nav>
36
+
37
+ <header>
38
+ <form action="{{ url_for('search_user') }}" method="get">
39
+ <input type="text" name="search_query" placeholder="Search for users..." value="{{ searchq }}">
40
+ <button type="submit"><i class="fa-solid fa-magnifying-glass"></i></button>
41
+ </form>
42
+ </header>
43
+ </div>
44
+
45
+ <div class="contents">
46
+ {% block content %}
47
+ {% endblock %}
48
+ </div>
49
+ {% with messages = get_flashed_messages() %}
50
+ {% if messages %}
51
+ <ul class="flash-messages">
52
+ {% for message in messages %}
53
+ <li class="flash-message">{{ message }}</li>
54
+ {% endfor %}
55
+ </ul>
56
+ {% endif %}
57
+ {% endwith %}
58
+ <footer class="footer">
59
+ <div class="footer__container">
60
+ <div class="footer__links">
61
+ <!-- class="footer__link--wrapper">
62
+ <div class="footer__link--items">
63
+ <h2>About Us</h2>
64
+ <a href="/">How it works</a>
65
+ <a href="/">Testimonials</a>
66
+ <a href="/">Careers</a>
67
+ <a href="/">Terms of Service</a>
68
+ </div>
69
+ <div class="footer__link--items">
70
+ <h2>Contact Us</h2>
71
+ <a href="/">Contact</a>
72
+ <a href="/">Support</a>
73
+ <a href="/">Destinations</a>
74
+ <a href="/">Sponsorships</a>
75
+ </div-->
76
+ </div>
77
+ <div class="footer__link--wrapper">
78
+ <div class="footer__link--items">
79
+ <h2>About</h2>
80
+ <a href="/">Developers</a>
81
+ <a href="/">Support</a>
82
+ <a href="/">How To</a>
83
+ <a href="/"></a>
84
+ </div>
85
+ <div class="footer__link--items">
86
+ <h2>Socials</h2>
87
+ <a href="/">Instagram</a>
88
+ <a href="/">Facebook</a>
89
+ <a href="/">Youtube</a>
90
+ <a href="/">Twitter</a>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ <section class="social__media">
95
+ <div class="social__media--wrap">
96
+ <div class="footer__logo">
97
+ <a href="/" id="footer__logo"><img class="logo" src="{{ url_for('static', filename='images/logo.png')}}" width="60">Simplz</a>
98
+ </div>
99
+ <p class="website__rights">© Simplz By Zaanind - 2024.</p>
100
+ <!--div class="social__icons">
101
+ <a href="/" class="social__icon--link" target="_blank"><i class="fa-brands fa-facebook"></i></a>
102
+ <a href="/" class="social__icon--link" target="_blank"><i class="fa-brands fa-instagram"></i></a>
103
+ <a href="/" class="social__icon--link" target="_blank"><i class="fa-brands fa-youtube"></i></a>
104
+ <a href="/" class="social__icon--link" target="_blank"><i class="fa-brands fa-twitter"></i></a>
105
+
106
+ </div-->
107
+ </div>
108
+ </section>
109
+ </div>
110
+ </footer>
111
+ </div>
112
+ <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
113
+ <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js"></script>
114
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
115
+ <script src="{{ url_for('static', filename='js/app.js') }}"></script>
116
+ </body>
117
+ </html>
templates/login.html ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <h1 class="title">Login</h1>
5
+ <form class = "loginpage" action="{{ url_for('login') }}" method="post">
6
+ <label for="username"><i class="fa-solid fa-at form-button"></i> Username:</label>
7
+ <input class = "login-input" type="text" id="username" name="username" placeholder="username...">
8
+ <label for="password"><i class="fa-solid fa-lock form-button"></i> Password:</label>
9
+ <input class = "login-input" type="password" id="password" name="password" placeholder="password..." required>
10
+ <input class = "login-button" type="submit" value="Login">
11
+ </form>
12
+ {% endblock %}
templates/new_conversation.html ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <h1 class="title">Start a New Conversation</h1>
5
+ <form class="new_conversation__form" action="{{ url_for('send_message') }}" method="post">
6
+ <label class="new_conversation__label" for="recipient_username">Recipient's Username:</label>
7
+ <input class="new_conversation__input" type="text" id="recipient_username" name="recipient_username" required>
8
+ <label class="new_conversation__label" for="message_content">Message:</label>
9
+ <textarea class="new_conversation__textarea" id="message_content" name="message_content" required></textarea>
10
+ <button class="new_conversation__button" type="submit">Send Message</button>
11
+ </form>
12
+ {% endblock %}
templates/register.html ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- register.html -->
2
+
3
+ {% extends "layout.html" %}
4
+
5
+ {% block content %}
6
+ <h1 class="title">Register</h1>
7
+ <form class = "registerpage" action="{{ url_for('register') }}" method="post">
8
+ <label for="email"><i class="fa-solid fa-envelope form-button"></i> Email:</label>
9
+ <input class = "register-input" type="email" id="email" name="email" required>
10
+ <label for="username"><i class="fa-solid fa-at form-button"></i> Username:</label>
11
+ <input class = "register-input" type="text" id="username" name="username" required>
12
+ <label for="password"><i class="fa-solid fa-lock form-button"></i> Password:</label>
13
+ <input class = "register-input" type="password" id="password" name="password" required>
14
+ <label for="password2"><i class="fa-solid fa-lock form-button"></i> Confirm Password:</label>
15
+ <input class = "register-input" type="password" id="password2" name="password2" required>
16
+ <input class = "register-button" type="submit" value="Register">
17
+ </form>
18
+ {% endblock %}
templates/search_results.html ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- search_results.html -->
2
+ {% extends "layout.html" %}
3
+
4
+ {% block content %}
5
+ <h1 class="title">Search Results</h1>
6
+ {% if users %}
7
+ <ul class="searchresults_ul">
8
+ {% for user in users %}
9
+ <div class="searchresults_container">
10
+ <div class="toprow">
11
+ <img class = "searchresults_img" src="{{ url_for('static', filename='users/uploaded_images/' + user.profile_pic) }}" alt="Profile Picture" class="searchresults_img">
12
+ <h2 class = "searchresults_h2">{{ user.username }} | {{user.first_name }} {{ user.last_name }}</h2>
13
+ {% if current_user.is_authenticated and current_user.id != user.id %}
14
+ {% if current_user.is_following(user) %}
15
+ <form action="{{ url_for('unfollow', user_id=user.id, page='search') }}" method="post">
16
+ <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
17
+ <button class = "follow_button" type="submit"><i class="fa-solid fa-user-minus"></i> Unfollow</button>
18
+ </form>
19
+ {% else %}
20
+ <form action="{{ url_for('follow', user_id=user.id, page='search') }}" method="post">
21
+ <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
22
+ <button class = "follow_button" type="submit"><i class="fa-solid fa-user-plus"></i> Follow</button>
23
+ </form>
24
+ {% endif %}
25
+ {% endif %}
26
+ </div>
27
+ <div class="bottomrow">
28
+ <p class = "searchresults_p">Bio: {{ user.bio }}</p>
29
+ <li class="searchresults_li"><a class = "searchresults_a" href="{{ url_for('view_profile', user_id=user.id) }}"><i class="fa-solid fa-share-from-square"></i> Visit Profile</a></li>
30
+ </div>
31
+ </div>
32
+ {% endfor %}
33
+ </ul>
34
+ {% else %}
35
+ <center><p style="color:#fff">No results found.</p></center>
36
+ {% endif %}
37
+ {% endblock %}
templates/user_profile.html ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <div class="user-profile__container">
5
+ <div class="user-profile__rows">
6
+ <div class="user-profile__left-column">
7
+ <div class="text-center">
8
+ <img src="{{ url_for('static', filename='users/uploaded_images/' + user.profile_pic) }}" alt="Profile Picture"
9
+ class="user-profile__profile-picture img-thumbnail">
10
+ </div>
11
+ {% if current_user.is_authenticated and current_user.id != user.id %}
12
+ <div class="text-center mt-3">
13
+ {% if current_user.is_following(user) %}
14
+ <form action="{{ url_for('unfollow', user_id=profile_user_id, page='profile') }}" method="post">
15
+ <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
16
+ <button type="submit" class="user-profile__follow-button btn btn-danger"><i class="fa-solid fa-user-minus"></i> Unfollow</button>
17
+ </form>
18
+ {% else %}
19
+ <form action="{{ url_for('follow', user_id=profile_user_id, page='profile') }}" method="post">
20
+ <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
21
+ <button type="submit" class="user-profile__follow-button btn btn-primary"><i class="fa-solid fa-user-plus"></i> Follow</button>
22
+ </form>
23
+ {% endif %}
24
+ </div>
25
+ {% endif %}
26
+ </div>
27
+
28
+ <div class="user-profile__right-column">
29
+ <h1 class="title">{{ user.username }}</h1>
30
+ <p class="user-profile__email"><strong>Email:</strong> {{ user.email }}</p>
31
+ {% if user.first_name or user.last_name %}
32
+ <p class="user-profile__name"><strong>Name:</strong> {{ user.first_name }} {{ user.last_name }}</p>
33
+ {% endif %}
34
+ {% if user.profession %}
35
+ <p class="user-profile__profession"><strong>Profession:</strong> {{ user.profession }}</p>
36
+ {% endif %}
37
+ {% if user.location %}
38
+ <p class="user-profile__location"><strong>Location:</strong> {{ user.location }}</p>
39
+ {% endif %}
40
+ </div>
41
+ </div>
42
+ </div>
43
+
44
+ <hr>
45
+
46
+ <h3>Posts</h3>
47
+
48
+ <div class="row">
49
+ <div class="col-md-12">
50
+ {% if posts %}
51
+ {% for post in posts %}
52
+ <div class="post mb-4">
53
+ <div class="top">
54
+ <a href="user/{{ post.author.id }}">
55
+ <img class="post_profile_picture" src="{{ url_for('static', filename='users/uploaded_images/' + post.author.profile_pic) }}" alt="Profile Image">
56
+ <p class="profile_name">{{ post.author.username }}</p>
57
+ </a>
58
+ <div class="dropdown">
59
+ <button class="btn dropdown-toggle" type="button" id="dropdownMenuButton{{ post.id }}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
60
+ <i class="fas fa-ellipsis-vertical"></i>
61
+ </button>
62
+ <div class="dropdown-menu" aria-labelledby="dropdownMenuButton{{ post.id }}">
63
+ <a class="dropdown-item" href="#" onclick="deletePost({{ post.id }})">Delete Post</a>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ {% if post.filename %}
68
+ <img class="post-image" src="{{ url_for('static', filename='users/uploaded_images/' + post.filename) }}" alt="Post Image">
69
+ {% endif %}
70
+ <p class="caption">{{ post.content }}</p>
71
+ <div class="post-interactions">
72
+ <p class="post-likes">
73
+ <i class="fas fa-heart {% if not current_user.has_liked_post(post) %}heartIcon{% endif %}{% if current_user.has_liked_post(post) %}liked{% endif %}" onclick="likePost({{ post.id }})" id="heartIcon{{ post.id }}"></i>
74
+ <span class="likes" id="likeCount{{ post.id }}">{{ post.likes_count }}</span>
75
+ </p>
76
+ <p class="post-comments" onclick="showComments({{ post.id }})">
77
+ <i class="fas fa-comment CommentIcon"></i> {{ post.comments | length }}
78
+ </p>
79
+ <p class="post-info">Posted by {{ post.author.username }} on {{ post.created_at.strftime('%Y-%m-%d') }}</p>
80
+ </div>
81
+ <!-- Comments Modal -->
82
+ <div class="modal fade" id="commentsModal{{ post.id }}" tabindex="-1" role="dialog" aria-labelledby="commentsModalLabel" aria-hidden="true">
83
+ <div class="modal-dialog" role="document">
84
+ <div class="modal-content">
85
+ <div class="modal-header">
86
+ <h5 class="modal-title" id="commentsModalLabel">Comments</h5>
87
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
88
+ <span aria-hidden="true">&times;</span>
89
+ </button>
90
+ </div>
91
+ <div class="modal-body">
92
+ <ul class="list-group">
93
+ {% for comment in post.comments %}
94
+ <li class="list-group-item">
95
+ <strong>{{ comment.author.username }}:</strong> {{ comment.content }}
96
+ </li>
97
+ {% endfor %}
98
+ </ul>
99
+ </div>
100
+ <div class="modal-footer">
101
+ <form method="POST" action="{{ url_for('add_comment', post_id=post.id) }}">
102
+ <div class="form-group">
103
+ <textarea name="content" class="form-control" placeholder="Write your comment here" required></textarea>
104
+ </div>
105
+ <button type="submit" class="btn btn-primary">Submit Comment</button>
106
+ </form>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </div>
112
+ {% endfor %}
113
+ {% else %}
114
+ <div class="col-md-12">
115
+ <p>No posts yet.</p>
116
+ </div>
117
+ {% endif %}
118
+ </div>
119
+ </div>
120
+ <script>
121
+ function likePost(postId) {
122
+ fetch(`/like_post/${postId}`, { method: 'POST' })
123
+ .then((response) => response.json())
124
+ .then((data) => {
125
+ const likeCountSpan = document.getElementById(`likeCount${postId}`);
126
+ likeCountSpan.textContent = data.likes_count;
127
+
128
+ const heartIcon = document.getElementById(`heartIcon${postId}`);
129
+ if (data.liked) {
130
+ heartIcon.classList.add('liked');
131
+ heartIcon.classList.remove('heartIcon');
132
+ } else {
133
+ heartIcon.classList.remove('liked');
134
+ heartIcon.classList.add('heartIcon');
135
+ }
136
+ });
137
+ }
138
+
139
+ function showComments(postId) {
140
+ $(`#commentsModal${postId}`).modal('show');
141
+ }
142
+ function deletePost(postId) {
143
+ fetch(`/delete_post/${postId}`, { method: 'POST' })
144
+ .then((response) => {
145
+ if (response.ok) {
146
+ const postElement = document.querySelector(`.post[data-post-id="${postId}"]`);
147
+ if (postElement) {
148
+ postElement.remove();
149
+ }
150
+ } else {
151
+ console.error('Error deleting post:', response);
152
+ }
153
+ })
154
+ .catch((error) => {
155
+ console.error('Error deleting post:', error);
156
+ });
157
+ }
158
+
159
+ document.addEventListener('click', function (event) {
160
+ const dropdownToggle = event.target.closest('.dropdown-toggle');
161
+ if (dropdownToggle) {
162
+ const dropdownMenu = dropdownToggle.nextElementSibling;
163
+ if (dropdownMenu) {
164
+ dropdownMenu.classList.toggle('show');
165
+ }
166
+ } else {
167
+ const dropdownMenus = document.querySelectorAll('.dropdown-menu');
168
+ dropdownMenus.forEach((menu) => {
169
+ menu.classList.remove('show');
170
+ });
171
+ }
172
+ });
173
+ </script>
174
+ {% endblock %}