├── app ├── helpers │ ├── .gitkeep │ ├── validation.js │ ├── queryParams.js │ ├── url.js │ └── constants.js ├── entry │ ├── styles.css │ └── index.js ├── pages │ ├── Static │ │ ├── styles.css │ │ ├── ComingSoon.js │ │ ├── PageNotFound.js │ │ ├── AboutUs.jsx │ │ └── CodeOfConduct.js │ ├── Onboarding │ │ ├── index.js │ │ ├── styles.css │ │ ├── Social │ │ │ └── Social.js │ │ ├── EmailSettings │ │ │ └── EmailSettings.js │ │ └── Work │ │ │ └── Work.js │ ├── Account │ │ ├── index.js │ │ ├── styles.css │ │ ├── AccountFormContainer.jsx │ │ ├── ResetPassword.js │ │ ├── Login.js │ │ ├── ConfirmResetPassword.js │ │ └── Register.js │ ├── Page │ │ └── Page.js │ ├── EditProfile │ │ ├── About │ │ │ └── styles.css │ │ ├── EmailSettings │ │ │ ├── styles.css │ │ │ └── EmailSettings.js │ │ ├── Account │ │ │ └── styles.css │ │ ├── styles.css │ │ ├── FormComponents │ │ │ ├── ImageUpload │ │ │ │ ├── styles.css │ │ │ │ └── ImageUpload.js │ │ │ └── TopicSelector │ │ │ │ └── TopicSelector.js │ │ ├── SideBar.js │ │ ├── Talks │ │ │ ├── style.css │ │ │ └── Talks.js │ │ └── EditProfile.js │ ├── Authenticate │ │ └── Authenticate.js │ ├── Speaker │ │ ├── components │ │ │ ├── SpeakerInfo.js │ │ │ ├── Topics.js │ │ │ ├── FeaturedTalks.js │ │ │ ├── SpeakerCard.js │ │ │ └── MessageSpeakerForm.js │ │ ├── styles.css │ │ └── Speaker.js │ ├── index.js │ ├── Organization │ │ └── Organization.js │ └── Home │ │ ├── components │ │ ├── SpeakerList.js │ │ ├── SpeakerCard.js │ │ ├── MobileSearch.js │ │ ├── MobileFilters.js │ │ └── Filters.js │ │ ├── styles.css │ │ └── Home.js ├── assets │ ├── og-img.png │ └── Tribalscale.svg ├── config │ ├── Main │ │ ├── styles.css │ │ └── MainContainer.js │ └── routes.js ├── common │ ├── Footer │ │ ├── Footer.js │ │ ├── MiniFooter.js │ │ ├── styles.css │ │ └── FullFooter.js │ ├── FormField.js │ ├── Navigation │ │ ├── ButtonMenu.js │ │ ├── styles.css │ │ ├── MenuDropdown.js │ │ ├── SearchField.js │ │ └── Navigation.js │ ├── styles.css │ ├── Notification │ │ └── Notification.jsx │ ├── StyledButton.js │ └── Banner.js ├── redux │ ├── store.js │ ├── modules │ │ ├── notification.js │ │ ├── authentication.js │ │ ├── action_template.js │ │ ├── location.js │ │ ├── subscriptionGroup.js │ │ ├── contactForm.js │ │ ├── topic.js │ │ ├── speaker.js │ │ ├── profile.js │ │ ├── __template__.js │ │ └── featuredTalk.js │ └── reducers.js └── sharedStyles │ ├── cssVariables.js │ └── styles.css ├── Procfile ├── .gitignore ├── prettier.config.js ├── .babelrc ├── static.json ├── app.json ├── ISSUE_TEMPLATE.md ├── CONTRIBUTING.md ├── package.json ├── CONDUCT.md ├── webpack.config.babel.js └── README.md /app/helpers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/entry/styles.css: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 100%; 3 | padding: 30px; 4 | } 5 | -------------------------------------------------------------------------------- /app/pages/Static/styles.css: -------------------------------------------------------------------------------- 1 | .header { 2 | padding: 2rem; 3 | text-align: center; 4 | } -------------------------------------------------------------------------------- /app/assets/og-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/womenandcolor/women-and-color-frontend/HEAD/app/assets/og-img.png -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | # The default procfile from the heroku static buildpack 2 | # @see https://github.com/heroku/heroku-buildpack-static 3 | web: bin/boot 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | node_modules/ 3 | dist/ 4 | 5 | # IDE 6 | .idea 7 | 8 | # misc 9 | .DS_Store 10 | yarn-error.log 11 | npm-debug.log 12 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | bracketSpacing: true, 3 | singleQuote: true, 4 | jsxBracketSameLine: false, 5 | trailingComma: 'es5', 6 | printWidth: 80, 7 | arrowParens: 'avoid', 8 | }; 9 | -------------------------------------------------------------------------------- /app/pages/Onboarding/index.js: -------------------------------------------------------------------------------- 1 | export Profile from './Profile/Profile'; 2 | export Social from './Social/Social'; 3 | export Work from './Work/Work'; 4 | export EmailSettings from './EmailSettings/EmailSettings'; 5 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | presets: [ 3 | 'react', 4 | 'es2015', 5 | 'stage-0' 6 | ], 7 | env: { 8 | start: { 9 | presets: [ 10 | "react-hmre" 11 | ] 12 | } 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /app/entry/index.js: -------------------------------------------------------------------------------- 1 | import "babel-polyfill"; 2 | 3 | import ReactDOM from 'react-dom' 4 | import routes from 'appConfig/routes' 5 | 6 | 7 | ReactDOM.render( 8 | routes, 9 | document.getElementById('app') 10 | ) 11 | -------------------------------------------------------------------------------- /app/helpers/validation.js: -------------------------------------------------------------------------------- 1 | import { isNil, not, pipe, isEmpty, allPass } from 'ramda'; 2 | 3 | export const isNotNil = pipe(isNil, not); 4 | export const isNotEmpty = pipe(isEmpty, not); 5 | export const hasValue = allPass([isNotNil, isNotEmpty]); 6 | -------------------------------------------------------------------------------- /static.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": "dist/", 3 | "routes": { 4 | "/**": "index.html" 5 | }, 6 | "https_only": true, 7 | "headers": { 8 | "/**": { 9 | "Strict-Transport-Security": "max-age=7776000" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/pages/Account/index.js: -------------------------------------------------------------------------------- 1 | export Register from './Register' 2 | export Login from './Login' 3 | export ResetPassword from './ResetPassword' 4 | export ConfirmResetPassword from './ConfirmResetPassword' 5 | export AccountFormContainer from './AccountFormContainer' -------------------------------------------------------------------------------- /app/config/Main/styles.css: -------------------------------------------------------------------------------- 1 | .container { 2 | box-sizing: border-box; /* so that a child with width:100% will not overflow */ 3 | min-height: 100vh; 4 | display: flex; 5 | flex-direction: column; 6 | } 7 | 8 | .innerContainer { 9 | padding-top: var(--navbar-height); 10 | flex-grow: 1; 11 | } 12 | -------------------------------------------------------------------------------- /app/pages/Page/Page.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | 4 | class Page extends Component { 5 | render () { 6 | return ( 7 |
{speaker.description}
12 |The URL was not found. Let's go back to the home page.
20 |Women and Color is an online community of subject matter experts who identify as women and/or people of color.
54 |Located in cities across Canada and the United States, each of our subject matter experts is available for speaking opportunities at tech-related events.
55 |Interested in helping us build a more inclusive tech ecosystem? Send us an email at hello@womenandcolor.com.
56 |Women and Color is built with passion in Toronto, ON, and is a federally incorporated not-for-profit in Canada.
57 |27 | {position || 'Independent'} 28 | {separator} 29 | 30 | {organization || 'No affiliation'} 31 | 32 |
33 | ); 34 | } 35 | 36 | const SpeakerCard = ({ speaker, classes }) => { 37 | const name = !!speaker.display_name ? speaker.display_name : speaker.email; 38 | const title = buildTitle(speaker.position, speaker.organization); 39 | const speakerProfilePath = speakerToProfilePath({ 40 | ...speaker, 41 | }); 42 | return ( 43 |If you have not created an account yet, then please sign up first.
59 |Already have an account? Then please sign in.
60 |{speaker.position}
64 |65 | {speaker.organization} 66 |
67 | {speaker.topics.length > 0 && 68 |A primary goal of Women and Color is to be an inclusive community with the largest number of contributors, representing many various and diverse backgrounds as possible. As such, we are committed to providing a nonsectarian, friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, or socioeconomic status.
22 |This code of conduct outlines our expectations for all those who use Women and Color, as well as the consequences for unacceptable behavior.
23 |We invite all those who use Women and Color to help us create safe and positive experiences for everyone.
24 |The following behaviors are expected and requested of all community members:
26 |The following are examples of behaviors that are considered harassment and are unacceptable within our community:
37 |Unacceptable behavior from any community member, including sponsors and those with decision-making authority, will not be tolerated. Anyone asked to stop unacceptable behavior is expected to comply immediately and is expected to adhere to Community Guidelines in all future interactions with our community. Failure to do so may result in a temporary ban or permanent expulsion, without further notice.
47 |If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible at hello@womenandcolor. Read our full Reporting Guide below.
49 |We expect all community members (including, but not limited to, paid contributors, volunteer contributors, sponsors, or other guests) to abide by this Code of Conduct in all community interactions, both online and in-person.
51 |This Code of Conduct and its related policies and procedures also applies to unacceptable behavior occurring outside the scope of community activities when such behavior has the potential to adversely affect the safety and well-being of community members.
52 |Women and Color reserves the right to remove any profiles that violate our terms of use.
53 |hello@womenandcolor.com
55 |This Code of Conduct is distributed under a Creative Commons Attribution-ShareAlike license.
57 |Portions of this Code of Conduct derived from the Django Code of Conduct and the Geek Feminism Anti-Harassment Policy.
58 |If you believe someone is violating the code of conduct we ask that you report it to the Women and Color team by emailing hello@womenandcolor.com. We will make every reasonable effort to keep your report confidential.
60 |In the event it is determined we need to address the matter publicly, we will attempt to maintain the confidentiality of all parties involved unless those individuals instruct us otherwise.
61 |If you are unsure whether the incident is a violation, we encourage you to still report it! We strive to provide a safe environment and rather have a few extra reports where we decide to take no action, rather than miss a report of an actual violation. We do not look negatively on you if we find the incident is not a violation. Utilizing these reports, we can improve on our Code of Conduct and continue to provide the Women and Color Community with the best possible environment.
62 |You will receive an email from Women and Color with an acknowledgment receipt. Once we have a complete account of the events we will make a decision as to how to respond.
74 |Once we’ve determined our final action, we’ll contact the original reporter to let them know what action (if any) we’ll be taking.
75 |