├── .github └── workflows │ └── jekyll-docker.yml ├── .gitignore ├── LICENSE ├── README.md ├── css └── styles.css ├── images ├── large.png └── vscode.png ├── index.html └── js └── scripts.js /.github/workflows/jekyll-docker.yml: -------------------------------------------------------------------------------- 1 | name: Jekyll site CI 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | 7 | pull_request: 8 | branches: [master] 9 | 10 | jobs: 11 | build: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - name: Checkout source Git branch 17 | uses: actions/checkout@v4 18 | 19 | - name: Build the site in the jekyll/builder container 20 | run: | 21 | docker run \ 22 | -v ${{ github.workspace }}:/srv/jekyll -v ${{ github.workspace }}/_site:/srv/jekyll/_site \ 23 | jekyll/builder:latest /bin/bash -c "chmod -R 777 /srv/jekyll && jekyll build --future" 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Bob's Programming Academy 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Responsive Social Media Dashboard 2 | 3 | This is a responsive social media dashboard built using **HTML 5**, **CSS 3**, and **JavaScript**. 4 | 5 | ![plot](https://github.com/BobsProgrammingAcademy/social-media-dashboard/blob/master/images/large.png?raw=true) 6 | 7 | ## Table of Contents 8 | - [Prerequisites](#prerequisites) 9 | - [Running the application](#run-the-application) 10 | - [Copyright and License](#copyright-and-license) 11 | 12 | ## Prerequisites 13 | 14 | Install the following prerequisites: 15 | 16 | * [Visual Studio Code](https://code.visualstudio.com/download) with the **Live Server** extension. 17 | 18 | [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer) allows us to launch a local development server that enables a live reload of our project. 19 | 20 | 21 | ## Run the application 22 | 23 | To run the application, start the **Live Server** by clicking **Go Live** in the bottom right corner of the status bar in Visual Studio Code. This action will load the website in your default web browser. 24 | 25 | ![plot](https://github.com/BobsProgrammingAcademy/social-media-dashboard/blob/master/images/vscode.png?raw=true) 26 | 27 | ## View the application 28 | 29 | Once the **Live Server** is up and running, go to http://127.0.0.1:5500/index.html to view the application. 30 | 31 | ## Copyright and License 32 | 33 | Copyright © 2023 Bob's Programming Academy. Code released under the MIT license. 34 | -------------------------------------------------------------------------------- /css/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | background-color: rgb(247, 246, 252); 6 | color: rgb(70, 71, 81); 7 | font-family: 'Open Sans', sans-serif; 8 | } 9 | 10 | .material-icons-outlined { 11 | vertical-align: middle; 12 | line-height: 1px; 13 | font-size: 30px; 14 | } 15 | 16 | .text-secondary { 17 | color: rgb(70, 71, 81); 18 | } 19 | 20 | .text-blue { 21 | color: rgb(29, 38, 154); 22 | } 23 | 24 | .background-blue { 25 | background-color: rgb(29, 38, 154); 26 | } 27 | 28 | .text-red { 29 | color: rgb(213, 0, 0); 30 | } 31 | 32 | .background-red { 33 | background-color: rgb(213, 0, 0); 34 | } 35 | 36 | .text-green { 37 | color: rgb(46, 125, 50); 38 | } 39 | 40 | .background-green { 41 | background-color: rgb(46, 125, 50); 42 | } 43 | 44 | .text-orange { 45 | color: rgb(255, 111, 0); 46 | } 47 | 48 | .background-orange { 49 | background-color: rgb(255, 111, 0); 50 | } 51 | 52 | .grid-container { 53 | display: grid; 54 | grid-template-columns: 260px 1fr 1fr 1fr; 55 | grid-template-rows: 0.2fr 3fr; 56 | grid-template-areas: 57 | 'sidebar header header header' 58 | 'sidebar main main main'; 59 | height: 100vh; 60 | } 61 | 62 | /* ---------- HEADER ---------- */ 63 | 64 | .header { 65 | grid-area: header; 66 | height: 70px; 67 | display: flex; 68 | align-items: center; 69 | justify-content: space-between; 70 | padding: 0 30px 0 30px; 71 | box-shadow: 0 6px 7px -4px rgba(0, 0, 0, 0.2); 72 | } 73 | 74 | .menu-icon { 75 | display: none; 76 | } 77 | 78 | /* ---------- SIDEBAR ---------- */ 79 | 80 | #sidebar { 81 | grid-area: sidebar; 82 | height: 100%; 83 | background-color: rgb(29, 38, 154); 84 | color: rgb(255, 255, 255); 85 | overflow-y: auto; 86 | transition: all 0.5s; 87 | -webkit-transition: all 0.5s; 88 | } 89 | 90 | .sidebar-title { 91 | display: flex; 92 | justify-content: space-between; 93 | align-items: center; 94 | padding: 20px 20px 20px 20px; 95 | margin-bottom: 30px; 96 | } 97 | 98 | .sidebar-title > span { 99 | display: none; 100 | } 101 | 102 | .sidebar-brand { 103 | margin-top: 15px; 104 | font-size: 30px; 105 | font-weight: 700; 106 | } 107 | 108 | .sidebar-brand > .material-icons-outlined { 109 | font-size: 50px; 110 | } 111 | 112 | .sidebar-list { 113 | padding: 0; 114 | margin-top: 15px; 115 | list-style-type: none; 116 | } 117 | 118 | .sidebar-list-item { 119 | padding: 20px 20px 20px 20px; 120 | font-size: 18px; 121 | } 122 | 123 | .sidebar-list-item:hover { 124 | background-color: rgba(255, 255, 255, 0.2); 125 | cursor: pointer; 126 | } 127 | 128 | .sidebar-list-item > a { 129 | text-decoration: none; 130 | color: rgb(180, 184, 244); 131 | } 132 | 133 | .sidebar-responsive { 134 | display: inline !important; 135 | position: absolute; 136 | } 137 | 138 | /* ---------- MAIN ---------- */ 139 | 140 | .main-container { 141 | grid-area: main; 142 | overflow-y: auto; 143 | padding: 20px 20px; 144 | } 145 | 146 | .main-title { 147 | display: flex; 148 | justify-content: space-between; 149 | } 150 | 151 | .main-cards { 152 | display: grid; 153 | grid-template-columns: 1fr 1fr 1fr 1fr; 154 | gap: 20px; 155 | margin: 20px 0; 156 | } 157 | 158 | .card { 159 | display: flex; 160 | flex-direction: column; 161 | justify-content: space-around; 162 | padding: 25px; 163 | color: rgb(255, 255, 255); 164 | border-radius: 30px; 165 | box-shadow: 0 6px 7px -4px rgba(0, 0, 0, 0.2); 166 | } 167 | 168 | .card:first-child { 169 | background-color: rgb(213, 0, 0); 170 | } 171 | 172 | .card:nth-child(2) { 173 | background-color: rgb(46, 125, 50); 174 | } 175 | 176 | .card:nth-child(3) { 177 | background-color: rgb(255, 111, 0); 178 | } 179 | 180 | .card:nth-child(4) { 181 | background-color: rgb(29, 38, 154); 182 | } 183 | 184 | .card-inner { 185 | display: flex; 186 | align-items: center; 187 | justify-content: space-between; 188 | } 189 | 190 | .card-inner > span { 191 | font-size: 50px; 192 | } 193 | 194 | .products { 195 | display: grid; 196 | grid-template-columns: 1fr 1fr; 197 | gap: 20px; 198 | } 199 | 200 | .product-card { 201 | height: 350px; 202 | background-color: rgb(255, 255, 255); 203 | padding: 25px; 204 | border-radius: 30px; 205 | box-shadow: 0 6px 7px -4px rgba(0, 0, 0, 0.2); 206 | } 207 | 208 | .product-description { 209 | padding-top: 50px; 210 | } 211 | 212 | .product-button { 213 | background-color: rgb(29, 38, 154); 214 | color: rgb(255, 255, 255); 215 | padding: 20px; 216 | border-radius: 30px; 217 | } 218 | 219 | .product-button > .material-icons-outlined { 220 | font-size: 50px; 221 | } 222 | 223 | .social-media { 224 | height: 350px; 225 | padding: 10px; 226 | } 227 | 228 | .product { 229 | display: grid; 230 | grid-template-columns: 1fr 1fr; 231 | gap: 20px; 232 | } 233 | 234 | .product-icon { 235 | color: rgb(255, 255, 255); 236 | width: 48px; 237 | height: 48px; 238 | display: flex; 239 | align-items: center; 240 | justify-content: center; 241 | border-radius: 20px; 242 | } 243 | 244 | .product-icon > .bi { 245 | font-size: 25px; 246 | } 247 | 248 | /* ---------- MEDIA QUERIES ---------- */ 249 | 250 | /* Medium <= 992px */ 251 | @media screen and (max-width: 992px) { 252 | .grid-container { 253 | grid-template-columns: 1fr; 254 | grid-template-rows: 0.2fr 3fr; 255 | grid-template-areas: 256 | 'header' 257 | 'main'; 258 | } 259 | 260 | #sidebar { 261 | display: none; 262 | } 263 | 264 | .menu-icon { 265 | display: inline; 266 | } 267 | 268 | .sidebar-title > span { 269 | display: inline; 270 | } 271 | } 272 | 273 | /* Small <= 768px */ 274 | @media screen and (max-width: 768px) { 275 | .main-cards { 276 | grid-template-columns: 1fr; 277 | gap: 10px; 278 | margin-bottom: 0; 279 | } 280 | 281 | .products { 282 | grid-template-columns: 1fr; 283 | margin-top: 30px; 284 | } 285 | } 286 | 287 | /* Extra Small <= 576px */ 288 | @media screen and (max-width: 576px) { 289 | .header-left { 290 | display: none; 291 | } 292 | } 293 | -------------------------------------------------------------------------------- /images/large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BobsProgrammingAcademy/social-media-dashboard/1bb672aefa38eadfbd8c0d3767027d934836a7f2/images/large.png -------------------------------------------------------------------------------- /images/vscode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BobsProgrammingAcademy/social-media-dashboard/1bb672aefa38eadfbd8c0d3767027d934836a7f2/images/vscode.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Admin Dashboard 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 |
25 | 28 |
29 | search 30 |
31 |
32 | notifications 33 | email 34 | account_circle 35 |
36 |
37 | 38 | 39 | 40 | 86 | 87 | 88 | 89 |
90 |
91 |

DASHBOARD

92 |
93 | 94 |
95 | 96 |
97 |
98 |

LIKES

99 | thumb_up 100 |
101 |

4,021

102 |
103 | 104 |
105 |
106 |

SUBSCRIBERS

107 | subscriptions 108 |
109 |

8,731

110 |
111 | 112 |
113 |
114 |

FOLLOWERS

115 | groups 116 |
117 |

3,841

118 |
119 | 120 |
121 |
122 |

MESSAGES

123 | forum 124 |
125 |

1,962

126 |
127 | 128 |
129 | 130 |
131 | 132 |
133 |

Latest Updates

134 |

135 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce laoreet facilisis nulla, consectetur pulvinar diam. Aliquam tempus vel quam. 136 |

137 | 140 |
141 | 142 | 179 | 180 |
181 |
182 | 183 | 184 |
185 | 186 | 187 | 188 | 189 | 190 | -------------------------------------------------------------------------------- /js/scripts.js: -------------------------------------------------------------------------------- 1 | // SIDEBAR TOGGLE 2 | 3 | let sidebarOpen = false; 4 | const sidebar = document.getElementById('sidebar'); 5 | 6 | function openSidebar() { 7 | if (!sidebarOpen) { 8 | sidebar.classList.add('sidebar-responsive'); 9 | sidebarOpen = true; 10 | } 11 | } 12 | 13 | function closeSidebar() { 14 | if (sidebarOpen) { 15 | sidebar.classList.remove('sidebar-responsive'); 16 | sidebarOpen = false; 17 | } 18 | } 19 | --------------------------------------------------------------------------------