├── .tool-versions ├── cypress ├── support │ ├── index.js │ └── commands.js ├── fixtures │ └── example.json ├── plugins │ └── index.js └── integration │ └── home.spec.js ├── static ├── CNAME ├── favicon.ico ├── social-card.jpg └── LICENSE ├── .prettierrc ├── cypress.json ├── assets ├── scss │ ├── variables │ │ ├── main.scss │ │ ├── _layout.scss │ │ ├── _media-queries.scss │ │ ├── _typography.scss │ │ └── _colors.scss │ ├── index.scss │ ├── _global.scss │ ├── _font-face.scss │ ├── mixins │ │ └── main.scss │ └── _normalize.scss ├── img │ ├── floatingCardBG.png │ └── badges │ │ ├── logo_dbatools.png │ │ ├── logo_diesel.png │ │ ├── logo_homebrew.png │ │ ├── logo_nodejs.png │ │ ├── logo_pyladies.png │ │ ├── logo_python.png │ │ ├── logo_prometheus.png │ │ ├── logo_wordpress.png │ │ └── logo_rubyonrails.png ├── fonts │ ├── alliance-no-1-medium.woff │ ├── alliance-no-1-regular.woff │ ├── alliance-no-1-semibold.woff │ ├── alliance-no-2-regular.woff │ ├── alliance-no-2-semibold.woff │ └── alliance-no-2-extrabold.woff ├── README.md └── svg │ ├── add_to_cal.svg │ └── github.svg ├── components ├── README.md ├── Cta.vue ├── Header.vue ├── Details.vue ├── DecorativeGlows.vue ├── Hero.vue ├── Maintainers.vue ├── FloatingCard.vue ├── Footer.vue ├── Lead.vue ├── common │ └── Link.vue ├── MaintainerPill.vue └── FloatingCards.vue ├── jsconfig.json ├── .editorconfig ├── layouts ├── README.md ├── default.vue └── error.vue ├── pages ├── README.md └── index.vue ├── stylelint.config.js ├── app.html ├── middleware └── README.md ├── .eslintrc.js ├── babel.config.js ├── jest.config.js ├── LICENSE ├── .gitignore ├── README.md ├── nuxt.config.js ├── utils ├── date-utils.spec.js └── date-utils.js ├── package.json ├── .github └── workflows │ └── build-and-deploy-workflow.yml ├── mixins └── social-metadata.js └── content └── home.json /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 15.8.0 2 | -------------------------------------------------------------------------------- /cypress/support/index.js: -------------------------------------------------------------------------------- 1 | import './commands' 2 | -------------------------------------------------------------------------------- /static/CNAME: -------------------------------------------------------------------------------- 1 | globalmaintainersummit.github.com -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /cypress/support/commands.js: -------------------------------------------------------------------------------- 1 | import '@testing-library/cypress/add-commands' 2 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/static/favicon.ico -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseUrl": "http://localhost:5000", 3 | "viewportWidth": 1024, 4 | "viewportHeight": 768 5 | } 6 | -------------------------------------------------------------------------------- /static/social-card.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/static/social-card.jpg -------------------------------------------------------------------------------- /assets/scss/variables/main.scss: -------------------------------------------------------------------------------- 1 | @import 'typography'; 2 | @import 'media-queries'; 3 | @import 'colors'; 4 | @import 'layout'; 5 | -------------------------------------------------------------------------------- /assets/img/floatingCardBG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/floatingCardBG.png -------------------------------------------------------------------------------- /assets/img/badges/logo_dbatools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/badges/logo_dbatools.png -------------------------------------------------------------------------------- /assets/img/badges/logo_diesel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/badges/logo_diesel.png -------------------------------------------------------------------------------- /assets/img/badges/logo_homebrew.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/badges/logo_homebrew.png -------------------------------------------------------------------------------- /assets/img/badges/logo_nodejs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/badges/logo_nodejs.png -------------------------------------------------------------------------------- /assets/img/badges/logo_pyladies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/badges/logo_pyladies.png -------------------------------------------------------------------------------- /assets/img/badges/logo_python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/badges/logo_python.png -------------------------------------------------------------------------------- /assets/img/badges/logo_prometheus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/badges/logo_prometheus.png -------------------------------------------------------------------------------- /assets/img/badges/logo_wordpress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/badges/logo_wordpress.png -------------------------------------------------------------------------------- /assets/scss/variables/_layout.scss: -------------------------------------------------------------------------------- 1 | // z-index 2 | :root { 3 | --z-index-decorative: -1; 4 | --z-index-content: 1; 5 | --z-index-cards: 2; 6 | } 7 | -------------------------------------------------------------------------------- /assets/fonts/alliance-no-1-medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/fonts/alliance-no-1-medium.woff -------------------------------------------------------------------------------- /assets/fonts/alliance-no-1-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/fonts/alliance-no-1-regular.woff -------------------------------------------------------------------------------- /assets/fonts/alliance-no-1-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/fonts/alliance-no-1-semibold.woff -------------------------------------------------------------------------------- /assets/fonts/alliance-no-2-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/fonts/alliance-no-2-regular.woff -------------------------------------------------------------------------------- /assets/fonts/alliance-no-2-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/fonts/alliance-no-2-semibold.woff -------------------------------------------------------------------------------- /assets/img/badges/logo_rubyonrails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/img/badges/logo_rubyonrails.png -------------------------------------------------------------------------------- /assets/scss/index.scss: -------------------------------------------------------------------------------- 1 | @import 'variables/main'; 2 | @import 'mixins/main'; 3 | 4 | @import 'normalize'; 5 | @import 'font-face'; 6 | @import 'global'; 7 | -------------------------------------------------------------------------------- /assets/fonts/alliance-no-2-extrabold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegram/globalmaintainersummit.github.com/main/assets/fonts/alliance-no-2-extrabold.woff -------------------------------------------------------------------------------- /assets/scss/variables/_media-queries.scss: -------------------------------------------------------------------------------- 1 | $screen-sm: 600px; 2 | $screen-ipad: 768px; 3 | $screen-xl: 1024px; 4 | $screen-max: 1400px; 5 | $screen-full: 1920px; 6 | -------------------------------------------------------------------------------- /cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /components/README.md: -------------------------------------------------------------------------------- 1 | # COMPONENTS 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | The components directory contains your Vue.js Components. 6 | 7 | _Nuxt.js doesn't supercharge these components._ 8 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "~/*": ["./*"], 6 | "@/*": ["./*"], 7 | "~~/*": ["./*"], 8 | "@@/*": ["./*"] 9 | } 10 | }, 11 | "exclude": ["node_modules", ".nuxt", "dist"] 12 | } 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /layouts/README.md: -------------------------------------------------------------------------------- 1 | # LAYOUTS 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your Application Layouts. 6 | 7 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/views#layouts). 8 | -------------------------------------------------------------------------------- /pages/README.md: -------------------------------------------------------------------------------- 1 | # PAGES 2 | 3 | This directory contains your Application Views and Routes. 4 | The framework reads all the `*.vue` files inside this directory and creates the router of your application. 5 | 6 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing). 7 | -------------------------------------------------------------------------------- /assets/README.md: -------------------------------------------------------------------------------- 1 | # ASSETS 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your un-compiled assets such as LESS, SASS, or JavaScript. 6 | 7 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#webpacked). 8 | -------------------------------------------------------------------------------- /layouts/default.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [ 3 | 'stylelint-config-standard', 4 | 'stylelint-config-rational-order', 5 | 'stylelint-config-prettier', 6 | ], 7 | plugins: ['stylelint-scss', 'stylelint-prettier'], 8 | rules: { 9 | 'prettier/prettier': true, 10 | 'at-rule-no-unknown': null, 11 | 'scss/at-rule-no-unknown': true, 12 | }, 13 | } 14 | -------------------------------------------------------------------------------- /app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ HEAD }} 5 | {% if (ENV["fathomToken"] !== null) { %} 6 | 7 | {% } %} 8 | 9 | 10 | 11 | {{ APP }} 12 | 13 | 14 | -------------------------------------------------------------------------------- /middleware/README.md: -------------------------------------------------------------------------------- 1 | # MIDDLEWARE 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your application middleware. 6 | Middleware let you define custom functions that can be run before rendering either a page or a group of pages. 7 | 8 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing#middleware). 9 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | node: true, 6 | }, 7 | parserOptions: { 8 | parser: 'babel-eslint', 9 | }, 10 | extends: [ 11 | '@nuxtjs', 12 | 'plugin:prettier/recommended', 13 | 'plugin:nuxt/recommended', 14 | 'plugin:cypress/recommended', 15 | ], 16 | plugins: ['prettier'], 17 | // add your custom rules here 18 | rules: { 19 | 'vue/no-v-html': 'off', 20 | }, 21 | } 22 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | function isBabelLoader(caller) { 2 | return caller && caller.name === 'babel-loader' 3 | } 4 | 5 | module.exports = function (api) { 6 | if (api.env('test') && !api.caller(isBabelLoader)) { 7 | return { 8 | presets: [ 9 | [ 10 | '@babel/preset-env', 11 | { 12 | targets: { 13 | node: 'current', 14 | }, 15 | }, 16 | ], 17 | ], 18 | } 19 | } 20 | return {} 21 | } 22 | -------------------------------------------------------------------------------- /components/Cta.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | 21 | 26 | -------------------------------------------------------------------------------- /components/Header.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | 17 | 28 | -------------------------------------------------------------------------------- /assets/scss/variables/_typography.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | // Font Family 3 | --ff-default: 'AllianceNo2', georgia, serif; 4 | --ff-title: 'AllianceNo1', arial, sans-serif; 5 | 6 | // Font Weight 7 | --fw-default: 400; 8 | --fw-medium: 500; 9 | --fw-semi-bold: 600; 10 | --fw-bold: 800; 11 | 12 | // Fonts Sizes 13 | --fs-colossal: 5.5rem; // 88px 14 | --fs-giant: 4rem; // 64px 15 | --fs-large: 3rem; // 48px 16 | --fs-medium: 2.5rem; // 40px 17 | --fs-regular: 1.5rem; // 24px 18 | --fs-default: 1.125rem; // 18px 19 | --fs-small: 0.875rem; // 14px 20 | } 21 | -------------------------------------------------------------------------------- /assets/scss/_global.scss: -------------------------------------------------------------------------------- 1 | *, 2 | *::before, 3 | *::after { 4 | box-sizing: border-box; 5 | } 6 | 7 | body { 8 | display: block; 9 | color: var(--fc-default); 10 | font-family: var(--ff-default); 11 | background-color: var(--bg-body); 12 | -ms-text-size-adjust: 100%; 13 | -webkit-text-size-adjust: 100%; 14 | -moz-osx-font-smoothing: grayscale; 15 | -webkit-font-smoothing: antialiased; 16 | } 17 | 18 | // Global layout transition 19 | .fade-enter-active, 20 | .fade-leave-active { 21 | transition: opacity 0.5s; 22 | } 23 | .fade-enter, 24 | .fade-leave-active { 25 | opacity: 0; 26 | } 27 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // tell Jest to handle `*.vue` files 3 | moduleNameMapper: { 4 | '^~/(.*)$': '/$1', 5 | '^~~/(.*)$': '/$1', 6 | '^@/(.*)$': '/$1', 7 | }, 8 | moduleFileExtensions: ['js', 'json', 'vue'], 9 | transform: { 10 | // process js with `babel-jest` 11 | '^.+\\.js$': 'babel-jest', 12 | // process `*.vue` files with `vue-jest` 13 | '.*\\.(vue)$': 'vue-jest', 14 | }, 15 | collectCoverage: true, 16 | collectCoverageFrom: [ 17 | '/components/**/*.vue', 18 | '/pages/*.vue', 19 | ], 20 | testPathIgnorePatterns: ['/cypress/'], 21 | } 22 | -------------------------------------------------------------------------------- /pages/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 32 | 33 | 38 | -------------------------------------------------------------------------------- /cypress/plugins/index.js: -------------------------------------------------------------------------------- 1 | /// 2 | // *********************************************************** 3 | // This example plugins/index.js can be used to load plugins 4 | // 5 | // You can change the location of this file or turn off loading 6 | // the plugins file with the 'pluginsFile' configuration option. 7 | // 8 | // You can read more here: 9 | // https://on.cypress.io/plugins-guide 10 | // *********************************************************** 11 | 12 | // This function is called when a project is opened or re-opened (e.g. due to 13 | // the project's config changing) 14 | 15 | /** 16 | * @type {Cypress.PluginConfig} 17 | */ 18 | // eslint-disable-next-line no-unused-vars 19 | module.exports = (on, config) => { 20 | // `on` is used to hook into various events Cypress emits 21 | // `config` is the resolved Cypress config 22 | } 23 | -------------------------------------------------------------------------------- /assets/scss/_font-face.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-weight: 400; 3 | font-family: 'AllianceNo1'; 4 | src: url('../fonts/alliance-no-1-regular.woff'); 5 | } 6 | 7 | @font-face { 8 | font-weight: 500; 9 | font-family: 'AllianceNo1'; 10 | src: url('../fonts/alliance-no-1-medium.woff'); 11 | } 12 | 13 | @font-face { 14 | font-weight: 600; 15 | font-family: 'AllianceNo1'; 16 | src: url('../fonts/alliance-no-1-semibold.woff'); 17 | } 18 | 19 | @font-face { 20 | font-weight: 400; 21 | font-family: 'AllianceNo2'; 22 | src: url('../fonts/alliance-no-2-regular.woff'); 23 | } 24 | 25 | @font-face { 26 | font-weight: 600; 27 | font-family: 'AllianceNo2'; 28 | src: url('../fonts/alliance-no-2-semibold.woff'); 29 | } 30 | 31 | @font-face { 32 | font-weight: 800; 33 | font-family: 'AllianceNo2'; 34 | src: url('../fonts/alliance-no-2-extrabold.woff'); 35 | } 36 | -------------------------------------------------------------------------------- /components/Details.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 19 | 20 | 40 | -------------------------------------------------------------------------------- /components/DecorativeGlows.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 GitHub Inc. 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 | -------------------------------------------------------------------------------- /components/Hero.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 21 | 22 | 48 | -------------------------------------------------------------------------------- /static/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 GitHub Inc. 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 | -------------------------------------------------------------------------------- /assets/scss/mixins/main.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Scale font for responsiveness 3 | */ 4 | @mixin mobileToDesktopFontSize($mobileSize, $desktopSize) { 5 | font-size: $mobileSize; 6 | @media screen and (min-width: $screen-sm) { 7 | font-size: $desktopSize; 8 | } 9 | } 10 | 11 | /* 12 | * Add a gradient to the text using the two colors in the parameters 13 | */ 14 | @mixin gradientTitle($startingColor, $endingColor) { 15 | background-color: $startingColor; 16 | background-image: linear-gradient( 17 | 90deg, 18 | $startingColor 0%, 19 | $endingColor 100% 20 | ); 21 | background-size: 100%; 22 | background-clip: text; 23 | -webkit-text-fill-color: transparent; 24 | -moz-text-fill-color: transparent; 25 | } 26 | 27 | /* 28 | * Handle section margin for desktop and mobile 29 | */ 30 | @mixin section { 31 | width: 100%; 32 | max-width: 1400px; 33 | margin: 0 auto; 34 | padding: 0 24px; 35 | @media screen and (min-width: $screen-sm) { 36 | padding: 0 40px; 37 | } 38 | @media screen and (min-width: $screen-ipad) { 39 | padding: 0 64px; 40 | } 41 | @media screen and (min-width: $screen-xl) { 42 | padding: 0 80px; 43 | } 44 | @media screen and (min-width: $screen-max) { 45 | padding: 0 120px; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /layouts/error.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 24 | 25 | 55 | -------------------------------------------------------------------------------- /assets/svg/add_to_cal.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cypress/integration/home.spec.js: -------------------------------------------------------------------------------- 1 | describe('Home', () => { 2 | it('Display the correct date and it is clickable', () => { 3 | cy.visit('/') 4 | cy.findByText('June 8-9, 2021').click() 5 | }) 6 | 7 | it('List all maintainers sorted alphabetically', () => { 8 | cy.visit('/') 9 | cy.get('[data-cy=speaker]').then(($speakers) => { 10 | let names = [] 11 | 12 | $speakers.each((_, speakerElement) => { 13 | names = [...names, speakerElement.innerText] 14 | }) 15 | 16 | expect([...names]).to.have.ordered.members( 17 | names.sort((a, b) => a.localeCompare(b)) 18 | ) 19 | }) 20 | }) 21 | 22 | it('There are no duplicated speakers in the Maintainers list', () => { 23 | cy.visit('/') 24 | cy.get('[data-cy=speaker]').then(($speakers) => { 25 | let speakers = [] 26 | 27 | $speakers.each((_, speakerElement) => { 28 | speakers = [...speakers, speakerElement.innerText] 29 | }) 30 | 31 | const uniqueSpeakers = new Set(speakers).size 32 | 33 | expect(uniqueSpeakers).to.equal(speakers.length) 34 | }) 35 | }) 36 | 37 | it('Maintainers are clickable', () => { 38 | cy.visit('/') 39 | cy.get('[data-cy=speaker]').each(($link) => { 40 | cy.get($link).click() 41 | }) 42 | }) 43 | 44 | it('Projects are clickable', () => { 45 | cy.visit('/') 46 | cy.get('[data-cy=project]').each(($link) => { 47 | cy.get($link).click() 48 | }) 49 | }) 50 | 51 | it('Cards are clickable', () => { 52 | cy.visit('/') 53 | cy.get('[data-cy=card]').each(($link) => { 54 | cy.get($link).click() 55 | }) 56 | }) 57 | }) 58 | -------------------------------------------------------------------------------- /assets/scss/variables/_colors.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | // Private variables 3 | // Neutral colors 4 | --white: hsla(0, 0%, 100%, 1); 5 | --black: hsla(0, 0%, 0, 1%); 6 | 7 | // Color palette 8 | --bali-hai: hsla(218, 24%, 60%, 1); // #8193B2 9 | --bittersweet: hsla(0, 100%, 72%, 1); // #FF7170 10 | --kournikova: hsla(48, 100%, 75%, 1); // #FFE57F 11 | --black-pearl: hsla(221, 78%, 7%, 1); // #040d21 12 | --black-pearl-72: hsla(221, 78%, 7%, 0.72); 13 | --tea-blue: hsla(202, 87%, 21%, 1); // #074264 14 | --tea-blue-40: hsla(202, 87%, 21%, 0.4); 15 | --blue-zodiac: hsla(221, 64%, 11%, 1); // #0A152E 16 | --blue-zodiac-60: hsla(221, 64%, 11%, 0.6); 17 | --blue-zodiac-80: hsla(221, 64%, 11%, 0.9); 18 | --venice-blue: hsla(201.9, 94.4%, 27.8%, 1); // #04598a 19 | --venice-blue-40: hsla(201.9, 94.4%, 27.8%, 4); 20 | --salomie: hsla(43, 100%, 75%, 1); // #FFDB7F 21 | --salomie-23: hsla(43, 100%, 75%, 0.23); 22 | 23 | // Background Colors 24 | --bg-body: var(--black-pearl); 25 | --bg-gradient-start: var(--bittersweet); 26 | --bg-gradient-end: var(--kournikova); 27 | --bg-floating-card: var(--blue-zodiac-60); 28 | --bg-floating-card-fallback: var(--blue-zodiac-80); 29 | --bg-glow: var(--venice-blue-40); 30 | --bg-glow-accent: var(--salomie-23); 31 | 32 | // Font Colors 33 | --fc-default: var(--white); 34 | --fc-accent: var(--kournikova); 35 | --fc-dark: var(--black-pearl); 36 | --fc-floating-pill-mantainer: var(--bali-hai); 37 | --fc-dimmed: var(--bali-hai); 38 | 39 | // Borders 40 | --border-floating-card: var(--black-pearl-72); 41 | 42 | // BoxShadow 43 | --bs-floating-card: var(--tea-blue-40); 44 | } 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | /logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | 41 | # TypeScript v1 declaration files 42 | typings/ 43 | 44 | # Optional npm cache directory 45 | .npm 46 | 47 | # Optional eslint cache 48 | .eslintcache 49 | 50 | # Optional esint ignore 51 | .eslintignore 52 | 53 | # Optional REPL history 54 | .node_repl_history 55 | 56 | # Output of 'npm pack' 57 | *.tgz 58 | 59 | # Yarn Integrity file 60 | .yarn-integrity 61 | 62 | # dotenv environment variables file 63 | .env 64 | 65 | # parcel-bundler cache (https://parceljs.org/) 66 | .cache 67 | 68 | # next.js build output 69 | .next 70 | 71 | # nuxt.js build output 72 | .nuxt 73 | 74 | # Nuxt generate 75 | dist 76 | 77 | # vuepress build output 78 | .vuepress/dist 79 | 80 | # Serverless directories 81 | .serverless 82 | 83 | # IDE / Editor 84 | .idea 85 | 86 | # Service worker 87 | sw.* 88 | 89 | # macOS 90 | .DS_Store 91 | 92 | # Vim swap files 93 | *.swp -------------------------------------------------------------------------------- /components/Maintainers.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 38 | 39 | 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Global Maintainers Summit 2 | 3 | ## Add new speaker or projects to current speakers 4 | 5 | ### Step 1 6 | 7 | Go to `content/home.json` file. 8 | 9 | To add a new speaker just add to the `maintainers` array a new `maintainer` object providing the speaker name, their GitHub profile handler and a list with the projects they maintain. 10 | 11 | To add a new project, find the maintainer in the array and just add a new `project` object to the projects array, providing the project name, GitHub repo URL and the name of the badge file (optional) for each project. 12 | 13 | ```json 14 | { 15 | "speaker": "Siân Griffin", 16 | "handler": "sgrif", 17 | "projects": [ 18 | { 19 | "name": "Diesel", 20 | "url": "https://github.com/diesel-rs/diesel", 21 | "badge": "logo_diesel.png" 22 | } 23 | ] 24 | } 25 | ``` 26 | 27 | ### Step 2 28 | 29 | If you want to add the badge for a new **project** added project (the logo), then add the file to `assets/img/badges`. If there is no logo provided, then it won't be displayed as a floating card, just in the maintainers list. 30 | 31 | If you don't want to provide a logo for the project, then simply leave the badge property empty, e.g.: 32 | 33 | ```json 34 | { 35 | "speaker": "Siân Griffin", 36 | "handler": "sgrif", 37 | "projects": [ 38 | { 39 | "name": "Diesel", 40 | "url": "https://github.com/diesel-rs/diesel", 41 | "badge": "" 42 | } 43 | ] 44 | } 45 | ``` 46 | 47 | --- 48 | 49 | ## Build Setup 50 | 51 | ```bash 52 | # install dependencies 53 | $ npm install 54 | 55 | # serve with hot reload at localhost:3000 56 | $ npm run dev 57 | 58 | # build for production and launch server 59 | $ npm run build 60 | $ npm run start 61 | 62 | # generate static project 63 | $ npm run generate 64 | ``` 65 | 66 | For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org). 67 | -------------------------------------------------------------------------------- /components/FloatingCard.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 26 | 27 | 84 | -------------------------------------------------------------------------------- /components/Footer.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 40 | 41 | 83 | -------------------------------------------------------------------------------- /components/Lead.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 48 | 49 | 78 | -------------------------------------------------------------------------------- /nuxt.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | // Target: https://go.nuxtjs.dev/config-target 3 | target: 'static', 4 | router: { 5 | base: process.env.BASE_PATH || '/', 6 | }, 7 | generate: { 8 | fallback: '404.html', 9 | }, 10 | env: { 11 | fathomToken: process.env.FATHOM_TOKEN || null, 12 | }, 13 | // Global page headers: https://go.nuxtjs.dev/config-head 14 | head: { 15 | title: 'Global Maintainers Summit Event 2021', 16 | htmlAttrs: { 17 | lang: 'en', 18 | }, 19 | meta: [ 20 | { charset: 'utf-8' }, 21 | { name: 'viewport', content: 'width=device-width, initial-scale=1' }, 22 | { 23 | name: 'apple-mobile-web-app-status-bar-style', 24 | content: 'black-translucent', 25 | }, 26 | { name: 'theme-color', content: '#040e21' }, 27 | ], 28 | link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }], 29 | }, 30 | 31 | // Global CSS: https://go.nuxtjs.dev/config-css 32 | css: ['@/assets/scss/index.scss'], 33 | 34 | // Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins 35 | plugins: [], 36 | 37 | // Auto import components: https://go.nuxtjs.dev/config-components 38 | components: true, 39 | 40 | // Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules 41 | buildModules: [ 42 | // https://go.nuxtjs.dev/eslint 43 | '@nuxtjs/eslint-module', 44 | // https://go.nuxtjs.dev/stylelint 45 | '@nuxtjs/stylelint-module', 46 | '@nuxtjs/style-resources', 47 | ], 48 | 49 | styleResources: { 50 | scss: [ 51 | './assets/scss/variables/main.scss', 52 | './assets/scss/mixins/main.scss', 53 | ], 54 | }, 55 | 56 | // Modules: https://go.nuxtjs.dev/config-modules 57 | modules: [ 58 | // https://go.nuxtjs.dev/content 59 | '@nuxt/content', 60 | '@nuxtjs/svg', 61 | ], 62 | 63 | // Content module configuration: https://go.nuxtjs.dev/config-content 64 | content: {}, 65 | 66 | // Build Configuration: https://go.nuxtjs.dev/config-build 67 | build: { 68 | loaders: { 69 | scss: { sourceMap: false }, 70 | }, 71 | }, 72 | } 73 | -------------------------------------------------------------------------------- /utils/date-utils.spec.js: -------------------------------------------------------------------------------- 1 | import { formatDate, buildGoogleCalendarUrl } from '~/utils/date-utils.js' 2 | 3 | describe('Date utils', () => { 4 | const startDate = new Date('2021-06-08') 5 | const endDate = new Date('2021-06-09') 6 | 7 | describe('Format Date', () => { 8 | it('formats dates that belong to the same month', () => { 9 | const actualDate = formatDate(startDate, endDate) 10 | const expectedDate = 'June 8-9, 2021' 11 | 12 | expect(actualDate).not.toBeUndefined() 13 | expect(actualDate).toEqual(expectedDate) 14 | }) 15 | 16 | it('formats dates that belong to the different months', () => { 17 | const actualDate = formatDate(startDate, new Date('2021-07-09')) 18 | const expectedDate = 'June 8 - July 9, 2021' 19 | 20 | expect(actualDate).not.toBeUndefined() 21 | expect(actualDate).toEqual(expectedDate) 22 | }) 23 | 24 | it('returns void if a date is invalid', () => { 25 | const actualDate = formatDate(startDate, new Date('2021-07-90')) 26 | 27 | expect(actualDate).not.toBeUndefined() 28 | expect(actualDate).toEqual('') 29 | }) 30 | }) 31 | 32 | describe('Build Google Calendar URL', () => { 33 | it('builds a valid Google Calendar URL', () => { 34 | const actualGoogleCalendarUrl = buildGoogleCalendarUrl( 35 | startDate, 36 | endDate, 37 | 'This is some text', 38 | 'These are the details' 39 | ) 40 | const expectedGoogleCalendarUrl = 41 | 'http://www.google.com/calendar/event?action=TEMPLATE&dates=20210608%2F20210610&text=This is some text&&details=These are the details' 42 | 43 | expect(actualGoogleCalendarUrl).not.toBeUndefined() 44 | expect(actualGoogleCalendarUrl).toEqual(expectedGoogleCalendarUrl) 45 | }) 46 | it('returns void if a date is invalid', () => { 47 | const actualGoogleCalendarUrl = buildGoogleCalendarUrl( 48 | new Date('2021-70-9'), 49 | endDate, 50 | 'This is some text', 51 | 'These are the details' 52 | ) 53 | 54 | expect(actualGoogleCalendarUrl).not.toBeUndefined() 55 | expect(actualGoogleCalendarUrl).toEqual('') 56 | }) 57 | }) 58 | }) 59 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "global-maintainers-summit", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "nuxt --port 5000", 7 | "build": "nuxt build", 8 | "start": "nuxt start", 9 | "generate": "nuxt generate", 10 | "lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .", 11 | "lint:style": "stylelint \"**/*.{vue,css}\" --ignore-path .gitignore", 12 | "lint": "npm run lint:js && npm run lint:style", 13 | "test": "jest", 14 | "e2e": "TZ=America/New_York cypress open --browser chrome", 15 | "e2e:ci": "TZ=America/New_York cypress run" 16 | }, 17 | "lint-staged": { 18 | "*.{js,vue}": "eslint", 19 | "*.{css,vue}": "stylelint" 20 | }, 21 | "husky": { 22 | "hooks": { 23 | "pre-commit": "lint-staged" 24 | } 25 | }, 26 | "dependencies": { 27 | "@nuxt/content": "^1.14.0", 28 | "@nuxtjs/style-resources": "^1.0.0", 29 | "core-js": "^3.9.1", 30 | "nuxt": "^2.15.3" 31 | }, 32 | "devDependencies": { 33 | "@nuxtjs/eslint-config": "^6.0.0", 34 | "@nuxtjs/eslint-module": "^3.0.2", 35 | "@nuxtjs/stylelint-module": "^4.0.0", 36 | "@nuxtjs/svg": "^0.1.12", 37 | "@testing-library/cypress": "^7.0.5", 38 | "@testing-library/vue": "^5.6.2", 39 | "@vue/test-utils": "^1.1.3", 40 | "babel-core": "^7.0.0-bridge.0", 41 | "babel-eslint": "^10.1.0", 42 | "babel-jest": "^26.6.3", 43 | "cypress": "^6.9.1", 44 | "eslint": "^7.22.0", 45 | "eslint-config-prettier": "^8.1.0", 46 | "eslint-plugin-cypress": "^2.11.2", 47 | "eslint-plugin-nuxt": "^2.0.0", 48 | "eslint-plugin-prettier": "^3.3.1", 49 | "fibers": "^5.0.0", 50 | "husky": "^4.3.8", 51 | "jest": "^26.6.3", 52 | "lint-staged": "^10.5.4", 53 | "prettier": "^2.2.1", 54 | "sass": "^1.32.8", 55 | "sass-loader": "^10.1.1", 56 | "stylelint": "^13.12.0", 57 | "stylelint-config-prettier": "^8.0.2", 58 | "stylelint-config-rational-order": "^0.1.2", 59 | "stylelint-config-standard": "^21.0.0", 60 | "stylelint-prettier": "^1.2.0", 61 | "stylelint-scss": "^3.19.0", 62 | "vue-jest": "^3.0.7" 63 | }, 64 | "engines": { 65 | "node": "~15.8.0", 66 | "npm": "~7.5.4" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /.github/workflows/build-and-deploy-workflow.yml: -------------------------------------------------------------------------------- 1 | name: Build and deploy site 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | 9 | jobs: 10 | cd: 11 | runs-on: ${{ matrix.os }} 12 | 13 | strategy: 14 | matrix: 15 | os: [ubuntu-latest] 16 | node: [15] 17 | 18 | steps: 19 | - name: Checkout 🛎 20 | uses: actions/checkout@master 21 | 22 | - name: Setup node env 🏗 23 | uses: actions/setup-node@v2.1.2 24 | with: 25 | node-version: ${{ matrix.node }} 26 | check-latest: true 27 | 28 | - name: Cache node_modules 📦 29 | uses: actions/cache@v2 30 | with: 31 | path: ~/.npm 32 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 33 | restore-keys: | 34 | ${{ runner.os }}-node- 35 | 36 | - name: Install dependencies 👨🏻‍💻 37 | run: npm ci 38 | 39 | - name: Run linter 👀 40 | run: npm run lint 41 | 42 | - name: Run Unit Tests 🧪 43 | run: npm run test 44 | 45 | - name: Generate ⚙️ 46 | env: 47 | BASE_PATH: ${{ secrets.BASE_PATH }} 48 | FATHOM_TOKEN: JDHEHWUV 49 | run: npm run generate 50 | 51 | - name: Run E2E Tests 🧪 52 | run: | 53 | npx serve dist & 54 | npm run e2e:ci 55 | 56 | - name: Upload artifacts (screenshots) 📸 57 | if: ${{ always() }} 58 | uses: actions/upload-artifact@v2 59 | with: 60 | name: cypress screenshots 61 | path: cypress/screenshots/ 62 | 63 | - name: Upload artifacts (videos) 📹 64 | if: ${{ always() }} 65 | uses: actions/upload-artifact@v2 66 | with: 67 | name: cypress videos 68 | path: cypress/videos/ 69 | 70 | - name: Upload artifacts (downloads) 📥 71 | if: ${{ always() }} 72 | uses: actions/upload-artifact@v2 73 | with: 74 | name: cypress downloads 75 | path: cypress/downloads/ 76 | 77 | - name: Deploy 🚀 78 | if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} 79 | uses: peaceiris/actions-gh-pages@v3 80 | with: 81 | github_token: ${{ secrets.GITHUB_TOKEN }} 82 | publish_dir: ./dist 83 | -------------------------------------------------------------------------------- /components/common/Link.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 51 | 52 | 107 | -------------------------------------------------------------------------------- /utils/date-utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Formats two given dates with the following patterns: 3 | * For dates within the same month: 4 | * June 8-9, 2021 5 | * 6 | * For dates that belong to different months: 7 | * June 8 - July 9, 2021 8 | * 9 | * @param {Date} startDate 10 | * @param {Date} endDate 11 | * @param {String} locale 12 | * @returns {String} 13 | */ 14 | export function formatDate(startDate, endDate, locale) { 15 | if (!isValidDate(startDate) || !isValidDate(endDate)) { 16 | return '' 17 | } 18 | 19 | const startDay = startDate.getUTCDate() 20 | const startMonth = startDate.toLocaleDateString(locale, { 21 | month: 'long', 22 | }) 23 | const endDay = endDate.getUTCDate() 24 | const endMonth = endDate.toLocaleDateString(locale, { 25 | month: 'long', 26 | }) 27 | const year = startDate.getUTCFullYear() 28 | 29 | return startMonth === endMonth 30 | ? `${startMonth} ${startDay}-${endDay}, ${year}` 31 | : `${startMonth} ${startDay} - ${endMonth} ${endDay}, ${year}` 32 | } 33 | 34 | /** 35 | * Build a URL to create an event in Google Calendar with the given parameters. 36 | * In order to set an all day event in Google Calendar, the end day has to be a day more of the actual date. 37 | * e.g. To create an event for dates June 8-9 it needs to be set June 8-10 38 | * 39 | * @param {Date} startDate 40 | * @param {Date} endDate 41 | * @param {String} text 42 | * @param {String} details 43 | * @returns {String} 44 | */ 45 | export function buildGoogleCalendarUrl(startDate, endDate, text, details) { 46 | if (!isValidDate(startDate) || !isValidDate(endDate)) { 47 | return '' 48 | } 49 | 50 | const startDateFormatted = formatDateCalendar(startDate) 51 | const endDateFormatted = formatDateCalendar(nextDay(endDate)) 52 | 53 | return `http://www.google.com/calendar/event?action=TEMPLATE&dates=${startDateFormatted}%2F${endDateFormatted}&text=${text}&&details=${details}` 54 | } 55 | 56 | /** 57 | * Format the given date to the following format: 58 | * YYYYMMDD 59 | * 60 | * @param {Date} date 61 | * @returns {String} 62 | */ 63 | function formatDateCalendar(date) { 64 | return date.toISOString().slice(0, 10).replaceAll('-', '') 65 | } 66 | 67 | /** 68 | * Calculates the next day of the given date 69 | * 70 | * @param {Date} date 71 | * @returns {Date} 72 | */ 73 | function nextDay(date) { 74 | const nextDate = new Date(date) 75 | return new Date(nextDate.setDate(nextDate.getUTCDate() + 1)) 76 | } 77 | 78 | /** 79 | * Check if the given date is valid 80 | * 81 | * @param {Date} date 82 | * @returns {Boolean} 83 | */ 84 | function isValidDate(date) { 85 | return date instanceof Date && !isNaN(date) 86 | } 87 | -------------------------------------------------------------------------------- /mixins/social-metadata.js: -------------------------------------------------------------------------------- 1 | const socialMetadata = { 2 | head() { 3 | const title = this.metadata?.title 4 | ? this.metadata.title 5 | : 'Global Maintainers Summit Event 2021' 6 | const description = this.metadata?.description 7 | ? this.metadata.description 8 | : 'A virtual event for the maintainers that make open source possible, hosted by GitHub.' 9 | const image = this.metadata?.image 10 | ? this.metadata.image 11 | : 'https://globalmaintainersummit.github.com/social-card.jpg' 12 | const meta = [ 13 | { 14 | hid: 'description', 15 | name: 'description', 16 | content: description, 17 | }, 18 | { 19 | hid: 'twitter:card', 20 | name: 'twitter:card', 21 | content: 'summary_large_image', 22 | }, 23 | { 24 | hid: 'twitter:site', 25 | name: 'twitter:site', 26 | content: '@github', 27 | }, 28 | { 29 | hid: 'twitter:creator', 30 | name: 'twitter:creator', 31 | content: '@github', 32 | }, 33 | { 34 | hid: 'twitter:title', 35 | name: 'twitter:title', 36 | content: title, 37 | }, 38 | { 39 | hid: 'twitter:description', 40 | name: 'twitter:description', 41 | content: description, 42 | }, 43 | { 44 | hid: 'twitter:image', 45 | name: 'twitter:image', 46 | content: image, 47 | }, 48 | { 49 | hid: 'twitter:image:alt', 50 | name: 'twitter:image:alt', 51 | content: description, 52 | }, 53 | { 54 | hid: 'og:type', 55 | property: 'og:type', 56 | content: 'website', 57 | }, 58 | { 59 | hid: 'og:title', 60 | property: 'og:title', 61 | content: title, 62 | }, 63 | { 64 | hid: 'og:description', 65 | property: 'og:description', 66 | content: description, 67 | }, 68 | { 69 | hid: 'og:image', 70 | property: 'og:image', 71 | content: image, 72 | }, 73 | { 74 | hid: 'og:image:width', 75 | property: 'og:image:width', 76 | content: '1200', 77 | }, 78 | { 79 | hid: 'og:image:height', 80 | property: 'og:image:height', 81 | content: '630', 82 | }, 83 | { 84 | hid: 'og:image:secure_url', 85 | property: 'og:image:secure_url', 86 | content: image, 87 | }, 88 | { 89 | hid: 'og:image:alt', 90 | property: 'og:image:alt', 91 | content: description, 92 | }, 93 | ] 94 | return { 95 | title, 96 | meta, 97 | } 98 | }, 99 | } 100 | 101 | export default socialMetadata 102 | -------------------------------------------------------------------------------- /components/MaintainerPill.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 47 | 48 | 113 | -------------------------------------------------------------------------------- /assets/svg/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /components/FloatingCards.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 90 | 91 | 174 | -------------------------------------------------------------------------------- /content/home.json: -------------------------------------------------------------------------------- 1 | { 2 | "hero": { 3 | "title": "Global Maintainer Summit", 4 | "subtitle": "hosted by GitHub" 5 | }, 6 | "lead": { 7 | "title": "A virtual gathering for the maintainers that make open source possible.", 8 | "dates": { 9 | "start": "2021-06-08", 10 | "end": "2021-06-09" 11 | }, 12 | "calendarEvent": { 13 | "text": "Global Maintainer Summit", 14 | "details": "

A virtual gathering for the maintainers that make open source possible

https://globalmaintainersummit.github.com/" 15 | } 16 | }, 17 | "details": { 18 | "highlight": "If you're an open source maintainer, you know that keeping the wheels of the open source ecosystem turning is quite a task.", 19 | "body": "

Project maintenance is uniquely challenging and rewarding work. Yet, as open source maintainers, we rarely get the opportunity to discuss the meta aspects of this role with our peers.

At the Global Maintainer Summit, we're taking the time to have those conversations. We'll feature a wide variety of short streaming talks on different projects' approaches to common problems. The content will be exclusively from maintainers, for maintainers. Get ready for vulnerable honesty. How do you survive the onslaught of notifications? Is it possible to (gasp) take a vacation? What kinds of automation ease your workflow? Together, we can help ease our individual burdens and elevate open source.

" 20 | }, 21 | "cta": { 22 | "label": "Submit a talk", 23 | "url": "https://sessionize.com/global-maintainer-summit-2021/" 24 | }, 25 | "maintainers": [ 26 | { 27 | "speaker": "Lorena Mesa", 28 | "handler": "lorenanicole", 29 | "projects": [ 30 | { 31 | "name": "PyLadies", 32 | "url": "https://github.com/pyladies", 33 | "badge": "logo_pyladies.png" 34 | } 35 | ] 36 | }, 37 | { 38 | "speaker": "Eileen Uchitelle", 39 | "handler": "eileencodes", 40 | "projects": [ 41 | { 42 | "name": "Ruby on Rails", 43 | "url": "https://github.com/rails", 44 | "badge": "logo_rubyonrails.png" 45 | } 46 | ] 47 | }, 48 | { 49 | "speaker": "Helen Hou-Sandí", 50 | "handler": "helen", 51 | "projects": [ 52 | { 53 | "name": "Wordpress", 54 | "url": "https://github.com/wordpress/wordpress-develop", 55 | "badge": "logo_wordpress.png" 56 | } 57 | ] 58 | }, 59 | { 60 | "speaker": "Mike McQuaid", 61 | "handler": "MikeMcQuaid", 62 | "projects": [ 63 | { 64 | "name": "Homebrew", 65 | "url": "https://github.com/Homebrew", 66 | "badge": "logo_homebrew.png" 67 | } 68 | ] 69 | }, 70 | { 71 | "speaker": "Myles Borins", 72 | "handler": "MylesBorins", 73 | "projects": [ 74 | { 75 | "name": "Node.js", 76 | "url": "https://github.com/nodejs/node", 77 | "badge": "logo_nodejs.png" 78 | } 79 | ] 80 | }, 81 | { 82 | "speaker": "Mariatta Wijaya", 83 | "handler": "Mariatta", 84 | "projects": [ 85 | { 86 | "name": "Python", 87 | "url": "https://github.com/python/cpython", 88 | "badge": "logo_python.png" 89 | } 90 | ] 91 | }, 92 | { 93 | "speaker": "Bartłomiej Płotka", 94 | "handler": "bwplotka", 95 | "projects": [ 96 | { 97 | "name": "Prometheus", 98 | "url": "https://github.com/prometheus/prometheus", 99 | "badge": "logo_prometheus.png" 100 | } 101 | ] 102 | }, 103 | { 104 | "speaker": "Siân Griffin", 105 | "handler": "sgrif", 106 | "projects": [ 107 | { 108 | "name": "Diesel", 109 | "url": "https://github.com/diesel-rs/diesel", 110 | "badge": "logo_diesel.png" 111 | } 112 | ] 113 | }, 114 | { 115 | "speaker": "Ifiok Jr.", 116 | "handler": "ifiokjr", 117 | "projects": [ 118 | { 119 | "name": "Remirror", 120 | "url": "https://github.com/remirror", 121 | "badge": "" 122 | } 123 | ] 124 | }, 125 | { 126 | "speaker": "Chrissy LeMaire", 127 | "handler": "potatoqualitee", 128 | "projects": [ 129 | { 130 | "name": "dbatools", 131 | "url": "https://github.com/sqlcollaborative/dbatools", 132 | "badge": "logo_dbatools.png" 133 | } 134 | ] 135 | } 136 | ], 137 | "footer": { 138 | "github": "© 2021 GitHub, Inc.", 139 | "links": [ 140 | { 141 | "label": "Terms", 142 | "url": "https://docs.github.com/en/github/site-policy/github-terms-of-service" 143 | }, 144 | { 145 | "label": "Privacy", 146 | "url": "https://docs.github.com/en/github/site-policy/github-privacy-statement" 147 | } 148 | ], 149 | "contact": { 150 | "label": "opensource@github.com", 151 | "mailto": "opensource@github.com" 152 | }, 153 | "project": { 154 | "label": "GitHub", 155 | "url": "https://github.com/github/globalmaintainersummit.github.com" 156 | } 157 | } 158 | } -------------------------------------------------------------------------------- /assets/scss/_normalize.scss: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in iOS. 9 | */ 10 | 11 | html { 12 | line-height: 1.15; /* 1 */ 13 | -webkit-text-size-adjust: 100%; /* 2 */ 14 | } 15 | 16 | /* Sections 17 | ========================================================================== */ 18 | 19 | /** 20 | * Remove the margin in all browsers. 21 | */ 22 | 23 | body { 24 | margin: 0; 25 | overflow-x: hidden; 26 | } 27 | 28 | /** 29 | * Render the `main` element consistently in IE. 30 | */ 31 | 32 | main { 33 | display: block; 34 | } 35 | 36 | /** 37 | * Correct the font size and margin on `h1` elements within `section` and 38 | * `article` contexts in Chrome, Firefox, and Safari. 39 | */ 40 | 41 | h1 { 42 | margin: 0.67em 0; 43 | font-size: 2em; 44 | } 45 | 46 | /* Grouping content 47 | ========================================================================== */ 48 | 49 | /** 50 | * 1. Add the correct box sizing in Firefox. 51 | * 2. Show the overflow in Edge and IE. 52 | */ 53 | 54 | hr { 55 | box-sizing: content-box; /* 1 */ 56 | height: 0; /* 1 */ 57 | overflow: visible; /* 2 */ 58 | } 59 | 60 | /** 61 | * 1. Correct the inheritance and scaling of font size in all browsers. 62 | * 2. Correct the odd `em` font sizing in all browsers. 63 | */ 64 | 65 | pre { 66 | font-size: 1em; /* 2 */ 67 | font-family: monospace; /* 1 */ 68 | } 69 | 70 | /* Text-level semantics 71 | ========================================================================== */ 72 | 73 | /** 74 | * Remove the gray background on active links in IE 10. 75 | */ 76 | 77 | a { 78 | display: inline-block; 79 | text-decoration: none; 80 | background-color: transparent; 81 | } 82 | 83 | /** 84 | * 1. Remove the bottom border in Chrome 57- 85 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 86 | */ 87 | 88 | abbr[title] { 89 | text-decoration: underline; /* 2 */ 90 | text-decoration: underline dotted; /* 2 */ 91 | border-bottom: none; /* 1 */ 92 | } 93 | 94 | /** 95 | * Add the correct font weight in Chrome, Edge, and Safari. 96 | */ 97 | 98 | b, 99 | strong { 100 | font-weight: bolder; 101 | } 102 | 103 | /** 104 | * 1. Correct the inheritance and scaling of font size in all browsers. 105 | * 2. Correct the odd `em` font sizing in all browsers. 106 | */ 107 | 108 | code, 109 | kbd, 110 | samp { 111 | font-size: 1em; /* 2 */ 112 | font-family: monospace; /* 1 */ 113 | } 114 | 115 | /** 116 | * Add the correct font size in all browsers. 117 | */ 118 | 119 | small { 120 | font-size: 80%; 121 | } 122 | 123 | /** 124 | * Prevent `sub` and `sup` elements from affecting the line height in 125 | * all browsers. 126 | */ 127 | 128 | sub, 129 | sup { 130 | position: relative; 131 | font-size: 75%; 132 | line-height: 0; 133 | vertical-align: baseline; 134 | } 135 | 136 | sub { 137 | bottom: -0.25em; 138 | } 139 | 140 | sup { 141 | top: -0.5em; 142 | } 143 | 144 | /* Embedded content 145 | ========================================================================== */ 146 | 147 | /** 148 | * Remove the border on images inside links in IE 10. 149 | */ 150 | 151 | img { 152 | border-style: none; 153 | } 154 | 155 | /* Forms 156 | ========================================================================== */ 157 | 158 | /** 159 | * 1. Change the font styles in all browsers. 160 | * 2. Remove the margin in Firefox and Safari. 161 | */ 162 | 163 | button, 164 | input, 165 | optgroup, 166 | select, 167 | textarea { 168 | margin: 0; /* 2 */ 169 | font-size: 100%; /* 1 */ 170 | font-family: inherit; /* 1 */ 171 | line-height: 1.15; /* 1 */ 172 | } 173 | 174 | /** 175 | * Show the overflow in IE. 176 | * 1. Show the overflow in Edge. 177 | */ 178 | 179 | button, 180 | input { 181 | /* 1 */ 182 | overflow: visible; 183 | } 184 | 185 | /** 186 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 187 | * 1. Remove the inheritance of text transform in Firefox. 188 | */ 189 | 190 | button, 191 | select { 192 | /* 1 */ 193 | text-transform: none; 194 | } 195 | 196 | /** 197 | * Correct the inability to style clickable types in iOS and Safari. 198 | */ 199 | 200 | button, 201 | [type='button'], 202 | [type='reset'], 203 | [type='submit'] { 204 | -webkit-appearance: button; 205 | } 206 | 207 | /** 208 | * Remove the inner border and padding in Firefox. 209 | */ 210 | 211 | button::-moz-focus-inner, 212 | [type='button']::-moz-focus-inner, 213 | [type='reset']::-moz-focus-inner, 214 | [type='submit']::-moz-focus-inner { 215 | padding: 0; 216 | border-style: none; 217 | } 218 | 219 | /** 220 | * Restore the focus styles unset by the previous rule. 221 | */ 222 | 223 | button:-moz-focusring, 224 | [type='button']:-moz-focusring, 225 | [type='reset']:-moz-focusring, 226 | [type='submit']:-moz-focusring { 227 | outline: 1px dotted ButtonText; 228 | } 229 | 230 | /** 231 | * Correct the padding in Firefox. 232 | */ 233 | 234 | fieldset { 235 | padding: 0.35em 0.75em 0.625em; 236 | } 237 | 238 | /** 239 | * 1. Correct the text wrapping in Edge and IE. 240 | * 2. Correct the color inheritance from `fieldset` elements in IE. 241 | * 3. Remove the padding so developers are not caught out when they zero out 242 | * `fieldset` elements in all browsers. 243 | */ 244 | 245 | legend { 246 | display: table; /* 1 */ 247 | box-sizing: border-box; /* 1 */ 248 | max-width: 100%; /* 1 */ 249 | padding: 0; /* 3 */ 250 | color: inherit; /* 2 */ 251 | white-space: normal; /* 1 */ 252 | } 253 | 254 | /** 255 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 256 | */ 257 | 258 | progress { 259 | vertical-align: baseline; 260 | } 261 | 262 | /** 263 | * Remove the default vertical scrollbar in IE 10+. 264 | */ 265 | 266 | textarea { 267 | overflow: auto; 268 | } 269 | 270 | /** 271 | * 1. Add the correct box sizing in IE 10. 272 | * 2. Remove the padding in IE 10. 273 | */ 274 | 275 | [type='checkbox'], 276 | [type='radio'] { 277 | box-sizing: border-box; /* 1 */ 278 | padding: 0; /* 2 */ 279 | } 280 | 281 | /** 282 | * Correct the cursor style of increment and decrement buttons in Chrome. 283 | */ 284 | 285 | [type='number']::-webkit-inner-spin-button, 286 | [type='number']::-webkit-outer-spin-button { 287 | height: auto; 288 | } 289 | 290 | /** 291 | * 1. Correct the odd appearance in Chrome and Safari. 292 | * 2. Correct the outline style in Safari. 293 | */ 294 | 295 | [type='search'] { 296 | outline-offset: -2px; /* 2 */ 297 | -webkit-appearance: textfield; /* 1 */ 298 | } 299 | 300 | /** 301 | * Remove the inner padding in Chrome and Safari on macOS. 302 | */ 303 | 304 | [type='search']::-webkit-search-decoration { 305 | -webkit-appearance: none; 306 | } 307 | 308 | /** 309 | * 1. Correct the inability to style clickable types in iOS and Safari. 310 | * 2. Change font properties to `inherit` in Safari. 311 | */ 312 | 313 | ::-webkit-file-upload-button { 314 | font: inherit; /* 2 */ 315 | -webkit-appearance: button; /* 1 */ 316 | } 317 | 318 | /* Interactive 319 | ========================================================================== */ 320 | 321 | /* 322 | * Add the correct display in Edge, IE 10+, and Firefox. 323 | */ 324 | 325 | details { 326 | display: block; 327 | } 328 | 329 | /* 330 | * Add the correct display in all browsers. 331 | */ 332 | 333 | summary { 334 | display: list-item; 335 | } 336 | 337 | /* Misc 338 | ========================================================================== */ 339 | 340 | /** 341 | * Add the correct display in IE 10+. 342 | */ 343 | 344 | template { 345 | display: none; 346 | } 347 | 348 | /** 349 | * Add the correct display in IE 10. 350 | */ 351 | 352 | [hidden] { 353 | display: none; 354 | } 355 | --------------------------------------------------------------------------------