├── .eslintrc ├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── new-study-group.md │ └── problem-report.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── assets ├── css │ ├── css │ │ └── fonts │ │ │ ├── Lato-Bold.ttf │ │ │ ├── Lato-Light.ttf │ │ │ └── Lato-Regular.ttf │ ├── grid.css │ └── style.css ├── javascript │ └── main.js └── json │ └── campsitesfinal.json ├── index.html └── package.json /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "json" 4 | ] 5 | } -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | Please read the freeCodeCamp Code of Conduct, which can be found at [Code of Conduct](https://code-of-conduct.freecodecamp.org/) 4 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | The Study Guide Directory is an important tool for helping to bring together campers with their local peers. 4 | 5 | ### Add new and missing groups. 6 | We need help to add new groups as they are created and also to add any that are missing. You can create an issue requesting a new group be added by using the [New Study Group template.](https://github.com/freeCodeCamp/study-group-directory/issues/new?template=new-study-group.md) Alternatively you can use the instructions below to create a pull request to add the entry if you are comfortable doing so. 7 | 8 | ### Fix errors in the directory. 9 | There may also be errors or changes required for the information provided for each group. In particular the location data was sourced from a maps service and sometimes the service identified the wrong location. You can raise an [issue](https://github.com/freeCodeCamp/study-group-directory/issues/new?template=problem-report.md) to let us know of any problems, or you can raise a pull request to fix any mistakes. 10 | 11 | We welcome pull requests from freeCodeCamp campers (our students) and seasoned JavaScript developers alike! Follow these steps to contribute: 12 | 13 | 1. Find an existing issue that needs assistance by searching for the [Help Wanted](https://github.com/freeCodeCamp/study-group-directory/labels/help%20wanted) tag, or [create one](https://github.com/freeCodeCamp/study-group-directory/issues/new?template=problem-report.md) if you've seen an issue not already logged. 14 | 15 | 2. Let us know you are working on it by posting a comment on the issue. 16 | 17 | 3. Create a fork of the repository. 18 | 19 | 4. Create a branch in your fork for your changes. 20 | 21 | 5. When ready submit a pull request to fix, complete the information requested in the template and be sure to include a line in the PR comment that states which issue the PR closes. 22 | 23 | Remember to feel free to ask for help in our [Contributors](https://gitter.im/FreeCodeCamp/Contributors) Gitter room. 24 | 25 | Working on your first Pull Request? You can learn how from this *free* series [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github) 26 | 27 | ### The directory data. 28 | The data for the directory is held in the [campsitesfinal.json](https://github.com/freeCodeCamp/study-group-directory/blob/master/assets/json/campsitesfinal.json). The file is large so will be slow to load on GitHub. 29 | 30 | The structure of the file is an array of objects. Each object is an entry in the directory. 31 | 32 | The objects are simply collections of name / value pairs, some are mandatory others optional. 33 | 34 | Sample entry: 35 | ``` javascript 36 | { 37 | "url": "https://www.facebook.com/groups/free.code.camp.to", 38 | "city": "Toronto", 39 | "state": "Ontario", 40 | "country": "Canada", 41 | "coordinates": "43.652921, -79.384901", 42 | "photoUrl": "https://scontent-dft4-2.xx.fbcdn.net/v/t31.0-8/15068500_10210962248150704_3614548903645249833_o.jpg?oh=49670f8c4ac9b83dbbbb1207c3d2b780&oe=599725C0" 43 | } 44 | ``` 45 | 46 | The `url`, `country` and `coordinates` fields are mandatory. `city` and `state` fields should be used to provide name and area of the location of the group. Either may be left blank if the entry still makes sense without it. `photoUrl` can be used to provide the groups chosen photo if it has one - presently this is not used but will be in the Events platform. 47 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/new-study-group.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: New study group 3 | about: Raise a request to add a new study group 4 | 5 | --- 6 | 7 | Please provide the following information to aid in adding your group to the directory: 8 | 9 | ### Esssential 10 | - [ ] Group URL (Web address) 11 | - [ ] Town or City group is located in 12 | - [ ] State / County / Region 13 | - [ ] Country 14 | 15 | ### Nice to have 16 | - [ ] Co-ordinates 17 | 18 | ### If you have one 19 | - [ ] URL of Group Photo 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/problem-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Problem report 3 | about: Create a report to help us improve 4 | 5 | --- 6 | 7 | #### Describe your problem and - if possible - how to reproduce it 8 | A clear and concise description of what the problem is. 9 | 10 | #### To Reproduce 11 | Steps to reproduce the behaviour: 12 | 1. Go to '...' 13 | 2. Click on '....' 14 | 3. Scroll down to '....' 15 | 4. See error 16 | 17 | #### What was the expected behaviour 18 | A clear and concise description of what you expected to happen. 19 | 20 | #### If possible, add a screenshot here 21 | If applicable, add screenshots to help explain your problem. 22 | 23 | #### Tell us about your browser and operating system 24 | **Desktop (please complete the following information):** 25 | - OS: [e.g. iOS] 26 | - Browser [e.g. chrome, safari] 27 | - Version [e.g. 22] 28 | 29 | **Smartphone (please complete the following information):** 30 | - Device: [e.g. iPhone6] 31 | - OS: [e.g. iOS8.1] 32 | - Browser [e.g. stock browser, safari] 33 | - Version [e.g. 22] 34 | 35 | #### Additional Information 36 | Add any other information you think will be helpful for us to fix the problem 37 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | #### Pre-Submission Checklist 8 | 9 | 10 | 11 | - [ ] Your pull request targets the `master` branch of freeCodeCamp/study-group-directory. 12 | - [ ] You have only one commit (if not, [squash](http://forum.freecodecamp.org/t/how-to-squash-multiple-commits-into-one-with-git/13231) them into one commit). 13 | 14 | #### Type of Change 15 | 16 | - [ ] Small bug fix (non-breaking change which fixes an issue) 17 | - [ ] New feature (non-breaking change which adds new functionality) 18 | - [ ] Breaking change (fix or feature that would change existing functionality) 19 | - [ ] Update or Correct an existing group entry 20 | - [ ] Add a new group entry 21 | 22 | #### Checklist: 23 | 24 | 25 | - [ ] Tested changes locally. 26 | - [ ] Automated build tests (Travis and Netlify) pass 27 | - [ ] Addressed currently open issue (replace XXXXX with an issue number in next line) 28 | 29 | Closes #XXXXX 30 | 31 | #### Description 32 | 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - '8' 5 | 6 | cache: 7 | directories: 8 | - node_modules 9 | 10 | sudo: false 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2016, Free Code Camp 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # freeCodeCamp Study Group Directory 2 | 3 | This simple website is a catalog of all the freeCodeCamp study groups around the world (that we know about). 4 | 5 | If the user allows location access the groups closest to your browser location are displayed at the top of the page. Alternatively, you can search for groups by place name. 6 | 7 | Find the directory here [freeCodeCamp Study Groups](https://study-group-directory.freecodecamp.org/) 8 | 9 | If you wish to contribute by adding entries, fixing problems or otherwise improving the directory please refer to [CONTRIBUTING.md](https://github.com/freeCodeCamp/study-group-directory/blob/master/.github/CONTRIBUTING.md) 10 | 11 | 12 | -------------------------------------------------------------------------------- /assets/css/css/fonts/Lato-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeCodeCamp/study-group-directory/9c94bfb260141ad974bf2f146dadd2a560380860/assets/css/css/fonts/Lato-Bold.ttf -------------------------------------------------------------------------------- /assets/css/css/fonts/Lato-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeCodeCamp/study-group-directory/9c94bfb260141ad974bf2f146dadd2a560380860/assets/css/css/fonts/Lato-Light.ttf -------------------------------------------------------------------------------- /assets/css/css/fonts/Lato-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeCodeCamp/study-group-directory/9c94bfb260141ad974bf2f146dadd2a560380860/assets/css/css/fonts/Lato-Regular.ttf -------------------------------------------------------------------------------- /assets/css/grid.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V1.0.3 3 | * Copyright 2011, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 7/17/2011 8 | */ 9 | 10 | 11 | div.container { 12 | padding-top: 60px; } 13 | 14 | /* Grid */ 15 | #grid .column, 16 | #grid .columns { 17 | background: #ddd; 18 | height: 25px; 19 | line-height: 25px; 20 | margin-bottom: 10px; 21 | text-align: center; 22 | text-transform: uppercase; 23 | color: #555; 24 | font-size: 12px; 25 | font-weight: bold; 26 | -moz-border-radius: 2px; 27 | -webkit-border-radius: 2px; 28 | border-radius: 2px; } 29 | #grid .column:hover, 30 | #grid .columns:hover { 31 | background: #bbb; 32 | color: #333; } 33 | #grid .example-grid { overflow: hidden; } 34 | 35 | .post-button-note, 36 | .post-button-note a { 37 | font-size: 11px; 38 | color: #999; } 39 | 40 | #examples .four.columns a { 41 | text-decoration: none; 42 | } 43 | #examples .four.columns a:hover { 44 | text-decoration: underline; 45 | } 46 | 47 | 48 | img { 49 | max-width: 100%; 50 | height: auto; } 51 | 52 | .gist-meta { display: none !important;} 53 | 54 | ul ul ul li { margin-bottom: 3px; } 55 | 56 | 57 | /* Mobile */ 58 | @media only screen and (max-width: 767px) { 59 | header h1 { font-size: 34px; line-height: 37px; } 60 | nav { position: relative; } 61 | nav ul, 62 | #examples .four.columns { 63 | padding-top: 30px; 64 | } 65 | } 66 | 67 | /* Non 960 */ 68 | @media only screen and (max-width: 959px) { 69 | nav .button { 70 | padding: 9px 20px 11px; } 71 | } 72 | 73 | /* iPad Portrait/Browser */ 74 | @media only screen and (min-width: 768px) and (max-width: 959px) { 75 | nav { 76 | width: 124px; } 77 | } 78 | 79 | /* Mobile/Browser */ 80 | @media only screen and (max-width: 767px) {} 81 | 82 | /* Mobile Landscape/Browser */ 83 | @media only screen and (min-width: 480px) and (max-width: 767px) {} 84 | 85 | /* Anything smaller than standard 960 */ 86 | @media only screen and (max-width: 959px) {} 87 | 88 | 89 | /* iPad Portrait Only */ 90 | @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {} 91 | 92 | /* Mobile Only */ 93 | @media only screen and (max-width: 767px) and (max-device-width: 1000px) {} 94 | 95 | /* Mobile Landscape Only */ 96 | @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {} 97 | 98 | /* Anything smaller than standard 960 on a device */ 99 | @media only screen and (max-width: 959px) and (max-device-width: 1000px) { 100 | .resize { display: none; } 101 | } 102 | 103 | /* Smaller than standard 960 (devices and browsers) */ 104 | @media only screen and (max-width: 959px) {} 105 | 106 | /* Tablet Portrait size to standard 960 (devices and browsers) */ 107 | @media only screen and (min-width: 768px) and (max-width: 959px) {} 108 | 109 | /* All Mobile Sizes (devices and browser) */ 110 | @media only screen and (max-width: 767px) {} 111 | 112 | /* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ 113 | @media only screen and (min-width: 480px) and (max-width: 767px) {} 114 | 115 | /* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ 116 | @media only screen and (max-width: 479px) {} 117 | 118 | /* #Base 960 Grid 119 | ================================================== */ 120 | 121 | .container { position: relative; width: 960px; margin: 0 auto; padding: 0; } 122 | .container .column, 123 | .container .columns { float: left; display: inline; margin-left: 10px; margin-right: 10px; } 124 | .row { margin-bottom: 20px; } 125 | 126 | /* Nested Column Classes */ 127 | .column.alpha, .columns.alpha { margin-left: 0; } 128 | .column.omega, .columns.omega { margin-right: 0; } 129 | 130 | /* Base Grid */ 131 | .container .one.column, 132 | .container .one.columns { width: 40px; } 133 | .container .two.columns { width: 100px; } 134 | .container .three.columns { width: 160px; } 135 | .container .four.columns { width: 220px; } 136 | .container .five.columns { width: 280px; } 137 | .container .six.columns { width: 340px; } 138 | .container .seven.columns { width: 400px; } 139 | .container .eight.columns { width: 460px; } 140 | .container .nine.columns { width: 520px; } 141 | .container .ten.columns { width: 580px; } 142 | .container .eleven.columns { width: 640px; } 143 | .container .twelve.columns { width: 700px; } 144 | .container .thirteen.columns { width: 760px; } 145 | .container .fourteen.columns { width: 820px; } 146 | .container .fifteen.columns { width: 880px; } 147 | .container .sixteen.columns { width: 940px; } 148 | 149 | .container .one-third.column { width: 300px; } 150 | .container .two-thirds.column { width: 620px; } 151 | 152 | /* Offsets */ 153 | .container .offset-by-one { padding-left: 60px; } 154 | .container .offset-by-two { padding-left: 120px; } 155 | .container .offset-by-three { padding-left: 180px; } 156 | .container .offset-by-four { padding-left: 240px; } 157 | .container .offset-by-five { padding-left: 300px; } 158 | .container .offset-by-six { padding-left: 360px; } 159 | .container .offset-by-seven { padding-left: 420px; } 160 | .container .offset-by-eight { padding-left: 480px; } 161 | .container .offset-by-nine { padding-left: 540px; } 162 | .container .offset-by-ten { padding-left: 600px; } 163 | .container .offset-by-eleven { padding-left: 660px; } 164 | .container .offset-by-twelve { padding-left: 720px; } 165 | .container .offset-by-thirteen { padding-left: 780px; } 166 | .container .offset-by-fourteen { padding-left: 840px; } 167 | .container .offset-by-fifteen { padding-left: 900px; } 168 | 169 | 170 | 171 | /* #Tablet (Portrait) 172 | ================================================== */ 173 | 174 | /* Note: Design for a width of 768px */ 175 | 176 | @media only screen and (min-width: 768px) and (max-width: 959px) { 177 | .container { width: 768px; } 178 | .container .column, 179 | .container .columns { margin-left: 10px; margin-right: 10px; } 180 | .column.alpha, .columns.alpha { margin-left: 0; margin-right: 10px; } 181 | .column.omega, .columns.omega { margin-right: 0; margin-left: 10px; } 182 | .alpha.omega { margin-left: 0; margin-right: 0; } 183 | 184 | .container .one.column, 185 | .container .one.columns { width: 28px; } 186 | .container .two.columns { width: 76px; } 187 | .container .three.columns { width: 124px; } 188 | .container .four.columns { width: 172px; } 189 | .container .five.columns { width: 220px; } 190 | .container .six.columns { width: 268px; } 191 | .container .seven.columns { width: 316px; } 192 | .container .eight.columns { width: 364px; } 193 | .container .nine.columns { width: 412px; } 194 | .container .ten.columns { width: 460px; } 195 | .container .eleven.columns { width: 508px; } 196 | .container .twelve.columns { width: 556px; } 197 | .container .thirteen.columns { width: 604px; } 198 | .container .fourteen.columns { width: 652px; } 199 | .container .fifteen.columns { width: 700px; } 200 | .container .sixteen.columns { width: 748px; } 201 | 202 | .container .one-third.column { width: 236px; } 203 | .container .two-thirds.column { width: 492px; } 204 | 205 | /* Offsets */ 206 | .container .offset-by-one { padding-left: 48px; } 207 | .container .offset-by-two { padding-left: 96px; } 208 | .container .offset-by-three { padding-left: 144px; } 209 | .container .offset-by-four { padding-left: 192px; } 210 | .container .offset-by-five { padding-left: 240px; } 211 | .container .offset-by-six { padding-left: 288px; } 212 | .container .offset-by-seven { padding-left: 336px; } 213 | .container .offset-by-eight { padding-left: 384px; } 214 | .container .offset-by-nine { padding-left: 432px; } 215 | .container .offset-by-ten { padding-left: 480px; } 216 | .container .offset-by-eleven { padding-left: 528px; } 217 | .container .offset-by-twelve { padding-left: 576px; } 218 | .container .offset-by-thirteen { padding-left: 624px; } 219 | .container .offset-by-fourteen { padding-left: 672px; } 220 | .container .offset-by-fifteen { padding-left: 720px; } 221 | } 222 | 223 | 224 | /* #Mobile (Portrait) 225 | ================================================== */ 226 | 227 | /* Note: Design for a width of 320px */ 228 | 229 | @media only screen and (max-width: 767px) { 230 | .container { width: 300px; } 231 | .container .columns, 232 | .container .column { margin: 0; } 233 | 234 | .container .one.column, 235 | .container .one.columns, 236 | .container .two.columns, 237 | .container .three.columns, 238 | .container .four.columns, 239 | .container .five.columns, 240 | .container .six.columns, 241 | .container .seven.columns, 242 | .container .eight.columns, 243 | .container .nine.columns, 244 | .container .ten.columns, 245 | .container .eleven.columns, 246 | .container .twelve.columns, 247 | .container .thirteen.columns, 248 | .container .fourteen.columns, 249 | .container .fifteen.columns, 250 | .container .sixteen.columns, 251 | .container .one-third.column, 252 | .container .two-thirds.column { width: 300px; } 253 | 254 | /* Offsets */ 255 | .container .offset-by-one, 256 | .container .offset-by-two, 257 | .container .offset-by-three, 258 | .container .offset-by-four, 259 | .container .offset-by-five, 260 | .container .offset-by-six, 261 | .container .offset-by-seven, 262 | .container .offset-by-eight, 263 | .container .offset-by-nine, 264 | .container .offset-by-ten, 265 | .container .offset-by-eleven, 266 | .container .offset-by-twelve, 267 | .container .offset-by-thirteen, 268 | .container .offset-by-fourteen, 269 | .container .offset-by-fifteen { padding-left: 0; } 270 | 271 | } 272 | 273 | 274 | /* #Mobile (Landscape) 275 | ================================================== */ 276 | 277 | /* Note: Design for a width of 480px */ 278 | 279 | @media only screen and (min-width: 480px) and (max-width: 767px) { 280 | .container { width: 420px; } 281 | .container .columns, 282 | .container .column { margin: 0; } 283 | 284 | .container .one.column, 285 | .container .one.columns, 286 | .container .two.columns, 287 | .container .three.columns, 288 | .container .four.columns, 289 | .container .five.columns, 290 | .container .six.columns, 291 | .container .seven.columns, 292 | .container .eight.columns, 293 | .container .nine.columns, 294 | .container .ten.columns, 295 | .container .eleven.columns, 296 | .container .twelve.columns, 297 | .container .thirteen.columns, 298 | .container .fourteen.columns, 299 | .container .fifteen.columns, 300 | .container .sixteen.columns, 301 | .container .one-third.column, 302 | .container .two-thirds.column { width: 420px; } 303 | } 304 | 305 | 306 | /* #Clearing 307 | ================================================== */ 308 | 309 | /* Self Clearing Goodness */ 310 | .container:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; } 311 | 312 | /* Use clearfix class on parent to clear nested columns, 313 | or wrap each row of columns in a
162 | 163 | ${location} 164 | 165 |
166 |Join the study group closest to you or search for a place name below.
106 |Note: Currently most freeCodeCamp Study Groups are using Facebook Groups to organize themselves. We are building our own events platform to use in the future. If you can't find a study group near you, you can create one.
108 |139 | If you cannot find the exact place name you are looking for try searching for nearby places, or the the region or even country the place is in. 140 |
141 |142 | Results: 143 |
144 |