diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 000000000..b60113680 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,31 @@ +# Update the NODE_VERSION arg in docker-compose.yml to pick a Node version: 10, 12, 14 +ARG NODE_VERSION=14 +FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-${NODE_VERSION} + +# VARIANT can be either 'hugo' for the standard version or 'hugo_extended' for the extended version. +ARG VARIANT=hugo +# VERSION can be either 'latest' or a specific version number +ARG VERSION=latest + +# Download Hugo +RUN apt-get update && apt-get install -y ca-certificates openssl git curl && \ + rm -rf /var/lib/apt/lists/* && \ + case ${VERSION} in \ + latest) \ + export VERSION=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') ;;\ + esac && \ + echo ${VERSION} && \ + wget -O ${VERSION}.tar.gz https://github.com/gohugoio/hugo/releases/download/v${VERSION}/${VARIANT}_${VERSION}_Linux-64bit.tar.gz && \ + tar xf ${VERSION}.tar.gz && \ + mv hugo /usr/bin/hugo + +# Hugo dev server port +EXPOSE 1313 + +# [Optional] Uncomment this section to install additional OS packages you may want. +# +# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ +# && apt-get -y install --no-install-recommends + +# [Optional] Uncomment if you want to install more global node packages +# RUN sudo -u node npm install -g diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..149d75fcd --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,41 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.205.0/containers/hugo +{ + "name": "Hugo (Community)", + "build": { + "dockerfile": "Dockerfile", + "args": { + // Update VARIANT to pick hugo variant. + // Example variants: hugo, hugo_extended + // Rebuild the container if it already exists to update. + "VARIANT": "hugo_extended", + // Update VERSION to pick a specific hugo version. + // Example versions: latest, 0.73.0, 0,71.1 + // Rebuild the container if it already exists to update. + "VERSION": "latest", + // Update NODE_VERSION to pick the Node.js version: 12, 14 + "NODE_VERSION": "14", + } + }, + + // Set *default* container specific settings.json values on container create. + "settings": { + "html.format.templating": true, + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "davidanson.vscode-markdownlint" + ], + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + "forwardPorts": [ + 1313 + ], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "uname -a", + + // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. + "remoteUser": "node" +} diff --git a/.github/repolinter.yaml b/.github/repolinter.yaml new file mode 100644 index 000000000..f4511c322 --- /dev/null +++ b/.github/repolinter.yaml @@ -0,0 +1,2 @@ +extends: https://raw.githubusercontent.com/twitter/.github/master/repolinter-rulesets/default.yaml +# Add custom repolinter rules here. Learn more at https://github.com/todogroup/repolinter diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml new file mode 100644 index 000000000..992b77d34 --- /dev/null +++ b/.github/workflows/github-pages.yml @@ -0,0 +1,39 @@ +name: github-pages + +on: + workflow_dispatch: {} + schedule: + # Run Mondays at 3:00 am (15 minutes after Update data) + # Ideally, this shouldn't need a schedule at all, but + # workflows (like Update data) can't trigger other workflows. + - cron: "00 3 * * 1" + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: true + fetch-depth: 0 + + - name: setup hugo + uses: peaceiris/actions-hugo@2e89aa66d0093e4cd14751b3028fc1a179452c2e # v2.4.13 + with: + hugo-version: '0.78.0' + extended: true + + - name: build + run: hugo + + - name: deploy + uses: peaceiris/actions-gh-pages@bbdfb200618d235585ad98e965f4aafc39b4c501 # v3.7.3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + user_name: twitter-service + user_email: + publish_dir: ./public + cname: opensource.twitter.dev diff --git a/.github/workflows/repolinter.yaml b/.github/workflows/repolinter.yaml new file mode 100644 index 000000000..ea04f89e9 --- /dev/null +++ b/.github/workflows/repolinter.yaml @@ -0,0 +1,11 @@ +name: repolinter +on: [push, pull_request] + +jobs: + repolinter: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: todogroup/repolinter-action@v1 + with: + config_file: .github/repolinter.yaml diff --git a/.github/workflows/update-data.yml b/.github/workflows/update-data.yml index 2b05d7f4d..1a7b448f8 100644 --- a/.github/workflows/update-data.yml +++ b/.github/workflows/update-data.yml @@ -33,8 +33,9 @@ jobs: GH_USERNAME: ${{ secrets.GH_USERNAME }} - run: | - git config user.name 'twitter metrics' - git config user.email 'noreply+metrics@twitter.com' + git config user.name 'GitHub Actions' + git config user.email 'actions@users.noreply.github.com' git add -A - git commit -m "update repo metrics data" + timestamp=$(date -u) + git commit -m "update data: ${timestamp}" || exit 0 git push diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..31cf73697 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,14 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "hugo serve", + "type": "shell", + "command": "hugo serve", + "group": "build", + "isBackground": true, + } + ] +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..235b9ac6a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,61 @@ +# Contributing Guidelines + +Looking to contribute something? Here's how you can help. + +## Bugs reports + +A bug is a _demonstrable problem_ that is caused by the code in the +repository. Good bug reports are extremely helpful - thank you! + +Guidelines for bug reports: + +1. **Use the GitHub issue search** — check if the issue has already been + reported. + +2. **Check if the issue has been fixed** — try to reproduce it using the + latest `main` or development branch in the repository. + +3. **Isolate the problem** — ideally create a reduced test + case and a live example. + +4. Please try to be as detailed as possible in your report. Include specific + information about the environment - operating system and version, browser + and version... and steps required to reproduce the issue. + +## Making Changes + +If you'd like to contribute please follow these instructions. + +[Fork this repo on GitHub](https://github.com/twitter/opensource-website/fork) + +### Setup + +1. Clone your fork + +```bash +git clone https://github.com/$YOUR_USERNAME/opensource-website/ +cd opensource-website +``` + +2. Install Hugo + +[Install Hugo](https://gohugo.io/getting-started/installing/) + +3. Start Hugo server + +[Hugo Server](https://gohugo.io/commands/hugo_server/) + +```bash +hugo server +``` + +## Pull requests + +Good pull requests - patches, improvements, new features - are a fantastic +help. They should remain focused in scope and avoid containing unrelated +commits. + +1. Push your topic branch up to your fork: `git push origin my-feature-branch` + +2. [Open a Pull Request](http://help.github.com/send-pull-requests/) with a + clear title and description. One for your changes in `main`. diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..2bb9ad240 --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/README.md b/README.md index 777a1cc8a..e328194d2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,18 @@ -# opensource.twitter.com +# opensource.twitter.dev -Home of opensource.twitter.com +[![status: active](https://opensource.twitter.dev/status/active.svg)](https://opensource.twitter.dev/status/#active) + +This is the Twitter Open Source website at https://opensource.twitter.dev. + +This site is built with [hugo], using a custom built-in theme. Follow the +standard instructions on the hugo website to [install] and [run] hugo. Just +make sure to use hugo-extended, which has added support for Sass/SCSS +stylesheets. + +There are also some python scripts that run periodically to [update some repo +data]. + +[hugo]: https://gohugo.io/ +[install]: https://gohugo.io/getting-started/installing/ +[run]: https://gohugo.io/getting-started/usage/ +[update some repo data]: ./.github/workflows/update-data.yml diff --git a/assets/css/README.md b/assets/css/README.md new file mode 100644 index 000000000..10041bca6 --- /dev/null +++ b/assets/css/README.md @@ -0,0 +1,13 @@ +Stylesheets +=========== + +`_feather-*` files are part of the internal Feather framework used at Twitter. +They should not be edited directly, since they will be overwritten the next time +the components are upgraded. Instead, any overrides that are needed should be +added to `_feather-custom.scss`. + +Tweeps can get the latest feather resources at http://go/feathercode. +Specifically, we use: + + - http://go/featherraw/feather-core/dist/css/feather-core.css + - http://go/featherraw/feather-component-button/dist/css/feather-component-button.css diff --git a/assets/css/_feather-component-button.scss b/assets/css/_feather-component-button.scss new file mode 100644 index 000000000..952ca7b49 --- /dev/null +++ b/assets/css/_feather-component-button.scss @@ -0,0 +1,629 @@ +/*! Copyright 2022 Twitter Inc. All rights reserved. */ +/* @generated */ +/* Button groups */ +.ButtonGroup { + display: inline-block; + vertical-align: middle; +} +.ButtonGroup > .Button { + position: relative; + float: left; + text-align: center; +} +.ButtonGroup > .Button:focus { + outline: none; +} +.ButtonGroup > .Button { + z-index: 1; + transition-property: background-color, border-color; +} +.ButtonGroup > .Button:hover { + z-index: 2; +} +.ButtonGroup > .Button.is-selected { + z-index: 3; +} +.ButtonGroup > .Button.is-selected, +.ButtonGroup > .Button.is-selected:visited { + background-color: var(--feather-button-group-selected-background-color); + border: 1px solid var(--feather-button-group-selected-border-color); + color: var(--feather-button-group-selected-color); +} +.ButtonGroup > .Button.is-selected:focus, +.ButtonGroup > .Button.is-selected.is-focus { + background: var(--feather-button-group-selected-background-color); + border-color: var(--feather-button-group-selected-border-color); + color: var(--feather-button-group-selected-color); +} +.ButtonGroup > .Button.is-selected:focus:not(.is-mouseFocus), +.ButtonGroup > .Button.is-selected.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px white, 0 0 0 3px var(--feather-button-group-selected-outline-color-focus), 0 0 2px 3px var(--feather-button-group-selected-outline-color-focus); +} +.u-featherBackgroundDark .ButtonGroup > .Button.is-selected:focus:not(.is-mouseFocus), +.u-featherBackgroundDark .ButtonGroup > .Button.is-selected.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px black, 0 0 0 3px var(--feather-button-group-selected-outline-color-focus), 0 0 2px 3px var(--feather-button-group-selected-outline-color-focus); +} +.ButtonGroup > .Button.is-selected:hover, +.ButtonGroup > .Button.is-selected.is-hover { + background-color: var(--feather-button-group-selected-background-color-hover); + border-color: var(--feather-button-group-selected-border-color-hover); + color: var(--feather-button-group-selected-color); +} +.ButtonGroup > .Button.is-selected:active, +.ButtonGroup > .Button.is-selected.is-active { + background-color: var(--feather-button-group-selected-background-color-active); + border-color: var(--feather-button-group-selected-border-color-active); + color: var(--feather-button-group-selected-color); +} +.ButtonGroup > .Button.is-selected[disabled], +.ButtonGroup > .Button.is-selected.is-disabled, +fieldset[disabled] .ButtonGroup > .Button.is-selected { + background-color: var(--feather-button-group-selected-background-color); + border-color: var(--feather-button-group-selected-border-color); + box-shadow: none; +} +.ButtonGroup > .Button:focus:not(.is-mouseFocus), +.ButtonGroup > .Button.is-focus:not(.is-mouseFocus) { + z-index: 4; +} +.ButtonGroup > .Button + .Button { + margin-left: -1px; +} +.ButtonGroup > .Button:not(:first-child):not(:last-child) { + border-radius: 0; +} +.ButtonGroup > .Button:first-child:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ButtonGroup > .Button:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +/* Sizing */ +/* Variants */ +.ButtonGroup--primary > .Button + .Button { + margin-left: 1px; +} +.ButtonGroup--justified { + display: flex; + width: 100%; +} +.ButtonGroup--justified > .Button { + flex: 1; +} +.Button .Icon { + line-height: 1; + vertical-align: -1px; +} +.Button--large .Icon { + vertical-align: -2px; +} +.ButtonGroup .Icon { + line-height: 1; + vertical-align: -1px; +} +.ButtonGroup--large .Icon { + vertical-align: -2px; +} +.Button > .Icon--caretDown { + margin: 0 var(--feather-form-control-default-adornment-margin); +} +.Button--xsmall > .Icon--caretDown { + margin: 0 var(--feather-form-control-xsmall-adornment-margin); +} +.Button--small > .Icon--caretDown { + margin: 0 var(--feather-form-control-small-adornment-margin); +} +.Button--large > .Icon--caretDown { + margin: 0 var(--feather-form-control-large-adornment-margin); +} +.Button > .Icon--caretDown { + float: right; + margin-right: 0; + line-height: inherit; +} +.Button-label { + flex: 1 1 auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.Button-adornment { + margin: 0 var(--feather-form-control-default-adornment-margin); + flex: 0 0 auto; +} +.Button--xsmall .Button-adornment, +.ButtonGroup--xsmall .Button-adornment { + margin: 0 var(--feather-form-control-xsmall-adornment-margin); +} +.Button--small .Button-adornment, +.ButtonGroup--small .Button-adornment { + margin: 0 var(--feather-form-control-small-adornment-margin); +} +.Button--large .Button-adornment, +.ButtonGroup--large .Button-adornment { + margin: 0 var(--feather-form-control-large-adornment-margin); +} +.Button-adornment:only-child { + margin-right: 0; + margin-left: 0; +} +html:not([dir='rtl']) .Button:not([dir='rtl']) .Button-adornment:first-child, +.Button[dir='ltr'] .Button-adornment:first-child { + margin-left: 0; +} +html[dir='rtl'] .Button:not([dir='ltr']) .Button-adornment:first-child, +.Button[dir='rtl'] .Button-adornment:first-child { + margin-right: 0; +} +html:not([dir='rtl']) .Button:not([dir='rtl']) .Button-adornment:last-child, +.Button[dir='ltr'] .Button-adornment:last-child { + margin-right: 0; +} +html[dir='rtl'] .Button:not([dir='ltr']) .Button-adornment:last-child, +.Button[dir='rtl'] .Button-adornment:last-child { + margin-left: 0; +} +/* Category labels */ +.Button--withCategoryLabel .Button-label { + font-weight: 400; +} +.Button-categoryLabel { + font-weight: 700; +} +.Button { + --feather-button-background-color-active: rgba(55, 67, 77, 0.2); + --feather-button-background-color: white; + --feather-button-background-color-hover: var(--tw-color-gray-100); + --feather-button-border-color-active: rgba(55, 67, 77, 0); + --feather-button-border-color: var(--tw-color-gray-200); + --feather-button-border-color-hover: var(--feather-button-border-color); + --feather-button-color: var(--tw-color-text-primary); + --feather-button-outline-color-focus: rgba(29, 155, 240, 0.5); + --feather-button-primary-background-color-active: #3f4347; + --feather-button-primary-background-color: var(--tw-color-gray-1100); + --feather-button-primary-background-color-hover: #272b30; + --feather-button-primary-border-color-active: var(--feather-button-primary-background-color-active); + --feather-button-primary-border-color: var(--feather-button-primary-background-color); + --feather-button-primary-border-color-hover: var(--feather-button-primary-background-color-hover); + --feather-button-primary-color: white; + --feather-button-primary-outline-color-focus: var(--feather-button-outline-color-focus); + --feather-button-brand-primary-background-color-active: #177cc0; + --feather-button-brand-primary-background-color: var(--tw-color-blue-500); + --feather-button-brand-primary-background-color-hover: #1a8cd8; + --feather-button-brand-primary-border-color-active: #177cc0; + --feather-button-brand-primary-border-color: var(--feather-button-brand-primary-background-color); + --feather-button-brand-primary-border-color-hover: #1a8cd8; + --feather-button-brand-primary-color: white; + --feather-button-brand-primary-outline-color-focus: var(--feather-button-outline-color-focus); + --feather-button-danger-primary-background-color-active: #c31a25; + --feather-button-danger-primary-background-color: var(--tw-color-red-500); + --feather-button-danger-primary-background-color-hover: #dc1e29; + --feather-button-danger-primary-border-color-active: var(--feather-button-danger-primary-background-color-active); + --feather-button-danger-primary-border-color: var(--feather-button-danger-primary-background-color); + --feather-button-danger-primary-border-color-hover: var(--feather-button-danger-primary-background-color-hover); + --feather-button-danger-primary-color: white; + --feather-button-danger-primary-outline-color-focus: var(--tw-color-red-500); + --feather-button-danger-secondary-background-color-active: rgba(244, 33, 46, 0.2); + --feather-button-danger-secondary-background-color: white; + --feather-button-danger-secondary-background-color-hover: rgba(244, 33, 46, 0.1); + --feather-button-danger-secondary-border-color-active: rgba(244, 33, 46, 0); + --feather-button-danger-secondary-border-color: var(--tw-color-red-100); + --feather-button-danger-secondary-border-color-hover: rgba(244, 33, 46, 0.1); + --feather-button-danger-secondary-color: var(--tw-color-red-500); + --feather-button-danger-secondary-outline-color-focus: rgba(244, 33, 46, 0.5); + --feather-button-link-color: var(--tw-color-text-primary); + --feather-button-link-font-weight: var(--feather-font-weight-bold); + --feather-button-danger-link-color: var(--tw-color-red-500); + --feather-button-group-selected-background-color-active: var(--feather-button-primary-background-color-active); + --feather-button-group-selected-background-color: var(--feather-button-primary-background-color); + --feather-button-group-selected-background-color-hover: var(--feather-button-primary-background-color-hover); + --feather-button-group-selected-border-color-active: var(--feather-button-primary-border-color-active); + --feather-button-group-selected-border-color: var(--feather-button-primary-border-color); + --feather-button-group-selected-border-color-hover: var(--feather-button-primary-border-color-hover); + --feather-button-group-selected-color: var(--feather-button-primary-color); + --feather-button-group-selected-outline-color-focus: var(--feather-button-primary-outline-color-focus); +} +.Button { + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition-property: box-shadow, background-color, border-color; + text-align: center; +} +.Button:focus { + outline: none; +} +.Button:-moz-focusring, +.Button[type='button']:-moz-focusring, +.Button[type='reset']:-moz-focusring, +.Button[type='submit']:-moz-focusring { + outline: none; +} +.Button, +.Button:visited, +.Button.is-visited { + display: inline-flex; + align-items: center; + justify-content: center; + position: relative; + cursor: pointer; + font-family: var(--feather-font-family-base); + font-weight: 700; +} +.Button:focus, +.Button.is-focus { + text-decoration: none; +} +.Button:focus:not(.is-mouseFocus), +.Button.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px white, 0 0 0 3px rgba(29, 155, 240, 0.5), 0 0 2px 3px rgba(29, 155, 240, 0.5); +} +.Button:hover, +.Button.is-hover { + text-decoration: none; +} +.Button[disabled], +.Button.is-disabled, +fieldset[disabled] .Button { + cursor: default; + opacity: 0.5; + box-shadow: none; +} +a.Button.is-disabled, +fieldset[disabled] a.Button { + pointer-events: none; +} +.Button[type='button'] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +/* Variants */ +.Button, +.Button:visited { + background-color: var(--feather-button-background-color); + border: 1px solid var(--feather-button-border-color); + color: var(--feather-button-color); +} +.Button:focus, +.Button.is-focus { + background: var(--feather-button-background-color); + border-color: var(--feather-button-border-color); + color: var(--feather-button-color); +} +.Button:focus:not(.is-mouseFocus), +.Button.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px white, 0 0 0 3px var(--feather-button-outline-color-focus), 0 0 2px 3px var(--feather-button-outline-color-focus); +} +.u-featherBackgroundDark .Button:focus:not(.is-mouseFocus), +.u-featherBackgroundDark .Button.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px black, 0 0 0 3px var(--feather-button-outline-color-focus), 0 0 2px 3px var(--feather-button-outline-color-focus); +} +.Button:hover, +.Button.is-hover { + background-color: var(--feather-button-background-color-hover); + border-color: var(--feather-button-border-color-hover); + color: var(--feather-button-color); +} +.Button:active, +.Button.is-active { + background-color: var(--feather-button-background-color-active); + border-color: var(--feather-button-border-color-active); + color: var(--feather-button-color); +} +.Button[disabled], +.Button.is-disabled, +fieldset[disabled] .Button { + background-color: var(--feather-button-background-color); + border-color: var(--feather-button-border-color); + box-shadow: none; +} +.Button.Button--primary, +.Button.Button--primary:visited, +.ButtonGroup--primary > .Button, +.ButtonGroup--primary > .Button:visited { + background-color: var(--feather-button-primary-background-color); + border: 1px solid var(--feather-button-primary-border-color); + color: var(--feather-button-primary-color); +} +.Button.Button--primary:focus, +.Button.Button--primary.is-focus, +.ButtonGroup--primary > .Button:focus, +.ButtonGroup--primary > .Button.is-focus { + background: var(--feather-button-primary-background-color); + border-color: var(--feather-button-primary-border-color); + color: var(--feather-button-primary-color); +} +.Button.Button--primary:focus:not(.is-mouseFocus), +.Button.Button--primary.is-focus:not(.is-mouseFocus), +.ButtonGroup--primary > .Button:focus:not(.is-mouseFocus), +.ButtonGroup--primary > .Button.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px white, 0 0 0 3px var(--feather-button-primary-outline-color-focus), 0 0 2px 3px var(--feather-button-primary-outline-color-focus); +} +.u-featherBackgroundDark .Button.Button--primary:focus:not(.is-mouseFocus), +.u-featherBackgroundDark .Button.Button--primary.is-focus:not(.is-mouseFocus), +.u-featherBackgroundDark .ButtonGroup--primary > .Button:focus:not(.is-mouseFocus), +.u-featherBackgroundDark .ButtonGroup--primary > .Button.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px black, 0 0 0 3px var(--feather-button-primary-outline-color-focus), 0 0 2px 3px var(--feather-button-primary-outline-color-focus); +} +.Button.Button--primary:hover, +.Button.Button--primary.is-hover, +.ButtonGroup--primary > .Button:hover, +.ButtonGroup--primary > .Button.is-hover { + background-color: var(--feather-button-primary-background-color-hover); + border-color: var(--feather-button-primary-border-color-hover); + color: var(--feather-button-primary-color); +} +.Button.Button--primary:active, +.Button.Button--primary.is-active, +.ButtonGroup--primary > .Button:active, +.ButtonGroup--primary > .Button.is-active { + background-color: var(--feather-button-primary-background-color-active); + border-color: var(--feather-button-primary-border-color-active); + color: var(--feather-button-primary-color); +} +.Button.Button--primary[disabled], +.Button.Button--primary.is-disabled, +fieldset[disabled] .Button.Button--primary, +.ButtonGroup--primary > .Button[disabled], +.ButtonGroup--primary > .Button.is-disabled, +fieldset[disabled] .ButtonGroup--primary > .Button { + background-color: var(--feather-button-primary-background-color); + border-color: var(--feather-button-primary-border-color); + box-shadow: none; +} +.Button.Button--brandPrimary, +.Button.Button--brandPrimary:visited { + background-color: var(--feather-button-brand-primary-background-color); + border: 1px solid var(--feather-button-brand-primary-border-color); + color: var(--feather-button-brand-primary-color); +} +.Button.Button--brandPrimary:focus, +.Button.Button--brandPrimary.is-focus { + background: var(--feather-button-brand-primary-background-color); + border-color: var(--feather-button-brand-primary-border-color); + color: var(--feather-button-brand-primary-color); +} +.Button.Button--brandPrimary:focus:not(.is-mouseFocus), +.Button.Button--brandPrimary.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px white, 0 0 0 3px var(--feather-button-brand-primary-outline-color-focus), 0 0 2px 3px var(--feather-button-brand-primary-outline-color-focus); +} +.u-featherBackgroundDark .Button.Button--brandPrimary:focus:not(.is-mouseFocus), +.u-featherBackgroundDark .Button.Button--brandPrimary.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px black, 0 0 0 3px var(--feather-button-brand-primary-outline-color-focus), 0 0 2px 3px var(--feather-button-brand-primary-outline-color-focus); +} +.Button.Button--brandPrimary:hover, +.Button.Button--brandPrimary.is-hover { + background-color: var(--feather-button-brand-primary-background-color-hover); + border-color: var(--feather-button-brand-primary-border-color-hover); + color: var(--feather-button-brand-primary-color); +} +.Button.Button--brandPrimary:active, +.Button.Button--brandPrimary.is-active { + background-color: var(--feather-button-brand-primary-background-color-active); + border-color: var(--feather-button-brand-primary-border-color-active); + color: var(--feather-button-brand-primary-color); +} +.Button.Button--brandPrimary[disabled], +.Button.Button--brandPrimary.is-disabled, +fieldset[disabled] .Button.Button--brandPrimary { + background-color: var(--feather-button-brand-primary-background-color); + border-color: var(--feather-button-brand-primary-border-color); + box-shadow: none; +} +.Button.Button--dangerPrimary, +.Button.Button--danger, +.Button.Button--dangerPrimary:visited, +.Button.Button--danger:visited { + background-color: var(--feather-button-danger-primary-background-color); + border: 1px solid var(--feather-button-danger-primary-border-color); + color: var(--feather-button-danger-primary-color); +} +.Button.Button--dangerPrimary:focus, +.Button.Button--danger:focus, +.Button.Button--dangerPrimary.is-focus, +.Button.Button--danger.is-focus { + background: var(--feather-button-danger-primary-background-color); + border-color: var(--feather-button-danger-primary-border-color); + color: var(--feather-button-danger-primary-color); +} +.Button.Button--dangerPrimary:focus:not(.is-mouseFocus), +.Button.Button--danger:focus:not(.is-mouseFocus), +.Button.Button--dangerPrimary.is-focus:not(.is-mouseFocus), +.Button.Button--danger.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px white, 0 0 0 3px var(--feather-button-danger-primary-outline-color-focus), 0 0 2px 3px var(--feather-button-danger-primary-outline-color-focus); +} +.u-featherBackgroundDark .Button.Button--dangerPrimary:focus:not(.is-mouseFocus), +.u-featherBackgroundDark .Button.Button--danger:focus:not(.is-mouseFocus), +.u-featherBackgroundDark .Button.Button--dangerPrimary.is-focus:not(.is-mouseFocus), +.u-featherBackgroundDark .Button.Button--danger.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px black, 0 0 0 3px var(--feather-button-danger-primary-outline-color-focus), 0 0 2px 3px var(--feather-button-danger-primary-outline-color-focus); +} +.Button.Button--dangerPrimary:hover, +.Button.Button--danger:hover, +.Button.Button--dangerPrimary.is-hover, +.Button.Button--danger.is-hover { + background-color: var(--feather-button-danger-primary-background-color-hover); + border-color: var(--feather-button-danger-primary-border-color-hover); + color: var(--feather-button-danger-primary-color); +} +.Button.Button--dangerPrimary:active, +.Button.Button--danger:active, +.Button.Button--dangerPrimary.is-active, +.Button.Button--danger.is-active { + background-color: var(--feather-button-danger-primary-background-color-active); + border-color: var(--feather-button-danger-primary-border-color-active); + color: var(--feather-button-danger-primary-color); +} +.Button.Button--dangerPrimary[disabled], +.Button.Button--danger[disabled], +.Button.Button--dangerPrimary.is-disabled, +.Button.Button--danger.is-disabled, +fieldset[disabled] .Button.Button--dangerPrimary, +fieldset[disabled] .Button.Button--danger { + background-color: var(--feather-button-danger-primary-background-color); + border-color: var(--feather-button-danger-primary-border-color); + box-shadow: none; +} +.Button.Button--dangerSecondary, +.Button.Button--dangerSecondary:visited { + background-color: var(--feather-button-danger-secondary-background-color); + border: 1px solid var(--feather-button-danger-secondary-border-color); + color: var(--feather-button-danger-secondary-color); +} +.Button.Button--dangerSecondary:focus, +.Button.Button--dangerSecondary.is-focus { + background: var(--feather-button-danger-secondary-background-color); + border-color: var(--feather-button-danger-secondary-border-color); + color: var(--feather-button-danger-secondary-color); +} +.Button.Button--dangerSecondary:focus:not(.is-mouseFocus), +.Button.Button--dangerSecondary.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px white, 0 0 0 3px var(--feather-button-danger-secondary-outline-color-focus), 0 0 2px 3px var(--feather-button-danger-secondary-outline-color-focus); +} +.u-featherBackgroundDark .Button.Button--dangerSecondary:focus:not(.is-mouseFocus), +.u-featherBackgroundDark .Button.Button--dangerSecondary.is-focus:not(.is-mouseFocus) { + box-shadow: 0 0 0 1px black, 0 0 0 3px var(--feather-button-danger-secondary-outline-color-focus), 0 0 2px 3px var(--feather-button-danger-secondary-outline-color-focus); +} +.Button.Button--dangerSecondary:hover, +.Button.Button--dangerSecondary.is-hover { + background-color: var(--feather-button-danger-secondary-background-color-hover); + border-color: var(--feather-button-danger-secondary-border-color-hover); + color: var(--feather-button-danger-secondary-color); +} +.Button.Button--dangerSecondary:active, +.Button.Button--dangerSecondary.is-active { + background-color: var(--feather-button-danger-secondary-background-color-active); + border-color: var(--feather-button-danger-secondary-border-color-active); + color: var(--feather-button-danger-secondary-color); +} +.Button.Button--dangerSecondary[disabled], +.Button.Button--dangerSecondary.is-disabled, +fieldset[disabled] .Button.Button--dangerSecondary { + background-color: var(--feather-button-danger-secondary-background-color); + border-color: var(--feather-button-danger-secondary-border-color); + box-shadow: none; +} +.Button.Button--link { + padding-left: 0; + padding-right: 0; + background: transparent; + border: none; + border-radius: var(--feather-form-control-default-border-radius); + box-shadow: none; + color: var(--feather-button-link-color); + cursor: pointer; + font-family: var(--feather-font-family-base); + font-weight: var(--feather-button-link-font-weight); + text-decoration: underline; + text-decoration-thickness: var(--feather-space-1); + text-underline-offset: var(--feather-space-4); +} +.Button.Button--link:hover, +.Button.Button--link.is-hover, +.Button.Button--link:focus, +.Button.Button--link.is-focus, +.Button.Button--link:active, +.Button.Button--link.is-active, +.Button.Button--link.is-focus.is-active, +.Button.Button--link:focus:active:not(.is-mouseFocus), +.u-featherBackgroundDark .Button.Button--link:hover, +.u-featherBackgroundDark .Button.Button--link.is-hover, +.u-featherBackgroundDark .Button.Button--link:focus, +.u-featherBackgroundDark .Button.Button--link.is-focus, +.u-featherBackgroundDark .Button.Button--link:active, +.u-featherBackgroundDark .Button.Button--link.is-active, +.u-featherBackgroundDark .Button.Button--link.is-focus.is-active, +.u-featherBackgroundDark .Button.Button--link:focus:active:not(.is-mouseFocus) { + background: transparent; + border-color: transparent; + color: var(--feather-button-link-color); + text-decoration: underline; + text-decoration-thickness: var(--feather-space-2); +} +.Button.Button--link[disabled], +.Button.Button--link.is-disabled, +fieldset[disabled] .Button.Button--link { + cursor: default; + opacity: 0.5; + text-decoration: underline; + text-decoration-thickness: var(--feather-space-1); +} +.Button.Button--dangerLink { + padding-left: 0; + padding-right: 0; + background: transparent; + border: none; + border-radius: var(--feather-form-control-default-border-radius); + box-shadow: none; + color: var(--feather-button-danger-link-color); + cursor: pointer; + font-family: var(--feather-font-family-base); + font-weight: var(--feather-button-link-font-weight); + text-decoration: underline; + text-decoration-thickness: var(--feather-space-1); + text-underline-offset: var(--feather-space-4); +} +.Button.Button--dangerLink:hover, +.Button.Button--dangerLink.is-hover, +.Button.Button--dangerLink:focus, +.Button.Button--dangerLink.is-focus, +.Button.Button--dangerLink:active, +.Button.Button--dangerLink.is-active, +.Button.Button--dangerLink.is-focus.is-active, +.Button.Button--dangerLink:focus:active:not(.is-mouseFocus), +.u-featherBackgroundDark .Button.Button--dangerLink:hover, +.u-featherBackgroundDark .Button.Button--dangerLink.is-hover, +.u-featherBackgroundDark .Button.Button--dangerLink:focus, +.u-featherBackgroundDark .Button.Button--dangerLink.is-focus, +.u-featherBackgroundDark .Button.Button--dangerLink:active, +.u-featherBackgroundDark .Button.Button--dangerLink.is-active, +.u-featherBackgroundDark .Button.Button--dangerLink.is-focus.is-active, +.u-featherBackgroundDark .Button.Button--dangerLink:focus:active:not(.is-mouseFocus) { + background: transparent; + border-color: transparent; + color: var(--feather-button-danger-link-color); + text-decoration: underline; + text-decoration-thickness: var(--feather-space-2); +} +.Button.Button--dangerLink[disabled], +.Button.Button--dangerLink.is-disabled, +fieldset[disabled] .Button.Button--dangerLink { + cursor: default; + opacity: 0.5; + text-decoration: underline; + text-decoration-thickness: var(--feather-space-1); +} +/* Sizes */ +.Button { + padding: 0 var(--feather-space-16); + border-radius: var(--feather-form-control-default-height); + font-size: var(--feather-form-control-default-font-size); + height: var(--feather-form-control-default-height); + line-height: calc(var(--feather-form-control-default-height) - (var(--feather-border-width-small-experimental) * 2)); +} +.Button--xsmall, +.ButtonGroup--xsmall > .Button { + padding: 0 var(--feather-space-12); + border-radius: var(--feather-form-control-xsmall-height); + font-size: var(--feather-font-size-subtext-1); + height: var(--feather-form-control-xsmall-height); + line-height: calc(var(--feather-form-control-xsmall-height) - (var(--feather-border-width-small-experimental) * 2)); +} +.Button--small, +.ButtonGroup--small > .Button { + padding: 0 var(--feather-space-16); + border-radius: var(--feather-form-control-small-height); + font-size: var(--feather-font-size-subtext-1); + height: var(--feather-form-control-small-height); + line-height: calc(var(--feather-form-control-small-height) - (var(--feather-border-width-small-experimental) * 2)); +} +.Button--large, +.ButtonGroup--large > .Button { + padding: 0 var(--feather-space-24); + border-radius: var(--feather-form-control-large-height); + font-size: var(--feather-font-size-body); + height: var(--feather-form-control-large-height); + line-height: calc(var(--feather-form-control-large-height) - (var(--feather-border-width-small-experimental) * 2)); +} + diff --git a/static/css/feather-core.css b/assets/css/_feather-core.scss similarity index 52% rename from static/css/feather-core.css rename to assets/css/_feather-core.scss index 31cd2dde2..2e7750ba0 100644 --- a/static/css/feather-core.css +++ b/assets/css/_feather-core.scss @@ -1,182 +1,5 @@ -/*! @twitter/feather-core v2.8.0 */ - -/* -DO NOT EDIT. -This is auto-generated with `npm run dist`. -Edit `src/js/core.js` instead. -*/ - -:root { - /* Colors */ - --tw-color-blue-primary: #1da1f2; - --tw-color-text-primary: #14171a; - --tw-color-text-link: #1b95e0; - --tw-color-gray-deep: #657786; - --tw-color-gray-medium: #aab8c2; - --tw-color-gray-light: #ccd6dd; - --tw-color-gray-faded: #e6ecf0; - --tw-color-gray-faint: #f5f8fa; - --tw-color-red-deep: #a01744; - --tw-color-red-medium: #e0245e; - --tw-color-red-light: #f6809a; - --tw-color-red-faded: #ffb8c2; - --tw-color-orange-deep: #d82e18; - --tw-color-orange-medium: #f45d22; - --tw-color-orange-light: #ff8d57; - --tw-color-orange-faded: #ffbe78; - --tw-color-yellow-deep: #f98e00; - --tw-color-yellow-medium: #ffad1f; - --tw-color-yellow-light: #ffd03f; - --tw-color-yellow-faded: #ffe76e; - --tw-color-green-deep: #008951; - --tw-color-green-medium: #17bf63; - --tw-color-green-light: #68e090; - --tw-color-green-faded: #a5f2aa; - --tw-color-blue-deep: #005fd1; - --tw-color-blue-medium: #1da1f2; - --tw-color-blue-light: #71c9f8; - --tw-color-blue-faded: #97e3ff; - --tw-color-blue-faint: #eaf5fd; - --tw-color-purple-deep: #4f0299; - --tw-color-purple-medium: #794bc4; - --tw-color-purple-light: #a37ced; - --tw-color-purple-faded: #c7b4fa; - /* Form controls */ - --feather-form-control-xsmall-font-size: 0.6rem; - --feather-form-control-xsmall-height: 1rem; - --feather-form-control-xsmall-border-radius: 0.2rem; - --feather-form-control-xsmall-padding-x: 0.4rem; - --feather-form-control-xsmall-adornment-margin: 0.2rem; - --feather-form-control-small-font-size: 0.6rem; - --feather-form-control-small-height: 1.2rem; - --feather-form-control-small-border-radius: 0.2rem; - --feather-form-control-small-padding-x: 0.4rem; - --feather-form-control-small-adornment-margin: 0.2rem; - --feather-form-control-default-font-size: 0.7rem; - --feather-form-control-default-height: 1.6rem; - --feather-form-control-default-border-radius: 0.2rem; - --feather-form-control-default-padding-x: 0.6rem; - --feather-form-control-default-adornment-margin: 0.3rem; - --feather-form-control-large-font-size: 0.8rem; - --feather-form-control-large-height: 2rem; - --feather-form-control-large-border-radius: 0.2rem; - --feather-form-control-large-padding-x: 0.8rem; - --feather-form-control-large-adornment-margin: 0.4rem; - /* Grid */ - --feather-grid-micro: 0.2rem; - --feather-grid-xxsmall: 0.4rem; - --feather-grid-xsmall: 0.6rem; - --feather-grid-small: 0.8rem; - --feather-grid-medium: 1rem; - --feather-grid-large: 1.2rem; - --feather-grid-mega: 2rem; - --feather-grid-baseline-gap: 8px; - --feather-grid-column-gap: 20px; - --feather-grid-column-width: 78px; - --feather-grid-column-count: 12; - --feather-grid-page-width: 1156px; - /* Typography */ - --feather-font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; - --feather-font-family-monospace: Menlo, Monaco, Consolas, 'Courier New', monospace; - --feather-font-size-jumbo: 1.2rem; - --feather-line-height-jumbo: 1.6rem; - --feather-font-size-xlarge: 1rem; - --feather-line-height-xlarge: 1.4rem; - --feather-font-size-large: 0.8rem; - --feather-line-height-large: 1.2rem; - --feather-font-size-normal: 0.7rem; - --feather-line-height-normal: 1rem; - --feather-font-size-small: 0.6rem; - --feather-line-height-small: 0.8rem; - --feather-font-weight-normal: 400; - --feather-font-weight-bold: 700; - --feather-text-jumbo: { - font-size: 1.2rem; - line-height: 1.6rem; - } - --feather-text-xlarge: { - font-size: 1rem; - line-height: 1.4rem; - } - --feather-text-large: { - font-size: 0.8rem; - line-height: 1.2rem; - } - --feather-text-normal: { - font-size: 0.7rem; - line-height: 1rem; - } - --feather-text-small: { - font-size: 0.6rem; - line-height: 0.8rem; - } - --feather-text-small-caps: { - font-weight: 700; - letter-spacing: 0.025rem; - text-transform: uppercase; - font-size: 0.6rem; - line-height: 0.8rem; - } - --feather-h1: { - font-weight: 700; - font-size: 1.2rem; - line-height: 1.6rem; - } - --feather-h2: { - font-weight: 700; - font-size: 1rem; - line-height: 1.4rem; - } - --feather-h3: { - font-weight: 700; - font-size: 0.8rem; - line-height: 1.2rem; - } -} -/* Typography Classes */ -.feather-text-jumbo { - font-size: 1.2rem; - line-height: 1.6rem; -} -.feather-text-xlarge { - font-size: 1rem; - line-height: 1.4rem; -} -.feather-text-large { - font-size: 0.8rem; - line-height: 1.2rem; -} -.feather-text-normal { - font-size: 0.7rem; - line-height: 1rem; -} -.feather-text-small { - font-size: 0.6rem; - line-height: 0.8rem; -} -.feather-text-small-caps { - font-weight: 700; - letter-spacing: 0.025rem; - text-transform: uppercase; - font-size: 0.6rem; - line-height: 0.8rem; -} -.feather-h1 { - font-weight: 700; - font-size: 1.2rem; - line-height: 1.6rem; -} -.feather-h2 { - font-weight: 700; - font-size: 1rem; - line-height: 1.4rem; -} -.feather-h3 { - font-weight: 700; - font-size: 0.8rem; - line-height: 1.2rem; -} -/*! Copyright 2019 Twitter Inc. All rights reserved. */ +/*! @twitter/feather-core v6.2.0 */ +/*! Copyright 2022 Twitter Inc. All rights reserved. */ /* @generated */ /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ /* Document @@ -697,173 +520,485 @@ fieldset { } /* DO NOT EDIT. -This is auto-generated with `npm run dist`. -Edit `src/js/core.js` instead. +You can rebuild this file by running `yarn dist-js` in `feather-source`. +The content of this file is derived from feather-core. */ +:root { + /* Border radii */ + --feather-border-radius-none-experimental: 0px; + --feather-border-radius-xsmall-experimental: 2px; + --feather-border-radius-small-experimental: 4px; + --feather-border-radius-medium-experimental: 8px; + --feather-border-radius-large-experimental: 12px; + --feather-border-radius-xlarge-experimental: 16px; + --feather-border-radius-infinite-experimental: 9999px; + /* Border widths */ + --feather-border-width-none-experimental: 0px; + --feather-border-width-small-experimental: 1px; + --feather-border-width-medium-experimental: 2px; + --feather-border-width-large-experimental: 4px; + /* Breakpoints (private variables for internal Feather use only) */ + --feather-breakpoint-xsmall-experimental: 0px; + --feather-breakpoint-small-experimental: 600px; + --feather-breakpoint-medium-experimental: 1024px; + --feather-breakpoint-large-experimental: 1280px; + --feather-breakpoint-xlarge-experimental: 1920px; + /* Colors */ + --tw-color-gray-deep: #536471; + --tw-color-gray-medium: #B9CAD3; + --tw-color-gray-light: #CFD9DE; + --tw-color-gray-faded: #EFF3F4; + --tw-color-gray-faint: #F7F9F9; + --tw-color-red-deep: #D11A28; + --tw-color-red-medium: #F4212E; + --tw-color-red-light: #F87580; + --tw-color-red-faded: #FB9FA8; + --tw-color-orange-deep: #D86000; + --tw-color-orange-medium: #FF7A00; + --tw-color-orange-light: #FFAD61; + --tw-color-orange-faded: #FFC692; + --tw-color-yellow-deep: #DCAB00; + --tw-color-yellow-medium: #FFD400; + --tw-color-yellow-light: #FFEB6B; + --tw-color-yellow-faded: #FFF595; + --tw-color-green-deep: #009C64; + --tw-color-green-medium: #00BA7C; + --tw-color-green-light: #61D6A3; + --tw-color-green-faded: #92E3BF; + --tw-color-blue-deep: #0083EB; + --tw-color-blue-medium: #1D9BF0; + --tw-color-blue-light: #6BC9FB; + --tw-color-blue-faded: #97E3FF; + --tw-color-blue-faint: #EAFAFF; + --tw-color-purple-deep: #6545DB; + --tw-color-purple-medium: #7856FF; + --tw-color-purple-light: #AC97FF; + --tw-color-purple-faded: #C5B7FF; + --tw-color-blue-0: #EAFAFF; + --tw-color-blue-50: #D7F6FF; + --tw-color-blue-100: #BFF2FF; + --tw-color-blue-200: #97E3FF; + --tw-color-blue-300: #6BC9FB; + --tw-color-blue-500: #1D9BF0; + --tw-color-blue-600: #0083EB; + --tw-color-blue-900: #003886; + --tw-color-gray-0: #F7F9F9; + --tw-color-gray-50: #EFF3F4; + --tw-color-gray-100: #E5EAEC; + --tw-color-gray-200: #CFD9DE; + --tw-color-gray-300: #B9CAD3; + --tw-color-gray-500: #829AAB; + --tw-color-gray-700: #536471; + --tw-color-gray-900: #37434D; + --tw-color-gray-1100: #0F1419; + --tw-color-green-0: #EDFFF9; + --tw-color-green-50: #DBF8EB; + --tw-color-green-100: #C2F1DC; + --tw-color-green-200: #92E3BF; + --tw-color-green-300: #61D6A3; + --tw-color-green-500: #00BA7C; + --tw-color-green-600: #009C64; + --tw-color-green-900: #004329; + --tw-color-magenta-0: #FFF1F8; + --tw-color-magenta-50: #FFDDED; + --tw-color-magenta-100: #FEC7E1; + --tw-color-magenta-200: #FD9BC9; + --tw-color-magenta-300: #FB70B0; + --tw-color-magenta-500: #F91880; + --tw-color-magenta-600: #D4136D; + --tw-color-magenta-900: #640533; + --tw-color-orange-0: #FEF5EC; + --tw-color-orange-50: #FFEDDB; + --tw-color-orange-100: #FFE0C2; + --tw-color-orange-200: #FFC692; + --tw-color-orange-300: #FFAD61; + --tw-color-orange-500: #FF7A00; + --tw-color-orange-600: #D86000; + --tw-color-orange-900: #692100; + --tw-color-plum-0: #FFEFFF; + --tw-color-plum-50: #FAE0FA; + --tw-color-plum-100: #F4CDF5; + --tw-color-plum-200: #E9A7EB; + --tw-color-plum-300: #DF82E0; + --tw-color-plum-500: #C936CC; + --tw-color-plum-600: #AB2BAE; + --tw-color-plum-900: #520B53; + --tw-color-purple-0: #F5F3FF; + --tw-color-purple-50: #ECE8FF; + --tw-color-purple-100: #DFD8FF; + --tw-color-purple-200: #C5B7FF; + --tw-color-purple-300: #AC97FF; + --tw-color-purple-500: #7856FF; + --tw-color-purple-600: #6545DB; + --tw-color-purple-900: #2C116E; + --tw-color-red-0: #FFF0F1; + --tw-color-red-50: #FEDEE3; + --tw-color-red-100: #FDC9CE; + --tw-color-red-200: #FB9FA8; + --tw-color-red-300: #F87580; + --tw-color-red-500: #F4212E; + --tw-color-red-600: #D11A28; + --tw-color-red-900: #67070F; + --tw-color-teal-0: #E9FEFF; + --tw-color-teal-50: #D1F8FA; + --tw-color-teal-100: #B3F1F4; + --tw-color-teal-200: #78E4E8; + --tw-color-teal-300: #3CD6DD; + --tw-color-teal-500: #00AFB6; + --tw-color-teal-600: #009399; + --tw-color-teal-900: #003E42; + --tw-color-yellow-0: #FFFDEA; + --tw-color-yellow-50: #FFFED7; + --tw-color-yellow-100: #FFFEC0; + --tw-color-yellow-200: #FFF595; + --tw-color-yellow-300: #FFEB6B; + --tw-color-yellow-500: #FFD400; + --tw-color-yellow-600: #DCAB00; + --tw-color-yellow-900: #6F3E00; + --tw-color-blue-primary: #1D9BF0; + --tw-color-text-primary: #0F1419; + --tw-color-text-link: #0083EB; + /* Form controls */ + --feather-form-control-xsmall-font-size: 0.65rem; + --feather-form-control-xsmall-height: 1.2rem; + --feather-form-control-xsmall-border-radius: 8px; + --feather-form-control-xsmall-padding-x: 0.4rem; + --feather-form-control-xsmall-adornment-margin: 0.2rem; + --feather-form-control-small-font-size: 0.65rem; + --feather-form-control-small-height: 1.6rem; + --feather-form-control-small-border-radius: 8px; + --feather-form-control-small-padding-x: 0.6rem; + --feather-form-control-small-adornment-margin: 0.2rem; + --feather-form-control-default-font-size: 0.75rem; + --feather-form-control-default-height: 1.8rem; + --feather-form-control-default-border-radius: 8px; + --feather-form-control-default-padding-x: 0.6rem; + --feather-form-control-default-adornment-margin: 0.4rem; + --feather-form-control-large-font-size: 0.85rem; + --feather-form-control-large-height: 2.2rem; + --feather-form-control-large-border-radius: 8px; + --feather-form-control-large-padding-x: 0.6rem; + --feather-form-control-large-adornment-margin: 0.4rem; + /* Grid */ + --feather-grid-micro: 0.2rem; + --feather-grid-xxsmall: 0.4rem; + --feather-grid-xsmall: 0.6rem; + --feather-grid-small: 0.8rem; + --feather-grid-medium: 1rem; + --feather-grid-large: 1.2rem; + --feather-grid-mega: 2rem; + --feather-grid-baseline-gap: 8px; + --feather-grid-column-gap: 20px; + --feather-grid-column-width: 78px; + --feather-grid-page-width: 1156px; + /* Layout */ + --feather-layout-container-padding-x: 1.2rem; + --feather-layout-navigation-bar-height-experimental: 2.8rem; + --feather-layout-navigation-sidebar-width-experimental: 14rem; + /* Spaces */ + --feather-space-1: 1px; + --feather-space-2: 0.1rem; + --feather-space-4: 0.2rem; + --feather-space-6: 0.3rem; + --feather-space-8: 0.4rem; + --feather-space-12: 0.6rem; + --feather-space-16: 0.8rem; + --feather-space-20: 1rem; + --feather-space-24: 1.2rem; + --feather-space-28: 1.4rem; + --feather-space-32: 1.6rem; + --feather-space-36: 1.8rem; + --feather-space-40: 2rem; + --feather-space-48: 2.4rem; + --feather-space-64: 3.2rem; + --feather-space-80: 4rem; + /* Typography */ + --feather-font-family-base: TwitterChirp, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; + --feather-font-family-monospace: Menlo, Monaco, Consolas, 'Courier New', monospace; + --feather-font-size-root: 20px; + --feather-font-size-title-3: 1.3rem; + --feather-line-height-title-3: 1.6rem; + --feather-font-size-title-4: 1.15rem; + --feather-line-height-title-4: 1.4rem; + --feather-font-size-headline-1: 1rem; + --feather-line-height-headline-1: 1.2rem; + --feather-font-size-headline-2: 0.85rem; + --feather-line-height-headline-2: 1rem; + --feather-font-size-body: 0.75rem; + --feather-line-height-body: 1rem; + --feather-font-size-subtext-1: 0.7rem; + --feather-line-height-subtext-1: 0.8rem; + --feather-font-size-subtext-2: 0.65rem; + --feather-line-height-subtext-2: 0.8rem; + --feather-font-size-subtext-3: 0.55rem; + --feather-line-height-subtext-3: 0.6rem; + --feather-font-size-jumbo: 1.3rem; + --feather-line-height-jumbo: 1.6rem; + --feather-font-size-xlarge: 1.15rem; + --feather-line-height-xlarge: 1.4rem; + --feather-font-size-large: 1rem; + --feather-line-height-large: 1.2rem; + --feather-font-size-normal: 0.75rem; + --feather-line-height-normal: 1rem; + --feather-font-size-small: 0.65rem; + --feather-line-height-small: 0.8rem; + --feather-font-weight-normal: 400; + --feather-font-weight-medium: 500; + --feather-font-weight-bold: 700; + --feather-font-weight-heavy-experimental: 800; +} +/* Typography class names */ +.feather-text-title-3 { + font-size: var(--feather-font-size-title-3); + line-height: var(--feather-line-height-title-3); +} +.feather-text-title-4 { + font-size: var(--feather-font-size-title-4); + line-height: var(--feather-line-height-title-4); +} +.feather-text-headline-1 { + font-size: var(--feather-font-size-headline-1); + line-height: var(--feather-line-height-headline-1); +} +.feather-text-headline-2 { + font-size: var(--feather-font-size-headline-2); + line-height: var(--feather-line-height-headline-2); +} +.feather-text-body { + font-size: var(--feather-font-size-body); + line-height: var(--feather-line-height-body); +} +.feather-text-subtext-1 { + font-size: var(--feather-font-size-subtext-1); + line-height: var(--feather-line-height-subtext-1); +} +.feather-text-subtext-2 { + font-size: var(--feather-font-size-subtext-2); + line-height: var(--feather-line-height-subtext-2); +} +.feather-text-subtext-3 { + font-size: var(--feather-font-size-subtext-3); + line-height: var(--feather-line-height-subtext-3); +} .feather-text-jumbo { - font-size: 1.2rem; - line-height: 1.6rem; + font-size: var(--feather-font-size-jumbo); + line-height: var(--feather-line-height-jumbo); } .feather-text-xlarge { - font-size: 1rem; - line-height: 1.4rem; + font-size: var(--feather-font-size-xlarge); + line-height: var(--feather-line-height-xlarge); } .feather-text-large { - font-size: 0.8rem; - line-height: 1.2rem; + font-size: var(--feather-font-size-large); + line-height: var(--feather-line-height-large); } .feather-text-normal { - font-size: 0.7rem; - line-height: 1rem; + font-size: var(--feather-font-size-normal); + line-height: var(--feather-line-height-normal); } .feather-text-small { - font-size: 0.6rem; - line-height: 0.8rem; + font-size: var(--feather-font-size-small); + line-height: var(--feather-line-height-small); } .feather-text-small-caps { - font-weight: 700; + font-weight: var(--feather-font-weight-bold); letter-spacing: 0.025rem; text-transform: uppercase; - font-size: 0.6rem; - line-height: 0.8rem; + font-size: var(--feather-font-size-small); + line-height: var(--feather-line-height-small); +} +.feather-h1 { + font-weight: var(--feather-font-weight-bold); + font-size: var(--feather-font-size-title-3); + line-height: var(--feather-line-height-title-3); +} +.feather-h2 { + font-weight: var(--feather-font-weight-bold); + font-size: var(--feather-font-size-title-4); + line-height: var(--feather-line-height-title-4); +} +.feather-h3 { + font-weight: var(--feather-font-weight-bold); + font-size: var(--feather-font-size-headline-1); + line-height: var(--feather-line-height-headline-1); } /* -This is based on Edge icon CSS from macaw-swift. - -To add an icon: - -1. File a Feather ticket: http://go/feather/ticket -2. Someone on the core Feather team should request an icon: - http://go/iconrequest -3. When the icon has been added to the icon font, use the update steps below. - -To update icons: - -1. Get the icon font zip from http://go/iconfont . Copy the font files into - `src/fonts/`. -2. Copy icon CSS from here: - https://cgit.twitter.biz/source/tree/macaw-swift/web-resources/css/swift_css/components/icon.css -3. Run: - - cd feather-core/ - npm run normalize-icon-less - - This rewrites `edge-icons.less` to replace some macaw-swift-specific - variables with Feather variables. Review the changes, and manually preserve - any unwanted changes. -4. If any icons were deleted, revert the deletion and add a comment noting the - deprecation. Be sure to preserve colors for deprecated icons too. -5. In `feather-docs`, add new icons to `/icons` and `/docs/history`. -6. Check that these icon sizes match `src/lib/less/icons-px.less`. -*/ -/* -This is a set of Feather-specific overrides for `edge-icons.less`, giving us -access to the very latest icons that aren't yet deployed to Twitter.com[1]. - -To use the icons that aren't yet exposed on Twitter.com, Feather exposes them -here, but with `feather` in the class name to denote the difference. When they -land in Twitter.com and get official class names, these will be deprecated. - -[1]: https://cgit.twitter.biz/source/log/macaw-swift/web-resources/css/swift_css/components/icon.css +DO NOT EDIT. +You can rebuild this file by running `yarn dist-js` in `feather-source`. +The content of this file is derived from feather-core. */ +.feather-text-title-3 { + font-size: var(--feather-font-size-title-3); + line-height: var(--feather-line-height-title-3); +} +.feather-text-title-4 { + font-size: var(--feather-font-size-title-4); + line-height: var(--feather-line-height-title-4); +} +.feather-text-headline-1 { + font-size: var(--feather-font-size-headline-1); + line-height: var(--feather-line-height-headline-1); +} +.feather-text-headline-2 { + font-size: var(--feather-font-size-headline-2); + line-height: var(--feather-line-height-headline-2); +} +.feather-text-body { + font-size: var(--feather-font-size-body); + line-height: var(--feather-line-height-body); +} +.feather-text-subtext-1 { + font-size: var(--feather-font-size-subtext-1); + line-height: var(--feather-line-height-subtext-1); +} +.feather-text-subtext-2 { + font-size: var(--feather-font-size-subtext-2); + line-height: var(--feather-line-height-subtext-2); +} +.feather-text-subtext-3 { + font-size: var(--feather-font-size-subtext-3); + line-height: var(--feather-line-height-subtext-3); +} +.feather-text-jumbo { + font-size: var(--feather-font-size-jumbo); + line-height: var(--feather-line-height-jumbo); +} +.feather-text-xlarge { + font-size: var(--feather-font-size-xlarge); + line-height: var(--feather-line-height-xlarge); +} +.feather-text-large { + font-size: var(--feather-font-size-large); + line-height: var(--feather-line-height-large); +} +.feather-text-normal { + font-size: var(--feather-font-size-normal); + line-height: var(--feather-line-height-normal); +} +.feather-text-small { + font-size: var(--feather-font-size-small); + line-height: var(--feather-line-height-small); +} +.feather-text-small-caps { + font-weight: var(--feather-font-weight-bold); + letter-spacing: 0.025rem; + text-transform: uppercase; + font-size: var(--feather-font-size-small); + line-height: var(--feather-line-height-small); +} +@font-face { + font-family: 'TwitterChirp'; + src: url('https://abs.twimg.com/fonts/v2/chirp-regular-web.woff2') format('woff2'), url('https://abs.twimg.com/fonts/v2/chirp-regular-web.woff') format('woff'); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: 'TwitterChirp'; + src: url('https://abs.twimg.com/fonts/v2/chirp-medium-web.woff2') format('woff2'), url('https://abs.twimg.com/fonts/v2/chirp-medium-web.woff') format('woff'); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: 'TwitterChirp'; + src: url('https://abs.twimg.com/fonts/v2/chirp-bold-web.woff2') format('woff2'), url('https://abs.twimg.com/fonts/v2/chirp-bold-web.woff') format('woff'); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: 'TwitterChirp'; + src: url('https://abs.twimg.com/fonts/v2/chirp-heavy-web.woff2') format('woff2'), url('https://abs.twimg.com/fonts/v2/chirp-heavy-web.woff') format('woff'); + font-style: normal; + font-weight: 800; +} /* Feather-specific icons */ .Icon--arrowRight:before { - content: '\F114'; + content: '\f114'; } .Icon--featherAd:before { - content: '\F407'; + content: '\f407'; } .Icon--featherAdCampaign:before { - content: '\F405'; + content: '\f405'; } .Icon--featherAdGroup:before { - content: '\F406'; + content: '\f406'; } .Icon--featherAudience:before { - content: '\F408'; + content: '\f408'; } .Icon--featherCard:before { - content: '\F204'; + content: '\f204'; } .Icon--featherCircleCheck:before { - content: '\F043'; + content: '\f043'; } .Icon--featherCircleCheckFilled:before { - content: '\F220'; + content: '\f220'; } .Icon--featherCircleFail:before { - content: '\F044'; + content: '\f044'; } .Icon--featherCircleFailFilled:before { - content: "\F222"; + content: "\f222"; } .Icon--featherClone:before { - content: '\F214'; + content: '\f214'; } .Icon--featherCode:before { - content: '\F410'; + content: '\f410'; } .Icon--featherCurrency:before { - content: '\F403'; + content: '\f403'; } .Icon--featherDownload:before { - content: '\F186'; + content: '\f186'; } .Icon--featherDraggableGrip:before { - content: '\F206'; + content: '\f206'; } .Icon--featherFail:before { - content: '\F182'; + content: '\f221'; } .Icon--featherFilm:before { - content: '\F211'; + content: '\f211'; } .Icon--featherHistory:before { - content: '\F404'; + content: '\f404'; } .Icon--featherMegaphoneStroke:before { - content: '\F070'; + content: '\f070'; } .Icon--featherPhotoAlbum:before { - content: '\F109'; + content: '\f109'; } .Icon--featherPreview:before { - content: '\F216'; + content: '\f216'; } .Icon--featherReload:before { - content: '\F303'; + content: '\f303'; } .Icon--featherSignal:before { - content: '\F212'; + content: '\f212'; } .Icon--featherWarning:before { - content: '\F221'; + content: '\f182'; } .Icon--featherWebsiteVisit:before { - content: '\F213'; + content: '\f213'; } -/* DEPRECATED Feather-specific icons - -Please add deprecated icons in the following format: - -.Icon--featherFoo:before { ... } // Deprecated in Feather 1.1; use `Icon--bar` instead. -*/ +/* DEPRECATED Feather-specific icons */ /* Colors */ .Icon--featherWarning { - color: #ffad1f; + color: var(--tw-color-orange-500); } .Icon--featherFail { - color: #e0245e; + color: var(--tw-color-red-500); } -/** - * Tooltip cue is a fixed size and uses pure css (no Edge font-based icon). The - * selector includes `.Icon` to increase specificity. - */ .Icon.Icon--featherTooltipCue { position: relative; width: 0.7rem; height: 0.7rem; - background-color: #71c9f8; + background-color: var(--tw-color-blue-300); border-radius: 50%; vertical-align: middle; } @@ -877,21 +1012,16 @@ h2 .Icon.Icon--featherTooltipCue { width: 100%; color: white; content: '?'; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; + font-family: var(--feather-font-family-base); font-size: 0.5rem; font-weight: 700; line-height: 0; } .Icon.Icon--featherTooltipCue:hover, .Icon.Icon--featherTooltipCue:focus { - background-color: #1da1f2; + background-color: var(--tw-color-blue-500); cursor: pointer; } -/* -Rosetta-style loading indicators. Sources: -- https://cgit.twitter.biz/twitter/tree/macaw-swift/web-resources/img/t1 -- https://svn.twitter.biz/design/revenue/components/loading/ -*/ .Icon.Icon--loadingSmall { width: 0.7rem; height: 0.7rem; @@ -910,16 +1040,12 @@ Rosetta-style loading indicators. Sources: background: url(../images/spinner-rosetta-blue-32x32@2x.gif) 0 0 no-repeat; background-size: 1.6rem 1.6rem; } -/** - * Font-based icons - * For latest version of all images and their characters, see: - * https://confluence.twitter.biz/display/UI/Desktop+Web+-+Icon+Font - */ +/* Font-based icons */ @font-face { font-family: "edgeicons"; - src: url("../fonts/edge-icons-Regular.eot"); + src: url(../fonts/edge-icons-Regular.eot); /* IE9 Compat Modes */ - src: url("../fonts/edge-icons-Regular.eot?#iefix") format("embedded-opentype"), /* IE8 */ url("../fonts/edge-icons-Regular.woff") format("woff"), /* Modern Browsers */ url("../fonts/edge-icons-Regular.ttf") format("truetype"); + src: url(../fonts/edge-icons-Regular.eot?#iefix) format("embedded-opentype"), /* IE8 */ url(../fonts/edge-icons-Regular.woff) format("woff"), /* Modern Browsers */ url(../fonts/edge-icons-Regular.ttf) format("truetype"); /* Safari, Android, iOS */ } /* @@ -941,7 +1067,7 @@ Rosetta-style loading indicators. Sources: .Icon:after, .Icon:before { display: block; - font-family: "edgeicons"; + font-family: 'edgeicons'; font-weight: normal; font-style: normal; text-align: center; @@ -977,519 +1103,610 @@ Rosetta-style loading indicators. Sources: * Keep this list alphabetized */ .Icon--add:before { - content: "\F183"; + content: "\f183"; } .Icon--addLight:before { - content: "\F198"; + content: "\f198"; } /* Lighter version of the add icon */ .Icon--analytics:before { - content: "\F200"; + content: "\f200"; } .Icon--arrowDown:before { - content: "\F174"; + content: "\f174"; } .Icon--arrowLeft:before { - content: "\F114"; + content: "\f114"; /*@replace: initial*/ transform: scaleX(-1); } .Icon--arrowUp:before { - content: "\F188"; + content: "\f188"; } .Icon--atSymbol:before { - content: "\F050"; + content: "\f050"; } .Icon--attachFile:before { - content: "\F088"; + content: "\f088"; } .Icon--audioBadge:before { - content: "\F311"; + content: "\f311"; } .Icon--audioMuted:before { - content: "\F306"; + content: "\f306"; } .Icon--audioUnmuted:before { - content: "\F305"; + content: "\f305"; } .Icon--balloon:before { - content: "\F092"; + content: "\f092"; } .Icon--bird:before { - content: "\F179"; + content: "\f179"; } /* TODO: combine with Icon--logo */ .Icon--bookmark:before { - content: "\F155"; + content: "\f155"; } .Icon--calendar:before { - content: "\F203"; + content: "\f203"; } .Icon--camera:before { - content: "\F027"; + content: "\f027"; } .Icon--cameraPlus:before { - content: "\F111"; + content: "\f111"; } .Icon--cameraVideo:before { - content: "\F030"; + content: "\f030"; } .Icon--cards:before { - content: "\F402"; + content: "\f402"; } .Icon--caretDown:before { - content: "\F181"; -} -.Icon--caretDownLight:before { - content: "\F196"; + content: "\f181"; } .Icon--caretLeft:before { /*@replace: "\f173"*/ - content: "\F172"; + content: "\f172"; } .Icon--caretLeftLight:before { - content: "\F193"; + content: "\f193"; } .Icon--caretRight:before { /*@replace: "\f172"*/ - content: "\F173"; + content: "\f173"; } .Icon--caretRightLight:before { - content: "\F194"; + content: "\f194"; } .Icon--caretUp:before { - content: "\F181"; + content: "\f181"; transform: scaleY(-1); } -.Icon--caretUpLight:before { - content: "\F195"; -} .Icon--cart:before { - content: "\F095"; + content: "\f095"; } .Icon--check:before { - content: "\F170"; + content: "\f170"; } .Icon--checkLight:before { - content: "\F197"; + content: "\f197"; } /* Lighter version of the check icon */ .Icon--chevronDown:before { - content: "\F202"; + content: "\f202"; } .Icon--chevronUp:before { - content: "\F201"; + content: "\f201"; } .Icon--circleActiveAnalytics:before { - content: "\F516"; + content: "\f516"; } .Icon--circleActiveBird:before { - content: "\F520"; + content: "\f520"; } .Icon--circleActiveDm:before { - content: "\F517"; + content: "\f517"; } .Icon--circleActiveHeart:before { - content: "\F514"; + content: "\f514"; } .Icon--circleActiveList:before { - content: "\F518"; + content: "\f518"; } .Icon--circleActiveMe:before { - content: "\F519"; + content: "\f519"; } .Icon--circleActiveMore:before { - content: "\F515"; + content: "\f515"; } .Icon--circleActiveRetweet:before { - content: "\F512"; + content: "\f512"; } .Icon--circleActiveStar:before { - content: "\F513"; + content: "\f513"; } .Icon--circleError:before { - content: "\F042"; + content: "\f042"; } .Icon--circleMe:before { - content: "\F519"; + content: "\f519"; } .Icon--circleReply:before { - content: "\F511"; + content: "\f511"; } .Icon--clock:before { - content: "\F177"; + content: "\f177"; } .Icon--close:before { - content: "\F045"; + content: "\f045"; } .Icon--cog:before { - content: "\F059"; + content: "\f059"; } .Icon--cogWithCaret:before { - content: "\F124"; + content: "\f124"; } .Icon--collapseTweets:before { - content: "\F051"; + content: "\f051"; } .Icon--collections:before { - content: "\F008"; + content: "\f008"; } .Icon--conversation:before { - content: "\F157"; + content: "\f157"; } .Icon--cover:before { - content: "\F163"; + content: "\f163"; } .Icon--createMoment:before { - content: "\F162"; + content: "\f162"; } .Icon--creditCard:before { - content: "\F401"; + content: "\f401"; } .Icon--crescent:before { - content: "\F066"; + content: "\f066"; } .Icon--crescentFilled:before { - content: "\F567"; + content: "\f567"; } .Icon--crop:before { - content: "\F190"; + content: "\f190"; } .Icon--cvv:before { - content: "\F402"; + content: "\f402"; } .Icon--delete:before { - content: "\F154"; + content: "\f154"; } .Icon--deskBell:before { - content: "\F090"; + content: "\f090"; } .Icon--desktop:before { - content: "\F087"; + content: "\f087"; } .Icon--device:before { - content: "\F085"; + content: "\f085"; } .Icon--discover:before { - content: "\F052"; + content: "\f052"; } /* TODO: rename to Icon--hashtag */ .Icon--dm:before { - content: "\F054"; + content: "\f054"; } .Icon--dmCompose:before { - content: "\F035"; + content: "\f035"; } .Icon--dots:before { - content: "\F150"; + content: "\f150"; } .Icon--dotsVertical:before { - content: "\F149"; + content: "\f149"; } .Icon--download:before { - content: "\F186"; + content: "\f186"; } .Icon--editPencil:before { - content: "\F112"; + content: "\f112"; } .Icon--envelope:before { - content: "\F187"; + content: "\f187"; } .Icon--fail:before { - content: "\F000"; + content: "\f000"; } /* TODO: DESIGN-993 – create a dedicated fail icon */ .Icon--filter:before { - content: "\F138"; + content: "\f138"; } .Icon--follow:before { - content: "\F175"; + content: "\f175"; } .Icon--follower:before { - content: "\F002"; + content: "\f002"; } /* TODO: rename to Icon--followBadge */ .Icon--following:before { - content: "\F176"; + content: "\f176"; } .Icon--geo:before { - content: "\F031"; + content: "\f031"; } .Icon--geoBadge:before { - content: "\F010"; + content: "\f010"; } .Icon--gif:before { - content: "\F028"; + content: "\f028"; } .Icon--gifBadge:before { - content: "\F309"; + content: "\f309"; } .Icon--grid:before { - content: "\F046"; + content: "\f046"; } .Icon--handset:before { - content: "\F091"; + content: "\f091"; } .Icon--heart:before { - content: "\F148"; + content: "\f148"; } .Icon--heartBadge:before { - content: "\F015"; + content: "\f015"; } .Icon--home:before { - content: "\F053"; + content: "\f053"; } .Icon--homeFilled:before { - content: "\F553"; + content: "\f553"; } .Icon--horizontalBarChart:before { - content: "\F048"; + content: "\f048"; } .Icon--info:before { - content: "\F209"; + content: "\f209"; +} +.Icon--infoFilled:before { + content: "\f217"; } .Icon--imageCrop:before { - content: "\F158"; + content: "\f158"; +} +.Icon--laptop:before { + content: "\f084"; } .Icon--lifeline:before { - content: "\F026"; + content: "\f026"; } .Icon--lifelineBadge:before { - content: "\F000"; + content: "\f000"; +} +.Icon--lightBulbOn:before { + content: "\f066"; +} +.Icon--lightBulbOff:before { + content: "\f567"; } .Icon--lightning:before { - content: "\F160"; + content: "\f160"; } .Icon--lightningBadge:before { - content: "\F161"; + content: "\f161"; } .Icon--lightningFilled:before { - content: "\F017"; + content: "\f017"; } .Icon--list:before { - content: "\F094"; + content: "\f094"; } .Icon--listBadge:before { - content: "\F012"; + content: "\f012"; } .Icon--logo:before { - content: "\F179"; + content: "\f179"; } /* TODO: combine with Icon--bird */ .Icon--magicrecs:before { - content: "\F014"; + content: "\f014"; } .Icon--markAllRead:before { - content: "\F036"; + content: "\f036"; } .Icon--me:before { - content: "\F056"; + content: "\f056"; } /* TODO: rename to Icon--profile */ .Icon--meFilled:before { - content: "\F002"; + content: "\f002"; } /* TODO: rename to Icon--profileFilled */ .Icon--media:before { - content: "\F109"; + content: "\f109"; } .Icon--mediaCollapse:before { - content: "\F335"; + content: "\f335"; } .Icon--mediaDocking:before { - content: "\F336"; + content: "\f336"; } .Icon--mediaExpand:before { - content: "\F334"; + content: "\f334"; } .Icon--menu:before { - content: "\F093"; + content: "\f093"; } .Icon--message:before { - content: "\F054"; + content: "\f054"; } /* TODO: combine with Icon--dm */ .Icon--moderator:before { - content: "\F089"; + content: "\f089"; } .Icon--muted:before { - content: "\F101"; + content: "\f101"; } .Icon--newsBadge:before { - content: "\F009"; + content: "\f009"; } .Icon--notifications:before { - content: "\F055"; + content: "\f055"; } .Icon--notificationsFilled:before { - content: "\F019"; + content: "\f019"; } .Icon--notificationsDisabled:before { - content: "\F037"; + content: "\f037"; +} +.Icon--paintbrush:before { + content: "\f159"; } .Icon--pause:before { - content: "\F302"; + content: "\f302"; } .Icon--periscopeBadge:before { - content: "\F320"; + content: "\f320"; } .Icon--person:before { - content: "\F056"; + content: "\f056"; } .Icon--people:before { - content: "\F178"; -} -.Icon--photo:before { - content: "\F158"; + content: "\f178"; } .Icon--pinned:before { - content: "\F003"; + content: "\f003"; } .Icon--play:before { - content: "\F301"; -} -.Icon--political:before { - content: "\F004"; + content: "\f301"; } .Icon--poll:before { - content: "\F034"; + content: "\f034"; } .Icon--pollBar:before { - content: "\F199"; + content: "\f199"; } .Icon--promoted:before { - content: "\F004"; + content: "\f004"; } .Icon--promotedStroked:before { - content: "\F504"; + content: "\f504"; } .Icon--promotedTrend:before { - content: "\F011"; + content: "\f011"; } .Icon--promoteMode:before { - content: "\F409"; + content: "\f409"; } .Icon--protected:before { - content: "\F096"; + content: "\f096"; } .Icon--refresh:before { - content: "\F189"; + content: "\f189"; } .Icon--reply:before { - content: "\F151"; + content: "\f151"; } .Icon--report:before { - content: "\E609"; + content: "\e609"; } .Icon--retweet:before { - content: "\F152"; + content: "\f152"; } .Icon--retweeted:before { - content: "\F006"; + content: "\f006"; } /* TODO: rename to Icon--retweetBadge */ .Icon--search:before { - content: "\F058"; + content: "\f058"; } .Icon--share:before { - content: "\F185"; + content: "\f185"; } .Icon--smileRating1:before { - content: "\F430"; + content: "\f430"; } .Icon--smileRating1Fill:before { - content: "\F431"; + content: "\f431"; } .Icon--smileRating2:before { - content: "\F432"; + content: "\f432"; } .Icon--smileRating2Fill:before { - content: "\F433"; + content: "\f433"; } .Icon--smileRating3:before { - content: "\F434"; + content: "\f434"; } .Icon--smileRating3Fill:before { - content: "\F435"; + content: "\f435"; } .Icon--smileRating4:before { - content: "\F436"; + content: "\f436"; } .Icon--smileRating4Fill:before { - content: "\F437"; + content: "\f437"; } .Icon--smileRating5:before { - content: "\F438"; + content: "\f438"; } .Icon--smileRating5Fill:before { - content: "\F439"; + content: "\f439"; } .Icon--smiley:before { - content: "\F033"; + content: "\f033"; } .Icon--snapReelBadge:before { - content: "\F312"; + content: "\f312"; } .Icon--soundOff:before { - content: "\F306"; + content: "\f306"; } .Icon--soundOn:before { - content: "\F305"; + content: "\f305"; } .Icon--stickerBadge:before { - content: "\F047"; + content: "\f047"; } .Icon--summary:before { - content: "\F156"; + content: "\f156"; } .Icon--tablet:before { - content: "\F086"; + content: "\f086"; } .Icon--top:before { - content: "\F007"; + content: "\f007"; } .Icon--translator:before { - content: "\F089"; + content: "\f089"; } .Icon--truck:before { - content: "\F400"; + content: "\f400"; } .Icon--tweet:before { - content: "\F029"; + content: "\f029"; } /* TODO: rename to Icon--compose */ .Icon--unfollow:before { - content: "\F097"; + content: "\f097"; } .Icon--unmuted:before { - content: "\F101"; + content: "\f101"; } .Icon--url:before { - content: "\F098"; + content: "\f098"; } .Icon--vineBadge:before { - content: "\F310"; + content: "\f310"; } .Icon--visibilityFollowers:before { - content: "\F103"; + content: "\f103"; } .Icon--visibilityFollowing:before { - content: "\F105"; + content: "\f105"; } .Icon--visibilityMutual:before { - content: "\F104"; + content: "\f104"; } .Icon--visibilityOnlyMe:before { - content: "\F106"; + content: "\f106"; } .Icon--visibilityPublic:before { - content: "\F102"; + content: "\f102"; } .Icon--warning:before { - content: "\F182"; + content: "\f182"; } -.Icon--laptop:before { - content: "\F084"; +/** + * Design token icons + * + * These aren't available in macaw-swift. As of March 2022, see + * http://go/icon-svg and the `design-tokens` Git repository for the + * latest Twitter-wide icons. + */ +.Icon--app:before { + content: "\f413"; +} +.Icon--areaChart:before { + content: "\f422"; +} +.Icon--cloud:before { + content: "\f442"; +} +.Icon--codeBlock:before { + content: "\f411"; +} +.Icon--cube:before { + content: "\f450"; +} +.Icon--database:before { + content: "\f412"; +} +.Icon--dataCenter:before { + content: "\f414"; +} +.Icon--directedAcyclicGraph:before { + content: "\f419"; +} +.Icon--eyeOff:before { + content: "\f456"; +} +.Icon--flowChart:before { + content: "\f418"; +} +.Icon--folderClosed:before { + content: "\f444"; +} +.Icon--folderOpen:before { + content: "\f445"; +} +.Icon--heatMap:before { + content: "\f420"; +} +.Icon--helpCircle:before { + content: "\f039"; +} +.Icon--helpCircleFilled:before { + content: "\f208"; +} +.Icon--histogram:before { + content: "\f417"; +} +.Icon--lineChart:before { + content: "\f423"; +} +.Icon--network:before { + content: "\f443"; +} +.Icon--pyramid:before { + content: "\f451"; +} +.Icon--replyOff:before { + content: "\f457"; +} +.Icon--sankeyChart:before { + content: "\f415"; +} +.Icon--scatterPlot:before { + content: "\f416"; +} +.Icon--stackedAreaChart:before { + content: "\f424"; +} +.Icon--stackedLineChart:before { + content: "\f425"; +} +.Icon--tetrahedron:before { + content: "\f452"; +} +.Icon--thumbsDown:before { + content: "\f441"; +} +.Icon--thumbsUp:before { + content: "\f440"; +} +.Icon--treeHierarchy:before { + content: "\f421"; } /** * Stacked verified icon @@ -1500,15 +1717,15 @@ Rosetta-style loading indicators. Sources: * verified icon to be what gives the element width and height, not the fill. */ .Icon--verified:before { - content: "\F032"; - font-size: 0.7em; - left: 26%; + content: "\f032"; + font-size: 0.6em; + left: 20%; line-height: 1; position: absolute; - top: 20%; + top: 25%; } .Icon--verified:after { - content: "\F099"; + content: "\f099"; line-height: 1; position: relative; } @@ -1521,7 +1738,7 @@ Rosetta-style loading indicators. Sources: * be what gives the element width and height. */ .Icon--playButton:before { - content: "\F032"; + content: "\f032"; line-height: 1; position: absolute; top: 0; @@ -1531,7 +1748,7 @@ Rosetta-style loading indicators. Sources: opacity: 0.8; } .Icon--playButton:after { - content: "\F040"; + content: "\f040"; line-height: 1; position: relative; } @@ -1547,77 +1764,74 @@ Rosetta-style loading indicators. Sources: } /* Colors */ .Icon--fail { - color: #e0245e; + color: var(--tw-color-red-500); } .Icon--follower, .Icon--magicrecs, .Icon--colorLightning, .Icon--colorFollower { - color: #1da1f2; + color: var(--tw-color-blue-primary); } .Icon--lifelineBadge { - color: #d82e18; + color: var(--tw-color-orange-600); } .Icon--listBadge:before { - color: #657786; + color: var(--tw-color-gray-700); } .Icon--muted { - color: #e0245e; -} -.Icon--political { - color: #794bc4; + color: var(--tw-color-red-500); } .Icon--promoted { - color: #657786; + color: var(--tw-color-gray-700); } .Icon--promotedTrend { - color: #ffad1f; + color: var(--tw-color-yellow-500); } .Icon--protected { - color: #14171a; + color: var(--tw-color-text-primary); } .Icon--retweeted, .Icon--colorRetweeted { - color: #17bf63; + color: var(--tw-color-green-500); } .Icon--smiley { - color: #aab8c2; + color: var(--tw-color-gray-300); } .Icon--top { - color: #1da1f2; + color: var(--tw-color-blue-primary); } .Icon--translator { - color: #1da1f2; + color: var(--tw-color-blue-primary); } .Icon--moderator { - color: #ffad1f; + color: var(--tw-color-yellow-500); } .Icon--unmuted { - color: #ccd6dd; + color: var(--tw-color-gray-200); } .Icon--verified { - color: #1da1f2; + color: var(--tw-color-blue-primary); } .Icon--verified:before { color: white; } .Icon--circleActiveMe, .Icon--circleActiveBird { - color: #1da1f2; + color: var(--tw-color-blue-primary); } .Icon--colorHeart, .Icon--circleActiveHeart, .Icon--heartBadge { - color: #e0245e; + color: var(--tw-color-red-500); } .Icon--circleActiveRetweet { - color: #17bf63; + color: var(--tw-color-green-500); } .Icon--circleActiveList { - color: #657786; + color: var(--tw-color-gray-700); } .Icon--playButton { - color: #1da1f2; + color: var(--tw-color-blue-primary); } .Icon--playButton:after { color: white; @@ -1634,39 +1848,65 @@ Rosetta-style loading indicators. Sources: color: white; } .Icon--inverted.Icon--verified:before { - color: #14171a; + color: var(--tw-color-text-primary); +} +:root { + --feather-font-size-jumbo: var(--feather-font-size-title-3); + --feather-font-size-large: var(--feather-font-size-headline-1); + --feather-font-size-normal: var(--feather-font-size-body); + --feather-font-size-small: var(--feather-font-size-subtext-2); + --feather-font-size-xlarge: var(--feather-font-size-title-4); + --feather-line-height-jumbo: var(--feather-line-height-title-3); + --feather-line-height-large: var(--feather-line-height-headline-1); + --feather-line-height-normal: var(--feather-line-height-body); + --feather-line-height-small: var(--feather-line-height-subtext-2); + --feather-line-height-xlarge: var(--feather-line-height-title-4); } /* Body text */ html { font-size: 20px; } body { - color: #14171a; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; - font-size: 0.7rem; - line-height: 1rem; + color: var(--tw-color-text-primary); + font-family: var(--feather-font-family-base); + font-size: var(--feather-font-size-body); + line-height: var(--feather-line-height-body); } a { - color: #1b95e0; + color: var(--tw-color-text-link); text-decoration: none; } a:hover, a:focus { - color: #1b95e0; + color: var(--tw-color-text-link); text-decoration: underline; } p { - margin: 0 0 0.4rem; + margin: 0 0 var(--feather-space-8); } -ul, -ol { - margin: 0.4rem 0; - padding-left: 1.2rem; - list-style: disc; +ol, +ul { + margin: var(--feather-space-8) 0; + padding-left: var(--feather-space-24); } ol { list-style: decimal; } +ol ol { + list-style: lower-alpha; +} +ol ol ol { + list-style: lower-roman; +} +ul { + list-style: disc; +} +ul ul { + list-style: circle; +} +ul ul ul { + list-style: square; +} code, kbd, pre, @@ -1674,7 +1914,7 @@ samp { font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; } button { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; + font-family: var(--feather-font-family-base); line-height: inherit; } /* Headings */ @@ -1684,28 +1924,28 @@ h3, h4, h5, h6 { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; + font-family: var(--feather-font-family-base); } h1 { - font-weight: 700; - font-size: 1.2rem; - line-height: 1.6rem; + font-weight: var(--feather-font-weight-bold); + font-size: var(--feather-font-size-title-3); + line-height: var(--feather-line-height-title-3); } h2 { - font-weight: 700; - font-size: 1rem; - line-height: 1.4rem; + font-weight: var(--feather-font-weight-bold); + font-size: var(--feather-font-size-title-4); + line-height: var(--feather-line-height-title-4); } h3 { - font-weight: 700; - font-size: 0.8rem; - line-height: 1.2rem; + font-weight: var(--feather-font-weight-bold); + font-size: var(--feather-font-size-headline-1); + line-height: var(--feather-line-height-headline-1); } h4, h5, h6 { - font-size: 0.7rem; - line-height: 1rem; + font-size: var(--feather-font-size-body); + line-height: var(--feather-line-height-body); font-weight: 700; } /* Icons */ @@ -1727,4 +1967,5 @@ h6 { .Icon.Icon--verified::before { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; -} \ No newline at end of file +} + diff --git a/assets/css/_feather-custom.scss b/assets/css/_feather-custom.scss new file mode 100644 index 000000000..23f18eebf --- /dev/null +++ b/assets/css/_feather-custom.scss @@ -0,0 +1,16 @@ +@media (prefers-color-scheme: dark) { + // very basic support for dark mode until Feather supports this natively + :root { + --tw-color-text-primary: var(--tw-color-gray-0); + } + .Button { + --feather-button-background-color: var(--tw-color-gray-1100); + --feather-button-background-color-hover: var(--tw-color-gray-900); + --feather-button-border-color: var(--tw-color-gray-700); + + --feather-button-primary-background-color-active: var(--tw-color-gray-200); + --feather-button-primary-background-color: var(--tw-color-gray-0); + --feather-button-primary-background-color-hover: var(--tw-color-gray-100); + --feather-button-primary-color: var(--tw-color-gray-1100); + } +} diff --git a/assets/css/_main.scss b/assets/css/_main.scss new file mode 100644 index 000000000..f6e39d578 --- /dev/null +++ b/assets/css/_main.scss @@ -0,0 +1,336 @@ +/* Custom sizes */ + +:root { + --font-size-xxjumbo: 3.2rem; + --line-height-xxjumbo: 3.6rem; + --font-size-xjumbo: 2.2rem; + --line-height-xjumbo: 2.5rem; + --font-size-mini-jumbo: 1.6rem; + --line-height-mini-jumbo: 1.8rem; +} + +/* Animations */ + +@keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Firefox < 16 */ +@-moz-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Safari, Chrome and Opera > 12.1 */ +@-webkit-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Internet Explorer */ +@-ms-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Opera < 12.1 */ +@-o-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +html { + scroll-padding-top: 2.5rem; +} + +/* Containers */ + +body { + background-color: white; + display: flex; + min-height: 100vh; + flex-direction: column; + + @media (prefers-color-scheme: dark) { + background-color: var(--tw-color-gray-1100); + color: var(--tw-color-gray-faint); + } +} + +main { + flex: 1; +} + +.content { + padding: var(--feather-grid-mega) 0; +} +.section { + padding: calc(var(--feather-grid-mega) * 2) 0; +} + +.container { + max-width: var(--feather-grid-page-width); + margin: 0 auto; +} + + +// common styles across nav, header, and footer +nav, .header, .footer { + background-color: var(--tw-color-blue-primary); + color: white; + + @media (prefers-color-scheme: dark) { + background-color: black; + } + + a:not(.Button) { + color: white; + text-decoration: none; + + &:hover, &:active { + text-decoration: none; + color: var(--tw-color-blue-faded); + + @media (prefers-color-scheme: dark) { + color: var(--tw-color-gray-light); + } + } + } +} + +// Navigation +nav { + padding: var(--feather-grid-xsmall) var(--feather-grid-mega); + width: 100%; + position: fixed; + z-index: 2; + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.nav-title { + flex-shrink: 0; + + img { + height: 1.3em; + width: 1.3em; + vertical-align: bottom; + margin-right: var(--feather-grid-xxsmall); + } +} + +.home-link { + font-weight: var(--feather-font-weight-bold); +} + +#nav-menu { + margin: 0; + padding: 0; + li { + display: inline-block; + margin-left: var(--feather-grid-small); + } +} + +#menu-toggle { + display: none; +} + +// Navigation - mobile +@media (max-width: 650px) { + #nav-menu { + margin-top: var(--feather-grid-xxsmall); + } + html:not(.no-js) { + #menu-toggle { + display: block; + } + + #nav-menu { + display: none; + height: 100vh; + width: 100%; + margin: 0; + margin-top: calc(var(--feather-grid-mega) * 2); + animation: fadein 1.5s; + + li { + display: block; + font-weight: var(--feather-font-weight-bold); + font-size: var(--feather-font-size-jumbo); + line-height: var(--feather-line-height-jumbo); + padding: var(--feather-grid-medium) 0; + margin: 0; + &:not(:last-child) { + border-bottom: 1px solid var(--tw-color-blue-faded); + } + } + } + + #nav-menu.active { + display: block; + } + } +} + + +/* Headers */ + +.header, .footer { + padding: var(--feather-grid-mega) 0; +} + +.header { + padding-top: calc(var(--feather-grid-mega) * 3); +} + +.large-title { + font-size: var(--font-size-xxjumbo); + line-height: var(--line-height-xxjumbo); +} + +.subtitle { + margin: var(--feather-grid-large) 0; +} + +/* Footer */ + +@media (min-width: 800px) { + .footer .container { + display: flex; + flex-wrap: wrap; + } + + .footer .footer-cell { + flex: 1 1 25%; + } +} + +a.foot-link { + display: block; + line-height: var(--feather-line-height-xlarge); +} + +.footer-margin { + margin-bottom: calc(var(--feather-grid-mega) * 1.25); +} + +/* Margins */ + +.center-margin { + margin-left: auto; + margin-right: auto; +} + +.same-mega-margin { + margin-bottom: var(--feather-grid-mega); +} + +.mega-margin { + margin-bottom: var(--feather-grid-mega); +} + +.large-margin { + margin-bottom: var(--feather-grid-large); +} + +.medium-margin { + margin-bottom: var(--feather-grid-medium); +} + +.small-margin { + margin-bottom: var(--feather-grid-small); +} + +.xsmall-margin { + margin-bottom: var(--feather-grid-xsmall); +} + +/* Text */ + +body { + font-size: 0.8rem; // 16px + line-height: 1.5; // 24px +} + +h2 { + margin: 1.5em 0 0.5em; +} + +.center-text { + text-align: center; +} + +.small-title { + font-size: var(--font-size-xjumbo); + line-height: var(--line-height-xjumbo); +} + +br { + line-height: var(--feather-line-height-xlarge); +} + +pre { + font-size: 0.8em; + padding: 3px; +} + +.hide { + display: none; +} + +/* Media queries */ + +/* Less than --feather-grid-page-width + (--feather-grid-mega * 2) */ +@media (max-width: 1236px) { + .container { + margin: 0 var(--feather-grid-mega); + } + + .large-title { + font-size: var(--font-size-xjumbo); + line-height: var(--line-height-xjumbo); + } + + .small-title { + font-size: var(--font-size-mini-jumbo); + line-height: var(--line-height-mini-jumbo); + } + + .mega-margin { + margin-bottom: var(--feather-grid-large); + } + + .large-margin { + margin-bottom: var(--feather-grid-medium); + } + + .medium-margin { + margin-bottom: var(--feather-grid-small); + } +} + +@media (max-width: 800px) { + .footer-margin { + margin-bottom: var(--feather-grid-mega); + } +} + +/* Less than 600px */ +@media (max-width: 600px) { + .section { + padding: calc(var(--feather-grid-mega) * 1.5) 0; + } + + .container { + margin: 0 var(--feather-grid-medium); + } +} + +@media (max-width: 480px) { + .content, .section { + padding: var(--feather-grid-large) 0; + } +} diff --git a/assets/css/index.scss b/assets/css/index.scss new file mode 100644 index 000000000..97902472c --- /dev/null +++ b/assets/css/index.scss @@ -0,0 +1,130 @@ +/* Styles specific to home page */ + +.content { + padding: 0; +} + +.grey { + background-color: var(--tw-color-gray-faint); + + @media (prefers-color-scheme: dark) { + background-color: var(--tw-color-gray-1100); + color: white; + } +} + +.small-container { + max-width: calc(var(--feather-grid-page-width) - var(--feather-grid-mega) * 4); + margin: 0 auto; +} + +.twitter-timeline, .timeline-cell { + height: 500px; +} + + +@media (min-width: 600px) { + #follow-us .container { + display: flex; + flex-direction: row-reverse; + > div { + flex: 1 1 50%; + } + } + #open-source-text { + display: flex; + flex-direction: column; + justify-content: center; + } +} +.open-source-title a { + text-decoration: none; + &:link, &:visited { + color: inherit; + } + &:hover, &:active { + color: var(--tw-color-text-link); + } +} + + +/* Center text vertically */ + +#career-text { + text-align: center; +} +@media (min-width: 600px) { + #career .container { + display: flex; + > div { + flex: 1 1 50%; + } + } + #career-text { + text-align: left; + margin-top: 100px; + } +} + +/* Our Philosophy - images */ + +#emoji-cards { + display: flex; + flex-direction: column; + margin: auto; +} +.emoji-card { + padding: var(--feather-grid-large) var(--feather-grid-mega); + max-width: 600px; + margin: 0 auto; + flex: 1 1 33%; +} + +@media (min-width: 900px) { + #emoji-cards { + flex-direction: row; + } +} + +img.emoji-img { + display: block; + width: 175px; + height: 175px; +} + +/* Home page media queries */ + +/* Less than --feather-grid-page-width + (--feather-grid-mega * 2) */ +@media (max-width: 1236px) { + .home-header { + padding-bottom: calc(var(--feather-grid-mega) * 1.5); + } +} + +/* Explore Projects */ + +#explore-projects { + background-image: url("../assets/network.svg"); + background-repeat: no-repeat; + background-size: auto 380px; + background-position: bottom left 5vw; + + @media (min-width: 600px) { + background-position: bottom left 35vw; + } + @media (min-width: 1100px) { + background-position: bottom right; + } +} +.explore-text { + // space to display network graphic + margin-bottom: 320px; + + @media (min-width: 600px) { + margin-bottom: 0; + max-width: 35%; + } + @media (min-width: 1100px) { + max-width: 40%; + } +} diff --git a/assets/css/memberships.scss b/assets/css/memberships.scss new file mode 100644 index 000000000..f40ec63ee --- /dev/null +++ b/assets/css/memberships.scss @@ -0,0 +1,168 @@ +/* Styles specific to memberships page */ + +/* Logo sizes for membership cards */ + +:root { + --logo-size-normal: 80px; + --logo-size-small: 60px; +} + +/* Adjusts width and margins of membership-container */ + +.membership-container { + max-width: calc(var(--feather-grid-page-width) - var(--feather-grid-mega) * 3); + margin: 0 auto; +} + +/* Less than var(--feather-grid-page-width) - var(--feather-grid-mega) */ +@media (max-width: 1116px) { + .membership-container { + margin: 0 var(--feather-grid-mega); + } +} + +@media (max-width: 600px) { + .membership-container { + margin: 0 var(--feather-grid-medium); + } +} + +/* Membership card elements that are consistent throughout all screen sizes */ + +.membership { + padding: var(--feather-grid-large) 0; + border-top: solid 1px var(--tw-color-gray-light); + position: relative; + + &:first-child { + border-top: none; + } +} + +a.membership-handle:link, a.membership-handle:visited { + color: var(--tw-color-gray-deep); + font-size: var(--feather-font-size-normal); + line-height: var(--feather-line-height-normal); + text-decoration: none; +} + +a.membership-handle:hover, a.membership-handle:active { + color: var(--tw-color-text-link); +} + +.membership .Button { + position: absolute; + top: var(--feather-grid-large); + right: 0; +} + +/* Membership card layout: greater than 940px */ +/* Logo's position is absolute, and text content is shifted to the right using margins */ + +.name-handle { + width: 80%; +} + +.membership h2 { + margin: 0; + padding-bottom: var(--feather-grid-micro); +} + +.membership p { + padding-top: var(--feather-grid-xsmall); + margin-bottom: 0; +} + +.membership-logo { + position: absolute; + top: var(--feather-grid-large); + left: 0; + height: var(--logo-size-normal); + width: var(--logo-size-normal); /* will this distort image though */ +} + +.name-handle, .membership p { + margin-left: calc(var(--logo-size-normal) + var(--feather-grid-large)); +} + +/* Membership card layout: between 680px and 940px */ + +@media (max-width: 940px) { + .name-handle { + width: 70%; + } +} + +/* Membership card layout: less than 680px */ +/* Logo's position is static, and text is no longer shifted to the right with margins */ + +@media (max-width: 680px) { + .membership-logo, .name-handle { + position: static; + display: inline-block; + } + + .membership-logo { + height: var(--logo-size-small); + width: var(--logo-size-small); + } + + .name-handle { + margin-left: var(--feather-grid-large); + vertical-align: top; + } + + .membership p { + padding-top: var(--feather-grid-xxsmall); + margin-left: 0; + } +} + +/* Membership card layout: less than 620px */ + +@media (max-width: 620px) { + .name-handle { + width: 60%; + } +} + +/* Membership card layout: less than 620px */ +/* Decrease font size of name */ + +@media (max-width: 480px) { + .membership h2 { + font-size: var(--feather-font-size-large); + line-height: var(--feather-line-height-large); + } + + .name-handle { + margin-left: var(--feather-grid-small); + } + + .membership p { + padding-top: var(--feather-grid-xxsmall); + } +} + +/* Membership card layout: less than 420px */ + +@media (max-width: 420px) { + .name-handle { + width: 50%; + } +} + +/* Membership card layout: less than 340px */ +/* Name and handle move below logo */ + +@media (max-width: 340px) { + .membership-logo, .name-handle { + display: block; + } + + .name-handle { + padding-top: var(--feather-grid-small); + margin-left: 0; + width: 100%; + } +} diff --git a/assets/css/projects.scss b/assets/css/projects.scss new file mode 100644 index 000000000..4c6a05430 --- /dev/null +++ b/assets/css/projects.scss @@ -0,0 +1,117 @@ +/* Styles specific to projects page */ + +/* Widths */ +:root { + --project-card-min-width: 385px; + --project-card-max-width: 500px; + --search-bar-width: 450px; +} + +.all-projects { + display: flex; + flex-wrap: wrap; +} +.project-card { + position: relative; + flex: 1 1; + padding: var(--feather-grid-mega) calc(var(--feather-grid-mega) * 1.5); + min-width: var(--project-card-min-width); + max-width: var(--project-card-max-width); +} + +.border { + width: 150px; + border-bottom-style: solid; + border-bottom-width: 5px; +} + +.project-language { + color: var(--tw-color-gray-deep); + font-size: var(--feather-font-size-normal); + line-height: var(--feather-line-height-normal); + + @media (prefers-color-scheme: dark) { + color: var(--tw-color-gray-faded); + } +} + +.project-links a { + display: block; + font-weight: var(--feather-font-weight-bold); + text-decoration: none; +} + +.project-links a:link, .project-links a:visited { + color: var(--tw-color-text-primary); + + @media (prefers-color-scheme: dark) { + color: white; + } +} + +.project-links a:hover, .project-links a:active { + color: var(--tw-color-text-link); +} + +.whitespace { + height: calc(var(--feather-grid-mega) * 1.6); +} + +.project-links { + position: absolute; + bottom: var(--feather-grid-mega); +} + +.project-card .Button { + position: absolute; + bottom: var(--feather-grid-mega); + right: calc(var(--feather-grid-mega) * 1.5); +} + + +/* Search Bar */ +#search-bar { + margin-top: var(--feather-grid-mega); + border-radius: 1.6rem; + border: 0; + max-width: var(--search-bar-width); + min-width: 183px; + line-height: calc(1.8rem - (1px * 2)); + padding: 0 var(--feather-grid-medium); + background-color: var(--tw-color-blue-light); + display: flex; + justify-content: space-between; + + @media (prefers-color-scheme: dark) { + background-color: var(--tw-color-gray-deep); + } +} + +#search-box { + color: white; + border: 0; + min-width: 90%; + line-height: calc(1.8rem - (1px * 2)); + background-color: transparent; + &::placeholder { + color: white; + } + &:focus { + outline: none; + } +} + +#search-icon { + fill: #ffffff; + height: 17px; + width: 17px; + margin-top: 9px; + flex-shrink: 0; +} + +#results { + padding-top: var(--feather-grid-mega); + .count, .query { + font-weight: var(--feather-font-weight-bold); + } +} diff --git a/assets/css/style.scss b/assets/css/style.scss new file mode 100644 index 000000000..7f2db7929 --- /dev/null +++ b/assets/css/style.scss @@ -0,0 +1,9 @@ +// feather core and components +// these are manually copied from go/feather-source +@import "feather-core"; +@import "feather-component-button"; + +// custom feather overrides +@import "feather-custom"; + +@import "main"; diff --git a/static/css/year-in-review.css b/assets/css/year-in-review.scss similarity index 80% rename from static/css/year-in-review.css rename to assets/css/year-in-review.scss index a02980842..4501ad74b 100644 --- a/static/css/year-in-review.css +++ b/assets/css/year-in-review.scss @@ -23,7 +23,18 @@ } -/* General */ +html { + scroll-padding-top: 0rem; + + @media (prefers-reduced-motion: no-preference) { + --scroll-behavior: smooth; + scroll-behavior: smooth; + } +} + +a { + color: white; +} .YIR-wrapper { color: white; @@ -39,10 +50,12 @@ .YIR-container-section { max-width: var(--YIR-page-width); margin: 0 auto; - height: inherit; + min-height: inherit; display: flex; - justify-content: flex-end; - align-items: center; + flex-direction: column; + justify-content: center; + align-items: flex-end; + padding: var(--feather-grid-large) 0; } p { @@ -51,52 +64,51 @@ p { /* All content */ -.mobile-heading, .YIR-header, table, .locations, .metric-wrapper, .YIR-tweet-wrapper { +.inline-heading, .YIR-header, table, .locations, .metric-wrapper, .YIR-tweet-wrapper { width: var(--content-width); } -.mobile-heading { - display: none; - padding-bottom: var(--feather-grid-large); +.inline-heading { + padding-bottom: var(--feather-grid-mega); } -.mobile-heading h1 { +.inline-heading h1 { font-size: var(--font-size-xxjumbo); line-height: var(--line-height-xxjumbo); - padding-bottom: var(--feather-grid-xsmall); + padding-bottom: var(--feather-grid-xsmall); } /* Sections */ section { - height: 100vh; + min-height: 100vh; } -section#section1 { +section#welcome { background: var(--tw-color-blue-medium); } -section#section2 { +section#top10 { background: var(--tw-color-purple-medium); } -section#section3 { +section#locations { background: var(--tw-color-green-medium); } -section#section4 { +section#heat { background: var(--tw-color-orange-medium); } -section#section5 { +section#light { background: var(--tw-color-yellow-deep); } -section#section6 { +section#love { background: var(--tw-color-red-medium); } -section#section7 { +section#follow { background: var(--tw-color-blue-medium); } @@ -133,7 +145,7 @@ a.YIRnav-YIR-link:hover { opacity: 1; } -.nav-menu { +#nav-menu { display: none; } @@ -158,21 +170,28 @@ a.YIRnav-YIR-link:hover { .YIR-nav-title { font-size: var(--feather-font-size-jumbo); font-weight: var(--feather-font-weight-bold); - transition: all 0.15s ease-out; + @media (prefers-reduced-motion: no-preference) { + transition: all 0.15s ease-out; + } } -.YIR-nav-body { +.nav .section-description { width: var(--timeline-active-text-width); height: 0; overflow: hidden; opacity: 0; - transition: height 0.3s ease-out, opacity 0.2s ease-out; + @media (prefers-reduced-motion: no-preference) { + transition: height 0.3s ease-out, opacity 0.2s ease-out; + } } .nav li { + list-style: none; position: relative; - transition: all 0.3s ease-out; margin-bottom: var(--feather-grid-medium); + @media (prefers-reduced-motion: no-preference) { + transition: all 0.3s ease-out; + } } /* Shorter white lines */ @@ -192,12 +211,16 @@ a.YIRnav-YIR-link:hover { display: block; padding: 0; color: white; - transition: all 0.15s ease-out; + @media (prefers-reduced-motion: no-preference) { + transition: all 0.15s ease-out; + } } .nav li a:hover { background-color: transparent; - padding-left: 1em; + @media (prefers-reduced-motion: no-preference) { + padding-left: 1em; + } } .nav li a:focus { @@ -223,7 +246,7 @@ a.YIRnav-YIR-link:hover { line-height: var(--line-height-xxjumbo); } -.nav li.active .YIR-nav-body { +.nav li.active .section-description { margin: 0; margin-top: var(--feather-grid-xsmall); height: var(--nav-body-text-height); @@ -249,19 +272,17 @@ h1#YIR-heading-text { padding: var(--feather-grid-large) 0; } -h1#date-range, h1#YIR-heading-text { - -webkit-animation: fadein 1s; - -moz-animation: fadein 1s; - -ms-animation: fadein 1s; - -o-animation: fadein 1s; - animation: fadein 1s; +h1#YIR-heading-text, .YIR-subheading { + @media (prefers-reduced-motion: no-preference) { + animation: fadein 1s; + } } -#YIR-header-mobile-heading { +#YIR-header-inline-heading { padding: 0; } -#YIR-header-mobile-heading p { +#YIR-header-inline-heading p { padding: 0; padding-top: var(--feather-grid-large); } @@ -289,6 +310,7 @@ th { tr.content { height: var(--line-height-xjumbo); + line-height: 0.9em; } td.num { @@ -430,10 +452,10 @@ span.metric-name { } .in-view path { - animation: stroke 2s ease-in-out forwards; - -webkit-animation: stroke 2s ease-in-out forwards; - -o-animation: stroke 2s ease-in-out forwards; - -moz-animation: stroke 2s ease-in-out forwards; + animation: stroke 0s forwards; + @media (prefers-reduced-motion: no-preference) { + animation: stroke 2s ease-in-out forwards; + } } @keyframes stroke { @@ -456,7 +478,7 @@ span.metric-name { /* Hardcoded breakpoints for when window height is too small and causes content to overflow */ /* Header - when content overflows section */ @media (max-height: 544px) and (min-width: 1080px) { - section#section1 { + section#welcome { height: auto; padding: calc(var(--feather-grid-mega) * 1.5) 0; } @@ -464,7 +486,7 @@ span.metric-name { /* Top 10 repos - when content overflows section */ @media (max-height: 652px) and (min-width: 1080px) { - section#section2 { + section#top10 { height: auto; padding: calc(var(--feather-grid-mega) * 1.5) 0; } @@ -472,7 +494,7 @@ span.metric-name { /* Locations - when content overflows section */ @media (max-height: 772px) and (min-width: 1080px) { - section#section3 { + section#locations { height: auto; padding: calc(var(--feather-grid-mega) * 1.5) 0; } @@ -480,7 +502,7 @@ span.metric-name { /* Metrics - when content overflows section */ @media (max-height: 658px) and (min-width: 1080px) { - section#section4, section#section5, section#section6 { + section#heat, section#light, section#love { height: auto; padding: calc(var(--feather-grid-mega) * 1.5) 0; } @@ -488,7 +510,7 @@ span.metric-name { /* Tweet - when content overflows section */ @media (max-height: 721px) and (min-width: 1080px) { - section#section7 { + section#follow { height: auto; padding: calc(var(--feather-grid-mega) * 1.5) 0; } @@ -500,7 +522,7 @@ span.metric-name { display: none; } - .mobile-heading { + .inline-heading { display: block; } @@ -511,89 +533,56 @@ span.metric-name { .YIR-container-section { flex-direction: column; - justify-content: center; + align-items: center; } .YIR-header { padding-top: var(--feather-grid-mega); /* FIX - DELETE if i make top nav stick to top */ } - /* Top navigation */ + html { + scroll-padding-top: 2.5rem; + } nav { background-color: var(--tw-color-blue-medium); } - .YIRnav-home-link, .YIRnav-YIR-link { - display: none; - } - - /* Copied from main.css because mobile navigation is activated at a wider width on this page */ - /* Navigation menu - Unactivated */ - - .home-text, a.nav-link:visited { - margin-right: var(--feather-grid-xsmall); - } - - span.Icon--caretDown { - display: inline-block; - transform: rotate(0deg); - } - - span.Icon--caretDown:hover { - color: var(--tw-color-blue-faded); + // Copied from main.css because mobile navigation is activated at a wider width on this page + html:not(.no-js) #menu-toggle { + display: block; } - .nav-menu { + #nav-menu { display: none; - } - - .nav-list-item { - font-weight: var(--feather-font-weight-bold); - font-size: var(--feather-font-size-jumbo); - line-height: var(--feather-line-height-jumbo); - padding: var(--feather-grid-medium) 0; - margin: 0; - border-bottom: 1px solid var(--tw-color-blue-faded); - } - - .list-end { - border-bottom: none; - } - - /* Navigation menu - Activated */ - - nav.active { height: 100vh; - overflow-y: auto; - } - - nav.active span.Icon--caretDown { - transform: rotate(-180deg); - } - - nav.active .nav-menu { - display: block; + width: 100%; + margin: 0; margin-top: calc(var(--feather-grid-mega) * 2); - margin-left: var(--feather-grid-medium); - margin-right: var(--feather-grid-medium); - } - - a.nav-link:link { - -webkit-animation: fadein 1.5s; - -moz-animation: fadein 1.5s; - -ms-animation: fadein 1.5s; - -o-animation: fadein 1.5s; - animation: fadein 1.5s; - } - - .home-text { - display: inline-block; + @media (prefers-reduced-motion: no-preference) { + animation: fadein 1.5s; + } + + li { + display: block; + font-weight: var(--feather-font-weight-bold); + font-size: var(--feather-font-size-jumbo); + line-height: var(--feather-line-height-jumbo); + padding: var(--feather-grid-medium) 0; + margin: 0; + &:not(:last-child) { + border-bottom: 1px solid var(--tw-color-blue-faded); + } + } + } + + #nav-menu.active { + display: block; } } /* Less than content-width + 2 * feather-grid-large */ @media (max-width: 568px) { - .mobile-heading, .YIR-header, table, .locations, .metric-wrapper, .YIR-tweet-wrapper { + .inline-heading, .YIR-header, table, .locations, .metric-wrapper, .YIR-tweet-wrapper { width: 100%; } @@ -602,7 +591,7 @@ span.metric-name { } /* Decrease font sizes */ - .mobile-heading h1 { + .inline-heading h1 { font-size: var(--font-size-mini-jumbo); line-height: var(--line-height-mini-jumbo); } @@ -612,7 +601,7 @@ span.metric-name { font-size: var(--feather-font-size-jumbo); line-height: var(--feather-line-height-jumbo); } - + h1#YIR-heading-text { font-size: var(--font-size-xxjumbo); line-height: calc(var(--line-height-xxjumbo) - 0.5rem); diff --git a/codemeta.yaml b/codemeta.yaml new file mode 100644 index 000000000..779288935 --- /dev/null +++ b/codemeta.yaml @@ -0,0 +1,12 @@ +--- +"@context": https://doi.org/10.5063/schema/codemeta-2.0 +"@type": SoftwareSourceCode +license: https://spdx.org/licenses/Apache-2.0 +codeRepository: git+https://github.com/twitter/opensource-website.git +issueTracker: https://github.com/twitter/opensource-website/issues +name: opensource.twitter.dev +developmentStatus: active +author: +- "@type": Organization + identifier: OSS + name: Twitter Open Source Programs Office diff --git a/config.yaml b/config.yaml index 616ed0c4a..404e82124 100644 --- a/config.yaml +++ b/config.yaml @@ -1,4 +1,4 @@ -baseURL: https://twitter.github.io/ +baseURL: https://opensource.twitter.dev/ languageCode: en-us title: Twitter Open Source @@ -15,3 +15,18 @@ markup: tableOfContents: startLevel: 1 endLevel: 9 + highlight: + style: friendly + +menu: + main: + # individual pages are added to menu in their front matter + - identifier: blog + name: Blog + url: https://blog.twitter.com/engineering/en_us/topics/open-source + rel: noopener + weight: 10 + - identifier: github + name: GitHub + url: https://github.com/twitter + weight: 20 diff --git a/content/_index.html b/content/_index.html index d745414cb..49eee3e2a 100644 --- a/content/_index.html +++ b/content/_index.html @@ -1,48 +1,32 @@ --- title: Twitter Open Source -description: Twitter Open Source Website -keywords: twitter, open, source, open source, finatra, finagle, scala -custom_css: index.css -custom_js: index.js +custom_css: index.scss --- - - -
-
-
-

- @TwitterOSS -

-

Open Source is Happening

-
-
-
- -
-
-
+
+
+

#OurPhilosophy

For anything to grow, you need three things:

-
-
- Fire emoji +
+
+ Fire emoji

Heat

Heat means work.
Upstream contributions, bug fixes, designs, docs--the rigorous work that drives the community.

-
- Sun emoji +
+ Sun emoji

Light

Light means visibility.
For the projects, contributions, opportunities, challenges, and people that impact the community.

-
- Pride heart emoji +
+ Pride heart emoji

Love

Love means culture and support.
Why we care. How we work. Actions that grow the community.

@@ -52,39 +36,41 @@

Love

-
-
-
+
+
+

Explore Projects

Twitter has been built on open source since the beginning. Openness is part of our DNA. The projects you see here were born at Twitter, and patches are always welcome!

- + View All Projects
-
-
-
- -
- +
+
+
+

Follow Us @TwitterOSS

+
+
-
-
-
+
+
+

Join the Flock

We are always on the lookout for innovative and creative individuals who are passionate about building a platform where all voices can be heard.

- + View All Careers
-
diff --git a/content/memberships.html b/content/memberships.html index 59d51f1a8..f86a8a3e3 100644 --- a/content/memberships.html +++ b/content/memberships.html @@ -1,8 +1,8 @@ --- layout: memberships -title: Memberships | Twitter Open Source -description: Twitter Open Source Website -keywords: twitter, open, source, open source, finatra, finagle, scala -custom_css: memberships.css -custom_js: memberships.js +title: Memberships +subtitle: Our upstream and downstream partners who make open source happen +menu: main +weight: 2 +custom_css: memberships.scss --- diff --git a/content/projects.html b/content/projects.html index bb2914c04..2ceda19d4 100644 --- a/content/projects.html +++ b/content/projects.html @@ -1,8 +1,10 @@ --- layout: projects -title: Projects | Twitter Open Source +title: Projects description: All Twitter Open Source Projects keywords: twitter, open, source, open source, finatra, finagle, scala -custom_css: projects.css +menu: main +weight: 1 +custom_css: projects.scss custom_js: projects.js --- diff --git a/content/status.md b/content/status.md new file mode 100644 index 000000000..5ea5f693c --- /dev/null +++ b/content/status.md @@ -0,0 +1,218 @@ +--- +title: Project Status +--- + +Open source projects come in all shapes and sizes, and Twitter's projects are no +exception. Sometimes we publish projects that are highly experimental or are in +very early stages of development. Other times we publish some of the core +infrastructure that is used to serve hundreds of millions of tweets every day. + +These project status labels, which you'll find attached to various Twitter +projects, are designed to help indicate how stable a project is and where it is +in its development lifecycle. These are neither statements of value nor +guarantees of support or future development. They are merely designed to provide +transparency. + +Questions about the status of individual projects are generally best directed to +the project discussion forum or issue tracker. If those are unavailable, you can +also email opensource@twitter.com. + + +**Project Statuses:** + - [Idea](#idea) + - [Experimental](#experimental) + - [Active](#active) + - [Stable](#stable) + - [Unmaintained](#unmaintained) + - [Deprecated](#deprecated) + - [Retired](#retired) + - [Static](#static) + +Idea +---- + +![status: idea](idea.svg) + +### Expectations + +This code is in the scoping or specification phase and may be accepting feedback or proposals. May not have active maintainers. + +### Requirements + +- Complies with Twitter's legal and security requirements for open source software +- Contains the appropriate Twitter open source category header in the repository's README file +- Typically hosted in the [Twitter Incubator](https://github.com/twitter-incubator) GitHub org +- (Optional) Issues at the project owner's discretion + +### Markdown + +```markdown +[![status: idea](https://opensource.twitter.dev/status/idea.svg)](https://opensource.twitter.dev/status/#idea) +```` + +Experimental +------------ + +![status: experimental](experimental.svg) + +### Expectations + +This code is not yet ready for prime time and may be actively seeking feedback. May not have active maintainers. + +### Requirements + +- Complies with Twitter's legal and security requirements for open source software +- Contains the appropriate Twitter open source category header in the repository's README file +- Typically hosted in the Twitter Incubator GitHub org +- (Optional) Issues at the project owner's discretion + +### Markdown + +```markdown +[![status: experimental](https://opensource.twitter.dev/status/experimental.svg)](https://opensource.twitter.dev/status/#experimental) +```` + +Active +------ + +![status: active](active.svg) + +### Expectations + +This code is actively maintained and supported. + +### Requirements + +- Complies with Twitter's legal and security requirements for open source software +- Contains the appropriate Twitter open source category header in the repository's README file +- Is maintained by a Twitter engineering team +- Issues and PR's managed in GitHub +- For additional details on support options, see the Open Source Support Policy +- An automated release pipeline + +### Markdown + +```markdown +[![status: active](https://opensource.twitter.dev/status/active.svg)](https://opensource.twitter.dev/status/#active) +```` + +Stable +------ + +![status: stable](stable.svg) + +### Expectations + +This code is stable and not necessarily open to new features or functionality. Is actively maintained and supported. + +### Requirements + +- Complies with Twitter's legal and security requirements for open source software +- Contains the appropriate Twitter open source category header in the repository's README file +- Is maintained by a Twitter engineering team +- Issues and PR’s managed in GitHub +- For additional details on support options, see the Open Source Support Policy +- An automated release pipeline + +### Markdown + +```markdown +[![status: stable](https://opensource.twitter.dev/status/stable.svg)](https://opensource.twitter.dev/status/#stable) +```` + +Unmaintained +------------ + +![status: unmaintained](unmaintained.svg) + +### Expectations + +This code is no longer actively maintained nor supported. Possibly actively searching for another maintainer inside or outside of Twitter. + +### Requirements + +- Complies with Twitter's legal and security requirements for open source software +- Contains the appropriate Twitter open source category header in the repository's README file +- Previous references to Support should be modified or removed from the README +- May be transitioned to new maintainers +- (Optional) Issues and PR's at the project owner's discretion + +### Markdown + +```markdown +[![status: unmaintained](https://opensource.twitter.dev/status/unmaintained.svg)](https://opensource.twitter.dev/status/#unmaintained) +```` + +Deprecated +---------- + +![status: deprecated](deprecated.svg) + +### Expectations + +This code has been identified to transition to RETIRED at some point in the future. No longer supported and possibly has no active maintainers. + +### Requirements + +- Complies with Twitter's legal and security requirements for open source software +- Contains the appropriate Twitter open source category header in the repository's README file +- Previous references to Support should be modified or removed from the README +- Will be transitioned to RETIRED in the future +- (Optional) Issues and PR's at the project owner's discretion + +### Markdown + +```markdown +[![status: deprecated](https://opensource.twitter.dev/status/deprecated.svg)](https://opensource.twitter.dev/status/#deprecated) +```` + +Retired +------- + +![status: retired](retired.svg) + +### Expectations + +This code is read-only. There is neither a maintainer nor any support. + +### Requirements + +- Complies with Twitter's legal and security requirements for open source software +- Contains the appropriate Twitter open source category header in the repository's README file +- Previous references to Support should be modified or removed from the README +- Project is read-only and available for cloning only + +### Markdown + +```markdown +[![status: retired](https://opensource.twitter.dev/status/retired.svg)](https://opensource.twitter.dev/status/#retired) +```` + +Static +------ + +![status: static](static.svg) + +### Expectations + +This code is not expected to be updated after publication. Most often, this is +code published alongside a research paper, a blog post, or for demonstration +purposes. + +### Requirements + +- Complies with Twitter's legal and security requirements for open source software +- Contains the appropriate Twitter open source category header in the repository's README file +- (Optional) Issues at the project owner's discretion +- (Optional) Project may be archived as read-only and only available for cloning + +### Markdown + +```markdown +[![status: static](https://opensource.twitter.dev/status/static.svg)](https://opensource.twitter.dev/status/#static) +```` + +--- +Thanks to [repostatus.org](https://www.repostatus.org/) and [New +Relic](https://opensource.newrelic.com/oss-category/) for the inspiration, and +[shields.io](https://shields.io/) for the badges. diff --git a/content/year-in-review.html b/content/year-in-review.html index 69111a946..9f0cabfbf 100644 --- a/content/year-in-review.html +++ b/content/year-in-review.html @@ -1,8 +1,8 @@ --- layout: year-in-review -title: Year in Review | Twitter Open Source -description: Twitter Open Source Website -keywords: twitter, open, source, open source, finatra, finagle, scala -custom_css: year-in-review.css +title: Year in Review +menu: main +weight: 3 +custom_css: year-in-review.scss custom_js: year-in-review.js --- diff --git a/data/locations.yaml b/data/locations.yaml new file mode 100644 index 000000000..76746767e --- /dev/null +++ b/data/locations.yaml @@ -0,0 +1,29 @@ +- name: United States + flag: united_states_1f1fa-1f1f8.svg + +- name: Greece + flag: greece_1f1ec-1f1f7.svg + +- name: Germany + flag: germany_1f1e9-1f1ea.svg + +- name: United Kingdom + flag: united_kingdom_1f1ec-1f1e7.svg + +- name: Singapore + flag: singapore_1f1f8-1f1ec.svg + +- name: China + flag: china_1f1e8-1f1f3.svg + +- name: Belgium + flag: belgium_1f1e7-1f1ea.svg + +- name: Austria + flag: austria_1f1e6-1f1f9.svg + +- name: Peru + flag: peru_1f1f5-1f1ea.svg + +- name: Australia + flag: australia_1f1e6-1f1fa.svg diff --git a/data/memberships.yml b/data/memberships.yml index a67b19b81..590714dfe 100644 --- a/data/memberships.yml +++ b/data/memberships.yml @@ -1,35 +1,41 @@ -- name: Apache Software Foundation +- id: asf + name: Apache Software Foundation description: 'The all-volunteer ASF develops, stewards, and incubates more than 350 Open Source projects and initiatives that cover a wide range of technologies.' - logo: https://www.apache.org/foundation/press/kit/feather_small.png + logo: /assets/memberships/apache.png website: https://www.apache.org/ twitter: TheASF -- name: Linux Foundation +- id: lf + name: Linux Foundation description: 'A nonprofit organization enabling mass innovation through open source. Updates on our events at @eventsLF #Linux #OpenSource #learnLinux' - logo: https://upload.wikimedia.org/wikipedia/commons/e/ed/Linux_Foundation_Logo.svg + logo: /assets/memberships/linux-foundation.svg website: https://linuxfoundation.org twitter: linuxfoundation -- name: Open Source Initiative +- id: osi + name: Open Source Initiative description: 'Global non-profit: promotes and protects open source software, development & communities through education and advocacy. Yes, we coined the term!' - logo: https://pbs.twimg.com/profile_images/885315135409082368/CP7GGSWx_400x400.jpg + logo: /assets/memberships/osi.jpg website: https://www.opensource.org twitter: OpenSourceOrg -- name: Python Software Foundation +- id: psf + name: Python Software Foundation description: 'The Python Software Foundation is an organization devoted to advancing open source technology related to the Python programming language.' - logo: https://pbs.twimg.com/profile_images/439154912719413248/pUBY5pVj_200x200.png + logo: /assets/memberships/psf.png website: https://www.python.org/psf-landing/ twitter: ThePSF -- name: Scala Center +- id: scala + name: Scala Center description: 'The Scala Center brings together a coalition of individuals and organizations working together to contribute to Scala. All of our members, individual and corporate, are actively involved in the Scala project.' - logo: https://pbs.twimg.com/profile_images/3310435403/dc47c969494d3279783610ba3298f58b_400x400.png + logo: /assets/memberships/scala-center.png website: https://scala.epfl.ch/ twitter: scala_lang -- name: Unicode Consortium +- id: unicode + name: Unicode Consortium description: 'The Unicode Consortium enables people around the world to use computers in any language. #Unicode11' - logo: https://upload.wikimedia.org/wikipedia/commons/a/ab/Unicode_logo.svg + logo: /assets/memberships/unicode.svg website: https://unicode.org - twitter: unicode \ No newline at end of file + twitter: unicode diff --git a/data/projects.json b/data/projects.json index 6a9b86a5e..969b6a107 100644 --- a/data/projects.json +++ b/data/projects.json @@ -1 +1,1703 @@ -{"twitter/hadoop-lzo": {"nameWithOwner": "twitter/hadoop-lzo", "name": "hadoop-lzo", "descriptionHTML": "
Refactored version of code.google.com/hadoop-gpl-compression for hadoop 0.20
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Shell", "color": "#89e051"}, "languages": "Shell Java C", "pushedAt": "2019-06-07T00:13:10Z", "forkCount": 295, "stargazers": 511, "watchers": 150}, "twitter/thrift_client": {"nameWithOwner": "twitter/thrift_client", "name": "thrift_client", "descriptionHTML": "
A Thrift client wrapper that encapsulates some common failover behavior
", "homepageUrl": "http://github.com/twitter/thrift_client", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Ruby", "color": "#701516"}, "languages": "Ruby", "pushedAt": "2019-06-06T01:36:44Z", "forkCount": 76, "stargazers": 194, "watchers": 120}, "twitter/twurl": {"nameWithOwner": "twitter/twurl", "name": "twurl", "descriptionHTML": "
OAuth-enabled curl for the Twitter API
", "homepageUrl": "https://developer.twitter.com", "isPrivate": false, "repositoryTopics": "twitter twitter-api ruby curl cli", "primaryLanguage": {"name": "Ruby", "color": "#701516"}, "languages": "Ruby", "pushedAt": "2020-03-06T08:57:42Z", "forkCount": 274, "stargazers": 1417, "watchers": 188}, "twitter/elephant-bird": {"nameWithOwner": "twitter/elephant-bird", "name": "elephant-bird", "descriptionHTML": "
Twitter's collection of LZO and Protocol Buffer-related Hadoop, Pig, Hive, and HBase code.
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2019-08-27T16:44:30Z", "forkCount": 385, "stargazers": 1095, "watchers": 198}, "twitter/ostrich": {"nameWithOwner": "twitter/ostrich", "name": "ostrich", "descriptionHTML": "
A stats collector & reporter for Scala servers (deprecated)
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala JavaScript", "pushedAt": "2019-06-06T01:48:53Z", "forkCount": 98, "stargazers": 784, "watchers": 197}, "twitter/scala_school": {"nameWithOwner": "twitter/scala_school", "name": "scala_school", "descriptionHTML": "
Lessons in the Fundamentals of Scala
", "homepageUrl": "http://twitter.github.com/scala_school", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "HTML", "color": "#e34c26"}, "languages": "Scala Java Shell HTML", "pushedAt": "2020-02-20T19:03:53Z", "forkCount": 1107, "stargazers": 3532, "watchers": 342}, "twitter/finagle": {"nameWithOwner": "twitter/finagle", "name": "finagle", "descriptionHTML": "
A fault tolerant, protocol-agnostic RPC system
", "homepageUrl": "http://twitter.github.io/finagle", "isPrivate": false, "repositoryTopics": "rpc distributed-systems finagle http http2 thrift mysql memcached redis zipkin java scala", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2020-06-26T21:39:02Z", "forkCount": 1358, "stargazers": 7658, "watchers": 585}, "twitter/joauth": {"nameWithOwner": "twitter/joauth", "name": "joauth", "descriptionHTML": "
A Java library for authenticating HTTP Requests using OAuth
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Scala Java", "pushedAt": "2019-06-05T23:24:09Z", "forkCount": 52, "stargazers": 195, "watchers": 133}, "twitter/twitter.github.io": {"nameWithOwner": "twitter/twitter.github.io", "name": "twitter.github.io", "descriptionHTML": "
A listing of open source efforts at Twitter on GitHub
", "homepageUrl": "http://twitter.github.io", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "CSS", "color": "#563d7c"}, "languages": "CSS JavaScript HTML Python", "pushedAt": "2020-06-28T02:24:27Z", "forkCount": 502, "stargazers": 1414, "watchers": 473}, "twitter/util": {"nameWithOwner": "twitter/util", "name": "util", "descriptionHTML": "
Wonderful reusable code from Twitter
", "homepageUrl": "http://twitter.github.com/util", "isPrivate": false, "repositoryTopics": "finagle scala utility", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala Java", "pushedAt": "2020-06-26T11:45:41Z", "forkCount": 528, "stargazers": 2376, "watchers": 239}, "twitter/scrooge": {"nameWithOwner": "twitter/scrooge", "name": "scrooge", "descriptionHTML": "
A Thrift parser/generator
", "homepageUrl": "http://twitter.github.io/scrooge/", "isPrivate": false, "repositoryTopics": "finagle thrift code-generation lua java scala android cocoa", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala HTML Java Objective-C", "pushedAt": "2020-06-26T18:23:23Z", "forkCount": 234, "stargazers": 708, "watchers": 180}, "twitter/pycascading": {"nameWithOwner": "twitter/pycascading", "name": "pycascading", "descriptionHTML": "
A Python wrapper for Cascading
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Python", "color": "#3572A5"}, "languages": "Shell Python Java", "pushedAt": "2019-12-30T06:57:34Z", "forkCount": 38, "stargazers": 221, "watchers": 135}, "twitter/hogan.js": {"nameWithOwner": "twitter/hogan.js", "name": "hogan.js", "descriptionHTML": "
A compiler for the Mustache templating language
", "homepageUrl": "http://twitter.github.com/hogan.js", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "JavaScript", "pushedAt": "2020-04-08T11:51:28Z", "forkCount": 447, "stargazers": 5048, "watchers": 260}, "twitter/scalding": {"nameWithOwner": "twitter/scalding", "name": "scalding", "descriptionHTML": "
A Scala API for Cascading
", "homepageUrl": "http://twitter.com/scalding", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Java Scala", "pushedAt": "2020-06-01T23:27:28Z", "forkCount": 678, "stargazers": 3240, "watchers": 331}, "twitter/effectivescala": {"nameWithOwner": "twitter/effectivescala", "name": "effectivescala", "descriptionHTML": "
Twitter's Effective Scala Guide
", "homepageUrl": "http://twitter.github.com/effectivescala", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "HTML", "color": "#e34c26"}, "languages": "Makefile Shell HTML", "pushedAt": "2019-06-07T17:08:04Z", "forkCount": 607, "stargazers": 2148, "watchers": 275}, "twitter/finatra": {"nameWithOwner": "twitter/finatra", "name": "finatra", "descriptionHTML": "
Fast, testable, Scala services built on TwitterServer and Finagle
", "homepageUrl": "https://twitter.github.io/finatra/", "isPrivate": false, "repositoryTopics": "scala finagle twitter-server http framework microservices thrift guice slf4j testing", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Java Scala Starlark", "pushedAt": "2020-06-25T02:23:23Z", "forkCount": 369, "stargazers": 2014, "watchers": 230}, "twitter/cassovary": {"nameWithOwner": "twitter/cassovary", "name": "cassovary", "descriptionHTML": "
Cassovary is a simple big graph processing library for the JVM
", "homepageUrl": "http://twitter.com/cassovary", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2019-06-07T17:03:38Z", "forkCount": 132, "stargazers": 983, "watchers": 168}, "twitter/twemproxy": {"nameWithOwner": "twitter/twemproxy", "name": "twemproxy", "descriptionHTML": "
A fast, light-weight proxy for memcached and redis
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C", "color": "#555555"}, "languages": "Python Shell C", "pushedAt": "2020-05-25T00:51:39Z", "forkCount": 1772, "stargazers": 9919, "watchers": 847}, "twitter/twitter-cldr-rb": {"nameWithOwner": "twitter/twitter-cldr-rb", "name": "twitter-cldr-rb", "descriptionHTML": "
Ruby implementation of the ICU (International Components for Unicode) that uses the Common Locale Data Repository to format dates, plurals, and more.
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Ruby", "color": "#701516"}, "languages": "Ruby", "pushedAt": "2020-05-16T19:13:33Z", "forkCount": 72, "stargazers": 613, "watchers": 126}, "twitter/innovators-patent-agreement": {"nameWithOwner": "twitter/innovators-patent-agreement", "name": "innovators-patent-agreement", "descriptionHTML": "
Innovators Patent Agreement (IPA)
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": null, "languages": "", "pushedAt": "2016-06-14T06:33:54Z", "forkCount": 130, "stargazers": 911, "watchers": 178}, "twitter/recess": {"nameWithOwner": "twitter/recess", "name": "recess", "descriptionHTML": "
A simple and attractive code quality tool for CSS built on top of LESS
", "homepageUrl": "http://twitter.github.com/recess", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "CSS", "color": "#563d7c"}, "languages": "CSS JavaScript", "pushedAt": "2016-04-18T11:53:32Z", "forkCount": 206, "stargazers": 2222, "watchers": 184}, "twitter/ambrose": {"nameWithOwner": "twitter/ambrose", "name": "ambrose", "descriptionHTML": "
A platform for visualization and real-time monitoring of data workflows
", "homepageUrl": "http://twitter.com/ambrose", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java JavaScript", "pushedAt": "2020-01-22T18:54:23Z", "forkCount": 215, "stargazers": 1192, "watchers": 220}, "twitter/activerecord-reputation-system": {"nameWithOwner": "twitter/activerecord-reputation-system", "name": "activerecord-reputation-system", "descriptionHTML": "
An Active Record Reputation System for Rails
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Ruby", "color": "#701516"}, "languages": "Ruby", "pushedAt": "2016-01-14T23:40:36Z", "forkCount": 127, "stargazers": 1339, "watchers": 151}, "twitter/twemcache": {"nameWithOwner": "twitter/twemcache", "name": "twemcache", "descriptionHTML": "
Twemcache is the Twitter Memcached
", "homepageUrl": "https://twitter.com/twemcache", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C", "color": "#555555"}, "languages": "Python Ruby C", "pushedAt": "2019-08-29T23:26:04Z", "forkCount": 148, "stargazers": 870, "watchers": 231}, "twitter/twitter-cldr-js": {"nameWithOwner": "twitter/twitter-cldr-js", "name": "twitter-cldr-js", "descriptionHTML": "
JavaScript implementation of the ICU (International Components for Unicode) that uses the Common Locale Data Repository to format dates, plurals, and more. Based on twitter-cldr-rb.
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "JavaScript", "pushedAt": "2019-08-30T14:54:22Z", "forkCount": 43, "stargazers": 324, "watchers": 127}, "twitter/algebird": {"nameWithOwner": "twitter/algebird", "name": "algebird", "descriptionHTML": "
Abstract Algebra for Scala
", "homepageUrl": "https://twitter.github.io/algebird", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2020-06-28T20:57:23Z", "forkCount": 296, "stargazers": 1975, "watchers": 252}, "twitter/hdfs-du": {"nameWithOwner": "twitter/hdfs-du", "name": "hdfs-du", "descriptionHTML": "
Visualize your HDFS cluster usage
", "homepageUrl": "https://twitter.com/hdfsdu", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "Java JavaScript", "pushedAt": "2019-06-07T01:02:25Z", "forkCount": 85, "stargazers": 216, "watchers": 144}, "twitter/twitter-cldr-npm": {"nameWithOwner": "twitter/twitter-cldr-npm", "name": "twitter-cldr-npm", "descriptionHTML": "
TwitterCldr npm package
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "JavaScript", "pushedAt": "2019-08-26T16:06:02Z", "forkCount": 18, "stargazers": 38, "watchers": 117}, "twitter/tormenta": {"nameWithOwner": "twitter/tormenta", "name": "tormenta", "descriptionHTML": "
Scala extensions for Storm
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala Shell Java", "pushedAt": "2019-06-07T01:01:52Z", "forkCount": 27, "stargazers": 132, "watchers": 137}, "twitter/summingbird": {"nameWithOwner": "twitter/summingbird", "name": "summingbird", "descriptionHTML": "
Streaming MapReduce with Scalding and Storm
", "homepageUrl": "https://twitter.com/summingbird", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2019-06-06T17:24:18Z", "forkCount": 263, "stargazers": 2080, "watchers": 297}, "twitter/chill": {"nameWithOwner": "twitter/chill", "name": "chill", "descriptionHTML": "
Scala extensions for the Kryo serialization library
", "homepageUrl": "https://twitter.com/scalding", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala Java", "pushedAt": "2020-06-28T20:56:46Z", "forkCount": 112, "stargazers": 537, "watchers": 139}, "twitter/bijection": {"nameWithOwner": "twitter/bijection", "name": "bijection", "descriptionHTML": "
Reversible conversions between types
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala Java", "pushedAt": "2020-06-28T20:57:06Z", "forkCount": 97, "stargazers": 595, "watchers": 154}, "twitter/fatcache": {"nameWithOwner": "twitter/fatcache", "name": "fatcache", "descriptionHTML": "
Memcache on SSD
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C", "color": "#555555"}, "languages": "C", "pushedAt": "2017-04-22T14:52:05Z", "forkCount": 170, "stargazers": 1268, "watchers": 214}, "twitter/storehaus": {"nameWithOwner": "twitter/storehaus", "name": "storehaus", "descriptionHTML": "
Storehaus is a library that makes it easy to work with asynchronous key value stores
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2019-12-12T21:09:37Z", "forkCount": 82, "stargazers": 460, "watchers": 144}, "twitter/hbc": {"nameWithOwner": "twitter/hbc", "name": "hbc", "descriptionHTML": "
A Java HTTP client for consuming Twitter's realtime Streaming API
", "homepageUrl": "https://developer.twitter.com/en/docs/tweets/filter-realtime/overview", "isPrivate": false, "repositoryTopics": "twitter4j stream java realtime tweets", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2019-12-28T05:56:56Z", "forkCount": 337, "stargazers": 868, "watchers": 204}, "twitter/typeahead.js": {"nameWithOwner": "twitter/typeahead.js", "name": "typeahead.js", "descriptionHTML": "
typeahead.js is a fast and fully-featured autocomplete library
", "homepageUrl": "http://twitter.github.com/typeahead.js/", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "JavaScript", "pushedAt": "2020-01-20T18:49:08Z", "forkCount": 3450, "stargazers": 16099, "watchers": 582}, "twitter/twitter-server": {"nameWithOwner": "twitter/twitter-server", "name": "twitter-server", "descriptionHTML": "
Twitter-Server defines a template from which services at Twitter are built
", "homepageUrl": "http://twitter.github.io/twitter-server/", "isPrivate": false, "repositoryTopics": "finagle finatra", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2020-06-26T00:38:53Z", "forkCount": 187, "stargazers": 1113, "watchers": 199}, "twitter/netty-http2": {"nameWithOwner": "twitter/netty-http2", "name": "netty-http2", "descriptionHTML": "
HTTP/2 for Netty
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2019-06-07T00:55:15Z", "forkCount": 46, "stargazers": 107, "watchers": 121}, "twitter/interactive": {"nameWithOwner": "twitter/interactive", "name": "interactive", "descriptionHTML": "
Twitter interactive visualization
", "homepageUrl": "http://twitter.github.io/interactive", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "ApacheConf", "color": null}, "languages": "CSS HTML ApacheConf", "pushedAt": "2019-06-06T18:01:08Z", "forkCount": 67, "stargazers": 208, "watchers": 155}, "twitter/scala_school2": {"nameWithOwner": "twitter/scala_school2", "name": "scala_school2", "descriptionHTML": "
Scala School 2
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala CSS JavaScript HTML", "pushedAt": "2019-06-07T00:53:34Z", "forkCount": 68, "stargazers": 327, "watchers": 160}, "twitter/hraven": {"nameWithOwner": "twitter/hraven", "name": "hraven", "descriptionHTML": "
hRaven collects run time data and statistics from MapReduce jobs in an easily queryable format
", "homepageUrl": "https://twitter.com/twitterhadoop", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2020-02-11T16:06:16Z", "forkCount": 66, "stargazers": 125, "watchers": 139}, "twitter/cdk": {"nameWithOwner": "twitter/cdk", "name": "cdk", "descriptionHTML": "
CDK is a tool to quickly generate single-file html slide presentations from AsciiDoc
", "homepageUrl": "http://cdk.readthedocs.org/en/latest/", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "CSS", "color": "#563d7c"}, "languages": "Python JavaScript CSS", "pushedAt": "2019-06-07T00:53:15Z", "forkCount": 25, "stargazers": 73, "watchers": 120}, "twitter/code-of-conduct": {"nameWithOwner": "twitter/code-of-conduct", "name": "code-of-conduct", "descriptionHTML": "
Open Source Code of Conduct at Twitter
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": null, "languages": "", "pushedAt": "2018-03-10T14:25:02Z", "forkCount": 43, "stargazers": 76, "watchers": 133}, "twitter/cloudhopper-commons": {"nameWithOwner": "twitter/cloudhopper-commons", "name": "cloudhopper-commons", "descriptionHTML": "
Cloudhopper Commons
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2019-11-01T15:24:14Z", "forkCount": 40, "stargazers": 35, "watchers": 126}, "twitter/CocoaSPDY": {"nameWithOwner": "twitter/CocoaSPDY", "name": "CocoaSPDY", "descriptionHTML": "
SPDY for iOS and OS X
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Objective-C", "color": "#438eff"}, "languages": "Objective-C", "pushedAt": "2017-04-03T16:48:52Z", "forkCount": 251, "stargazers": 2405, "watchers": 223}, "twitter/hpack": {"nameWithOwner": "twitter/hpack", "name": "hpack", "descriptionHTML": "
Header Compression for HTTP/2
", "homepageUrl": "https://twitter.com/http_2", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2019-06-07T00:46:00Z", "forkCount": 47, "stargazers": 168, "watchers": 131}, "twitter/libwatchman": {"nameWithOwner": "twitter/libwatchman", "name": "libwatchman", "descriptionHTML": "
A C interface to watchman
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C", "color": "#555555"}, "languages": "Shell C", "pushedAt": "2019-06-07T00:45:31Z", "forkCount": 21, "stargazers": 38, "watchers": 126}, "twitter/zktraffic": {"nameWithOwner": "twitter/zktraffic", "name": "zktraffic", "descriptionHTML": "
ZooKeeper protocol analyzer and stats gathering daemon
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Python", "color": "#3572A5"}, "languages": "Python", "pushedAt": "2020-03-12T17:03:47Z", "forkCount": 41, "stargazers": 150, "watchers": 120}, "twitter/SentenTree": {"nameWithOwner": "twitter/SentenTree", "name": "SentenTree", "descriptionHTML": "
A novel text visualization technique
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "Python JavaScript", "pushedAt": "2019-01-15T12:38:53Z", "forkCount": 29, "stargazers": 134, "watchers": 16}, "twitter/wordpress": {"nameWithOwner": "twitter/wordpress", "name": "wordpress", "descriptionHTML": "
The official Twitter plugin for WordPress. Embed Twitter content and grow your audience on Twitter.
", "homepageUrl": "https://github.com/twitter/wordpress/wiki", "isPrivate": false, "repositoryTopics": "twitter-plugin php wordpress twitter-cards", "primaryLanguage": {"name": "PHP", "color": "#4F5D95"}, "languages": "PHP", "pushedAt": "2020-04-15T00:08:56Z", "forkCount": 92, "stargazers": 248, "watchers": 119}, "twitter/BreakoutDetection": {"nameWithOwner": "twitter/BreakoutDetection", "name": "BreakoutDetection", "descriptionHTML": "
Breakout Detection via Robust E-Statistics
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C++", "color": "#f34b7d"}, "languages": "R C++", "pushedAt": "2017-08-15T03:23:50Z", "forkCount": 164, "stargazers": 703, "watchers": 167}, "twitter/twitter-korean-text": {"nameWithOwner": "twitter/twitter-korean-text", "name": "twitter-korean-text", "descriptionHTML": "
Korean tokenizer
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Java Scala", "pushedAt": "2019-06-07T00:41:40Z", "forkCount": 156, "stargazers": 736, "watchers": 177}, "twitter/twemoji": {"nameWithOwner": "twitter/twemoji", "name": "twemoji", "descriptionHTML": "
Emoji for everyone. https://twemoji.twitter.com/\n
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "HTML", "color": "#e34c26"}, "languages": "HTML JavaScript", "pushedAt": "2020-05-21T22:42:00Z", "forkCount": 1292, "stargazers": 11272, "watchers": 348}, "twitter/twitter-text": {"nameWithOwner": "twitter/twitter-text", "name": "twitter-text", "descriptionHTML": "
Twitter Text Libraries
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "HTML", "color": "#e34c26"}, "languages": "Ruby HTML Java JavaScript Objective-C", "pushedAt": "2020-06-16T11:02:24Z", "forkCount": 397, "stargazers": 2324, "watchers": 186}, "twitter/AnomalyDetection": {"nameWithOwner": "twitter/AnomalyDetection", "name": "AnomalyDetection", "descriptionHTML": "
Anomaly Detection with R
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "R", "color": "#198CE7"}, "languages": "R", "pushedAt": "2019-08-30T19:49:16Z", "forkCount": 712, "stargazers": 3200, "watchers": 336}, "twitter/scala-json": {"nameWithOwner": "twitter/scala-json", "name": "scala-json", "descriptionHTML": "
JSON in Scala (deprecated)
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2019-12-30T06:49:27Z", "forkCount": 5, "stargazers": 3, "watchers": 119}, "twitter/d3kit": {"nameWithOwner": "twitter/d3kit", "name": "d3kit", "descriptionHTML": "
D3Kit is a set tools to speed D3 related project development
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "JavaScript", "pushedAt": "2019-12-28T08:29:58Z", "forkCount": 41, "stargazers": 397, "watchers": 107}, "twitter/sslconfig": {"nameWithOwner": "twitter/sslconfig", "name": "sslconfig", "descriptionHTML": "
Twitter's OpenSSL Configuration
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": null, "languages": "", "pushedAt": "2016-05-11T17:26:29Z", "forkCount": 15, "stargazers": 37, "watchers": 111}, "twitter/whiskey": {"nameWithOwner": "twitter/whiskey", "name": "whiskey", "descriptionHTML": "
HTTP library for Android (beta)
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2019-06-07T00:28:14Z", "forkCount": 21, "stargazers": 127, "watchers": 92}, "twitter/cli-guide.js": {"nameWithOwner": "twitter/cli-guide.js", "name": "cli-guide.js", "descriptionHTML": "
CLI Guide JQuery Plugin
", "homepageUrl": "https://twitter.github.io/cli-guide.js/", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "CSS JavaScript", "pushedAt": "2017-01-03T04:04:07Z", "forkCount": 11, "stargazers": 41, "watchers": 8}, "twitter/labella.js": {"nameWithOwner": "twitter/labella.js", "name": "labella.js", "descriptionHTML": "
Placing labels on a timeline without overlap.
", "homepageUrl": "http://twitter.github.io/labella.js/", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "JavaScript", "pushedAt": "2019-12-28T01:41:17Z", "forkCount": 131, "stargazers": 3704, "watchers": 81}, "twitter/finatra-activator-http-seed": {"nameWithOwner": "twitter/finatra-activator-http-seed", "name": "finatra-activator-http-seed", "descriptionHTML": "
Typesafe activator template for constructing a Finatra HTTP server application:
", "homepageUrl": "https://twitter.github.io/finatra/user-guide/", "isPrivate": false, "repositoryTopics": "activator finagle finatra lightbend microservices scala template http twitter-server", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala HTML", "pushedAt": "2017-10-03T18:09:03Z", "forkCount": 4, "stargazers": 17, "watchers": 27}, "twitter/diffy": {"nameWithOwner": "twitter/diffy", "name": "diffy", "descriptionHTML": "
Find potential bugs in your services with Diffy
", "homepageUrl": "https://twitter.com/diffyproject", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala HTML CSS CoffeeScript XSLT", "pushedAt": "2020-05-19T07:18:49Z", "forkCount": 347, "stargazers": 3714, "watchers": 225}, "twitter/finatra-misc": {"nameWithOwner": "twitter/finatra-misc", "name": "finatra-misc", "descriptionHTML": "
Miscellaneous libraries and utils used by Finatra
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2019-04-11T22:04:55Z", "forkCount": 6, "stargazers": 3, "watchers": 5}, "twitter/pelikan": {"nameWithOwner": "twitter/pelikan", "name": "pelikan", "descriptionHTML": "
Pelikan is Twitter's unified cache backend
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C", "color": "#555555"}, "languages": "C Rust", "pushedAt": "2020-05-27T17:59:19Z", "forkCount": 69, "stargazers": 590, "watchers": 34}, "twitter/ccommon": {"nameWithOwner": "twitter/ccommon", "name": "ccommon", "descriptionHTML": "
Cache Commons
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C", "color": "#555555"}, "languages": "CMake C Rust", "pushedAt": "2020-06-13T01:58:31Z", "forkCount": 26, "stargazers": 78, "watchers": 62}, "twitter/torch-autograd": {"nameWithOwner": "twitter/torch-autograd", "name": "torch-autograd", "descriptionHTML": "
Autograd automatically differentiates native Torch code
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Lua", "color": "#000080"}, "languages": "Lua", "pushedAt": "2019-08-29T23:27:58Z", "forkCount": 109, "stargazers": 547, "watchers": 48}, "twitter/rpc-perf": {"nameWithOwner": "twitter/rpc-perf", "name": "rpc-perf", "descriptionHTML": "
A tool for benchmarking RPC services
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Rust", "color": "#dea584"}, "languages": "Rust", "pushedAt": "2020-06-12T21:28:10Z", "forkCount": 48, "stargazers": 340, "watchers": 21}, "twitter/scoot": {"nameWithOwner": "twitter/scoot", "name": "scoot", "descriptionHTML": "
Scoot is a distributed task runner, supporting both a proprietary API and Bazel's Remote Execution.
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Go", "color": "#00ADD8"}, "languages": "Go", "pushedAt": "2020-04-15T12:38:47Z", "forkCount": 19, "stargazers": 111, "watchers": 16}, "twitter/second-control-probability-distributions": {"nameWithOwner": "twitter/second-control-probability-distributions", "name": "second-control-probability-distributions", "descriptionHTML": "
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": null, "languages": "", "pushedAt": "2016-01-06T01:11:33Z", "forkCount": 1, "stargazers": 2, "watchers": 7}, "twitter/torch-dataset": {"nameWithOwner": "twitter/torch-dataset", "name": "torch-dataset", "descriptionHTML": "
An extensible and high performance method of reading, sampling and processing data for Torch
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Lua", "color": "#000080"}, "languages": "Lua", "pushedAt": "2019-06-06T19:03:26Z", "forkCount": 22, "stargazers": 70, "watchers": 22}, "twitter/torch-ipc": {"nameWithOwner": "twitter/torch-ipc", "name": "torch-ipc", "descriptionHTML": "
A set of primitives for parallel computation in Torch
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C", "color": "#555555"}, "languages": "Lua C", "pushedAt": "2017-06-29T04:17:40Z", "forkCount": 29, "stargazers": 94, "watchers": 23}, "twitter/torch-distlearn": {"nameWithOwner": "twitter/torch-distlearn", "name": "torch-distlearn", "descriptionHTML": "
A set of distributed learning algorithms for Torch
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Lua", "color": "#000080"}, "languages": "Lua", "pushedAt": "2019-06-06T19:03:38Z", "forkCount": 24, "stargazers": 90, "watchers": 21}, "twitter/torch-thrift": {"nameWithOwner": "twitter/torch-thrift", "name": "torch-thrift", "descriptionHTML": "
A Thrift codec for Torch
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C", "color": "#555555"}, "languages": "C Lua", "pushedAt": "2016-03-07T23:36:38Z", "forkCount": 8, "stargazers": 28, "watchers": 16}, "twitter/distributedlog": {"nameWithOwner": "twitter/distributedlog", "name": "distributedlog", "descriptionHTML": "
A high performance replicated log service. (The development is moved to Apache Incubator)
", "homepageUrl": "http://distributedlog.incubator.apache.org/", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2020-02-25T19:15:10Z", "forkCount": 290, "stargazers": 2264, "watchers": 169}, "twitter/GraphJet": {"nameWithOwner": "twitter/GraphJet", "name": "GraphJet", "descriptionHTML": "
GraphJet is a real-time graph processing library.
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2019-06-07T20:03:25Z", "forkCount": 62, "stargazers": 478, "watchers": 36}, "twitter/finatra-activator-thrift-seed": {"nameWithOwner": "twitter/finatra-activator-thrift-seed", "name": "finatra-activator-thrift-seed", "descriptionHTML": "
Typesafe activator template for constructing a Finatra Thrift server application: https://twitter.github.io/finatra/user-guide/ \u2014
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "finatra thrift finagle twitter-server scala microservices activator lightbend template", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala HTML", "pushedAt": "2017-10-03T18:09:00Z", "forkCount": 7, "stargazers": 10, "watchers": 26}, "twitter/vireo": {"nameWithOwner": "twitter/vireo", "name": "vireo", "descriptionHTML": "
Vireo is a lightweight and versatile video processing library written in C++11
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C++", "color": "#f34b7d"}, "languages": "Makefile Shell C++", "pushedAt": "2019-06-06T21:54:23Z", "forkCount": 68, "stargazers": 716, "watchers": 48}, "twitter/ios-twitter-logging-service": {"nameWithOwner": "twitter/ios-twitter-logging-service", "name": "ios-twitter-logging-service", "descriptionHTML": "
Twitter Logging Service is a robust and performant logging framework for iOS clients
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Objective-C", "color": "#438eff"}, "languages": "Objective-C Swift", "pushedAt": "2020-05-31T15:45:14Z", "forkCount": 26, "stargazers": 270, "watchers": 15}, "twitter/dodo": {"nameWithOwner": "twitter/dodo", "name": "dodo", "descriptionHTML": "
The Twitter OSS Project Builder
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "finagle twitter-oss scrooge ostrich twitter-server finatra sbt util", "primaryLanguage": {"name": "Shell", "color": "#89e051"}, "languages": "Shell", "pushedAt": "2020-06-24T21:53:23Z", "forkCount": 8, "stargazers": 20, "watchers": 26}, "twitter/analytics-infra-governance": {"nameWithOwner": "twitter/analytics-infra-governance", "name": "analytics-infra-governance", "descriptionHTML": "
Description of the process for how to commit, review, and release code to the Scalding OSS family (Scalding, Summingbird, Algebird, Bijection, Storehaus, etc)
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": null, "languages": "", "pushedAt": "2017-10-06T19:47:31Z", "forkCount": 4, "stargazers": 6, "watchers": 12}, "twitter/nodes": {"nameWithOwner": "twitter/nodes", "name": "nodes", "descriptionHTML": "
A library to implement asynchronous dependency graphs for services in Java
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2019-08-29T23:26:49Z", "forkCount": 30, "stargazers": 214, "watchers": 27}, "twitter/torch-twrl": {"nameWithOwner": "twitter/torch-twrl", "name": "torch-twrl", "descriptionHTML": "
Torch-twrl is a package that enables reinforcement learning in Torch.
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Lua", "color": "#000080"}, "languages": "Lua", "pushedAt": "2017-05-27T16:04:02Z", "forkCount": 49, "stargazers": 258, "watchers": 35}, "twitter/meta-learning-lstm": {"nameWithOwner": "twitter/meta-learning-lstm", "name": "meta-learning-lstm", "descriptionHTML": "
This repo contains the source code accompanying a scientific paper with the same name.
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Lua", "color": "#000080"}, "languages": "Lua Python", "pushedAt": "2017-02-28T04:54:04Z", "forkCount": 94, "stargazers": 267, "watchers": 16}, "twitter/ios-twitter-image-pipeline": {"nameWithOwner": "twitter/ios-twitter-image-pipeline", "name": "ios-twitter-image-pipeline", "descriptionHTML": "
Twitter Image Pipeline is a robust and performant image loading and caching framework for iOS clients
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C", "color": "#555555"}, "languages": "Objective-C C Shell Makefile", "pushedAt": "2020-05-31T05:01:15Z", "forkCount": 84, "stargazers": 1783, "watchers": 37}, "twitter/groupcache": {"nameWithOwner": "twitter/groupcache", "name": "groupcache", "descriptionHTML": "
groupcache is a caching and cache-filling library, intended as a replacement for memcached in many cases.
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Go", "color": "#00ADD8"}, "languages": "Go", "pushedAt": "2019-10-21T19:49:46Z", "forkCount": 0, "stargazers": 8, "watchers": 7}, "twitter/torch-decisiontree": {"nameWithOwner": "twitter/torch-decisiontree", "name": "torch-decisiontree", "descriptionHTML": "
This project implements random forests and gradient boosted decision trees (GBDT). The latter uses gradient tree boosting. Both use ensemble learning to produce ensembles of decision trees (that is, forests).
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Lua", "color": "#000080"}, "languages": "Lua C", "pushedAt": "2018-05-07T14:36:55Z", "forkCount": 6, "stargazers": 101, "watchers": 5}, "twitter/Serial": {"nameWithOwner": "twitter/Serial", "name": "Serial", "descriptionHTML": "
Light-weight, fast framework for object serialization in Java, with Android support.
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2019-06-06T22:17:03Z", "forkCount": 59, "stargazers": 778, "watchers": 35}, "twitter/rsc": {"nameWithOwner": "twitter/rsc", "name": "rsc", "descriptionHTML": "
Experimental Scala compiler focused on compilation speed
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2019-11-12T18:47:10Z", "forkCount": 40, "stargazers": 1247, "watchers": 92}, "twitter/ossdecks": {"nameWithOwner": "twitter/ossdecks", "name": "ossdecks", "descriptionHTML": "
Repository for Twitter Open Source Decks
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": null, "languages": "", "pushedAt": "2019-04-18T15:29:53Z", "forkCount": 5, "stargazers": 9, "watchers": 202}, "twitter/periscope-live-engagement-unity-sdk": {"nameWithOwner": "twitter/periscope-live-engagement-unity-sdk", "name": "periscope-live-engagement-unity-sdk", "descriptionHTML": "
Periscope Live Engagement Unity SDK
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "C#", "color": "#178600"}, "languages": "JavaScript C#", "pushedAt": "2019-06-07T00:23:45Z", "forkCount": 4, "stargazers": 18, "watchers": 4}, "twitter/go-bindata": {"nameWithOwner": "twitter/go-bindata", "name": "go-bindata", "descriptionHTML": "
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Go", "color": "#00ADD8"}, "languages": "Go", "pushedAt": "2019-10-01T01:39:29Z", "forkCount": 10, "stargazers": 14, "watchers": 8}, "twitter/iago2": {"nameWithOwner": "twitter/iago2", "name": "iago2", "descriptionHTML": "
A load generator, built for engineers
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Scala", "color": "#c22d40"}, "languages": "Scala", "pushedAt": "2019-12-20T16:32:47Z", "forkCount": 1, "stargazers": 13, "watchers": 4}, "twitter/gatekeeper-service": {"nameWithOwner": "twitter/gatekeeper-service", "name": "gatekeeper-service", "descriptionHTML": "
GateKeeper is a service built to automate the manual steps involved in onboarding, offboarding, and lost asset scenarios.
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Python", "color": "#3572A5"}, "languages": "Python HTML", "pushedAt": "2018-09-18T21:32:04Z", "forkCount": 3, "stargazers": 18, "watchers": 7}, "twitter/sekhmet": {"nameWithOwner": "twitter/sekhmet", "name": "sekhmet", "descriptionHTML": "
foundational tools and building blocks for gaining insights and diagnosing system health in real-time
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": null, "languages": "", "pushedAt": "2018-06-03T20:37:36Z", "forkCount": 1, "stargazers": 18, "watchers": 8}, "twitter/caladrius": {"nameWithOwner": "twitter/caladrius", "name": "caladrius", "descriptionHTML": "
Performance modelling system for Distributed Stream Processing Systems (DSPS) such as Apache Heron and Apache Storm
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Python", "color": "#3572A5"}, "languages": "Python", "pushedAt": "2018-08-25T03:30:17Z", "forkCount": 4, "stargazers": 13, "watchers": 6}, "twitter/repo-scaffolding": {"nameWithOwner": "twitter/repo-scaffolding", "name": "repo-scaffolding", "descriptionHTML": "
Tools for creating repos based on open source standards and best practices
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Python", "color": "#3572A5"}, "languages": "Python", "pushedAt": "2019-02-18T06:35:16Z", "forkCount": 6, "stargazers": 17, "watchers": 4}, "twitter/ios-twitter-network-layer": {"nameWithOwner": "twitter/ios-twitter-network-layer", "name": "ios-twitter-network-layer", "descriptionHTML": "
Twitter Network Layer is a scalable and feature rich network layer built on top of NSURLSession for Apple platforms
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Objective-C", "color": "#438eff"}, "languages": "Objective-C", "pushedAt": "2020-05-30T15:37:09Z", "forkCount": 19, "stargazers": 502, "watchers": 18}, "twitter/twemoji-parser": {"nameWithOwner": "twitter/twemoji-parser", "name": "twemoji-parser", "descriptionHTML": "
A simple library for identifying emoji entities within a string in order to render them as Twemoji.
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "JavaScript", "color": "#f1e05a"}, "languages": "JavaScript", "pushedAt": "2020-05-08T22:34:22Z", "forkCount": 13, "stargazers": 53, "watchers": 16}, "twitter/gpl-commitment": {"nameWithOwner": "twitter/gpl-commitment", "name": "gpl-commitment", "descriptionHTML": "
Twitter's GPL Cooperation Commitment
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": null, "languages": "", "pushedAt": "2018-10-26T21:12:33Z", "forkCount": 2, "stargazers": 2, "watchers": 3}, "twitter/sqrl": {"nameWithOwner": "twitter/sqrl", "name": "sqrl", "descriptionHTML": "
A Safe, Stateful Rules Language for Event Streams
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "TypeScript", "color": "#2b7489"}, "languages": "TypeScript CSS", "pushedAt": "2019-12-27T23:11:19Z", "forkCount": 4, "stargazers": 30, "watchers": 6}, "twitter/rezolus": {"nameWithOwner": "twitter/rezolus", "name": "rezolus", "descriptionHTML": "
Systems performance telemetry
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Rust", "color": "#dea584"}, "languages": "Rust C", "pushedAt": "2020-06-25T17:05:51Z", "forkCount": 42, "stargazers": 833, "watchers": 29}, "twitter/curation-style-guide": {"nameWithOwner": "twitter/curation-style-guide", "name": "curation-style-guide", "descriptionHTML": "
Document Repository for Twitter's Curation Style Guide
", "homepageUrl": "https://help.twitter.com/en/rules-and-policies/curationstyleguide", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": null, "languages": "", "pushedAt": "2019-06-20T20:58:52Z", "forkCount": 1, "stargazers": 5, "watchers": 4}, "twitter/sbf": {"nameWithOwner": "twitter/sbf", "name": "sbf", "descriptionHTML": "
", "homepageUrl": null, "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Java", "color": "#b07219"}, "languages": "Java", "pushedAt": "2020-02-07T01:45:45Z", "forkCount": 1, "stargazers": 5, "watchers": 2}, "pantsbuild/pants": {"nameWithOwner": "pantsbuild/pants", "name": "pants", "descriptionHTML": "
The Pants Build System
", "homepageUrl": "https://pants.readme.io/docs/welcome-to-pants", "isPrivate": false, "repositoryTopics": "build-tool build-tools build-system monorepo python java scala golang javascript rust", "primaryLanguage": {"name": "Python", "color": "#3572A5"}, "languages": "Python Rust", "pushedAt": "2020-06-29T02:24:06Z", "forkCount": 373, "stargazers": 1330, "watchers": 61}, "pantsbuild/pex": {"nameWithOwner": "pantsbuild/pex", "name": "pex", "descriptionHTML": "
A library and tool for generating .pex (Python EXecutable) files
", "homepageUrl": "", "isPrivate": false, "repositoryTopics": "", "primaryLanguage": {"name": "Python", "color": "#3572A5"}, "languages": "Python", "pushedAt": "2020-06-19T21:47:24Z", "forkCount": 176, "stargazers": 1647, "watchers": 51}, "twitterdev/search-tweets-python": {"nameWithOwner": "twitterdev/search-tweets-python", "name": "search-tweets-python", "descriptionHTML": "
Python wrapper for Twitter Premium and Enterprise Search APIs. New support for Labs Recent search endpoint.
", "homepageUrl": "https://twitterdev.github.io/search-tweets-python/", "isPrivate": false, "repositoryTopics": "search twitter python twitter-api twitter-apis twitterapi enterprise premium", "primaryLanguage": {"name": "Python", "color": "#3572A5"}, "languages": "Python", "pushedAt": "2020-06-10T17:11:26Z", "forkCount": 93, "stargazers": 191, "watchers": 25}} \ No newline at end of file +{ + "pantsbuild/pants": { + "descriptionHTML": "
The Pants Build System
", + "forkCount": 569, + "homepageUrl": "https://www.pantsbuild.org", + "isPrivate": false, + "languages": "Python Rust", + "name": "pants", + "nameWithOwner": "pantsbuild/pants", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2023-09-11T01:33:23Z", + "repositoryTopics": "build-tool build-tools build-system monorepo python java scala golang javascript rust monorepos pants build protobuf shell docker aws-lambda pex pantsbuild kotlin", + "stargazers": 2801, + "watchers": 65 + }, + "pantsbuild/pex": { + "descriptionHTML": "
A tool for generating .pex (Python EXecutable) files, lock files and venvs.
", + "forkCount": 244, + "homepageUrl": "https://pex.readthedocs.io", + "isPrivate": false, + "languages": "Python", + "name": "pex", + "nameWithOwner": "pantsbuild/pex", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2023-09-09T22:18:50Z", + "repositoryTopics": "", + "stargazers": 2368, + "watchers": 55 + }, + "twitter/.github": { + "descriptionHTML": "
Twitter GitHub Organization-wide files
", + "forkCount": 62, + "homepageUrl": null, + "isPrivate": false, + "languages": "", + "name": ".github", + "nameWithOwner": "twitter/.github", + "primaryLanguage": null, + "pushedAt": "2023-04-01T06:23:08Z", + "repositoryTopics": "", + "stargazers": 42, + "watchers": 10 + }, + "twitter/AnomalyDetection": { + "descriptionHTML": "
Anomaly Detection with R
", + "forkCount": 779, + "homepageUrl": "", + "isPrivate": false, + "languages": "R", + "name": "AnomalyDetection", + "nameWithOwner": "twitter/AnomalyDetection", + "primaryLanguage": { + "color": "#198CE7", + "name": "R" + }, + "pushedAt": "2019-08-30T19:49:16Z", + "repositoryTopics": "", + "stargazers": 3514, + "watchers": 332 + }, + "twitter/BreakoutDetection": { + "descriptionHTML": "
Breakout Detection via Robust E-Statistics
", + "forkCount": 182, + "homepageUrl": "", + "isPrivate": false, + "languages": "R C++", + "name": "BreakoutDetection", + "nameWithOwner": "twitter/BreakoutDetection", + "primaryLanguage": { + "color": "#f34b7d", + "name": "C++" + }, + "pushedAt": "2017-08-15T03:23:50Z", + "repositoryTopics": "", + "stargazers": 751, + "watchers": 164 + }, + "twitter/GraphJet": { + "descriptionHTML": "
GraphJet is a real-time graph processing library.
", + "forkCount": 115, + "homepageUrl": "", + "isPrivate": false, + "languages": "Java", + "name": "GraphJet", + "nameWithOwner": "twitter/GraphJet", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-04-10T11:24:19Z", + "repositoryTopics": "", + "stargazers": 692, + "watchers": 40 + }, + "twitter/SentenTree": { + "descriptionHTML": "
A novel text visualization technique
", + "forkCount": 55, + "homepageUrl": "", + "isPrivate": false, + "languages": "Python JavaScript", + "name": "SentenTree", + "nameWithOwner": "twitter/SentenTree", + "primaryLanguage": { + "color": "#f1e05a", + "name": "JavaScript" + }, + "pushedAt": "2023-04-10T11:37:45Z", + "repositoryTopics": "", + "stargazers": 216, + "watchers": 17 + }, + "twitter/Serial": { + "descriptionHTML": "
Light-weight, fast framework for object serialization in Java, with Android support.
", + "forkCount": 108, + "homepageUrl": null, + "isPrivate": false, + "languages": "Java", + "name": "Serial", + "nameWithOwner": "twitter/Serial", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-04-10T11:21:25Z", + "repositoryTopics": "", + "stargazers": 982, + "watchers": 41 + }, + "twitter/TwitterTextEditor": { + "descriptionHTML": "
A standalone, flexible API that provides a full-featured rich text editor for iOS applications.
", + "forkCount": 157, + "homepageUrl": "", + "isPrivate": false, + "languages": "Swift", + "name": "TwitterTextEditor", + "nameWithOwner": "twitter/TwitterTextEditor", + "primaryLanguage": { + "color": "#F05138", + "name": "Swift" + }, + "pushedAt": "2023-04-10T11:23:42Z", + "repositoryTopics": "ios uikit swift textkit", + "stargazers": 2917, + "watchers": 48 + }, + "twitter/activerecord-reputation-system": { + "descriptionHTML": "
An Active Record Reputation System for Rails
", + "forkCount": 134, + "homepageUrl": "", + "isPrivate": false, + "languages": "Ruby", + "name": "activerecord-reputation-system", + "nameWithOwner": "twitter/activerecord-reputation-system", + "primaryLanguage": { + "color": "#701516", + "name": "Ruby" + }, + "pushedAt": "2016-01-14T23:40:36Z", + "repositoryTopics": "", + "stargazers": 1336, + "watchers": 145 + }, + "twitter/algebird": { + "descriptionHTML": "
Abstract Algebra for Scala
", + "forkCount": 351, + "homepageUrl": "https://twitter.github.io/algebird", + "isPrivate": false, + "languages": "Scala", + "name": "algebird", + "nameWithOwner": "twitter/algebird", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-09-09T16:09:23Z", + "repositoryTopics": "", + "stargazers": 2266, + "watchers": 237 + }, + "twitter/analytics-infra-governance": { + "descriptionHTML": "
Description of the process for how to commit, review, and release code to the Scalding OSS family (Scalding, Summingbird, Algebird, Bijection, Storehaus, etc)
", + "forkCount": 14, + "homepageUrl": "", + "isPrivate": false, + "languages": "", + "name": "analytics-infra-governance", + "nameWithOwner": "twitter/analytics-infra-governance", + "primaryLanguage": null, + "pushedAt": "2017-10-06T19:47:31Z", + "repositoryTopics": "", + "stargazers": 9, + "watchers": 14 + }, + "twitter/bazel-multiversion": { + "descriptionHTML": "
Bazel rules to resolve, fetch and manage 3rdparty JVM dependencies with support for multiple parallel versions of the same dependency. Powered by Coursier.
", + "forkCount": 22, + "homepageUrl": "", + "isPrivate": false, + "languages": "Starlark Scala Shell", + "name": "bazel-multiversion", + "nameWithOwner": "twitter/bazel-multiversion", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-06-01T14:21:34Z", + "repositoryTopics": "bazel jvm dependency-manager coursier scala java kotlin bazel-rules bazel-build", + "stargazers": 45, + "watchers": 11 + }, + "twitter/bijection": { + "descriptionHTML": "
Reversible conversions between types
", + "forkCount": 132, + "homepageUrl": "", + "isPrivate": false, + "languages": "Scala Java", + "name": "bijection", + "nameWithOwner": "twitter/bijection", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-09-09T07:14:56Z", + "repositoryTopics": "", + "stargazers": 658, + "watchers": 141 + }, + "twitter/birdwatch": { + "descriptionHTML": "
", + "forkCount": 14, + "homepageUrl": null, + "isPrivate": false, + "languages": "", + "name": "birdwatch", + "nameWithOwner": "twitter/birdwatch", + "primaryLanguage": null, + "pushedAt": "2023-04-03T17:01:47Z", + "repositoryTopics": "", + "stargazers": 64, + "watchers": 14 + }, + "twitter/cache-trace": { + "descriptionHTML": "
A collection of Twitter's anonymized production cache traces.
", + "forkCount": 28, + "homepageUrl": "", + "isPrivate": false, + "languages": "Shell", + "name": "cache-trace", + "nameWithOwner": "twitter/cache-trace", + "primaryLanguage": { + "color": "#89e051", + "name": "Shell" + }, + "pushedAt": "2021-12-13T17:31:05Z", + "repositoryTopics": "cache trace production memcached redis", + "stargazers": 137, + "watchers": 9 + }, + "twitter/caladrius": { + "descriptionHTML": "
Performance modelling system for Distributed Stream Processing Systems (DSPS) such as Apache Heron and Apache Storm
", + "forkCount": 18, + "homepageUrl": "", + "isPrivate": false, + "languages": "Python", + "name": "caladrius", + "nameWithOwner": "twitter/caladrius", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2023-04-10T11:46:19Z", + "repositoryTopics": "", + "stargazers": 23, + "watchers": 9 + }, + "twitter/cassovary": { + "descriptionHTML": "
Cassovary is a simple big graph processing library for the JVM
", + "forkCount": 153, + "homepageUrl": "http://twitter.com/cassovary", + "isPrivate": false, + "languages": "Scala", + "name": "cassovary", + "nameWithOwner": "twitter/cassovary", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2021-10-08T21:22:29Z", + "repositoryTopics": "", + "stargazers": 1043, + "watchers": 162 + }, + "twitter/ccommon": { + "descriptionHTML": "
Cache Commons
", + "forkCount": 43, + "homepageUrl": null, + "isPrivate": false, + "languages": "CMake C Rust", + "name": "ccommon", + "nameWithOwner": "twitter/ccommon", + "primaryLanguage": { + "color": "#555555", + "name": "C" + }, + "pushedAt": "2022-09-29T20:54:30Z", + "repositoryTopics": "", + "stargazers": 99, + "watchers": 58 + }, + "twitter/check-my-repo": { + "descriptionHTML": "
Automatically check repositories health and quality and build reports that help us understand the current state of Sauce Labs repositories
", + "forkCount": 15, + "homepageUrl": "https://opensource.saucelabs.com/check-my-repo/", + "isPrivate": false, + "languages": "JavaScript Vue", + "name": "check-my-repo", + "nameWithOwner": "twitter/check-my-repo", + "primaryLanguage": { + "color": "#41b883", + "name": "Vue" + }, + "pushedAt": "2023-04-10T11:39:02Z", + "repositoryTopics": "", + "stargazers": 9, + "watchers": 2 + }, + "twitter/chill": { + "descriptionHTML": "
Scala extensions for the Kryo serialization library
", + "forkCount": 152, + "homepageUrl": "https://twitter.com/scalding", + "isPrivate": false, + "languages": "Scala Java", + "name": "chill", + "nameWithOwner": "twitter/chill", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-09-09T07:16:45Z", + "repositoryTopics": "", + "stargazers": 598, + "watchers": 134 + }, + "twitter/cloudhopper-commons": { + "descriptionHTML": "
Cloudhopper Commons
", + "forkCount": 72, + "homepageUrl": null, + "isPrivate": false, + "languages": "Java", + "name": "cloudhopper-commons", + "nameWithOwner": "twitter/cloudhopper-commons", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-06-13T22:50:47Z", + "repositoryTopics": "", + "stargazers": 54, + "watchers": 120 + }, + "twitter/communitynotes": { + "descriptionHTML": "
Documentation and source code powering Twitter's Community Notes
", + "forkCount": 131, + "homepageUrl": "https://twitter.github.io/communitynotes", + "isPrivate": false, + "languages": "Python", + "name": "communitynotes", + "nameWithOwner": "twitter/communitynotes", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2023-09-07T18:31:15Z", + "repositoryTopics": "crowdsourcing twitter", + "stargazers": 871, + "watchers": 41 + }, + "twitter/compose-rules": { + "descriptionHTML": "
Static checks to aid with a healthy adoption of Compose
", + "forkCount": 75, + "homepageUrl": "https://twitter.github.io/compose-rules", + "isPrivate": false, + "languages": "Kotlin", + "name": "compose-rules", + "nameWithOwner": "twitter/compose-rules", + "primaryLanguage": { + "color": "#A97BFF", + "name": "Kotlin" + }, + "pushedAt": "2023-08-23T18:38:03Z", + "repositoryTopics": "android jetpack-compose ktlint static-code-analysis", + "stargazers": 1268, + "watchers": 25 + }, + "twitter/curation-style-guide": { + "descriptionHTML": "
Document Repository for Twitter's Curation Style Guide
", + "forkCount": 13, + "homepageUrl": "https://help.twitter.com/en/rules-and-policies/curationstyleguide", + "isPrivate": false, + "languages": "", + "name": "curation-style-guide", + "nameWithOwner": "twitter/curation-style-guide", + "primaryLanguage": null, + "pushedAt": "2019-06-20T20:58:52Z", + "repositoryTopics": "", + "stargazers": 10, + "watchers": 6 + }, + "twitter/d3kit": { + "descriptionHTML": "
D3Kit is a set tools to speed D3 related project development
", + "forkCount": 53, + "homepageUrl": null, + "isPrivate": false, + "languages": "JavaScript", + "name": "d3kit", + "nameWithOwner": "twitter/d3kit", + "primaryLanguage": { + "color": "#f1e05a", + "name": "JavaScript" + }, + "pushedAt": "2021-11-01T17:23:07Z", + "repositoryTopics": "", + "stargazers": 428, + "watchers": 103 + }, + "twitter/dict_minimize": { + "descriptionHTML": "
Access scipy optimizers from your favorite deep learning framework.
", + "forkCount": 21, + "homepageUrl": "", + "isPrivate": false, + "languages": "Python Shell", + "name": "dict_minimize", + "nameWithOwner": "twitter/dict_minimize", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2023-06-30T22:19:47Z", + "repositoryTopics": "scipy scipy-stack", + "stargazers": 75, + "watchers": 8 + }, + "twitter/diffusion-rl": { + "descriptionHTML": "
", + "forkCount": 12, + "homepageUrl": null, + "isPrivate": false, + "languages": "Python", + "name": "diffusion-rl", + "nameWithOwner": "twitter/diffusion-rl", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2022-12-09T06:48:08Z", + "repositoryTopics": "", + "stargazers": 62, + "watchers": 6 + }, + "twitter/dodo": { + "descriptionHTML": "
The Twitter OSS Project Builder
", + "forkCount": 25, + "homepageUrl": "", + "isPrivate": false, + "languages": "Shell", + "name": "dodo", + "nameWithOwner": "twitter/dodo", + "primaryLanguage": { + "color": "#89e051", + "name": "Shell" + }, + "pushedAt": "2023-04-10T11:42:15Z", + "repositoryTopics": "finagle twitter-oss scrooge ostrich twitter-server finatra sbt util", + "stargazers": 35, + "watchers": 25 + }, + "twitter/dodo-build": { + "descriptionHTML": "
A Github Action for running Dodo: The Twitter OSS Project Builder
", + "forkCount": 13, + "homepageUrl": "https://github.com/twitter/dodo", + "isPrivate": false, + "languages": "TypeScript JavaScript", + "name": "dodo-build", + "nameWithOwner": "twitter/dodo-build", + "primaryLanguage": { + "color": "#3178c6", + "name": "TypeScript" + }, + "pushedAt": "2023-05-12T12:22:26Z", + "repositoryTopics": "", + "stargazers": 3, + "watchers": 3 + }, + "twitter/effectivescala": { + "descriptionHTML": "
Twitter's Effective Scala Guide
", + "forkCount": 639, + "homepageUrl": "https://twitter.github.io/effectivescala", + "isPrivate": false, + "languages": "Makefile Shell HTML", + "name": "effectivescala", + "nameWithOwner": "twitter/effectivescala", + "primaryLanguage": { + "color": "#e34c26", + "name": "HTML" + }, + "pushedAt": "2023-04-10T11:47:00Z", + "repositoryTopics": "", + "stargazers": 2233, + "watchers": 264 + }, + "twitter/elephant-bird": { + "descriptionHTML": "
Twitter's collection of LZO and Protocol Buffer-related Hadoop, Pig, Hive, and HBase code.
", + "forkCount": 403, + "homepageUrl": "", + "isPrivate": false, + "languages": "Java", + "name": "elephant-bird", + "nameWithOwner": "twitter/elephant-bird", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-04-10T11:31:57Z", + "repositoryTopics": "", + "stargazers": 1138, + "watchers": 191 + }, + "twitter/fatcache": { + "descriptionHTML": "
Memcache on SSD
", + "forkCount": 186, + "homepageUrl": "", + "isPrivate": false, + "languages": "C", + "name": "fatcache", + "nameWithOwner": "twitter/fatcache", + "primaryLanguage": { + "color": "#555555", + "name": "C" + }, + "pushedAt": "2021-11-01T18:32:51Z", + "repositoryTopics": "", + "stargazers": 1302, + "watchers": 208 + }, + "twitter/finagle": { + "descriptionHTML": "
A fault tolerant, protocol-agnostic RPC system
", + "forkCount": 1470, + "homepageUrl": "https://twitter.github.io/finagle", + "isPrivate": false, + "languages": "Scala", + "name": "finagle", + "nameWithOwner": "twitter/finagle", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-09-06T18:22:19Z", + "repositoryTopics": "rpc distributed-systems finagle http http2 thrift mysql memcached redis zipkin java scala", + "stargazers": 8703, + "watchers": 562 + }, + "twitter/finatra": { + "descriptionHTML": "
Fast, testable, Scala services built on TwitterServer and Finagle
", + "forkCount": 419, + "homepageUrl": "https://twitter.github.io/finatra/", + "isPrivate": false, + "languages": "Java Scala Starlark", + "name": "finatra", + "nameWithOwner": "twitter/finatra", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-05-25T14:50:18Z", + "repositoryTopics": "scala finagle twitter-server http framework microservices thrift guice slf4j testing", + "stargazers": 2270, + "watchers": 216 + }, + "twitter/focus": { + "descriptionHTML": "
Focus aligns Git worktree content based on outlines of a repository's Bazel build graph. Focused repos are sparse, shallow, and thin and unlock markedly better performance in large repos.
", + "forkCount": 24, + "homepageUrl": "", + "isPrivate": false, + "languages": "Rust", + "name": "focus", + "nameWithOwner": "twitter/focus", + "primaryLanguage": { + "color": "#dea584", + "name": "Rust" + }, + "pushedAt": "2023-05-12T12:23:02Z", + "repositoryTopics": "bazel git source-control sparse-checkout", + "stargazers": 87, + "watchers": 6 + }, + "twitter/gatekeeper-service": { + "descriptionHTML": "
GateKeeper is a service built to automate the manual steps involved in onboarding, offboarding, and lost asset scenarios.
", + "forkCount": 18, + "homepageUrl": "", + "isPrivate": false, + "languages": "Python HTML", + "name": "gatekeeper-service", + "nameWithOwner": "twitter/gatekeeper-service", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2023-02-19T21:23:35Z", + "repositoryTopics": "", + "stargazers": 36, + "watchers": 13 + }, + "twitter/go-bindata": { + "descriptionHTML": "
", + "forkCount": 38, + "homepageUrl": null, + "isPrivate": false, + "languages": "Go", + "name": "go-bindata", + "nameWithOwner": "twitter/go-bindata", + "primaryLanguage": { + "color": "#00ADD8", + "name": "Go" + }, + "pushedAt": "2023-04-10T11:23:03Z", + "repositoryTopics": "", + "stargazers": 67, + "watchers": 11 + }, + "twitter/google-tag-manager-base-tag": { + "descriptionHTML": "
", + "forkCount": 7, + "homepageUrl": null, + "isPrivate": false, + "languages": "Smarty", + "name": "google-tag-manager-base-tag", + "nameWithOwner": "twitter/google-tag-manager-base-tag", + "primaryLanguage": { + "color": "#f0c040", + "name": "Smarty" + }, + "pushedAt": "2022-08-25T20:15:22Z", + "repositoryTopics": "", + "stargazers": 2, + "watchers": 5 + }, + "twitter/google-tag-manager-event-tag": { + "descriptionHTML": "
", + "forkCount": 8, + "homepageUrl": null, + "isPrivate": false, + "languages": "Smarty", + "name": "google-tag-manager-event-tag", + "nameWithOwner": "twitter/google-tag-manager-event-tag", + "primaryLanguage": { + "color": "#f0c040", + "name": "Smarty" + }, + "pushedAt": "2022-08-25T20:16:31Z", + "repositoryTopics": "", + "stargazers": 3, + "watchers": 5 + }, + "twitter/gpl-commitment": { + "descriptionHTML": "
Twitter's GPL Cooperation Commitment
", + "forkCount": 11, + "homepageUrl": "", + "isPrivate": false, + "languages": "", + "name": "gpl-commitment", + "nameWithOwner": "twitter/gpl-commitment", + "primaryLanguage": null, + "pushedAt": "2021-07-13T18:48:10Z", + "repositoryTopics": "", + "stargazers": 5, + "watchers": 8 + }, + "twitter/groupcache": { + "descriptionHTML": "
groupcache is a caching and cache-filling library, intended as a replacement for memcached in many cases.
", + "forkCount": 12, + "homepageUrl": "", + "isPrivate": false, + "languages": "Go", + "name": "groupcache", + "nameWithOwner": "twitter/groupcache", + "primaryLanguage": { + "color": "#00ADD8", + "name": "Go" + }, + "pushedAt": "2023-04-10T11:48:17Z", + "repositoryTopics": "", + "stargazers": 20, + "watchers": 8 + }, + "twitter/hadoop-lzo": { + "descriptionHTML": "
Refactored version of code.google.com/hadoop-gpl-compression for hadoop 0.20
", + "forkCount": 335, + "homepageUrl": "", + "isPrivate": false, + "languages": "Shell Java C", + "name": "hadoop-lzo", + "nameWithOwner": "twitter/hadoop-lzo", + "primaryLanguage": { + "color": "#89e051", + "name": "Shell" + }, + "pushedAt": "2023-04-10T11:34:31Z", + "repositoryTopics": "", + "stargazers": 544, + "watchers": 149 + }, + "twitter/hbc": { + "descriptionHTML": "
A Java HTTP client for consuming Twitter's realtime Streaming API
", + "forkCount": 387, + "homepageUrl": "https://developer.twitter.com/en/docs/tweets/filter-realtime/overview", + "isPrivate": false, + "languages": "Java", + "name": "hbc", + "nameWithOwner": "twitter/hbc", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2022-04-06T19:20:25Z", + "repositoryTopics": "twitter4j stream java realtime tweets", + "stargazers": 963, + "watchers": 194 + }, + "twitter/hogan.js": { + "descriptionHTML": "
A compiler for the Mustache templating language
", + "forkCount": 466, + "homepageUrl": "http://twitter.github.io/hogan.js", + "isPrivate": false, + "languages": "JavaScript", + "name": "hogan.js", + "nameWithOwner": "twitter/hogan.js", + "primaryLanguage": { + "color": "#f1e05a", + "name": "JavaScript" + }, + "pushedAt": "2023-04-10T11:35:08Z", + "repositoryTopics": "", + "stargazers": 5137, + "watchers": 247 + }, + "twitter/hpack": { + "descriptionHTML": "
Header Compression for HTTP/2
", + "forkCount": 62, + "homepageUrl": "https://twitter.com/http_2", + "isPrivate": false, + "languages": "Java", + "name": "hpack", + "nameWithOwner": "twitter/hpack", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-04-10T11:35:45Z", + "repositoryTopics": "", + "stargazers": 192, + "watchers": 125 + }, + "twitter/hraven": { + "descriptionHTML": "
hRaven collects run time data and statistics from MapReduce jobs in an easily queryable format
", + "forkCount": 76, + "homepageUrl": "https://twitter.com/twitterhadoop", + "isPrivate": false, + "languages": "Java", + "name": "hraven", + "nameWithOwner": "twitter/hraven", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2022-01-14T18:50:25Z", + "repositoryTopics": "", + "stargazers": 128, + "watchers": 134 + }, + "twitter/iago2": { + "descriptionHTML": "
A load generator, built for engineers
", + "forkCount": 16, + "homepageUrl": "", + "isPrivate": false, + "languages": "Scala", + "name": "iago2", + "nameWithOwner": "twitter/iago2", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-04-10T11:31:15Z", + "repositoryTopics": "", + "stargazers": 24, + "watchers": 7 + }, + "twitter/innovators-patent-agreement": { + "descriptionHTML": "
Innovators Patent Agreement (IPA)
", + "forkCount": 140, + "homepageUrl": "", + "isPrivate": false, + "languages": "", + "name": "innovators-patent-agreement", + "nameWithOwner": "twitter/innovators-patent-agreement", + "primaryLanguage": null, + "pushedAt": "2016-06-14T06:33:54Z", + "repositoryTopics": "", + "stargazers": 918, + "watchers": 176 + }, + "twitter/interactive": { + "descriptionHTML": "
Twitter interactive visualization
", + "forkCount": 79, + "homepageUrl": "https://twitter.github.io/interactive", + "isPrivate": false, + "languages": "CSS HTML JavaScript", + "name": "interactive", + "nameWithOwner": "twitter/interactive", + "primaryLanguage": { + "color": "#e34c26", + "name": "HTML" + }, + "pushedAt": "2021-11-01T17:11:32Z", + "repositoryTopics": "", + "stargazers": 213, + "watchers": 151 + }, + "twitter/ios-twitter-apache-thrift": { + "descriptionHTML": "
A thrift encoding and decoding library for Swift
", + "forkCount": 15, + "homepageUrl": "", + "isPrivate": false, + "languages": "Swift", + "name": "ios-twitter-apache-thrift", + "nameWithOwner": "twitter/ios-twitter-apache-thrift", + "primaryLanguage": { + "color": "#F05138", + "name": "Swift" + }, + "pushedAt": "2022-02-04T22:44:49Z", + "repositoryTopics": "", + "stargazers": 35, + "watchers": 6 + }, + "twitter/ios-twitter-image-pipeline": { + "descriptionHTML": "
Twitter Image Pipeline is a robust and performant image loading and caching framework for iOS clients
", + "forkCount": 118, + "homepageUrl": "", + "isPrivate": false, + "languages": "Objective-C C Shell Makefile", + "name": "ios-twitter-image-pipeline", + "nameWithOwner": "twitter/ios-twitter-image-pipeline", + "primaryLanguage": { + "color": "#555555", + "name": "C" + }, + "pushedAt": "2023-05-20T20:03:46Z", + "repositoryTopics": "image-pipeline ios swift objective-c twitter cache", + "stargazers": 1849, + "watchers": 38 + }, + "twitter/ios-twitter-logging-service": { + "descriptionHTML": "
Twitter Logging Service is a robust and performant logging framework for iOS clients
", + "forkCount": 44, + "homepageUrl": "", + "isPrivate": false, + "languages": "Objective-C Swift", + "name": "ios-twitter-logging-service", + "nameWithOwner": "twitter/ios-twitter-logging-service", + "primaryLanguage": { + "color": "#438eff", + "name": "Objective-C" + }, + "pushedAt": "2023-05-20T20:04:22Z", + "repositoryTopics": "ios twitter logging xcode", + "stargazers": 298, + "watchers": 17 + }, + "twitter/ios-twitter-network-layer": { + "descriptionHTML": "
Twitter Network Layer is a scalable and feature rich network layer built on top of NSURLSession for Apple platforms
", + "forkCount": 39, + "homepageUrl": "", + "isPrivate": false, + "languages": "Objective-C", + "name": "ios-twitter-network-layer", + "nameWithOwner": "twitter/ios-twitter-network-layer", + "primaryLanguage": { + "color": "#438eff", + "name": "Objective-C" + }, + "pushedAt": "2021-10-21T17:28:27Z", + "repositoryTopics": "ios networking twitter nsurlsession http framework", + "stargazers": 570, + "watchers": 24 + }, + "twitter/joauth": { + "descriptionHTML": "
A Java library for authenticating HTTP Requests using OAuth
", + "forkCount": 67, + "homepageUrl": "", + "isPrivate": false, + "languages": "Scala Java", + "name": "joauth", + "nameWithOwner": "twitter/joauth", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-04-10T11:47:38Z", + "repositoryTopics": "", + "stargazers": 210, + "watchers": 130 + }, + "twitter/labella.js": { + "descriptionHTML": "
Placing labels on a timeline without overlap.
", + "forkCount": 158, + "homepageUrl": "http://twitter.github.io/labella.js/", + "isPrivate": false, + "languages": "JavaScript", + "name": "labella.js", + "nameWithOwner": "twitter/labella.js", + "primaryLanguage": { + "color": "#f1e05a", + "name": "JavaScript" + }, + "pushedAt": "2023-04-10T11:45:02Z", + "repositoryTopics": "", + "stargazers": 3857, + "watchers": 81 + }, + "twitter/libwatchman": { + "descriptionHTML": "
A C interface to watchman
", + "forkCount": 33, + "homepageUrl": "", + "isPrivate": false, + "languages": "Shell C", + "name": "libwatchman", + "nameWithOwner": "twitter/libwatchman", + "primaryLanguage": { + "color": "#555555", + "name": "C" + }, + "pushedAt": "2019-06-07T00:45:31Z", + "repositoryTopics": "", + "stargazers": 44, + "watchers": 120 + }, + "twitter/metrics": { + "descriptionHTML": "
", + "forkCount": 39, + "homepageUrl": "https://twitter.github.io/metrics", + "isPrivate": false, + "languages": "", + "name": "metrics", + "nameWithOwner": "twitter/metrics", + "primaryLanguage": null, + "pushedAt": "2023-09-11T02:26:36Z", + "repositoryTopics": "", + "stargazers": 75, + "watchers": 7 + }, + "twitter/netty-http2": { + "descriptionHTML": "
HTTP/2 for Netty
", + "forkCount": 61, + "homepageUrl": "", + "isPrivate": false, + "languages": "Java", + "name": "netty-http2", + "nameWithOwner": "twitter/netty-http2", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-04-10T11:45:39Z", + "repositoryTopics": "", + "stargazers": 120, + "watchers": 114 + }, + "twitter/nodes": { + "descriptionHTML": "
A library to implement asynchronous dependency graphs for services in Java
", + "forkCount": 54, + "homepageUrl": "", + "isPrivate": false, + "languages": "Java", + "name": "nodes", + "nameWithOwner": "twitter/nodes", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-04-10T11:33:53Z", + "repositoryTopics": "", + "stargazers": 242, + "watchers": 29 + }, + "twitter/opensource-website": { + "descriptionHTML": "
Twitter's open source website, identifying projects we've released, organizations we support, and the work we do to support open source.
", + "forkCount": 819, + "homepageUrl": "https://opensource.twitter.dev", + "isPrivate": false, + "languages": "HTML Python SCSS", + "name": "opensource-website", + "nameWithOwner": "twitter/opensource-website", + "primaryLanguage": { + "color": "#c6538c", + "name": "SCSS" + }, + "pushedAt": "2023-09-04T03:02:52Z", + "repositoryTopics": "ospo", + "stargazers": 2782, + "watchers": 422 + }, + "twitter/ossdecks": { + "descriptionHTML": "
Repository for Twitter Open Source Decks
", + "forkCount": 18, + "homepageUrl": null, + "isPrivate": false, + "languages": "", + "name": "ossdecks", + "nameWithOwner": "twitter/ossdecks", + "primaryLanguage": null, + "pushedAt": "2019-04-18T15:29:53Z", + "repositoryTopics": "", + "stargazers": 10, + "watchers": 210 + }, + "twitter/pelikan": { + "descriptionHTML": "
Pelikan is Twitter's unified cache backend
", + "forkCount": 180, + "homepageUrl": "", + "isPrivate": false, + "languages": "C Rust", + "name": "pelikan", + "nameWithOwner": "twitter/pelikan", + "primaryLanguage": { + "color": "#555555", + "name": "C" + }, + "pushedAt": "2023-05-12T12:23:40Z", + "repositoryTopics": "", + "stargazers": 1896, + "watchers": 53 + }, + "twitter/repo-scaffolding": { + "descriptionHTML": "
Tools for creating repos based on open source standards and best practices
", + "forkCount": 23, + "homepageUrl": "", + "isPrivate": false, + "languages": "", + "name": "repo-scaffolding", + "nameWithOwner": "twitter/repo-scaffolding", + "primaryLanguage": null, + "pushedAt": "2021-08-17T17:58:52Z", + "repositoryTopics": "", + "stargazers": 31, + "watchers": 7 + }, + "twitter/rezolus": { + "descriptionHTML": "
Systems performance telemetry
", + "forkCount": 113, + "homepageUrl": null, + "isPrivate": false, + "languages": "Rust C", + "name": "rezolus", + "nameWithOwner": "twitter/rezolus", + "primaryLanguage": { + "color": "#dea584", + "name": "Rust" + }, + "pushedAt": "2023-05-01T11:09:19Z", + "repositoryTopics": "", + "stargazers": 1534, + "watchers": 38 + }, + "twitter/rpc-perf": { + "descriptionHTML": "
A tool for benchmarking RPC services
", + "forkCount": 80, + "homepageUrl": null, + "isPrivate": false, + "languages": "Rust", + "name": "rpc-perf", + "nameWithOwner": "twitter/rpc-perf", + "primaryLanguage": { + "color": "#dea584", + "name": "Rust" + }, + "pushedAt": "2023-04-03T22:55:54Z", + "repositoryTopics": "", + "stargazers": 459, + "watchers": 27 + }, + "twitter/rsc": { + "descriptionHTML": "
Experimental Scala compiler focused on compilation speed
", + "forkCount": 53, + "homepageUrl": "", + "isPrivate": false, + "languages": "Scala", + "name": "rsc", + "nameWithOwner": "twitter/rsc", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2021-10-21T17:27:10Z", + "repositoryTopics": "", + "stargazers": 1247, + "watchers": 78 + }, + "twitter/rustcommon": { + "descriptionHTML": "
Common Twitter Rust lib
", + "forkCount": 40, + "homepageUrl": null, + "isPrivate": false, + "languages": "Rust", + "name": "rustcommon", + "nameWithOwner": "twitter/rustcommon", + "primaryLanguage": { + "color": "#dea584", + "name": "Rust" + }, + "pushedAt": "2022-10-19T21:26:21Z", + "repositoryTopics": "", + "stargazers": 337, + "watchers": 11 + }, + "twitter/sbf": { + "descriptionHTML": "
", + "forkCount": 37, + "homepageUrl": null, + "isPrivate": false, + "languages": "Java", + "name": "sbf", + "nameWithOwner": "twitter/sbf", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-04-10T11:32:34Z", + "repositoryTopics": "", + "stargazers": 149, + "watchers": 6 + }, + "twitter/scala_school": { + "descriptionHTML": "
Lessons in the Fundamentals of Scala
", + "forkCount": 1150, + "homepageUrl": "https://twitter.github.io/scala_school", + "isPrivate": false, + "languages": "Scala Java Shell HTML", + "name": "scala_school", + "nameWithOwner": "twitter/scala_school", + "primaryLanguage": { + "color": "#e34c26", + "name": "HTML" + }, + "pushedAt": "2023-04-10T11:42:57Z", + "repositoryTopics": "", + "stargazers": 3695, + "watchers": 329 + }, + "twitter/scala_school2": { + "descriptionHTML": "
Scala School 2
", + "forkCount": 79, + "homepageUrl": null, + "isPrivate": false, + "languages": "Scala CSS JavaScript HTML", + "name": "scala_school2", + "nameWithOwner": "twitter/scala_school2", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2021-10-08T21:12:10Z", + "repositoryTopics": "", + "stargazers": 346, + "watchers": 154 + }, + "twitter/scalding": { + "descriptionHTML": "
A Scala API for Cascading
", + "forkCount": 716, + "homepageUrl": "http://twitter.com/scalding", + "isPrivate": false, + "languages": "Java Scala", + "name": "scalding", + "nameWithOwner": "twitter/scalding", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-05-28T19:18:59Z", + "repositoryTopics": "", + "stargazers": 3454, + "watchers": 325 + }, + "twitter/scoot": { + "descriptionHTML": "
Scoot is a distributed task runner, supporting both a proprietary API and Bazel's Remote Execution.
", + "forkCount": 46, + "homepageUrl": "", + "isPrivate": false, + "languages": "Go", + "name": "scoot", + "nameWithOwner": "twitter/scoot", + "primaryLanguage": { + "color": "#00ADD8", + "name": "Go" + }, + "pushedAt": "2023-04-10T11:28:45Z", + "repositoryTopics": "", + "stargazers": 344, + "watchers": 13 + }, + "twitter/scrooge": { + "descriptionHTML": "
A Thrift parser/generator
", + "forkCount": 253, + "homepageUrl": "http://twitter.github.io/scrooge/", + "isPrivate": false, + "languages": "Scala Java Mustache", + "name": "scrooge", + "nameWithOwner": "twitter/scrooge", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-09-06T18:22:29Z", + "repositoryTopics": "finagle thrift code-generation lua java scala android cocoa", + "stargazers": 780, + "watchers": 173 + }, + "twitter/second-control-probability-distributions": { + "descriptionHTML": "
", + "forkCount": 11, + "homepageUrl": null, + "isPrivate": false, + "languages": "", + "name": "second-control-probability-distributions", + "nameWithOwner": "twitter/second-control-probability-distributions", + "primaryLanguage": null, + "pushedAt": "2021-05-06T00:36:46Z", + "repositoryTopics": "", + "stargazers": 4, + "watchers": 7 + }, + "twitter/sqrl": { + "descriptionHTML": "
A Safe, Stateful Rules Language for Event Streams
", + "forkCount": 22, + "homepageUrl": "", + "isPrivate": false, + "languages": "TypeScript SCSS", + "name": "sqrl", + "nameWithOwner": "twitter/sqrl", + "primaryLanguage": { + "color": "#3178c6", + "name": "TypeScript" + }, + "pushedAt": "2023-04-10T11:38:24Z", + "repositoryTopics": "", + "stargazers": 100, + "watchers": 11 + }, + "twitter/sslconfig": { + "descriptionHTML": "
Twitter's OpenSSL Configuration
", + "forkCount": 28, + "homepageUrl": "", + "isPrivate": false, + "languages": "", + "name": "sslconfig", + "nameWithOwner": "twitter/sslconfig", + "primaryLanguage": null, + "pushedAt": "2021-10-08T21:04:29Z", + "repositoryTopics": "", + "stargazers": 42, + "watchers": 107 + }, + "twitter/storehaus": { + "descriptionHTML": "
Storehaus is a library that makes it easy to work with asynchronous key value stores
", + "forkCount": 90, + "homepageUrl": "", + "isPrivate": false, + "languages": "Scala", + "name": "storehaus", + "nameWithOwner": "twitter/storehaus", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2020-07-17T18:18:03Z", + "repositoryTopics": "", + "stargazers": 465, + "watchers": 140 + }, + "twitter/summingbird": { + "descriptionHTML": "
Streaming MapReduce with Scalding and Storm
", + "forkCount": 271, + "homepageUrl": "https://twitter.com/summingbird", + "isPrivate": false, + "languages": "Scala", + "name": "summingbird", + "nameWithOwner": "twitter/summingbird", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2022-01-19T17:31:02Z", + "repositoryTopics": "", + "stargazers": 2136, + "watchers": 295 + }, + "twitter/the-algorithm": { + "descriptionHTML": "
Source code for Twitter's Recommendation Algorithm
", + "forkCount": 12152, + "homepageUrl": "https://blog.twitter.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm", + "isPrivate": false, + "languages": "Starlark Java Scala", + "name": "the-algorithm", + "nameWithOwner": "twitter/the-algorithm", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-09-02T06:56:04Z", + "repositoryTopics": "", + "stargazers": 59809, + "watchers": 364 + }, + "twitter/the-algorithm-ml": { + "descriptionHTML": "
Source code for Twitter's Recommendation Algorithm
", + "forkCount": 2216, + "homepageUrl": "https://blog.twitter.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm", + "isPrivate": false, + "languages": "Python", + "name": "the-algorithm-ml", + "nameWithOwner": "twitter/the-algorithm-ml", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2023-05-09T07:53:33Z", + "repositoryTopics": "", + "stargazers": 9677, + "watchers": 98 + }, + "twitter/thrift_client": { + "descriptionHTML": "
A Thrift client wrapper that encapsulates some common failover behavior
", + "forkCount": 82, + "homepageUrl": "http://github.com/twitter/thrift_client", + "isPrivate": false, + "languages": "Ruby", + "name": "thrift_client", + "nameWithOwner": "twitter/thrift_client", + "primaryLanguage": { + "color": "#701516", + "name": "Ruby" + }, + "pushedAt": "2019-06-06T01:36:44Z", + "repositoryTopics": "", + "stargazers": 195, + "watchers": 117 + }, + "twitter/tormenta": { + "descriptionHTML": "
Scala extensions for Storm
", + "forkCount": 39, + "homepageUrl": "", + "isPrivate": false, + "languages": "Scala Shell Java", + "name": "tormenta", + "nameWithOwner": "twitter/tormenta", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2019-06-07T01:01:52Z", + "repositoryTopics": "", + "stargazers": 132, + "watchers": 136 + }, + "twitter/twemcache": { + "descriptionHTML": "
Twemcache is the Twitter Memcached
", + "forkCount": 165, + "homepageUrl": "https://twitter.com/twemcache", + "isPrivate": false, + "languages": "Python Ruby C", + "name": "twemcache", + "nameWithOwner": "twitter/twemcache", + "primaryLanguage": { + "color": "#555555", + "name": "C" + }, + "pushedAt": "2021-11-01T18:31:37Z", + "repositoryTopics": "", + "stargazers": 924, + "watchers": 225 + }, + "twitter/twemoji": { + "descriptionHTML": "
Emoji for everyone. https://twemoji.twitter.com/
", + "forkCount": 1927, + "homepageUrl": "", + "isPrivate": false, + "languages": "HTML JavaScript", + "name": "twemoji", + "nameWithOwner": "twitter/twemoji", + "primaryLanguage": { + "color": "#e34c26", + "name": "HTML" + }, + "pushedAt": "2023-09-09T17:24:42Z", + "repositoryTopics": "emoji twemoji", + "stargazers": 16280, + "watchers": 357 + }, + "twitter/twemoji-parser": { + "descriptionHTML": "
A simple library for identifying emoji entities within a string in order to render them as Twemoji.
", + "forkCount": 52, + "homepageUrl": "", + "isPrivate": false, + "languages": "JavaScript Scala Shell", + "name": "twemoji-parser", + "nameWithOwner": "twitter/twemoji-parser", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-04-10T11:30:38Z", + "repositoryTopics": "", + "stargazers": 153, + "watchers": 16 + }, + "twitter/twemproxy": { + "descriptionHTML": "
A fast, light-weight proxy for memcached and redis
", + "forkCount": 2065, + "homepageUrl": "", + "isPrivate": false, + "languages": "Python Shell C", + "name": "twemproxy", + "nameWithOwner": "twitter/twemproxy", + "primaryLanguage": { + "color": "#555555", + "name": "C" + }, + "pushedAt": "2023-01-14T09:22:36Z", + "repositoryTopics": "", + "stargazers": 11883, + "watchers": 820 + }, + "twitter/twitter-cldr-js": { + "descriptionHTML": "
JavaScript implementation of the ICU (International Components for Unicode) that uses the Common Locale Data Repository to format dates, plurals, and more. Based on twitter-cldr-rb.
", + "forkCount": 61, + "homepageUrl": "", + "isPrivate": false, + "languages": "JavaScript", + "name": "twitter-cldr-js", + "nameWithOwner": "twitter/twitter-cldr-js", + "primaryLanguage": { + "color": "#f1e05a", + "name": "JavaScript" + }, + "pushedAt": "2023-04-10T11:27:13Z", + "repositoryTopics": "", + "stargazers": 343, + "watchers": 123 + }, + "twitter/twitter-cldr-npm": { + "descriptionHTML": "
TwitterCldr npm package
", + "forkCount": 38, + "homepageUrl": "", + "isPrivate": false, + "languages": "JavaScript", + "name": "twitter-cldr-npm", + "nameWithOwner": "twitter/twitter-cldr-npm", + "primaryLanguage": { + "color": "#f1e05a", + "name": "JavaScript" + }, + "pushedAt": "2023-04-10T11:26:13Z", + "repositoryTopics": "", + "stargazers": 48, + "watchers": 114 + }, + "twitter/twitter-cldr-rb": { + "descriptionHTML": "
Ruby implementation of the ICU (International Components for Unicode) that uses the Common Locale Data Repository to format dates, plurals, and more.
", + "forkCount": 97, + "homepageUrl": "", + "isPrivate": false, + "languages": "Ruby", + "name": "twitter-cldr-rb", + "nameWithOwner": "twitter/twitter-cldr-rb", + "primaryLanguage": { + "color": "#701516", + "name": "Ruby" + }, + "pushedAt": "2023-08-29T17:54:27Z", + "repositoryTopics": "", + "stargazers": 657, + "watchers": 119 + }, + "twitter/twitter-korean-text": { + "descriptionHTML": "
Korean tokenizer
", + "forkCount": 179, + "homepageUrl": null, + "isPrivate": false, + "languages": "Java Scala", + "name": "twitter-korean-text", + "nameWithOwner": "twitter/twitter-korean-text", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-04-10T11:33:16Z", + "repositoryTopics": "", + "stargazers": 827, + "watchers": 175 + }, + "twitter/twitter-server": { + "descriptionHTML": "
Twitter-Server defines a template from which services at Twitter are built
", + "forkCount": 264, + "homepageUrl": "http://twitter.github.io/twitter-server/", + "isPrivate": false, + "languages": "Scala", + "name": "twitter-server", + "nameWithOwner": "twitter/twitter-server", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-04-10T11:41:38Z", + "repositoryTopics": "finagle finatra", + "stargazers": 1482, + "watchers": 192 + }, + "twitter/twitter-text": { + "descriptionHTML": "
Twitter Text Libraries. This code is used at Twitter to tokenize and parse text to meet the expectations for what can be used on the platform.
", + "forkCount": 525, + "homepageUrl": "https://developer.twitter.com/en/docs/counting-characters", + "isPrivate": false, + "languages": "Ruby HTML Java JavaScript Objective-C", + "name": "twitter-text", + "nameWithOwner": "twitter/twitter-text", + "primaryLanguage": { + "color": "#e34c26", + "name": "HTML" + }, + "pushedAt": "2023-07-08T20:36:15Z", + "repositoryTopics": "twitter-text tweet twitter unicode emoji java ruby nodejs objective-c", + "stargazers": 3016, + "watchers": 183 + }, + "twitter/twitter.github.io": { + "descriptionHTML": "
", + "forkCount": 16, + "homepageUrl": "", + "isPrivate": false, + "languages": "HTML", + "name": "twitter.github.io", + "nameWithOwner": "twitter/twitter.github.io", + "primaryLanguage": { + "color": "#e34c26", + "name": "HTML" + }, + "pushedAt": "2021-10-11T21:40:05Z", + "repositoryTopics": "", + "stargazers": 69, + "watchers": 6 + }, + "twitter/twurl": { + "descriptionHTML": "
OAuth-enabled curl for the Twitter API
", + "forkCount": 336, + "homepageUrl": "https://developer.twitter.com", + "isPrivate": false, + "languages": "Ruby", + "name": "twurl", + "nameWithOwner": "twitter/twurl", + "primaryLanguage": { + "color": "#701516", + "name": "Ruby" + }, + "pushedAt": "2023-07-20T20:54:51Z", + "repositoryTopics": "twitter twitter-api ruby curl cli twurl", + "stargazers": 1774, + "watchers": 195 + }, + "twitter/typeahead.js": { + "descriptionHTML": "
typeahead.js is a fast and fully-featured autocomplete library
", + "forkCount": 3289, + "homepageUrl": "http://twitter.github.io/typeahead.js/", + "isPrivate": false, + "languages": "JavaScript", + "name": "typeahead.js", + "nameWithOwner": "twitter/typeahead.js", + "primaryLanguage": { + "color": "#f1e05a", + "name": "JavaScript" + }, + "pushedAt": "2023-04-14T07:24:33Z", + "repositoryTopics": "", + "stargazers": 16536, + "watchers": 558 + }, + "twitter/util": { + "descriptionHTML": "
Wonderful reusable code from Twitter
", + "forkCount": 600, + "homepageUrl": "https://twitter.github.io/util", + "isPrivate": false, + "languages": "Scala Java", + "name": "util", + "nameWithOwner": "twitter/util", + "primaryLanguage": { + "color": "#c22d40", + "name": "Scala" + }, + "pushedAt": "2023-05-18T15:14:24Z", + "repositoryTopics": "finagle scala utility", + "stargazers": 2665, + "watchers": 230 + }, + "twitter/vireo": { + "descriptionHTML": "
Vireo is a lightweight and versatile video processing library written in C++11
", + "forkCount": 110, + "homepageUrl": "", + "isPrivate": false, + "languages": "Makefile Shell C++", + "name": "vireo", + "nameWithOwner": "twitter/vireo", + "primaryLanguage": { + "color": "#f34b7d", + "name": "C++" + }, + "pushedAt": "2021-10-21T17:26:15Z", + "repositoryTopics": "", + "stargazers": 905, + "watchers": 50 + }, + "twitter/whiskey": { + "descriptionHTML": "
HTTP library for Android (beta)
", + "forkCount": 33, + "homepageUrl": "", + "isPrivate": false, + "languages": "Java", + "name": "whiskey", + "nameWithOwner": "twitter/whiskey", + "primaryLanguage": { + "color": "#b07219", + "name": "Java" + }, + "pushedAt": "2023-04-10T11:48:53Z", + "repositoryTopics": "", + "stargazers": 131, + "watchers": 88 + }, + "twitter/wordpress": { + "descriptionHTML": "
The official Twitter plugin for WordPress. Embed Twitter content and grow your audience on Twitter.
", + "forkCount": 137, + "homepageUrl": "https://github.com/twitter/wordpress/wiki", + "isPrivate": false, + "languages": "PHP", + "name": "wordpress", + "nameWithOwner": "twitter/wordpress", + "primaryLanguage": { + "color": "#4F5D95", + "name": "PHP" + }, + "pushedAt": "2022-04-06T19:15:29Z", + "repositoryTopics": "twitter-plugin php wordpress twitter-cards", + "stargazers": 309, + "watchers": 124 + }, + "twitter/zktraffic": { + "descriptionHTML": "
ZooKeeper protocol analyzer and stats gathering daemon
", + "forkCount": 57, + "homepageUrl": null, + "isPrivate": false, + "languages": "Python", + "name": "zktraffic", + "nameWithOwner": "twitter/zktraffic", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2023-04-10T11:49:30Z", + "repositoryTopics": "", + "stargazers": 165, + "watchers": 117 + }, + "twitterdev/search-tweets-python": { + "descriptionHTML": "
Python client for the Twitter 'search Tweets' and 'count Tweets' endpoints (v2/Labs/premium/enterprise). Now supports Twitter API v2 /recent and /all search endpoints.
", + "forkCount": 262, + "homepageUrl": "https://twitterdev.github.io/search-tweets-python/", + "isPrivate": false, + "languages": "Python", + "name": "search-tweets-python", + "nameWithOwner": "twitterdev/search-tweets-python", + "primaryLanguage": { + "color": "#3572A5", + "name": "Python" + }, + "pushedAt": "2023-01-27T00:19:33Z", + "repositoryTopics": "search twitter python twitter-api twitterapi enterprise premium twitter-api-v2", + "stargazers": 789, + "watchers": 39 + } +} \ No newline at end of file diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index cd648f601..2b06a5b15 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -1,21 +1,36 @@ - + {{ partial "head.html" . }} - {{ partial "nav.html" . }} + {{ block "nav" . }}{{ partial "nav.html" . }}{{ end }} + {{ block "main" . }} -
- {{ block "main" . }}{{ end }} -
+
+
+
+
+ {{ block "header" . }} + {{ with .Title }}

{{ . }}

{{ end }} + {{ with .Params.subtitle }}

{{ . }}

{{ end }} + {{ end }} +
+
+
+
+ {{ block "content" . }}{{ end }} +
+
+ {{ end }} - {{ partial "footer.html" . }} + {{ block "footer" . }}{{ partial "footer.html" . }}{{ end }} + - - {{ partial "ga.html" . }} + {{ with .Params.custom_js }}{{ end }} + {{ if hugo.IsProduction }}{{ partial "ga.html" . }}{{ end }} diff --git a/layouts/_default/memberships.html b/layouts/_default/memberships.html index 3a4defa35..83cc3a020 100644 --- a/layouts/_default/memberships.html +++ b/layouts/_default/memberships.html @@ -1,18 +1,7 @@ -{{ define "main" }} - -
-
-
-

#Squad

-

Our upstream and downstream partners who make open source happen

-
-
-
- -
-
+{{ define "content" }} +
{{ range $.Site.Data.memberships }} -
+
@@ -22,7 +11,7 @@

{{ .name }}

{{ with .twitter }} - + @{{ . }} {{ end }} @@ -33,11 +22,10 @@

{{ .name }}

{{ with .website }} - + Visit {{ end }}
{{ end }}
-
{{ end }} diff --git a/layouts/_default/projects.html b/layouts/_default/projects.html index 2f30fa990..9ae1705d0 100644 --- a/layouts/_default/projects.html +++ b/layouts/_default/projects.html @@ -1,47 +1,30 @@ -{{ define "main" }} - - -
-
-
-

Projects

- -
-
- +{{ define "header" }} +

Projects

+ + +{{ end }} - -
- - -
- +{{ define "content" }} + +
Found results for
- - - +
{{ end }} diff --git a/layouts/_default/single.html b/layouts/_default/single.html index e0e83081c..f3e1485a3 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -1,3 +1,5 @@ -{{ define "main" }} - {{ .Content }} +{{ define "content" }} +
+ {{ .Content }} +
{{ end }} diff --git a/layouts/_default/year-in-review.html b/layouts/_default/year-in-review.html index 56f3060a6..4e86e475d 100644 --- a/layouts/_default/year-in-review.html +++ b/layouts/_default/year-in-review.html @@ -1,175 +1,66 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - {{ .Title }} - - - - - - - - - - - - - - - {{- with .Params.custom_css }} - - - {{ end }} - - - +{{ define "nav" }} - +{{ end }} + +{{ define "main" }} +
-
+
- -

+

{{ (now.AddDate -1 0 0).Format "Jan 2006" }} - {{ now.Format "Jan 2006" }}

Year in Review

An overview of the past 12 months of activity on Twitter’s Open Source projects.

- -
-

This webpage updates weekly and provides a sliding window into the previous 12 months. Patches are always welcome.

+
+

This webpage updates weekly and provides a sliding window into the previous 12 months. Patches are always welcome.

-
+
- -
+

Top 10 repos

-

These are our top 10 GitHub repositories, ranked by total commit counts.

+

These are our top 10 GitHub repositories, ranked by total commit counts.

@@ -178,75 +69,50 @@

Top 10 repos

- + {{/* put augur data into a slice that can be sorted and indexed */}} + {{- $repos := slice }} + {{- range $name, $data := $.Site.Data.augur.repo_commits -}} + {{ $repos = $repos | append (dict "name" $name "commit_count" $data.commit_count) }} + {{- end -}} + {{- range $i, $repo := first 10 (sort $repos "commit_count" "desc") }} + + + + + + {{- end -}}
Total commits
{{ add $i 1 }}{{ .name }}{{ partial "formatNum" .commit_count }}
-
+
- -
+

Locations

-

Our contributors are located all around the world. This list is based on self reported locations from our contributors’ GitHub profiles.

+

Our contributors are located all around the world. This list is based on self reported locations from our contributors’ GitHub profiles.

-
- United States flag - United States -
-
- Greece flag - Greece -
-
- Germany flag - Germany -
-
- United Kingdom flag - United Kingdom -
-
- Singapore flag - Singapore -
-
- China flag - China -
-
- Belgium flag - Belgium -
-
- Austria flag - Austria -
-
- Peru flag - Peru + {{- range $.Site.Data.locations -}} +
+ {{ .name }} flag + {{ .name }}
-
- Australia flag - Australia -
+ {{- end -}}

*Top 10 locations ranked by commits, accurate as of Aug 2019

-
+
- -
+

Heat metrics

-

Heat means work. We measure heat by the number and frequency of commits and committers across our repos.

+

Heat means work. We measure heat by the number and frequency of commits and committers across our repos.

- - +
- + {{ partial "formatNum" (index $.Site.Data.augur.aggregate_summary 0).commit_count }} commits
Commits reflect the amount of activity across our repositories. @@ -266,26 +132,25 @@

Heat metrics

- + {{ partial "formatNum" (index $.Site.Data.augur.aggregate_summary 0).committer_count }} committers
- Committers are the unique individuals that drive change in our repositories. + Committers are the unique individuals that drive change in our repositories.
-
+
-
+
- -
+

Light metrics

-

Light means visibility. We measure visibility by number of watchers subscribed to updates, and number of people who have favorited our projects.

+

Light means visibility. We measure visibility by number of watchers subscribed to updates, and number of people who have favorited our projects.

- @@ -296,11 +161,11 @@

Light metrics

- + - +
- + {{ partial "formatNum" (index $.Site.Data.augur.aggregate_summary 0).watcher_count }} watchers
Watchers receive notifications for some or all changes to our codebases. @@ -308,26 +173,25 @@

Light metrics

- + {{ partial "formatNum" (index $.Site.Data.augur.aggregate_summary 0).stars_count }} stars
Stars show preference for a repository, like a bookmark.
-
+
-
+
- -
+

Love metrics

-

Love means culture and support. We measure love by the number of users who have copied our projects and contributed changes back upstream.

+

Love means culture and support. We measure love by the number of users who have copied our projects and contributed changes back upstream.

- @@ -338,9 +202,9 @@

Love metrics

C11.7,9.6,12,9.2,12,8.8C12,8.4,11.7,8,11.3,7.9z"/> - +
- + {{ partial "formatNum" (index $.Site.Data.augur.aggregate_summary 0).fork_count }} forks
Forks represent full-copies of our repositories, usually for development and testing. @@ -348,22 +212,21 @@

Love metrics

- + {{ partial "formatNum" (index $.Site.Data.augur.aggregate_summary 0).merged_count }} PRs merged
Our users contribute pull requests (PRs) directly back to us.
-
+
-
+
- -
+

@TwitterOSS

-

Making it simple to trust, ship, and grow Open Source at Twitter and beyond. Follow @TwitterOSS to stay updated!

+

Making it simple to trust, ship, and grow Open Source at Twitter and beyond. Follow @TwitterOSS to stay updated!

@@ -371,69 +234,8 @@

@TwitterOSS

- -
- - - - - - - - - - - - - - +
+{{ end }} - - -{{ partial "ga.html" . }} - +{{ define "footer"}}{{ end }} \ No newline at end of file diff --git a/layouts/index.html b/layouts/index.html index e0e83081c..ddcc2fcb0 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -1,3 +1,10 @@ -{{ define "main" }} +{{ define "header" }} +

+ @TwitterOSS +

+

Open Source is Happening

+{{ end }} + +{{ define "content" }} {{ .Content }} {{ end }} diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index e5fbc9fb3..545c25ea9 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -1,51 +1,50 @@