├── .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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
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 |
2 |
3 |
4 | {{ cta.label }}
5 |
6 |
7 |
8 |
9 |
20 |
21 |
26 |
--------------------------------------------------------------------------------
/components/Header.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
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 |
2 |
3 |
{{ details.highlight }}
4 |
5 |
6 |
7 |
8 |
19 |
20 |
40 |
--------------------------------------------------------------------------------
/components/DecorativeGlows.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
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 |
2 |
3 |
4 |
{{ hero.title }}
5 |
{{ hero.subtitle }}
6 |
7 |
8 |
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 |
2 |
3 |
4 | Oopsie!
5 |
6 | We can't find the page you're looking for, sorry. It's probably our bad.
7 |
8 | Back to Homepage
9 |
10 |
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 |
2 |
3 |
6 |
7 |
Maintainers
8 |
13 |
14 |
15 |
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 |
2 |
3 |
4 |
8 |
9 |
10 |
{{ project.name }}
11 |
{{ project.speaker }}
12 |
13 |
14 |
15 |
16 |
26 |
27 |
84 |
--------------------------------------------------------------------------------
/components/Footer.vue:
--------------------------------------------------------------------------------
1 |
2 |
22 |
23 |
24 |
40 |
41 |
83 |
--------------------------------------------------------------------------------
/components/Lead.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ lead.title }}
4 |
5 | {{ dates }}
6 |
7 |
8 |
9 |
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 |
2 |
12 |
13 |
14 |
15 |
16 |
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 |
2 |
35 |
36 |
37 |
47 |
48 |
113 |
--------------------------------------------------------------------------------
/assets/svg/github.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/components/FloatingCards.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
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 |
--------------------------------------------------------------------------------