├── .nvmrc ├── .babelrc ├── src ├── fonts │ ├── index.js │ └── tt-commons │ │ ├── TTCommons-Bold.eot │ │ ├── TTCommons-Bold.ttf │ │ ├── TTCommons-Thin.eot │ │ ├── TTCommons-Thin.ttf │ │ ├── TTCommons-Black.eot │ │ ├── TTCommons-Black.ttf │ │ ├── TTCommons-Black.woff │ │ ├── TTCommons-Bold.woff │ │ ├── TTCommons-Italic.eot │ │ ├── TTCommons-Italic.ttf │ │ ├── TTCommons-Light.eot │ │ ├── TTCommons-Light.ttf │ │ ├── TTCommons-Light.woff │ │ ├── TTCommons-Medium.eot │ │ ├── TTCommons-Medium.ttf │ │ ├── TTCommons-Thin.woff │ │ ├── TTCommons-DemiBold.eot │ │ ├── TTCommons-DemiBold.ttf │ │ ├── TTCommons-DemiBold.woff │ │ ├── TTCommons-ExtraBold.eot │ │ ├── TTCommons-ExtraBold.ttf │ │ ├── TTCommons-Italic.woff │ │ ├── TTCommons-Medium.woff │ │ ├── TTCommons-Regular.eot │ │ ├── TTCommons-Regular.ttf │ │ ├── TTCommons-Regular.woff │ │ ├── TTCommons-BlackItalic.eot │ │ ├── TTCommons-BlackItalic.ttf │ │ ├── TTCommons-BoldItalic.eot │ │ ├── TTCommons-BoldItalic.ttf │ │ ├── TTCommons-BoldItalic.woff │ │ ├── TTCommons-ExtraBold.woff │ │ ├── TTCommons-ExtraLight.eot │ │ ├── TTCommons-ExtraLight.ttf │ │ ├── TTCommons-ExtraLight.woff │ │ ├── TTCommons-LightItalic.eot │ │ ├── TTCommons-LightItalic.ttf │ │ ├── TTCommons-ThinItalic.eot │ │ ├── TTCommons-ThinItalic.ttf │ │ ├── TTCommons-ThinItalic.woff │ │ ├── TTCommons-BlackItalic.woff │ │ ├── TTCommons-DemiBoldItalic.eot │ │ ├── TTCommons-DemiBoldItalic.ttf │ │ ├── TTCommons-LightItalic.woff │ │ ├── TTCommons-MediumItalic.eot │ │ ├── TTCommons-MediumItalic.ttf │ │ ├── TTCommons-MediumItalic.woff │ │ ├── TTCommons-DemiBoldItalic.woff │ │ ├── TTCommons-ExtraBoldItalic.eot │ │ ├── TTCommons-ExtraBoldItalic.ttf │ │ ├── TTCommons-ExtraBoldItalic.woff │ │ ├── TTCommons-ExtraLightItalic.eot │ │ ├── TTCommons-ExtraLightItalic.ttf │ │ ├── TTCommons-ExtraLightItalic.woff │ │ └── style.css ├── setupTests.js ├── feature-toggles.js ├── dev-tools │ ├── load.js │ └── dev-tools.js ├── images │ ├── random.svg │ ├── top.svg │ ├── cross.svg │ ├── author.svg │ ├── heart.svg │ ├── star-filled.svg │ ├── warning.svg │ ├── empty.svg │ ├── sun.svg │ ├── forks.svg │ ├── repos.svg │ ├── setting.svg │ ├── moon.svg │ ├── github.svg │ ├── logo.svg │ └── chrome.svg ├── index.js ├── components │ ├── stories │ │ ├── NetworkError.stories.js │ │ ├── Components.stories.js │ │ └── Icon.stories.js │ ├── LanguageSelect.js │ ├── Fade.js │ ├── PeriodSelect.js │ ├── SpokenLanguageSelect.js │ ├── InfoItem.js │ ├── index.js │ ├── Icon.js │ ├── LastUpdated.js │ ├── ScrollTop.js │ ├── Select.js │ ├── EmptyState.js │ ├── NetworkError.js │ ├── Footer.js │ ├── TopBar.js │ ├── ContentPlaceholder.js │ ├── RepositoriesList.js │ ├── RepositoryCard.js │ └── BottomIcons.js ├── hooks │ ├── useWindowScroll.js │ └── useLocalStorage.js ├── helpers │ ├── localStorage.js │ └── github.js ├── App.js ├── global.css ├── background │ ├── startRequest.js │ ├── index.js │ └── __tests__ │ │ └── startRequest.js ├── theme.js ├── Main.js └── hooks.js ├── public ├── 128.png ├── 16.png ├── 48.png ├── 512.png ├── 512_dark.png ├── manifest.json ├── ga.js └── index.html ├── cypress.json ├── images ├── hero.jpeg ├── icon.png ├── tile.jpg ├── tile2.jpg ├── tile3.jpg ├── 1280x640.jpg ├── 1280x800.jpg ├── design.sketch ├── screenshot.jpg ├── 1280x640_dark.jpg ├── 1280x800_dark.jpg └── hero.svg ├── .storybook ├── addons.js └── config.js ├── cypress ├── .eslintrc ├── integration │ ├── empty-state.js │ ├── scroll-icon.js │ ├── dark-mode.js │ ├── error-state.js │ ├── feeling-lucky.js │ ├── load-repositories.js │ └── selectors.js ├── support │ ├── index.js │ └── commands.js ├── plugins │ └── index.js └── fixtures │ ├── trending.json │ └── trending-2.json ├── .github ├── workflows │ ├── unit.yml │ └── cypress.yml └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md └── package.json /.nvmrc: -------------------------------------------------------------------------------- 1 | v12.10.0 2 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-app"] 3 | } 4 | -------------------------------------------------------------------------------- /src/fonts/index.js: -------------------------------------------------------------------------------- 1 | import './tt-commons/style.css'; 2 | -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom/extend-expect'; 2 | -------------------------------------------------------------------------------- /public/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/public/128.png -------------------------------------------------------------------------------- /public/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/public/16.png -------------------------------------------------------------------------------- /public/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/public/48.png -------------------------------------------------------------------------------- /public/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/public/512.png -------------------------------------------------------------------------------- /src/feature-toggles.js: -------------------------------------------------------------------------------- 1 | const featureToggles = {}; 2 | 3 | export default featureToggles; 4 | -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseUrl": "http://localhost:3000", 3 | "projectId": "wrmpdh" 4 | } 5 | -------------------------------------------------------------------------------- /images/hero.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/hero.jpeg -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/icon.png -------------------------------------------------------------------------------- /images/tile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/tile.jpg -------------------------------------------------------------------------------- /images/tile2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/tile2.jpg -------------------------------------------------------------------------------- /images/tile3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/tile3.jpg -------------------------------------------------------------------------------- /images/1280x640.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/1280x640.jpg -------------------------------------------------------------------------------- /images/1280x800.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/1280x800.jpg -------------------------------------------------------------------------------- /public/512_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/public/512_dark.png -------------------------------------------------------------------------------- /images/design.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/design.sketch -------------------------------------------------------------------------------- /images/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/screenshot.jpg -------------------------------------------------------------------------------- /images/1280x640_dark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/1280x640_dark.jpg -------------------------------------------------------------------------------- /images/1280x800_dark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/images/1280x800_dark.jpg -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Bold.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Bold.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Thin.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Thin.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Black.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Black.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Black.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Black.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Bold.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Italic.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Italic.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Light.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Light.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Light.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Medium.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Medium.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Thin.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-DemiBold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-DemiBold.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-DemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-DemiBold.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-DemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-DemiBold.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraBold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraBold.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraBold.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Italic.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Medium.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Regular.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Regular.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-Regular.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-BlackItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-BlackItalic.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-BlackItalic.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-BoldItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-BoldItalic.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-BoldItalic.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-BoldItalic.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraBold.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraLight.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraLight.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraLight.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraLight.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-LightItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-LightItalic.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-LightItalic.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ThinItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ThinItalic.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ThinItalic.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ThinItalic.woff -------------------------------------------------------------------------------- /.storybook/addons.js: -------------------------------------------------------------------------------- 1 | import '@storybook/addon-actions/register'; 2 | import '@storybook/addon-links/register'; 3 | import '@storybook/addon-notes/register'; 4 | -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-BlackItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-BlackItalic.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-DemiBoldItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-DemiBoldItalic.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-DemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-DemiBoldItalic.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-LightItalic.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-MediumItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-MediumItalic.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-MediumItalic.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-MediumItalic.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-DemiBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-DemiBoldItalic.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraBoldItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraBoldItalic.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraBoldItalic.woff -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraLightItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraLightItalic.eot -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /src/fonts/tt-commons/TTCommons-ExtraLightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huchenme/hacker-tab-extension/HEAD/src/fonts/tt-commons/TTCommons-ExtraLightItalic.woff -------------------------------------------------------------------------------- /cypress/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "env": { "cypress/globals": true }, 4 | "extends": ["react-app", "plugin:cypress/recommended"], 5 | "plugins": ["cypress"] 6 | } 7 | -------------------------------------------------------------------------------- /src/dev-tools/load.js: -------------------------------------------------------------------------------- 1 | function load(callback) { 2 | if (process.env.NODE_ENV === 'development') { 3 | import('./dev-tools').finally(callback); 4 | } else { 5 | callback(); 6 | } 7 | } 8 | 9 | export default load; 10 | -------------------------------------------------------------------------------- /src/images/random.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/dev-tools/dev-tools.js: -------------------------------------------------------------------------------- 1 | const requireDevToolsLocal = require.context( 2 | './', 3 | false, 4 | /dev-tools\.local\.js/ 5 | ); 6 | const local = requireDevToolsLocal.keys()[0]; 7 | if (local) { 8 | requireDevToolsLocal(local); 9 | } 10 | -------------------------------------------------------------------------------- /src/images/top.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/images/cross.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/images/author.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/images/heart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/images/star-filled.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import loadDevTools from './dev-tools/load'; 2 | import React from 'react'; 3 | import ReactDOM from 'react-dom'; 4 | 5 | import App from './App'; 6 | 7 | import './fonts'; 8 | import './global.css'; 9 | 10 | const rootElement = document.getElementById('root'); 11 | loadDevTools(() => { 12 | ReactDOM.render(, rootElement); 13 | }); 14 | -------------------------------------------------------------------------------- /src/images/warning.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/images/empty.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/images/sun.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/workflows/unit.yml: -------------------------------------------------------------------------------- 1 | name: Unit test and build 2 | on: [push] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - name: Checkout 8 | uses: actions/checkout@v2 9 | - name: Setup Node 10 | uses: actions/setup-node@v1 11 | with: 12 | node-version: 12.x 13 | - run: yarn install 14 | - run: yarn build 15 | - run: yarn test 16 | env: 17 | CI: true 18 | -------------------------------------------------------------------------------- /.storybook/config.js: -------------------------------------------------------------------------------- 1 | import { configure, addDecorator } from '@storybook/react'; 2 | import centered from '@storybook/addon-centered/react'; 3 | 4 | import '../src/global.css'; 5 | 6 | // automatically import all files ending in *.stories.js 7 | const req = require.context('../src', true, /\.stories\.js$/); 8 | function loadStories() { 9 | req.keys().forEach(filename => req(filename)); 10 | } 11 | 12 | addDecorator(centered); 13 | 14 | configure(loadStories, module); 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | /*.zip 14 | 15 | # misc 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | /cypress/videos 27 | /cypress/screenshots 28 | 29 | /storybook-static 30 | *.local.js 31 | -------------------------------------------------------------------------------- /cypress/integration/empty-state.js: -------------------------------------------------------------------------------- 1 | describe('Empty state', () => { 2 | it('shows empty state when response is empty', () => { 3 | cy.fetchReposAndWait({ response: [] }); 4 | cy.findByText('Trending Repositories').should('not.exist'); 5 | cy.findByTestId('repo-card').should('not.exist'); 6 | cy.findByTestId('empty-state').should('exist'); 7 | }); 8 | 9 | it('does not show empty state when response is normal', () => { 10 | cy.fetchReposAndWait(); 11 | cy.findByText('empty-state').should('not.exist'); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /src/components/stories/NetworkError.stories.js: -------------------------------------------------------------------------------- 1 | /** @jsx jsx */ 2 | import { jsx, css } from '@emotion/core'; 3 | import { storiesOf } from '@storybook/react'; 4 | import { action } from '@storybook/addon-actions'; 5 | 6 | import NetworkError from '../NetworkError'; 7 | 8 | storiesOf('NetworkError', module).add('basic usage', () => ( 9 |
15 | 16 |
17 | )); 18 | -------------------------------------------------------------------------------- /cypress/integration/scroll-icon.js: -------------------------------------------------------------------------------- 1 | describe('Scroll Icon', () => { 2 | it('should scroll to top', () => { 3 | cy.seedLocalStorage(); 4 | cy.visit('/'); 5 | cy.findByLabelText('Scroll to Top Button').should('not.be.visible'); 6 | cy.scrollTo(0, 300); 7 | cy.window().its('pageYOffset').should('eq', 300); 8 | cy.findByLabelText('Scroll to Top Button').should('be.visible'); 9 | cy.findByLabelText('Scroll to Top Button').click(); 10 | cy.window().its('pageYOffset').should('eq', 0); 11 | cy.findByLabelText('Scroll to Top Button').should('not.be.visible'); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /src/images/forks.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/images/repos.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/images/setting.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/hooks/useWindowScroll.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | 3 | const useWindowScroll = () => { 4 | const [state, setState] = useState({ 5 | x: window.scrollX, 6 | y: window.scrollY, 7 | }); 8 | 9 | useEffect(() => { 10 | const handler = () => { 11 | setState({ 12 | x: window.scrollX, 13 | y: window.scrollY, 14 | }); 15 | }; 16 | 17 | window.addEventListener('scroll', handler); 18 | 19 | return () => { 20 | window.removeEventListener('scroll', handler); 21 | }; 22 | }, []); 23 | 24 | return state; 25 | }; 26 | 27 | export default useWindowScroll; 28 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "Hacker Tab", 4 | "author": "Hu Chen", 5 | "version": "1.10.0", 6 | "description": "Replace browser new tab screen with GitHub trending projects.", 7 | "icons": { 8 | "16": "16.png", 9 | "48": "48.png", 10 | "128": "128.png" 11 | }, 12 | "chrome_url_overrides": { 13 | "newtab": "index.html" 14 | }, 15 | "background": { 16 | "scripts": ["background.js"], 17 | "persistent": false 18 | }, 19 | "permissions": ["storage", "alarms"], 20 | "content_security_policy": "script-src 'self' https://www.google-analytics.com; object-src 'self'" 21 | } 22 | -------------------------------------------------------------------------------- /src/helpers/localStorage.js: -------------------------------------------------------------------------------- 1 | export const CURRENT_SCHEMA_VERSION = '2'; 2 | 3 | export const KEY_REPOSITORIES = 'repositories'; 4 | export const KEY_LAST_UPDATED = 'lastUpdatedTime'; 5 | export const KEY_SELECTED_CODE_LANGUAGE = 'selectedLanguage'; 6 | export const KEY_SELECTED_SPOKEN_LANGUAGE = 'selectedSpokenLanguage'; 7 | export const KEY_SELECTED_PERIOD = 'selectedPeriod'; 8 | export const KEY_SCHEMA_VERSION = 'schemaVersion'; 9 | export const KEY_DARK_MODE = 'preferDarkMode'; 10 | 11 | export const getObject = (key) => JSON.parse(localStorage.getItem(key)); 12 | export const setObject = (key, value) => 13 | localStorage.setItem(key, JSON.stringify(value)); 14 | -------------------------------------------------------------------------------- /src/images/moon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ['https://www.buymeacoffee.com/huchenme'] 13 | -------------------------------------------------------------------------------- /src/components/LanguageSelect.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { languages, findLanguage, allLanguagesLabel } from '../helpers/github'; 4 | import Select from './Select'; 5 | 6 | const LanguageSelect = ({ onChange, selectedValue }) => ( 7 |
8 | onChange(value)} 13 | options={periodOptions} 14 | placeholder="Select period" 15 | /> 16 |
17 | ); 18 | }; 19 | 20 | PeriodSelect.propTypes = { 21 | selectedValue: PropTypes.string, 22 | onChange: PropTypes.func.isRequired, 23 | }; 24 | 25 | export default React.memo(PeriodSelect); 26 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { ReactQueryConfigProvider } from 'react-query'; 3 | import { ReactQueryDevtools } from 'react-query-devtools'; 4 | 5 | import Main from './Main'; 6 | 7 | const queryConfig = { 8 | queries: { 9 | retry: 2, 10 | staleTime: 5 * 60 * 1000, 11 | cacheTime: 15 * 60 * 1000, 12 | refetchOnWindowFocus: false, 13 | refetchOnMount: false, 14 | }, 15 | }; 16 | 17 | const App = () => { 18 | return ( 19 | 20 |
21 | 26 | 27 | ); 28 | }; 29 | 30 | export default App; 31 | -------------------------------------------------------------------------------- /src/components/stories/Components.stories.js: -------------------------------------------------------------------------------- 1 | /** @jsx jsx */ 2 | import { useState } from 'react'; 3 | import { css, jsx } from '@emotion/core'; 4 | import { storiesOf } from '@storybook/react'; 5 | import { action } from '@storybook/addon-actions'; 6 | 7 | import { EmptyState, Footer, ContentPlaceholder } from '..'; 8 | 9 | storiesOf('EmptyState', module).add('default', () => ); 10 | 11 | storiesOf('Footer', module).add('default', () =>