feat: create Governance landing page (#2277)

This commit is contained in:
Vlad Hashimoto 2019-03-18 22:49:00 +02:00 коммит произвёл Michelle Tilley
Родитель 707aa78cc5
Коммит 60c46421f4
14 изменённых файлов: 390 добавлений и 8 удалений

38
data/blog/governance.md Normal file
Просмотреть файл

@ -0,0 +1,38 @@
---
title: Electron Governance
author:
- ckerr
- sofianguy
date: '2019-03-18'
---
As Electron grows in popularity for desktop applications, the team working on it has also grown: we have more fulltime maintainers who work for different companies, live in different timezones, and have different interests. We're introducing a governance structure so we can keep growing smoothly.
---
## Why are things changing?
People in the Electron project coordinate in timezones around the world with volunteers, with full-time maintainers, and with several companies who all rely on Electron. Until now, we've been successful with informal coordination; but as the team has grown, we've found that the approach doesn't scale. We also want to make it easier for new contributors to find a place to call home in the project.
## Working Groups
Electron governance includes working groups that are responsible for different parts of the project. We're starting out with seven groups:
* Community & Safety: Handles [Code of Conduct](https://github.com/electron/governance/blob/master/CODE_OF_CONDUCT.md) issues.
* Docs & Tooling: Oversees externally-focused tooling (e.g. [Fiddle](https://electronjs.org/fiddle), [Forge](https://electronforge.io/)) and the Electron [documentation](https://electronjs.org/docs).
* Outreach: Helps grow the Electron community.
* Releases: Ensures releases are stable and on schedule.
* Security: Performs security testing and responds to security issues.
* Upgrades: Integrates upstream upgrades, such as new versions of V8, Chromium, and Node.
* Website: Maintains and improves [the Electron website](https://electronjs.org/).
These groups will coordinate with each other, but each has their own meeting schedules and agendas to be productive on their own. More details on these groups are available at the [governance repository](https://github.com/electron/governance/blob/master/README.md).
## Does this change the Electron project's direction?
This shouldn't have any direct effect on Electron's direction. If our strategy is successful, working groups will make it easier for new contributors to find topics that interest them, and make maintainers' lives simpler by moving discussion unrelated to their day-to-day work to other groups. If that happens, it may indirectly affect things by having more unblocked people working together.
## Where can I learn more?
* The governance [repo](https://github.com/electron/governance/) and [charter](https://github.com/electron/governance/tree/master/charter) have information about the new governance structure.
* Each working group has its own page: [Community](https://github.com/electron/governance/tree/master/wg-community-safety), [Docs & Tools](https://github.com/electron/governance/tree/master/wg-docs-tools), [Outreach](https://github.com/electron/governance/tree/master/wg-outreach), [Releases](https://github.com/electron/governance/tree/master/wg-releases), [Security](https://github.com/electron/governance/tree/master/wg-security), [Upgrades](https://github.com/electron/governance/tree/master/wg-upgrades), and [Website](https://github.com/electron/governance/tree/master/wg-website).
* You can contact the maintainers by [opening an issue](https://github.com/electron/governance/issues) or mailing us at [info@electronjs.org](mailto:info@electronjs.org).

Просмотреть файл

@ -13,6 +13,7 @@ nav:
releases: Releases
search: Search
userland: Userland
governance: Governance
keyboard_modal:
title: Keyboard Shortcuts
@ -297,6 +298,9 @@ pages:
'/fiddle':
title: Electron Fiddle
description: The easiest way to get started with Electron
'/governance':
title: Electron Governance
description: The Electron governance system is comprised of Working Groups that oversee different aspects of the Electron ecosystem, and an Administrative working group that functions to resolve conflicts between them.
'/donors':
title: Donors
@ -337,5 +341,58 @@ landing:
without <a href="https://electronforge.io/">electron-forge</a>.
Then, use your favorite editor and take on the world!
governance:
title: Electron Governance
description: The Electron governance system is comprised of Working Groups that oversee different aspects of the Electron ecosystem, and an Administrative working group that functions to resolve conflicts between them.
wgs: Working Groups
docstools:
title: Docs & Tools
description: Oversees externally-focused tooling (e.g. Fiddle, Forge), Electron documentation across the website and <code>electron/*</code> repositories, and the maintainers group outreach to 3rd party modules.
outreach:
title: Outreach
description: Grows the Electron community
releases:
title: Releases
description: Oversees all release branches, and tooling to support releases.
upgrades:
title: Upgrades
description: Oversees upgrades of upstream dependencies; specifically Chromium and Node.
website:
title: Website
description: Oversees the technical implementation, design, and style of the Electron website and associated tooling.
cmsf:
title: Community & Safety
description: Oversees removal/bans from community.
security:
title: Security
description: Proactively ensures the Security of Electron as a project, responds to incoming incidents, and oversees rollout of fixes.
admins:
title: Administrative
description: The Administrative Working Group oversees the entire governance and project.
global:
overview: Overview
associated_repos: Associated Repositories
notes: Meeting Notes
definitions:
title: Definitions
list:
- A <i>maintainer</i> is anyone who plays an active role in governance.
- A <i>collaborator</i> is active in the community, but not in governance.
- A <i>participant</i> is anyone who is a maintainer or collaborator.
- A <i>working group</i> is a group of maintainers that is formed to take responsibility for certain aspects of the Electron project. Normally these groups will meet regularly but in some cases will only meet as required to fulfill their responsibilities.
- A <a href="https://github.com/electron/governance/tree/master/charter/README.md#Leadership">chair</a> leads a working group.
responsibilities:
title: Responsibilities
listdescription: "All Working Groups have these core responsibilities:"
list:
- They shall decide for themselves, and publicly post, their rules, e.g. how decisions are made, when meetings are held, and who may attend.
- They shall <a href="https://github.com/electron/governance/tree/master/charter/README.md#Leadership-Terms-and-Selection">select</a> a chair to <a href='https://github.com/electron/governance/tree/master/charter/README.md#Leadership-Responsibilities'>represent</a> the group.
- They shall keep meeting notes, including agenda items, discussion points, and outcomes for everyone to review.
- They shall be collaborative and work <a href="https://github.com/electron/governance/tree/master/charter/README.md#Core-Values">in good faith</a> with other Working Groups.
see_charter: See <a href="https://github.com/electron/governance/tree/master/charter/README.md">charter</a> for more information.
code_of_conduct: The Electron organization and all repos therein adhere to the following <a href="https://github.com/electron/governance/blob/master/CODE_OF_CONDUCT.md">Code of Conduct.</a>
license: Electron is licensed with the <a href="https://github.com/electron/electron/blob/master/LICENSE">MIT License</a>.
repository: Check out the <a href="https://github.com/electron/governance">Governance Repository</a> to find more information about the governance structure.
_404:
page_not_found: Page not found.

5
package-lock.json сгенерированный
Просмотреть файл

@ -869,6 +869,11 @@
}
}
},
"@primer/css": {
"version": "12.1.1",
"resolved": "https://registry.npmjs.org/@primer/css/-/css-12.1.1.tgz",
"integrity": "sha512-iXE3GhVZ6g29DHgrCIyHLMzkgYeXWq/RnlBO78FgbuFBiAvZCdWTqBbdZ4OATplXTXtu3/cMXejEAwHCjvpMLw=="
},
"@sindresorhus/is": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",

Просмотреть файл

@ -30,6 +30,7 @@
"dependencies": {
"@babel/core": "^7.3.4",
"@babel/preset-env": "^7.3.4",
"@primer/css": "^12.1.1",
"awesome-electron": "2.6.0",
"babelify": "^10.0.0",
"brfs": "^2.0.2",

Просмотреть файл

@ -236,6 +236,26 @@
}
}
.center {
text-align: center;
}
.force-150 {
@media (min-width: 544px) {
min-height: 150px;
max-height: 150px;
height: 150px;
overflow: scroll;
}
}
.invisible {
opacity: 0;
@media (max-width: 543px) {
display: none;
}
}
.something-missing {
margin-top: 32px;
}

Просмотреть файл

@ -56,6 +56,13 @@
@import "hljs/github.css"; // Syntax highlighting
@import "hljs/overrides"; // customization
// @primer/css imports
@import "@primer/css/marketing/index.scss";
@import "@primer/css/utilities/padding.scss";
// Primer local imports
@import "./primer/container.scss";
// Basecoat overrides
@import "./helpers/buttons";
@import "./helpers/tables";
@ -81,4 +88,5 @@
@import "search";
@import "versions";
@import "kb-shortcut-dialog";
@import "ui/governance";
@import "ui/landing/fiddle";

Просмотреть файл

@ -0,0 +1,39 @@
// https://github.com/primer/css/blob/v12.1.1/src/layout/container.scss
// Fixed-width, centered column for site content.
// This will be deprecated and replaced with container-lg in future
.n-container {
width: $container-width;
margin-right: auto;
margin-left: auto;
@include clearfix;
}
// Handy container styles that match our breakpoints
// 544px
.n-container-sm {
max-width: $width-sm;
margin-right: auto;
margin-left: auto;
}
// 768px
.n-container-md {
max-width: $container-md;
margin-right: auto;
margin-left: auto;
}
// 1004px - this matches the current fixed width: 980px + padding: px-3
.n-container-lg {
max-width: $container-lg;
margin-right: auto;
margin-left: auto;
}
// 1280px
.n-container-xl {
max-width: $container-xl;
margin-right: auto;
margin-left: auto;
}

Просмотреть файл

@ -0,0 +1,17 @@
.governance {
.d-flex {
display: flex;
}
.d-md-flex {
display: flex;
}
.flex-column {
flex-direction: column;
}
.flex-md-row {
flex-direction: row;
}
}

Просмотреть файл

@ -0,0 +1,3 @@
module.exports = (req, res) => {
res.render('governance/index', req.context)
}

Просмотреть файл

@ -38,13 +38,13 @@ function buildSearch (type, isPrimarySearch = false, searches) {
// sync search input with query param in address bar
opts.routing = {
stateMapping: {
stateToRoute(UIstate){
stateToRoute (UIstate) {
// Use 'q' parameter in route instead of 'query'
return {q: UIstate.query}
},
routeToState(routeState){
return {query: routeState.q}
return { q: UIstate.query }
},
routeToState (routeState) {
return { query: routeState.q }
}
}
}

Просмотреть файл

@ -93,6 +93,7 @@ app.get('/docs/:category/*', routes.docs.show)
app.get('/docs/latest*', (req, res) => res.redirect(req.path.replace(/^\/docs\/latest/ig, '/docs')))
app.get('/docs/v0*', (req, res) => res.redirect(req.path.replace(/^\/docs\/v0\.\d+\.\d+/ig, '/docs')))
app.get('/docs/tutorial/faq', (req, res) => res.redirect('/docs/faq'))
app.get('/governance', routes.governance.index)
app.get('/issues', (req, res) => res.redirect(301, 'https://github.com/electron/electronjs.org/issues'))
app.get('/issues/new', (req, res) => res.redirect(301, 'https://github.com/electron/electronjs.org/issues/new'))
app.get('/languages', routes.languages.index)

Просмотреть файл

@ -17,8 +17,8 @@ const views = walk.entries(path.join(__dirname, '../views'))
const fullPath = path.join(entry.basePath, entry.relativePath)
const view = {
relativePath: entry.relativePath,
localizedKeys: (fs.readFileSync(fullPath, 'utf8').match(/{{(@root\/)?[./]*localized\.[a-z_.]*}}/g) || [])
.map(ref => ref.replace(/(\.\.|@root)\//g, '').replace('{{localized.', '').replace('}}', ''))
localizedKeys: (fs.readFileSync(fullPath, 'utf8').match(/{{(#each )?(@root\/)?[./]*localized\.[a-z_.]*}}/g) || [])
.map(ref => ref.replace(/(\.\.|@root)\//g, '').replace('#each ', '').replace('{{localized.', '').replace('}}', ''))
}
return view
})
@ -34,6 +34,9 @@ describe('localized views', () => {
views.forEach(view => {
view.localizedKeys.length.should.be.above(0)
view.localizedKeys.forEach(key => {
// #each is OK
if (Array.isArray(getProp(locale, key))) return
expect(getProp(locale, key), `${view.relativePath}: ${key} has no string in locale.yml`).to.be.a('string')
})
})
@ -44,6 +47,14 @@ describe('localized views', () => {
const keys = Object.keys(flat(locale))
.filter(key => !key.startsWith('pages.'))
.filter(key => !key.startsWith('_404.'))
.map(key => {
const split = key.split('.')
// If it is an array index, just check we use the array
if (/^[0-9]+$/.test(split[split.length - 1])) {
return split.slice(0, split.length - 1).join('.')
}
return key
})
keys.should.be.an('array')
keys.length.should.be.above(50)

181
views/governance/index.html Normal file
Просмотреть файл

@ -0,0 +1,181 @@
<div class="governance">
<div class="jumbotron text-center">
<div class="n-container-lg p-responsive position-relative">
<h1 class="h00-mktg lh-condensed mb-3 text-white">{{localized.governance.title}}</h1>
<div class="mx-auto mb-5">
<p class="lead-mktg">{{localized.governance.description}}</p>
</div>
</div>
</div>
<div class="py-7 py-md-8 py-lg-9">
<div class="n-container-lg p-responsive">
<h2 class="h00-mktg my-2 lh-condensed text-center">
<p class="text-gray-dark">{{localized.governance.wgs}}</p>
</h2>
<div class="row">
<div class="col-xs-12 col-sm-6 col-md-4 px-3 something-missing">
<span class="octicon hero-octicon octicon-tools" aria-hidden="true"></span>
<h3 class="h3-mktg text-normal mb-1 center">{{localized.governance.docstools.title}}</h3>
<p class="mb-3 text-gray force-150">
{{{localized.governance.docstools.description}}}
</p>
<ul>
<li><a href="https://github.com/electron/governance/blob/master/wg-docs-tools/README.md">{{localized.governance.global.overview}}</a></li>
<li><a href="https://github.com/electron/governance/blob/master/wg-docs-tools/repos.md">{{localized.governance.global.associated_repos}}</a></li>
<li><a href="https://github.com/electron/governance/tree/master/wg-docs-tools/meeting-notes">{{localized.governance.global.notes}}</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 px-3 something-missing">
<span class="octicon hero-octicon octicon-broadcast" aria-hidden="true"></span>
<h3 class="h3-mktg text-normal mb-1 center">{{localized.governance.outreach.title}}</h3>
<p class="mb-3 text-gray force-150">
{{{localized.governance.outreach.description}}}
</p>
<ul>
<li><a href="https://github.com/electron/governance/blob/master/wg-outreach/README.md">{{localized.governance.global.overview}}</a></li>
<li><a href="https://github.com/electron/governance/tree/master/wg-outreach/meeting-notes">{{localized.governance.global.notes}}</a></li>
<li class="invisible"></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 px-3 something-missing">
<span class="octicon hero-octicon octicon-rocket" aria-hidden="true"></span>
<h3 class="h3-mktg text-normal mb-1 center">{{localized.governance.releases.title}}</h3>
<p class="mb-3 text-gray force-150">
{{{localized.governance.releases.description}}}
</p>
<ul>
<li><a href="https://github.com/electron/governance/blob/master/wg-releases/README.md">{{localized.governance.global.overview}}</a></li>
<li><a href="https://github.com/electron/governance/blob/master/wg-releases/repos.md">{{localized.governance.global.associated_repos}}</a></li>
<li><a href="https://github.com/electron/governance/tree/master/wg-releases/meeting-notes">{{localized.governance.global.notes}}</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 px-3 something-missing">
<span class="octicon hero-octicon octicon-versions" aria-hidden="true"></span>
<h3 class="h3-mktg text-normal mb-1 center">{{localized.governance.upgrades.title}}</h3>
<p class="mb-3 text-gray force-150">
{{localized.governance.upgrades.description}}
</p>
<ul>
<li><a href="https://github.com/electron/governance/blob/master/wg-upgrades/README.md">{{localized.governance.global.overview}}</a></li>
<li><a href="https://github.com/electron/governance/blob/master/wg-upgrades/repos.md">{{localized.governance.global.associated_repos}}</a></li>
<li><a href="https://github.com/electron/governance/tree/master/wg-upgrades/meeting-notes">{{localized.governance.global.notes}}</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 px-3 something-missing">
<span class="octicon hero-octicon octicon-globe" aria-hidden="true"></span>
<h3 class="h3-mktg text-normal mb-1 center">{{localized.governance.website.title}}</h3>
<p class="mb-3 text-gray force-150">
{{{localized.governance.website.description}}}
</p>
<ul>
<li><a href="https://github.com/electron/governance/blob/master/wg-website/README.md">{{localized.governance.global.overview}}</a></li>
<li><a href="https://github.com/electron/governance/blob/master/wg-website/repos.md">{{localized.governance.global.associated_repos}}</a></li>
<li><a href="https://github.com/electron/governance/tree/master/wg-website/meeting-notes">{{localized.governance.global.notes}}</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 px-3 something-missing">
<span class="octicon hero-octicon octicon-law" aria-hidden="true"></span>
<h3 class="h3-mktg text-normal mb-1 center">{{localized.governance.cmsf.title}}</h3>
<p class="mb-3 text-gray force-150">
{{{localized.governance.cmsf.description}}}
</p>
<ul>
<li><a href="https://github.com/electron/governance/blob/master/wg-community-safety/README.md">{{localized.governance.global.overview}}</a></li>
<li><a href="https://github.com/electron/governance/tree/master/wg-community-safety/meeting-notes">{{localized.governance.global.notes}}</a></li>
<li class="invisible"></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 px-3 something-missing">
<span class="octicon hero-octicon octicon-shield" aria-hidden="true"></span>
<h3 class="h3-mktg text-normal mb-1 center">{{localized.governance.security.title}}</h3>
<p class="mb-3 text-gray force-150">
{{localized.governance.security.description}}
</p>
<ul>
<li><a href="https://github.com/electron/governance/blob/master/wg-security/README.md">{{localized.governance.global.overview}}</a></li>
<li><a href="https://github.com/electron/governance/tree/master/wg-security/meeting-notes">{{localized.governance.global.notes}}</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 px-3 something-missing">
<span class="octicon hero-octicon octicon-telescope" aria-hidden="true"></span>
<h3 class="h3-mktg text-normal mb-1 center">{{localized.governance.admins.title}}</h3>
<p class="mb-3 text-gray force-150">
{{localized.governance.admins.description}}
</p>
<ul>
<li><a href="https://github.com/electron/governance/blob/master/wg-administrative/README.md">{{localized.governance.global.overview}}</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="py-7 py-md-8 py-lg-9">
<div class="n-container-lg p-responsive">
<h2 class="h00-mktg my-2 lh-condensed text-center">
<p class="text-gray-dark">{{localized.governance.definitions.title}}</p>
</h2>
<div>
<ul>
{{#each localized.governance.definitions.list}}
<li>{{{this}}}</li>
{{/each}}
</ul>
</div>
</div>
</div>
<div class="py-7 py-md-8 py-lg-9">
<div class="n-container-lg p-responsive">
<h2 class="h00-mktg my-2 lh-condensed text-center">
<p class="text-gray-dark">{{{localized.governance.responsibilities.title}}}</p>
</h2>
<div>
<p>{{{localized.governance.responsibilities.listdescription}}}</p>
<ul>
{{#each localized.governance.responsibilities.list}}
<li>{{{this}}}</li>
{{/each}}
</ul>
<p>{{{localized.governance.responsibilities.see_charter}}}</p>
</div>
</div>
</div>
<div class="py-7 py-md-8 py-lg-9">
<div class="n-container-lg p-responsive">
<div class="row">
<div class="col-sm-12 col-md-6 p-3 px-md-6">
<h2 class="h3-mktg text-normal mt-0 mb-1">
{{localized.nav.code_of_conduct}}
</h2>
<p class="mb-3 text-gray">
{{{localized.governance.code_of_conduct}}}
</p>
</div>
<div class="col-sm-12 col-md-6 p-3 px-md-6">
<h2 class="h3-mktg text-normal mt-0 mb-1">
{{localized.nav.license}}
</h2>
<p class="mb-3 text-gray">
{{{localized.governance.license}}}
</p>
</div>
<div class="col-sm-12 col-md-6 p-3 px-md-6">
<h2 class="h3-mktg text-normal mt-0 mb-1">
{{localized.apps.repository}}
</h2>
<p class="mb-3 text-gray">
{{{localized.governance.repository}}}
</p>
</div>
</div>
</div>
</div>
</div>

Просмотреть файл

@ -23,6 +23,7 @@
<a class="site-header-nav-item" href="/blog">{{localized.nav.blog}}</a>
<a class="site-header-nav-item" href="/community">{{localized.nav.community}}</a>
<!-- <a class="site-header-nav-item" href="/userland">{{localized.nav.userland}}</a> -->
<a class="site-header-nav-item" href="/governance">{{localized.nav.governance}}</a>
<a class="site-header-nav-item" data-href-match="/releases" href="/releases/stable">{{localized.nav.releases}}</a>
<input id="search-input" class="nav-search" placeholder="{{localized.nav.search}}" aria-label="search-box" />
<!-- <img id="search-hint" alt="image of backslash shorcut" src="https://assets-cdn.github.com/images/search-shortcut-hint.svg" /> -->