├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── content ├── conferences │ ├── 2019-functional-bangalore.md │ ├── 2019-ghci-bangalore.md │ ├── 2019-jsfoo-bangalore.md │ ├── 2019-jsfoo-coimbatore.md │ ├── 2019-pycon-chennai.md │ ├── 2019-pyconf-hyderabad.md │ ├── 2019-reactIndia-goa.md │ ├── 2019-reactfoo-delhi.md │ ├── 2019-scipy-mumbai.md │ ├── 2020-graphqlAsia-bangalore.md │ ├── 2020-ngIndia-gurugram.md │ └── 2020-reactDay-bangalore.md └── talk-template.md ├── gatsby-browser.js ├── gatsby-config.js ├── gatsby-node.js ├── gatsby-ssr.js ├── package-lock.json ├── package.json └── src ├── components ├── SpeakerImage.js ├── TalkCard.js ├── header.js ├── layout.css ├── layout.js └── seo.js ├── images └── speaker.png └── pages ├── 404.js └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # dotenv environment variables file 55 | .env 56 | 57 | # gatsby files 58 | .cache/ 59 | public 60 | 61 | # Mac files 62 | .DS_Store 63 | 64 | # Yarn 65 | yarn-error.log 66 | .pnp/ 67 | .pnp.js 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "lf", 3 | "semi": false, 4 | "singleQuote": false, 5 | "tabWidth": 2, 6 | "trailingComma": "es5" 7 | } 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 gatsbyjs 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 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dev Conferences India 2 | 3 | A list of awesome dev conferences in India. 4 | 5 | https://dev-confs-india.netlify.com 6 | 7 | --------- 8 | 9 | ## Contribute 10 | If you wish to add any conference to the list feel free to submit a PR. 11 | **Please note that only the conferences having a code of conduct will be added to list.** 12 | 13 | Steps - 14 | - Go to `content/conferences`, add your `.md` file to that folder. 15 | - Name of the file should in format - `yyyy-nameOfConference-cityName`. 16 | - For the content of the file copy it from any of the existing file or [see the template here](content/talk-template.md) 17 | 18 | If you can't submit a PR, you can simply open an Issue with all the details and I will add to the list. 19 | 20 | ------------- 21 | 22 | ## Setup 23 | 24 | ``` 25 | git clone https://github.com/ananyaneogi/dev-conferences-india.git 26 | npm install 27 | npm start 28 | ``` 29 | *This is built with [Gatsby](https://www.gatsbyjs.org) and styled with [Emotion](https://emotion.sh/docs/introduction).* 30 | -------------------------------------------------------------------------------- /content/conferences/2019-functional-bangalore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Functional Conf 3 | start_date: 2019-11-13 4 | end_date: 2019-11-17 5 | location: ITC WelcomHotel, Bangalore 6 | url: https://functionalconf.com/ 7 | coc_url: https://functionalconf.com/code-of-conduct.html 8 | scholarship_url: 9 | summary: Asia's premier functional programming conference. It is designed to bring together the growing community of functional programmers under one roof. 10 | --- -------------------------------------------------------------------------------- /content/conferences/2019-ghci-bangalore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: The Grace Hopper Celebration India 3 | start_date: 2019-11-06 4 | end_date: 2019-11-08 5 | location: Bangalore International Exhibition Center (BIEC), Bangalore 6 | url: https://ghcindia.anitab.org/ 7 | coc_url: https://ghc.anitab.org/code-of-conduct/ 8 | scholarship_url: https://ghcindia.anitab.org/ghci-19-student-scholarships-2/ 9 | summary: The Grace Hopper Celebration India is Asia's largest gathering of women technologists. It is produced by AnitaB.org and presented in partnership with ACM India. 10 | --- 11 | -------------------------------------------------------------------------------- /content/conferences/2019-jsfoo-bangalore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: JSFoo 3 | start_date: 2019-09-27 4 | end_date: 2019-09-28 5 | location: NIMHANS Convention Centre, Bangalore 6 | url: https://jsfoo.in/2019/ 7 | coc_url: https://jsfoo.in/code-of-conduct/ 8 | scholarship_url: '' 9 | summary: Annual conference of 800+ front-end, backend and fullstack engineers 10 | --- -------------------------------------------------------------------------------- /content/conferences/2019-jsfoo-coimbatore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: JSFoo Coimbatore 3 | start_date: 2019-09-27 4 | end_date: 2019-09-28 5 | location: The Residency Tower, Coimbatore 6 | url: https://metarefresh.in/jsfoo/2019-coimbatore/ 7 | coc_url: https://metarefresh.in/code-of-conduct/ 8 | scholarship_url: 9 | summary: On building faster, performant and secure web applications 10 | --- -------------------------------------------------------------------------------- /content/conferences/2019-pycon-chennai.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: PyCon India 3 | start_date: 2019-10-12 4 | end_date: 2019-10-13 5 | location: Chennai Trade Center, Chennai 6 | url: https://in.pycon.org/2019/ 7 | coc_url: https://in.pycon.org/2019/code-of-conduct.html 8 | scholarship_url: 9 | summary: The premier conference in India on using and developing the python programming language. 10 | --- -------------------------------------------------------------------------------- /content/conferences/2019-pyconf-hyderabad.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: PyConf Hyderabad 3 | start_date: 2019-12-07 4 | end_date: 2019-12-08 5 | location: IIIT Hyderabad 6 | url: https://pyconf.hydpy.org/2019/ 7 | coc_url: https://pyconf.hydpy.org/2019/coc.html 8 | scholarship_url: 9 | summary: PyConf Hyderabad is the regional gathering for the community that uses and develops the open-source Python Programming Language. 10 | --- 11 | -------------------------------------------------------------------------------- /content/conferences/2019-reactIndia-goa.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: React India 3 | start_date: 2019-09-26 4 | end_date: 2019-09-28 5 | location: Goa, India 6 | url: https://www.reactindia.io 7 | coc_url: https://www.notion.so/apherio/CODE-OF-CONDUCT-46e5dc50604a44e1be53a34d4937682f 8 | scholarship_url: https://www.notion.so/Scholarship-Program-React-India-2019-490794dd0a464db0a43b4c8c5440839f 9 | summary: React India is an international community-led non-profit initiative that provides a platform for developers to share and discuss their insights and experiences with React. The three-day conference is the first of its kind in India. 10 | --- -------------------------------------------------------------------------------- /content/conferences/2019-reactfoo-delhi.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ReactFoo Delhi 3 | start_date: 2019-11-16 4 | end_date: 5 | location: India International Center, New Delhi 6 | url: https://reactfoo.in/2019-delhi/ 7 | coc_url: https://reactfoo.in/code-of-conduct/ 8 | scholarship_url: 9 | summary: On React, front-end engineering and performance. 10 | --- -------------------------------------------------------------------------------- /content/conferences/2019-scipy-mumbai.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: SciPy India 2019 3 | start_date: 2019-11-29 4 | end_date: 2019-11-30 5 | location: IIT Bombay 6 | url: https://scipy.in/2019 7 | coc_url: https://scipy.in/2019#cod 8 | scholarship_url: 9 | summary: SciPy India is the annual gathering of Pythonistas providing opportunities to spread the use of the Python programming language in the Scientific Computing community in India. 10 | --- -------------------------------------------------------------------------------- /content/conferences/2020-graphqlAsia-bangalore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: GraphQL Asia 3 | start_date: 2020-02-21 4 | end_date: 2020-02-22 5 | location: Bangalore 6 | url: https://www.graphql-asia.org/ 7 | coc_url: https://www.graphql-asia.org/code-of-conduct 8 | scholarship_url: 9 | summary: The second edition of Asia's biggest GraphQL conference. 10 | --- -------------------------------------------------------------------------------- /content/conferences/2020-ngIndia-gurugram.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ng India 2020 3 | start_date: 2020-02-29 4 | end_date: 5 | location: Gurgaon, Haryana 6 | url: https://www.ng-ind.com/ 7 | coc_url: https://www.ng-ind.com/#coc 8 | scholarship_url: 9 | summary: Annual Angular Conference of India. 10 | --- -------------------------------------------------------------------------------- /content/conferences/2020-reactDay-bangalore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: React Day 3 | start_date: 2020-04-25 4 | end_date: 5 | location: Bangalore 6 | url: https://reactday.in/ 7 | coc_url: https://reactday.in/code-of-conduct/ 8 | scholarship_url: 9 | summary: A one day conference fully packed with amazing talks and panel discussions on topics related to React and React Native. 10 | --- 11 | -------------------------------------------------------------------------------- /content/talk-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Title of the conference 3 | start_date: Start date 4 | end_date: End date, if its one day conference then leave it empty 5 | location: Venue, City 6 | url: conference website url 7 | coc_url: code of conduct url 8 | scholarship_url: If scholarship available add the link to it otherwise leave empty 9 | summary: A brief summary about the conference 10 | --- -------------------------------------------------------------------------------- /gatsby-browser.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Implement Gatsby's Browser APIs in this file. 3 | * 4 | * See: https://www.gatsbyjs.org/docs/browser-apis/ 5 | */ 6 | 7 | // You can delete this file if you're not using it 8 | 9 | import "typeface-lato" -------------------------------------------------------------------------------- /gatsby-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | siteMetadata: { 3 | title: `Dev Conferences India`, 4 | description: `List of awesome developer conferences in India`, 5 | author: `https://ananyaneogi.com`, 6 | }, 7 | plugins: [ 8 | `gatsby-plugin-react-helmet`, 9 | { 10 | resolve: `gatsby-source-filesystem`, 11 | options: { 12 | name: `images`, 13 | path: `${__dirname}/src/images`, 14 | }, 15 | }, 16 | `gatsby-transformer-sharp`, 17 | `gatsby-plugin-sharp`, 18 | { 19 | resolve: `gatsby-plugin-manifest`, 20 | options: { 21 | name: `Dev Conferences India`, 22 | short_name: `Dev Conferences India`, 23 | start_url: `/`, 24 | background_color: `#fff`, 25 | theme_color: `#001fff`, 26 | display: `minimal-ui`, 27 | icon: `src/images/speaker.png`, // This path is relative to the root of the site. 28 | }, 29 | }, 30 | { 31 | resolve: `gatsby-source-filesystem`, 32 | options: { 33 | path: `${__dirname}/content/conferences`, 34 | name: `conferences`, 35 | }, 36 | }, 37 | { 38 | resolve: 'gatsby-plugin-react-axe', 39 | options: { 40 | showInProduction: false 41 | }, 42 | }, 43 | 'gatsby-transformer-remark', 44 | `gatsby-plugin-emotion`, 45 | // this (optional) plugin enables Progressive Web App + Offline functionality 46 | // To learn more, visit: https://gatsby.dev/offline 47 | `gatsby-plugin-offline`, 48 | ], 49 | } 50 | -------------------------------------------------------------------------------- /gatsby-node.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Implement Gatsby's Node APIs in this file. 3 | * 4 | * See: https://www.gatsbyjs.org/docs/node-apis/ 5 | */ 6 | 7 | // You can delete this file if you're not using it 8 | -------------------------------------------------------------------------------- /gatsby-ssr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Implement Gatsby's SSR (Server Side Rendering) APIs in this file. 3 | * 4 | * See: https://www.gatsbyjs.org/docs/ssr-apis/ 5 | */ 6 | 7 | // You can delete this file if you're not using it 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gatsby-starter-default", 3 | "private": true, 4 | "description": "A simple starter to get up and developing quickly with Gatsby", 5 | "version": "0.1.0", 6 | "author": "Kyle Mathews ", 7 | "dependencies": { 8 | "@emotion/core": "^10.0.10", 9 | "@emotion/styled": "^10.0.11", 10 | "gatsby": "^2.7.1", 11 | "gatsby-image": "^2.1.0", 12 | "gatsby-plugin-emotion": "^4.0.7", 13 | "gatsby-plugin-manifest": "^2.1.1", 14 | "gatsby-plugin-offline": "^2.1.1", 15 | "gatsby-plugin-react-axe": "^0.2.2", 16 | "gatsby-plugin-react-helmet": "^3.0.12", 17 | "gatsby-plugin-sharp": "^2.1.0", 18 | "gatsby-plugin-typography": "^2.2.13", 19 | "gatsby-source-filesystem": "^2.0.37", 20 | "gatsby-transformer-remark": "^2.3.12", 21 | "gatsby-transformer-sharp": "^2.1.19", 22 | "prop-types": "^15.7.2", 23 | "react": "^16.8.6", 24 | "react-dom": "^16.8.6", 25 | "react-helmet": "^5.2.1", 26 | "react-typography": "^0.16.19", 27 | "typeface-lato": "0.0.54", 28 | "typography": "^0.16.19", 29 | "typography-theme-fairy-gates": "^0.16.19" 30 | }, 31 | "devDependencies": { 32 | "prettier": "^1.17.1" 33 | }, 34 | "keywords": [ 35 | "gatsby" 36 | ], 37 | "license": "MIT", 38 | "scripts": { 39 | "build": "gatsby build", 40 | "develop": "gatsby develop", 41 | "format": "prettier --write src/**/*.{js,jsx}", 42 | "start": "npm run develop", 43 | "serve": "gatsby serve", 44 | "test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\"" 45 | }, 46 | "repository": { 47 | "type": "git", 48 | "url": "https://github.com/gatsbyjs/gatsby-starter-default" 49 | }, 50 | "bugs": { 51 | "url": "https://github.com/gatsbyjs/gatsby/issues" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/components/SpeakerImage.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { StaticQuery, graphql } from "gatsby" 3 | import Img from "gatsby-image" 4 | 5 | const SpeakerImage = () => ( 6 | a woman public speaking} 18 | /> 19 | ) 20 | export default SpeakerImage 21 | -------------------------------------------------------------------------------- /src/components/TalkCard.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from "prop-types" 3 | 4 | import styled from "@emotion/styled" 5 | // import { css } from "@emotion/core" 6 | 7 | const CardWrapper = styled.div` 8 | outline: 20px dotted #ffffff; 9 | outline-offset: -10px; 10 | padding: 20px; 11 | background: linear-gradient(45deg,rgba(220, 220, 220, 0.34) 50%,rgba(241, 241, 241, 0.9) 92%); 12 | min-height: 400px; 13 | height: 100%; 14 | ` 15 | 16 | const Card = styled.div` 17 | padding: 20px; 18 | background-color: #fff; 19 | height: 100%; 20 | display: flex; 21 | flex-direction: column; 22 | justify-content: space-between; 23 | ` 24 | 25 | const EventDate = styled.h2` 26 | font-size: 1rem; 27 | ` 28 | const TalkTitle = styled.h1` 29 | color: var(--link-color); 30 | font-size: 1.5rem; 31 | margin: 20px 0 10px; 32 | line-height: 1.5; 33 | 34 | a { 35 | color: var(--link-color); 36 | 37 | &:hover, &:focus { 38 | color: #0013a3; 39 | svg { 40 | transform: translateX(5px); 41 | transition: 0.2s transform ease-in; 42 | } 43 | } 44 | } 45 | 46 | svg { 47 | fill: currentColor; 48 | width: 1.1rem; 49 | margin-left: 5px; 50 | vertical-align: middle; 51 | position: relative; 52 | transform: translateX(0px); 53 | transition: 0.2s transform ease-in; 54 | } 55 | ` 56 | const Location = styled.p` 57 | font-size: 0.9rem; 58 | ` 59 | 60 | const Summary = styled.p` 61 | font-size: 0.9rem; 62 | margin-bottom: 30px; 63 | ` 64 | 65 | const ExtLink = styled.a` 66 | color: var(--link-color); 67 | font-size: 0.8rem; 68 | border-bottom: 2px solid currentColor; 69 | font-weight: bold; 70 | width: fit-content; 71 | 72 | &.scholarship-link { 73 | display: block; 74 | color: palevioletred; 75 | } 76 | 77 | &:hover, &:focus { 78 | color: #0013a3 79 | } 80 | `; 81 | 82 | const CardFooter = styled.div` 83 | display: flex; 84 | justify-content: space-between; 85 | align-items: center; 86 | ` 87 | 88 | const TalkCard = (talk) => { 89 | return ( 90 | 91 | 92 |
93 | {talk.start_date} {talk.end_date ? '- ' + talk.end_date : ''} 94 | 95 | 96 | {talk.title} 97 | 98 | 99 | 100 | {talk.location} 101 | {talk.summary} 102 |
103 | 104 | 105 | Code of Conduct 106 | { talk.scholarship_url && 107 | Scholarship Available 108 | } 109 | 110 | 111 |
112 |
113 | ) 114 | } 115 | 116 | TalkCard.propTypes = { 117 | talk: PropTypes.object 118 | } 119 | 120 | export default TalkCard 121 | -------------------------------------------------------------------------------- /src/components/header.js: -------------------------------------------------------------------------------- 1 | import { Link } from "gatsby" 2 | import PropTypes from "prop-types" 3 | import React from "react" 4 | import styled from "@emotion/styled" 5 | 6 | const HeaderStyle = styled.header` 7 | position: relative; 8 | background: background: rgb(142,156,255); 9 | background: linear-gradient(45deg, rgba(142,136,255,1) 0%, rgba(0,31,255,1) 100%); 10 | 11 | svg.decoration { 12 | fill: #fff; 13 | position: relative; 14 | top: 10px; 15 | z-index: 0; 16 | } 17 | ` 18 | 19 | const Content = styled.div` 20 | padding: 3rem 3rem 0; 21 | display: flex; 22 | justify-content: space-between; 23 | align-items: flex-start; 24 | position: relative; 25 | z-index: 1; 26 | 27 | .icon-notification { 28 | width: 65px; 29 | } 30 | 31 | @media(max-width: 768px) { 32 | flex-direction: column; 33 | } 34 | 35 | @media(max-width: 500px) { 36 | padding: 1rem 1rem 0; 37 | } 38 | ` 39 | 40 | const ButtonLink = styled.a` 41 | color: #fff; 42 | background: #6d7fff; 43 | ${'' /* background: #8e9cff; */} 44 | padding: 4px 16px; 45 | border-radius: 3px; 46 | font-size: 1.2rem; 47 | font-weight: bold; 48 | margin-top: 30px; 49 | display: block; 50 | width: fit-content; 51 | 52 | svg { 53 | width: 1.4rem; 54 | margin-left: 5px; 55 | vertical-align: middle; 56 | top: -1px; 57 | fill: currentColor; 58 | } 59 | 60 | &:hover { 61 | background: #8e9cff; 62 | } 63 | } 64 | ` 65 | 66 | const Header = ({ siteTitle, description }) => ( 67 | 68 | 69 |
70 |

71 | 79 | {siteTitle} 80 | 81 |

82 |

{description}

83 |
84 | 85 | Add an Event on Github 86 | 87 | 88 |
89 | 90 |
91 | ) 92 | 93 | Header.propTypes = { 94 | siteTitle: PropTypes.string, 95 | description: PropTypes.string 96 | } 97 | 98 | export default Header 99 | -------------------------------------------------------------------------------- /src/components/layout.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /* --link-color: #d22a60; */ 3 | --link-color: #001fff; 4 | --font-color: #2A3B58; 5 | } 6 | 7 | html { 8 | font-family: sans-serif; 9 | -ms-text-size-adjust: 100%; 10 | -webkit-text-size-adjust: 100%; 11 | } 12 | body { 13 | margin: 0; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | font-family: 'Lato', sans-serif; 17 | color: var(--font-color); 18 | font-size: calc(14px + 0.25vw); 19 | } 20 | 21 | article, 22 | aside, 23 | details, 24 | figcaption, 25 | figure, 26 | footer, 27 | header, 28 | main, 29 | menu, 30 | nav, 31 | section, 32 | summary { 33 | display: block; 34 | } 35 | audio, 36 | canvas, 37 | progress, 38 | video { 39 | display: inline-block; 40 | } 41 | audio:not([controls]) { 42 | display: none; 43 | height: 0; 44 | } 45 | progress { 46 | vertical-align: baseline; 47 | } 48 | [hidden], 49 | template { 50 | display: none; 51 | } 52 | a { 53 | background-color: transparent; 54 | text-decoration: none; 55 | } 56 | a:active, 57 | a:hover { 58 | outline-width: 0; 59 | } 60 | abbr[title] { 61 | border-bottom: none; 62 | text-decoration: underline; 63 | text-decoration: underline dotted; 64 | } 65 | b, 66 | strong { 67 | font-weight: inherit; 68 | font-weight: bolder; 69 | } 70 | dfn { 71 | font-style: italic; 72 | } 73 | h1 { 74 | font-size: 2em; 75 | margin: 0.67em 0; 76 | } 77 | mark { 78 | background-color: #ff0; 79 | color: #000; 80 | } 81 | small { 82 | font-size: 80%; 83 | } 84 | sub, 85 | sup { 86 | font-size: 75%; 87 | line-height: 0; 88 | position: relative; 89 | vertical-align: baseline; 90 | } 91 | sub { 92 | bottom: -0.25em; 93 | } 94 | sup { 95 | top: -0.5em; 96 | } 97 | img { 98 | border-style: none; 99 | } 100 | svg:not(:root) { 101 | overflow: hidden; 102 | } 103 | code, 104 | kbd, 105 | pre, 106 | samp { 107 | font-family: monospace, monospace; 108 | font-size: 1em; 109 | } 110 | figure { 111 | margin: 1em 40px; 112 | } 113 | hr { 114 | box-sizing: content-box; 115 | height: 0; 116 | overflow: visible; 117 | } 118 | button, 119 | input, 120 | optgroup, 121 | select, 122 | textarea { 123 | font: inherit; 124 | margin: 0; 125 | } 126 | optgroup { 127 | font-weight: 700; 128 | } 129 | button, 130 | input { 131 | overflow: visible; 132 | } 133 | button, 134 | select { 135 | text-transform: none; 136 | } 137 | [type="reset"], 138 | [type="submit"], 139 | button, 140 | html [type="button"] { 141 | -webkit-appearance: button; 142 | } 143 | [type="button"]::-moz-focus-inner, 144 | [type="reset"]::-moz-focus-inner, 145 | [type="submit"]::-moz-focus-inner, 146 | button::-moz-focus-inner { 147 | border-style: none; 148 | padding: 0; 149 | } 150 | [type="button"]:-moz-focusring, 151 | [type="reset"]:-moz-focusring, 152 | [type="submit"]:-moz-focusring, 153 | button:-moz-focusring { 154 | outline: 1px dotted ButtonText; 155 | } 156 | fieldset { 157 | border: 1px solid silver; 158 | margin: 0 2px; 159 | padding: 0.35em 0.625em 0.75em; 160 | } 161 | legend { 162 | box-sizing: border-box; 163 | color: inherit; 164 | display: table; 165 | max-width: 100%; 166 | padding: 0; 167 | white-space: normal; 168 | } 169 | textarea { 170 | overflow: auto; 171 | } 172 | [type="checkbox"], 173 | [type="radio"] { 174 | box-sizing: border-box; 175 | padding: 0; 176 | } 177 | [type="number"]::-webkit-inner-spin-button, 178 | [type="number"]::-webkit-outer-spin-button { 179 | height: auto; 180 | } 181 | [type="search"] { 182 | -webkit-appearance: textfield; 183 | outline-offset: -2px; 184 | } 185 | [type="search"]::-webkit-search-cancel-button, 186 | [type="search"]::-webkit-search-decoration { 187 | -webkit-appearance: none; 188 | } 189 | ::-webkit-input-placeholder { 190 | color: inherit; 191 | opacity: 0.54; 192 | } 193 | ::-webkit-file-upload-button { 194 | -webkit-appearance: button; 195 | font: inherit; 196 | } 197 | html { 198 | font: 112.5%/1.45em georgia, serif; 199 | box-sizing: border-box; 200 | overflow-y: scroll; 201 | } 202 | * { 203 | box-sizing: inherit; 204 | } 205 | *:before { 206 | box-sizing: inherit; 207 | } 208 | *:after { 209 | box-sizing: inherit; 210 | } 211 | /* body { 212 | color: hsla(0, 0%, 0%, 0.8); 213 | font-family: georgia, serif; 214 | font-weight: normal; 215 | word-wrap: break-word; 216 | font-kerning: normal; 217 | -moz-font-feature-settings: "kern", "liga", "clig", "calt"; 218 | -ms-font-feature-settings: "kern", "liga", "clig", "calt"; 219 | -webkit-font-feature-settings: "kern", "liga", "clig", "calt"; 220 | font-feature-settings: "kern", "liga", "clig", "calt"; 221 | } */ 222 | img { 223 | max-width: 100%; 224 | margin-left: 0; 225 | margin-right: 0; 226 | margin-top: 0; 227 | padding-bottom: 0; 228 | padding-left: 0; 229 | padding-right: 0; 230 | padding-top: 0; 231 | margin-bottom: 1.45rem; 232 | } 233 | h1 { 234 | margin-left: 0; 235 | margin-right: 0; 236 | margin-top: 0; 237 | padding-bottom: 0; 238 | padding-left: 0; 239 | padding-right: 0; 240 | padding-top: 0; 241 | margin-bottom: 1.45rem; 242 | color: inherit; 243 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 244 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 245 | font-weight: bold; 246 | text-rendering: optimizeLegibility; 247 | font-size: 2.25rem; 248 | line-height: 1.1; 249 | } 250 | h2 { 251 | margin-left: 0; 252 | margin-right: 0; 253 | margin-top: 0; 254 | padding-bottom: 0; 255 | padding-left: 0; 256 | padding-right: 0; 257 | padding-top: 0; 258 | margin-bottom: 1.45rem; 259 | color: inherit; 260 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 261 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 262 | font-weight: bold; 263 | text-rendering: optimizeLegibility; 264 | font-size: 1.62671rem; 265 | line-height: 1.1; 266 | } 267 | h3 { 268 | margin-left: 0; 269 | margin-right: 0; 270 | margin-top: 0; 271 | padding-bottom: 0; 272 | padding-left: 0; 273 | padding-right: 0; 274 | padding-top: 0; 275 | margin-bottom: 1.45rem; 276 | color: inherit; 277 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 278 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 279 | font-weight: bold; 280 | text-rendering: optimizeLegibility; 281 | font-size: 1.38316rem; 282 | line-height: 1.1; 283 | } 284 | h4 { 285 | margin-left: 0; 286 | margin-right: 0; 287 | margin-top: 0; 288 | padding-bottom: 0; 289 | padding-left: 0; 290 | padding-right: 0; 291 | padding-top: 0; 292 | margin-bottom: 1.45rem; 293 | color: inherit; 294 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 295 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 296 | font-weight: bold; 297 | text-rendering: optimizeLegibility; 298 | font-size: 1rem; 299 | line-height: 1.1; 300 | } 301 | h5 { 302 | margin-left: 0; 303 | margin-right: 0; 304 | margin-top: 0; 305 | padding-bottom: 0; 306 | padding-left: 0; 307 | padding-right: 0; 308 | padding-top: 0; 309 | margin-bottom: 1.45rem; 310 | color: inherit; 311 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 312 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 313 | font-weight: bold; 314 | text-rendering: optimizeLegibility; 315 | font-size: 0.85028rem; 316 | line-height: 1.1; 317 | } 318 | h6 { 319 | margin-left: 0; 320 | margin-right: 0; 321 | margin-top: 0; 322 | padding-bottom: 0; 323 | padding-left: 0; 324 | padding-right: 0; 325 | padding-top: 0; 326 | margin-bottom: 1.45rem; 327 | color: inherit; 328 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 329 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 330 | font-weight: bold; 331 | text-rendering: optimizeLegibility; 332 | font-size: 0.78405rem; 333 | line-height: 1.1; 334 | } 335 | hgroup { 336 | margin-left: 0; 337 | margin-right: 0; 338 | margin-top: 0; 339 | padding-bottom: 0; 340 | padding-left: 0; 341 | padding-right: 0; 342 | padding-top: 0; 343 | margin-bottom: 1.45rem; 344 | } 345 | ul { 346 | margin-left: 1.45rem; 347 | margin-right: 0; 348 | margin-top: 0; 349 | padding-bottom: 0; 350 | padding-left: 0; 351 | padding-right: 0; 352 | padding-top: 0; 353 | margin-bottom: 1.45rem; 354 | list-style-position: outside; 355 | list-style-image: none; 356 | } 357 | ol { 358 | margin-left: 1.45rem; 359 | margin-right: 0; 360 | margin-top: 0; 361 | padding-bottom: 0; 362 | padding-left: 0; 363 | padding-right: 0; 364 | padding-top: 0; 365 | margin-bottom: 1.45rem; 366 | list-style-position: outside; 367 | list-style-image: none; 368 | } 369 | dl { 370 | margin-left: 0; 371 | margin-right: 0; 372 | margin-top: 0; 373 | padding-bottom: 0; 374 | padding-left: 0; 375 | padding-right: 0; 376 | padding-top: 0; 377 | margin-bottom: 1.45rem; 378 | } 379 | dd { 380 | margin-left: 0; 381 | margin-right: 0; 382 | margin-top: 0; 383 | padding-bottom: 0; 384 | padding-left: 0; 385 | padding-right: 0; 386 | padding-top: 0; 387 | margin-bottom: 1.45rem; 388 | } 389 | p { 390 | margin-left: 0; 391 | margin-right: 0; 392 | margin-top: 0; 393 | padding-bottom: 0; 394 | padding-left: 0; 395 | padding-right: 0; 396 | padding-top: 0; 397 | margin-bottom: 1.45rem; 398 | } 399 | figure { 400 | margin-left: 0; 401 | margin-right: 0; 402 | margin-top: 0; 403 | padding-bottom: 0; 404 | padding-left: 0; 405 | padding-right: 0; 406 | padding-top: 0; 407 | margin-bottom: 1.45rem; 408 | } 409 | pre { 410 | margin-left: 0; 411 | margin-right: 0; 412 | margin-top: 0; 413 | margin-bottom: 1.45rem; 414 | font-size: 0.85rem; 415 | line-height: 1.42; 416 | background: hsla(0, 0%, 0%, 0.04); 417 | border-radius: 3px; 418 | overflow: auto; 419 | word-wrap: normal; 420 | padding: 1.45rem; 421 | } 422 | table { 423 | margin-left: 0; 424 | margin-right: 0; 425 | margin-top: 0; 426 | padding-bottom: 0; 427 | padding-left: 0; 428 | padding-right: 0; 429 | padding-top: 0; 430 | margin-bottom: 1.45rem; 431 | font-size: 1rem; 432 | line-height: 1.45rem; 433 | border-collapse: collapse; 434 | width: 100%; 435 | } 436 | fieldset { 437 | margin-left: 0; 438 | margin-right: 0; 439 | margin-top: 0; 440 | padding-bottom: 0; 441 | padding-left: 0; 442 | padding-right: 0; 443 | padding-top: 0; 444 | margin-bottom: 1.45rem; 445 | } 446 | blockquote { 447 | margin-left: 1.45rem; 448 | margin-right: 1.45rem; 449 | margin-top: 0; 450 | padding-bottom: 0; 451 | padding-left: 0; 452 | padding-right: 0; 453 | padding-top: 0; 454 | margin-bottom: 1.45rem; 455 | } 456 | form { 457 | margin-left: 0; 458 | margin-right: 0; 459 | margin-top: 0; 460 | padding-bottom: 0; 461 | padding-left: 0; 462 | padding-right: 0; 463 | padding-top: 0; 464 | margin-bottom: 1.45rem; 465 | } 466 | noscript { 467 | margin-left: 0; 468 | margin-right: 0; 469 | margin-top: 0; 470 | padding-bottom: 0; 471 | padding-left: 0; 472 | padding-right: 0; 473 | padding-top: 0; 474 | margin-bottom: 1.45rem; 475 | } 476 | iframe { 477 | margin-left: 0; 478 | margin-right: 0; 479 | margin-top: 0; 480 | padding-bottom: 0; 481 | padding-left: 0; 482 | padding-right: 0; 483 | padding-top: 0; 484 | margin-bottom: 1.45rem; 485 | } 486 | hr { 487 | margin-left: 0; 488 | margin-right: 0; 489 | margin-top: 0; 490 | padding-bottom: 0; 491 | padding-left: 0; 492 | padding-right: 0; 493 | padding-top: 0; 494 | margin-bottom: calc(1.45rem - 1px); 495 | background: hsla(0, 0%, 0%, 0.2); 496 | border: none; 497 | height: 1px; 498 | } 499 | address { 500 | margin-left: 0; 501 | margin-right: 0; 502 | margin-top: 0; 503 | padding-bottom: 0; 504 | padding-left: 0; 505 | padding-right: 0; 506 | padding-top: 0; 507 | margin-bottom: 1.45rem; 508 | } 509 | b { 510 | font-weight: bold; 511 | } 512 | strong { 513 | font-weight: bold; 514 | } 515 | dt { 516 | font-weight: bold; 517 | } 518 | th { 519 | font-weight: bold; 520 | } 521 | li { 522 | margin-bottom: calc(1.45rem / 2); 523 | } 524 | ol li { 525 | padding-left: 0; 526 | } 527 | ul li { 528 | padding-left: 0; 529 | } 530 | li > ol { 531 | margin-left: 1.45rem; 532 | margin-bottom: calc(1.45rem / 2); 533 | margin-top: calc(1.45rem / 2); 534 | } 535 | li > ul { 536 | margin-left: 1.45rem; 537 | margin-bottom: calc(1.45rem / 2); 538 | margin-top: calc(1.45rem / 2); 539 | } 540 | blockquote *:last-child { 541 | margin-bottom: 0; 542 | } 543 | li *:last-child { 544 | margin-bottom: 0; 545 | } 546 | p *:last-child { 547 | margin-bottom: 0; 548 | } 549 | li > p { 550 | margin-bottom: calc(1.45rem / 2); 551 | } 552 | code { 553 | font-size: 0.85rem; 554 | line-height: 1.45rem; 555 | } 556 | kbd { 557 | font-size: 0.85rem; 558 | line-height: 1.45rem; 559 | } 560 | samp { 561 | font-size: 0.85rem; 562 | line-height: 1.45rem; 563 | } 564 | abbr { 565 | border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); 566 | cursor: help; 567 | } 568 | acronym { 569 | border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); 570 | cursor: help; 571 | } 572 | abbr[title] { 573 | border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); 574 | cursor: help; 575 | text-decoration: none; 576 | } 577 | thead { 578 | text-align: left; 579 | } 580 | td, 581 | th { 582 | text-align: left; 583 | border-bottom: 1px solid hsla(0, 0%, 0%, 0.12); 584 | font-feature-settings: "tnum"; 585 | -moz-font-feature-settings: "tnum"; 586 | -ms-font-feature-settings: "tnum"; 587 | -webkit-font-feature-settings: "tnum"; 588 | padding-left: 0.96667rem; 589 | padding-right: 0.96667rem; 590 | padding-top: 0.725rem; 591 | padding-bottom: calc(0.725rem - 1px); 592 | } 593 | th:first-child, 594 | td:first-child { 595 | padding-left: 0; 596 | } 597 | th:last-child, 598 | td:last-child { 599 | padding-right: 0; 600 | } 601 | tt, 602 | code { 603 | background-color: hsla(0, 0%, 0%, 0.04); 604 | border-radius: 3px; 605 | font-family: "SFMono-Regular", Consolas, "Roboto Mono", "Droid Sans Mono", 606 | "Liberation Mono", Menlo, Courier, monospace; 607 | padding: 0; 608 | padding-top: 0.2em; 609 | padding-bottom: 0.2em; 610 | } 611 | pre code { 612 | background: none; 613 | line-height: 1.42; 614 | } 615 | code:before, 616 | code:after, 617 | tt:before, 618 | tt:after { 619 | letter-spacing: -0.2em; 620 | content: " "; 621 | } 622 | pre code:before, 623 | pre code:after, 624 | pre tt:before, 625 | pre tt:after { 626 | content: ""; 627 | } 628 | 629 | .speaker-image { 630 | max-width: 80%; 631 | width: 100%; 632 | } 633 | 634 | @media only screen and (max-width: 480px) { 635 | html { 636 | font-size: 100%; 637 | } 638 | .speaker-image { 639 | max-width: 100px; 640 | } 641 | } 642 | -------------------------------------------------------------------------------- /src/components/layout.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import PropTypes from "prop-types" 3 | import { StaticQuery, graphql } from "gatsby" 4 | 5 | import Header from "./header" 6 | import "./layout.css" 7 | import styled from '@emotion/styled'; 8 | 9 | const Footer = styled.footer` 10 | padding: 1rem 3rem; 11 | border-top: 2px solid #ececec; 12 | text-align: center; 13 | font-size: 0.9rem; 14 | color: var(--font-color); 15 | 16 | a { 17 | font-weight: bold; 18 | border-bottom: 2px solid currentColor; 19 | color: #555; 20 | } 21 | ` 22 | 23 | const Layout = ({ children }) => ( 24 | ( 36 | <> 37 |
38 |
39 |
{children}
40 | 50 |
51 | 52 | )} 53 | /> 54 | ) 55 | 56 | Layout.propTypes = { 57 | children: PropTypes.node.isRequired, 58 | } 59 | 60 | export default Layout 61 | -------------------------------------------------------------------------------- /src/components/seo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SEO component that queries for data with 3 | * Gatsby's useStaticQuery React hook 4 | * 5 | * See: https://www.gatsbyjs.org/docs/use-static-query/ 6 | */ 7 | 8 | import React from "react" 9 | import PropTypes from "prop-types" 10 | import Helmet from "react-helmet" 11 | import { useStaticQuery, graphql } from "gatsby" 12 | 13 | function SEO({ description, lang, meta, title }) { 14 | const { site } = useStaticQuery( 15 | graphql` 16 | query { 17 | site { 18 | siteMetadata { 19 | title 20 | description 21 | author 22 | } 23 | } 24 | } 25 | ` 26 | ) 27 | 28 | const metaDescription = description || site.siteMetadata.description 29 | 30 | return ( 31 | 72 | ) 73 | } 74 | 75 | SEO.defaultProps = { 76 | lang: `en`, 77 | meta: [], 78 | description: ``, 79 | } 80 | 81 | SEO.propTypes = { 82 | description: PropTypes.string, 83 | lang: PropTypes.string, 84 | meta: PropTypes.arrayOf(PropTypes.object), 85 | title: PropTypes.string.isRequired, 86 | } 87 | 88 | export default SEO 89 | -------------------------------------------------------------------------------- /src/images/speaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ananyaneogi/dev-conferences-india/9f96bce9991d0cf5297836d4a955f66257923989/src/images/speaker.png -------------------------------------------------------------------------------- /src/pages/404.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import Layout from "../components/layout" 4 | import SEO from "../components/seo" 5 | 6 | const NotFoundPage = () => ( 7 | 8 | 9 |

NOT FOUND

10 |

You just hit a route that doesn't exist... the sadness.

11 |
12 | ) 13 | 14 | export default NotFoundPage 15 | -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react" 2 | import { graphql } from "gatsby" 3 | import Layout from "../components/layout" 4 | import SEO from "../components/seo" 5 | import TalkCard from '../components/TalkCard'; 6 | import SpeakerImage from '../components/SpeakerImage'; 7 | 8 | import styled from "@emotion/styled" 9 | 10 | const CardGrid = styled.div` 11 | display: grid; 12 | grid-template-columns: repeat(auto-fill,minmax(340px,1fr)); 13 | grid-gap: 3rem; 14 | padding: 3rem; 15 | height: 100%; 16 | 17 | @media(max-width: 500px) { 18 | grid-template-columns: repeat(auto-fill,minmax(240px,1fr)); 19 | padding: 1rem; 20 | grid-gap: 2rem; 21 | 22 | .grid-head { 23 | display: flex; 24 | flex-direction: row-reverse; 25 | justify-content: space-around; 26 | align-items: center; 27 | 28 | h1 { 29 | font-size: 1.8rem; 30 | margin: 0; 31 | } 32 | } 33 | } 34 | ` 35 | 36 | class IndexPage extends Component { 37 | render() { 38 | const { data } = this.props; 39 | const talks = data.allMarkdownRemark.edges; 40 | 41 | return ( 42 | 43 | 44 | 45 |
46 |

Upcoming Talks

47 | 48 |
49 | { 50 | talks.filter(({ node }) => { 51 | return Date.parse(node.frontmatter.start_date) - Date.parse(new Date()) > 0 52 | }).map(({ node }) => ( 53 | 64 | 65 | )) 66 | } 67 |
68 |
69 | ) 70 | } 71 | } 72 | 73 | export default IndexPage 74 | 75 | export const pageQuery = graphql` 76 | query { 77 | allMarkdownRemark( sort: { fields: [frontmatter___start_date], order: ASC }) { 78 | edges { 79 | node { 80 | id 81 | frontmatter { 82 | title 83 | start_date(formatString: "DD MMM, YYYY") 84 | end_date(formatString: "DD MMM, YYYY") 85 | location 86 | url 87 | coc_url 88 | scholarship_url 89 | summary 90 | } 91 | } 92 | } 93 | } 94 | } 95 | 96 | ` --------------------------------------------------------------------------------