Compare commits

..

22 Commits

Author SHA1 Message Date
Kamran Ahmed
0c628925ae Update messaging 2025-02-11 12:35:38 +00:00
Kamran Ahmed
96de50e15b Responsiveness 2025-02-11 12:17:03 +00:00
Kamran Ahmed
f94c11d1ea Add guides and videos on dashboard 2025-02-11 11:54:07 +00:00
Kamran Ahmed
d02f0e5d54 Add questions listing on dashboard 2025-02-11 10:52:01 +00:00
Kamran Ahmed
53bb1d922a Add profile button 2025-02-11 10:31:48 +00:00
Kamran Ahmed
8ebc67baa1 Add empty message 2025-02-11 09:25:12 +00:00
Kamran Ahmed
94231874b0 Empty screen handling 2025-02-11 01:52:08 +00:00
Kamran Ahmed
d7f74b34a6 Fix spacing 2025-02-11 01:33:40 +00:00
Kamran Ahmed
e3361f96c1 Update hero title 2025-02-11 01:30:52 +00:00
Kamran Ahmed
eb0dac034d Remove global collapse expand 2025-02-11 01:08:28 +00:00
Kamran Ahmed
9e352be949 Collapse expand 2025-02-11 00:50:21 +00:00
Kamran Ahmed
452c10a893 Style updates 2025-02-11 00:38:16 +00:00
Kamran Ahmed
71c4a7d072 Add collapse expand of groups 2025-02-11 00:28:04 +00:00
Kamran Ahmed
1d3a785027 Add expand collapse in hero title 2025-02-10 23:48:10 +00:00
Kamran Ahmed
c0d4faa385 Collapse expand 2025-02-10 23:38:34 +00:00
Kamran Ahmed
0bd4c0af03 Refactor hero items group 2025-02-10 23:33:43 +00:00
Kamran Ahmed
6abc5ff916 Move to separate files 2025-02-10 23:21:20 +00:00
Kamran Ahmed
a143b0ec20 Collapse and expand 2025-02-10 23:15:12 +00:00
Kamran Ahmed
d9c25d8dff Add builtin roadmaps and best practices 2025-02-10 22:53:39 +00:00
Kamran Ahmed
3101d8ae5d Improve UI for AI roadmaps 2025-02-10 18:18:32 +00:00
Kamran Ahmed
576c307a5f Add projects toggle 2025-02-10 18:12:35 +00:00
Kamran Ahmed
393022c826 Improve personal dashboard design 2025-02-10 18:04:09 +00:00
124 changed files with 7621 additions and 5807 deletions

Binary file not shown.

View File

@@ -42,7 +42,7 @@
]
},
"mwPJh33MEUQ4Co_LiVEOb": {
"title": "Differential Calculus ",
"title": "Differential Calculus",
"description": "",
"links": [
{

View File

@@ -1,519 +0,0 @@
{
"PcYnYAAkKMbzoiCnBfjqO": {
"title": "JavaScript Fundamentals",
"description": "",
"links": []
},
"q9oQTt_NqhdWvJfA5XH1V": {
"title": "Basic Command-line Knowledge",
"description": "",
"links": []
},
"9iSdASlRxyod9YwZ2IUry": {
"title": "HTTP and Web Protocols",
"description": "",
"links": []
},
"C08pIguX1N45Iw0kh0Fvu": {
"title": "Git Basics",
"description": "",
"links": []
},
"dSBYTGGkol3MAXyg7G7_J": {
"title": "Node.js and NPM",
"description": "",
"links": []
},
"zR84MFLL6y0dygz9hXXPA": {
"title": "TypeScript Fundamentals",
"description": "",
"links": []
},
"Isl5anwDvb1MacA-JH4ej": {
"title": "Understand Serverless Architecture",
"description": "",
"links": []
},
"TB6vGzDgGZ9yAd9MGR7vw": {
"title": "Workers Runtime Environment",
"description": "",
"links": []
},
"aGWLomYHGkIfn7GFc0_Yl": {
"title": "Edge Computing Fundamentals",
"description": "",
"links": []
},
"HNEXPU6r_T7UYvwLv2wnt": {
"title": "Request/Response Handling",
"description": "",
"links": []
},
"_2UnRlbUplHvs5-Stj4O4": {
"title": "Fetch API and Runtime APIs",
"description": "",
"links": []
},
"i6L9FI6fBDXr0XtMrc_uR": {
"title": "Workers Lifecycle",
"description": "",
"links": []
},
"WZSi9inWPhqZQvDN-C8BV": {
"title": "Service Bindings",
"description": "",
"links": []
},
"uBjcQ9PJUfwzu5N_2CNjN": {
"title": "Caching Strategies",
"description": "",
"links": []
},
"aStbAF4zraqhJ-N3RH4ha": {
"title": "Middleware Patterns",
"description": "",
"links": []
},
"9ef2VPCru8lCmRxxGe-Eo": {
"title": "Bindings",
"description": "",
"links": []
},
"-8MsWNvuqwQCbLpOx_kov": {
"title": "Hono",
"description": "Hono is a small, simple and ultrafast web framework built on web standards. It works on any JavaScript runtime: Cloudflare Workers, Fastly Compute, Deno, Bun, Vercel, Netlify, AWS Lambda, Lambda@Edge, and Node.js. Hono is more known for supporting a lot more than the basics.\n\nUse-cases\n---------\n\nHono is a simple web application framework similar to the well known javascript framework Express, without a frontend. But it runs on CDN Edges and allows you to construct larger applications when combined with middleware.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Hono JS Examples",
"url": "https://github.com/honojs/examples",
"type": "opensource"
},
{
"title": "Official Documentation",
"url": "https://hono.dev/docs/",
"type": "article"
},
{
"title": "Hono.js: A Small Framework with Big Potential",
"url": "https://medium.com/@appvintechnologies/hono-js-a-small-framework-with-big-potential-15a093fc5c07",
"type": "article"
},
{
"title": "Quick Start with Hono: Simple Setup Guide",
"url": "https://dev.to/koshirok096/quick-start-with-hono-simple-setup-guide-bite-sized-article-lhe",
"type": "article"
},
{
"title": "Learn with me",
"url": "https://www.youtube.com/watch?v=gY-TK33G6kQ",
"type": "video"
}
]
},
"15jl6CSCkqnh_eFfysLDM": {
"title": "Itty Router",
"description": "Itty Router is a lightweight router with the motto \"less is more\" that supports Cloudflare workers and pages. While other libraries may suffer from feature creep/bloat to please a wider audience, Itty Router painfully consider every single byte added to itty. Our router options range from ~450 bytes to ~970 bytes for a batteries-included version with built-in defaults, error handling, formatting, etc. On top of that, the following concepts aim to keep YOUR code tiny (and readable) as well.\n\nSimple Projects ideas\n---------------------\n\nItty Router is a lightweight router system that supports typescript. You can create easy and good routers for Cloudflare workers or pages. With a simple project like a URL shortener, you can use Itty Router and Cloudflare KV.\n\nOther project ideas can be found:\n\n* Webhook Relay\n * Transform webhook data or API data towards another API so you can transform the data as you like.\n* Micro URL Monitoring\n * Monitor any URL and give back responses on the specific endpoint.\n* Single-Use Download Links (Watch out for costs from Cloudflare!)\n * Generate links that expire after one download, ideal for file sharing.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Official Documentation",
"url": "https://itty.dev/itty-router/",
"type": "article"
}
]
},
"Tzx93tvoGrc9_fKQqkorN": {
"title": "Wrangler",
"description": "",
"links": []
},
"uoaOrypiMkyoikXvTHeVS": {
"title": "DevTools Integration",
"description": "",
"links": []
},
"8Y6TIYoWIXrxtmzDVdS0b": {
"title": "CI/CD Pipelines",
"description": "",
"links": []
},
"zSwio18XdBfqwSneAx_AP": {
"title": "Any Frontend Framework",
"description": "",
"links": []
},
"o4sBgniPmLqwej6TlIPcl": {
"title": "Miniflare",
"description": "",
"links": []
},
"1dGFfQauOgHP7T4ReMpCU": {
"title": "Workers KV",
"description": "",
"links": []
},
"EBTHbXOOZiqrcYJvKhcWV": {
"title": "Key-value Operations",
"description": "",
"links": []
},
"sQlRIYLnZcugATgpogJmw": {
"title": "Metadata Handling",
"description": "",
"links": []
},
"i64-aCpZHygq76fBU6eXD": {
"title": "Bulk Operations",
"description": "",
"links": []
},
"OgW-iIrJZ5-sOWKnFpIZd": {
"title": "Caching Patterns",
"description": "",
"links": []
},
"gxLUlXGuaY5Q-0xmBgQwz": {
"title": "R2 Storage",
"description": "",
"links": []
},
"K9iW2H6riKwddWmpWJFJw": {
"title": "Object Storage",
"description": "",
"links": []
},
"BPahk1qH9Hk11tsE2hw3A": {
"title": "Large File Handling",
"description": "",
"links": []
},
"3jU5753Uza2aS-gZo7w4k": {
"title": "Asset Management",
"description": "",
"links": []
},
"UNE6XK4su5r2jcxhY7hOG": {
"title": "Bucket Operations",
"description": "",
"links": []
},
"YvgmmF9sWfURgijFV7E31": {
"title": "Bucket Lifecycle",
"description": "",
"links": []
},
"mKN0Ta3zSk7PCm_uHYKFN": {
"title": "D1",
"description": "",
"links": []
},
"PnhP47woPJb_JnLpMMiTw": {
"title": "Schema Management",
"description": "",
"links": []
},
"M8rSSVFUHixgWZRfaBPHb": {
"title": "Migrations",
"description": "",
"links": []
},
"65xDESm6jbHWkVO4NgHqx": {
"title": "Query Optimization",
"description": "",
"links": []
},
"MpWO1sroeF106SEMU1V1a": {
"title": "Drizzle",
"description": "",
"links": []
},
"h3MHLZZwkYqqb5PSfMhpB": {
"title": "Prisma",
"description": "",
"links": []
},
"zyRgTtlng6idboSgL9YTt": {
"title": "Queues",
"description": "",
"links": []
},
"EFA8m0EdhygxcBWzwmbnT": {
"title": "Message Processing",
"description": "",
"links": []
},
"qgvDGyLjc6lMmVPjHozFM": {
"title": "Background Jobs",
"description": "",
"links": []
},
"MInAsLLJtIq6WQDSj5yGH": {
"title": "Rate Limiting",
"description": "",
"links": []
},
"Grl59SjY31Q3sgf9uX-xf": {
"title": "Dead Letter Queues",
"description": "",
"links": []
},
"G-xBbtaniYFRE9Dgs18px": {
"title": "Durable Objects",
"description": "",
"links": []
},
"EQjhRlM7zpANNWkypScIl": {
"title": "State Management",
"description": "",
"links": []
},
"RYm0oBFCxm-S-aCwZ21p6": {
"title": "Coordination",
"description": "",
"links": []
},
"36w4Q73XkCwo5Cva0XsF8": {
"title": "Persistence",
"description": "",
"links": []
},
"rxxibrJUo1rQ3XCuUIP59": {
"title": "Transactional Operations",
"description": "",
"links": []
},
"rAl7zXcODiqIpS__3qf1A": {
"title": "Workflows",
"description": "",
"links": []
},
"a0S0_JLwLLNGLUAHrqG4P": {
"title": "Workers AI",
"description": "",
"links": []
},
"zMwmoCUp9429_aXU-Bz4H": {
"title": "Text Generation",
"description": "",
"links": []
},
"S7laV14zsx31O0Tsj2SRL": {
"title": "Image Processing",
"description": "",
"links": []
},
"HJbJ8OxjJzznYwLlIOSO2": {
"title": "Speech Rcognition",
"description": "",
"links": []
},
"QxPoNHsL-Pj_z3aU6qEP4": {
"title": "AI Model Integration",
"description": "",
"links": []
},
"NWGVtH1vxQuO4lly0Omuy": {
"title": "Vectorize",
"description": "",
"links": []
},
"UIWaR1ZdjSm0UAS69Kz_5": {
"title": "Vector Embeddings",
"description": "",
"links": []
},
"pg3GtykCegK411DYDN8sN": {
"title": "Similarity Search",
"description": "",
"links": []
},
"Ep9_oV_YnkbH1gHM-n3gO": {
"title": "AI-powered Search",
"description": "",
"links": []
},
"LoT3NtpNj9uAgQRV-MD_E": {
"title": "Stream",
"description": "",
"links": []
},
"zQp7XfDKWJgMf2LexRJhN": {
"title": "Video Delivery",
"description": "",
"links": []
},
"RiQSPAV9uRFgwQFJckTFV": {
"title": "Live streaming",
"description": "",
"links": []
},
"3B6Z7F0D3Sf8ZBlV3kkGx": {
"title": "Video Processing",
"description": "",
"links": []
},
"8bOWuopxHtBWUSFaVT54P": {
"title": "Images",
"description": "",
"links": []
},
"vHQdMgaL2EEr2o_eJmOuV": {
"title": "Calls",
"description": "",
"links": []
},
"aKEH4ZxI6J1nwjp_AgH5r": {
"title": "Logging and Monitoring",
"description": "",
"links": []
},
"z-1Ye5hcNdr9r6Gwdw7mv": {
"title": "Email Workers",
"description": "",
"links": []
},
"-lsYPD6JueIV94RybGH_Y": {
"title": "Routing",
"description": "",
"links": []
},
"6bNUqx5f_w5NuDL25BABN": {
"title": "Processing",
"description": "",
"links": []
},
"kdIfqTCcOSvV4KDpjr7nu": {
"title": "Filtering",
"description": "",
"links": []
},
"vu8yJsS1WccsdcEVUqwNd": {
"title": "AI Gateway",
"description": "",
"links": []
},
"qkFRW_tJB8_1IYpYskQ5M": {
"title": "Browser Rendering",
"description": "",
"links": []
},
"76xovsBrKOnlRBVjsqNq1": {
"title": "Security & Performance",
"description": "",
"links": []
},
"8IF7jftushwZrn7JXpC_v": {
"title": "Workers Security Model",
"description": "",
"links": []
},
"uNinrB9wm5ahjGXu5fc0g": {
"title": "Isolates Architecture",
"description": "",
"links": []
},
"KWix4jeNUKJ07Iu95Mqj_": {
"title": "Web Security Headers",
"description": "",
"links": []
},
"JP5U6c2fZjtkU-Xzwtapx": {
"title": "Rate Limiting",
"description": "",
"links": []
},
"ui3pUfsGMxv4WRzHkgbF0": {
"title": "Cache API",
"description": "",
"links": []
},
"INiqdtppBmCthOEXuHb-V": {
"title": "HTML Rewriting",
"description": "",
"links": []
},
"sXBxaQtwJ-luGVXdqVXk1": {
"title": "Edge SSL/TLS",
"description": "",
"links": []
},
"So-cKAVfbgsw2zzFREu7Q": {
"title": "Bot Management",
"description": "",
"links": []
},
"wvurOKbemF4Tt2WZcmqDL": {
"title": "Integration & Workflows",
"description": "",
"links": []
},
"SaHqm7T4FFVrsgyfImo66": {
"title": "Pages Functions",
"description": "",
"links": []
},
"JfpVexcbuWCx_R3EjFmbo": {
"title": "Service Bindings",
"description": "",
"links": []
},
"jYAUIKozuhsNK5LbkeAJ6": {
"title": "Inter Worker Communication",
"description": "",
"links": []
},
"4g5w6IAdzefdlRTxbRbdS": {
"title": "External API Integration",
"description": "",
"links": []
},
"uOUjI6CPrhZIlz6mRCtOW": {
"title": "Webhook Handling",
"description": "",
"links": []
},
"Z9Yywlf7rXFBtxTq5B2Y5": {
"title": "Event-driven Architectures",
"description": "",
"links": []
},
"gsCRhwwjXuyueaYHSPOVZ": {
"title": "Development Tools",
"description": "",
"links": []
},
"n0vIbHmUZHrF4WjEhYdb8": {
"title": "Wrangler",
"description": "",
"links": []
},
"vZHBp4S6WaS5sa5rfUOk-": {
"title": "Miniflare",
"description": "",
"links": []
},
"G6YQZUQh_x8Qxm1oBseLQ": {
"title": "DevTools",
"description": "",
"links": []
},
"jyWxaMx7_nojt5HsyAv7K": {
"title": "Testing Frameworks",
"description": "",
"links": []
},
"Cy2T8978yUAPGol-yzxv_": {
"title": "Monitoring Tools",
"description": "",
"links": []
},
"TmQC7fTL6b9EsBDYibv4g": {
"title": "Debugging Techniques",
"description": "",
"links": []
},
"8WZpSKBHCeYfTEL9tBNKr": {
"title": "Tunnels",
"description": "",
"links": []
}
}

View File

@@ -1326,10 +1326,16 @@
}
]
},
"queu-based-load-leveling@LncTxPg-wx8loy55r5NmV.md": {
"LncTxPg-wx8loy55r5NmV": {
"title": "Queu-based Load Leveling",
"description": "",
"links": []
"description": "Use a queue that acts as a buffer between a task and a service it invokes in order to smooth intermittent heavy loads that can cause the service to fail or the task to time out. This can help to minimize the impact of peaks in demand on availability and responsiveness for both the task and the service.\n\nLearn more from the following links:",
"links": [
{
"title": "Queue-Based Load Leveling pattern",
"url": "https://learn.microsoft.com/en-us/azure/architecture/patterns/queue-based-load-leveling",
"type": "article"
}
]
},
"2ryzJhRDTo98gGgn9mAxR": {
"title": "Publisher/Subscriber",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 506 KiB

View File

@@ -43,7 +43,6 @@ Here is the list of available roadmaps with more being actively worked upon.
- [AI and Data Scientist Roadmap](https://roadmap.sh/ai-data-scientist)
- [AI Engineer Roadmap](https://roadmap.sh/ai-engineer)
- [AWS Roadmap](https://roadmap.sh/aws)
- [Cloudflare Roadmap](https://roadmap.sh/cloudflare)
- [Linux Roadmap](https://roadmap.sh/linux)
- [Terraform Roadmap](https://roadmap.sh/terraform)
- [Data Analyst Roadmap](https://roadmap.sh/data-analyst)

View File

@@ -5,7 +5,7 @@ import {
COURSE_PURCHASE_PARAM,
setAuthToken,
} from '../../lib/jwt';
import { cn } from '../../lib/classname.ts';
import { cn } from '../../../editor/utils/classname.ts';
import { httpGet } from '../../lib/http';
import { Spinner } from '../ReactIcons/Spinner.tsx';
import { CHECKOUT_AFTER_LOGIN_KEY } from './CourseLoginPopup.tsx';

View File

@@ -82,16 +82,17 @@ export function DashboardPage(props: DashboardPageProps) {
'striped-loader-slate': isLoading,
})}
>
<div className="bg-slate-800/30 py-5 min-h-[70px]">
<div className="bg-slate-800/30 py-5">
<div className="container flex flex-wrap items-center gap-1.5">
<DashboardTabButton
label="Personal"
isActive={!selectedTeamId && !isTeamPage}
href="/dashboard"
avatar={userAvatar}
/>
{!isLoading && (
<>
<DashboardTabButton
label="Personal"
isActive={!selectedTeamId && !isTeamPage}
href="/dashboard"
avatar={userAvatar}
/>
{teamList.map((team) => {
const { avatar } = team;
const avatarUrl = avatar

View File

@@ -1,25 +1,22 @@
import { useStore } from '@nanostores/react';
import {
ChartColumn,
CheckCircle,
CheckSquare,
FolderGit2,
Pencil,
SquarePen,
Zap,
type LucideIcon
type LucideIcon,
} from 'lucide-react';
import { useEffect, useState } from 'react';
import type { AllowedProfileVisibility } from '../../api/user.ts';
import { useToast } from '../../hooks/use-toast';
import { cn } from '../../lib/classname.ts';
import type { GuideFileType } from '../../lib/guide';
import { httpGet } from '../../lib/http';
import type { QuestionGroupType } from '../../lib/question-group';
import type { AllowedRoadmapRenderer } from '../../lib/roadmap.ts';
import type { VideoFileType } from '../../lib/video';
import { $accountStreak, type StreakResponse } from '../../stores/streak';
import type { PageType } from '../CommandMenu/CommandMenu';
import { FeaturedGuideList } from '../FeaturedGuides/FeaturedGuideList';
import { FeaturedVideoList } from '../FeaturedVideos/FeaturedVideoList';
import {
FavoriteRoadmaps,
type AIRoadmapType,
@@ -27,21 +24,12 @@ import {
import { HeroRoadmap } from '../HeroSection/HeroRoadmap.tsx';
import type { ProjectStatusDocument } from '../Projects/ListProjectSolutions';
import type { UserProgress } from '../TeamProgress/TeamProgressPage';
const projectGroups = [
{
title: 'Frontend',
id: 'frontend',
},
{
title: 'Backend',
id: 'backend',
},
{
title: 'DevOps',
id: 'devops',
},
];
import { projectGroups } from '../../pages/index.astro';
import type { QuestionGroupType } from '../../lib/question-group';
import { FeaturedGuideList } from '../FeaturedGuides/FeaturedGuideList';
import { FeaturedVideoList } from '../FeaturedVideos/FeaturedVideoList';
import type { GuideFileType } from '../../lib/guide';
import type { VideoFileType } from '../../lib/video';
type UserDashboardResponse = {
name: string;

View File

@@ -257,12 +257,6 @@ const groups: GroupType[] = [
type: 'skill',
otherGroups: ['Web Development'],
},
{
title: 'Cloudflare',
link: '/cloudflare',
type: 'skill',
otherGroups: ['Web Development'],
},
{
title: 'Linux',
link: '/linux',

View File

@@ -1,163 +0,0 @@
import { ChevronDownIcon, StarIcon, User2Icon } from 'lucide-react';
import { useState } from 'react';
import { cn } from '../../../editor/utils/classname';
import { markdownToHtml } from '../../lib/markdown';
type Review = {
name: string;
role: string;
rating: number;
text: string;
avatarUrl?: string;
};
export function ReviewsSection() {
const [isExpanded, setIsExpanded] = useState(false);
const reviews: Review[] = [
{
name: 'Tomáš Janků',
role: 'Software Engineer',
rating: 5,
text: "The course and it's interactivity is excellent and I'd honestly say it's **one of the best** on the SQL theme I've seen out there.",
avatarUrl: 'https://github.com/jankudev.png',
},
{
name: 'Gourav Khunger',
role: 'Software Engineer',
rating: 5,
text: 'This course was **absolutely brilliant!** The integrated database environment to practice what I learned was the best part.',
avatarUrl: 'https://github.com/gouravkhunger.png',
},
{
name: 'Meabed',
role: 'CTO',
rating: 5,
text: 'Kamran has **clearly put a lot of thought** into this course. The content, structure and exercises were all great.',
avatarUrl: 'https://github.com/meabed.png',
},
{
name: 'Mohsin Aheer',
role: 'Sr. Software Engineer',
rating: 5,
text: 'I already knew SQL but this course **taught me a bunch of new things.** Practical examples and challenges were great. Highly recommended!',
avatarUrl: 'https://github.com/aheermohsinse.png',
},
{
name: 'Reeve Tee',
role: 'Software Engineer',
rating: 5,
text: 'I found the course **highly comprehensive and incredibly valuable**. I would love to see more courses like this!',
avatarUrl: '',
},
{
name: 'Zeeshan',
role: 'Sr. Software Engineer',
rating: 5,
text: 'Loved the teaching style and the way the course was structured. The **AI tutor was a great help** when I got stuck.',
avatarUrl: 'https://github.com/ziishaned.png',
},
{
name: 'Adnan Ahmed',
role: 'Engineering Manager',
rating: 5,
text: 'Having the integrated IDE made a huge difference. Being able to immediately practice what I learned was **invaluable**.',
avatarUrl: 'https://github.com/idnan.png',
},
{
name: 'Kalvin Chakma',
role: 'Jr. Software Engineer',
rating: 5,
text: "Best SQL course I've taken. The progression from basic to advanced concepts is **well thought out**, and the challenges are **excellent**.",
avatarUrl: 'https://github.com/kalvin-chakma.png',
},
{
name: 'Faisal Ahsan',
role: 'Software Engineer',
rating: 5,
text: 'The course and the learning experience was great. What I really liked was the **no-fluff explanations** and practical examples.',
avatarUrl: 'https://github.com/faisalahsan.png',
},
];
return (
<div className="relative max-w-5xl">
<div
className={cn('rounded-2xl pb-0 pt-24', {
'pb-8': isExpanded,
})}
>
<div
className={cn(
'relative grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3',
isExpanded ? '' : 'max-h-[400px] overflow-hidden',
)}
>
{reviews.map((review, index) => (
<div
key={index}
className="review-testimonial flex-shrink-0 break-inside-avoid-column rounded-xl bg-zinc-800/30 p-6 backdrop-blur [&_strong]:font-normal [&_strong]:text-yellow-300/70"
>
<div className="flex items-center gap-4">
{review.avatarUrl && (
<img
src={review.avatarUrl}
alt={review.name}
className="h-12 w-12 rounded-full object-cover"
/>
)}
{!review.avatarUrl && (
<div className="flex h-12 w-12 items-center justify-center rounded-full bg-zinc-800">
<User2Icon className="h-6 w-6 text-zinc-400" />
</div>
)}
<div>
<h3 className="font-semibold text-zinc-100">{review.name}</h3>
<p className="text-sm text-zinc-400">{review.role}</p>
</div>
</div>
<div className="mt-2 flex">
{Array.from({ length: review.rating }).map((_, i) => (
<StarIcon
key={i}
className="h-4 w-4 fill-yellow-500 text-yellow-500"
/>
))}
</div>
<p
className="mt-4 text-zinc-300"
dangerouslySetInnerHTML={{
__html: markdownToHtml(review.text),
}}
/>
</div>
))}
<div
className={cn(
'absolute bottom-0 left-0 right-0 h-40 bg-gradient-to-t from-[#121212] via-[#121212]/80 to-transparent',
isExpanded ? 'opacity-0' : 'opacity-100',
)}
/>
</div>
</div>
<div
className={cn('absolute left-1/2 top-full -translate-x-1/2', {
'-translate-y-1/2': !isExpanded,
})}
>
<button
onClick={() => setIsExpanded(!isExpanded)}
className="flex items-center gap-2 rounded-full bg-zinc-800 px-6 py-2 text-sm font-medium text-zinc-300 transition-all hover:bg-zinc-700 hover:text-zinc-100"
>
{isExpanded ? 'Show Less' : 'Show More Reviews'}
<ChevronDownIcon
className={`h-4 w-4 transition-transform ${
isExpanded ? 'rotate-180' : ''
}`}
/>
</button>
</div>
</div>
);
}

View File

@@ -14,7 +14,6 @@ import {
LayersIcon,
TableIcon,
WrenchIcon,
StarIcon,
} from 'lucide-react';
import { ChapterRow } from './ChapterRow';
import { CourseFeature } from './CourseFeature';
@@ -28,7 +27,6 @@ import { AccountButton } from './AccountButton';
import { RoadmapLogoIcon } from '../ReactIcons/RoadmapLogo';
import { PlatformDemo } from './PlatformDemo';
import { AuthorQuoteMessage } from './AuthorQuoteMessage';
import { ReviewsSection } from './ReviewsSection';
type ChapterData = {
icon: React.ReactNode;
title: string;
@@ -256,9 +254,8 @@ export function SQLCoursePage() {
</a>
<AccountButton />
</div>
<div className="relative mt-7 max-w-4xl text-left md:mt-20 md:text-center">
<div className="relative mt-7 max-w-3xl text-left md:mt-20 md:text-center">
<Spotlight className="left-[-170px] top-[-200px]" fill="#EAB308" />
<div className="inline-block rounded-full bg-yellow-500/10 px-4 py-1.5 text-base text-yellow-500 md:px-6 md:py-2 md:text-lg">
<span className="hidden sm:block">
Complete Course to Master Practical SQL
@@ -302,8 +299,6 @@ export function SQLCoursePage() {
</div>
</div>
<ReviewsSection />
<AuthorQuoteMessage />
<PlatformDemo />

View File

@@ -1,8 +1,7 @@
import '../FrameRenderer/FrameRenderer.css';
import '../EditorRoadmap/EditorRoadmapRenderer.css';
import { useEffect, useRef, useState } from 'react';
import { wireframeJSONToSVG } from 'roadmap-renderer';
import { Spinner } from '../ReactIcons/Spinner';
import '../FrameRenderer/FrameRenderer.css';
import { useOutsideClick } from '../../hooks/use-outside-click';
import { useKeydown } from '../../hooks/use-keydown';
import type { TeamMember } from './TeamProgressPage';
@@ -19,9 +18,6 @@ import { pageProgressMessage } from '../../stores/page';
import { MemberProgressModalHeader } from './MemberProgressModalHeader';
import { replaceChildren } from '../../lib/dom.ts';
import { XIcon } from 'lucide-react';
import type { PageType } from '../CommandMenu/CommandMenu.tsx';
import { renderFlowJSON } from '../../../editor/renderer/renderer.ts';
import { getResourceMeta } from '../../lib/roadmap.ts';
export type ProgressMapProps = {
member: TeamMember;
@@ -60,7 +56,6 @@ export function MemberProgressModal(props: ProgressMapProps) {
useState<MemberProgressResponse>();
const [isLoading, setIsLoading] = useState(true);
const toast = useToast();
const [renderer, setRenderer] = useState<PageType['renderer']>('balsamiq');
let resourceJsonUrl = import.meta.env.DEV
? 'http://localhost:3000'
@@ -93,25 +88,14 @@ export function MemberProgressModal(props: ProgressMapProps) {
}
async function renderResource(jsonUrl: string) {
const page = await getResourceMeta(resourceType, resourceId);
if (!page) {
toast.error('Resource not found');
return;
}
const renderer = page.renderer || 'balsamiq';
setRenderer(renderer);
const res = await fetch(jsonUrl, {});
const json = await res.json();
const svg =
renderer === 'editor'
? await renderFlowJSON(json as any)
: await wireframeJSONToSVG(json, {
fontURL: '/fonts/balsamiq.woff2',
});
const svg: SVGElement | null = await wireframeJSONToSVG(json, {
fontURL: '/fonts/balsamiq.woff2',
});
replaceChildren(containerEl.current!, svg);
// containerEl.current?.replaceChildren(svg);
}
useKeydown('Escape', () => {
@@ -152,10 +136,10 @@ export function MemberProgressModal(props: ProgressMapProps) {
skipped = [],
} = memberProgress;
done.forEach((id) => renderTopicProgress(id, 'done'));
learning.forEach((id) => renderTopicProgress(id, 'learning'));
skipped.forEach((id) => renderTopicProgress(id, 'skipped'));
removed.forEach((id) => renderTopicProgress(id, 'removed'));
done.forEach((id: string) => renderTopicProgress(id, 'done'));
learning.forEach((id: string) => renderTopicProgress(id, 'learning'));
skipped.forEach((id: string) => renderTopicProgress(id, 'skipped'));
removed.forEach((id: string) => renderTopicProgress(id, 'removed'));
})
.catch((err) => {
console.error(err);
@@ -278,7 +262,7 @@ export function MemberProgressModal(props: ProgressMapProps) {
return (
<div className="fixed left-0 right-0 top-0 z-[100] h-full items-center justify-center overflow-y-auto overflow-x-hidden overscroll-contain bg-black/50">
<div
id={renderer === 'editor' ? undefined : 'customized-roadmap'}
id={'customized-roadmap'}
className="relative mx-auto h-full w-full max-w-4xl p-4 md:h-auto"
>
<div

View File

@@ -11,6 +11,7 @@ import { useAuth } from '../../hooks/use-auth';
import { ModalLoader } from './ModalLoader.tsx';
import { UserProgressModalHeader } from './UserProgressModalHeader';
import { X } from 'lucide-react';
import type { PageType } from '../CommandMenu/CommandMenu.tsx';
import type { AllowedRoadmapRenderer } from '../../lib/roadmap.ts';
import { renderFlowJSON } from '../../../editor/renderer/renderer.ts';

File diff suppressed because it is too large Load Diff

View File

@@ -4,6 +4,6 @@ Machine learning is a field of artificial intelligence that uses statistical tec
Learn more from the following resources:
- [@article@Advantages and Disadvantages of AI](https://medium.com/@laners.org/advantages-and-disadvantages-of-artificial-intelligence-cd6e42819b20)
- [@article@Reinforcement Learning 101](https://medium.com/towards-data-science/reinforcement-learning-101-e24b50e1d292)
- [@article@Understanding AUC-ROC Curve](https://medium.com/towards-data-science/understanding-auc-roc-curve-68b2303cc9c5)
- [@article@Advantages and Disadvantages of AI](https://towardsdatascience.com/advantages-and-disadvantages-of-artificial-intelligence-182a5ef6588c)
- [@article@Reinforcement Learning 101](https://towardsdatascience.com/reinforcement-learning-101-e24b50e1d292)
- [@article@Understanding AUC-ROC Curve](https://towardsdatascience.com/understanding-auc-roc-curve-68b2303cc9c5)

File diff suppressed because it is too large Load Diff

View File

@@ -1,64 +0,0 @@
---
jsonUrl: '/jsons/roadmaps/cloudflare.json'
pdfUrl: '/pdfs/roadmaps/cloudflare.pdf'
order: 21
briefTitle: 'Cloudflare'
briefDescription: 'Learn to deploy your applications on Cloudflare'
title: 'Cloudflare'
description: 'Learn to deploy your applications on Cloudflare'
isNew: true
hasTopics: true
renderer: editor
dimensions:
width: 968
height: 2700
schema:
headline: 'Cloudflare Roadmap'
description: 'Learn how to use Cloudflare with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
imageUrl: 'https://roadmap.sh/roadmaps/cloudflare.png'
datePublished: '2025-02-12'
dateModified: '2025-02-12'
seo:
title: 'Cloudflare Roadmap - roadmap.sh'
description: 'Step by step guide to learn Cloudflare in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
keywords:
- 'cloudflare tutorial'
- 'step by step guide for cloudflare'
- 'cloudflare for beginners'
- 'how to learn cloudflare'
- 'use cloudflare in production'
- 'cloudflare roadmap 2024'
- 'guide to learning cloudflare'
- 'cloudflare roadmap'
- 'cloudflare learning path'
- 'cloudflare learning roadmap'
- 'container roadmap'
- 'cloudflare'
- 'cloudflare learning guide'
- 'cloudflare skills'
- 'cloudflare for development'
- 'cloudflare for development skills'
- 'cloudflare for development skills test'
- 'cloudflare learning guide'
- 'become a cloudflare expert'
- 'cloudflare career path'
- 'learn cloudflare for development'
- 'what is cloudflare'
- 'cloudflare quiz'
- 'cloudflare interview questions'
relatedRoadmaps:
- 'devops'
- 'backend'
- 'full-stack'
- 'javascript'
- 'nodejs'
- 'aws'
- 'linux'
sitemap:
priority: 1
changefreq: 'monthly'
tags:
- 'roadmap'
- 'main-sitemap'
- 'skill-roadmap'
---

View File

@@ -1 +0,0 @@
# Basic Command-line Knowledge

View File

@@ -1,13 +0,0 @@
# Hono
Hono is a small, simple and ultrafast web framework built on web standards. It works on any JavaScript runtime: Cloudflare Workers, Fastly Compute, Deno, Bun, Vercel, Netlify, AWS Lambda, Lambda@Edge, and Node.js. Hono is more known for supporting a lot more than the basics.
## Use-cases
Hono is a simple web application framework similar to the well known javascript framework Express, without a frontend. But it runs on CDN Edges and allows you to construct larger applications when combined with middleware.
Visit the following resources to learn more:
- [@official@Official Documentation](https://hono.dev/docs/)
- [@article@Hono.js: A Small Framework with Big Potential](https://medium.com/@appvintechnologies/hono-js-a-small-framework-with-big-potential-15a093fc5c07)
- [@article@Quick Start with Hono: Simple Setup Guide](https://dev.to/koshirok096/quick-start-with-hono-simple-setup-guide-bite-sized-article-lhe)
- [@opensource@Hono JS Examples](https://github.com/honojs/examples)
- [@video@Learn with me](https://www.youtube.com/watch?v=gY-TK33G6kQ)

View File

@@ -1,19 +0,0 @@
# Itty Router
Itty Router is a lightweight router with the motto "less is more" that supports Cloudflare workers and pages. While other libraries may suffer from feature creep/bloat to please a wider audience, Itty Router painfully consider every single byte added to itty. Our router options range from ~450 bytes to ~970 bytes for a batteries-included version with built-in defaults, error handling, formatting, etc. On top of that, the following concepts aim to keep YOUR code tiny (and readable) as well.
## Simple Projects ideas
Itty Router is a lightweight router system that supports typescript. You can create easy and good routers for Cloudflare workers or pages.
With a simple project like a URL shortener, you can use Itty Router and Cloudflare KV.
Other project ideas can be found:
- Webhook Relay
- Transform webhook data or API data towards another API so you can transform the data as you like.
- Micro URL Monitoring
- Monitor any URL and give back responses on the specific endpoint.
- Single-Use Download Links (Watch out for costs from Cloudflare!)
- Generate links that expire after one download, ideal for file sharing.
Visit the following resources to learn more:
- [@official@Official Documentation](https://itty.dev/itty-router/)

Some files were not shown because too many files have changed in this diff Show More