diff --git a/README.md b/README.md index 3493d88a0..375656ebc 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,6 @@ LinksHub Logo
-## Table of Contents - -- [Welcome to LinksHub ๐Ÿ‘‹](#welcome-to-linkshub-) - - [Demo ๐Ÿ’ป](#demo-) - - [Tech stack ๐Ÿ“š](#tech-stack-) - - [Socials ๐Ÿ“ฑ](#socials-) - - [Getting Started ๐Ÿ‘ฉโ€๐Ÿ’ป](#getting-started-) - - [Let's jump right in๐ŸŒŸ](#lets-jump-right-in) - - [_Want to add your favourite links to the Hub? make sure to follow CONTRIBUTING guidelines._](#want-to-add-your-favourite-links-to-the-hub-make-sure-to-follow-contributing-guidelines) - - [Want to add or update the descriptions of subcategories?](#want-to-add-or-update-the-descriptions-of-subcategories) - - [Building with Gitpod ๐Ÿ’ฃ](#building-with-gitpod-) - - [Top 50 Contributors โœจ](#top-50-contributors-) - - [License ๐Ÿ“](#license-) - - [Support โญ](#support-) - # Welcome to LinksHub ๐Ÿ‘‹ @@ -27,6 +12,21 @@ We recognize that there's a wealth of information available, but often, it's a m +## Table of Contents + +- [Welcome to LinksHub ๐Ÿ‘‹](#welcome-to-linkshub-) +- [Demo ๐Ÿ’ป](#demo-) +- [Tech stack ๐Ÿ“š](#tech-stack-) +- [Socials ๐Ÿ“ฑ](#socials-) +- [Getting Started ๐Ÿ‘ฉโ€๐Ÿ’ป](#getting-started-) + - [Let's jump right in๐ŸŒŸ](#lets-jump-right-in) + - [_Want to add your favourite links to the Hub? make sure to follow CONTRIBUTING guidelines._](#want-to-add-your-favourite-links-to-the-hub-make-sure-to-follow-contributing-guidelines) + - [Want to add or update the descriptions of subcategories?](#want-to-add-or-update-the-descriptions-of-subcategories) +- [Building with Gitpod ๐Ÿ’ฃ](#building-with-gitpod-) +- [Top 50 Contributors โœจ](#top-50-contributors-) +- [License ๐Ÿ“](#license-) +- [Support โญ](#support-) + ## Demo ๐Ÿ’ป You can see the live demo at: https://linkshub.vercel.app diff --git a/components/BackToTop/BackToTopButton.tsx b/components/BackToTop/BackToTopButton.tsx index ffe7861c0..7be3e28c5 100644 --- a/components/BackToTop/BackToTopButton.tsx +++ b/components/BackToTop/BackToTopButton.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react' import { useTransition } from 'react-transition-state' import { FaArrowUp } from 'react-icons/fa' import { SCROLL_LIMIT } from 'app/constants' +import { Tooltip } from 'react-tooltip' export const BackToTopButton = () => { const [scrollY, setScrollY] = useState(0) @@ -51,10 +52,13 @@ export const BackToTopButton = () => { + ๐Ÿ‘พ diff --git a/components/BackToTop/index.ts b/components/BackToTop/index.ts deleted file mode 100644 index c923a0f8b..000000000 --- a/components/BackToTop/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BackToTopButton } from './BackToTopButton' diff --git a/components/Cards/Card.tsx b/components/Cards/Card.tsx index 68367723a..e77f00f6f 100644 --- a/components/Cards/Card.tsx +++ b/components/Cards/Card.tsx @@ -1,14 +1,14 @@ import { FC, useState, useRef, useEffect } from 'react' import { BsBoxArrowUpRight } from 'react-icons/bs' -import { CopyToClipboard } from 'components/CopyToClipboard' -import { Share } from 'components/Share' +import { CopyToClipboard } from 'components/CopyToClipboard/CopyToClipboard' +import Share from 'components/Share/Share' import type { IData } from 'types' interface CardProps { data: IData } -const Card: FC = ({ data }) => { +export const Card: FC = ({ data }) => { const { name, description, url } = data const descriptionRef = useRef(null) const [isOverflow, setIsOverflow] = useState(false) @@ -25,7 +25,7 @@ const Card: FC = ({ data }) => { return (
-
+

= ({ data }) => { ) } -export default Card diff --git a/components/Cards/CardsList.tsx b/components/Cards/CardsList.tsx index e283502b0..61e74dd9a 100644 --- a/components/Cards/CardsList.tsx +++ b/components/Cards/CardsList.tsx @@ -1,6 +1,6 @@ import { FC, useState } from 'react' import { BackToTopButton } from '../BackToTop/BackToTopButton' -import Popup from 'components/popup' +import { PopupInfo } from 'components/popup/popupInfo' import CardsListItem from './CardsListItem' import type { IData } from 'types' @@ -29,7 +29,7 @@ const CardsList: FC<{ cards: IData[] }> = ({ cards }) => { ))} - + ) } diff --git a/components/Cards/CardsListItem.tsx b/components/Cards/CardsListItem.tsx index f43096a4a..2d4c6f6e9 100644 --- a/components/Cards/CardsListItem.tsx +++ b/components/Cards/CardsListItem.tsx @@ -1,5 +1,5 @@ import { FC } from 'react' -import Card from './Card' +import { Card } from './Card' import type { IData } from 'types' const CardsListItem: FC<{ data: IData; onClick: () => void }> = (props) => { diff --git a/components/CopyToClipboard/CopyToClipboard.tsx b/components/CopyToClipboard/CopyToClipboard.tsx index e28002ea7..e3f2a8a5f 100644 --- a/components/CopyToClipboard/CopyToClipboard.tsx +++ b/components/CopyToClipboard/CopyToClipboard.tsx @@ -1,6 +1,7 @@ import useCopyToClipboard from 'hooks/useCopyToClipboard' -import React, { useState } from 'react' +import React from 'react' import { FaRegCopy } from 'react-icons/fa' +import { Tooltip } from 'react-tooltip' type CopyToClipboardProps = { url: string @@ -8,7 +9,6 @@ type CopyToClipboardProps = { export const CopyToClipboard = ({ url }: CopyToClipboardProps): JSX.Element => { const [copyToClipboard, { success }] = useCopyToClipboard() - const [isHovering, setIsHovering] = useState(false) function handleCopy(e: React.MouseEvent) { e.stopPropagation() @@ -17,34 +17,17 @@ export const CopyToClipboard = ({ url }: CopyToClipboardProps): JSX.Element => { return (
setIsHovering(true)} - onMouseLeave={() => setIsHovering(false)} - > + className="dropdown dropdown-left dropdown-hover">
- + handleCopy(e)} /> - {isHovering && ( -

- {success ? 'Copied!' : 'Copy'} -

- )} + +
) } - -export default CopyToClipboard diff --git a/components/CopyToClipboard/index.ts b/components/CopyToClipboard/index.ts deleted file mode 100644 index 8cf28c770..000000000 --- a/components/CopyToClipboard/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { CopyToClipboard } from './CopyToClipboard' diff --git a/components/Searchbar/Searchbar.tsx b/components/Searchbar/Searchbar.tsx index a46016266..033f279b8 100644 --- a/components/Searchbar/Searchbar.tsx +++ b/components/Searchbar/Searchbar.tsx @@ -82,8 +82,7 @@ export const Searchbar: React.FC = ({ setSearch }) => { /> diff --git a/components/Searchbar/index.ts b/components/Searchbar/index.ts deleted file mode 100644 index 7a8d6ed05..000000000 --- a/components/Searchbar/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { Searchbar } from './Searchbar' diff --git a/components/Share/Share.tsx b/components/Share/Share.tsx index 349a532f6..24c20f2e1 100644 --- a/components/Share/Share.tsx +++ b/components/Share/Share.tsx @@ -1,5 +1,6 @@ import React, { useState } from 'react' -import { FaShareAlt } from 'react-icons/fa' +import { FiShare2 } from 'react-icons/fi' +import { Tooltip } from 'react-tooltip' type ShareProps = { url: string @@ -16,7 +17,6 @@ export const Share: React.FC = ({ url, title }) => { title: title, url: url, }) - console.log('Share was successful.') } catch (error) { console.error('Error sharing:', error) } @@ -33,15 +33,16 @@ export const Share: React.FC = ({ url, title }) => { position: 'relative', display: 'inline-block', }} - onMouseEnter={() => setShowShareOptions(true)} - onMouseLeave={() => setShowShareOptions(false)} > - + + + + {showShareOptions && (

{ const { theme } = useTheme() - const { setSearch, searchResults, debouncedSearch } = useSidebarSearch() return ( -

-
+
+
- 0} - openByDefault={''} - /> + +
+ 0} + openByDefault={''} + /> +
) } diff --git a/components/SideNavbar/index.ts b/components/SideNavbar/index.ts deleted file mode 100644 index dda377401..000000000 --- a/components/SideNavbar/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { SideNavbar } from './SideNavbar' diff --git a/components/ThemeToggler/intex.ts b/components/ThemeToggler/intex.ts deleted file mode 100644 index bdfcee8a3..000000000 --- a/components/ThemeToggler/intex.ts +++ /dev/null @@ -1 +0,0 @@ -export { ThemeToggler } from './themeToggler' diff --git a/components/TopBar/CategoryDescriptions.ts b/components/TopBar/CategoryDescriptions.ts index e63f7386c..b10dcce5f 100644 --- a/components/TopBar/CategoryDescriptions.ts +++ b/components/TopBar/CategoryDescriptions.ts @@ -3,6 +3,13 @@ type CategoryDescriptions = { } const categoryDescriptions: CategoryDescriptions = { + // devops + cicd: 'Continuous integration and continuous delivery (CI/CD) is a set of practices that combines continuous integration (CI) and continuous delivery (CD) to automate the process of software development and deployment.', + devopsLifecycle: 'DevOps is a set of practices that combines software development (Dev) and information technology operations (Ops) to shorten the systems development life cycle while delivering features, fixes, and updates frequently in close alignment with business objectives.', + devopsMethodologies: 'DevOps methodologies are a set of practices that combine software development and information technology operations to shorten the systems development life cycle while delivering features, fixes, and updates frequently in close alignment with business objectives.', + docker: 'Docker is a software platform that allows you to build, test, and deploy applications quickly. Docker packages software into standardized units called containers. These are isolated from one another and bundle their own software, libraries, and configuration files; they can also communicate with each other through well-defined channels.', + kubernetes: 'Kubernetes is an open-source container orchestration platform that automates the deployment, scaling, and management of containerized applications.', + microservices: 'Microservices are a software development techniqueโ€”a variant of the service-oriented architecture (SOA) architectural style that structures an application as a collection of loosely coupled services.', //frontend accessibility: 'Accessibility is the concept of whether a product or service can be used by everyoneโ€”however they encounter it. Accessibility laws exist to aid people with disabilities, but designers should try to accommodate all potential users in many contexts of use anyway. ', animations: 'Animation is the state of being full of life and energy, like a room full of excited kids at a birthday party. It is a method of photographing successive drawings, models, or even puppets, to create an illusion of movement in a sequence.', @@ -45,7 +52,7 @@ const categoryDescriptions: CategoryDescriptions = { // resources blogs: 'The term โ€œblogโ€ is short for โ€œweblog.โ€ Blogs are usually maintained by an individual with regular entries of commentary, descriptions of events, or other material such as graphics or video.', ebook: 'An ebook (short for electronic book) is a book publication made available in digital form, consisting of text, images, or both readable on the flat-panel display of computers or other electronic devices.', - hosting: 'Web hosting is an online service that makes your content of your website accessible on the internet. When you purchase a hosting plan, you are renting space on a physical server to store all the files and data.', + hosting: 'Web hosting is an online service that makes the content of your website accessible on the internet. When you purchase a hosting plan, you are renting space on a physical server to store all the files and data.', officialdocs: 'Official docs is short for official documentation. Official documentation is an important resource for users of software products and services as it provides a comprehensive guide to using the software.', 'project ideas': 'Projects play an important role in your resume. So here is a list of some great projects and their repositories.', // youtube diff --git a/components/TopBar/TopBar.tsx b/components/TopBar/TopBar.tsx index 9b6750a60..f72f1a0db 100644 --- a/components/TopBar/TopBar.tsx +++ b/components/TopBar/TopBar.tsx @@ -4,6 +4,7 @@ import { FaSlackHash, FaInfoCircle } from 'react-icons/fa' import PopupDesc from 'components/popup/popupCategoryDesc' import { ICategoryData } from 'types' import categoryDescriptions from './CategoryDescriptions' +import { Tooltip } from 'react-tooltip' export const TopBar: FC<{ className?: string | undefined }> = (props) => { const { className } = props @@ -36,17 +37,24 @@ export const TopBar: FC<{ className?: string | undefined }> = (props) => { className={`flex items-center text-xl dark:text-gray-300 ${className}`} > - + {category.split('-').join(' ')} - + + + -
) } diff --git a/components/popup/index.tsx b/components/popup/popupInfo.tsx similarity index 96% rename from components/popup/index.tsx rename to components/popup/popupInfo.tsx index d15521afd..0745ff811 100644 --- a/components/popup/index.tsx +++ b/components/popup/popupInfo.tsx @@ -4,9 +4,9 @@ import { BsGlobe } from 'react-icons/bs' import { Backdrop } from 'components/Backdrop/Backdrop' import { createPortal } from 'react-dom' import useDelayUnmount from 'hooks/useDelayUnmount' -import { CopyToClipboard } from 'components/CopyToClipboard' +import { CopyToClipboard } from 'components/CopyToClipboard/CopyToClipboard' -const Popup: React.FC<{ +export const PopupInfo: React.FC<{ currentCard: IData | null onClose: () => void }> = ({ currentCard, onClose }) => { @@ -83,4 +83,3 @@ const Popup: React.FC<{ ) } -export default Popup diff --git a/data/maintainersData.ts b/data/maintainersData.ts index b4ec997b1..1740bcabb 100644 --- a/data/maintainersData.ts +++ b/data/maintainersData.ts @@ -1,5 +1,6 @@ export const maintainersData = [ - { login: 'rupali-codes', name: 'Rupali Codes' }, - { login: 'CBID2', name: 'CBID2' }, + { login: 'rupali-codes', name: 'Rupali Haldiya' }, + { login: 'CBID2', name: 'Christine Belzie' }, { login: 'ujjawaltyagii', name: 'Ujjawal Tyagi' }, + { login: 'k-deepak04', name: 'Deepak Singh' }, ] diff --git a/database/DevOps/cicd.json b/database/DevOps/cicd.json new file mode 100644 index 000000000..30fcca5f2 --- /dev/null +++ b/database/DevOps/cicd.json @@ -0,0 +1,9 @@ +[ + { + "name": "Learn CI/CD by building projects", + "description": "This is an amazing blog provides projects to help you understand CI/CD.", + "url": "https://www.freecodecamp.org/news/what-is-ci-cd/", + "category": "DevOps", + "subcategory": "cicd" + } +] diff --git a/database/DevOps/devopsLifecycle.json b/database/DevOps/devopsLifecycle.json new file mode 100644 index 000000000..630c10c6d --- /dev/null +++ b/database/DevOps/devopsLifecycle.json @@ -0,0 +1,9 @@ +[ + { + "name": "DevOps Lifecycle", + "description": "Learn everything about 7 different phases of the DevOps lifecycle", + "url": "https://www.simform.com/blog/devops-lifecycle/", + "category": "DevOps", + "subcategory": "devopsLifecycle" + } +] \ No newline at end of file diff --git a/database/DevOps/devopsMethodologies.json b/database/DevOps/devopsMethodologies.json new file mode 100644 index 000000000..70bcc2bf7 --- /dev/null +++ b/database/DevOps/devopsMethodologies.json @@ -0,0 +1,9 @@ +[ + { + "name": "DevOps Methodology", + "description": "This blog post describes the approach and philosophy behind DevOps.", + "url": "https://www.cloudbees.com/blog/devops-methodology-understanding-the-approach-and-philosophy", + "category": "DevOps", + "subcategory": "devopsMethodologies" + } +] diff --git a/database/DevOps/docker.json b/database/DevOps/docker.json new file mode 100644 index 000000000..7ab86f000 --- /dev/null +++ b/database/DevOps/docker.json @@ -0,0 +1,9 @@ +[ + { + "name": "Docker", + "description": "In this blog post, you will learn how to use Docker.", + "url": "https://www.mygreatlearning.com/blog/docker-tutorial/", + "category": "DevOps", + "subcategory": "docker" + } +] diff --git a/database/DevOps/kubernetes.json b/database/DevOps/kubernetes.json new file mode 100644 index 000000000..18b9d5539 --- /dev/null +++ b/database/DevOps/kubernetes.json @@ -0,0 +1,9 @@ +[ + { + "name": "Kubernetes Basics", + "description": "This part of Kubernetes' docs teaches the basics of this program.", + "url": "https://kubernetes.io/docs/tutorials/kubernetes-basics/", + "category": "DevOps", + "subcategory": "kubernetes" + } +] diff --git a/database/DevOps/microservices.json b/database/DevOps/microservices.json new file mode 100644 index 000000000..2ce7b1fb2 --- /dev/null +++ b/database/DevOps/microservices.json @@ -0,0 +1,9 @@ +[ + { + "name": "Microservices Architecture", + "description": "Learn Microservice System Design by reading this article.", + "url": "https://sivanaikk0903.medium.com/microservices-architecture-a61fe9e48b41", + "category": "DevOps", + "subcategory": "microservices" + } +] diff --git a/database/machine_learning/data-science.json b/database/artificial_intelligence/data-science.json similarity index 85% rename from database/machine_learning/data-science.json rename to database/artificial_intelligence/data-science.json index d3d199c46..bf29e3d80 100644 --- a/database/machine_learning/data-science.json +++ b/database/artificial_intelligence/data-science.json @@ -3,28 +3,28 @@ "name": "KDnuggets", "description": "KDnuggets is a popular data science website that provides news, tutorials, and resources.", "url": "https://www.kdnuggets.com/", - "category": "ml & ai", + "category": "artificial intelligence", "subcategory": "data-science" }, { "name": "Datacamp Tutorials", "description": "Provides tutorials for aspirational full stack Data Scientists.", "url": "https://www.datacamp.com/tutorial", - "category": "ml & ai", + "category": "artificial intelligence", "subcategory": "data-science" }, { "name": "Analytics Vidhya", "description": "Analytics Vidhya is a platform for data science enthusiasts, offering tutorials, competitions, and community support.", "url": "https://www.analyticsvidhya.com/", - "category": "ml & ai", + "category": "artificial intelligence", "subcategory": "data-science" }, { "name": "Kaggle", "description": "Kaggle is an online platform that hosts data science competitions. It's also where data scientists and machine learning practitioners worldwide come and network with each other.", "url": "https://www.kaggle.com/", - "category": "ml & ai", + "category": "artificial intelligence", "subcategory": "data-science" } ] diff --git a/database/machine_learning/deep-learning.json b/database/artificial_intelligence/deep-learning.json similarity index 88% rename from database/machine_learning/deep-learning.json rename to database/artificial_intelligence/deep-learning.json index 8566d2a07..197c866df 100644 --- a/database/machine_learning/deep-learning.json +++ b/database/artificial_intelligence/deep-learning.json @@ -3,7 +3,7 @@ "name": "Distill", "description": "A platform that focuses on explaining and visualizing complex concepts in deep learning, providing in-depth articles, tutorials, and interactive visualizations to help understand and explore deep learning techniques.", "url": "https://distill.pub/", - "category": "ml & ai", + "category": "artificial intelligence", "subcategory": "deep-learning" } ] diff --git a/database/machine_learning/machine-learning.json b/database/artificial_intelligence/machine-learning.json similarity index 100% rename from database/machine_learning/machine-learning.json rename to database/artificial_intelligence/machine-learning.json diff --git a/database/backend/api.json b/database/backend/api.json new file mode 100644 index 000000000..fe6ebd4fe --- /dev/null +++ b/database/backend/api.json @@ -0,0 +1,107 @@ +[ + { + "name": "Google Maps API", + "description": "Google Maps Platform offers a free $200 monthly credit for Maps, Routes, and Places.", + "url": "https://developers.google.com/maps", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Stripe", + "description": "Stripe is a suite of payment APIs that powers commerce for online businesses of all sizes.", + "url": "https://stripe.com", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Youtube API", + "description": "The YouTube Data API (v3) lets you incorporate YouTube's functionality into your own application.", + "url": "https://developers.google.com/youtube", + "category": "backend", + "subcategory": "api" + }, + { + "name": "RapidAPI", + "description": "RapidAPI is the world's largest API marketplace with over 1,000,000 developers and 10,000 APIs.", + "url": "https://rapidapi.com", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Movie API", + "description": "The Movie API is a RESTful web service to obtain movie information, all content, and images.", + "url": "https://www.omdbapi.com", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Spotify API", + "description": "The Spotify Web API is a set of web APIs to access Spotify's database of music, artists, albums, and playlists.", + "url": "https://developer.spotify.com", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Free Weather API", + "description": "OpenWeather is a team of IT experts and data scientists that has been practicing deep weather.", + "url": "https://openweathermap.org/api", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Joke API", + "description": "The JokeAPI is a REST API that serves uniformly and well-formatted jokes.", + "url": "https://sv443.net/jokeapi/v2/", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Twitter API", + "description": "Twitter's API enables programmatic access the site in unique and advanced ways.", + "url": "https://developer.twitter.com/en/docs/twitter-api", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Facebook API", + "description": "The Facebook API is a platform for building applications that are available to the members of the social network of Facebook.", + "url": "https://developers.facebook.com", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Instagram API", + "description": "Instagram's API can be used to build non-automated, authentic, high-quality apps and services.", + "url": "https://developers.facebook.com/docs/instagram", + "category": "backend", + "subcategory": "api" + }, + { + "name": "PayPal API", + "description": "Developers can use PayPal's API to authorize payments, capture authorized payments, refund captured payments, and display payment information.", + "url": "https://developer.paypal.com/docs/api/overview", + "category": "backend", + "subcategory": "api" + }, + { + "name": "WhatsApp API", + "description": "The WhatsApp Business API is a fast, secure, and reliable way for businesses to reach their customers all over the world.", + "url": "https://developers.facebook.com/docs/whatsapp", + "category": "backend", + "subcategory": "api" + }, + { + "name": "PayTM API", + "description": "Paytm is an Indian e-commerce payment system and financial technology company, based in Noida, India.", + "url": "https://developer.paytm.com/docs", + "category": "backend", + "subcategory": "api" + }, + { + "name": "Stock API", + "description": "Alpha Vantage offers free stock APIs in JSON and CSV formats for real-time and historical equity, forex, cryptocurrency data, and over 50 technical indicators.", + "url": "https://www.alphavantage.co", + "category": "backend", + "subcategory": "api" + } +] diff --git a/database/data.ts b/database/data.ts index 80216fc6b..824373c77 100644 --- a/database/data.ts +++ b/database/data.ts @@ -72,6 +72,11 @@ export const sidebarData: ISidebar[] = [ resources: DB.systemDesign, }, { name: 'database', url: '/database', resources: DB.database }, + { + name:'APIs', + url: '/api', + resources: DB.api, + } ], }, { @@ -113,39 +118,47 @@ export const sidebarData: ISidebar[] = [ url: '/open-source-tools', resources: DB.openSourceTools, }, + { + name: 'Videos', + url: '/open-source-videos', + resources: DB.openSourceVideos, + }, ], }, { - category: 'machine learning', + category: 'devops', subcategory: [ + { name: 'CI/CD', url: '/cicd', resources: DB.cicd }, + { name: 'DevOps Life Cycle', url: '/devopsLifecycle', resources: DB.devopsLifecycle }, + { name: 'DevOps Methodologies', url: '/devopsMethodologies', resources: DB.devopsMethodologies }, + { name: 'docker', url: '/docker', resources: DB.docker }, { - name: 'machine learning', - url: '/machine-learning', - resources: DB.machineLearning, - }, - { name: 'data science', url: '/data-science', resources: DB.dataScience }, - { - name: 'deep learning', - url: '/deep-learning', - resources: DB.deepLearning, + name: 'kubernetes', + url: '/kubernetes', + resources: DB.kubernetes, }, + { name: 'microservices', url: '/microservices', resources: DB.microservices }, ], }, { category: 'artificial intelligence', subcategory: [ { - name: 'Artificial Int.', + name: 'artificial intelligence', url: '/artificial-intelligence', resources: DB.artificialIntelligence, }, - ], - }, - { - category: 'internet of things', - subcategory: [ - { name: 'coursera', url: '/coursera', resources: DB.coursera }, - { name: 'raspberry', url: '/raspberry', resources: DB.raspberrypi }, + { + name: 'machine learning', + url: '/machine-learning', + resources: DB.machineLearning, + }, + { name: 'data science', url: '/data-science', resources: DB.dataScience }, + { + name: 'deep learning', + url: '/deep-learning', + resources: DB.deepLearning, + }, ], }, { @@ -162,6 +175,13 @@ export const sidebarData: ISidebar[] = [ { name: 'IBM cloud', url: '/ibm', resources: DB.ibm }, ], }, + { + category: 'internet of things', + subcategory: [ + { name: 'coursera', url: '/coursera', resources: DB.coursera }, + { name: 'raspberry', url: '/raspberry', resources: DB.raspberrypi }, + ], + }, { category: 'resources', subcategory: [ diff --git a/database/frontend/animations.json b/database/frontend/animations.json index c042d475d..c6d7607e7 100644 --- a/database/frontend/animations.json +++ b/database/frontend/animations.json @@ -110,5 +110,12 @@ "url": "https://ianlunn.github.io/Hover/", "category": "frontend", "subcategory": "animations" + }, + { + "name": "Animate.css", + "description": "A library that provides a wide range of cross-browser CSS animations that you can easily add to your website.", + "url": "https://animate.style/", + "category": "frontend", + "subcategory": "animations" } ] \ No newline at end of file diff --git a/database/frontend/images.json b/database/frontend/images.json index 46cd4f0f8..70646f435 100644 --- a/database/frontend/images.json +++ b/database/frontend/images.json @@ -145,5 +145,12 @@ "url": "https://www.dreamstime.com/", "category": "frontend", "subcategory": "images" + }, + { + "name": "Adobe Stock", + "description": "Adobe Stock includes a wide range of stock photos, stock photography,& royalty-free images.", + "url": "https://stock.adobe.com/in/", + "category": "frontend", + "subcategory": "images" } ] diff --git a/database/index.ts b/database/index.ts index feb6b5ffe..0d8641a82 100644 --- a/database/index.ts +++ b/database/index.ts @@ -21,6 +21,16 @@ export { default as testing } from './backend/testing.json' export { default as validation } from './backend/validation.json' export { default as systemDesign } from './backend/system-design.json' export { default as database } from './backend/database.json' +export {default as api} from './backend/api.json' + +//devops +export { default as cicd } from './DevOps/cicd.json' +export { default as devopsLifecycle } from './DevOps/devopsLifecycle.json' +export { default as devopsMethodologies } from './DevOps/devopsMethodologies.json' +export { default as docker } from './DevOps/docker.json' +export { default as kubernetes } from './DevOps/kubernetes.json' +export { default as microservices } from './DevOps/microservices.json' + // languages export { default as javascript } from './languages/javascript.json' export { default as python } from './languages/python.json' @@ -34,26 +44,25 @@ export { default as Rust } from './languages/rust.json' export { default as java } from './languages/java.json' export { default as cpp } from './languages/cpp.json' export { default as dart } from './languages/dart.json' -//artificial intelligence -export { default as artificialIntelligence } from './artificial_intelligence/artificial-intelligence.json' //internet of things -export { default as coursera } from './IOT/coursera.json' -export { default as raspberrypi } from './IOT/raspberry.json' +export { default as coursera } from './internet_of_things/coursera.json' +export { default as raspberrypi } from './internet_of_things/raspberry.json' //cloud computing export { default as gcp } from './cloud_computing_platforms/gcp.json' export { default as aws } from './cloud_computing_platforms/aws.json' export { default as azure } from './cloud_computing_platforms/azure.json' export { default as oracle } from './cloud_computing_platforms/oracle.json' export { default as ibm } from './cloud_computing_platforms/ibm.json' - -//machine learning -export { default as ml } from './machine_learning/machine-learning.json' -export { default as dataScience } from './machine_learning/data-science.json' -export { default as deepLearning } from './machine_learning/deep-learning.json' +//artificial intelligence +export { default as artificialIntelligence } from './artificial_intelligence/artificial-intelligence.json' +export { default as ml } from './artificial_intelligence/machine-learning.json' +export { default as dataScience } from './artificial_intelligence/data-science.json' +export { default as deepLearning } from './artificial_intelligence/deep-learning.json' // Open-source export { default as openSourceBlogs } from './open_source/blogs.json' export { default as openSourceProjects } from './open_source/projects.json' export { default as openSourceTools } from './open_source/tools.json' +export { default as openSourceVideos } from './open_source/videos.json' // resources export { default as blogs } from './resources/blogs.json' export { default as officialdocs } from './resources/official-docs.json' diff --git a/database/IOT/coursera.json b/database/internet_of_things/coursera.json similarity index 100% rename from database/IOT/coursera.json rename to database/internet_of_things/coursera.json diff --git a/database/IOT/raspberry.json b/database/internet_of_things/raspberry.json similarity index 100% rename from database/IOT/raspberry.json rename to database/internet_of_things/raspberry.json diff --git a/database/open_source/videos.json b/database/open_source/videos.json new file mode 100644 index 000000000..ab890d3f8 --- /dev/null +++ b/database/open_source/videos.json @@ -0,0 +1,9 @@ +[ + { + "name": "How I choose Maintainers", + "description": "Even though the focus is on a specific project, this video provides great advice on how to maintain someone else's open source project.", + "url": "https://youtu.be/WPaN9vIyqt4", + "category": "open source", + "subcategory": "open-source-videos" + } +] \ No newline at end of file diff --git a/database/other/communities.json b/database/other/communities.json index 0e0464e12..81c7d8391 100644 --- a/database/other/communities.json +++ b/database/other/communities.json @@ -40,5 +40,12 @@ "url": "https://t.me/zunobyfoundit", "category": "other", "subcategory": "communities" + }, + { + "name": "AWS Educate Cloud Ambassador Program", + "description": "The AWS Educate Cloud Ambassador Program recognizes individuals for their innovation and contributions that prepare students for careers in the modern technology workforce.", + "url": "https://aws.amazon.com/education/awseducate/", + "category": "other", + "subcategory": "communities" } -] +] \ No newline at end of file diff --git a/database/other/podcasts.json b/database/other/podcasts.json index 61584d1bb..4337b487e 100644 --- a/database/other/podcasts.json +++ b/database/other/podcasts.json @@ -5,5 +5,12 @@ "url": "https://www.opensourcestories.org/", "category": "other", "subcategory": "podcasts" + }, + { + "name": "CodeNewbie Podcast", + "description": "In this podcast, Saron Yitbarek interviews a new guest every week about their coding journey, how they landed their first coding job, and more.", + "url": "https://www.codenewbie.org/podcast", + "category": "other", + "subcategory": "podcasts" } -] +] \ No newline at end of file diff --git a/database/resources/e-book.json b/database/resources/e-book.json index 44171bf5c..2cf169f2f 100644 --- a/database/resources/e-book.json +++ b/database/resources/e-book.json @@ -30,5 +30,21 @@ "category": "resource", "subcategory": "e-book", "language": "english" + }, + { + "name": "BookBoon", + "description": "With a mission to provide everyone access to helpful and practical personal development content on an easy-to-use platform, a โ€œboonโ€ is exactly what we hope to deliver.", + "url": "www.bookboon.com", + "category": "resource", + "subcategory": "e-book", + "language": "english" + }, + { + "name": "Computer Books", + "description": "This website provides free computer, mathematics, technical books to developers all over the world", + "url": "http://freecomputerbooks.com", + "category": "resource", + "subcategory": "e-book", + "language": "english" } -] +] \ No newline at end of file diff --git a/database/resources/official-docs.json b/database/resources/official-docs.json index fdc383fa7..d1dc8160c 100644 --- a/database/resources/official-docs.json +++ b/database/resources/official-docs.json @@ -75,6 +75,13 @@ "url": "https://svelte.dev/docs/introduction", "category": "resources", "subcategory": "officialdocs" + } , + { + "name": "Express", + "description": "Express is a fast, unopinionated, and minimalist web framework for Node.js", + "url": "https://svelte.dev/docs/introduction", + "category": "resources", + "subcategory": "officialdocs" } diff --git a/database/youtube/web-development.json b/database/youtube/web-development.json index 78ecab284..2da7a23c6 100644 --- a/database/youtube/web-development.json +++ b/database/youtube/web-development.json @@ -294,5 +294,13 @@ "category": "youtube", "subcategory": "web-development", "language": "english" + }, + { + "name": "Wes Bos", + "description": "This is the best website to learn Javascript. It provides 30 JS projects for learners to build in 30 days.", + "url": "https://www.youtube.com/@WesBos", + "category": "youtube", + "subcategory": "web-development", + "language": "english" } ] diff --git a/layouts/GeneralLayout.tsx b/layouts/GeneralLayout.tsx index 49baa244f..7017b11b7 100644 --- a/layouts/GeneralLayout.tsx +++ b/layouts/GeneralLayout.tsx @@ -1,6 +1,6 @@ import React, { ReactNode } from 'react' import { Footer } from 'components/Footer/Footer' -import { SideNavbar } from 'components/SideNavbar' +import { SideNavbar } from 'components/SideNavbar/SideNavbar' import { Header } from 'components/Header/Header' import { Aside } from 'components/Aside/Aside' import { SkipLink } from 'components/SkipLink/SkipLink' diff --git a/package.json b/package.json index 24645a75a..c7a3b7f46 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "react-dom": "18.2.0", "react-icons": "^4.8.0", "react-spinners": "^0.13.8", + "react-tooltip": "^5.20.0", "react-transition-state": "^2.1.0", "typescript": "5.0.3", "typewriter-effect": "^2.19.0", diff --git a/pages/_document.tsx b/pages/_document.tsx index 1686ac461..1445e9f7e 100644 --- a/pages/_document.tsx +++ b/pages/_document.tsx @@ -2,61 +2,59 @@ import { Html, Head, Main, NextScript } from 'next/document' import Script from 'next/script' export default function Document() { + const metaDescription = + 'LinksHub is the ultimate hub of ready-to-use tech resources. Discover free tools and libraries to streamline your development process and build better projects.' + const ogImageUrl = + 'https://res.cloudinary.com/dhnkuonev/image/upload/v1683805184/linkshub_gcahgs.png' + return ( - LinksHub + {/* Common Meta Tags */} + - + - {/* Should be changed on hosting the website */} + {/* Open Graph Meta Tags */} - - + + - {/* */} + + {/* Twitter Meta Tags */} - - - + + + + {/* Discord Meta Tags */} + + {/* Google Tag Manager Script */}