├── src ├── fonts │ └── vespa.ttf ├── assets │ └── images │ │ ├── screen1.png │ │ ├── screen2.png │ │ ├── Issue-Finder.png │ │ └── issue-finder2.png ├── constants │ ├── reposConstants.js │ ├── labelConstants.js │ ├── selectedLabelsConstants.js │ ├── issueConstants.js │ └── githubAuthConstants.js ├── tests │ ├── setupTests.js │ └── App.test.js ├── store │ └── index.js ├── reducers │ ├── index.js │ ├── repos.js │ ├── githubauth.js │ ├── selectedLabels.js │ ├── labels.js │ └── issues.js ├── index.css ├── containers │ ├── PageTracker.js │ ├── App.js │ └── App.css ├── index.js ├── snippets │ ├── github_scraper.js │ ├── 03_repos.csv │ └── 06_repos.json ├── components │ ├── SearchEngine.js │ ├── GithubAuth.js │ ├── Labels.js │ ├── Issues.js │ └── Home.js ├── utility │ └── firebase.js ├── api │ └── index.js └── actions │ └── index.js ├── public ├── favicon.ico ├── favicon-16x16.png ├── favicon-32x32.png ├── apple-touch-icon.png ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── robots.txt ├── manifest.json ├── index.html └── output.css ├── tailwind.config.js ├── .prettierrc ├── .dockerignore ├── .gitpod.yml ├── docker-compose.yml ├── Dockerfile ├── .github └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── .env.sample ├── .eslintrc.json ├── LICENSE ├── package.json ├── .gitignore ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md └── README.md /src/fonts/vespa.ttf: -------------------------------------------------------------------------------- 1 | sample only -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/public/apple-touch-icon.png -------------------------------------------------------------------------------- /src/assets/images/screen1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/src/assets/images/screen1.png -------------------------------------------------------------------------------- /src/assets/images/screen2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/src/assets/images/screen2.png -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/assets/images/Issue-Finder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/src/assets/images/Issue-Finder.png -------------------------------------------------------------------------------- /src/assets/images/issue-finder2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voscarmv/issue-finder/HEAD/src/assets/images/issue-finder2.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: Google 3 | Disallow: 4 | 5 | User-agent: * 6 | Disallow: / 7 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: ['./src/**/*.{html,js}', './node_modules/tw-elements/dist/js/**/*.js'], 3 | plugins: [require('tw-elements/dist/plugin')] 4 | }; 5 | -------------------------------------------------------------------------------- /src/constants/reposConstants.js: -------------------------------------------------------------------------------- 1 | export const GET_REPOS_REQUEST = 'GET_REPOS_REQUEST'; 2 | export const GET_REPOS_SUCCESS = 'GET_REPOS_SUCCESS'; 3 | export const GET_REPOS_FAIL = 'GET_REPOS_FAIL'; 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "tabWidth": 2, 4 | "printWidth": 100, 5 | "singleQuote": true, 6 | "trailingComma": "none", 7 | "jsxBracketSameLine": true 8 | } 9 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | /node_modules 3 | .eslintrc 4 | .eslintignore 5 | .editorconfig 6 | .huskyrc 7 | .lintstagedrc.json 8 | .prettierrc 9 | jest.config.js 10 | Dockerfile 11 | docker-compose.yml 12 | .git 13 | .gitignore 14 | .dockerignore -------------------------------------------------------------------------------- /src/constants/labelConstants.js: -------------------------------------------------------------------------------- 1 | export const GET_LABELS_REQUEST = 'GET_LABELS_REQUEST'; 2 | export const GET_LABELS_SUCCESS = 'GET_LABELS_SUCCESS'; 3 | export const GET_LABELS_FAIL = 'GET_LABELS_FAIL'; 4 | export const TOGGLE_MENU = 'TOGGLE_MENU'; 5 | -------------------------------------------------------------------------------- /src/constants/selectedLabelsConstants.js: -------------------------------------------------------------------------------- 1 | export const ADD_TO_SELECTED_LABELS = 'ADD_TO_SELECTED_LABELS'; 2 | export const REMOVE_FROM_SELECTED_LABELS = 'REMOVE_FROM_SELECTED_LABELS'; 3 | export const EMPTY_SELECTED_LABELS = 'EMPTY_SELECTED_LABELS'; 4 | -------------------------------------------------------------------------------- /src/tests/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /src/constants/issueConstants.js: -------------------------------------------------------------------------------- 1 | export const GET_ISSUES_REQUEST = 'GET_ISSUES_REQUEST'; 2 | export const GET_ISSUES_SUCCESS = 'GET_ISSUES_SUCCESS'; 3 | export const GET_ISSUES_FAIL = 'GET_ISSUES_FAIL'; 4 | export const EMPTY_ISSUES_LIST = 'EMPTY_ISSUES_LIST'; 5 | export const SET_LANGUAGE = 'SET_LANGUAGE'; 6 | -------------------------------------------------------------------------------- /src/tests/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from '../containers/App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /src/constants/githubAuthConstants.js: -------------------------------------------------------------------------------- 1 | export const GET_GITHUBAUTHKEY_REQUEST = 'GET_GITHUBAUTHKEY_REQUEST'; 2 | export const GET_GITHUBAUTHKEY_SUCCESS = 'GET_GITHUBAUTHKEY_SUCCESS'; 3 | export const GET_GITHUBAUTHKEY_FAIL = 'GET_GITHUBAUTHKEY_FAIL'; 4 | export const EMPTY_GITHUBAUTHKEY_LIST = 'EMPTY_GITHUBAUTHKEY_LIST'; 5 | -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | # This configuration file was automatically generated by Gitpod. 2 | # Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file) 3 | # and commit this file to your remote git repository to share the goodness with others. 4 | 5 | tasks: 6 | - init: npm install && npm run build 7 | command: npm run start 8 | 9 | 10 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.7" 2 | 3 | services: 4 | react-app: 5 | build: 6 | context: ./ 7 | target: development-build-stage 8 | environment: 9 | WATCHPACK_POLLING: "true" 10 | ports: 11 | - "${APP_PORT:-3000}:3000" 12 | volumes: 13 | - ./:/app 14 | - /app/node_modules 15 | restart: "unless-stopped" 16 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import { configureStore, applyMiddleware } from '@reduxjs/toolkit'; 2 | import logger from 'redux-logger'; 3 | import { composeWithDevTools } from 'redux-devtools-extension'; 4 | import thunk from 'redux-thunk'; 5 | import combineReducers from '../reducers/index'; 6 | 7 | const store = configureStore( 8 | { reducer: combineReducers }, 9 | composeWithDevTools(applyMiddleware(logger, thunk)) 10 | ); 11 | 12 | export default store; 13 | -------------------------------------------------------------------------------- /src/reducers/index.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux'; 2 | import issues from './issues'; 3 | import labels from './labels'; 4 | import repos from './repos'; 5 | import selectedLabels from './selectedLabels'; 6 | import githubauth from './githubauth'; 7 | 8 | export default combineReducers({ 9 | issuesStore: issues, 10 | labelsStore: labels, 11 | reposStore: repos, 12 | selectedLabelsStore: selectedLabels, 13 | githubauthStore: githubauth 14 | }); 15 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Common build stage 2 | FROM node:20-alpine3.17 as common-build-stage 3 | 4 | WORKDIR /app 5 | 6 | COPY ./ ./ 7 | 8 | RUN npm install 9 | 10 | EXPOSE 3000 11 | 12 | # Dvelopment build stage 13 | FROM common-build-stage as development-build-stage 14 | 15 | ENV NODE_ENV development 16 | 17 | CMD ["npm", "start"] 18 | 19 | # Production build stage 20 | FROM common-build-stage as production-build-stage 21 | 22 | ENV NODE_ENV production 23 | 24 | CMD ["npm", "run", "build"] -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | body { 6 | margin: 0; 7 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 8 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 9 | sans-serif; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | 14 | code { 15 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 16 | monospace; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/containers/PageTracker.js: -------------------------------------------------------------------------------- 1 | import { GA4React } from 'ga-4-react'; 2 | 3 | const ga4react = new GA4React(process.env.REACT_APP_MEASUREMENTID).initialize(); 4 | 5 | export const ANALYTICSDATA = { 6 | path: '', 7 | search: '', 8 | title: '' 9 | }; 10 | 11 | const pageTrackerAnalytics = (state = ANALYTICSDATA) => { 12 | const { path, search, title } = state; 13 | ga4react 14 | .then((ga) => { 15 | ga.pageview(path, search, title); 16 | }) 17 | .catch((err) => console.error(`Analytics failed: ${err}`)); 18 | }; 19 | 20 | export default pageTrackerAnalytics; 21 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import { Provider } from 'react-redux'; 4 | import { BrowserRouter, Routes, Route } from 'react-router-dom'; 5 | import store from './store'; 6 | import App from './containers/App'; 7 | import 'tw-elements'; 8 | 9 | const root = ReactDOM.createRoot(document.getElementById('root')); 10 | root.render( 11 | 12 | 13 | 14 | } /> 15 | 16 | 17 | 18 | ); 19 | -------------------------------------------------------------------------------- /src/reducers/repos.js: -------------------------------------------------------------------------------- 1 | import { 2 | GET_REPOS_REQUEST, 3 | GET_REPOS_SUCCESS, 4 | GET_REPOS_FAIL 5 | } from '../constants/reposConstants.js'; 6 | 7 | export default function repos(state = {}, action) { 8 | switch (action.type) { 9 | case GET_REPOS_REQUEST: 10 | return { 11 | ...state, 12 | loading: true 13 | }; 14 | case GET_REPOS_SUCCESS: 15 | return { 16 | loading: false, 17 | reposlist: action.payload 18 | }; 19 | case GET_REPOS_FAIL: 20 | return { 21 | loading: false, 22 | error: action.error 23 | }; 24 | default: 25 | return state; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Issue Finder", 3 | "name": "Best Open Source issue locator for busy Devs!", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "android-chrome-192x192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "android-chrome-512x512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /src/reducers/githubauth.js: -------------------------------------------------------------------------------- 1 | import { 2 | GET_GITHUBAUTHKEY_REQUEST, 3 | GET_GITHUBAUTHKEY_SUCCESS, 4 | GET_GITHUBAUTHKEY_FAIL 5 | } from '../constants/githubAuthConstants'; 6 | 7 | export default function githubauth(state = {}, action) { 8 | switch (action.type) { 9 | case GET_GITHUBAUTHKEY_REQUEST: 10 | return { 11 | ...state, 12 | loading: true 13 | }; 14 | case GET_GITHUBAUTHKEY_SUCCESS: 15 | return { 16 | loading: false, 17 | data: action.payload.data 18 | }; 19 | case GET_GITHUBAUTHKEY_FAIL: 20 | return { 21 | loading: false, 22 | error: action.error 23 | }; 24 | default: 25 | return state; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.env.sample: -------------------------------------------------------------------------------- 1 | REACT_APP_API_KEY=gh_xxxxxxxx... 2 | REACT_APP_APP_GITHUB_CLIENT_ID=xxxxxxx 3 | REACT_APP_GITHUB_REDIRECT_URI=http://localhost:3000 4 | # add/change 'REACT_APP_REPOS_LIST_URL' key only if you want to host repositories list json somewhere else 5 | REACT_APP_REPOS_LIST_URL=https://raw.githubusercontent.com/shadmanhere/ycombinator_githubs/main/06_repos.json 6 | REACT_APP_FIRBASE_API_KEY=AIzaSyDs-rxvOLmskYhudQWPOxl-whELlKKUYhs 7 | REACT_APP_AUTHDOMAIN=issue-finder.firebaseapp.com 8 | REACT_APP_PROJECTID=issue-finder 9 | REACT_APP_STORAGEBUCKET=issue-finder.appspot.com 10 | REACT_APP_MSG_SENDERID=918268898722 11 | REACT_APP_APPID=1:918268898722:web:653b04454a9eee41d896fb 12 | REACT_APP_MEASUREMENTID=G-C28740E7D5 13 | 14 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "node": true, 5 | "es2021": true, 6 | "jest": true 7 | }, 8 | "extends": [ 9 | "eslint:recommended", 10 | "plugin:react/recommended", 11 | "plugin:prettier/recommended" 12 | ], 13 | "parserOptions": { 14 | "ecmaFeatures": { 15 | "jsx": true 16 | }, 17 | "ecmaVersion": "latest", 18 | "sourceType": "module" 19 | }, 20 | "plugins": [ 21 | "react" 22 | ], 23 | "rules": { 24 | "react/react-in-jsx-scope": "off", 25 | "prettier/prettier": 26 | [ "error", { 27 | "endOfLine": "auto"} 28 | ] 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/snippets/github_scraper.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | import dotenv from 'dotenv'; 3 | 4 | dotenv.config(); 5 | 6 | (async () => { 7 | try { 8 | const gh = await fetch(process.argv[2], { 9 | headers: { 10 | Authorization: `token ${process.env.secret}` 11 | } 12 | }); 13 | const ghJson = await gh.json(); 14 | if (ghJson.message !== 'Not Found') { 15 | ghJson.forEach((repo) => { 16 | if (repo.language === 'JavaScript' || repo.language === 'Ruby') { 17 | console.info( 18 | `${repo.open_issues_count}, https://github.com/${repo.full_name}, ${repo.language}` 19 | ); 20 | } 21 | }); 22 | } 23 | // eslint-disable-next-line no-empty 24 | } catch (e) {} 25 | })(); 26 | -------------------------------------------------------------------------------- /src/reducers/selectedLabels.js: -------------------------------------------------------------------------------- 1 | import { 2 | ADD_TO_SELECTED_LABELS, 3 | REMOVE_FROM_SELECTED_LABELS, 4 | EMPTY_SELECTED_LABELS 5 | } from '../constants/selectedLabelsConstants'; 6 | 7 | export default function selectLabels(state = [], action) { 8 | const selectedlabel = action.payload; 9 | const isSelectedIssueExist = state.find((i) => i === selectedlabel); 10 | switch (action.type) { 11 | case ADD_TO_SELECTED_LABELS: 12 | if (isSelectedIssueExist) { 13 | return state; 14 | } else { 15 | return [...state, selectedlabel]; 16 | } 17 | case REMOVE_FROM_SELECTED_LABELS: 18 | return state.filter((i) => i !== action.payload); 19 | case EMPTY_SELECTED_LABELS: 20 | return []; 21 | default: 22 | return state; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/components/SearchEngine.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { useDispatch, useSelector } from 'react-redux'; 3 | import { getLabels } from '../actions'; 4 | 5 | export const SearchEngine = () => { 6 | const dispatch = useDispatch(); 7 | const repos = useSelector((state) => state.reposStore); 8 | const { language } = useSelector((state) => state.issuesStore); 9 | const access_token = useSelector((state) => state.githubauthStore.data?.access_token); 10 | useEffect( 11 | () => { 12 | const filteredRepolist = repos.reposlist.filter( 13 | (repo) => 14 | repo.language.trim() === language || 15 | repo.topics?.trim().toLowerCase().split(' ').includes(language.toLowerCase()) 16 | ); 17 | dispatch(getLabels(filteredRepolist, language, access_token)); 18 | }, 19 | // eslint-disable-next-line 20 | [repos, language] 21 | ); 22 | }; 23 | -------------------------------------------------------------------------------- /src/reducers/labels.js: -------------------------------------------------------------------------------- 1 | import { 2 | GET_LABELS_REQUEST, 3 | GET_LABELS_SUCCESS, 4 | GET_LABELS_FAIL, 5 | TOGGLE_MENU 6 | } from '../constants/labelConstants.js'; 7 | 8 | const initialState = { 9 | menu: 1 10 | }; 11 | 12 | export default function labels(state = initialState, action) { 13 | switch (action.type) { 14 | case GET_LABELS_REQUEST: 15 | return { 16 | ...state, 17 | loading: true, 18 | loadingPercentage: action.loadingPercentage 19 | }; 20 | case GET_LABELS_SUCCESS: 21 | return { 22 | loading: false, 23 | menu: state.menu, 24 | labelslist: [...new Set(action.payload)] 25 | }; 26 | case GET_LABELS_FAIL: 27 | return { 28 | loading: false, 29 | menu: state.menu, 30 | error: action.error 31 | }; 32 | case TOGGLE_MENU: 33 | return { 34 | ...state, 35 | menu: action.menu 36 | }; 37 | default: 38 | return state; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/utility/firebase.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-vars */ 2 | // Import the functions you need from the SDKs you need 3 | import { initializeApp } from 'firebase/app'; 4 | import { getAnalytics } from 'firebase/analytics'; 5 | // TODO: Add SDKs for Firebase products that you want to use 6 | // https://firebase.google.com/docs/web/setup#available-libraries 7 | 8 | // Your web app's Firebase configuration 9 | // For Firebase JS SDK v7.20.0 and later, measurementId is optional 10 | const firebaseConfig = { 11 | apiKey: process.env.REACT_APP_FIRBASE_API_KEY, 12 | authDomain: process.env.REACT_APP_AUTHDOMAIN, 13 | projectId: process.env.REACT_APP_PROJECTID, 14 | storageBucket: process.env.REACT_APP_STORAGEBUCKET, 15 | messagingSenderId: process.env.REACT_APP_MSG_SENDERID, 16 | appId: process.env.REACT_APP_APPID, 17 | measurementId: process.env.REACT_APP_MEASUREMENTID 18 | }; 19 | 20 | // Initialize Firebase 21 | const app = initializeApp(firebaseConfig); 22 | const analytics = getAnalytics(app); 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Oscar Mier 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/containers/App.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | import { useEffect, useCallback } from 'react'; 3 | import { useSelector } from 'react-redux'; 4 | import pageTrackerAnalytics from './PageTracker'; 5 | import { useLocation } from 'react-router'; 6 | import './App.css'; 7 | import 'bootstrap/dist/css/bootstrap.min.css'; 8 | 9 | import Home from '../components/Home'; 10 | import Labels from '../components/Labels'; 11 | import Issues from '../components/Issues'; 12 | 13 | function App() { 14 | const { pathname, search } = useLocation(); 15 | const analytics = useCallback(() => { 16 | pageTrackerAnalytics({ path: pathname, search: search, title: pathname.split('/')[1] }); 17 | }, [pathname, search]); 18 | 19 | useEffect(() => { 20 | analytics(); 21 | }, [analytics]); 22 | 23 | const { menu } = useSelector((state) => state.labelsStore); 24 | const { issuesList } = useSelector((state) => state.issuesStore); 25 | return ( 26 | <> 27 | 28 | {menu === 2 ? : null} 29 | {issuesList && menu === 1 ? : menu === 2 ? : null} 30 | 31 | ); 32 | } 33 | 34 | export default App; 35 | -------------------------------------------------------------------------------- /src/reducers/issues.js: -------------------------------------------------------------------------------- 1 | import { 2 | GET_ISSUES_REQUEST, 3 | GET_ISSUES_SUCCESS, 4 | GET_ISSUES_FAIL, 5 | EMPTY_ISSUES_LIST, 6 | SET_LANGUAGE 7 | } from '../constants/issueConstants.js'; 8 | 9 | const initialState = { 10 | language: 'All' 11 | }; 12 | export default function issues(state = initialState, action) { 13 | switch (action.type) { 14 | case GET_ISSUES_REQUEST: 15 | return { 16 | ...state, 17 | loading: true 18 | }; 19 | case GET_ISSUES_SUCCESS: 20 | if (action.payload.length === 0) return { ...state, loading: false }; 21 | if (state.issuesList) { 22 | return { 23 | loading: false, 24 | language: state.language, 25 | issuesList: [...state.issuesList, action.payload] 26 | }; 27 | } else { 28 | return { 29 | loading: false, 30 | language: state.language, 31 | issuesList: [action.payload] 32 | }; 33 | } 34 | case GET_ISSUES_FAIL: 35 | return { 36 | ...state, 37 | loading: false, 38 | error: action.error 39 | }; 40 | case EMPTY_ISSUES_LIST: 41 | return { 42 | loading: false, 43 | language: state.language, 44 | issuesList: [] 45 | }; 46 | case SET_LANGUAGE: 47 | return { 48 | ...state, 49 | language: action.language 50 | }; 51 | default: 52 | return state; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/api/index.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | // Api calls to github https://docs.github.com/en/rest/issues/issues 4 | 5 | // fetchIssues('org/repo', 'filters'); 6 | // sample url to search repo issue by label - https://api.github.com/repos/chatwoot/chatwoot/issues?labels=good%20first%20issue 7 | const API = axios.create({ 8 | baseURL: 'https://api.github.com', 9 | headers: { 10 | 'Content-Type': 'application/json' 11 | // Before running npm start, run 12 | // export REACT_APP_API_KEY=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 13 | // Except with your own key generated here https://github.com/settings/tokens 14 | } 15 | }); 16 | const reposList = 17 | process.env.REACT_APP_REPOS_LIST_URL || 18 | 'https://raw.githubusercontent.com/shadmanhere/ycombinator_githubs/main/06_repos.json'; 19 | 20 | export const fetchRepos = async () => await axios.get(reposList); 21 | export const fetchLabels = async (org, repo, access_token) => 22 | await API.get(`/repos/${org}/${repo}/labels`, { 23 | headers: { 24 | 'Content-Type': 'application/json', 25 | Authorization: `token ${access_token}` 26 | } 27 | }); 28 | 29 | export const fetchIssues = async (org, repo, label, access_token) => 30 | await API.get(`/repos/${org}/${repo}/issues?labels=${label}`, { 31 | headers: { 32 | 'Content-Type': 'application/json', 33 | Authorization: `token ${access_token}` 34 | } 35 | }); 36 | 37 | export const getGitHubAuthKey = async (code) => 38 | await axios.post('https://issue-finder-auth.vercel.app/api/', { 39 | code 40 | }); 41 | -------------------------------------------------------------------------------- /src/components/GithubAuth.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react'; 2 | import { useDispatch, useSelector } from 'react-redux'; 3 | import { getGithubAuthKey } from '../actions'; 4 | import Button from 'react-bootstrap/Button'; 5 | 6 | const clientId = process.env.REACT_APP_GITHUB_CLIENT_ID; 7 | const redirectUri = process.env.REACT_APP_GITHUB_REDIRECT_URI; 8 | 9 | const authorizationEndpoint = 'https://github.com/login/oauth/authorize'; 10 | 11 | // eslint-disable-next-line react/prop-types 12 | const GitHubAuth = ({ darkMode }) => { 13 | const { loading } = useSelector((state) => state.githubauthStore); 14 | const dispatch = useDispatch(); 15 | useEffect(() => { 16 | const handleGitHubCallback = () => { 17 | const urlParams = new URLSearchParams(window.location.search); 18 | const code = urlParams.get('code'); 19 | if (code) dispatch(getGithubAuthKey(code)); 20 | }; 21 | 22 | // Check if the URL contains the GitHub callback parameters 23 | if (window.location.search.includes('code=')) { 24 | handleGitHubCallback(); 25 | } 26 | }, []); 27 | 28 | const getGitHubAccessToken = () => { 29 | const state = Math.random().toString(36).substring(7); 30 | 31 | // Store the state in sessionStorage for later verification 32 | sessionStorage.setItem('githubOAuthState', state); 33 | 34 | const authorizationUrl = `${authorizationEndpoint}?client_id=${clientId}&redirect_uri=${redirectUri}&scope=user&state=${state}`; 35 | 36 | // Redirect the user to the GitHub authorization URL 37 | window.location.href = authorizationUrl; 38 | }; 39 | 40 | return ( 41 | 47 | ); 48 | }; 49 | 50 | export default GitHubAuth; 51 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "issue-finder", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@material-tailwind/react": "^1.2.3", 7 | "@reduxjs/toolkit": "^1.8.3", 8 | "@testing-library/jest-dom": "^5.16.4", 9 | "@testing-library/react": "^13.3.0", 10 | "@testing-library/user-event": "^13.5.0", 11 | "axios": "^0.27.2", 12 | "bootstrap": "^5.2.0", 13 | "firebase": "^9.9.3", 14 | "ga-4-react": "^0.1.281", 15 | "prop-types": "^15.8.1", 16 | "rc-progress": "^3.4.0", 17 | "react": "^18.2.0", 18 | "react-bootstrap": "^2.4.0", 19 | "react-dom": "^18.2.0", 20 | "react-icons": "^4.4.0", 21 | "react-redux": "^8.0.2", 22 | "react-router-dom": "^6.4.1", 23 | "redux-devtools-extension": "^2.13.9", 24 | "redux-logger": "^3.0.6", 25 | "redux-thunk": "^2.4.1", 26 | "tw-elements": "^1.0.0-alpha12", 27 | "web-vitals": "^2.1.4" 28 | }, 29 | "scripts": { 30 | "start": "react-scripts start", 31 | "build": "react-scripts build", 32 | "test": "react-scripts test", 33 | "eject": "react-scripts eject", 34 | "lint": "eslint .", 35 | "lint:fix": "eslint . --fix", 36 | "format": "prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc" 37 | }, 38 | "eslintConfig": { 39 | "extends": [ 40 | "react-app", 41 | "react-app/jest" 42 | ] 43 | }, 44 | "browserslist": { 45 | "production": [ 46 | ">0.2%", 47 | "not dead", 48 | "not op_mini all" 49 | ], 50 | "development": [ 51 | "last 1 chrome version", 52 | "last 1 firefox version", 53 | "last 1 safari version" 54 | ] 55 | }, 56 | "devDependencies": { 57 | "ajv": "^7.2.4", 58 | "eslint": "^8.22.0", 59 | "eslint-config-prettier": "^8.5.0", 60 | "eslint-plugin-prettier": "^4.2.1", 61 | "prettier": "^2.7.1", 62 | "react-scripts": "5.0.1", 63 | "tailwindcss": "^3.1.8" 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/containers/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .github-source { 6 | text-decoration: none; 7 | color: gray; 8 | } 9 | 10 | .App-logo { 11 | height: 40vmin; 12 | pointer-events: none; 13 | } 14 | 15 | @media (prefers-reduced-motion: no-preference) { 16 | .App-logo { 17 | animation: App-logo-spin infinite 20s linear; 18 | } 19 | } 20 | 21 | .App-header { 22 | background-color: #08070b; 23 | display: flex; 24 | flex-direction: column; 25 | align-items: center; 26 | justify-content: center; 27 | font-size: calc(10px + 2vmin); 28 | color: white; 29 | transition: 3s; 30 | } 31 | 32 | .App-link { 33 | color: #61dafb; 34 | } 35 | 36 | @keyframes App-logo-spin { 37 | from { 38 | transform: rotate(0deg); 39 | } 40 | to { 41 | transform: rotate(360deg); 42 | } 43 | } 44 | 45 | /* TESTING CSS (TEMP) */ 46 | li { 47 | list-style-type: none; 48 | } 49 | 50 | input { 51 | width: 1em; 52 | height: 1em; 53 | vertical-align: text-bottom; 54 | } 55 | 56 | label { 57 | display: block; 58 | padding-bottom: 10px; 59 | font-size: 1.5em; 60 | width: 12em; 61 | height: 1.25em; 62 | /* border: 2px solid black; */ 63 | } 64 | 65 | code { 66 | margin-left: 0.25em; 67 | } 68 | 69 | .label-container, 70 | .issue-container { 71 | border: 0.5em solid #282c34; 72 | min-height: 90vh; 73 | } 74 | 75 | .labelCont { 76 | min-height: 20em; 77 | min-width: 300px; 78 | display: flex; 79 | flex-wrap: wrap; 80 | justify-content: space-around; 81 | align-items: flex-start; 82 | align-content: flex-start; 83 | } 84 | 85 | .filter-title { 86 | background-color: #282c34; 87 | color: white; 88 | margin: 0; 89 | padding-left: 0.25em; 90 | padding-bottom: 0.3em; 91 | } 92 | 93 | .App-title { 94 | word-wrap: none; 95 | } 96 | 97 | .git-icon { 98 | color: rgba(255, 255, 255, 0.7); 99 | display: inline; 100 | margin-left: 0.5rem; 101 | margin-right: 0.5rem; 102 | width: 2rem; 103 | height: 2rem; 104 | } 105 | 106 | .git-icon:hover { 107 | color: gray; 108 | display: inline; 109 | margin-left: 0.5rem; 110 | margin-right: 0.5rem; 111 | width: 2rem; 112 | height: 2rem; 113 | } 114 | -------------------------------------------------------------------------------- /src/components/Labels.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { useSelector, useDispatch } from 'react-redux'; 3 | import { addToSelectedLabels, removeFromSelectLabels } from '../actions'; 4 | 5 | const Labels = () => { 6 | // sample using a bunch of labels (later we can use state selectors) 7 | // const labels_sample = ['20%-project', 'accessibility', 'backend', 'bug', 'chatwoot-cloud', 'chore', 'content', 'dependencies', 'devops', 'docs-done', 'docs-needed', 'documentation', 'enhancement', 'Enterprise', 'Epic', 'feature', 'frontend', 'Good first issue', 'hacktoberfest', 'hotfix', 'in-QA', 'infrastructure', 'investigation', 'javascript', 'need-design', 'need-discussion', 'need-more-info', 'need-spec', 'on-hold', 'open-for-prs', 'duplicate', 'help wanted', 'invalid', 'question', 'wontfix', '⛵ next-release', 'artilery-pro', 'debt', 'discussion', 'docs', 'engine:http', 'engine:playwright', 'engine:socketio', 'engine:ws', 'engines']; 8 | const { labelslist } = useSelector((state) => state.labelsStore); 9 | const dispatch = useDispatch(); 10 | 11 | function handleLabelSelection(label, isChecked) { 12 | if (isChecked) dispatch(addToSelectedLabels(label)); 13 | else dispatch(removeFromSelectLabels(label)); 14 | } 15 | return ( 16 |
17 |
18 |

Labels

19 |
20 |
21 | {labelslist ? ( 22 |
    23 | {labelslist.map((label, i) => { 24 | return ( 25 |
  • 26 | 33 |
  • 34 | ); 35 | })} 36 |
37 | ) : ( 38 |
39 |
40 | Loading... 41 |
42 |
43 | )} 44 |
45 |
46 | ); 47 | }; 48 | 49 | export default Labels; 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 106 | 107 | # dependencies 108 | /node_modules 109 | /.pnp 110 | .pnp.js 111 | 112 | # testing 113 | /coverage 114 | 115 | # production 116 | /build 117 | 118 | # misc 119 | .DS_Store 120 | .env.local 121 | .env.development.local 122 | .env.test.local 123 | .env.production.local 124 | 125 | npm-debug.log* 126 | yarn-debug.log* 127 | yarn-error.log* 128 | 129 | /package-lock.json 130 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | 28 | 34 | 35 | 36 | 40 | 41 | 42 | Issue Finder 43 | 44 | 45 | 46 |
47 | 57 | 58 | 59 | 60 | 61 | 62 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 3 | To get a local copy up and running follow these simple example steps. 4 | 5 | 6 | ## Pre-requisites 7 | - Text Editor | Git and Github set up 8 | 9 | ## How do I submit a Pull Request (PR)? 10 | 11 | Contributing follows this workflow: 12 | 13 | 1. Fork [this project repository](https://github.com/voscarmv/issue-finder). 14 | 2. Clone the forked repository to your computer. 15 | - `git clone https://github.com//issue-finder.git` 16 | - `cd issue-finder` 17 | 3. Create and switch into a new branch. 18 | - `git checkout -b my-branch-name` 19 | - Open the project in your favorite code editor `code .` for VS Code. 20 | 4. Update or add to the existing code from the issue assigned to you and commit the changes. 21 | 5. Make a PR to merge your fork with this repo. 22 | ## Usage 23 | 24 | To get a local copy running on your browser follow this workflow: 25 | 26 | - Run `npm install` to load necessary files from package.json 27 | - Run `touch .env` 28 | - > Generate your GitHub token here https://github.com/settings/tokens 29 | - Run `echo REACT_APP_API_KEY=ghp_my_github_token > .env` 30 | - Then in your terminal run `npm start` and view app in your browser 31 | 32 | ## Running code checks 33 | 34 | Apply Linter checks with the following instructions 35 | 36 | - Run `npm run lint` to view errors. 37 | - Run `npm run lint:fix` to fix multiple errors. 38 | 39 | ## Contributing to Issue Finder 40 | 41 | - We welcome all meaningful contributions to Issue Finder. If you see any areas of improvement or wish to contribute to existing issues, please connect with our maintainers directly on the issue, and we will be pleased to help you as much as possible. 42 | 43 | 44 | ## Contributing - Open Source 45 | 46 | **1.** Fork the repository. 47 | 48 | **2.** Clone your forked copy of the project into your local system. 49 | 50 | ``` 51 | git clone --depth 1 https://github.com/yourusername/issue-finder.git 52 | ``` 53 | 54 | **3.** Navigate to the project directory. 📁 55 | 56 | ``` 57 | cd healthphilics 58 | ``` 59 | 60 | **4.** Add a reference (remote) to the original repository. 61 | 62 | ``` 63 | git remote add upstream https://github.com/voscarmv/issue-finder.git 64 | ``` 65 | 66 | **5.** Check the remotes for this repository. 67 | 68 | ``` 69 | git remote -v 70 | ``` 71 | 72 | **6.** Always take a pull from the upstream repository to your master branch to keep it at par with the main project (updated repository). 73 | 74 | ``` 75 | git pull upstream main 76 | ``` 77 | 78 | **7.** Create a new branch. 79 | 80 | ``` 81 | git checkout -b pr1 82 | ``` 83 | 84 | **8.** Search the "issue-finder" folder, add the modified HTML and CSS files and remove the previous ones. 85 | 86 | **9.** Track your changes. ✔️ 87 | 88 | ``` 89 | git add . 90 | ``` 91 | 92 | **10.** Commit your changes. 93 | 94 | ``` 95 | git commit -m "pulled my first PR" 96 | ``` 97 | 98 | **11.** Push the committed changes in your feature branch to your remote repository. 99 | 100 | ``` 101 | git push -u origin pr1 102 | ``` 103 | 104 | **12.** To create a pull request, click on `compare and pull requests`. Please ensure you compare your feature branch to the desired branch of the repository you are supposed to make a PR to. 105 | 106 | **13.** Add appropriate title and description to your pull request explaining your changes and efforts done. 107 | 108 | **14.** Click on `Create Pull Request`. 109 | 110 | **15.** Voila! You have made a PR to the project. Sit back and relax while your PR is reviewed by the maintainers. 111 | -------------------------------------------------------------------------------- /src/snippets/03_repos.csv: -------------------------------------------------------------------------------- 1 | https://api.github.com/orgs/about/repos 2 | https://api.github.com/orgs/AnandChowdhary/repos 3 | https://api.github.com/orgs/ankane/repos 4 | https://api.github.com/orgs/AnomalyInnovations/repos 5 | https://api.github.com/orgs/apps/repos 6 | https://api.github.com/orgs/arengu/repos 7 | https://api.github.com/orgs/argoproj/repos 8 | https://api.github.com/orgs/artilleryio/repos 9 | https://api.github.com/orgs/athensresearch/repos 10 | https://api.github.com/orgs/authzed/repos 11 | https://api.github.com/orgs/awslabs/repos 12 | https://api.github.com/orgs/axios/repos 13 | https://api.github.com/orgs/botcity-dev/repos 14 | https://api.github.com/orgs/chatbiz-id/repos 15 | https://api.github.com/orgs/chatwoot/repos 16 | https://api.github.com/orgs/cloudanix/repos 17 | https://api.github.com/orgs/declangoncalves/repos 18 | https://api.github.com/orgs/drifting-in-space/repos 19 | https://api.github.com/orgs/dyte-in/repos 20 | https://api.github.com/orgs/elementary-data/repos 21 | https://api.github.com/orgs/en/repos 22 | https://api.github.com/orgs/enso-org/repos 23 | https://api.github.com/orgs/enterprise/repos 24 | https://api.github.com/orgs/evidentlyai/repos 25 | https://api.github.com/orgs/FifthTry/repos 26 | https://api.github.com/orgs/filamentgroup/repos 27 | https://api.github.com/orgs/filipesilva/repos 28 | https://api.github.com/orgs/firezone/repos 29 | https://api.github.com/orgs/flatpickr/repos 30 | https://api.github.com/orgs/florian/repos 31 | https://api.github.com/orgs/fluidicon.png/repos 32 | https://api.github.com/orgs/frain-dev/repos 33 | https://api.github.com/orgs/getlago/repos 34 | https://api.github.com/orgs/github/repos 35 | https://api.github.com/orgs/gravitl/repos 36 | https://api.github.com/orgs/growthbook/repos 37 | https://api.github.com/orgs/heptameta/repos 38 | https://api.github.com/orgs/hyperbeam/repos 39 | https://api.github.com/orgs/infracost/repos 40 | https://api.github.com/orgs/infrahq/repos 41 | https://api.github.com/orgs/initml/repos 42 | https://api.github.com/orgs/InstantDomain/repos 43 | https://api.github.com/orgs/itsrainingmani/repos 44 | https://api.github.com/orgs/jensimmons/repos 45 | https://api.github.com/orgs/jeroenvandijk/repos 46 | https://api.github.com/orgs/jonsuh/repos 47 | https://api.github.com/orgs/JovianML/repos 48 | https://api.github.com/orgs/juniusfree/repos 49 | https://api.github.com/orgs/lightly-ai/repos 50 | https://api.github.com/orgs/lunatic-solutions/repos 51 | https://api.github.com/orgs/mayahq/repos 52 | https://api.github.com/orgs/mindee/repos 53 | https://api.github.com/orgs/mozdevs/repos 54 | https://api.github.com/orgs/mozilla/repos 55 | https://api.github.com/orgs/muicss/repos 56 | https://api.github.com/orgs/necolas/repos 57 | https://api.github.com/orgs/neotyk/repos 58 | https://api.github.com/orgs/notifications/repos 59 | https://api.github.com/orgs/nthd3gr33/repos 60 | https://api.github.com/orgs/nullstone-io/repos 61 | https://api.github.com/orgs/orgs/repos 62 | https://api.github.com/orgs/pabio/repos 63 | https://api.github.com/orgs/payloadcms/repos 64 | https://api.github.com/orgs/pipekit/repos 65 | https://api.github.com/orgs/ploomber/repos 66 | https://api.github.com/orgs/pluggyai/repos 67 | https://api.github.com/orgs/Pluralith/repos 68 | https://api.github.com/orgs/postgresml/repos 69 | https://api.github.com/orgs/pricing/repos 70 | https://api.github.com/orgs/_private/repos 71 | https://api.github.com/orgs/pyroscope-io/repos 72 | https://api.github.com/orgs/repos/repos 73 | https://api.github.com/orgs/roryokane/repos 74 | https://api.github.com/orgs/security/repos 75 | https://api.github.com/orgs/sematic-ai/repos 76 | https://api.github.com/orgs/serverless-stack/repos 77 | https://api.github.com/orgs/shanberg/repos 78 | https://api.github.com/orgs/sid597/repos 79 | https://api.github.com/orgs/sindresorhus/repos 80 | https://api.github.com/orgs/sourcec0de/repos 81 | https://api.github.com/orgs/sturdy-dev/repos 82 | https://api.github.com/orgs/sturdyfi/repos 83 | https://api.github.com/orgs/suitcss/repos 84 | https://api.github.com/orgs/supabase/repos 85 | https://api.github.com/orgs/svix/repos 86 | https://api.github.com/orgs/tailwindcss/repos 87 | https://api.github.com/orgs/tangjeff0/repos 88 | https://api.github.com/orgs/thesophiaxu/repos 89 | https://api.github.com/orgs/tuva-health/repos 90 | https://api.github.com/orgs/twbs/repos 91 | https://api.github.com/orgs/vuestorefront/repos 92 | https://api.github.com/orgs/vuestorefront-community/repos 93 | https://api.github.com/orgs/warrant-dev/repos 94 | https://api.github.com/orgs/wasp-lang/repos 95 | https://api.github.com/orgs/webiny/repos 96 | https://api.github.com/orgs/windmill-labs/repos 97 | https://api.github.com/orgs/yatima-inc/repos 98 | -------------------------------------------------------------------------------- /src/actions/index.js: -------------------------------------------------------------------------------- 1 | import * as api from '../api'; 2 | import * as issue from '../constants/issueConstants'; 3 | import * as label from '../constants/labelConstants'; 4 | import * as repo from '../constants/reposConstants'; 5 | import { 6 | ADD_TO_SELECTED_LABELS, 7 | REMOVE_FROM_SELECTED_LABELS, 8 | EMPTY_SELECTED_LABELS 9 | } from '../constants/selectedLabelsConstants'; 10 | 11 | import { 12 | GET_GITHUBAUTHKEY_REQUEST, 13 | GET_GITHUBAUTHKEY_SUCCESS, 14 | GET_GITHUBAUTHKEY_FAIL 15 | } from '../constants/githubAuthConstants'; 16 | 17 | export const getIssues = (org, repo, label, access_token) => async (dispatch) => { 18 | dispatch({ 19 | type: issue.GET_ISSUES_REQUEST 20 | }); 21 | try { 22 | const { data } = await api.fetchIssues(org, repo, label, access_token); 23 | dispatch({ 24 | type: issue.GET_ISSUES_SUCCESS, 25 | payload: data 26 | }); 27 | } catch (e) { 28 | dispatch({ 29 | type: issue.GET_ISSUES_FAIL, 30 | error: e.message 31 | }); 32 | } 33 | }; 34 | 35 | export const getGithubAuthKey = (code) => async (dispatch) => { 36 | dispatch({ 37 | type: GET_GITHUBAUTHKEY_REQUEST 38 | }); 39 | try { 40 | const data = await api.getGitHubAuthKey(code); 41 | dispatch({ 42 | type: GET_GITHUBAUTHKEY_SUCCESS, 43 | payload: data 44 | }); 45 | } catch (e) { 46 | dispatch({ 47 | type: GET_GITHUBAUTHKEY_FAIL, 48 | error: e.message 49 | }); 50 | } 51 | }; 52 | 53 | export const toggleLabelList = (menu) => (dispatch) => { 54 | if (menu === 1) menu = 2; 55 | else menu = 1; 56 | dispatch({ 57 | type: label.TOGGLE_MENU, 58 | menu 59 | }); 60 | }; 61 | 62 | export const epmtyIssuesList = () => (dispatch) => { 63 | dispatch({ 64 | type: issue.EMPTY_ISSUES_LIST 65 | }); 66 | }; 67 | 68 | export const epmtySelectedLabel = () => (dispatch) => { 69 | dispatch({ 70 | type: EMPTY_SELECTED_LABELS 71 | }); 72 | }; 73 | 74 | export const setLanguage = (language) => (dispatch) => { 75 | dispatch({ 76 | type: issue.SET_LANGUAGE, 77 | language 78 | }); 79 | }; 80 | 81 | export const rawLabels = async (repos, dispatch, access_token) => { 82 | let rawdata = []; 83 | let labels; 84 | for (let i = 0; i < repos.length; i++) { 85 | const item = repos[i]; 86 | try { 87 | labels = await api.fetchLabels(item.org, item.repo, access_token); 88 | } catch (e) { 89 | console.error(e); 90 | } 91 | for (let j = 0; j < labels.data.length; j++) { 92 | const label = labels.data[j]; 93 | rawdata.push(label.name); 94 | } 95 | dispatch({ 96 | type: label.GET_LABELS_REQUEST, 97 | loadingPercentage: (i * 100) / repos.length 98 | }); 99 | } 100 | return rawdata; 101 | }; 102 | 103 | export const getLabels = (repos, language, access_token) => async (dispatch, getState) => { 104 | if (repos === undefined) return; 105 | dispatch({ 106 | type: label.GET_LABELS_REQUEST, 107 | loadingPercentage: 0 108 | }); 109 | try { 110 | // get date for list of labels, saved in browser's local strorage 111 | const localStorageObj = JSON.parse(localStorage.getItem(language + '_labelslist')); 112 | const localDataDate = localStorageObj?.date; 113 | let today = new Date(); 114 | const dd = String(today.getDate()).padStart(2, '0'); 115 | const mm = String(today.getMonth() + 1).padStart(2, '0'); 116 | const yyyy = today.getFullYear(); 117 | today = (mm + dd + yyyy).toString(); 118 | // if date, when data was saved, is more than a day, clear it. 119 | if (localDataDate !== today) { 120 | localStorage.removeItem(language + '_labelslist'); 121 | } 122 | 123 | // get label list from local storage 124 | const localData = localStorageObj?.labels; 125 | let data = ''; 126 | if (localData) data = localData; 127 | else data = await rawLabels(repos, dispatch, access_token); // if label list is not present in local storage than get fresh list of labels. 128 | dispatch({ 129 | type: label.GET_LABELS_SUCCESS, 130 | payload: data 131 | }); 132 | localStorage.setItem( 133 | language + '_labelslist', 134 | JSON.stringify({ language: language, date: today, labels: getState().labelsStore.labelslist }) 135 | ); 136 | } catch (e) { 137 | console.error(`getlabels error ${e.message}`); 138 | dispatch({ 139 | type: label.GET_LABELS_FAIL, 140 | error: e.message 141 | }); 142 | } 143 | }; 144 | 145 | export const getRepos = () => async (dispatch) => { 146 | dispatch({ 147 | type: repo.GET_REPOS_REQUEST 148 | }); 149 | try { 150 | const { data } = await api.fetchRepos(); 151 | dispatch({ 152 | type: repo.GET_REPOS_SUCCESS, 153 | payload: data 154 | }); 155 | } catch (e) { 156 | dispatch({ 157 | type: repo.GET_REPOS_FAIL, 158 | error: e.message 159 | }); 160 | } 161 | }; 162 | 163 | export const addToSelectedLabels = (labels) => (dispatch) => { 164 | dispatch({ 165 | type: ADD_TO_SELECTED_LABELS, 166 | payload: labels 167 | }); 168 | }; 169 | 170 | export const removeFromSelectLabels = (labels) => (dispatch) => { 171 | dispatch({ 172 | type: REMOVE_FROM_SELECTED_LABELS, 173 | payload: labels 174 | }); 175 | }; 176 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | stevedamesjr@gmail.com | shadman.ali@live.co.uk. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /src/components/Issues.js: -------------------------------------------------------------------------------- 1 | import { Option, Select } from '@material-tailwind/react'; 2 | import React, { useEffect, useState } from 'react'; 3 | import { useSelector, useDispatch } from 'react-redux'; 4 | import { epmtyIssuesList, getIssues } from '../actions'; 5 | 6 | const Issues = () => { 7 | const selectedLabels = useSelector((state) => state.selectedLabelsStore); 8 | const reposlist = useSelector((state) => state.reposStore.reposlist); 9 | const { loading, issuesList, language } = useSelector((state) => state.issuesStore); 10 | const access_token = useSelector((state) => state.githubauthStore.data?.access_token); 11 | const dispatch = useDispatch(); 12 | 13 | useEffect(() => { 14 | dispatch(epmtyIssuesList()); 15 | if (reposlist) { 16 | for (let i = 0; i < reposlist.length; i++) { 17 | for (let j = 0; j < selectedLabels.length; j++) { 18 | if (language === 'All') 19 | dispatch( 20 | getIssues(reposlist[i].org, reposlist[i].repo, selectedLabels[j], access_token) 21 | ); 22 | else if (language.toLowerCase() === reposlist[i].language.trim().toLowerCase()) 23 | dispatch( 24 | getIssues(reposlist[i].org, reposlist[i].repo, selectedLabels[j], access_token) 25 | ); 26 | else if ( 27 | reposlist[i]?.topics?.trim().toLowerCase().split(' ').includes(language.toLowerCase()) 28 | ) 29 | dispatch( 30 | getIssues(reposlist[i].org, reposlist[i].repo, selectedLabels[j], access_token) 31 | ); 32 | } 33 | } 34 | } 35 | }, [selectedLabels]); 36 | const issueListFlat = selectedLabels.length ? issuesList?.flat() : null; 37 | 38 | //Filter based on assignment status 39 | const filterOptions = ['All', 'Assigned', 'Unassigned']; 40 | const [filter, setFilter] = useState(filterOptions[0]); 41 | const [filteredList, setFilteredList] = useState([]); 42 | 43 | const updateFilter = (filter) => { 44 | setFilter(filter); 45 | }; 46 | 47 | useEffect(() => { 48 | const filteredList = issueListFlat?.filter((issue) => { 49 | if (filter == 'Assigned') return issue.assignees.length > 0; 50 | if (filter == 'Unassigned') return issue.assignees.length == 0; 51 | return true; 52 | }); 53 | 54 | setFilteredList(filteredList); 55 | }, [filter]); 56 | 57 | return ( 58 |
59 |
60 |
61 |

Issues

62 | 63 | {selectedLabels.length 64 | ? filter == 'All' 65 | ? issueListFlat?.length 66 | : filteredList?.length 67 | : 0}{' '} 68 | available issues 69 | 70 |
71 |
72 |
73 |
74 | 88 |
89 |
90 | 91 | {/*
*/} 92 | {loading && ( 93 |
94 |
95 | Loading... 96 |
97 |
98 | )} 99 | 100 | {!loading && !issuesList?.length && selectedLabels?.length ? ( 101 |
102 | No Issue Found 103 |
104 | ) : !selectedLabels.length ? ( 105 |
106 | No Label Selected 107 |
108 | ) : ( 109 | 151 | )} 152 | {/*
*/} 153 |
154 | ); 155 | }; 156 | 157 | export default Issues; 158 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Issue-Finder 2 | 3 | > A search engine to find newbie-friendly GitHub issues. The issue finder helps you find a list of beginner-friendly GitHub repos, backed by Y Combinator, that have Ruby and Javascript issues that are good for new contributors. 4 | 5 | 👉 Watch [this YouTube video](https://www.youtube.com/watch?v=4IpDhjib56g) for a quick user's guide! 6 | 7 | Your Open Source Finder![Issue Finder](https://user-images.githubusercontent.com/55185309/192666222-de6ea265-0b24-44cc-b1b6-ed5dd8cc6502.png) 8 | 9 | ## Issue Finder Live 10 | 11 | [Demo](https://github-issue-finder.netlify.app/) 12 | 13 | ## Learn About Issue Finder from the first Contributors 14 | 15 | ### Issue Scraper Logic - Repository Owner 16 | [Video: Oscar Mier](https://youtu.be/Jl4GdOiZ4tk) 17 | 18 | ### React/Redux Logic | API's | Actions - Project Maintainer 19 | [Video: Shadman Ali](https://lnkd.in/gmua_37B) 20 | 21 | ### UI - Project Maintainer 22 | [Video: Steve W Dames Jr](https://lnkd.in/emedpJqU) 23 | 24 | ### Data Retrieval From Github API 25 | [Video: Jose Ramon Castaños](https://lnkd.in/en2wkyaH) 26 | 27 | ### API Request from Y Combinator 28 | [Video: Ricardo Valtierra](https://bit.ly/3Sg7aPF) 29 | 30 | > Honorable Mentions: 31 | 32 | ### Firebase Analytics 33 | 34 | [Linkedin Post: Denis Lafontant](https://www.linkedin.com/feed/update/urn:li:activity:6980560571465146368?utm_source=share&utm_medium=member_desktop) 35 | 36 | 37 | 38 | ## Built With 39 | 40 | - JavaScript 41 | - REACT 42 | - REDUX 43 | - THUNK 44 | - Tailwind CSS 45 | 46 | ## Milestones 47 | 48 | - [x] Milestone 1: Setup the project and install dependencies 49 | - [x] Milestone 2: Setup Redux store 50 | - [x] Milestone 3: Setup thunk 51 | - [x] Milestone 4: Add label logic 52 | - [x] Milestone 5: Add filter logic 53 | - [x] Milestone 6: Create basic UI/UX to display App information 54 | - [x] Milestone 7: Add Analytics support 55 | - [x] Milestone 8: Refactor and optimize components/redux 56 | - [x] Milestone 9: Update Meta for SEO 57 | - [x] Milestone 10: Deploy live APP 58 | 59 | - [x] Debug linter errors 60 | 61 | ## Screenshots 62 | 63 | ![Cell](src/assets/images/screen1.png) 64 | ![Desktop](src/assets/images/screen2.png) 65 | 66 | ## Contribute to Issue Finder 67 | 68 | ### Pre-requisites 69 | 70 | - Code Editor, e.g. VS Code 71 | - Git and a GitHub account 72 | 73 | ### Getting Started 74 | 75 | Getting a local copy of Issue Finder up and running is easy with these following steps. 76 | 77 | ### Clone the repository 78 | 79 | In your terminal, navigate to the directory you would like to store the project and run the git-command: 80 | 81 | ```bash 82 | git clone https://github.com/voscarmv/issue-finder.git 83 | ``` 84 | 85 | After the git-command navigate into the project folder using `cd`: 86 | 87 | ```bash 88 | cd issue-finder 89 | ``` 90 | 91 | Now you can open the project in your favorite code editor. 92 | 93 | > [!NOTE] 94 | > For VS Code you can use the command `code .` to quickly open projects in the editor. 95 | 96 | ### Install dependencies 97 | 98 | After you have cloned the project and have navigated into the project. You 99 | need to install the required dependencies using `npm`, or your perferred package manager: 100 | 101 | ```bash 102 | npm install 103 | ``` 104 | 105 | ### Configure your environment 106 | 107 | You will also need to create a `.env` file to later store your GitHub access token in. 108 | 109 | > [!NOTE] 110 | > The access token is needed for the app to make API calls to GitHub. 111 | 112 | ```bash 113 | touch .env 114 | ``` 115 | 116 | With the `.env` file created, you can generate an access token [in your settings](https://github.com/settings/tokens) and add that access token to the `REACT_APP_API_KEY` variable. 117 | 118 | ```bash 119 | echo REACT_APP_API_KEY=ghp_my_github_token > .env 120 | ``` 121 | 122 | Your token will start with either `ghp_` or `github_pat_`, depending on if you generated a classic token or a fine-tuned token. Both will work for this application. 123 | 124 | > [!IMPORTANT] 125 | > The GitHub access token doesn't need any scopes to function. 126 | 127 | ### Run the application 128 | 129 | Now that the dependencies are installed and your environment is setup. You can run the application using `npm` or your perferred package manager: 130 | 131 | ```bash 132 | npm start 133 | ``` 134 | 135 | ### Linter Setup 136 | 137 | - Run `npx eslint .` which will print any errors found. 138 | - Run `npx eslint . --fix` to automatically fix the errors. 139 | 140 | ### `npm test` 141 | 142 | Launches the test runner in the interactive watch mode.\ 143 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 144 | 145 | ### `npm run build` 146 | 147 | Builds the app for production to the `build` folder.\ 148 | It correctly bundles React in production mode and optimizes the build for the best performance. 149 | 150 | The build is minified and the filenames include the hashes.\ 151 | Your app is ready to be deployed! 152 | 153 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 154 | 155 | ## Usage 156 | 157 | - Select a label from the first drop down menu 158 | - Select a language from the second drop down menu 159 | - Click `FIND ISSUES` to filter through great issues matching your search query 160 | - Click on a issue from the list of issues below to view your next open source contribution on GitHub 161 | 162 | Make some coffee in the time you saved finding an amazing issue for your next contribution! 163 | 164 | ## Author 1: 165 | 166 | 👤 **OSCAR MIER** 167 | 168 | - GitHub: [@voscarmv](https://github.com/voscarmv) 169 | - YouTube: [Oscar Mier](https://www.youtube.com/channel/UCLedI7TWQMIp5-ovGgMaa5g) 170 | - LinkedIn: [Oscar Mier ](https://www.linkedin.com/in/oscar-mier-072984196/) 171 | 172 | ## Author 2: 173 | 174 | 👤 **SHADMAN ALI** 175 | 176 | - GitHub: [@shadmanhere](https://github.com/shadmanhere) 177 | - Twitter: [@shadmanhere](https://twitter.com/shadmanhere) 178 | - LinkedIn: [Shadman Ali](https://www.linkedin.com/in/shadmanhere/) 179 | 180 | ## Author 3: 181 | 182 | 👤 **STEVE W DAMES JR** 183 | 184 | - GitHub: [@steveWDamesJr](https://github.com/steveWDamesJr) 185 | - Twitter: [@SteveWDamesJr](https://twitter.com/Stevewdamesjr) 186 | - LinkedIn: [Steve W Dames Jr](https://www.linkedin.com/in/steve-w-dames-jr/) 187 | 188 | ## Author 4: 189 | 190 | 👤 **JOSE RAMON** 191 | 192 | - GitHub: [@jr-cast](https://github.com/jr-cast) 193 | - Twitter: [@josercastanos](https://twitter.com/josercastanos) 194 | - LinkedIn: [Jose Ramon Castaños](https://linkedin.com/in/jr-cast) 195 | 196 | ## Author 5: 197 | 198 | 👤 **RICARDO VALTIERRA** 199 | 200 | - GitHub: [@ricardovaltierra](https://github.com/ricardovaltierra) 201 | - Twitter: [@RicardoValtie15s](https://twitter.com/RicardoValtie15) 202 | - LinkedIn: [Ricardo Valtierra](https://www.linkedin.com/in/ricardovaltierra/) 203 | 204 | ## Author 6: 205 | 206 | 👤 **DENIS LAFONTANT** 207 | 208 | - GitHub: [@icebox827](https://github.com/icebox827) 209 | - Twitter: [@heracles2k5](https://twitter.com/heracles2k5) 210 | - LinkedIn: [Denis Lafontant](https://www.linkedin.com/in/denis-lafontant-37031439/) 211 | 212 | ## ✨ Contributors 213 | Thank you for your commitment and tireless efforts. The value you bring to our team is priceless, and we deeply appreciate your contributions. Your admirable dedication and unwavering commitment are truly commendable. Thanks for all that you do to support our team. 214 | 215 | 216 | 217 | 218 | 219 | ## 🤝 Contributing 220 | 221 | Join our [Whatsapp group](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbVphS0JSZ3I0YkkwZDZqVm0wa18tRV9nZE0xd3xBQ3Jtc0tuZXhkZ0hYNEp5c0tlLTZMclVGby1YaHpkZ0FIdHhnNEswNUwxR3Nra0YtTHFncXBGbWFFcUNhSVRlTlNFRVF2TlZoRHlzTnZTcm5tOGVHQm9SM3ZESzJ3dExZUmd5QnFuVWV1aVhFZWNRRm5ZMWdNTQ&q=https%3A%2F%2Fchat.whatsapp.com%2FDaV0lQYApPDJcI2Nz2GlYD&v=Jl4GdOiZ4tk)! 222 | 223 | Contributions, issues, and feature requests are welcome! 224 | 225 | Feel free to check the [issues page](https://github.com/voscarmv/issue-finder/issues). 226 | 227 | ## Show your support 228 | 229 | Give a ⭐️ if you like this project! 230 | 231 | ## Acknowledgments 232 | 233 | - Hat tip to anyone whose code was used. 234 | 235 | ## 📝 License 236 | 237 | This project is [MIT](./MIT.md) licensed. 238 | -------------------------------------------------------------------------------- /src/components/Home.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import { useDispatch, useSelector } from 'react-redux'; 3 | import { getRepos } from '../actions'; 4 | import { SearchEngine } from './SearchEngine'; 5 | import { Select, Option } from '@material-tailwind/react'; 6 | import { Line } from 'rc-progress'; 7 | import Button from 'react-bootstrap/Button'; 8 | import { VscGithub } from 'react-icons/vsc'; 9 | import { 10 | addToSelectedLabels, 11 | epmtySelectedLabel, 12 | epmtyIssuesList, 13 | toggleLabelList, 14 | setLanguage 15 | } from '../actions'; 16 | import GitHubAuth from './GithubAuth'; 17 | 18 | const Home = () => { 19 | const [label, setLabel] = useState('Good First Issue'); 20 | const [lang, setLang] = useState('JavaScript'); 21 | const [darkMode, setDarkMode] = useState(false); 22 | 23 | function changeDarkMode() { 24 | setDarkMode(!darkMode); 25 | } 26 | 27 | const dispatch = useDispatch(); 28 | useEffect( 29 | () => { 30 | dispatch(getRepos()); 31 | }, 32 | // eslint-disable-next-line 33 | [] 34 | ); 35 | const { loading, loadingPercentage, menu } = useSelector((state) => state.labelsStore); 36 | const { issuesList } = useSelector((state) => state.issuesStore); 37 | const access_token = useSelector((state) => state.githubauthStore.data?.access_token); 38 | function findIssues() { 39 | if (label === 'All') { 40 | dispatch(epmtyIssuesList()); 41 | dispatch(epmtySelectedLabel()); 42 | dispatch(toggleLabelList(1)); 43 | } else { 44 | dispatch(toggleLabelList(2)); 45 | dispatch(epmtyIssuesList()); 46 | dispatch(epmtySelectedLabel()); 47 | dispatch(addToSelectedLabels(label)); 48 | } 49 | dispatch(setLanguage(lang)); 50 | } 51 | 52 | return ( 53 |
54 |
61 |
62 | 65 | {darkMode ? 'dark' : 'light'}_mode 66 | 67 |
68 |

73 | Welcome to{' '} 74 |

75 |
80 | 81 | Issue 82 | 88 | 89 | 90 | Finder 91 | 92 |
93 | 98 | Best Open Source issue locator for busy Devs! 99 | 100 | {menu === 2 ? ( 101 | <> 102 | 103 | 110 | {loading ? Loading... : null} 111 | 112 | ) : null} 113 |
114 | 158 | {access_token ? ( 159 | 165 | ) : ( 166 | 167 | )} 168 | 226 |
227 |
228 |
229 | ); 230 | }; 231 | 232 | export default Home; 233 | -------------------------------------------------------------------------------- /src/snippets/06_repos.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "issues": 639, 4 | "url": " https://github.com/chatwoot/chatwoot", 5 | "language": " Ruby" 6 | }, 7 | { 8 | "issues": 344, 9 | "url": " https://github.com/artilleryio/artillery", 10 | "language": " JavaScript" 11 | }, 12 | { 13 | "issues": 156, 14 | "url": " https://github.com/AnomalyInnovations/serverless-bundle", 15 | "language": " JavaScript" 16 | }, 17 | { 18 | "issues": 105, 19 | "url": " https://github.com/vuestorefront/vue-storefront-api", 20 | "language": " JavaScript" 21 | }, 22 | { 23 | "issues": 89, 24 | "url": " https://github.com/vuestorefront/storefront-ui", 25 | "language": " JavaScript" 26 | }, 27 | { 28 | "issues": 76, 29 | "url": " https://github.com/dyte-in/javascript-sample-app", 30 | "language": " JavaScript" 31 | }, 32 | { 33 | "issues": 63, 34 | "url": " https://github.com/filamentgroup/Overthrow", 35 | "language": " JavaScript" 36 | }, 37 | { 38 | "issues": 60, 39 | "url": " https://github.com/chatwoot/chatwoot-mobile-app", 40 | "language": " JavaScript" 41 | }, 42 | { 43 | "issues": 60, 44 | "url": " https://github.com/awslabs/amazon-kinesis-client-nodejs", 45 | "language": " JavaScript" 46 | }, 47 | { 48 | "issues": 56, 49 | "url": " https://github.com/awslabs/aws-lambda-redshift-loader", 50 | "language": " JavaScript" 51 | }, 52 | { 53 | "issues": 47, 54 | "url": " https://github.com/chatwoot/docs", 55 | "language": " JavaScript" 56 | }, 57 | { 58 | "issues": 31, 59 | "url": " https://github.com/supabase/repository.surf", 60 | "language": " JavaScript" 61 | }, 62 | { 63 | "issues": 31, 64 | "url": " https://github.com/AnomalyInnovations/serverless-nodejs-starter", 65 | "language": " JavaScript" 66 | }, 67 | { 68 | "issues": 26, 69 | "url": " https://github.com/AnomalyInnovations/serverless-stack-demo-client", 70 | "language": " JavaScript" 71 | }, 72 | { 73 | "issues": 25, 74 | "url": " https://github.com/pyroscope-io/docs", 75 | "language": " JavaScript" 76 | }, 77 | { 78 | "issues": 24, 79 | "url": " https://github.com/artilleryio/artillery-core", 80 | "language": " JavaScript" 81 | }, 82 | { 83 | "issues": 22, 84 | "url": " https://github.com/AnomalyInnovations/serverless-stack-demo-ext-api", 85 | "language": " JavaScript" 86 | }, 87 | { 88 | "issues": 21, 89 | "url": " https://github.com/vuestorefront/mage2vuestorefront", 90 | "language": " JavaScript" 91 | }, 92 | { 93 | "issues": 20, 94 | "url": " https://github.com/awslabs/amazon-kinesis-client-ruby", 95 | "language": " Ruby" 96 | }, 97 | { 98 | "issues": 19, 99 | "url": " https://github.com/AnomalyInnovations/aws-api-gateway-cli-test", 100 | "language": " JavaScript" 101 | }, 102 | { 103 | "issues": 18, 104 | "url": " https://github.com/filamentgroup/shoestring", 105 | "language": " JavaScript" 106 | }, 107 | { 108 | "issues": 18, 109 | "url": " https://github.com/artilleryio/chaos-lambda", 110 | "language": " JavaScript" 111 | }, 112 | { 113 | "issues": 17, 114 | "url": " https://github.com/argoproj/argo-site", 115 | "language": " JavaScript" 116 | }, 117 | { 118 | "issues": 17, 119 | "url": " https://github.com/arengu/documentation", 120 | "language": " JavaScript" 121 | }, 122 | { 123 | "issues": 16, 124 | "url": " https://github.com/arengu/modal-forms-js", 125 | "language": " JavaScript" 126 | }, 127 | { 128 | "issues": 16, 129 | "url": " https://github.com/AnomalyInnovations/serverless-stack-demo-api", 130 | "language": " JavaScript" 131 | }, 132 | { 133 | "issues": 15, 134 | "url": " https://github.com/vuestorefront/magento2-rest-client", 135 | "language": " JavaScript" 136 | }, 137 | { 138 | "issues": 14, 139 | "url": " https://github.com/AnomalyInnovations/serverless-stack-demo-user-mgmt-client", 140 | "language": " JavaScript" 141 | }, 142 | { 143 | "issues": 13, 144 | "url": " https://github.com/supabase/realtime-js", 145 | "language": " JavaScript" 146 | }, 147 | { 148 | "issues": 13, 149 | "url": " https://github.com/mindee/mindee-api-nodejs", 150 | "language": " JavaScript" 151 | }, 152 | { 153 | "issues": 13, 154 | "url": " https://github.com/getlago/lago-api", 155 | "language": " Ruby" 156 | }, 157 | { 158 | "issues": 13, 159 | "url": " https://github.com/filamentgroup/Responsive-Images", 160 | "language": " JavaScript" 161 | }, 162 | { 163 | "issues": 12, 164 | "url": " https://github.com/AnomalyInnovations/serverless-stack-demo-ext-resources", 165 | "language": " JavaScript" 166 | }, 167 | { 168 | "issues": 11, 169 | "url": " https://github.com/filamentgroup/jQuery-Visualize", 170 | "language": " JavaScript" 171 | }, 172 | { 173 | "issues": 11, 174 | "url": " https://github.com/AnomalyInnovations/serverless-lerna-yarn-starter", 175 | "language": " JavaScript" 176 | }, 177 | { 178 | "issues": 10, 179 | "url": " https://github.com/filamentgroup/jQuery-Custom-File-Input", 180 | "language": " JavaScript" 181 | }, 182 | { 183 | "issues": 9, 184 | "url": " https://github.com/pabio/tracker", 185 | "language": " JavaScript" 186 | }, 187 | { 188 | "issues": 9, 189 | "url": " https://github.com/filamentgroup/jqm-pagination", 190 | "language": " JavaScript" 191 | }, 192 | { 193 | "issues": 9, 194 | "url": " https://github.com/filamentgroup/enhance", 195 | "language": " JavaScript" 196 | }, 197 | { 198 | "issues": 9, 199 | "url": " https://github.com/filamentgroup/Ajax-Include-Pattern", 200 | "language": " JavaScript" 201 | }, 202 | { 203 | "issues": 9, 204 | "url": " https://github.com/chatwoot/chatwoot-hooks", 205 | "language": " Ruby" 206 | }, 207 | { 208 | "issues": 8, 209 | "url": " https://github.com/tuva-health/knowledge_base", 210 | "language": " JavaScript" 211 | }, 212 | { 213 | "issues": 7, 214 | "url": " https://github.com/flatpickr/flatpickr.github.io", 215 | "language": " JavaScript" 216 | }, 217 | { 218 | "issues": 7, 219 | "url": " https://github.com/chatwoot/chatwoot-react-native-widget", 220 | "language": " JavaScript" 221 | }, 222 | { 223 | "issues": 7, 224 | "url": " https://github.com/awslabs/aws-fluent-plugin-kinesis", 225 | "language": " Ruby" 226 | }, 227 | { 228 | "issues": 7, 229 | "url": " https://github.com/artilleryio/artillery-plugin-statsd", 230 | "language": " JavaScript" 231 | }, 232 | { 233 | "issues": 6, 234 | "url": " https://github.com/pyroscope-io/pyroscope-ruby", 235 | "language": " Ruby" 236 | }, 237 | { 238 | "issues": 6, 239 | "url": " https://github.com/firezone/website", 240 | "language": " JavaScript" 241 | }, 242 | { 243 | "issues": 6, 244 | "url": " https://github.com/filamentgroup/EnhanceJS", 245 | "language": " JavaScript" 246 | }, 247 | { 248 | "issues": 5, 249 | "url": " https://github.com/filamentgroup/jQuery-File-Download", 250 | "language": " JavaScript" 251 | }, 252 | { 253 | "issues": 5, 254 | "url": " https://github.com/athensresearch/docs", 255 | "language": " JavaScript" 256 | }, 257 | { 258 | "issues": 5, 259 | "url": " https://github.com/artilleryio/artillery-plugin-publish-metrics", 260 | "language": " JavaScript" 261 | }, 262 | { 263 | "issues": 5, 264 | "url": " https://github.com/artilleryio/arrivals", 265 | "language": " JavaScript" 266 | }, 267 | { 268 | "issues": 4, 269 | "url": " https://github.com/vuestorefront/redis-driver", 270 | "language": " JavaScript" 271 | }, 272 | { 273 | "issues": 4, 274 | "url": " https://github.com/mindee/demo-plates-DVLA", 275 | "language": " JavaScript" 276 | }, 277 | { 278 | "issues": 4, 279 | "url": " https://github.com/filamentgroup/Southstreet", 280 | "language": " JavaScript" 281 | }, 282 | { 283 | "issues": 4, 284 | "url": " https://github.com/filamentgroup/jQuery-Preload-CSS-Images", 285 | "language": " JavaScript" 286 | }, 287 | { 288 | "issues": 4, 289 | "url": " https://github.com/artilleryio/artillery-plugin-fuzzer", 290 | "language": " JavaScript" 291 | }, 292 | { 293 | "issues": 3, 294 | "url": " https://github.com/filamentgroup/jQuery-Collapsible-Content", 295 | "language": " JavaScript" 296 | }, 297 | { 298 | "issues": 3, 299 | "url": " https://github.com/artilleryio/artillery-plugin-hls", 300 | "language": " JavaScript" 301 | }, 302 | { 303 | "issues": 3, 304 | "url": " https://github.com/artilleryio/artillery-engine-kinesis", 305 | "language": " JavaScript" 306 | }, 307 | { 308 | "issues": 2, 309 | "url": " https://github.com/serverless-stack/examples", 310 | "language": " JavaScript" 311 | }, 312 | { 313 | "issues": 2, 314 | "url": " https://github.com/infracost/actions", 315 | "language": " JavaScript" 316 | }, 317 | { 318 | "issues": 2, 319 | "url": " https://github.com/chatwoot/dialogflow-agent-bot-demo", 320 | "language": " Ruby" 321 | }, 322 | { 323 | "issues": 2, 324 | "url": " https://github.com/artilleryio/artillery-plugin-metrics-by-endpoint", 325 | "language": " JavaScript" 326 | }, 327 | { 328 | "issues": 2, 329 | "url": " https://github.com/artilleryio/artillery-plugin-expect", 330 | "language": " JavaScript" 331 | }, 332 | { 333 | "issues": 2, 334 | "url": " https://github.com/AnomalyInnovations/serverless-stack-demo-fb-login-client", 335 | "language": " JavaScript" 336 | }, 337 | { 338 | "issues": 1, 339 | "url": " https://github.com/windmill-labs/windmilldocs", 340 | "language": " JavaScript" 341 | }, 342 | { 343 | "issues": 1, 344 | "url": " https://github.com/wasp-lang/wasp-bot", 345 | "language": " JavaScript" 346 | }, 347 | { 348 | "issues": 1, 349 | "url": " https://github.com/vuestorefront/docs.vuestorefront.io-v2", 350 | "language": " JavaScript" 351 | }, 352 | { 353 | "issues": 1, 354 | "url": " https://github.com/svix/svix-docs", 355 | "language": " JavaScript" 356 | }, 357 | { 358 | "issues": 1, 359 | "url": " https://github.com/serverless-stack/lerna-yarn-starter", 360 | "language": " JavaScript" 361 | }, 362 | { 363 | "issues": 1, 364 | "url": " https://github.com/pyroscope-io/homebrew-brew", 365 | "language": " Ruby" 366 | }, 367 | { 368 | "issues": 1, 369 | "url": " https://github.com/pyroscope-io/grafana-panel-plugin", 370 | "language": " JavaScript" 371 | }, 372 | { 373 | "issues": 1, 374 | "url": " https://github.com/pyroscope-io/grafana-datasource-plugin", 375 | "language": " JavaScript" 376 | }, 377 | { 378 | "issues": 1, 379 | "url": " https://github.com/mindee/demo-Nodejs-SDK", 380 | "language": " JavaScript" 381 | }, 382 | { 383 | "issues": 1, 384 | "url": " https://github.com/mayahq/mayadev", 385 | "language": " JavaScript" 386 | }, 387 | { 388 | "issues": 1, 389 | "url": " https://github.com/JovianML/react-top-loader", 390 | "language": " JavaScript" 391 | }, 392 | { 393 | "issues": 1, 394 | "url": " https://github.com/infracost/docs", 395 | "language": " JavaScript" 396 | }, 397 | { 398 | "issues": 1, 399 | "url": " https://github.com/growthbook/growthbook-ruby", 400 | "language": " Ruby" 401 | }, 402 | { 403 | "issues": 1, 404 | "url": " https://github.com/filamentgroup/RWD-Table-Patterns", 405 | "language": " JavaScript" 406 | }, 407 | { 408 | "issues": 1, 409 | "url": " https://github.com/filamentgroup/jQuery-UI-Date-Range-Picker", 410 | "language": " JavaScript" 411 | }, 412 | { 413 | "issues": 1, 414 | "url": " https://github.com/filamentgroup/jQuery-Tree-Control", 415 | "language": " JavaScript" 416 | }, 417 | { 418 | "issues": 1, 419 | "url": " https://github.com/filamentgroup/Details", 420 | "language": " JavaScript" 421 | }, 422 | { 423 | "issues": 1, 424 | "url": " https://github.com/enso-org/luna-logo", 425 | "language": " JavaScript" 426 | }, 427 | { 428 | "issues": 1, 429 | "url": " https://github.com/chatwoot/prosemirror-schema", 430 | "language": " JavaScript" 431 | }, 432 | { 433 | "issues": 1, 434 | "url": " https://github.com/chatwoot/node", 435 | "language": " JavaScript" 436 | }, 437 | { 438 | "issues": 1, 439 | "url": " https://github.com/awslabs/aws-codepipeline-jenkins-aws-codedeploy_linux", 440 | "language": " Ruby" 441 | }, 442 | { 443 | "issues": 1, 444 | "url": " https://github.com/authzed/authzed-rb", 445 | "language": " Ruby" 446 | }, 447 | { 448 | "issues": 1, 449 | "url": " https://github.com/artilleryio/artillery-plugin-profiler", 450 | "language": " JavaScript" 451 | }, 452 | { 453 | "issues": 1, 454 | "url": " https://github.com/arengu/resources", 455 | "language": " JavaScript" 456 | }, 457 | { 458 | "issues": 1, 459 | "url": " https://github.com/arengu/react-arengu-forms", 460 | "language": " JavaScript" 461 | }, 462 | { 463 | "issues": 1, 464 | "url": " https://github.com/AnomalyInnovations/toolbeam-cli", 465 | "language": " JavaScript" 466 | }, 467 | { 468 | "issues": 1, 469 | "url": " https://github.com/AnomalyInnovations/serverless-stack-demo-mono-api", 470 | "language": " JavaScript" 471 | }, 472 | { 473 | "issues": 0, 474 | "url": " https://github.com/yatima-inc/substrate-front-end-template", 475 | "language": " JavaScript" 476 | }, 477 | { 478 | "issues": 0, 479 | "url": " https://github.com/wasp-lang/web", 480 | "language": " JavaScript" 481 | }, 482 | { 483 | "issues": 0, 484 | "url": " https://github.com/wasp-lang/prisma-day-2021", 485 | "language": " JavaScript" 486 | }, 487 | { 488 | "issues": 0, 489 | "url": " https://github.com/warrant-dev/warrant-ruby", 490 | "language": " Ruby" 491 | }, 492 | { 493 | "issues": 0, 494 | "url": " https://github.com/warrant-dev/warrant-demo-app-ts", 495 | "language": " JavaScript" 496 | }, 497 | { 498 | "issues": 0, 499 | "url": " https://github.com/svix/svix-fetch", 500 | "language": " JavaScript" 501 | }, 502 | { 503 | "issues": 0, 504 | "url": " https://github.com/svix/homebrew-svix", 505 | "language": " Ruby" 506 | }, 507 | { 508 | "issues": 0, 509 | "url": " https://github.com/supabase/sql-formatter", 510 | "language": " JavaScript" 511 | }, 512 | { 513 | "issues": 0, 514 | "url": " https://github.com/sturdyfi/yield-server", 515 | "language": " JavaScript" 516 | }, 517 | { 518 | "issues": 0, 519 | "url": " https://github.com/sturdyfi/DefiLlama-Adapters", 520 | "language": " JavaScript" 521 | }, 522 | { 523 | "issues": 0, 524 | "url": " https://github.com/sturdy-dev/homebrew-tap", 525 | "language": " Ruby" 526 | }, 527 | { 528 | "issues": 0, 529 | "url": " https://github.com/serverless-stack/sst-start-demo", 530 | "language": " JavaScript" 531 | }, 532 | { 533 | "issues": 0, 534 | "url": " https://github.com/serverless-stack/social-cards", 535 | "language": " JavaScript" 536 | }, 537 | { 538 | "issues": 0, 539 | "url": " https://github.com/serverless-stack/slack-support", 540 | "language": " JavaScript" 541 | }, 542 | { 543 | "issues": 0, 544 | "url": " https://github.com/serverless-stack/serverless-stack-resources-sample", 545 | "language": " JavaScript" 546 | }, 547 | { 548 | "issues": 0, 549 | "url": " https://github.com/serverless-stack/demo-notes-app", 550 | "language": " JavaScript" 551 | }, 552 | { 553 | "issues": 0, 554 | "url": " https://github.com/pyroscope-io/hotrod-ruby", 555 | "language": " Ruby" 556 | }, 557 | { 558 | "issues": 0, 559 | "url": " https://github.com/pyroscope-io/heroku-buildpack-ruby", 560 | "language": " Ruby" 561 | }, 562 | { 563 | "issues": 0, 564 | "url": " https://github.com/pyroscope-io/grafana-plugin-repository", 565 | "language": " JavaScript" 566 | }, 567 | { 568 | "issues": 0, 569 | "url": " https://github.com/pyroscope-io/flame-graph", 570 | "language": " JavaScript" 571 | }, 572 | { 573 | "issues": 0, 574 | "url": " https://github.com/Pluralith/pluralith-homebrew-tap", 575 | "language": " Ruby" 576 | }, 577 | { 578 | "issues": 0, 579 | "url": " https://github.com/payloadcms/blog-rbac", 580 | "language": " JavaScript" 581 | }, 582 | { 583 | "issues": 0, 584 | "url": " https://github.com/pabio/strapi", 585 | "language": " JavaScript" 586 | }, 587 | { 588 | "issues": 0, 589 | "url": " https://github.com/pabio/repo-health-bot", 590 | "language": " JavaScript" 591 | }, 592 | { 593 | "issues": 0, 594 | "url": " https://github.com/pabio/hot-cakes", 595 | "language": " JavaScript" 596 | }, 597 | { 598 | "issues": 0, 599 | "url": " https://github.com/pabio/cdn", 600 | "language": " JavaScript" 601 | }, 602 | { 603 | "issues": 0, 604 | "url": " https://github.com/pabio/careers", 605 | "language": " JavaScript" 606 | }, 607 | { 608 | "issues": 0, 609 | "url": " https://github.com/pabio/api-legacy", 610 | "language": " JavaScript" 611 | }, 612 | { 613 | "issues": 0, 614 | "url": " https://github.com/nullstone-io/rails6-webapp-quickstart", 615 | "language": " Ruby" 616 | }, 617 | { 618 | "issues": 0, 619 | "url": " https://github.com/nullstone-io/rails6-api-quickstart", 620 | "language": " Ruby" 621 | }, 622 | { 623 | "issues": 0, 624 | "url": " https://github.com/nullstone-io/node-express-quickstart", 625 | "language": " JavaScript" 626 | }, 627 | { 628 | "issues": 0, 629 | "url": " https://github.com/nullstone-io/jokes-api", 630 | "language": " Ruby" 631 | }, 632 | { 633 | "issues": 0, 634 | "url": " https://github.com/mindee/mindee-api-ruby", 635 | "language": " Ruby" 636 | }, 637 | { 638 | "issues": 0, 639 | "url": " https://github.com/mindee/integration-zapier", 640 | "language": " JavaScript" 641 | }, 642 | { 643 | "issues": 0, 644 | "url": " https://github.com/mayahq/node-red", 645 | "language": " JavaScript" 646 | }, 647 | { 648 | "issues": 0, 649 | "url": " https://github.com/mayahq/nodejs-text-summarizer", 650 | "language": " JavaScript" 651 | }, 652 | { 653 | "issues": 0, 654 | "url": " https://github.com/mayahq/maya-red-whatsapp-bot", 655 | "language": " JavaScript" 656 | }, 657 | { 658 | "issues": 0, 659 | "url": " https://github.com/mayahq/maya-red-twitter", 660 | "language": " JavaScript" 661 | }, 662 | { 663 | "issues": 0, 664 | "url": " https://github.com/mayahq/maya-red-gmail", 665 | "language": " JavaScript" 666 | }, 667 | { 668 | "issues": 0, 669 | "url": " https://github.com/mayahq/electron-log-loggly", 670 | "language": " JavaScript" 671 | }, 672 | { 673 | "issues": 0, 674 | "url": " https://github.com/mayahq/action-electron-builder", 675 | "language": " JavaScript" 676 | }, 677 | { 678 | "issues": 0, 679 | "url": " https://github.com/lunatic-solutions/homebrew-lunatic", 680 | "language": " Ruby" 681 | }, 682 | { 683 | "issues": 0, 684 | "url": " https://github.com/JovianML/styled-themer", 685 | "language": " JavaScript" 686 | }, 687 | { 688 | "issues": 0, 689 | "url": " https://github.com/infrahq/homebrew-tap", 690 | "language": " Ruby" 691 | }, 692 | { 693 | "issues": 0, 694 | "url": " https://github.com/infracost/docusaurus-plugin-plausible", 695 | "language": " JavaScript" 696 | }, 697 | { 698 | "issues": 0, 699 | "url": " https://github.com/getlago/lago-ruby-client", 700 | "language": " Ruby" 701 | }, 702 | { 703 | "issues": 0, 704 | "url": " https://github.com/getlago/lago-nodejs-client", 705 | "language": " JavaScript" 706 | }, 707 | { 708 | "issues": 0, 709 | "url": " https://github.com/getlago/lago-docs", 710 | "language": " JavaScript" 711 | }, 712 | { 713 | "issues": 0, 714 | "url": " https://github.com/frain-dev/indexer", 715 | "language": " JavaScript" 716 | }, 717 | { 718 | "issues": 0, 719 | "url": " https://github.com/frain-dev/homebrew-tools", 720 | "language": " Ruby" 721 | }, 722 | { 723 | "issues": 0, 724 | "url": " https://github.com/frain-dev/convoy.rb", 725 | "language": " Ruby" 726 | }, 727 | { 728 | "issues": 0, 729 | "url": " https://github.com/firezone/posthog-ruby", 730 | "language": " Ruby" 731 | }, 732 | { 733 | "issues": 0, 734 | "url": " https://github.com/filamentgroup/jQuery-Slider", 735 | "language": " JavaScript" 736 | }, 737 | { 738 | "issues": 0, 739 | "url": " https://github.com/filamentgroup/jQuery-Equal-Heights", 740 | "language": " JavaScript" 741 | }, 742 | { 743 | "issues": 0, 744 | "url": " https://github.com/FifthTry/play", 745 | "language": " JavaScript" 746 | }, 747 | { 748 | "issues": 0, 749 | "url": " https://github.com/enso-org/basegl-template", 750 | "language": " JavaScript" 751 | }, 752 | { 753 | "issues": 0, 754 | "url": " https://github.com/dyte-in/vanilla-js-ui-kit-sample-app", 755 | "language": " JavaScript" 756 | }, 757 | { 758 | "issues": 0, 759 | "url": " https://github.com/dyte-in/upload-to-vimeo-lambda", 760 | "language": " JavaScript" 761 | }, 762 | { 763 | "issues": 0, 764 | "url": " https://github.com/dyte-in/pr-lint-body", 765 | "language": " JavaScript" 766 | }, 767 | { 768 | "issues": 0, 769 | "url": " https://github.com/dyte-in/pr-lint-action", 770 | "language": " JavaScript" 771 | }, 772 | { 773 | "issues": 0, 774 | "url": " https://github.com/dyte-in/docs", 775 | "language": " JavaScript" 776 | }, 777 | { 778 | "issues": 0, 779 | "url": " https://github.com/drifting-in-space/node-hello-world", 780 | "language": " JavaScript" 781 | }, 782 | { 783 | "issues": 0, 784 | "url": " https://github.com/drifting-in-space/duckdb-demo", 785 | "language": " JavaScript" 786 | }, 787 | { 788 | "issues": 0, 789 | "url": " https://github.com/drifting-in-space/demo-image-hello-world", 790 | "language": " JavaScript" 791 | }, 792 | { 793 | "issues": 0, 794 | "url": " https://github.com/drifting-in-space/aper.dev", 795 | "language": " JavaScript" 796 | }, 797 | { 798 | "issues": 0, 799 | "url": " https://github.com/chatwoot/vue-emoji-picker", 800 | "language": " JavaScript" 801 | }, 802 | { 803 | "issues": 0, 804 | "url": " https://github.com/chatwoot/twitty", 805 | "language": " Ruby" 806 | }, 807 | { 808 | "issues": 0, 809 | "url": " https://github.com/chatwoot/one-click-apps", 810 | "language": " JavaScript" 811 | }, 812 | { 813 | "issues": 0, 814 | "url": " https://github.com/chatwoot/gatsby-plugin-chatwoot", 815 | "language": " JavaScript" 816 | }, 817 | { 818 | "issues": 0, 819 | "url": " https://github.com/chatwoot/docusaurus", 820 | "language": " JavaScript" 821 | }, 822 | { 823 | "issues": 0, 824 | "url": " https://github.com/chatwoot/client-api-demo", 825 | "language": " JavaScript" 826 | }, 827 | { 828 | "issues": 0, 829 | "url": " https://github.com/chatbiz-id/wilayah-indonesia", 830 | "language": " JavaScript" 831 | }, 832 | { 833 | "issues": 0, 834 | "url": " https://github.com/chatbiz-id/serverless-aws-dynamodb-boilerplate", 835 | "language": " JavaScript" 836 | }, 837 | { 838 | "issues": 0, 839 | "url": " https://github.com/awslabs/AWSCodePipeline-Jenkins-AWSCodeDeploy_Windows", 840 | "language": " Ruby" 841 | }, 842 | { 843 | "issues": 0, 844 | "url": " https://github.com/authzed/react-redux-realworld-example-app", 845 | "language": " JavaScript" 846 | }, 847 | { 848 | "issues": 0, 849 | "url": " https://github.com/authzed/homebrew-tap", 850 | "language": " Ruby" 851 | }, 852 | { 853 | "issues": 0, 854 | "url": " https://github.com/artilleryio/request", 855 | "language": " JavaScript" 856 | }, 857 | { 858 | "issues": 0, 859 | "url": " https://github.com/artilleryio/repl", 860 | "language": " JavaScript" 861 | }, 862 | { 863 | "issues": 0, 864 | "url": " https://github.com/artilleryio/artillery-xml-capture", 865 | "language": " JavaScript" 866 | }, 867 | { 868 | "issues": 0, 869 | "url": " https://github.com/artilleryio/artillery-plugin-teamcity", 870 | "language": " JavaScript" 871 | }, 872 | { 873 | "issues": 0, 874 | "url": " https://github.com/artilleryio/artillery-plugin-influxdb", 875 | "language": " JavaScript" 876 | }, 877 | { 878 | "issues": 0, 879 | "url": " https://github.com/artilleryio/artillery-plugin-ensure", 880 | "language": " JavaScript" 881 | }, 882 | { 883 | "issues": 0, 884 | "url": " https://github.com/artilleryio/artillery-plugin-cloudwatch", 885 | "language": " JavaScript" 886 | }, 887 | { 888 | "issues": 0, 889 | "url": " https://github.com/artilleryio/artillery-plugin-blessed", 890 | "language": " JavaScript" 891 | }, 892 | { 893 | "issues": 0, 894 | "url": " https://github.com/artilleryio/artillery-plugin-aws-sigv4", 895 | "language": " JavaScript" 896 | }, 897 | { 898 | "issues": 0, 899 | "url": " https://github.com/artilleryio/artillery-examples", 900 | "language": " JavaScript" 901 | }, 902 | { 903 | "issues": 0, 904 | "url": " https://github.com/artilleryio/acme-corp-api-tests", 905 | "language": " JavaScript" 906 | }, 907 | { 908 | "issues": 0, 909 | "url": " https://github.com/arengu/gatsby-plugin-arengu-forms", 910 | "language": " JavaScript" 911 | }, 912 | { 913 | "issues": 0, 914 | "url": " https://github.com/AnomalyInnovations/toolbeam-example-api", 915 | "language": " JavaScript" 916 | }, 917 | { 918 | "issues": 0, 919 | "url": " https://github.com/AnomalyInnovations/sigV4Client", 920 | "language": " JavaScript" 921 | }, 922 | { 923 | "issues": 0, 924 | "url": " https://github.com/AnomalyInnovations/serverless-cd-demo-a1c8", 925 | "language": " JavaScript" 926 | } 927 | ] 928 | -------------------------------------------------------------------------------- /public/output.css: -------------------------------------------------------------------------------- 1 | /* 2 | ! tailwindcss v3.1.8 | MIT License | https://tailwindcss.com 3 | */ 4 | 5 | /* 6 | 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 7 | 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) 8 | */ 9 | 10 | *, 11 | ::before, 12 | ::after { 13 | box-sizing: border-box; 14 | /* 1 */ 15 | border-width: 0; 16 | /* 2 */ 17 | border-style: solid; 18 | /* 2 */ 19 | border-color: #e5e7eb; 20 | /* 2 */ 21 | } 22 | 23 | ::before, 24 | ::after { 25 | --tw-content: ''; 26 | } 27 | 28 | /* 29 | 1. Use a consistent sensible line-height in all browsers. 30 | 2. Prevent adjustments of font size after orientation changes in iOS. 31 | 3. Use a more readable tab size. 32 | 4. Use the user's configured `sans` font-family by default. 33 | */ 34 | 35 | html { 36 | line-height: 1.5; 37 | /* 1 */ 38 | -webkit-text-size-adjust: 100%; 39 | /* 2 */ 40 | /* 3 */ 41 | tab-size: 4; 42 | /* 3 */ 43 | font-family: Inter, sans-serif; 44 | /* 4 */ 45 | } 46 | 47 | /* 48 | 1. Remove the margin in all browsers. 49 | 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. 50 | */ 51 | 52 | body { 53 | margin: 0; 54 | /* 1 */ 55 | line-height: inherit; 56 | /* 2 */ 57 | } 58 | 59 | /* 60 | 1. Add the correct height in Firefox. 61 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 62 | 3. Ensure horizontal rules are visible by default. 63 | */ 64 | 65 | hr { 66 | height: 0; 67 | /* 1 */ 68 | color: inherit; 69 | /* 2 */ 70 | border-top-width: 1px; 71 | /* 3 */ 72 | } 73 | 74 | /* 75 | Add the correct text decoration in Chrome, Edge, and Safari. 76 | */ 77 | 78 | abbr:where([title]) { 79 | -webkit-text-decoration: underline dotted; 80 | text-decoration: underline dotted; 81 | } 82 | 83 | /* 84 | Remove the default font size and weight for headings. 85 | */ 86 | 87 | h1, 88 | h2, 89 | h3, 90 | h4, 91 | h5, 92 | h6 { 93 | font-size: inherit; 94 | font-weight: inherit; 95 | } 96 | 97 | /* 98 | Reset links to optimize for opt-in styling instead of opt-out. 99 | */ 100 | 101 | a { 102 | color: inherit; 103 | text-decoration: inherit; 104 | } 105 | 106 | /* 107 | Add the correct font weight in Edge and Safari. 108 | */ 109 | 110 | b, 111 | strong { 112 | font-weight: bolder; 113 | } 114 | 115 | /* 116 | 1. Use the user's configured `mono` font family by default. 117 | 2. Correct the odd `em` font sizing in all browsers. 118 | */ 119 | 120 | code, 121 | kbd, 122 | samp, 123 | pre { 124 | font-family: ui-monospace, monospace; 125 | /* 1 */ 126 | font-size: 1em; 127 | /* 2 */ 128 | } 129 | 130 | /* 131 | Add the correct font size in all browsers. 132 | */ 133 | 134 | small { 135 | font-size: 80%; 136 | } 137 | 138 | /* 139 | Prevent `sub` and `sup` elements from affecting the line height in all browsers. 140 | */ 141 | 142 | sub, 143 | sup { 144 | font-size: 75%; 145 | line-height: 0; 146 | position: relative; 147 | vertical-align: baseline; 148 | } 149 | 150 | sub { 151 | bottom: -0.25em; 152 | } 153 | 154 | sup { 155 | top: -0.5em; 156 | } 157 | 158 | /* 159 | 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 160 | 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 161 | 3. Remove gaps between table borders by default. 162 | */ 163 | 164 | table { 165 | text-indent: 0; 166 | /* 1 */ 167 | border-color: inherit; 168 | /* 2 */ 169 | border-collapse: collapse; 170 | /* 3 */ 171 | } 172 | 173 | /* 174 | 1. Change the font styles in all browsers. 175 | 2. Remove the margin in Firefox and Safari. 176 | 3. Remove default padding in all browsers. 177 | */ 178 | 179 | button, 180 | input, 181 | optgroup, 182 | select, 183 | textarea { 184 | font-family: inherit; 185 | /* 1 */ 186 | font-size: 100%; 187 | /* 1 */ 188 | font-weight: inherit; 189 | /* 1 */ 190 | line-height: inherit; 191 | /* 1 */ 192 | color: inherit; 193 | /* 1 */ 194 | margin: 0; 195 | /* 2 */ 196 | padding: 0; 197 | /* 3 */ 198 | } 199 | 200 | /* 201 | Remove the inheritance of text transform in Edge and Firefox. 202 | */ 203 | 204 | button, 205 | select { 206 | text-transform: none; 207 | } 208 | 209 | /* 210 | 1. Correct the inability to style clickable types in iOS and Safari. 211 | 2. Remove default button styles. 212 | */ 213 | 214 | button, 215 | [type='button'], 216 | [type='reset'], 217 | [type='submit'] { 218 | -webkit-appearance: button; 219 | /* 1 */ 220 | background-color: transparent; 221 | /* 2 */ 222 | background-image: none; 223 | /* 2 */ 224 | } 225 | 226 | /* 227 | Use the modern Firefox focus style for all focusable elements. 228 | */ 229 | 230 | :-moz-focusring { 231 | outline: auto; 232 | } 233 | 234 | /* 235 | Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) 236 | */ 237 | 238 | :-moz-ui-invalid { 239 | box-shadow: none; 240 | } 241 | 242 | /* 243 | Add the correct vertical alignment in Chrome and Firefox. 244 | */ 245 | 246 | progress { 247 | vertical-align: baseline; 248 | } 249 | 250 | /* 251 | Correct the cursor style of increment and decrement buttons in Safari. 252 | */ 253 | 254 | ::-webkit-inner-spin-button, 255 | ::-webkit-outer-spin-button { 256 | height: auto; 257 | } 258 | 259 | /* 260 | 1. Correct the odd appearance in Chrome and Safari. 261 | 2. Correct the outline style in Safari. 262 | */ 263 | 264 | [type='search'] { 265 | -webkit-appearance: textfield; 266 | /* 1 */ 267 | outline-offset: -2px; 268 | /* 2 */ 269 | } 270 | 271 | /* 272 | Remove the inner padding in Chrome and Safari on macOS. 273 | */ 274 | 275 | ::-webkit-search-decoration { 276 | -webkit-appearance: none; 277 | } 278 | 279 | /* 280 | 1. Correct the inability to style clickable types in iOS and Safari. 281 | 2. Change font properties to `inherit` in Safari. 282 | */ 283 | 284 | ::-webkit-file-upload-button { 285 | -webkit-appearance: button; 286 | /* 1 */ 287 | font: inherit; 288 | /* 2 */ 289 | } 290 | 291 | /* 292 | Add the correct display in Chrome and Safari. 293 | */ 294 | 295 | summary { 296 | display: list-item; 297 | } 298 | 299 | /* 300 | Removes the default spacing and border for appropriate elements. 301 | */ 302 | 303 | blockquote, 304 | dl, 305 | dd, 306 | h1, 307 | h2, 308 | h3, 309 | h4, 310 | h5, 311 | h6, 312 | hr, 313 | figure, 314 | p, 315 | pre { 316 | margin: 0; 317 | } 318 | 319 | fieldset { 320 | margin: 0; 321 | padding: 0; 322 | } 323 | 324 | legend { 325 | padding: 0; 326 | } 327 | 328 | ol, 329 | ul, 330 | menu { 331 | list-style: none; 332 | margin: 0; 333 | padding: 0; 334 | } 335 | 336 | /* 337 | Prevent resizing textareas horizontally by default. 338 | */ 339 | 340 | textarea { 341 | resize: vertical; 342 | } 343 | 344 | /* 345 | 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 346 | 2. Set the default placeholder color to the user's configured gray 400 color. 347 | */ 348 | 349 | input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { 350 | opacity: 1; 351 | /* 1 */ 352 | color: #9ca3af; 353 | /* 2 */ 354 | } 355 | 356 | input::placeholder, 357 | textarea::placeholder { 358 | opacity: 1; 359 | /* 1 */ 360 | color: #9ca3af; 361 | /* 2 */ 362 | } 363 | 364 | /* 365 | Set the default cursor for buttons. 366 | */ 367 | 368 | button, 369 | [role="button"] { 370 | cursor: pointer; 371 | } 372 | 373 | /* 374 | Make sure disabled buttons don't get the pointer cursor. 375 | */ 376 | 377 | :disabled { 378 | cursor: default; 379 | } 380 | 381 | /* 382 | 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 383 | 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) 384 | This can trigger a poorly considered lint error in some tools but is included by design. 385 | */ 386 | 387 | img, 388 | svg, 389 | video, 390 | canvas, 391 | audio, 392 | iframe, 393 | embed, 394 | object { 395 | display: block; 396 | /* 1 */ 397 | vertical-align: middle; 398 | /* 2 */ 399 | } 400 | 401 | /* 402 | Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) 403 | */ 404 | 405 | img, 406 | video { 407 | max-width: 100%; 408 | height: auto; 409 | } 410 | 411 | *, ::before, ::after { 412 | --tw-border-spacing-x: 0; 413 | --tw-border-spacing-y: 0; 414 | --tw-translate-x: 0; 415 | --tw-translate-y: 0; 416 | --tw-rotate: 0; 417 | --tw-skew-x: 0; 418 | --tw-skew-y: 0; 419 | --tw-scale-x: 1; 420 | --tw-scale-y: 1; 421 | --tw-pan-x: ; 422 | --tw-pan-y: ; 423 | --tw-pinch-zoom: ; 424 | --tw-scroll-snap-strictness: proximity; 425 | --tw-ordinal: ; 426 | --tw-slashed-zero: ; 427 | --tw-numeric-figure: ; 428 | --tw-numeric-spacing: ; 429 | --tw-numeric-fraction: ; 430 | --tw-ring-inset: ; 431 | --tw-ring-offset-width: 0px; 432 | --tw-ring-offset-color: #fff; 433 | --tw-ring-color: rgb(59 130 246 / 0.5); 434 | --tw-ring-offset-shadow: 0 0 #0000; 435 | --tw-ring-shadow: 0 0 #0000; 436 | --tw-shadow: 0 0 #0000; 437 | --tw-shadow-colored: 0 0 #0000; 438 | --tw-blur: ; 439 | --tw-brightness: ; 440 | --tw-contrast: ; 441 | --tw-grayscale: ; 442 | --tw-hue-rotate: ; 443 | --tw-invert: ; 444 | --tw-saturate: ; 445 | --tw-sepia: ; 446 | --tw-drop-shadow: ; 447 | --tw-backdrop-blur: ; 448 | --tw-backdrop-brightness: ; 449 | --tw-backdrop-contrast: ; 450 | --tw-backdrop-grayscale: ; 451 | --tw-backdrop-hue-rotate: ; 452 | --tw-backdrop-invert: ; 453 | --tw-backdrop-opacity: ; 454 | --tw-backdrop-saturate: ; 455 | --tw-backdrop-sepia: ; 456 | } 457 | 458 | ::-webkit-backdrop { 459 | --tw-border-spacing-x: 0; 460 | --tw-border-spacing-y: 0; 461 | --tw-translate-x: 0; 462 | --tw-translate-y: 0; 463 | --tw-rotate: 0; 464 | --tw-skew-x: 0; 465 | --tw-skew-y: 0; 466 | --tw-scale-x: 1; 467 | --tw-scale-y: 1; 468 | --tw-pan-x: ; 469 | --tw-pan-y: ; 470 | --tw-pinch-zoom: ; 471 | --tw-scroll-snap-strictness: proximity; 472 | --tw-ordinal: ; 473 | --tw-slashed-zero: ; 474 | --tw-numeric-figure: ; 475 | --tw-numeric-spacing: ; 476 | --tw-numeric-fraction: ; 477 | --tw-ring-inset: ; 478 | --tw-ring-offset-width: 0px; 479 | --tw-ring-offset-color: #fff; 480 | --tw-ring-color: rgb(59 130 246 / 0.5); 481 | --tw-ring-offset-shadow: 0 0 #0000; 482 | --tw-ring-shadow: 0 0 #0000; 483 | --tw-shadow: 0 0 #0000; 484 | --tw-shadow-colored: 0 0 #0000; 485 | --tw-blur: ; 486 | --tw-brightness: ; 487 | --tw-contrast: ; 488 | --tw-grayscale: ; 489 | --tw-hue-rotate: ; 490 | --tw-invert: ; 491 | --tw-saturate: ; 492 | --tw-sepia: ; 493 | --tw-drop-shadow: ; 494 | --tw-backdrop-blur: ; 495 | --tw-backdrop-brightness: ; 496 | --tw-backdrop-contrast: ; 497 | --tw-backdrop-grayscale: ; 498 | --tw-backdrop-hue-rotate: ; 499 | --tw-backdrop-invert: ; 500 | --tw-backdrop-opacity: ; 501 | --tw-backdrop-saturate: ; 502 | --tw-backdrop-sepia: ; 503 | } 504 | 505 | ::backdrop { 506 | --tw-border-spacing-x: 0; 507 | --tw-border-spacing-y: 0; 508 | --tw-translate-x: 0; 509 | --tw-translate-y: 0; 510 | --tw-rotate: 0; 511 | --tw-skew-x: 0; 512 | --tw-skew-y: 0; 513 | --tw-scale-x: 1; 514 | --tw-scale-y: 1; 515 | --tw-pan-x: ; 516 | --tw-pan-y: ; 517 | --tw-pinch-zoom: ; 518 | --tw-scroll-snap-strictness: proximity; 519 | --tw-ordinal: ; 520 | --tw-slashed-zero: ; 521 | --tw-numeric-figure: ; 522 | --tw-numeric-spacing: ; 523 | --tw-numeric-fraction: ; 524 | --tw-ring-inset: ; 525 | --tw-ring-offset-width: 0px; 526 | --tw-ring-offset-color: #fff; 527 | --tw-ring-color: rgb(59 130 246 / 0.5); 528 | --tw-ring-offset-shadow: 0 0 #0000; 529 | --tw-ring-shadow: 0 0 #0000; 530 | --tw-shadow: 0 0 #0000; 531 | --tw-shadow-colored: 0 0 #0000; 532 | --tw-blur: ; 533 | --tw-brightness: ; 534 | --tw-contrast: ; 535 | --tw-grayscale: ; 536 | --tw-hue-rotate: ; 537 | --tw-invert: ; 538 | --tw-saturate: ; 539 | --tw-sepia: ; 540 | --tw-drop-shadow: ; 541 | --tw-backdrop-blur: ; 542 | --tw-backdrop-brightness: ; 543 | --tw-backdrop-contrast: ; 544 | --tw-backdrop-grayscale: ; 545 | --tw-backdrop-hue-rotate: ; 546 | --tw-backdrop-invert: ; 547 | --tw-backdrop-opacity: ; 548 | --tw-backdrop-saturate: ; 549 | --tw-backdrop-sepia: ; 550 | } 551 | 552 | .container { 553 | width: 100%; 554 | } 555 | 556 | @media (min-width: 640px) { 557 | .container { 558 | max-width: 640px; 559 | } 560 | } 561 | 562 | @media (min-width: 768px) { 563 | .container { 564 | max-width: 768px; 565 | } 566 | } 567 | 568 | @media (min-width: 1024px) { 569 | .container { 570 | max-width: 1024px; 571 | } 572 | } 573 | 574 | @media (min-width: 1280px) { 575 | .container { 576 | max-width: 1280px; 577 | } 578 | } 579 | 580 | @media (min-width: 1536px) { 581 | .container { 582 | max-width: 1536px; 583 | } 584 | } 585 | 586 | :root { 587 | --bs-blue: #0d6efd; 588 | --bs-indigo: #6610f2; 589 | --bs-purple: #6f42c1; 590 | --bs-pink: #d63384; 591 | --bs-red: #dc3545; 592 | --bs-orange: #fd7e14; 593 | --bs-yellow: #ffc107; 594 | --bs-green: #198754; 595 | --bs-teal: #20c997; 596 | --bs-cyan: #0dcaf0; 597 | --bs-white: #fff; 598 | --bs-gray: #6c757d; 599 | --bs-gray-dark: #343a40; 600 | --bs-gray-100: #f8f9fa; 601 | --bs-gray-200: #e9ecef; 602 | --bs-gray-300: #dee2e6; 603 | --bs-gray-400: #ced4da; 604 | --bs-gray-500: #adb5bd; 605 | --bs-gray-600: #6c757d; 606 | --bs-gray-700: #495057; 607 | --bs-gray-800: #343a40; 608 | --bs-gray-900: #212529; 609 | --bs-primary: #0d6efd; 610 | --bs-secondary: #6c757d; 611 | --bs-success: #198754; 612 | --bs-info: #0dcaf0; 613 | --bs-warning: #ffc107; 614 | --bs-danger: #dc3545; 615 | --bs-light: #f8f9fa; 616 | --bs-dark: #212529; 617 | --bs-primary-rgb: 13, 110, 253; 618 | --bs-secondary-rgb: 108, 117, 125; 619 | --bs-success-rgb: 25, 135, 84; 620 | --bs-info-rgb: 13, 202, 240; 621 | --bs-warning-rgb: 255, 193, 7; 622 | --bs-danger-rgb: 220, 53, 69; 623 | --bs-light-rgb: 248, 249, 250; 624 | --bs-dark-rgb: 33, 37, 41; 625 | --bs-white-rgb: 255, 255, 255; 626 | --bs-black-rgb: 0, 0, 0; 627 | --bs-body-color-rgb: 33, 37, 41; 628 | --bs-body-bg-rgb: 255, 255, 255; 629 | --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 630 | --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 631 | --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); 632 | --bs-body-font-family: var(--bs-font-sans-serif); 633 | --bs-body-font-size: 1rem; 634 | --bs-body-font-weight: 400; 635 | --bs-body-line-height: 1.5; 636 | --bs-body-color: #212529; 637 | --bs-body-bg: #fff; 638 | } 639 | 640 | .input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) { 641 | border-top-right-radius: 0; 642 | border-bottom-right-radius: 0; 643 | } 644 | 645 | .input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) { 646 | border-top-right-radius: 0; 647 | border-bottom-right-radius: 0; 648 | } 649 | 650 | .is-invalid ~ .invalid-feedback { 651 | display: block; 652 | } 653 | 654 | .is-invalid ~ .invalid-tooltip { 655 | display: block; 656 | } 657 | 658 | .form-control.is-invalid { 659 | border-color: #dc3545; 660 | padding-right: calc(1.5em + 0.75rem); 661 | background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); 662 | background-repeat: no-repeat; 663 | background-position: right calc(0.375em + 0.1875rem) center; 664 | background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); 665 | } 666 | 667 | .form-control.is-invalid:focus { 668 | border-color: #dc3545; 669 | box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); 670 | } 671 | 672 | textarea.form-control.is-invalid { 673 | padding-right: calc(1.5em + 0.75rem); 674 | background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); 675 | } 676 | 677 | .form-select.is-invalid { 678 | border-color: #dc3545; 679 | } 680 | 681 | .form-select.is-invalid:not([multiple]):not([size]) { 682 | padding-right: 4.125rem; 683 | background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); 684 | background-position: right 0.75rem center, center right 2.25rem; 685 | background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); 686 | } 687 | 688 | .form-select.is-invalid:not([multiple])[size="1"] { 689 | padding-right: 4.125rem; 690 | background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); 691 | background-position: right 0.75rem center, center right 2.25rem; 692 | background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); 693 | } 694 | 695 | .form-select.is-invalid:focus { 696 | border-color: #dc3545; 697 | box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); 698 | } 699 | 700 | .form-check-input.is-invalid { 701 | border-color: #dc3545; 702 | } 703 | 704 | .form-check-input.is-invalid:checked { 705 | background-color: #dc3545; 706 | } 707 | 708 | .form-check-input.is-invalid:focus { 709 | box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); 710 | } 711 | 712 | .form-check-input.is-invalid ~ .form-check-label { 713 | color: #dc3545; 714 | } 715 | 716 | .input-group .form-control.is-invalid { 717 | z-index: 2; 718 | } 719 | 720 | .input-group .form-select.is-invalid { 721 | z-index: 2; 722 | } 723 | 724 | .input-group .form-control.is-invalid:focus { 725 | z-index: 3; 726 | } 727 | 728 | .input-group .form-select.is-invalid:focus { 729 | z-index: 3; 730 | } 731 | 732 | .btn.active { 733 | box-shadow: none; 734 | } 735 | 736 | .btn.active:focus { 737 | box-shadow: none; 738 | } 739 | 740 | .fade { 741 | transition: opacity 0.15s linear; 742 | } 743 | 744 | .fade:not(.show) { 745 | opacity: 0; 746 | } 747 | 748 | .collapse:not(.show) { 749 | display: none; 750 | } 751 | 752 | .collapsing { 753 | height: 0; 754 | overflow: hidden; 755 | transition: height 0.35s ease; 756 | } 757 | 758 | .collapsing.collapse-horizontal { 759 | width: 0; 760 | height: auto; 761 | transition: width 0.35s ease; 762 | } 763 | 764 | .dropdown-menu { 765 | z-index: 1000; 766 | } 767 | 768 | .dropdown-item.active { 769 | color: #1f2937; 770 | -webkit-text-decoration: none; 771 | text-decoration: none; 772 | background-color: #0d6efd; 773 | } 774 | 775 | .dropdown-item:active { 776 | color: #1f2937; 777 | -webkit-text-decoration: none; 778 | text-decoration: none; 779 | background-color: #0d6efd; 780 | } 781 | 782 | .dropdown-item:disabled { 783 | color: #adb5bd; 784 | pointer-events: none; 785 | background-color: transparent; 786 | } 787 | 788 | .dropdown-menu.show { 789 | display: block; 790 | } 791 | 792 | .dropdown-menu-dark .dropdown-item.active { 793 | color: #fff; 794 | background-color: #0d6efd; 795 | } 796 | 797 | .dropdown-menu-dark .dropdown-item:active { 798 | color: #fff; 799 | background-color: #0d6efd; 800 | } 801 | 802 | .dropdown-menu-dark .dropdown-item.disabled { 803 | color: #adb5bd; 804 | } 805 | 806 | .dropdown-menu-dark .dropdown-item:disabled { 807 | color: #adb5bd; 808 | } 809 | 810 | .nav-tabs .nav-link { 811 | color: #4b5563; 812 | } 813 | 814 | .nav-tabs .nav-link:hover { 815 | isolation: isolate; 816 | } 817 | 818 | .nav-tabs .nav-link:focus { 819 | isolation: isolate; 820 | } 821 | 822 | .nav-tabs .nav-link.disabled { 823 | color: #9ca3af; 824 | background-color: transparent; 825 | border-color: transparent; 826 | } 827 | 828 | .nav-tabs .nav-link.active { 829 | color: #2563eb; 830 | border-color: #2563eb; 831 | } 832 | 833 | .nav-tabs .nav-item.show .nav-link { 834 | color: #2563eb; 835 | border-color: #2563eb; 836 | } 837 | 838 | .nav-tabs .dropdown-menu { 839 | margin-top: -1px; 840 | border-top-left-radius: 0; 841 | border-top-right-radius: 0; 842 | } 843 | 844 | .nav-pills .nav-link { 845 | background: #f3f4f6; 846 | color: #4b5563; 847 | box-shadow: none; 848 | } 849 | 850 | .nav-pills .nav-link.active { 851 | background: #2563eb; 852 | color: #fff; 853 | box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); 854 | } 855 | 856 | .nav-pills .show > .nav-link { 857 | background: #2563eb; 858 | color: #fff; 859 | box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); 860 | } 861 | 862 | .nav-pills .disabled { 863 | color: #9ca3af; 864 | background-color: rgba(243, 244, 246, 0.5); 865 | } 866 | 867 | .nav-pills.menu-sidebar .nav-link { 868 | background-color: transparent; 869 | box-shadow: none; 870 | padding: 0 5px; 871 | border-radius: 0; 872 | } 873 | 874 | .nav-pills.menu-sidebar .nav-link.active { 875 | color: #1266f1; 876 | font-weight: 600; 877 | border-left: 0.125rem solid #1266f1; 878 | } 879 | 880 | .nav-justified > .nav-link { 881 | -ms-flex-basis: 0; 882 | flex-basis: 0; 883 | } 884 | 885 | .nav-justified .nav-item { 886 | -ms-flex-basis: 0; 887 | flex-basis: 0; 888 | } 889 | 890 | .tab-content > .active { 891 | display: block; 892 | } 893 | 894 | .navbar-expand .navbar-nav { 895 | flex-direction: row; 896 | } 897 | 898 | .navbar-expand .navbar-nav .dropdown-menu { 899 | position: absolute; 900 | } 901 | 902 | .navbar-expand .navbar-nav .nav-link { 903 | padding-right: 0.5rem; 904 | padding-left: 0.5rem; 905 | } 906 | 907 | .navbar-expand .offcanvas { 908 | position: inherit; 909 | bottom: 0; 910 | z-index: 1000; 911 | -ms-flex-grow: 1; 912 | flex-grow: 1; 913 | visibility: visible !important; 914 | background-color: transparent; 915 | border-right: 0; 916 | border-left: 0; 917 | transition: none; 918 | -webkit-transform: none; 919 | transform: none; 920 | } 921 | 922 | .navbar-light .navbar-nav .nav-link.disabled { 923 | color: rgba(0, 0, 0, 0.3); 924 | } 925 | 926 | .navbar-light .navbar-nav .show > .nav-link { 927 | color: rgba(0, 0, 0, 0.9); 928 | } 929 | 930 | .navbar-light .navbar-nav .nav-link.active { 931 | color: rgba(0, 0, 0, 0.9); 932 | } 933 | 934 | .navbar-dark .navbar-nav .nav-link.disabled { 935 | color: rgba(255, 255, 255, 0.25); 936 | } 937 | 938 | .navbar-dark .navbar-nav .show > .nav-link { 939 | color: #fff; 940 | } 941 | 942 | .navbar-dark .navbar-nav .nav-link.active { 943 | color: #fff; 944 | } 945 | 946 | .accordion-item:last-of-type .accordion-button.collapsed { 947 | border-bottom-right-radius: calc(0.5rem - 1px); 948 | border-bottom-left-radius: calc(0.5rem - 1px); 949 | } 950 | 951 | .btn-close.disabled { 952 | pointer-events: none; 953 | -webkit-user-select: none; 954 | user-select: none; 955 | opacity: 0.25; 956 | } 957 | 958 | .modal { 959 | z-index: 1055; 960 | } 961 | 962 | .modal-dialog { 963 | margin: 0.5rem; 964 | } 965 | 966 | .modal.fade .modal-dialog { 967 | transition: -webkit-transform 0.3s ease-out; 968 | transition: transform 0.3s ease-out; 969 | transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; 970 | -webkit-transform: translate(0, -50px); 971 | transform: translate(0, -50px); 972 | } 973 | 974 | .modal.show .modal-dialog { 975 | -webkit-transform: none; 976 | transform: none; 977 | } 978 | 979 | .modal.modal-static .modal-dialog { 980 | -webkit-transform: scale(1.02); 981 | transform: scale(1.02); 982 | } 983 | 984 | .modal-dialog-scrollable .modal-body { 985 | overflow-y: auto; 986 | } 987 | 988 | .modal-backdrop { 989 | position: fixed; 990 | top: 0; 991 | left: 0; 992 | z-index: 1050; 993 | width: 100vw; 994 | height: 100vh; 995 | background-color: #000; 996 | } 997 | 998 | .modal-backdrop.fade { 999 | opacity: 0; 1000 | } 1001 | 1002 | .modal-backdrop.show { 1003 | opacity: 0.5; 1004 | } 1005 | 1006 | .modal-body { 1007 | flex: 1 1 auto; 1008 | } 1009 | 1010 | .modal-fullscreen .modal-body { 1011 | overflow-y: auto; 1012 | } 1013 | 1014 | .tooltip { 1015 | position: absolute; 1016 | z-index: 1080; 1017 | display: block; 1018 | margin: 0; 1019 | font-family: var(--bs-font-sans-serif); 1020 | font-style: normal; 1021 | font-weight: 400; 1022 | line-height: 1.5; 1023 | -webkit-text-align: start; 1024 | text-align: start; 1025 | -webkit-text-decoration: none; 1026 | text-decoration: none; 1027 | -webkit-text-shadow: none; 1028 | text-shadow: none; 1029 | -webkit-text-transform: none; 1030 | text-transform: none; 1031 | letter-spacing: normal; 1032 | word-break: normal; 1033 | word-spacing: normal; 1034 | white-space: normal; 1035 | line-break: auto; 1036 | font-size: 0.875rem; 1037 | word-wrap: break-word; 1038 | opacity: 0; 1039 | } 1040 | 1041 | .tooltip.show { 1042 | opacity: 1; 1043 | } 1044 | 1045 | .bs-tooltip-top .tooltip-arrow { 1046 | bottom: 0; 1047 | } 1048 | 1049 | .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { 1050 | bottom: 0; 1051 | } 1052 | 1053 | .bs-tooltip-top .tooltip-arrow::before { 1054 | top: -1px; 1055 | border-width: 0.4rem 0.4rem 0; 1056 | border-top-color: #000; 1057 | } 1058 | 1059 | .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { 1060 | top: -1px; 1061 | border-width: 0.4rem 0.4rem 0; 1062 | border-top-color: #000; 1063 | } 1064 | 1065 | .bs-tooltip-end .tooltip-arrow { 1066 | left: 0; 1067 | width: 0.4rem; 1068 | height: 0.8rem; 1069 | } 1070 | 1071 | .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { 1072 | left: 0; 1073 | width: 0.4rem; 1074 | height: 0.8rem; 1075 | } 1076 | 1077 | .bs-tooltip-end .tooltip-arrow::before { 1078 | right: -1px; 1079 | border-width: 0.4rem 0.4rem 0.4rem 0; 1080 | border-right-color: #000; 1081 | } 1082 | 1083 | .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { 1084 | right: -1px; 1085 | border-width: 0.4rem 0.4rem 0.4rem 0; 1086 | border-right-color: #000; 1087 | } 1088 | 1089 | .bs-tooltip-bottom .tooltip-arrow { 1090 | top: 0; 1091 | } 1092 | 1093 | .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { 1094 | top: 0; 1095 | } 1096 | 1097 | .bs-tooltip-bottom .tooltip-arrow::before { 1098 | bottom: -1px; 1099 | border-width: 0 0.4rem 0.4rem; 1100 | border-bottom-color: #000; 1101 | } 1102 | 1103 | .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { 1104 | bottom: -1px; 1105 | border-width: 0 0.4rem 0.4rem; 1106 | border-bottom-color: #000; 1107 | } 1108 | 1109 | .bs-tooltip-start .tooltip-arrow { 1110 | right: 0; 1111 | width: 0.4rem; 1112 | height: 0.8rem; 1113 | } 1114 | 1115 | .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { 1116 | right: 0; 1117 | width: 0.4rem; 1118 | height: 0.8rem; 1119 | } 1120 | 1121 | .bs-tooltip-start .tooltip-arrow::before { 1122 | left: -1px; 1123 | border-width: 0.4rem 0 0.4rem 0.4rem; 1124 | border-left-color: #000; 1125 | } 1126 | 1127 | .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { 1128 | left: -1px; 1129 | border-width: 0.4rem 0 0.4rem 0.4rem; 1130 | border-left-color: #000; 1131 | } 1132 | 1133 | .tooltip-inner { 1134 | max-width: 200px; 1135 | font-size: 14px; 1136 | padding: 6px 16px; 1137 | color: #fff; 1138 | -webkit-text-align: center; 1139 | text-align: center; 1140 | background-color: #6d6d6d; 1141 | border-radius: 0.25rem; 1142 | } 1143 | 1144 | .popover { 1145 | position: absolute; 1146 | top: 0; 1147 | left: 0; 1148 | z-index: 1070; 1149 | display: block; 1150 | max-width: 276px; 1151 | font-family: var(--bs-font-sans-serif); 1152 | font-style: normal; 1153 | font-weight: 400; 1154 | line-height: 1.5; 1155 | -webkit-text-align: start; 1156 | text-align: start; 1157 | -webkit-text-decoration: none; 1158 | text-decoration: none; 1159 | -webkit-text-shadow: none; 1160 | text-shadow: none; 1161 | -webkit-text-transform: none; 1162 | text-transform: none; 1163 | letter-spacing: normal; 1164 | word-break: normal; 1165 | word-spacing: normal; 1166 | white-space: normal; 1167 | line-break: auto; 1168 | font-size: 0.875rem; 1169 | word-wrap: break-word; 1170 | background-color: #fff; 1171 | background-clip: padding-box; 1172 | border: 0; 1173 | border-radius: 0.5rem; 1174 | box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); 1175 | } 1176 | 1177 | .bs-popover-top > .popover-arrow { 1178 | bottom: calc(-0.5rem - 1px); 1179 | } 1180 | 1181 | .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { 1182 | bottom: calc(-0.5rem - 1px); 1183 | } 1184 | 1185 | .bs-popover-top > .popover-arrow::before { 1186 | bottom: 0; 1187 | border-width: 0.5rem 0.5rem 0; 1188 | border-top-color: rgba(0, 0, 0, 0.25); 1189 | } 1190 | 1191 | .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { 1192 | bottom: 0; 1193 | border-width: 0.5rem 0.5rem 0; 1194 | border-top-color: rgba(0, 0, 0, 0.25); 1195 | } 1196 | 1197 | .bs-popover-top > .popover-arrow::after { 1198 | bottom: 1px; 1199 | border-width: 0.5rem 0.5rem 0; 1200 | border-top-color: #fff; 1201 | } 1202 | 1203 | .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { 1204 | bottom: 1px; 1205 | border-width: 0.5rem 0.5rem 0; 1206 | border-top-color: #fff; 1207 | } 1208 | 1209 | .bs-popover-end > .popover-arrow { 1210 | left: calc(-0.5rem - 1px); 1211 | width: 0.5rem; 1212 | height: 1rem; 1213 | } 1214 | 1215 | .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { 1216 | left: calc(-0.5rem - 1px); 1217 | width: 0.5rem; 1218 | height: 1rem; 1219 | } 1220 | 1221 | .bs-popover-end > .popover-arrow::before { 1222 | left: 0; 1223 | border-width: 0.5rem 0.5rem 0.5rem 0; 1224 | border-right-color: rgba(0, 0, 0, 0.25); 1225 | } 1226 | 1227 | .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { 1228 | left: 0; 1229 | border-width: 0.5rem 0.5rem 0.5rem 0; 1230 | border-right-color: rgba(0, 0, 0, 0.25); 1231 | } 1232 | 1233 | .bs-popover-end > .popover-arrow::after { 1234 | left: 1px; 1235 | border-width: 0.5rem 0.5rem 0.5rem 0; 1236 | border-right-color: #fff; 1237 | } 1238 | 1239 | .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { 1240 | left: 1px; 1241 | border-width: 0.5rem 0.5rem 0.5rem 0; 1242 | border-right-color: #fff; 1243 | } 1244 | 1245 | .bs-popover-bottom > .popover-arrow { 1246 | top: calc(-0.5rem - 1px); 1247 | } 1248 | 1249 | .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { 1250 | top: calc(-0.5rem - 1px); 1251 | } 1252 | 1253 | .bs-popover-bottom > .popover-arrow::before { 1254 | top: 0; 1255 | border-width: 0 0.5rem 0.5rem 0.5rem; 1256 | border-bottom-color: rgba(0, 0, 0, 0.25); 1257 | } 1258 | 1259 | .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { 1260 | top: 0; 1261 | border-width: 0 0.5rem 0.5rem 0.5rem; 1262 | border-bottom-color: rgba(0, 0, 0, 0.25); 1263 | } 1264 | 1265 | .bs-popover-bottom > .popover-arrow::after { 1266 | top: 1px; 1267 | border-width: 0 0.5rem 0.5rem 0.5rem; 1268 | border-bottom-color: #fff; 1269 | } 1270 | 1271 | .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { 1272 | top: 1px; 1273 | border-width: 0 0.5rem 0.5rem 0.5rem; 1274 | border-bottom-color: #fff; 1275 | } 1276 | 1277 | .bs-popover-bottom .popover-header::before { 1278 | position: absolute; 1279 | top: 0; 1280 | left: 50%; 1281 | display: block; 1282 | width: 1rem; 1283 | margin-left: -0.5rem; 1284 | content: ""; 1285 | border-bottom: 1px solid #f0f0f0; 1286 | } 1287 | 1288 | .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { 1289 | position: absolute; 1290 | top: 0; 1291 | left: 50%; 1292 | display: block; 1293 | width: 1rem; 1294 | margin-left: -0.5rem; 1295 | content: ""; 1296 | border-bottom: 1px solid #f0f0f0; 1297 | } 1298 | 1299 | .bs-popover-start > .popover-arrow { 1300 | right: calc(-0.5rem - 1px); 1301 | width: 0.5rem; 1302 | height: 1rem; 1303 | } 1304 | 1305 | .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { 1306 | right: calc(-0.5rem - 1px); 1307 | width: 0.5rem; 1308 | height: 1rem; 1309 | } 1310 | 1311 | .bs-popover-start > .popover-arrow::before { 1312 | right: 0; 1313 | border-width: 0.5rem 0 0.5rem 0.5rem; 1314 | border-left-color: rgba(0, 0, 0, 0.25); 1315 | } 1316 | 1317 | .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { 1318 | right: 0; 1319 | border-width: 0.5rem 0 0.5rem 0.5rem; 1320 | border-left-color: rgba(0, 0, 0, 0.25); 1321 | } 1322 | 1323 | .bs-popover-start > .popover-arrow::after { 1324 | right: 1px; 1325 | border-width: 0.5rem 0 0.5rem 0.5rem; 1326 | border-left-color: #fff; 1327 | } 1328 | 1329 | .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { 1330 | right: 1px; 1331 | border-width: 0.5rem 0 0.5rem 0.5rem; 1332 | border-left-color: #fff; 1333 | } 1334 | 1335 | .popover-header { 1336 | padding: 0.5rem 1rem; 1337 | margin-bottom: 0; 1338 | font-size: 1rem; 1339 | background-color: #fff; 1340 | border-bottom: 1px solid rgba(0, 0, 0, 0.2); 1341 | border-top-left-radius: 0.5rem; 1342 | border-top-right-radius: 0.5rem; 1343 | font-weight: 500; 1344 | } 1345 | 1346 | .popover-header:empty { 1347 | display: none; 1348 | } 1349 | 1350 | .popover-body { 1351 | padding: 1rem 1rem; 1352 | color: #212529; 1353 | } 1354 | 1355 | .carousel.pointer-event { 1356 | touch-action: pan-y; 1357 | } 1358 | 1359 | .carousel-item { 1360 | display: none; 1361 | margin-right: -100%; 1362 | -webkit-backface-visibility: hidden; 1363 | backface-visibility: hidden; 1364 | transition: -webkit-transform 0.6s ease-in-out; 1365 | transition: transform 0.6s ease-in-out; 1366 | transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; 1367 | } 1368 | 1369 | .carousel-item.active { 1370 | display: block; 1371 | } 1372 | 1373 | .carousel-item-next { 1374 | display: block; 1375 | } 1376 | 1377 | .carousel-item-prev { 1378 | display: block; 1379 | } 1380 | 1381 | .carousel-item-next:not(.carousel-item-start) { 1382 | -webkit-transform: translateX(100%); 1383 | transform: translateX(100%); 1384 | } 1385 | 1386 | .active.carousel-item-end { 1387 | -webkit-transform: translateX(100%); 1388 | transform: translateX(100%); 1389 | } 1390 | 1391 | .carousel-item-prev:not(.carousel-item-end) { 1392 | -webkit-transform: translateX(-100%); 1393 | transform: translateX(-100%); 1394 | } 1395 | 1396 | .active.carousel-item-start { 1397 | -webkit-transform: translateX(-100%); 1398 | transform: translateX(-100%); 1399 | } 1400 | 1401 | .carousel-fade .carousel-item { 1402 | opacity: 0; 1403 | transition-property: opacity; 1404 | -webkit-transform: none; 1405 | transform: none; 1406 | } 1407 | 1408 | .carousel-fade .carousel-item.active { 1409 | z-index: 1; 1410 | opacity: 1; 1411 | } 1412 | 1413 | .carousel-fade .carousel-item-next.carousel-item-start { 1414 | z-index: 1; 1415 | opacity: 1; 1416 | } 1417 | 1418 | .carousel-fade .carousel-item-prev.carousel-item-end { 1419 | z-index: 1; 1420 | opacity: 1; 1421 | } 1422 | 1423 | .carousel-fade .active.carousel-item-start { 1424 | z-index: 0; 1425 | opacity: 0; 1426 | transition: opacity 0s 0.6s; 1427 | } 1428 | 1429 | .carousel-fade .active.carousel-item-end { 1430 | z-index: 0; 1431 | opacity: 0; 1432 | transition: opacity 0s 0.6s; 1433 | } 1434 | 1435 | .carousel-indicators { 1436 | z-index: 2; 1437 | margin-right: 15%; 1438 | margin-left: 15%; 1439 | list-style: none; 1440 | } 1441 | 1442 | .carousel-indicators [data-bs-target] { 1443 | box-sizing: content-box; 1444 | flex: 0 1 auto; 1445 | width: 30px; 1446 | height: 3px; 1447 | padding: 0; 1448 | margin-right: 3px; 1449 | margin-left: 3px; 1450 | -webkit-text-indent: -999px; 1451 | text-indent: -999px; 1452 | cursor: pointer; 1453 | background-color: #fff; 1454 | background-clip: padding-box; 1455 | border: 0; 1456 | border-top: 10px solid transparent; 1457 | border-bottom: 10px solid transparent; 1458 | opacity: 0.5; 1459 | transition: opacity 0.6s ease; 1460 | } 1461 | 1462 | .carousel-indicators .active { 1463 | opacity: 1; 1464 | } 1465 | 1466 | .carousel-dark .carousel-indicators [data-bs-target] { 1467 | background-color: #000; 1468 | } 1469 | 1470 | .spinner-border { 1471 | vertical-align: -0.125em; 1472 | border: 0.25em solid currentColor; 1473 | border-right-color: transparent; 1474 | } 1475 | 1476 | .offcanvas { 1477 | z-index: 1045; 1478 | } 1479 | 1480 | .offcanvas-backdrop { 1481 | position: fixed; 1482 | top: 0; 1483 | left: 0; 1484 | z-index: 1040; 1485 | width: 100vw; 1486 | height: 100vh; 1487 | background-color: #000; 1488 | } 1489 | 1490 | .offcanvas-backdrop.fade { 1491 | opacity: 0; 1492 | } 1493 | 1494 | .offcanvas-backdrop.show { 1495 | opacity: 0.5; 1496 | } 1497 | 1498 | .offcanvas.show { 1499 | -webkit-transform: none; 1500 | transform: none; 1501 | } 1502 | 1503 | .sticky-top { 1504 | position: -webkit-sticky; 1505 | position: sticky; 1506 | top: 0; 1507 | z-index: 1020; 1508 | } 1509 | 1510 | .vr { 1511 | display: inline-block; 1512 | align-self: stretch; 1513 | width: 1px; 1514 | min-height: 1em; 1515 | background-color: currentColor; 1516 | opacity: 0.25; 1517 | } 1518 | 1519 | .animation { 1520 | -webkit-animation-duration: 1s; 1521 | animation-duration: 1s; 1522 | -webkit-animation-fill-mode: both; 1523 | animation-fill-mode: both; 1524 | padding: auto; 1525 | } 1526 | 1527 | .fade-in { 1528 | -webkit-animation-name: _fade-in; 1529 | animation-name: _fade-in; 1530 | } 1531 | 1532 | .fade-out { 1533 | -webkit-animation-name: _fade-out; 1534 | animation-name: _fade-out; 1535 | } 1536 | 1537 | .animation.infinite { 1538 | -webkit-animation-iteration-count: infinite; 1539 | animation-iteration-count: infinite; 1540 | } 1541 | 1542 | .animation.delay-1s { 1543 | -webkit-animation-delay: 1s; 1544 | animation-delay: 1s; 1545 | } 1546 | 1547 | .animation.delay-2s { 1548 | -webkit-animation-delay: 2s; 1549 | animation-delay: 2s; 1550 | } 1551 | 1552 | .animation.delay-3s { 1553 | -webkit-animation-delay: 3s; 1554 | animation-delay: 3s; 1555 | } 1556 | 1557 | .animation.delay-4s { 1558 | -webkit-animation-delay: 4s; 1559 | animation-delay: 4s; 1560 | } 1561 | 1562 | .animation.delay-5s { 1563 | -webkit-animation-delay: 5s; 1564 | animation-delay: 5s; 1565 | } 1566 | 1567 | .animation.fast { 1568 | -webkit-animation-duration: 800ms; 1569 | animation-duration: 800ms; 1570 | } 1571 | 1572 | .animation.faster { 1573 | -webkit-animation-duration: 500ms; 1574 | animation-duration: 500ms; 1575 | } 1576 | 1577 | .animation.slow { 1578 | -webkit-animation-duration: 2s; 1579 | animation-duration: 2s; 1580 | } 1581 | 1582 | .animation.slower { 1583 | -webkit-animation-duration: 3s; 1584 | animation-duration: 3s; 1585 | } 1586 | 1587 | .slide-in-left { 1588 | -webkit-animation-name: _slide-in-left; 1589 | animation-name: _slide-in-left; 1590 | } 1591 | 1592 | .slide-in-right { 1593 | -webkit-animation-name: _slide-in-right; 1594 | animation-name: _slide-in-right; 1595 | } 1596 | 1597 | .slide-out-left { 1598 | -webkit-animation-name: _slide-out-left; 1599 | animation-name: _slide-out-left; 1600 | } 1601 | 1602 | .slide-out-right { 1603 | -webkit-animation-name: _slide-out-right; 1604 | animation-name: _slide-out-right; 1605 | } 1606 | 1607 | .ripple-surface { 1608 | position: relative; 1609 | overflow: hidden; 1610 | display: inline-block; 1611 | vertical-align: bottom; 1612 | } 1613 | 1614 | .ripple-surface-unbound { 1615 | overflow: visible; 1616 | } 1617 | 1618 | .ripple-wave { 1619 | background-image: radial-gradient(circle, rgba(0, 0, 0, 0.2) 0, rgba(0, 0, 0, 0.3) 40%, rgba(0, 0, 0, 0.4) 50%, rgba(0, 0, 0, 0.5) 60%, transparent 70%); 1620 | border-radius: 50%; 1621 | opacity: 0.5; 1622 | pointer-events: none; 1623 | position: absolute; 1624 | touch-action: none; 1625 | -webkit-transform: scale(0); 1626 | transform: scale(0); 1627 | transition-property: opacity, -webkit-transform; 1628 | transition-property: transform, opacity; 1629 | transition-property: transform, opacity, -webkit-transform; 1630 | transition-timing-function: cubic-bezier(0, 0, 0.15, 1), cubic-bezier(0, 0, 0.15, 1); 1631 | z-index: 999; 1632 | } 1633 | 1634 | .ripple-wave.active { 1635 | -webkit-transform: scale(1); 1636 | transform: scale(1); 1637 | opacity: 0; 1638 | } 1639 | 1640 | .btn .ripple-wave { 1641 | background-image: radial-gradient(circle, rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.3) 40%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 1642 | } 1643 | 1644 | .ripple-surface-primary .ripple-wave { 1645 | background-image: radial-gradient(circle, rgba(18, 102, 241, 0.2) 0, rgba(18, 102, 241, 0.3) 40%, rgba(18, 102, 241, 0.4) 50%, rgba(18, 102, 241, 0.5) 60%, rgba(18, 102, 241, 0) 70%); 1646 | } 1647 | 1648 | .ripple-surface-secondary .ripple-wave { 1649 | background-image: radial-gradient(circle, rgba(178, 60, 253, 0.2) 0, rgba(178, 60, 253, 0.3) 40%, rgba(178, 60, 253, 0.4) 50%, rgba(178, 60, 253, 0.5) 60%, rgba(178, 60, 253, 0) 70%); 1650 | } 1651 | 1652 | .ripple-surface-success .ripple-wave { 1653 | background-image: radial-gradient(circle, rgba(0, 183, 74, 0.2) 0, rgba(0, 183, 74, 0.3) 40%, rgba(0, 183, 74, 0.4) 50%, rgba(0, 183, 74, 0.5) 60%, rgba(0, 183, 74, 0) 70%); 1654 | } 1655 | 1656 | .ripple-surface-info .ripple-wave { 1657 | background-image: radial-gradient(circle, rgba(57, 192, 237, 0.2) 0, rgba(57, 192, 237, 0.3) 40%, rgba(57, 192, 237, 0.4) 50%, rgba(57, 192, 237, 0.5) 60%, rgba(57, 192, 237, 0) 70%); 1658 | } 1659 | 1660 | .ripple-surface-warning .ripple-wave { 1661 | background-image: radial-gradient(circle, rgba(255, 169, 0, 0.2) 0, rgba(255, 169, 0, 0.3) 40%, rgba(255, 169, 0, 0.4) 50%, rgba(255, 169, 0, 0.5) 60%, rgba(255, 169, 0, 0) 70%); 1662 | } 1663 | 1664 | .ripple-surface-danger .ripple-wave { 1665 | background-image: radial-gradient(circle, rgba(249, 49, 84, 0.2) 0, rgba(249, 49, 84, 0.3) 40%, rgba(249, 49, 84, 0.4) 50%, rgba(249, 49, 84, 0.5) 60%, rgba(249, 49, 84, 0) 70%); 1666 | } 1667 | 1668 | .ripple-surface-light .ripple-wave { 1669 | background-image: radial-gradient(circle, rgba(251, 251, 251, 0.2) 0, rgba(251, 251, 251, 0.3) 40%, rgba(251, 251, 251, 0.4) 50%, rgba(251, 251, 251, 0.5) 60%, rgba(251, 251, 251, 0) 70%); 1670 | } 1671 | 1672 | .ripple-surface-dark .ripple-wave { 1673 | background-image: radial-gradient(circle, rgba(38, 38, 38, 0.2) 0, rgba(38, 38, 38, 0.3) 40%, rgba(38, 38, 38, 0.4) 50%, rgba(38, 38, 38, 0.5) 60%, rgba(38, 38, 38, 0) 70%); 1674 | } 1675 | 1676 | .ripple-surface-white .ripple-wave { 1677 | background-image: radial-gradient(circle, rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.3) 40%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 1678 | } 1679 | 1680 | .ripple-surface-black .ripple-wave { 1681 | background-image: radial-gradient(circle, rgba(0, 0, 0, 0.2) 0, rgba(0, 0, 0, 0.3) 40%, rgba(0, 0, 0, 0.4) 50%, rgba(0, 0, 0, 0.5) 60%, transparent 70%); 1682 | } 1683 | 1684 | .datepicker-toggle-button { 1685 | position: absolute; 1686 | outline: none; 1687 | border: none; 1688 | background-color: transparent; 1689 | right: 10px; 1690 | top: 50%; 1691 | -webkit-transform: translate(-50%, -50%); 1692 | transform: translate(-50%, -50%); 1693 | } 1694 | 1695 | .datepicker-toggle-button:focus { 1696 | color: #2979ff; 1697 | } 1698 | 1699 | .datepicker-toggle-button:hover { 1700 | color: #2979ff; 1701 | } 1702 | 1703 | .datepicker-backdrop { 1704 | width: 100%; 1705 | height: 100%; 1706 | position: fixed; 1707 | top: 0; 1708 | right: 0; 1709 | bottom: 0; 1710 | left: 0; 1711 | background-color: rgba(0, 0, 0, 0.4); 1712 | z-index: 1065; 1713 | } 1714 | 1715 | .datepicker-dropdown-container { 1716 | width: 328px; 1717 | height: 380px; 1718 | background-color: #fff; 1719 | border-radius: 0.5rem; 1720 | box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.07), 0 4px 6px -2px rgba(0, 0, 0, 0.05); 1721 | z-index: 1066; 1722 | } 1723 | 1724 | .datepicker-modal-container { 1725 | display: flex; 1726 | flex-direction: column; 1727 | position: fixed; 1728 | top: 50%; 1729 | left: 50%; 1730 | -webkit-transform: translate(-50%, -50%); 1731 | transform: translate(-50%, -50%); 1732 | width: 328px; 1733 | height: 512px; 1734 | background-color: #fff; 1735 | border-radius: 0.6rem 0.6rem 0.5rem 0.5rem; 1736 | box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.07), 0 4px 6px -2px rgba(0, 0, 0, 0.05); 1737 | z-index: 1066; 1738 | } 1739 | 1740 | .datepicker-header { 1741 | height: 120px; 1742 | padding-right: 24px; 1743 | padding-left: 24px; 1744 | background-color: #2979ff; 1745 | display: flex; 1746 | flex-direction: column; 1747 | border-radius: 0.5rem 0.5rem 0 0; 1748 | } 1749 | 1750 | .datepicker-title { 1751 | height: 32px; 1752 | display: flex; 1753 | flex-direction: column; 1754 | justify-content: flex-end; 1755 | } 1756 | 1757 | .datepicker-title-text { 1758 | font-size: 10px; 1759 | font-weight: 400; 1760 | -webkit-text-transform: uppercase; 1761 | text-transform: uppercase; 1762 | letter-spacing: 1.7px; 1763 | color: #fff; 1764 | } 1765 | 1766 | .datepicker-date { 1767 | height: 72px; 1768 | display: flex; 1769 | flex-direction: column; 1770 | justify-content: flex-end; 1771 | } 1772 | 1773 | .datepicker-date-text { 1774 | font-size: 34px; 1775 | font-weight: 400; 1776 | color: #fff; 1777 | } 1778 | 1779 | .datepicker-main { 1780 | position: relative; 1781 | height: 100%; 1782 | } 1783 | 1784 | .datepicker-date-controls { 1785 | padding: 10px 12px 0 12px; 1786 | display: flex; 1787 | justify-content: space-between; 1788 | color: rgba(0, 0, 0, 0.64); 1789 | } 1790 | 1791 | .datepicker-view-change-button { 1792 | padding: 10px; 1793 | color: #666; 1794 | font-weight: 500; 1795 | font-size: 0.9rem; 1796 | border-radius: 10px; 1797 | box-shadow: none; 1798 | background-color: transparent; 1799 | margin: 0; 1800 | border: none; 1801 | } 1802 | 1803 | .datepicker-view-change-button:hover { 1804 | background-color: #eee; 1805 | } 1806 | 1807 | .datepicker-view-change-button:focus { 1808 | background-color: #eee; 1809 | } 1810 | 1811 | .datepicker-view-change-button:after { 1812 | content: ""; 1813 | display: inline-block; 1814 | width: 0; 1815 | height: 0; 1816 | border-left: 5px solid transparent; 1817 | border-right: 5px solid transparent; 1818 | border-top-width: 5px; 1819 | border-top-style: solid; 1820 | margin: 0 0 0 5px; 1821 | vertical-align: middle; 1822 | } 1823 | 1824 | .datepicker-arrow-controls { 1825 | margin-top: 10px; 1826 | } 1827 | 1828 | .datepicker-previous-button { 1829 | position: relative; 1830 | padding: 0; 1831 | width: 40px; 1832 | height: 40px; 1833 | line-height: 40px; 1834 | border: none; 1835 | outline: none; 1836 | margin: 0; 1837 | color: rgba(0, 0, 0, 0.64); 1838 | background-color: transparent; 1839 | margin-right: 24px; 1840 | } 1841 | 1842 | .datepicker-previous-button:hover { 1843 | background-color: #eee; 1844 | border-radius: 50%; 1845 | } 1846 | 1847 | .datepicker-previous-button:focus { 1848 | background-color: #eee; 1849 | border-radius: 50%; 1850 | } 1851 | 1852 | .datepicker-previous-button::after { 1853 | top: 0; 1854 | left: 0; 1855 | right: 0; 1856 | bottom: 0; 1857 | position: absolute; 1858 | content: ""; 1859 | margin: 15.5px; 1860 | border: 0 solid currentColor; 1861 | border-top-width: 2px; 1862 | border-left-width: 2px; 1863 | -webkit-transform: translateX(2px) rotate(-45deg); 1864 | transform: translateX(2px) rotate(-45deg); 1865 | } 1866 | 1867 | .datepicker-next-button { 1868 | position: relative; 1869 | padding: 0; 1870 | width: 40px; 1871 | height: 40px; 1872 | line-height: 40px; 1873 | border: none; 1874 | outline: none; 1875 | margin: 0; 1876 | color: rgba(0, 0, 0, 0.64); 1877 | background-color: transparent; 1878 | } 1879 | 1880 | .datepicker-next-button:hover { 1881 | background-color: #eee; 1882 | border-radius: 50%; 1883 | } 1884 | 1885 | .datepicker-next-button:focus { 1886 | background-color: #eee; 1887 | border-radius: 50%; 1888 | } 1889 | 1890 | .datepicker-next-button::after { 1891 | top: 0; 1892 | left: 0; 1893 | right: 0; 1894 | bottom: 0; 1895 | position: absolute; 1896 | content: ""; 1897 | margin: 15.5px; 1898 | border: 0 solid currentColor; 1899 | border-top-width: 2px; 1900 | border-right-width: 2px; 1901 | -webkit-transform: translateX(-2px) rotate(45deg); 1902 | transform: translateX(-2px) rotate(45deg); 1903 | } 1904 | 1905 | .datepicker-view { 1906 | padding-left: 12px; 1907 | padding-right: 12px; 1908 | outline: none; 1909 | } 1910 | 1911 | .datepicker-table { 1912 | margin-right: auto; 1913 | margin-left: auto; 1914 | width: 304px; 1915 | } 1916 | 1917 | .datepicker-day-heading { 1918 | width: 40px; 1919 | height: 40px; 1920 | -webkit-text-align: center; 1921 | text-align: center; 1922 | font-size: 12px; 1923 | font-weight: 400; 1924 | } 1925 | 1926 | .datepicker-cell { 1927 | -webkit-text-align: center; 1928 | text-align: center; 1929 | } 1930 | 1931 | .datepicker-cell.disabled { 1932 | color: #ccc; 1933 | cursor: default; 1934 | pointer-events: none; 1935 | } 1936 | 1937 | .datepicker-cell.disabled:hover { 1938 | cursor: default; 1939 | } 1940 | 1941 | .datepicker-cell:hover { 1942 | cursor: pointer; 1943 | } 1944 | 1945 | .datepicker-cell:not(.disabled):not(.selected):hover .datepicker-cell-content { 1946 | background-color: #d3d3d3; 1947 | } 1948 | 1949 | .datepicker-cell.selected .datepicker-cell-content { 1950 | background-color: #2979ff; 1951 | color: #fff; 1952 | } 1953 | 1954 | .datepicker-cell:not(.selected).focused .datepicker-cell-content { 1955 | background-color: #eee; 1956 | } 1957 | 1958 | .datepicker-cell.focused .datepicker-cell-content.selected { 1959 | background-color: #2979ff; 1960 | } 1961 | 1962 | .datepicker-cell.current .datepicker-cell-content { 1963 | border: 1px solid #000; 1964 | } 1965 | 1966 | .datepicker-small-cell { 1967 | width: 40px; 1968 | height: 40px; 1969 | } 1970 | 1971 | .datepicker-small-cell-content { 1972 | width: 36px; 1973 | height: 36px; 1974 | line-height: 36px; 1975 | border-radius: 50%; 1976 | font-size: 13px; 1977 | } 1978 | 1979 | .datepicker-large-cell { 1980 | width: 76px; 1981 | height: 42px; 1982 | } 1983 | 1984 | .datepicker-large-cell-content { 1985 | width: 72px; 1986 | height: 40px; 1987 | line-height: 40px; 1988 | padding: 1px 2px; 1989 | border-radius: 999px; 1990 | } 1991 | 1992 | .datepicker-footer { 1993 | height: 56px; 1994 | display: flex; 1995 | position: absolute; 1996 | width: 100%; 1997 | bottom: 0; 1998 | justify-content: flex-end; 1999 | align-items: center; 2000 | padding-left: 12px; 2001 | padding-right: 12px; 2002 | } 2003 | 2004 | .datepicker-footer-btn { 2005 | background-color: #fff; 2006 | color: #2979ff; 2007 | border: none; 2008 | cursor: pointer; 2009 | padding: 0 10px; 2010 | -webkit-text-transform: uppercase; 2011 | text-transform: uppercase; 2012 | font-size: 0.8rem; 2013 | font-weight: 500; 2014 | height: 40px; 2015 | line-height: 40px; 2016 | letter-spacing: 0.1rem; 2017 | border-radius: 10px; 2018 | margin-bottom: 10px; 2019 | } 2020 | 2021 | .datepicker-footer-btn:hover { 2022 | background-color: #eee; 2023 | } 2024 | 2025 | .datepicker-footer-btn:focus { 2026 | background-color: #eee; 2027 | } 2028 | 2029 | .datepicker-clear-btn { 2030 | margin-right: auto; 2031 | } 2032 | 2033 | .timepicker-wrapper { 2034 | touch-action: none; 2035 | z-index: 1065; 2036 | opacity: 0; 2037 | right: 0; 2038 | bottom: 0; 2039 | top: 0; 2040 | left: 0; 2041 | background-color: rgba(0, 0, 0, 0.4); 2042 | } 2043 | 2044 | .timepicker-elements { 2045 | min-width: 310px; 2046 | min-height: 325px; 2047 | background: #fff; 2048 | border-top-right-radius: 0.6rem; 2049 | border-top-left-radius: 0.6rem; 2050 | } 2051 | 2052 | .timepicker-head { 2053 | background-color: #2979ff; 2054 | height: 100px; 2055 | border-top-right-radius: 0.5rem; 2056 | border-top-left-radius: 0.5rem; 2057 | padding: 10px 24px 10px 50px; 2058 | } 2059 | 2060 | .timepicker-button { 2061 | font-size: 0.8rem; 2062 | min-width: 64px; 2063 | box-sizing: border-box; 2064 | font-weight: 500; 2065 | line-height: 40px; 2066 | border-radius: 10px; 2067 | letter-spacing: 0.1rem; 2068 | -webkit-text-transform: uppercase; 2069 | text-transform: uppercase; 2070 | color: #2979ff; 2071 | border: none; 2072 | background-color: transparent; 2073 | transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; 2074 | outline: none; 2075 | padding: 0 10px; 2076 | height: 40px; 2077 | margin-bottom: 10px; 2078 | } 2079 | 2080 | .timepicker-button:hover { 2081 | background-color: rgba(0, 0, 0, 0.08); 2082 | } 2083 | 2084 | .timepicker-button:focus { 2085 | outline: none; 2086 | background-color: rgba(0, 0, 0, 0.08); 2087 | } 2088 | 2089 | .timepicker-current { 2090 | font-size: 3.75rem; 2091 | font-weight: 300; 2092 | line-height: 1.2; 2093 | letter-spacing: -0.00833em; 2094 | color: #fff; 2095 | opacity: 0.54; 2096 | border: none; 2097 | background: transparent; 2098 | padding: 0; 2099 | } 2100 | 2101 | .timepicker-current.active { 2102 | opacity: 1; 2103 | } 2104 | 2105 | .timepicker-current-wrapper { 2106 | direction: ltr; 2107 | } 2108 | 2109 | .timepicker-mode-wrapper { 2110 | margin-left: 20px; 2111 | font-size: 18px; 2112 | color: rgba(255, 255, 255, 0.54); 2113 | } 2114 | 2115 | .timepicker-mode-wrapper.active { 2116 | opacity: 1; 2117 | } 2118 | 2119 | .timepicker-clock-wrapper { 2120 | min-width: 310px; 2121 | max-width: 325px; 2122 | min-height: 305px; 2123 | overflow-x: hidden; 2124 | height: 100%; 2125 | } 2126 | 2127 | .timepicker-clock { 2128 | position: relative; 2129 | border-radius: 100%; 2130 | width: 260px; 2131 | height: 260px; 2132 | cursor: default; 2133 | margin: 0 auto; 2134 | background-color: rgba(0, 0, 0, 0.07); 2135 | } 2136 | 2137 | .timepicker-time-tips-minutes.active { 2138 | color: #fff; 2139 | background-color: #2979ff; 2140 | font-weight: 400; 2141 | } 2142 | 2143 | .timepicker-time-tips-inner.active { 2144 | color: #fff; 2145 | background-color: #2979ff; 2146 | font-weight: 400; 2147 | } 2148 | 2149 | .timepicker-time-tips-hours.active { 2150 | color: #fff; 2151 | background-color: #2979ff; 2152 | font-weight: 400; 2153 | } 2154 | 2155 | .timepicker-time-tips-minutes.disabled { 2156 | color: #b3afaf; 2157 | pointer-events: none; 2158 | background-color: transparent; 2159 | } 2160 | 2161 | .timepicker-time-tips-inner.disabled { 2162 | color: #b3afaf; 2163 | pointer-events: none; 2164 | background-color: transparent; 2165 | } 2166 | 2167 | .timepicker-time-tips-hours.disabled { 2168 | color: #b3afaf; 2169 | pointer-events: none; 2170 | background-color: transparent; 2171 | } 2172 | 2173 | .timepicker-dot { 2174 | font-weight: 300; 2175 | line-height: 1.2; 2176 | letter-spacing: -0.00833em; 2177 | color: #fff; 2178 | font-size: 3.75rem; 2179 | opacity: 0.54; 2180 | border: none; 2181 | background: transparent; 2182 | padding: 0; 2183 | } 2184 | 2185 | .timepicker-middle-dot { 2186 | top: 50%; 2187 | left: 50%; 2188 | width: 6px; 2189 | height: 6px; 2190 | -webkit-transform: translate(-50%, -50%); 2191 | transform: translate(-50%, -50%); 2192 | border-radius: 50%; 2193 | background-color: #2979ff; 2194 | } 2195 | 2196 | .timepicker-hand-pointer { 2197 | background-color: #2979ff; 2198 | bottom: 50%; 2199 | height: 40%; 2200 | left: calc(50% - 1px); 2201 | -webkit-transform-origin: center bottom 0; 2202 | transform-origin: center bottom 0; 2203 | width: 2px; 2204 | } 2205 | 2206 | .timepicker-time-tips.active { 2207 | color: #fff; 2208 | } 2209 | 2210 | .timepicker-circle { 2211 | top: -21px; 2212 | left: -15px; 2213 | width: 4px; 2214 | border: 14px solid #2979ff; 2215 | height: 4px; 2216 | box-sizing: content-box; 2217 | border-radius: 100%; 2218 | } 2219 | 2220 | .timepicker-hour-mode { 2221 | padding: 0; 2222 | background-color: transparent; 2223 | border: none; 2224 | color: #fff; 2225 | opacity: 0.54; 2226 | cursor: pointer; 2227 | } 2228 | 2229 | .timepicker-hour { 2230 | cursor: pointer; 2231 | } 2232 | 2233 | .timepicker-minute { 2234 | cursor: pointer; 2235 | } 2236 | 2237 | .timepicker-hour-mode:hover { 2238 | background-color: rgba(0, 0, 0, 0.15); 2239 | outline: none; 2240 | } 2241 | 2242 | .timepicker-hour-mode:focus { 2243 | background-color: rgba(0, 0, 0, 0.15); 2244 | outline: none; 2245 | } 2246 | 2247 | .timepicker-hour:hover { 2248 | background-color: rgba(0, 0, 0, 0.15); 2249 | outline: none; 2250 | } 2251 | 2252 | .timepicker-hour:focus { 2253 | background-color: rgba(0, 0, 0, 0.15); 2254 | outline: none; 2255 | } 2256 | 2257 | .timepicker-minute:hover { 2258 | background-color: rgba(0, 0, 0, 0.15); 2259 | outline: none; 2260 | } 2261 | 2262 | .timepicker-minute:focus { 2263 | background-color: rgba(0, 0, 0, 0.15); 2264 | outline: none; 2265 | } 2266 | 2267 | .timepicker-hour-mode.active { 2268 | color: #fff; 2269 | opacity: 1; 2270 | } 2271 | 2272 | .timepicker-hour.active { 2273 | color: #fff; 2274 | opacity: 1; 2275 | } 2276 | 2277 | .timepicker-minute.active { 2278 | color: #fff; 2279 | opacity: 1; 2280 | } 2281 | 2282 | .timepicker-footer { 2283 | border-bottom-left-radius: 0.5rem; 2284 | border-bottom-right-radius: 0.5rem; 2285 | display: flex; 2286 | justify-content: space-between; 2287 | align-items: center; 2288 | width: 100%; 2289 | height: 56px; 2290 | padding-left: 12px; 2291 | padding-right: 12px; 2292 | background-color: #fff; 2293 | } 2294 | 2295 | .timepicker-container { 2296 | max-height: calc(100% - 64px); 2297 | overflow-y: auto; 2298 | box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.07), 0 4px 6px -2px rgba(0, 0, 0, 0.05); 2299 | } 2300 | 2301 | .timepicker-icon-up.active { 2302 | opacity: 1; 2303 | } 2304 | 2305 | .timepicker-icon-down.active { 2306 | opacity: 1; 2307 | } 2308 | 2309 | .timepicker-toggle-button { 2310 | position: absolute; 2311 | outline: none; 2312 | border: none; 2313 | background-color: transparent; 2314 | right: 10px; 2315 | top: 50%; 2316 | -webkit-transform: translate(-50%, -50%); 2317 | transform: translate(-50%, -50%); 2318 | transition: all 0.3s ease; 2319 | cursor: pointer; 2320 | } 2321 | 2322 | .timepicker-toggle-button:hover { 2323 | color: #2979ff; 2324 | } 2325 | 2326 | .timepicker-toggle-button:focus { 2327 | color: #2979ff; 2328 | } 2329 | 2330 | .timepicker-input:focus + .timepicker-toggle-button { 2331 | color: #2979ff; 2332 | } 2333 | 2334 | .timepicker-input:focus + .timepicker-toggle-button i { 2335 | color: #2979ff; 2336 | } 2337 | 2338 | .timepicker a.timepicker-toggle-button { 2339 | right: 1px; 2340 | } 2341 | 2342 | .timepicker-toggle-button.timepicker-icon { 2343 | right: 1px; 2344 | } 2345 | 2346 | .timepicker-modal .fade.show { 2347 | opacity: 1; 2348 | } 2349 | 2350 | .stepper { 2351 | position: relative; 2352 | padding: 0; 2353 | margin: 0; 2354 | width: 100%; 2355 | list-style: none; 2356 | overflow: hidden; 2357 | transition: height 0.2s ease-in-out; 2358 | } 2359 | 2360 | .stepper:not(.stepper-vertical) { 2361 | display: flex; 2362 | justify-content: space-between; 2363 | } 2364 | 2365 | .stepper:not(.stepper-vertical) .stepper-content { 2366 | position: absolute; 2367 | width: 100%; 2368 | padding: 1rem; 2369 | } 2370 | 2371 | .stepper:not(.stepper-vertical) .stepper-step { 2372 | flex: auto; 2373 | height: 4.5rem; 2374 | } 2375 | 2376 | .stepper:not(.stepper-vertical) .stepper-step:first-child .stepper-head { 2377 | padding-left: 1.5rem; 2378 | } 2379 | 2380 | .stepper:not(.stepper-vertical) .stepper-step:last-child .stepper-head { 2381 | padding-right: 1.5rem; 2382 | } 2383 | 2384 | .stepper:not(.stepper-vertical) .stepper-step:not(:first-child) .stepper-head:before { 2385 | flex: 1; 2386 | height: 1px; 2387 | width: 100%; 2388 | margin-right: 0.5rem; 2389 | content: ""; 2390 | background-color: rgba(0, 0, 0, 0.1); 2391 | } 2392 | 2393 | .stepper:not(.stepper-vertical) .stepper-step:not(:last-child) .stepper-head:after { 2394 | flex: 1; 2395 | height: 1px; 2396 | width: 100%; 2397 | margin-left: 0.5rem; 2398 | content: ""; 2399 | background-color: rgba(0, 0, 0, 0.1); 2400 | } 2401 | 2402 | .stepper:not(.stepper-vertical) .stepper-head-icon { 2403 | margin: 1.5rem 0.5rem 1.5rem 0; 2404 | } 2405 | 2406 | .stepper.stepper-mobile { 2407 | justify-content: center; 2408 | align-items: flex-end; 2409 | } 2410 | 2411 | .stepper.stepper-mobile.stepper-progress-bar .stepper-head-icon { 2412 | display: none; 2413 | } 2414 | 2415 | .stepper.stepper-mobile .stepper-step { 2416 | flex: unset; 2417 | height: -webkit-fit-content; 2418 | height: -moz-fit-content; 2419 | height: fit-content; 2420 | margin: 1rem 0 1rem 0; 2421 | } 2422 | 2423 | .stepper.stepper-mobile .stepper-step:not(:last-child) .stepper-head:after { 2424 | margin-left: 0; 2425 | } 2426 | 2427 | .stepper.stepper-mobile .stepper-step:not(:first-child) .stepper-head:before { 2428 | margin-right: 0; 2429 | } 2430 | 2431 | .stepper.stepper-mobile .stepper-step:not(:last-child):not(:first-child) .stepper-head { 2432 | padding-left: 0.25rem; 2433 | padding-right: 0.25rem; 2434 | } 2435 | 2436 | .stepper.stepper-mobile .stepper-head-icon { 2437 | font-size: 0; 2438 | margin: 0; 2439 | height: 0.5rem; 2440 | width: 0.5rem; 2441 | z-index: 1; 2442 | } 2443 | 2444 | .stepper.stepper-mobile .stepper-head-text { 2445 | display: none; 2446 | } 2447 | 2448 | .stepper.stepper-mobile .stepper-content { 2449 | top: 2.56rem; 2450 | } 2451 | 2452 | @media (prefers-reduced-motion: reduce) { 2453 | .form-control::-webkit-file-upload-button { 2454 | -webkit-transition: none; 2455 | transition: none; 2456 | } 2457 | .form-control::file-selector-button { 2458 | transition: none; 2459 | } 2460 | 2461 | .form-control::-webkit-file-upload-button { 2462 | -webkit-transition: none; 2463 | transition: none; 2464 | } 2465 | 2466 | .form-switch .form-check-input { 2467 | transition: none; 2468 | } 2469 | 2470 | .form-range::-webkit-slider-thumb { 2471 | -webkit-transition: none; 2472 | transition: none; 2473 | } 2474 | 2475 | .form-range::-moz-range-thumb { 2476 | -moz-transition: none; 2477 | transition: none; 2478 | } 2479 | 2480 | .form-floating > label { 2481 | transition: none; 2482 | } 2483 | 2484 | .fade { 2485 | transition: none; 2486 | } 2487 | 2488 | .collapsing { 2489 | transition: none; 2490 | } 2491 | 2492 | .collapsing.collapse-horizontal { 2493 | transition: none; 2494 | } 2495 | 2496 | .accordion-button::after { 2497 | transition: none; 2498 | } 2499 | 2500 | .modal.fade .modal-dialog { 2501 | transition: none; 2502 | } 2503 | 2504 | .carousel-item { 2505 | transition: none; 2506 | } 2507 | 2508 | .carousel-fade .active.carousel-item-start { 2509 | transition: none; 2510 | } 2511 | 2512 | .carousel-fade .active.carousel-item-end { 2513 | transition: none; 2514 | } 2515 | 2516 | .carousel-control-prev { 2517 | transition: none; 2518 | } 2519 | 2520 | .carousel-control-next { 2521 | transition: none; 2522 | } 2523 | 2524 | .carousel-indicators [data-bs-target] { 2525 | transition: none; 2526 | } 2527 | 2528 | .spinner-border { 2529 | -webkit-animation-duration: 1.5s; 2530 | animation-duration: 1.5s; 2531 | } 2532 | 2533 | .spinner-grow { 2534 | -webkit-animation-duration: 1.5s; 2535 | animation-duration: 1.5s; 2536 | } 2537 | } 2538 | 2539 | @media (min-width: 576px) { 2540 | .navbar-expand-sm { 2541 | flex-wrap: nowrap; 2542 | justify-content: flex-start; 2543 | } 2544 | 2545 | .navbar-expand-sm .navbar-nav { 2546 | flex-direction: row; 2547 | } 2548 | 2549 | .navbar-expand-sm .navbar-nav .dropdown-menu { 2550 | position: absolute; 2551 | } 2552 | 2553 | .navbar-expand-sm .navbar-nav .nav-link { 2554 | padding-right: 0.5rem; 2555 | padding-left: 0.5rem; 2556 | } 2557 | 2558 | .navbar-expand-sm .navbar-nav-scroll { 2559 | overflow: visible; 2560 | } 2561 | 2562 | .navbar-expand-sm .navbar-collapse { 2563 | display: flex !important; 2564 | -ms-flex-basis: auto; 2565 | flex-basis: auto; 2566 | } 2567 | 2568 | .navbar-expand-sm .navbar-toggler { 2569 | display: none; 2570 | } 2571 | 2572 | .navbar-expand-sm .offcanvas-header { 2573 | display: none; 2574 | } 2575 | 2576 | .navbar-expand-sm .offcanvas { 2577 | position: inherit; 2578 | bottom: 0; 2579 | z-index: 1000; 2580 | -ms-flex-grow: 1; 2581 | flex-grow: 1; 2582 | visibility: visible !important; 2583 | background-color: transparent; 2584 | border-right: 0; 2585 | border-left: 0; 2586 | transition: none; 2587 | -webkit-transform: none; 2588 | transform: none; 2589 | } 2590 | 2591 | .navbar-expand-sm .offcanvas-top { 2592 | height: auto; 2593 | border-top: 0; 2594 | border-bottom: 0; 2595 | } 2596 | 2597 | .navbar-expand-sm .offcanvas-bottom { 2598 | height: auto; 2599 | border-top: 0; 2600 | border-bottom: 0; 2601 | } 2602 | 2603 | .navbar-expand-sm .offcanvas-body { 2604 | display: flex; 2605 | -ms-flex-grow: 0; 2606 | flex-grow: 0; 2607 | padding: 0; 2608 | overflow-y: visible; 2609 | } 2610 | 2611 | .modal-dialog { 2612 | max-width: 500px; 2613 | margin: 1.75rem auto; 2614 | } 2615 | 2616 | .modal-dialog-scrollable { 2617 | height: calc(100% - 3.5rem); 2618 | } 2619 | 2620 | .modal-dialog-centered { 2621 | min-height: calc(100% - 3.5rem); 2622 | } 2623 | 2624 | .modal-sm { 2625 | max-width: 300px; 2626 | } 2627 | 2628 | .sticky-sm-top { 2629 | position: -webkit-sticky; 2630 | position: sticky; 2631 | top: 0; 2632 | z-index: 1020; 2633 | } 2634 | } 2635 | 2636 | @media (min-width: 768px) { 2637 | .navbar-expand-md { 2638 | flex-wrap: nowrap; 2639 | justify-content: flex-start; 2640 | } 2641 | 2642 | .navbar-expand-md .navbar-nav { 2643 | flex-direction: row; 2644 | } 2645 | 2646 | .navbar-expand-md .navbar-nav .dropdown-menu { 2647 | position: absolute; 2648 | } 2649 | 2650 | .navbar-expand-md .navbar-nav .nav-link { 2651 | padding-right: 0.5rem; 2652 | padding-left: 0.5rem; 2653 | } 2654 | 2655 | .navbar-expand-md .navbar-nav-scroll { 2656 | overflow: visible; 2657 | } 2658 | 2659 | .navbar-expand-md .navbar-collapse { 2660 | display: flex !important; 2661 | -ms-flex-basis: auto; 2662 | flex-basis: auto; 2663 | } 2664 | 2665 | .navbar-expand-md .navbar-toggler { 2666 | display: none; 2667 | } 2668 | 2669 | .navbar-expand-md .offcanvas-header { 2670 | display: none; 2671 | } 2672 | 2673 | .navbar-expand-md .offcanvas { 2674 | position: inherit; 2675 | bottom: 0; 2676 | z-index: 1000; 2677 | -ms-flex-grow: 1; 2678 | flex-grow: 1; 2679 | visibility: visible !important; 2680 | background-color: transparent; 2681 | border-right: 0; 2682 | border-left: 0; 2683 | transition: none; 2684 | -webkit-transform: none; 2685 | transform: none; 2686 | } 2687 | 2688 | .navbar-expand-md .offcanvas-top { 2689 | height: auto; 2690 | border-top: 0; 2691 | border-bottom: 0; 2692 | } 2693 | 2694 | .navbar-expand-md .offcanvas-bottom { 2695 | height: auto; 2696 | border-top: 0; 2697 | border-bottom: 0; 2698 | } 2699 | 2700 | .navbar-expand-md .offcanvas-body { 2701 | display: flex; 2702 | -ms-flex-grow: 0; 2703 | flex-grow: 0; 2704 | padding: 0; 2705 | overflow-y: visible; 2706 | } 2707 | 2708 | .sticky-md-top { 2709 | position: -webkit-sticky; 2710 | position: sticky; 2711 | top: 0; 2712 | z-index: 1020; 2713 | } 2714 | } 2715 | 2716 | @media (min-width: 992px) { 2717 | .navbar-expand-lg { 2718 | flex-wrap: nowrap; 2719 | justify-content: flex-start; 2720 | } 2721 | 2722 | .navbar-expand-lg .navbar-nav { 2723 | flex-direction: row; 2724 | } 2725 | 2726 | .navbar-expand-lg .navbar-nav .dropdown-menu { 2727 | position: absolute; 2728 | } 2729 | 2730 | .navbar-expand-lg .navbar-nav .nav-link { 2731 | padding-right: 0.5rem; 2732 | padding-left: 0.5rem; 2733 | } 2734 | 2735 | .navbar-expand-lg .navbar-nav-scroll { 2736 | overflow: visible; 2737 | } 2738 | 2739 | .navbar-expand-lg .navbar-collapse { 2740 | display: flex !important; 2741 | -ms-flex-basis: auto; 2742 | flex-basis: auto; 2743 | } 2744 | 2745 | .navbar-expand-lg .navbar-toggler { 2746 | display: none; 2747 | } 2748 | 2749 | .navbar-expand-lg .offcanvas-header { 2750 | display: none; 2751 | } 2752 | 2753 | .navbar-expand-lg .offcanvas { 2754 | position: inherit; 2755 | bottom: 0; 2756 | z-index: 1000; 2757 | -ms-flex-grow: 1; 2758 | flex-grow: 1; 2759 | visibility: visible !important; 2760 | background-color: transparent; 2761 | border-right: 0; 2762 | border-left: 0; 2763 | transition: none; 2764 | -webkit-transform: none; 2765 | transform: none; 2766 | } 2767 | 2768 | .navbar-expand-lg .offcanvas-top { 2769 | height: auto; 2770 | border-top: 0; 2771 | border-bottom: 0; 2772 | } 2773 | 2774 | .navbar-expand-lg .offcanvas-bottom { 2775 | height: auto; 2776 | border-top: 0; 2777 | border-bottom: 0; 2778 | } 2779 | 2780 | .navbar-expand-lg .offcanvas-body { 2781 | display: flex; 2782 | -ms-flex-grow: 0; 2783 | flex-grow: 0; 2784 | padding: 0; 2785 | overflow-y: visible; 2786 | } 2787 | 2788 | .modal-lg { 2789 | max-width: 800px; 2790 | } 2791 | 2792 | .modal-xl { 2793 | max-width: 800px; 2794 | } 2795 | 2796 | .sticky-lg-top { 2797 | position: -webkit-sticky; 2798 | position: sticky; 2799 | top: 0; 2800 | z-index: 1020; 2801 | } 2802 | } 2803 | 2804 | @media (min-width: 1200px) { 2805 | .navbar-expand-xl { 2806 | flex-wrap: nowrap; 2807 | justify-content: flex-start; 2808 | } 2809 | 2810 | .navbar-expand-xl .navbar-nav { 2811 | flex-direction: row; 2812 | } 2813 | 2814 | .navbar-expand-xl .navbar-nav .dropdown-menu { 2815 | position: absolute; 2816 | } 2817 | 2818 | .navbar-expand-xl .navbar-nav .nav-link { 2819 | padding-right: 0.5rem; 2820 | padding-left: 0.5rem; 2821 | } 2822 | 2823 | .navbar-expand-xl .navbar-nav-scroll { 2824 | overflow: visible; 2825 | } 2826 | 2827 | .navbar-expand-xl .navbar-collapse { 2828 | display: flex !important; 2829 | -ms-flex-basis: auto; 2830 | flex-basis: auto; 2831 | } 2832 | 2833 | .navbar-expand-xl .navbar-toggler { 2834 | display: none; 2835 | } 2836 | 2837 | .navbar-expand-xl .offcanvas-header { 2838 | display: none; 2839 | } 2840 | 2841 | .navbar-expand-xl .offcanvas { 2842 | position: inherit; 2843 | bottom: 0; 2844 | z-index: 1000; 2845 | -ms-flex-grow: 1; 2846 | flex-grow: 1; 2847 | visibility: visible !important; 2848 | background-color: transparent; 2849 | border-right: 0; 2850 | border-left: 0; 2851 | transition: none; 2852 | -webkit-transform: none; 2853 | transform: none; 2854 | } 2855 | 2856 | .navbar-expand-xl .offcanvas-top { 2857 | height: auto; 2858 | border-top: 0; 2859 | border-bottom: 0; 2860 | } 2861 | 2862 | .navbar-expand-xl .offcanvas-bottom { 2863 | height: auto; 2864 | border-top: 0; 2865 | border-bottom: 0; 2866 | } 2867 | 2868 | .navbar-expand-xl .offcanvas-body { 2869 | display: flex; 2870 | -ms-flex-grow: 0; 2871 | flex-grow: 0; 2872 | padding: 0; 2873 | overflow-y: visible; 2874 | } 2875 | 2876 | .modal-xl { 2877 | max-width: 1140px; 2878 | } 2879 | 2880 | .sticky-xl-top { 2881 | position: -webkit-sticky; 2882 | position: sticky; 2883 | top: 0; 2884 | z-index: 1020; 2885 | } 2886 | } 2887 | 2888 | @media (min-width: 1400px) { 2889 | .navbar-expand-xxl { 2890 | flex-wrap: nowrap; 2891 | justify-content: flex-start; 2892 | } 2893 | 2894 | .navbar-expand-xxl .navbar-nav { 2895 | flex-direction: row; 2896 | } 2897 | 2898 | .navbar-expand-xxl .navbar-nav .dropdown-menu { 2899 | position: absolute; 2900 | } 2901 | 2902 | .navbar-expand-xxl .navbar-nav .nav-link { 2903 | padding-right: 0.5rem; 2904 | padding-left: 0.5rem; 2905 | } 2906 | 2907 | .navbar-expand-xxl .navbar-nav-scroll { 2908 | overflow: visible; 2909 | } 2910 | 2911 | .navbar-expand-xxl .navbar-collapse { 2912 | display: flex !important; 2913 | -ms-flex-basis: auto; 2914 | flex-basis: auto; 2915 | } 2916 | 2917 | .navbar-expand-xxl .navbar-toggler { 2918 | display: none; 2919 | } 2920 | 2921 | .navbar-expand-xxl .offcanvas-header { 2922 | display: none; 2923 | } 2924 | 2925 | .navbar-expand-xxl .offcanvas { 2926 | position: inherit; 2927 | bottom: 0; 2928 | z-index: 1000; 2929 | -ms-flex-grow: 1; 2930 | flex-grow: 1; 2931 | visibility: visible !important; 2932 | background-color: transparent; 2933 | border-right: 0; 2934 | border-left: 0; 2935 | transition: none; 2936 | -webkit-transform: none; 2937 | transform: none; 2938 | } 2939 | 2940 | .navbar-expand-xxl .offcanvas-top { 2941 | height: auto; 2942 | border-top: 0; 2943 | border-bottom: 0; 2944 | } 2945 | 2946 | .navbar-expand-xxl .offcanvas-bottom { 2947 | height: auto; 2948 | border-top: 0; 2949 | border-bottom: 0; 2950 | } 2951 | 2952 | .navbar-expand-xxl .offcanvas-body { 2953 | display: flex; 2954 | -ms-flex-grow: 0; 2955 | flex-grow: 0; 2956 | padding: 0; 2957 | overflow-y: visible; 2958 | } 2959 | 2960 | .sticky-xxl-top { 2961 | position: -webkit-sticky; 2962 | position: sticky; 2963 | top: 0; 2964 | z-index: 1020; 2965 | } 2966 | } 2967 | 2968 | @media (max-width: 575.98px) { 2969 | .modal-fullscreen-sm-down { 2970 | width: 100vw; 2971 | max-width: none; 2972 | height: 100%; 2973 | margin: 0; 2974 | } 2975 | 2976 | .modal-fullscreen-sm-down .modal-content { 2977 | height: 100%; 2978 | border: 0; 2979 | border-radius: 0; 2980 | } 2981 | 2982 | .modal-fullscreen-sm-down .modal-header { 2983 | border-radius: 0; 2984 | } 2985 | 2986 | .modal-fullscreen-sm-down .modal-body { 2987 | overflow-y: auto; 2988 | } 2989 | 2990 | .modal-fullscreen-sm-down .modal-footer { 2991 | border-radius: 0; 2992 | } 2993 | } 2994 | 2995 | @media (max-width: 767.98px) { 2996 | .modal-fullscreen-md-down { 2997 | width: 100vw; 2998 | max-width: none; 2999 | height: 100%; 3000 | margin: 0; 3001 | } 3002 | 3003 | .modal-fullscreen-md-down .modal-content { 3004 | height: 100%; 3005 | border: 0; 3006 | border-radius: 0; 3007 | } 3008 | 3009 | .modal-fullscreen-md-down .modal-header { 3010 | border-radius: 0; 3011 | } 3012 | 3013 | .modal-fullscreen-md-down .modal-body { 3014 | overflow-y: auto; 3015 | } 3016 | 3017 | .modal-fullscreen-md-down .modal-footer { 3018 | border-radius: 0; 3019 | } 3020 | } 3021 | 3022 | @media (max-width: 991.98px) { 3023 | .modal-fullscreen-lg-down { 3024 | width: 100vw; 3025 | max-width: none; 3026 | height: 100%; 3027 | margin: 0; 3028 | } 3029 | 3030 | .modal-fullscreen-lg-down .modal-content { 3031 | height: 100%; 3032 | border: 0; 3033 | border-radius: 0; 3034 | } 3035 | 3036 | .modal-fullscreen-lg-down .modal-header { 3037 | border-radius: 0; 3038 | } 3039 | 3040 | .modal-fullscreen-lg-down .modal-body { 3041 | overflow-y: auto; 3042 | } 3043 | 3044 | .modal-fullscreen-lg-down .modal-footer { 3045 | border-radius: 0; 3046 | } 3047 | } 3048 | 3049 | @media (max-width: 1199.98px) { 3050 | .modal-fullscreen-xl-down { 3051 | width: 100vw; 3052 | max-width: none; 3053 | height: 100%; 3054 | margin: 0; 3055 | } 3056 | 3057 | .modal-fullscreen-xl-down .modal-content { 3058 | height: 100%; 3059 | border: 0; 3060 | border-radius: 0; 3061 | } 3062 | 3063 | .modal-fullscreen-xl-down .modal-header { 3064 | border-radius: 0; 3065 | } 3066 | 3067 | .modal-fullscreen-xl-down .modal-body { 3068 | overflow-y: auto; 3069 | } 3070 | 3071 | .modal-fullscreen-xl-down .modal-footer { 3072 | border-radius: 0; 3073 | } 3074 | } 3075 | 3076 | @media (max-width: 1399.98px) { 3077 | .modal-fullscreen-xxl-down { 3078 | width: 100vw; 3079 | max-width: none; 3080 | height: 100%; 3081 | margin: 0; 3082 | } 3083 | 3084 | .modal-fullscreen-xxl-down .modal-content { 3085 | height: 100%; 3086 | border: 0; 3087 | border-radius: 0; 3088 | } 3089 | 3090 | .modal-fullscreen-xxl-down .modal-header { 3091 | border-radius: 0; 3092 | } 3093 | 3094 | .modal-fullscreen-xxl-down .modal-body { 3095 | overflow-y: auto; 3096 | } 3097 | 3098 | .modal-fullscreen-xxl-down .modal-footer { 3099 | border-radius: 0; 3100 | } 3101 | } 3102 | 3103 | @media (prefers-reduced-motion) { 3104 | .animation { 3105 | transition: none !important; 3106 | -webkit-animation: unset !important; 3107 | animation: unset !important; 3108 | } 3109 | } 3110 | 3111 | @media screen and (min-width: 320px) and (max-width: 820px) and (orientation: landscape) { 3112 | .datepicker-modal-container .datepicker-header { 3113 | height: 100%; 3114 | } 3115 | 3116 | .datepicker-modal-container .datepicker-date { 3117 | margin-top: 100px; 3118 | } 3119 | 3120 | .datepicker-modal-container .datepicker-day-cell { 3121 | width: 32x; 3122 | height: 32x; 3123 | } 3124 | 3125 | .datepicker-modal-container { 3126 | flex-direction: row; 3127 | width: 475px; 3128 | height: 360px; 3129 | } 3130 | 3131 | .datepicker-modal-container.datepicker-day-cell { 3132 | width: 36px; 3133 | height: 36px; 3134 | } 3135 | } 3136 | 3137 | @media screen and (min-width: 320px) and (max-width: 825px) and (orientation: landscape) { 3138 | .timepicker-elements { 3139 | flex-direction: row !important; 3140 | border-bottom-left-radius: 0.5rem; 3141 | min-width: auto; 3142 | min-height: auto; 3143 | overflow-y: auto; 3144 | } 3145 | 3146 | .timepicker-head { 3147 | border-top-right-radius: 0; 3148 | border-bottom-left-radius: 0; 3149 | padding: 10px; 3150 | padding-right: 10px !important; 3151 | height: auto; 3152 | min-height: 305px; 3153 | } 3154 | 3155 | .timepicker-head-content { 3156 | flex-direction: column; 3157 | } 3158 | 3159 | .timepicker-mode-wrapper { 3160 | justify-content: space-around !important; 3161 | flex-direction: row !important; 3162 | } 3163 | 3164 | .timepicker-current { 3165 | font-size: 3rem; 3166 | font-weight: 400; 3167 | } 3168 | 3169 | .timepicker-dot { 3170 | font-size: 3rem; 3171 | font-weight: 400; 3172 | } 3173 | } 3174 | 3175 | @-webkit-keyframes _spinner-grow { 3176 | 0% { 3177 | -webkit-transform: scale(0); 3178 | transform: scale(0); 3179 | } 3180 | 3181 | 50% { 3182 | opacity: 1; 3183 | -webkit-transform: none; 3184 | transform: none; 3185 | } 3186 | } 3187 | 3188 | @keyframes _spinner-grow { 3189 | 0% { 3190 | -webkit-transform: scale(0); 3191 | transform: scale(0); 3192 | } 3193 | 3194 | 50% { 3195 | opacity: 1; 3196 | -webkit-transform: none; 3197 | transform: none; 3198 | } 3199 | } 3200 | 3201 | @-webkit-keyframes _fade-in { 3202 | from { 3203 | opacity: 0; 3204 | } 3205 | 3206 | to { 3207 | opacity: 1; 3208 | } 3209 | } 3210 | 3211 | @keyframes _fade-in { 3212 | from { 3213 | opacity: 0; 3214 | } 3215 | 3216 | to { 3217 | opacity: 1; 3218 | } 3219 | } 3220 | 3221 | @-webkit-keyframes _fade-out { 3222 | from { 3223 | opacity: 1; 3224 | } 3225 | 3226 | to { 3227 | opacity: 0; 3228 | } 3229 | } 3230 | 3231 | @keyframes _fade-out { 3232 | from { 3233 | opacity: 1; 3234 | } 3235 | 3236 | to { 3237 | opacity: 0; 3238 | } 3239 | } 3240 | 3241 | @-webkit-keyframes _fade-in-down { 3242 | from { 3243 | opacity: 0; 3244 | -webkit-transform: translate3d(0, -100%, 0); 3245 | transform: translate3d(0, -100%, 0); 3246 | } 3247 | 3248 | to { 3249 | opacity: 1; 3250 | -webkit-transform: translate3d(0, 0, 0); 3251 | transform: translate3d(0, 0, 0); 3252 | } 3253 | } 3254 | 3255 | @keyframes _fade-in-down { 3256 | from { 3257 | opacity: 0; 3258 | -webkit-transform: translate3d(0, -100%, 0); 3259 | transform: translate3d(0, -100%, 0); 3260 | } 3261 | 3262 | to { 3263 | opacity: 1; 3264 | -webkit-transform: translate3d(0, 0, 0); 3265 | transform: translate3d(0, 0, 0); 3266 | } 3267 | } 3268 | 3269 | @-webkit-keyframes _fade-in-left { 3270 | from { 3271 | opacity: 0; 3272 | -webkit-transform: translate3d(-100%, 0, 0); 3273 | transform: translate3d(-100%, 0, 0); 3274 | } 3275 | 3276 | to { 3277 | opacity: 1; 3278 | -webkit-transform: translate3d(0, 0, 0); 3279 | transform: translate3d(0, 0, 0); 3280 | } 3281 | } 3282 | 3283 | @keyframes _fade-in-left { 3284 | from { 3285 | opacity: 0; 3286 | -webkit-transform: translate3d(-100%, 0, 0); 3287 | transform: translate3d(-100%, 0, 0); 3288 | } 3289 | 3290 | to { 3291 | opacity: 1; 3292 | -webkit-transform: translate3d(0, 0, 0); 3293 | transform: translate3d(0, 0, 0); 3294 | } 3295 | } 3296 | 3297 | @-webkit-keyframes _fade-in-right { 3298 | from { 3299 | opacity: 0; 3300 | -webkit-transform: translate3d(100%, 0, 0); 3301 | transform: translate3d(100%, 0, 0); 3302 | } 3303 | 3304 | to { 3305 | opacity: 1; 3306 | -webkit-transform: translate3d(0, 0, 0); 3307 | transform: translate3d(0, 0, 0); 3308 | } 3309 | } 3310 | 3311 | @keyframes _fade-in-right { 3312 | from { 3313 | opacity: 0; 3314 | -webkit-transform: translate3d(100%, 0, 0); 3315 | transform: translate3d(100%, 0, 0); 3316 | } 3317 | 3318 | to { 3319 | opacity: 1; 3320 | -webkit-transform: translate3d(0, 0, 0); 3321 | transform: translate3d(0, 0, 0); 3322 | } 3323 | } 3324 | 3325 | @-webkit-keyframes _fade-in-up { 3326 | from { 3327 | opacity: 0; 3328 | -webkit-transform: translate3d(0, 100%, 0); 3329 | transform: translate3d(0, 100%, 0); 3330 | } 3331 | 3332 | to { 3333 | opacity: 1; 3334 | -webkit-transform: translate3d(0, 0, 0); 3335 | transform: translate3d(0, 0, 0); 3336 | } 3337 | } 3338 | 3339 | @keyframes _fade-in-up { 3340 | from { 3341 | opacity: 0; 3342 | -webkit-transform: translate3d(0, 100%, 0); 3343 | transform: translate3d(0, 100%, 0); 3344 | } 3345 | 3346 | to { 3347 | opacity: 1; 3348 | -webkit-transform: translate3d(0, 0, 0); 3349 | transform: translate3d(0, 0, 0); 3350 | } 3351 | } 3352 | 3353 | @-webkit-keyframes _fade-out-down { 3354 | from { 3355 | opacity: 1; 3356 | } 3357 | 3358 | to { 3359 | opacity: 0; 3360 | -webkit-transform: translate3d(0, 100%, 0); 3361 | transform: translate3d(0, 100%, 0); 3362 | } 3363 | } 3364 | 3365 | @keyframes _fade-out-down { 3366 | from { 3367 | opacity: 1; 3368 | } 3369 | 3370 | to { 3371 | opacity: 0; 3372 | -webkit-transform: translate3d(0, 100%, 0); 3373 | transform: translate3d(0, 100%, 0); 3374 | } 3375 | } 3376 | 3377 | @-webkit-keyframes _fade-out-left { 3378 | from { 3379 | opacity: 1; 3380 | } 3381 | 3382 | to { 3383 | opacity: 0; 3384 | -webkit-transform: translate3d(-100%, 0, 0); 3385 | transform: translate3d(-100%, 0, 0); 3386 | } 3387 | } 3388 | 3389 | @keyframes _fade-out-left { 3390 | from { 3391 | opacity: 1; 3392 | } 3393 | 3394 | to { 3395 | opacity: 0; 3396 | -webkit-transform: translate3d(-100%, 0, 0); 3397 | transform: translate3d(-100%, 0, 0); 3398 | } 3399 | } 3400 | 3401 | @-webkit-keyframes _fade-out-right { 3402 | from { 3403 | opacity: 1; 3404 | } 3405 | 3406 | to { 3407 | opacity: 0; 3408 | -webkit-transform: translate3d(100%, 0, 0); 3409 | transform: translate3d(100%, 0, 0); 3410 | } 3411 | } 3412 | 3413 | @keyframes _fade-out-right { 3414 | from { 3415 | opacity: 1; 3416 | } 3417 | 3418 | to { 3419 | opacity: 0; 3420 | -webkit-transform: translate3d(100%, 0, 0); 3421 | transform: translate3d(100%, 0, 0); 3422 | } 3423 | } 3424 | 3425 | @-webkit-keyframes _fade-out-up { 3426 | from { 3427 | opacity: 1; 3428 | } 3429 | 3430 | to { 3431 | opacity: 0; 3432 | -webkit-transform: translate3d(0, -100%, 0); 3433 | transform: translate3d(0, -100%, 0); 3434 | } 3435 | } 3436 | 3437 | @keyframes _fade-out-up { 3438 | from { 3439 | opacity: 1; 3440 | } 3441 | 3442 | to { 3443 | opacity: 0; 3444 | -webkit-transform: translate3d(0, -100%, 0); 3445 | transform: translate3d(0, -100%, 0); 3446 | } 3447 | } 3448 | 3449 | @-webkit-keyframes _slide-in-down { 3450 | from { 3451 | visibility: visible; 3452 | -webkit-transform: translate3d(0, -100%, 0); 3453 | transform: translate3d(0, -100%, 0); 3454 | } 3455 | 3456 | to { 3457 | -webkit-transform: translate3d(0, 0, 0); 3458 | transform: translate3d(0, 0, 0); 3459 | } 3460 | } 3461 | 3462 | @keyframes _slide-in-down { 3463 | from { 3464 | visibility: visible; 3465 | -webkit-transform: translate3d(0, -100%, 0); 3466 | transform: translate3d(0, -100%, 0); 3467 | } 3468 | 3469 | to { 3470 | -webkit-transform: translate3d(0, 0, 0); 3471 | transform: translate3d(0, 0, 0); 3472 | } 3473 | } 3474 | 3475 | @-webkit-keyframes _slide-in-left { 3476 | from { 3477 | visibility: visible; 3478 | -webkit-transform: translate3d(-100%, 0, 0); 3479 | transform: translate3d(-100%, 0, 0); 3480 | } 3481 | 3482 | to { 3483 | -webkit-transform: translate3d(0, 0, 0); 3484 | transform: translate3d(0, 0, 0); 3485 | } 3486 | } 3487 | 3488 | @keyframes _slide-in-left { 3489 | from { 3490 | visibility: visible; 3491 | -webkit-transform: translate3d(-100%, 0, 0); 3492 | transform: translate3d(-100%, 0, 0); 3493 | } 3494 | 3495 | to { 3496 | -webkit-transform: translate3d(0, 0, 0); 3497 | transform: translate3d(0, 0, 0); 3498 | } 3499 | } 3500 | 3501 | @-webkit-keyframes _slide-in-right { 3502 | from { 3503 | visibility: visible; 3504 | -webkit-transform: translate3d(100%, 0, 0); 3505 | transform: translate3d(100%, 0, 0); 3506 | } 3507 | 3508 | to { 3509 | -webkit-transform: translate3d(0, 0, 0); 3510 | transform: translate3d(0, 0, 0); 3511 | } 3512 | } 3513 | 3514 | @keyframes _slide-in-right { 3515 | from { 3516 | visibility: visible; 3517 | -webkit-transform: translate3d(100%, 0, 0); 3518 | transform: translate3d(100%, 0, 0); 3519 | } 3520 | 3521 | to { 3522 | -webkit-transform: translate3d(0, 0, 0); 3523 | transform: translate3d(0, 0, 0); 3524 | } 3525 | } 3526 | 3527 | @-webkit-keyframes _slide-in-up { 3528 | from { 3529 | visibility: visible; 3530 | -webkit-transform: translate3d(0, 100%, 0); 3531 | transform: translate3d(0, 100%, 0); 3532 | } 3533 | 3534 | to { 3535 | -webkit-transform: translate3d(0, 0, 0); 3536 | transform: translate3d(0, 0, 0); 3537 | } 3538 | } 3539 | 3540 | @keyframes _slide-in-up { 3541 | from { 3542 | visibility: visible; 3543 | -webkit-transform: translate3d(0, 100%, 0); 3544 | transform: translate3d(0, 100%, 0); 3545 | } 3546 | 3547 | to { 3548 | -webkit-transform: translate3d(0, 0, 0); 3549 | transform: translate3d(0, 0, 0); 3550 | } 3551 | } 3552 | 3553 | @-webkit-keyframes _slide-out-down { 3554 | from { 3555 | -webkit-transform: translate3d(0, 0, 0); 3556 | transform: translate3d(0, 0, 0); 3557 | } 3558 | 3559 | to { 3560 | visibility: hidden; 3561 | -webkit-transform: translate3d(0, 100%, 0); 3562 | transform: translate3d(0, 100%, 0); 3563 | } 3564 | } 3565 | 3566 | @keyframes _slide-out-down { 3567 | from { 3568 | -webkit-transform: translate3d(0, 0, 0); 3569 | transform: translate3d(0, 0, 0); 3570 | } 3571 | 3572 | to { 3573 | visibility: hidden; 3574 | -webkit-transform: translate3d(0, 100%, 0); 3575 | transform: translate3d(0, 100%, 0); 3576 | } 3577 | } 3578 | 3579 | @-webkit-keyframes _slide-out-left { 3580 | from { 3581 | -webkit-transform: translate3d(0, 0, 0); 3582 | transform: translate3d(0, 0, 0); 3583 | } 3584 | 3585 | to { 3586 | visibility: hidden; 3587 | -webkit-transform: translate3d(-100%, 0, 0); 3588 | transform: translate3d(-100%, 0, 0); 3589 | } 3590 | } 3591 | 3592 | @keyframes _slide-out-left { 3593 | from { 3594 | -webkit-transform: translate3d(0, 0, 0); 3595 | transform: translate3d(0, 0, 0); 3596 | } 3597 | 3598 | to { 3599 | visibility: hidden; 3600 | -webkit-transform: translate3d(-100%, 0, 0); 3601 | transform: translate3d(-100%, 0, 0); 3602 | } 3603 | } 3604 | 3605 | @-webkit-keyframes _slide-out-right { 3606 | from { 3607 | -webkit-transform: translate3d(0, 0, 0); 3608 | transform: translate3d(0, 0, 0); 3609 | } 3610 | 3611 | to { 3612 | visibility: hidden; 3613 | -webkit-transform: translate3d(100%, 0, 0); 3614 | transform: translate3d(100%, 0, 0); 3615 | } 3616 | } 3617 | 3618 | @keyframes _slide-out-right { 3619 | from { 3620 | -webkit-transform: translate3d(0, 0, 0); 3621 | transform: translate3d(0, 0, 0); 3622 | } 3623 | 3624 | to { 3625 | visibility: hidden; 3626 | -webkit-transform: translate3d(100%, 0, 0); 3627 | transform: translate3d(100%, 0, 0); 3628 | } 3629 | } 3630 | 3631 | @-webkit-keyframes _slide-out-up { 3632 | from { 3633 | -webkit-transform: translate3d(0, 0, 0); 3634 | transform: translate3d(0, 0, 0); 3635 | } 3636 | 3637 | to { 3638 | visibility: hidden; 3639 | -webkit-transform: translate3d(0, -100%, 0); 3640 | transform: translate3d(0, -100%, 0); 3641 | } 3642 | } 3643 | 3644 | @keyframes _slide-out-up { 3645 | from { 3646 | -webkit-transform: translate3d(0, 0, 0); 3647 | transform: translate3d(0, 0, 0); 3648 | } 3649 | 3650 | to { 3651 | visibility: hidden; 3652 | -webkit-transform: translate3d(0, -100%, 0); 3653 | transform: translate3d(0, -100%, 0); 3654 | } 3655 | } 3656 | 3657 | @-webkit-keyframes _slide-down { 3658 | from { 3659 | -webkit-transform: translate3d(0, 0, 0); 3660 | transform: translate3d(0, 0, 0); 3661 | } 3662 | 3663 | to { 3664 | -webkit-transform: translate3d(0, 100%, 0); 3665 | transform: translate3d(0, 100%, 0); 3666 | } 3667 | } 3668 | 3669 | @keyframes _slide-down { 3670 | from { 3671 | -webkit-transform: translate3d(0, 0, 0); 3672 | transform: translate3d(0, 0, 0); 3673 | } 3674 | 3675 | to { 3676 | -webkit-transform: translate3d(0, 100%, 0); 3677 | transform: translate3d(0, 100%, 0); 3678 | } 3679 | } 3680 | 3681 | @-webkit-keyframes _slide-left { 3682 | from { 3683 | -webkit-transform: translate3d(0, 0, 0); 3684 | transform: translate3d(0, 0, 0); 3685 | } 3686 | 3687 | to { 3688 | -webkit-transform: translate3d(-100%, 0, 0); 3689 | transform: translate3d(-100%, 0, 0); 3690 | } 3691 | } 3692 | 3693 | @keyframes _slide-left { 3694 | from { 3695 | -webkit-transform: translate3d(0, 0, 0); 3696 | transform: translate3d(0, 0, 0); 3697 | } 3698 | 3699 | to { 3700 | -webkit-transform: translate3d(-100%, 0, 0); 3701 | transform: translate3d(-100%, 0, 0); 3702 | } 3703 | } 3704 | 3705 | @-webkit-keyframes _slide-right { 3706 | from { 3707 | -webkit-transform: translate3d(0, 0, 0); 3708 | transform: translate3d(0, 0, 0); 3709 | } 3710 | 3711 | to { 3712 | -webkit-transform: translate3d(100%, 0, 0); 3713 | transform: translate3d(100%, 0, 0); 3714 | } 3715 | } 3716 | 3717 | @keyframes _slide-right { 3718 | from { 3719 | -webkit-transform: translate3d(0, 0, 0); 3720 | transform: translate3d(0, 0, 0); 3721 | } 3722 | 3723 | to { 3724 | -webkit-transform: translate3d(100%, 0, 0); 3725 | transform: translate3d(100%, 0, 0); 3726 | } 3727 | } 3728 | 3729 | @-webkit-keyframes _slide-up { 3730 | from { 3731 | -webkit-transform: translate3d(0, 0, 0); 3732 | transform: translate3d(0, 0, 0); 3733 | } 3734 | 3735 | to { 3736 | -webkit-transform: translate3d(0, -100%, 0); 3737 | transform: translate3d(0, -100%, 0); 3738 | } 3739 | } 3740 | 3741 | @keyframes _slide-up { 3742 | from { 3743 | -webkit-transform: translate3d(0, 0, 0); 3744 | transform: translate3d(0, 0, 0); 3745 | } 3746 | 3747 | to { 3748 | -webkit-transform: translate3d(0, -100%, 0); 3749 | transform: translate3d(0, -100%, 0); 3750 | } 3751 | } 3752 | 3753 | @-webkit-keyframes _zoom-in { 3754 | from { 3755 | opacity: 0; 3756 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 3757 | transform: scale3d(0.3, 0.3, 0.3); 3758 | } 3759 | 3760 | 50% { 3761 | opacity: 1; 3762 | } 3763 | } 3764 | 3765 | @keyframes _zoom-in { 3766 | from { 3767 | opacity: 0; 3768 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 3769 | transform: scale3d(0.3, 0.3, 0.3); 3770 | } 3771 | 3772 | 50% { 3773 | opacity: 1; 3774 | } 3775 | } 3776 | 3777 | @-webkit-keyframes _zoom-out { 3778 | from { 3779 | opacity: 1; 3780 | } 3781 | 3782 | 50% { 3783 | opacity: 0; 3784 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 3785 | transform: scale3d(0.3, 0.3, 0.3); 3786 | } 3787 | 3788 | to { 3789 | opacity: 0; 3790 | } 3791 | } 3792 | 3793 | @keyframes _zoom-out { 3794 | from { 3795 | opacity: 1; 3796 | } 3797 | 3798 | 50% { 3799 | opacity: 0; 3800 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 3801 | transform: scale3d(0.3, 0.3, 0.3); 3802 | } 3803 | 3804 | to { 3805 | opacity: 0; 3806 | } 3807 | } 3808 | 3809 | @-webkit-keyframes _tada { 3810 | from { 3811 | -webkit-transform: scale3d(1, 1, 1); 3812 | transform: scale3d(1, 1, 1); 3813 | } 3814 | 3815 | 10% { 3816 | -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 3817 | transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 3818 | } 3819 | 3820 | 20% { 3821 | -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 3822 | transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 3823 | } 3824 | 3825 | 30% { 3826 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3827 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3828 | } 3829 | 3830 | 50% { 3831 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3832 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3833 | } 3834 | 3835 | 70% { 3836 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3837 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3838 | } 3839 | 3840 | 90% { 3841 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3842 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3843 | } 3844 | 3845 | 40% { 3846 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3847 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3848 | } 3849 | 3850 | 60% { 3851 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3852 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3853 | } 3854 | 3855 | 80% { 3856 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3857 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3858 | } 3859 | 3860 | to { 3861 | -webkit-transform: scale3d(1, 1, 1); 3862 | transform: scale3d(1, 1, 1); 3863 | } 3864 | } 3865 | 3866 | @keyframes _tada { 3867 | from { 3868 | -webkit-transform: scale3d(1, 1, 1); 3869 | transform: scale3d(1, 1, 1); 3870 | } 3871 | 3872 | 10% { 3873 | -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 3874 | transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 3875 | } 3876 | 3877 | 20% { 3878 | -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 3879 | transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 3880 | } 3881 | 3882 | 30% { 3883 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3884 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3885 | } 3886 | 3887 | 50% { 3888 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3889 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3890 | } 3891 | 3892 | 70% { 3893 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3894 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3895 | } 3896 | 3897 | 90% { 3898 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3899 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 3900 | } 3901 | 3902 | 40% { 3903 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3904 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3905 | } 3906 | 3907 | 60% { 3908 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3909 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3910 | } 3911 | 3912 | 80% { 3913 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3914 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 3915 | } 3916 | 3917 | to { 3918 | -webkit-transform: scale3d(1, 1, 1); 3919 | transform: scale3d(1, 1, 1); 3920 | } 3921 | } 3922 | 3923 | @-webkit-keyframes _pulse { 3924 | from { 3925 | -webkit-transform: scale3d(1, 1, 1); 3926 | transform: scale3d(1, 1, 1); 3927 | } 3928 | 3929 | 50% { 3930 | -webkit-transform: scale3d(1.05, 1.05, 1.05); 3931 | transform: scale3d(1.05, 1.05, 1.05); 3932 | } 3933 | 3934 | to { 3935 | -webkit-transform: scale3d(1, 1, 1); 3936 | transform: scale3d(1, 1, 1); 3937 | } 3938 | } 3939 | 3940 | @keyframes _pulse { 3941 | from { 3942 | -webkit-transform: scale3d(1, 1, 1); 3943 | transform: scale3d(1, 1, 1); 3944 | } 3945 | 3946 | 50% { 3947 | -webkit-transform: scale3d(1.05, 1.05, 1.05); 3948 | transform: scale3d(1.05, 1.05, 1.05); 3949 | } 3950 | 3951 | to { 3952 | -webkit-transform: scale3d(1, 1, 1); 3953 | transform: scale3d(1, 1, 1); 3954 | } 3955 | } 3956 | 3957 | @-webkit-keyframes _show-up-clock { 3958 | 0% { 3959 | opacity: 0; 3960 | -webkit-transform: scale(0.7); 3961 | transform: scale(0.7); 3962 | } 3963 | 3964 | to { 3965 | opacity: 1; 3966 | -webkit-transform: scale(1); 3967 | transform: scale(1); 3968 | } 3969 | } 3970 | 3971 | @keyframes _show-up-clock { 3972 | 0% { 3973 | opacity: 0; 3974 | -webkit-transform: scale(0.7); 3975 | transform: scale(0.7); 3976 | } 3977 | 3978 | to { 3979 | opacity: 1; 3980 | -webkit-transform: scale(1); 3981 | transform: scale(1); 3982 | } 3983 | } 3984 | 3985 | .sr-only { 3986 | position: absolute; 3987 | width: 1px; 3988 | height: 1px; 3989 | padding: 0; 3990 | margin: -1px; 3991 | overflow: hidden; 3992 | clip: rect(0, 0, 0, 0); 3993 | white-space: nowrap; 3994 | border-width: 0; 3995 | } 3996 | 3997 | .visible { 3998 | visibility: visible; 3999 | } 4000 | 4001 | .static { 4002 | position: static; 4003 | } 4004 | 4005 | .fixed { 4006 | position: fixed; 4007 | } 4008 | 4009 | .absolute { 4010 | position: absolute; 4011 | } 4012 | 4013 | .relative { 4014 | position: relative; 4015 | } 4016 | 4017 | .sticky { 4018 | position: -webkit-sticky; 4019 | position: sticky; 4020 | } 4021 | 4022 | .m-5 { 4023 | margin: 1.25rem; 4024 | } 4025 | 4026 | .m-2 { 4027 | margin: 0.5rem; 4028 | } 4029 | 4030 | .mx-4 { 4031 | margin-left: 1rem; 4032 | margin-right: 1rem; 4033 | } 4034 | 4035 | .mt-3 { 4036 | margin-top: 0.75rem; 4037 | } 4038 | 4039 | .mt-1 { 4040 | margin-top: 0.25rem; 4041 | } 4042 | 4043 | .block { 4044 | display: block; 4045 | } 4046 | 4047 | .inline { 4048 | display: inline; 4049 | } 4050 | 4051 | .flex { 4052 | display: flex; 4053 | } 4054 | 4055 | .table { 4056 | display: table; 4057 | } 4058 | 4059 | .hidden { 4060 | display: none; 4061 | } 4062 | 4063 | .h-full { 4064 | height: 100%; 4065 | } 4066 | 4067 | .h-1 { 4068 | height: 0.25rem; 4069 | } 4070 | 4071 | .h-5 { 4072 | height: 1.25rem; 4073 | } 4074 | 4075 | .h-6 { 4076 | height: 1.5rem; 4077 | } 4078 | 4079 | .h-7 { 4080 | height: 1.75rem; 4081 | } 4082 | 4083 | .w-80 { 4084 | width: 20rem; 4085 | } 4086 | 4087 | .w-72 { 4088 | width: 18rem; 4089 | } 4090 | 4091 | .w-full { 4092 | width: 100%; 4093 | } 4094 | 4095 | .w-1 { 4096 | width: 0.25rem; 4097 | } 4098 | 4099 | .w-5 { 4100 | width: 1.25rem; 4101 | } 4102 | 4103 | .w-24 { 4104 | width: 6rem; 4105 | } 4106 | 4107 | .w-64 { 4108 | width: 16rem; 4109 | } 4110 | 4111 | .transform { 4112 | -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); 4113 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); 4114 | } 4115 | 4116 | .resize { 4117 | resize: both; 4118 | } 4119 | 4120 | .flex-row { 4121 | flex-direction: row; 4122 | } 4123 | 4124 | .flex-col { 4125 | flex-direction: column; 4126 | } 4127 | 4128 | .items-end { 4129 | align-items: flex-end; 4130 | } 4131 | 4132 | .items-center { 4133 | align-items: center; 4134 | } 4135 | 4136 | .justify-center { 4137 | justify-content: center; 4138 | } 4139 | 4140 | .justify-between { 4141 | justify-content: space-between; 4142 | } 4143 | 4144 | .justify-around { 4145 | justify-content: space-around; 4146 | } 4147 | 4148 | .justify-evenly { 4149 | justify-content: space-evenly; 4150 | } 4151 | 4152 | .gap-4 { 4153 | gap: 1rem; 4154 | } 4155 | 4156 | .gap-3 { 4157 | gap: 0.75rem; 4158 | } 4159 | 4160 | .border { 4161 | border-width: 1px; 4162 | } 4163 | 4164 | .py-2 { 4165 | padding-top: 0.5rem; 4166 | padding-bottom: 0.5rem; 4167 | } 4168 | 4169 | .text-sm { 4170 | font-size: 0.875rem; 4171 | line-height: 1.25rem; 4172 | } 4173 | 4174 | .outline { 4175 | outline-style: solid; 4176 | } 4177 | 4178 | .blur { 4179 | --tw-blur: blur(8px); 4180 | -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); 4181 | filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); 4182 | } 4183 | 4184 | .filter { 4185 | -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); 4186 | filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); 4187 | } 4188 | 4189 | body { 4190 | margin: 0; 4191 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4192 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 4193 | sans-serif; 4194 | -webkit-font-smoothing: antialiased; 4195 | -moz-osx-font-smoothing: grayscale; 4196 | } 4197 | 4198 | code { 4199 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 4200 | monospace; 4201 | } 4202 | 4203 | --------------------------------------------------------------------------------