wip: tailwind upgrade

feat/pkg-upgrade
Arik Chakma 3 months ago
parent aab03074f8
commit b22cb4e7a9
  1. 10
      astro.config.mjs
  2. 8
      package.json
  3. 927
      pnpm-lock.yaml
  4. 2
      src/components/AccountSidebar.astro
  5. 4
      src/components/AccountStreak/AccountStreak.tsx
  6. 18
      src/components/AccountStreak/AccountStreakHeatmap.tsx
  7. 2
      src/components/Activity/ActivityTopicsModal.tsx
  8. 2
      src/components/Activity/ProjectProgress.tsx
  9. 2
      src/components/Activity/ResourceProgress.tsx
  10. 12
      src/components/AddTeamRoadmap.tsx
  11. 10
      src/components/AdvertiseForm.tsx
  12. 6
      src/components/AuthenticationFlow/CourseLoginPopup.tsx
  13. 6
      src/components/AuthenticationFlow/EmailLoginForm.tsx
  14. 8
      src/components/AuthenticationFlow/EmailSignupForm.tsx
  15. 4
      src/components/AuthenticationFlow/ForgotPasswordForm.tsx
  16. 2
      src/components/AuthenticationFlow/GitHubButton.tsx
  17. 2
      src/components/AuthenticationFlow/GoogleButton.tsx
  18. 2
      src/components/AuthenticationFlow/LinkedInButton.tsx
  19. 6
      src/components/AuthenticationFlow/ResetPasswordForm.tsx
  20. 30
      src/components/Befriend.tsx
  21. 2
      src/components/BestPracticeHeader.astro
  22. 4
      src/components/Changelog/ChangelogItem.astro
  23. 4
      src/components/Changelog/ChangelogLaunch.astro
  24. 6
      src/components/ChangelogBanner.astro
  25. 6
      src/components/CommandMenu/CommandMenu.tsx
  26. 6
      src/components/CreateTeam/SelectRoadmapModal.tsx
  27. 2
      src/components/CreateTeam/Step0.tsx
  28. 2
      src/components/CreateTeam/Step2.tsx
  29. 4
      src/components/CreateTeam/Step3.tsx
  30. 4
      src/components/CreateTeam/UpdateTeamResourceModal.tsx
  31. 2
      src/components/CustomRoadmap/EmbedRoadmapModal.tsx
  32. 8
      src/components/CustomRoadmap/PersonalRoadmapActionDropdown.tsx
  33. 4
      src/components/CustomRoadmap/PersonalRoadmapList.tsx
  34. 8
      src/components/CustomRoadmap/RoadmapActionButton.tsx
  35. 4
      src/components/CustomRoadmap/ShareRoadmapModal.tsx
  36. 2
      src/components/CustomRoadmap/SharedRoadmapList.tsx
  37. 2
      src/components/CustomRoadmap/Showcase/SubmitShowcaseWarning.tsx
  38. 2
      src/components/Dashboard/DashboardAiRoadmaps.tsx
  39. 2
      src/components/Dashboard/DashboardCardLink.tsx
  40. 2
      src/components/Dashboard/DashboardCustomProgressCard.tsx
  41. 2
      src/components/Dashboard/DashboardProgressCard.tsx
  42. 6
      src/components/Dashboard/DashboardProjectCard.tsx
  43. 2
      src/components/Dashboard/DashboardTeamRoadmaps.tsx
  44. 2
      src/components/Dashboard/EmptyStackMessage.tsx
  45. 2
      src/components/Dashboard/TeamDashboard.tsx
  46. 2
      src/components/DeleteAccount/DeleteAccount.astro
  47. 6
      src/components/DeleteAccount/DeleteAccountForm.tsx
  48. 8
      src/components/DeleteTeamPopup.tsx
  49. 2
      src/components/DiscoverRoadmaps/DiscoverRoadmapSorting.tsx
  50. 4
      src/components/DiscoverRoadmaps/SearchRoadmap.tsx
  51. 2
      src/components/ExploreAIRoadmap/AIRoadmapsList.tsx
  52. 4
      src/components/ExploreAIRoadmap/ExploreAISearch.tsx
  53. 2
      src/components/ExploreAIRoadmap/ExploreAISorting.tsx
  54. 2
      src/components/FeaturedGuides.astro
  55. 2
      src/components/FeaturedVideos.astro
  56. 10
      src/components/Feedback/SubmitFeedbackPopup.tsx
  57. 4
      src/components/FrameRenderer/ProgressNudge.tsx
  58. 2
      src/components/Friends/EmptyFriends.tsx
  59. 10
      src/components/Friends/FriendProgressItem.tsx
  60. 4
      src/components/Friends/InviteFriendPopup.tsx
  61. 6
      src/components/GenerateRoadmap/AITermSuggestionInput.tsx
  62. 8
      src/components/GenerateRoadmap/GenerateRoadmap.tsx
  63. 4
      src/components/GenerateRoadmap/OpenAISettings.tsx
  64. 16
      src/components/GenerateRoadmap/PayToBypass.tsx
  65. 4
      src/components/GenerateRoadmap/ReferYourFriend.tsx
  66. 2
      src/components/GenerateRoadmap/RoadmapTopicDetail.tsx
  67. 6
      src/components/GetStarted/RoadmapCard.tsx
  68. 10
      src/components/GetStarted/RoadmapMultiCard.tsx
  69. 2
      src/components/GetStarted/RoleRoadmaps.tsx
  70. 2
      src/components/GridItem.astro
  71. 2
      src/components/Guide/GuideContent.astro
  72. 2
      src/components/Guide/RelatedGuides.tsx
  73. 2
      src/components/GuideListItem.astro
  74. 2
      src/components/HeroSection/FavoriteRoadmaps.tsx
  75. 2
      src/components/HeroSection/HeroSection.astro
  76. 4
      src/components/Leaderboard/LeaderboardPage.tsx
  77. 2
      src/components/MarkdownFile.astro
  78. 4
      src/components/Modal.tsx
  79. 10
      src/components/Navigation/AccountDropdown.astro
  80. 4
      src/components/Navigation/AccountDropdown.tsx
  81. 18
      src/components/Navigation/AccountDropdownList.tsx
  82. 8
      src/components/Navigation/DropdownTeamList.tsx
  83. 2
      src/components/Navigation/Navigation.astro
  84. 2
      src/components/Navigation/OnboardingModal.tsx
  85. 2
      src/components/NavigationDropdown.tsx
  86. 4
      src/components/Notification/NotificationPage.tsx
  87. 2
      src/components/OnboardingNudge.tsx
  88. 2
      src/components/OpenSourceBanner.astro
  89. 2
      src/components/PageProgress.tsx
  90. 2
      src/components/PageSponsors/StickyTopSponsor.tsx
  91. 4
      src/components/Popup/Popup.astro
  92. 2
      src/components/Projects/ListProjectSolutions.tsx
  93. 4
      src/components/Projects/ProjectCard.tsx
  94. 4
      src/components/Projects/ProjectsPage.tsx
  95. 2
      src/components/Projects/StartProjectModal.tsx
  96. 2
      src/components/Projects/StatusStepper/StepperStepSeparator.tsx
  97. 6
      src/components/Projects/SubmissionRequirement.tsx
  98. 2
      src/components/Projects/SubmitSuccessModal.tsx
  99. 2
      src/components/Projects/VoteButton.tsx
  100. 8
      src/components/Questions/QuestionCard.tsx
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,10 +1,10 @@
// https://astro.build/config // https://astro.build/config
import sitemap from '@astrojs/sitemap'; import sitemap from '@astrojs/sitemap';
import tailwind from '@astrojs/tailwind';
import node from '@astrojs/node'; import node from '@astrojs/node';
import { defineConfig } from 'astro/config'; import { defineConfig } from 'astro/config';
import rehypeExternalLinks from 'rehype-external-links'; import rehypeExternalLinks from 'rehype-external-links';
import { serializeSitemap, shouldIndexPage } from './sitemap.mjs'; import { serializeSitemap, shouldIndexPage } from './sitemap.mjs';
import tailwindcss from '@tailwindcss/vite';
import react from '@astrojs/react'; import react from '@astrojs/react';
@ -46,15 +46,13 @@ export default defineConfig({
}), }),
trailingSlash: 'never', trailingSlash: 'never',
integrations: [ integrations: [
tailwind({
config: {
applyBaseStyles: false,
},
}),
sitemap({ sitemap({
filter: shouldIndexPage, filter: shouldIndexPage,
serialize: serializeSitemap, serialize: serializeSitemap,
}), }),
react(), react(),
], ],
vite: {
plugins: [tailwindcss()],
},
}); });

@ -32,11 +32,11 @@
"@astrojs/node": "^8.3.4", "@astrojs/node": "^8.3.4",
"@astrojs/react": "^3.6.2", "@astrojs/react": "^3.6.2",
"@astrojs/sitemap": "^3.2.0", "@astrojs/sitemap": "^3.2.0",
"@astrojs/tailwind": "^5.1.2",
"@fingerprintjs/fingerprintjs": "^4.5.0", "@fingerprintjs/fingerprintjs": "^4.5.0",
"@nanostores/react": "^0.8.0", "@nanostores/react": "^0.8.0",
"@napi-rs/image": "^1.9.2", "@napi-rs/image": "^1.9.2",
"@resvg/resvg-js": "^2.6.2", "@resvg/resvg-js": "^2.6.2",
"@tailwindcss/vite": "^4.0.0",
"@tanstack/react-query": "^5.59.16", "@tanstack/react-query": "^5.59.16",
"@types/react": "^18.3.11", "@types/react": "^18.3.11",
"@types/react-dom": "^18.3.1", "@types/react-dom": "^18.3.1",
@ -72,9 +72,9 @@
"satori-html": "^0.3.2", "satori-html": "^0.3.2",
"sharp": "^0.33.5", "sharp": "^0.33.5",
"slugify": "^1.6.6", "slugify": "^1.6.6",
"tiptap-markdown": "^0.8.10",
"tailwind-merge": "^2.5.3", "tailwind-merge": "^2.5.3",
"tailwindcss": "^3.4.13", "tailwindcss": "^4.0.0",
"tiptap-markdown": "^0.8.10",
"turndown": "^7.2.0", "turndown": "^7.2.0",
"unified": "^11.0.5", "unified": "^11.0.5",
"zustand": "^4.5.5" "zustand": "^4.5.5"
@ -97,7 +97,7 @@
"openai": "^4.67.3", "openai": "^4.67.3",
"prettier": "^3.3.3", "prettier": "^3.3.3",
"prettier-plugin-astro": "^0.14.1", "prettier-plugin-astro": "^0.14.1",
"prettier-plugin-tailwindcss": "^0.6.8", "prettier-plugin-tailwindcss": "^0.6.11",
"tsx": "^4.19.1" "tsx": "^4.19.1"
} }
} }

File diff suppressed because it is too large Load Diff

@ -153,7 +153,7 @@ const sidebarLinks = [
: 'border-r-transparent text-gray-500 hover:border-r-gray-300' : 'border-r-transparent text-gray-500 hover:border-r-gray-300'
}`} }`}
> >
<span class='flex flex-grow items-center'> <span class='flex grow items-center'>
{sidebarLink.icon.component ? ( {sidebarLink.icon.component ? (
<sidebarLink.icon.component <sidebarLink.icon.component
className={`${sidebarLink.icon.classes} mr-2`} className={`${sidebarLink.icon.classes} mr-2`}

@ -83,10 +83,10 @@ export function AccountStreak(props: AccountStreakProps) {
const totalCircles = leftCircleCount + currentCircleCount + remainingCount; const totalCircles = leftCircleCount + currentCircleCount + remainingCount;
return ( return (
<div className="relative z-[90] animate-fade-in"> <div className="relative z-90 animate-fade-in">
<button <button
className={cn( className={cn(
'flex items-center justify-center rounded-lg p-1.5 px-2 text-purple-400 hover:bg-purple-100/10 focus:outline-none', 'flex items-center justify-center rounded-lg p-1.5 px-2 text-purple-400 hover:bg-purple-100/10 focus:outline-hidden',
{ {
'bg-purple-100/10': showDropdown, 'bg-purple-100/10': showDropdown,
}, },

@ -128,20 +128,20 @@ export function AccountStreakHeatmap(props: AccountStreakHeatmapProps) {
]} ]}
classForValue={(value) => { classForValue={(value) => {
if (!value) { if (!value) {
return 'fill-slate-700 rounded-md [rx:2px] focus:outline-none'; return 'fill-slate-700 rounded-md [rx:2px] focus:outline-hidden';
} }
const { count } = value; const { count } = value;
if (count >= 20) { if (count >= 20) {
return 'fill-slate-200 rounded-md [rx:2px] focus:outline-none'; return 'fill-slate-200 rounded-md [rx:2px] focus:outline-hidden';
} else if (count >= 10) { } else if (count >= 10) {
return 'fill-slate-300 rounded-md [rx:2px] focus:outline-none'; return 'fill-slate-300 rounded-md [rx:2px] focus:outline-hidden';
} else if (count >= 5) { } else if (count >= 5) {
return 'fill-slate-400 rounded-md [rx:2px] focus:outline-none'; return 'fill-slate-400 rounded-md [rx:2px] focus:outline-hidden';
} else if (count >= 3) { } else if (count >= 3) {
return 'fill-slate-500 rounded-md [rx:2px] focus:outline-none'; return 'fill-slate-500 rounded-md [rx:2px] focus:outline-hidden';
} else { } else {
return 'fill-slate-600 rounded-md [rx:2px] focus:outline-none'; return 'fill-slate-600 rounded-md [rx:2px] focus:outline-hidden';
} }
}} }}
tooltipDataAttrs={(value: any) => { tooltipDataAttrs={(value: any) => {
@ -159,7 +159,7 @@ export function AccountStreakHeatmap(props: AccountStreakHeatmapProps) {
<ReactTooltip <ReactTooltip
id="user-activity-tip" id="user-activity-tip"
className="!rounded-lg !bg-slate-900 !p-1 !px-2 !text-xs" className="rounded-lg! bg-slate-900! p-1! px-2! text-xs!"
/> />
<div className="mt-2 flex items-center justify-end"> <div className="mt-2 flex items-center justify-end">
@ -173,14 +173,14 @@ export function AccountStreakHeatmap(props: AccountStreakHeatmapProps) {
data-tooltip-content={`${legend.count} Updates`} data-tooltip-content={`${legend.count} Updates`}
> >
<div <div
className={`h-2.5 w-2.5 ${legend.color} mr-1 rounded-sm`} className={`h-2.5 w-2.5 ${legend.color} mr-1 rounded-xs`}
></div> ></div>
</div> </div>
))} ))}
<span className="ml-2 text-xs text-slate-500">More</span> <span className="ml-2 text-xs text-slate-500">More</span>
<ReactTooltip <ReactTooltip
id="user-activity-tip" id="user-activity-tip"
className="!rounded-lg !bg-slate-900 !p-1 !px-2 !text-sm" className="rounded-lg! bg-slate-900! p-1! px-2! text-sm!"
/> />
</div> </div>
</div> </div>

@ -43,7 +43,7 @@ export function ActivityTopicsModal(props: ActivityTopicDetailsProps) {
onClose(); onClose();
}} }}
> >
<div className={`popup-body relative rounded-lg bg-white p-4 shadow`}> <div className={`popup-body relative rounded-lg bg-white p-4 shadow-sm`}>
<span className="mb-2 flex items-center justify-between text-lg font-semibold capitalize"> <span className="mb-2 flex items-center justify-between text-lg font-semibold capitalize">
<span className="flex items-center gap-2"> <span className="flex items-center gap-2">
{actionType.replace('_', ' ')} {actionType.replace('_', ' ')}

@ -37,7 +37,7 @@ export function ProjectProgress(props: ProjectProgressType) {
target="_blank" target="_blank"
> >
<ProjectStatus projectStatus={projectStatus} /> <ProjectStatus projectStatus={projectStatus} />
<span className="ml-2 flex-grow truncate">{projectStatus?.title}</span> <span className="ml-2 grow truncate">{projectStatus?.title}</span>
<span className="inline-flex items-center gap-1 text-xs text-gray-400"> <span className="inline-flex items-center gap-1 text-xs text-gray-400">
{projectStatus.upvotes} {projectStatus.upvotes}
<ThumbsUp className="size-2.5 stroke-[2.5px]" /> <ThumbsUp className="size-2.5 stroke-[2.5px]" />

@ -73,7 +73,7 @@ export function ResourceProgress(props: ResourceProgressType) {
showActions ? 'pr-7' : '', showActions ? 'pr-7' : '',
)} )}
> >
<span className="flex-grow truncate">{title}</span> <span className="grow truncate">{title}</span>
<span className="text-xs text-gray-400"> <span className="text-xs text-gray-400">
{parseInt(progressPercentage, 10)}% {parseInt(progressPercentage, 10)}%
</span> </span>

@ -69,7 +69,7 @@ export function AddTeamRoadmap(props: AddTeamRoadmapProps) {
<div className="relative h-full w-full max-w-md p-4 md:h-auto"> <div className="relative h-full w-full max-w-md p-4 md:h-auto">
<div <div
ref={popupBodyEl} ref={popupBodyEl}
className="popup-body relative rounded-lg bg-white p-4 shadow" className="popup-body relative rounded-lg bg-white p-4 shadow-sm"
> >
{isLoading && ( {isLoading && (
<> <>
@ -99,7 +99,7 @@ export function AddTeamRoadmap(props: AddTeamRoadmapProps) {
<button <button
onClick={onClose} onClick={onClose}
type="button" type="button"
className="flex-grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center hover:bg-gray-300" className="grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center hover:bg-gray-300"
> >
Done Done
</button> </button>
@ -110,7 +110,7 @@ export function AddTeamRoadmap(props: AddTeamRoadmapProps) {
setIsLoading(false); setIsLoading(false);
}} }}
type="button" type="button"
className="flex-grow cursor-pointer rounded-lg bg-black py-2 text-center text-white" className="grow cursor-pointer rounded-lg bg-black py-2 text-center text-white"
> >
+ Add More + Add More
</button> </button>
@ -126,7 +126,7 @@ export function AddTeamRoadmap(props: AddTeamRoadmapProps) {
<button <button
onClick={onClose} onClick={onClose}
type="button" type="button"
className="flex-grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center hover:bg-gray-300" className="grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center hover:bg-gray-300"
> >
Cancel Cancel
</button> </button>
@ -152,7 +152,7 @@ export function AddTeamRoadmap(props: AddTeamRoadmapProps) {
setSelectedRoadmap(roadmapId); setSelectedRoadmap(roadmapId);
}); });
}} }}
inputClassName="mt-2 mb-2 block w-full rounded-md border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:border-gray-400" inputClassName="mt-2 mb-2 block w-full rounded-md border border-gray-300 px-3 py-2 outline-hidden placeholder:text-gray-400 focus:border-gray-400"
placeholder={'Search for roadmap'} placeholder={'Search for roadmap'}
/> />
@ -160,7 +160,7 @@ export function AddTeamRoadmap(props: AddTeamRoadmapProps) {
<button <button
onClick={onClose} onClick={onClose}
type="button" type="button"
className="flex-grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center hover:bg-gray-300" className="grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center hover:bg-gray-300"
> >
Cancel Cancel
</button> </button>

@ -30,7 +30,7 @@ function Input(props: InputProps) {
value={value} value={value}
onChange={onChange} onChange={onChange}
rows={rows} rows={rows}
className="mt-1 block w-full rounded-md border border-gray-300 p-2 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm" className="mt-1 block w-full rounded-md border border-gray-300 p-2 shadow-xs focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm"
autoComplete="off" autoComplete="off"
data-1p-ignore="" data-1p-ignore=""
data-form-type="other" data-form-type="other"
@ -45,7 +45,7 @@ function Input(props: InputProps) {
value={value} value={value}
onChange={onChange} onChange={onChange}
required={required} required={required}
className="mt-1 block w-full rounded-md border border-gray-300 p-2 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm" className="mt-1 block w-full rounded-md border border-gray-300 p-2 shadow-xs focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm"
autoComplete="off" autoComplete="off"
data-1p-ignore="" data-1p-ignore=""
data-form-type="other" data-form-type="other"
@ -120,7 +120,7 @@ export function AdvertiseForm() {
Ready to learn more? Fill out the form below to get started! Ready to learn more? Fill out the form below to get started!
</h2> </h2>
{error && ( {error && (
<div className="relative mb-4 rounded border border-red-400 bg-red-100 px-4 py-3 text-red-700"> <div className="relative mb-4 rounded-sm border border-red-400 bg-red-100 px-4 py-3 text-red-700">
{error} {error}
</div> </div>
)} )}
@ -199,7 +199,7 @@ export function AdvertiseForm() {
type="checkbox" type="checkbox"
checked={formData.updates} checked={formData.updates}
onChange={handleInputChange} onChange={handleInputChange}
className="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500" className="h-4 w-4 rounded-sm border-gray-300 text-indigo-600 focus:ring-indigo-500"
/> />
</div> </div>
<div className="ml-3 text-sm"> <div className="ml-3 text-sm">
@ -213,7 +213,7 @@ export function AdvertiseForm() {
<div> <div>
<button <button
type="submit" type="submit"
className="flex justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2" className="flex justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white shadow-xs hover:bg-indigo-700 focus:outline-hidden focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
> >
Send Send
</button> </button>

@ -115,7 +115,7 @@ export function CourseLoginPopup(props: CourseLoginPopupProps) {
<div className="flex flex-row gap-2"> <div className="flex flex-row gap-2">
{!isUsingEmail && ( {!isUsingEmail && (
<button <button
className="flex-grow rounded-md border border-gray-400 px-4 py-2 text-sm text-gray-600 hover:bg-gray-100" className="grow rounded-md border border-gray-400 px-4 py-2 text-sm text-gray-600 hover:bg-gray-100"
onClick={() => setIsUsingEmail(true)} onClick={() => setIsUsingEmail(true)}
> >
Use your email address Use your email address
@ -124,13 +124,13 @@ export function CourseLoginPopup(props: CourseLoginPopupProps) {
{isUsingEmail && ( {isUsingEmail && (
<> <>
<button <button
className="flex-grow rounded-md border border-gray-400 px-4 py-2 text-sm text-gray-600 hover:bg-gray-100" className="grow rounded-md border border-gray-400 px-4 py-2 text-sm text-gray-600 hover:bg-gray-100"
onClick={() => setEmailNature('login')} onClick={() => setEmailNature('login')}
> >
Already have an account Already have an account
</button> </button>
<button <button
className="flex-grow rounded-md border border-gray-400 px-4 py-2 text-sm text-gray-600 hover:bg-gray-100" className="grow rounded-md border border-gray-400 px-4 py-2 text-sm text-gray-600 hover:bg-gray-100"
onClick={() => setEmailNature('signup')} onClick={() => setEmailNature('signup')}
> >
Create an account Create an account

@ -72,7 +72,7 @@ export function EmailLoginForm(props: EmailLoginFormProps) {
type="email" type="email"
autoComplete="email" autoComplete="email"
required required
className="block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Email Address" placeholder="Email Address"
value={email} value={email}
onInput={(e) => setEmail(String((e.target as any).value))} onInput={(e) => setEmail(String((e.target as any).value))}
@ -86,7 +86,7 @@ export function EmailLoginForm(props: EmailLoginFormProps) {
type="password" type="password"
autoComplete="current-password" autoComplete="current-password"
required required
className="mt-2 block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="mt-2 block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Password" placeholder="Password"
value={password} value={password}
onInput={(e) => setPassword(String((e.target as any).value))} onInput={(e) => setPassword(String((e.target as any).value))}
@ -108,7 +108,7 @@ export function EmailLoginForm(props: EmailLoginFormProps) {
<button <button
type="submit" type="submit"
disabled={isLoading || isDisabled} disabled={isLoading || isDisabled}
className="inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-none focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400" className="inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-hidden focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400"
> >
{isLoading ? 'Please wait...' : 'Continue'} {isLoading ? 'Please wait...' : 'Continue'}
</button> </button>

@ -74,7 +74,7 @@ export function EmailSignupForm(props: EmailSignupFormProps) {
min={3} min={3}
max={50} max={50}
required required
className="block w-full rounded-lg border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="block w-full rounded-lg border border-gray-300 px-3 py-2 outline-hidden placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Full Name" placeholder="Full Name"
value={name} value={name}
onInput={(e) => setName(String((e.target as any).value))} onInput={(e) => setName(String((e.target as any).value))}
@ -87,7 +87,7 @@ export function EmailSignupForm(props: EmailSignupFormProps) {
type="email" type="email"
autoComplete="email" autoComplete="email"
required required
className="block w-full rounded-lg border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="block w-full rounded-lg border border-gray-300 px-3 py-2 outline-hidden placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Email Address" placeholder="Email Address"
value={email} value={email}
onInput={(e) => setEmail(String((e.target as any).value))} onInput={(e) => setEmail(String((e.target as any).value))}
@ -102,7 +102,7 @@ export function EmailSignupForm(props: EmailSignupFormProps) {
min={6} min={6}
max={50} max={50}
required required
className="block w-full rounded-lg border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="block w-full rounded-lg border border-gray-300 px-3 py-2 outline-hidden placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Password" placeholder="Password"
value={password} value={password}
onInput={(e) => setPassword(String((e.target as any).value))} onInput={(e) => setPassword(String((e.target as any).value))}
@ -115,7 +115,7 @@ export function EmailSignupForm(props: EmailSignupFormProps) {
<button <button
type="submit" type="submit"
disabled={isLoading || isDisabled} disabled={isLoading || isDisabled}
className="inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-none focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400" className="inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-hidden focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400"
> >
{isLoading ? 'Please wait...' : 'Continue to Verify Email'} {isLoading ? 'Please wait...' : 'Continue to Verify Email'}
</button> </button>

@ -33,7 +33,7 @@ export function ForgotPasswordForm() {
<input <input
type="email" type="email"
name="email" name="email"
className="mt-2 block w-full appearance-none rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none transition duration-150 ease-in-out placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="mt-2 block w-full appearance-none rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden transition duration-150 ease-in-out placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
required required
placeholder="Email Address" placeholder="Email Address"
value={email} value={email}
@ -55,7 +55,7 @@ export function ForgotPasswordForm() {
<button <button
type="submit" type="submit"
disabled={isLoading} disabled={isLoading}
className="mt-3 inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-none focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400" className="mt-3 inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-hidden focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400"
> >
{isLoading ? 'Please wait...' : 'Continue'} {isLoading ? 'Please wait...' : 'Continue'}
</button> </button>

@ -143,7 +143,7 @@ export function GitHubButton(props: GitHubButtonProps) {
<> <>
<button <button
className={cn( className={cn(
'inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none hover:border-gray-400 hover:bg-gray-50 focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60', 'inline-flex h-10 w-full items-center justify-center gap-2 rounded-sm border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-hidden hover:border-gray-400 hover:bg-gray-50 focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60',
className, className,
)} )}
disabled={isLoading || isDisabled} disabled={isLoading || isDisabled}

@ -153,7 +153,7 @@ export function GoogleButton(props: GoogleButtonProps) {
<> <>
<button <button
className={cn( className={cn(
'inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none hover:border-gray-400 hover:bg-gray-50 focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60', 'inline-flex h-10 w-full items-center justify-center gap-2 rounded-sm border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-hidden hover:border-gray-400 hover:bg-gray-50 focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60',
className, className,
)} )}
disabled={isLoading || isDisabled} disabled={isLoading || isDisabled}

@ -152,7 +152,7 @@ export function LinkedInButton(props: LinkedInButtonProps) {
<> <>
<button <button
className={cn( className={cn(
'inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none hover:border-gray-400 focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60', 'inline-flex h-10 w-full items-center justify-center gap-2 rounded-sm border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-hidden hover:border-gray-400 focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60',
className, className,
)} )}
disabled={isLoading || isDisabled} disabled={isLoading || isDisabled}

@ -61,7 +61,7 @@ export function ResetPasswordForm() {
<form className="mx-auto w-full" onSubmit={handleSubmit}> <form className="mx-auto w-full" onSubmit={handleSubmit}>
<input <input
type="password" type="password"
className="mb-2 mt-2 block w-full appearance-none rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none transition duration-150 ease-in-out placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="mb-2 mt-2 block w-full appearance-none rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden transition duration-150 ease-in-out placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
required required
minLength={6} minLength={6}
placeholder="New Password" placeholder="New Password"
@ -71,7 +71,7 @@ export function ResetPasswordForm() {
<input <input
type="password" type="password"
className="mt-2 block w-full appearance-none rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none transition duration-150 ease-in-out placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="mt-2 block w-full appearance-none rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden transition duration-150 ease-in-out placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
required required
minLength={6} minLength={6}
placeholder="Confirm New Password" placeholder="Confirm New Password"
@ -88,7 +88,7 @@ export function ResetPasswordForm() {
<button <button
type="submit" type="submit"
disabled={isLoading} disabled={isLoading}
className="mt-2 inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-none focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400" className="mt-2 inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-hidden focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400"
> >
{isLoading ? 'Please wait...' : 'Reset Password'} {isLoading ? 'Please wait...' : 'Reset Password'}
</button> </button>

@ -125,7 +125,7 @@ export function Befriend() {
<div> <div>
<a <a
href="/" href="/"
className="flex-grow cursor-pointer rounded-lg bg-gray-200 px-3 py-2 text-center" className="grow cursor-pointer rounded-lg bg-gray-200 px-3 py-2 text-center"
> >
Back to home Back to home
</a> </a>
@ -141,7 +141,7 @@ export function Befriend() {
const isMe = currentUser?.id === user.id; const isMe = currentUser?.id === user.id;
return ( return (
<div className="container !max-w-[400px] text-center"> <div className="container max-w-[400px]! text-center">
<img <img
alt={'join team'} alt={'join team'}
src={userAvatar} src={userAvatar}
@ -169,7 +169,7 @@ export function Befriend() {
}); });
}} }}
type="button" type="button"
className="w-full flex-grow cursor-pointer rounded-lg bg-black px-3 py-2 text-center text-white disabled:cursor-not-allowed disabled:opacity-40" className="w-full grow cursor-pointer rounded-lg bg-black px-3 py-2 text-center text-white disabled:cursor-not-allowed disabled:opacity-40"
> >
{isMe ? "You can't add yourself" : 'Add Friend'} {isMe ? "You can't add yourself" : 'Add Friend'}
</button> </button>
@ -177,7 +177,7 @@ export function Befriend() {
{user.status === 'sent' && ( {user.status === 'sent' && (
<> <>
<span className="flex w-full flex-grow cursor-default items-center justify-center rounded-lg border border-gray-300 px-3 py-2 text-center text-black"> <span className="flex w-full grow cursor-default items-center justify-center rounded-lg border border-gray-300 px-3 py-2 text-center text-black">
<CheckIcon additionalClasses="mr-2 h-4 w-4" /> <CheckIcon additionalClasses="mr-2 h-4 w-4" />
Request Sent Request Sent
</span> </span>
@ -188,7 +188,7 @@ export function Befriend() {
setIsConfirming(true); setIsConfirming(true);
}} }}
type="button" type="button"
className="flex w-full flex-grow cursor-pointer items-center justify-center rounded-lg border border-red-600 bg-red-600 px-3 py-2 text-center text-white hover:bg-red-700" className="flex w-full grow cursor-pointer items-center justify-center rounded-lg border border-red-600 bg-red-600 px-3 py-2 text-center text-white hover:bg-red-700"
> >
<DeleteUserIcon additionalClasses="mr-2 h-[19px] w-[19px]" /> <DeleteUserIcon additionalClasses="mr-2 h-[19px] w-[19px]" />
Withdraw Request Withdraw Request
@ -196,7 +196,7 @@ export function Befriend() {
)} )}
{isConfirming && ( {isConfirming && (
<span className="flex w-full flex-grow cursor-default items-center justify-center rounded-lg border border-red-600 px-3 py-2.5 text-center text-sm text-red-600"> <span className="flex w-full grow cursor-default items-center justify-center rounded-lg border border-red-600 px-3 py-2.5 text-center text-sm text-red-600">
Are you sure?{' '} Are you sure?{' '}
<button <button
className="ml-2 text-red-700 underline" className="ml-2 text-red-700 underline"
@ -225,7 +225,7 @@ export function Befriend() {
{user.status === 'accepted' && ( {user.status === 'accepted' && (
<> <>
<span className="flex w-full flex-grow cursor-default items-center justify-center rounded-lg border border-gray-300 px-3 py-2 text-center text-black"> <span className="flex w-full grow cursor-default items-center justify-center rounded-lg border border-gray-300 px-3 py-2 text-center text-black">
<AddedUserIcon additionalClasses="mr-2 h-5 w-5" /> <AddedUserIcon additionalClasses="mr-2 h-5 w-5" />
You are friends You are friends
</span> </span>
@ -236,7 +236,7 @@ export function Befriend() {
setIsConfirming(true); setIsConfirming(true);
}} }}
type="button" type="button"
className="flex w-full flex-grow cursor-pointer items-center justify-center rounded-lg border border-red-600 bg-red-600 px-3 py-2 text-center text-white hover:bg-red-700" className="flex w-full grow cursor-pointer items-center justify-center rounded-lg border border-red-600 bg-red-600 px-3 py-2 text-center text-white hover:bg-red-700"
> >
<DeleteUserIcon additionalClasses="mr-2 h-[19px] w-[19px]" /> <DeleteUserIcon additionalClasses="mr-2 h-[19px] w-[19px]" />
Remove Friend Remove Friend
@ -244,7 +244,7 @@ export function Befriend() {
)} )}
{isConfirming && ( {isConfirming && (
<span className="flex w-full flex-grow cursor-default items-center justify-center rounded-lg border border-red-600 px-3 py-2.5 text-center text-sm text-red-600"> <span className="flex w-full grow cursor-default items-center justify-center rounded-lg border border-red-600 px-3 py-2.5 text-center text-sm text-red-600">
Are you sure?{' '} Are you sure?{' '}
<button <button
className="ml-2 text-red-700 underline" className="ml-2 text-red-700 underline"
@ -271,12 +271,12 @@ export function Befriend() {
{user.status === 'rejected' && ( {user.status === 'rejected' && (
<> <>
<span className="flex w-full flex-grow cursor-default items-center justify-center rounded-lg border border-gray-300 px-3 py-2 text-center text-black"> <span className="flex w-full grow cursor-default items-center justify-center rounded-lg border border-gray-300 px-3 py-2 text-center text-black">
<DeleteUserIcon additionalClasses="mr-2 h-4 w-4" /> <DeleteUserIcon additionalClasses="mr-2 h-4 w-4" />
Request Rejected Request Rejected
</span> </span>
<span className="flex w-full flex-grow cursor-default items-center justify-center rounded-lg border border-red-600 px-3 py-2.5 text-center text-sm text-red-600"> <span className="flex w-full grow cursor-default items-center justify-center rounded-lg border border-red-600 px-3 py-2.5 text-center text-sm text-red-600">
Changed your mind?{' '} Changed your mind?{' '}
<button <button
className="ml-2 text-red-700 underline" className="ml-2 text-red-700 underline"
@ -296,7 +296,7 @@ export function Befriend() {
{user.status === 'got_rejected' && ( {user.status === 'got_rejected' && (
<> <>
<span className="flex w-full flex-grow cursor-default items-center justify-center rounded-lg border border-red-500 px-3 py-2 text-center text-red-500"> <span className="flex w-full grow cursor-default items-center justify-center rounded-lg border border-red-500 px-3 py-2 text-center text-red-500">
<StopIcon additionalClasses="mr-2 h-4 w-4" /> <StopIcon additionalClasses="mr-2 h-4 w-4" />
Request Rejected Request Rejected
</span> </span>
@ -311,7 +311,7 @@ export function Befriend() {
pageProgressMessage.set(''); pageProgressMessage.set('');
}); });
}} }}
className="flex w-full flex-grow cursor-pointer items-center justify-center rounded-lg border border-gray-800 bg-gray-800 px-3 py-2 text-center text-white hover:bg-black" className="flex w-full grow cursor-pointer items-center justify-center rounded-lg border border-gray-800 bg-gray-800 px-3 py-2 text-center text-white hover:bg-black"
> >
<CheckIcon additionalClasses="mr-2 h-4 w-4" /> <CheckIcon additionalClasses="mr-2 h-4 w-4" />
Accept Request Accept Request
@ -323,7 +323,7 @@ export function Befriend() {
setIsConfirming(true); setIsConfirming(true);
}} }}
type="button" type="button"
className="flex w-full flex-grow cursor-pointer items-center justify-center rounded-lg border border-red-600 bg-white px-3 py-2 text-center text-red-600 hover:bg-red-100" className="flex w-full grow cursor-pointer items-center justify-center rounded-lg border border-red-600 bg-white px-3 py-2 text-center text-red-600 hover:bg-red-100"
> >
<DeleteUserIcon additionalClasses="mr-2 h-[19px] w-[19px]" /> <DeleteUserIcon additionalClasses="mr-2 h-[19px] w-[19px]" />
Reject Request Reject Request
@ -331,7 +331,7 @@ export function Befriend() {
)} )}
{isConfirming && ( {isConfirming && (
<span className="flex w-full flex-grow cursor-default items-center justify-center rounded-lg border border-red-600 px-3 py-2.5 text-center text-sm text-red-600"> <span className="flex w-full grow cursor-default items-center justify-center rounded-lg border border-red-600 px-3 py-2.5 text-center text-sm text-red-600">
Are you sure?{' '} Are you sure?{' '}
<button <button
className="ml-2 text-red-700 underline" className="ml-2 text-red-700 underline"

@ -27,7 +27,7 @@ const isBestPracticeReady = !isUpcoming;
<MarkFavorite <MarkFavorite
resourceId={bestPracticeId} resourceId={bestPracticeId}
resourceType="best-practice" resourceType="best-practice"
className="text-gray-500 !opacity-100 hover:text-gray-600 [&>svg]:stroke-[0.4] [&>svg]:stroke-gray-400 hover:[&>svg]:stroke-gray-600 [&>svg]:h-4 [&>svg]:w-4 sm:[&>svg]:h-5 sm:[&>svg]:w-5 ml-1.5 relative focus:outline-0" className="text-gray-500 opacity-100! hover:text-gray-600 [&>svg]:stroke-[0.4] [&>svg]:stroke-gray-400 [&>svg]:hover:stroke-gray-600 [&>svg]:h-4 [&>svg]:w-4 sm:[&>svg]:h-5 sm:[&>svg]:w-5 ml-1.5 relative focus:outline-0"
client:load client:load
/> />
</h1> </h1>

@ -17,11 +17,11 @@ const formattedDate = DateTime.fromISO(frontmatter.date).toFormat(
<div class='relative mb-6' id={changelog.id}> <div class='relative mb-6' id={changelog.id}>
<span <span
class='absolute -left-6 top-2 h-2 w-2 flex-shrink-0 rounded-full bg-gray-300' class='absolute -left-6 top-2 h-2 w-2 shrink-0 rounded-full bg-gray-300'
></span> ></span>
<div class='mb-3 flex flex-col sm:flex-row items-start sm:items-center gap-0.5 sm:gap-2'> <div class='mb-3 flex flex-col sm:flex-row items-start sm:items-center gap-0.5 sm:gap-2'>
<span class='flex-shrink-0 text-xs tracking-wide text-gray-400'> <span class='shrink-0 text-xs tracking-wide text-gray-400'>
{formattedDate} {formattedDate}
</span> </span>
<span class='truncate text-base font-medium text-balance'> <span class='truncate text-base font-medium text-balance'>

@ -6,13 +6,13 @@ const formattedDate = DateTime.fromISO('2024-09-13').toFormat('dd LLL, yyyy');
<div class='relative mb-6'> <div class='relative mb-6'>
<span <span
class='absolute -left-6 top-2 h-2 w-2 flex-shrink-0 rounded-full bg-gray-300' class='absolute -left-6 top-2 h-2 w-2 shrink-0 rounded-full bg-gray-300'
></span> ></span>
<div <div
class='mb-3 flex flex-col items-start gap-0.5 sm:flex-row sm:items-center sm:gap-2' class='mb-3 flex flex-col items-start gap-0.5 sm:flex-row sm:items-center sm:gap-2'
> >
<span class='flex-shrink-0 text-xs tracking-wide text-gray-400'> <span class='shrink-0 text-xs tracking-wide text-gray-400'>
{formattedDate} {formattedDate}
</span> </span>
<span class='truncate text-balance text-base font-medium'> <span class='truncate text-balance text-base font-medium'>

@ -7,7 +7,7 @@ const top10Changelogs = allChangelogs.slice(0, 10);
--- ---
<div class='border-t bg-white py-6 text-left sm:py-16 sm:text-center'> <div class='border-t bg-white py-6 text-left sm:py-16 sm:text-center'>
<div class='container !max-w-[650px]'> <div class='container max-w-[650px]!'>
<p class='text-2xl font-bold sm:text-5xl'> <p class='text-2xl font-bold sm:text-5xl'>
<img <img
src='/images/gifs/rocket.gif' src='/images/gifs/rocket.gif'
@ -40,10 +40,10 @@ const top10Changelogs = allChangelogs.slice(0, 10);
href={`/changelog#${changelog.id}`} href={`/changelog#${changelog.id}`}
class='flex flex-col items-start sm:flex-row sm:items-center' class='flex flex-col items-start sm:flex-row sm:items-center'
> >
<span class='flex-shrink-0 pr-0 text-right text-sm tracking-wide text-gray-400 sm:w-[120px] sm:pr-4'> <span class='shrink-0 pr-0 text-right text-sm tracking-wide text-gray-400 sm:w-[120px] sm:pr-4'>
{formattedDate} {formattedDate}
</span> </span>
<span class='hidden h-3 w-3 flex-shrink-0 rounded-full bg-gray-300 sm:block' /> <span class='hidden h-3 w-3 shrink-0 rounded-full bg-gray-300 sm:block' />
<span class='text-balance text-base font-medium text-gray-900 sm:pl-8'> <span class='text-balance text-base font-medium text-gray-900 sm:pl-8'>
{changelog.frontmatter.title} {changelog.frontmatter.title}
</span> </span>

@ -194,13 +194,13 @@ export function CommandMenu() {
return ( return (
<div className="fixed left-0 right-0 top-0 z-50 flex h-full justify-center overflow-y-auto overflow-x-hidden bg-black/50"> <div className="fixed left-0 right-0 top-0 z-50 flex h-full justify-center overflow-y-auto overflow-x-hidden bg-black/50">
<div className="relative top-0 h-full w-full max-w-lg p-2 sm:mt-20 md:h-auto"> <div className="relative top-0 h-full w-full max-w-lg p-2 sm:mt-20 md:h-auto">
<div className="relative rounded-lg bg-white shadow" ref={modalRef}> <div className="relative rounded-lg bg-white shadow-sm" ref={modalRef}>
<input <input
ref={inputRef} ref={inputRef}
autoFocus={true} autoFocus={true}
type="text" type="text"
value={searchedText} value={searchedText}
className="w-full rounded-t-md border-b p-4 text-sm focus:bg-gray-50 focus:outline-none" className="w-full rounded-t-md border-b p-4 text-sm focus:bg-gray-50 focus:outline-hidden"
placeholder="Search roadmaps, guides or pages .." placeholder="Search roadmaps, guides or pages .."
autoComplete="off" autoComplete="off"
onInput={(e) => { onInput={(e) => {
@ -249,7 +249,7 @@ export function CommandMenu() {
)} )}
<a <a
className={cn( className={cn(
'flex w-full items-center rounded p-2 text-sm', 'flex w-full items-center rounded-sm p-2 text-sm',
counter === activeCounter ? 'bg-gray-100' : '', counter === activeCounter ? 'bg-gray-100' : '',
)} )}
onMouseOver={() => setActiveCounter(counter)} onMouseOver={() => setActiveCounter(counter)}

@ -68,11 +68,11 @@ export function SelectRoadmapModal(props: SelectRoadmapModalProps) {
); );
return ( 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 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 className="relative mx-auto h-full w-full max-w-2xl p-4 md:h-auto"> <div className="relative mx-auto h-full w-full max-w-2xl p-4 md:h-auto">
<div <div
ref={popupBodyEl} ref={popupBodyEl}
className="popup-body relative mt-4 overflow-hidden rounded-lg bg-white shadow" className="popup-body relative mt-4 overflow-hidden rounded-lg bg-white shadow-sm"
> >
<button <button
type="button" type="button"
@ -86,7 +86,7 @@ export function SelectRoadmapModal(props: SelectRoadmapModalProps) {
ref={searchInputEl} ref={searchInputEl}
type="text" type="text"
placeholder="Search roadmaps" placeholder="Search roadmaps"
className="block w-full border-b px-5 pb-3.5 pt-4 outline-none placeholder:text-gray-400" className="block w-full border-b px-5 pb-3.5 pt-4 outline-hidden placeholder:text-gray-400"
value={searchText} value={searchText}
onInput={(e) => setSearchText((e.target as HTMLInputElement).value)} onInput={(e) => setSearchText((e.target as HTMLInputElement).value)}
/> />

@ -76,7 +76,7 @@ export function Step0(props: Step0Props) {
{validTeamTypes.map((validTeamType) => ( {validTeamTypes.map((validTeamType) => (
<button <button
key={validTeamType.value} key={validTeamType.value}
className={`flex flex-grow flex-col items-center rounded-lg border px-5 pb-10 pt-12 ${ className={`flex grow flex-col items-center rounded-lg border px-5 pb-10 pt-12 ${
validTeamType.value == selectedTeamType validTeamType.value == selectedTeamType
? 'border-gray-400 bg-gray-100' ? 'border-gray-400 bg-gray-100'
: 'border-gray-300 hover:border-gray-400 hover:bg-gray-50' : 'border-gray-300 hover:border-gray-400 hover:bg-gray-50'

@ -50,7 +50,7 @@ export function Step2(props: Step2Props) {
onClick={onNext} onClick={onNext}
disabled={teamResourceConfig.length !== 0} disabled={teamResourceConfig.length !== 0}
className={ className={
'flex-grow rounded-md border border-gray-300 bg-white px-4 py-2 text-gray-500 hover:border-gray-400 hover:text-black md:flex-auto disabled:opacity-50 disabled:pointer-events-none' 'grow rounded-md border border-gray-300 bg-white px-4 py-2 text-gray-500 hover:border-gray-400 hover:text-black md:flex-auto disabled:opacity-50 disabled:pointer-events-none'
} }
> >
Skip for Now Skip for Now

@ -109,7 +109,7 @@ export function Step3(props: Step3Props) {
setUsers(newUsers); setUsers(newUsers);
}} }}
className="flex-grow rounded-md border border-gray-200 bg-white px-4 py-2 text-gray-900" className="grow rounded-md border border-gray-200 bg-white px-4 py-2 text-gray-900"
/> />
<RoleDropdown <RoleDropdown
selectedRole={user.role} selectedRole={user.role}
@ -180,7 +180,7 @@ export function Step3(props: Step3Props) {
onClick={onNext} onClick={onNext}
disabled={users.filter((u) => u.email).length !== 0} disabled={users.filter((u) => u.email).length !== 0}
className={ className={
'rounded-md flex-grow md:flex-auto border border-gray-300 bg-white px-4 py-2 text-gray-500 hover:border-gray-400 hover:text-black disabled:opacity-50 disabled:pointer-events-none' 'rounded-md grow md:flex-auto border border-gray-300 bg-white px-4 py-2 text-gray-500 hover:border-gray-400 hover:text-black disabled:opacity-50 disabled:pointer-events-none'
} }
> >
Skip for Now Skip for Now

@ -148,12 +148,12 @@ export function UpdateTeamResourceModal(props: ProgressMapProps) {
}, []); }, []);
return ( 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 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 className="relative mx-auto h-full w-full max-w-4xl p-4 md:h-auto"> <div className="relative mx-auto h-full w-full max-w-4xl p-4 md:h-auto">
<div <div
id={'customized-roadmap'} id={'customized-roadmap'}
ref={popupBodyEl} ref={popupBodyEl}
className="popup-body relative rounded-lg bg-white shadow" className="popup-body relative rounded-lg bg-white shadow-sm"
> >
<div <div
className={ className={

@ -53,7 +53,7 @@ export function EmbedRoadmapModal(props: ShareRoadmapModalProps) {
<div className="flex items-center justify-between px-4 pb-4 pt-2"> <div className="flex items-center justify-between px-4 pb-4 pt-2">
<button <button
className={cn( className={cn(
'flex h-9 w-full items-center justify-center rounded-md border border-transparent px-4 py-2 text-sm font-medium text-white outline-none', 'flex h-9 w-full items-center justify-center rounded-md border border-transparent px-4 py-2 text-sm font-medium text-white outline-hidden',
{ {
'bg-green-500 hover:bg-green-600 focus:bg-green-600': isCopied, 'bg-green-500 hover:bg-green-600 focus:bg-green-600': isCopied,
'bg-gray-900 hover:bg-gray-800 focus:bg-gray-800': !isCopied, 'bg-gray-900 hover:bg-gray-800 focus:bg-gray-800': !isCopied,

@ -34,7 +34,7 @@ export function PersonalRoadmapActionDropdown(
<button <button
disabled={false} disabled={false}
onClick={() => setIsOpen(!isOpen)} onClick={() => setIsOpen(!isOpen)}
className="flex items-center gap-1 rounded-md border border-gray-300 bg-white px-2 py-1.5 text-xs hover:bg-gray-50 focus:outline-none sm:hidden" className="flex items-center gap-1 rounded-md border border-gray-300 bg-white px-2 py-1.5 text-xs hover:bg-gray-50 focus:outline-hidden sm:hidden"
> >
<MoreVertical size={14} /> <MoreVertical size={14} />
Options Options
@ -53,7 +53,7 @@ export function PersonalRoadmapActionDropdown(
setIsOpen(false); setIsOpen(false);
onUpdateSharing(); onUpdateSharing();
}} }}
className="flex w-full cursor-pointer items-center rounded p-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="flex w-full cursor-pointer items-center rounded-sm p-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<Lock size={14} className="mr-2" /> <Lock size={14} className="mr-2" />
Sharing Sharing
@ -67,7 +67,7 @@ export function PersonalRoadmapActionDropdown(
setIsOpen(false); setIsOpen(false);
onCustomize(); onCustomize();
}} }}
className="flex w-full cursor-pointer items-center rounded p-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="flex w-full cursor-pointer items-center rounded-sm p-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<Shapes size={14} className="mr-2" /> <Shapes size={14} className="mr-2" />
Customize Customize
@ -81,7 +81,7 @@ export function PersonalRoadmapActionDropdown(
setIsOpen(false); setIsOpen(false);
onDelete(); onDelete();
}} }}
className="flex w-full cursor-pointer items-center rounded p-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="flex w-full cursor-pointer items-center rounded-sm p-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<Trash2 size={14} className="mr-2" /> <Trash2 size={14} className="mr-2" />
Delete Delete

@ -176,7 +176,7 @@ function CustomRoadmapItem(props: CustomRoadmapItemProps) {
<a <a
href={editorLink} href={editorLink}
className={ className={
'ml-2 flex items-center gap-2 rounded-md border border-gray-300 bg-white px-2.5 py-1.5 text-xs text-black hover:bg-gray-50 focus:outline-none' 'ml-2 flex items-center gap-2 rounded-md border border-gray-300 bg-white px-2.5 py-1.5 text-xs text-black hover:bg-gray-50 focus:outline-hidden'
} }
target={'_blank'} target={'_blank'}
> >
@ -186,7 +186,7 @@ function CustomRoadmapItem(props: CustomRoadmapItemProps) {
<a <a
href={`/r/${roadmap?.slug}`} href={`/r/${roadmap?.slug}`}
className={ className={
'ml-2 flex items-center gap-2 rounded-md border border-blue-400 bg-white px-2 py-1.5 text-xs text-blue-600 hover:bg-blue-50 focus:outline-none' 'ml-2 flex items-center gap-2 rounded-md border border-blue-400 bg-white px-2 py-1.5 text-xs text-blue-600 hover:bg-blue-50 focus:outline-hidden'
} }
target={'_blank'} target={'_blank'}
> >

@ -32,7 +32,7 @@ export function RoadmapActionButton(props: RoadmapActionButtonProps) {
{isOpen && ( {isOpen && (
<div <div
ref={menuRef} ref={menuRef}
className="align-right absolute right-0 top-full z-[9999] mt-1 w-[140px] rounded-md bg-slate-800 px-2 py-2 text-white shadow-md" className="align-right absolute right-0 top-full z-9999 mt-1 w-[140px] rounded-md bg-slate-800 px-2 py-2 text-white shadow-md"
> >
<ul> <ul>
{onCustomize && ( {onCustomize && (
@ -42,7 +42,7 @@ export function RoadmapActionButton(props: RoadmapActionButtonProps) {
setIsOpen(false); setIsOpen(false);
onCustomize(); onCustomize();
}} }}
className="flex w-full cursor-pointer items-center rounded p-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="flex w-full cursor-pointer items-center rounded-sm p-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<PenSquare size={14} className="mr-2" /> <PenSquare size={14} className="mr-2" />
Edit Edit
@ -56,7 +56,7 @@ export function RoadmapActionButton(props: RoadmapActionButtonProps) {
setIsOpen(false); setIsOpen(false);
onUpdateSharing(); onUpdateSharing();
}} }}
className="flex w-full cursor-pointer items-center rounded p-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="flex w-full cursor-pointer items-center rounded-sm p-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<Lock size={14} className="mr-2" /> <Lock size={14} className="mr-2" />
Sharing Sharing
@ -70,7 +70,7 @@ export function RoadmapActionButton(props: RoadmapActionButtonProps) {
setIsOpen(false); setIsOpen(false);
onDelete(); onDelete();
}} }}
className="flex w-full cursor-pointer items-center rounded p-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="flex w-full cursor-pointer items-center rounded-sm p-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<Trash2 size={14} className="mr-2" /> <Trash2 size={14} className="mr-2" />
Delete Delete

@ -128,7 +128,7 @@ export function ShareRoadmapModal(props: ShareRoadmapModalProps) {
<div className="flex items-center justify-between p-4"> <div className="flex items-center justify-between p-4">
<button <button
disabled={isLoading} disabled={isLoading}
className="flex h-9 items-center rounded-md border border-gray-200 bg-white px-4 py-2 text-sm font-medium text-black outline-none hover:border-gray-300 hover:bg-gray-50 focus:border-gray-300 focus:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-70" className="flex h-9 items-center rounded-md border border-gray-200 bg-white px-4 py-2 text-sm font-medium text-black outline-hidden hover:border-gray-300 hover:bg-gray-50 focus:border-gray-300 focus:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-70"
onClick={onClose} onClick={onClose}
> >
{isLoading ? ( {isLoading ? (
@ -141,7 +141,7 @@ export function ShareRoadmapModal(props: ShareRoadmapModalProps) {
)} )}
</button> </button>
<button <button
className="flex h-9 items-center justify-center rounded-md border border-transparent bg-gray-900 px-4 py-2 text-sm font-medium text-white outline-none hover:bg-gray-800 focus:bg-gray-800" className="flex h-9 items-center justify-center rounded-md border border-transparent bg-gray-900 px-4 py-2 text-sm font-medium text-white outline-hidden hover:bg-gray-800 focus:bg-gray-800"
onClick={handleCopy} onClick={handleCopy}
> >
{isCopied ? ( {isCopied ? (

@ -92,7 +92,7 @@ export function SharedRoadmapList(props: SharedRoadmapListProps) {
> >
<a <a
href={`/r/=${roadmap?.slug}`} href={`/r/=${roadmap?.slug}`}
className="group inline-grid w-full grid-cols-[auto,16px] items-center justify-between gap-2 px-3 py-2 text-sm text-gray-600 transition-colors hover:bg-gray-100 hover:text-black" className="group inline-grid w-full grid-cols-[auto_16px] items-center justify-between gap-2 px-3 py-2 text-sm text-gray-600 transition-colors hover:bg-gray-100 hover:text-black"
target={'_blank'} target={'_blank'}
> >
<span className="w-full truncate"> <span className="w-full truncate">

@ -79,7 +79,7 @@ export function SubmitShowcaseWarning(props: SubmitShowcaseWarningProps) {
<div className="mt-4 grid grid-cols-2 gap-2"> <div className="mt-4 grid grid-cols-2 gap-2">
<button <button
className="flex-grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center text-sm hover:bg-gray-300" className="grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center text-sm hover:bg-gray-300"
onClick={onClose} onClick={onClose}
disabled={submit.isPending} disabled={submit.isPending}
> >

@ -62,7 +62,7 @@ export function DashboardAiRoadmaps(props: DashboardAiRoadmapsProps) {
<a <a
key={roadmap.id} key={roadmap.id}
href={`/ai/${roadmap.slug}`} href={`/ai/${roadmap.slug}`}
className="relative truncate rounded-md border bg-white p-2.5 text-left text-sm shadow-sm hover:border-gray-400 hover:bg-gray-50" className="relative truncate rounded-md border bg-white p-2.5 text-left text-sm shadow-xs hover:border-gray-400 hover:bg-gray-50"
> >
{roadmap.title} {roadmap.title}
</a> </a>

@ -15,7 +15,7 @@ export function DashboardCardLink(props: DashboardCardLinkProps) {
return ( return (
<a <a
className={cn( className={cn(
'relative mt-4 flex min-h-[220px] flex-col justify-end rounded-lg border border-gray-300 bg-gradient-to-br from-white to-gray-50 py-5 px-6 hover:border-gray-400 hover:from-white hover:to-gray-100', 'relative mt-4 flex min-h-[220px] flex-col justify-end rounded-lg border border-gray-300 bg-linear-to-br from-white to-gray-50 py-5 px-6 hover:border-gray-400 hover:from-white hover:to-gray-100',
className, className,
)} )}
href={href} href={href}

@ -36,7 +36,7 @@ export function DashboardCustomProgressCard(props: DashboardCustomProgressCardPr
return ( return (
<a <a
href={url} href={url}
className="group relative flex min-h-[80px] w-full flex-col justify-between overflow-hidden rounded-md border bg-white p-3 text-left text-sm shadow-sm transition-all hover:border-gray-400 hover:bg-gray-50" className="group relative flex min-h-[80px] w-full flex-col justify-between overflow-hidden rounded-md border bg-white p-3 text-left text-sm shadow-xs transition-all hover:border-gray-400 hover:bg-gray-50"
> >
<h4 className="truncate font-medium text-gray-900">{resourceTitle}</h4> <h4 className="truncate font-medium text-gray-900">{resourceTitle}</h4>

@ -38,7 +38,7 @@ export function DashboardProgressCard(props: DashboardProgressCardProps) {
key={resourceId} key={resourceId}
className="group relative flex w-full items-center justify-between overflow-hidden rounded-md border border-gray-300 bg-white px-3 py-2 text-left text-sm transition-all hover:border-gray-400" className="group relative flex w-full items-center justify-between overflow-hidden rounded-md border border-gray-300 bg-white px-3 py-2 text-left text-sm transition-all hover:border-gray-400"
> >
<span className="flex-grow truncate">{resourceTitle}</span> <span className="grow truncate">{resourceTitle}</span>
<span className="text-xs text-gray-400"> <span className="text-xs text-gray-400">
{parseInt(progressPercentage, 10)}% {parseInt(progressPercentage, 10)}%
</span> </span>

@ -25,7 +25,7 @@ export function DashboardProjectCard(props: DashboardProjectCardProps) {
> >
<span <span
className={cn( className={cn(
'flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full', 'flex h-5 w-5 shrink-0 items-center justify-center rounded-full',
{ {
'border border-green-500 bg-green-500 group-hover:border-green-600 group-hover:bg-green-600': 'border border-green-500 bg-green-500 group-hover:border-green-600 group-hover:bg-green-600':
status === 'submitted', status === 'submitted',
@ -41,8 +41,8 @@ export function DashboardProjectCard(props: DashboardProjectCardProps) {
/> />
)} )}
</span> </span>
<span className="flex-grow truncate group-hover:underline">{title.replace(/(System)|(Service)/, '')}</span> <span className="grow truncate group-hover:underline">{title.replace(/(System)|(Service)/, '')}</span>
<span className="flex-shrink-0 bg-transparent text-xs text-gray-400 no-underline"> <span className="shrink-0 bg-transparent text-xs text-gray-400 no-underline">
{!!startedAt && {!!startedAt &&
status === 'started' && status === 'started' &&
getRelativeTimeString(startedAt)} getRelativeTimeString(startedAt)}

@ -206,7 +206,7 @@ export function DashboardTeamRoadmaps(props: DashboardTeamRoadmapsProps) {
const roadmapHeading = ( const roadmapHeading = (
<div className="mb-3 flex h-[20px] items-center justify-between gap-2 text-xs"> <div className="mb-3 flex h-[20px] items-center justify-between gap-2 text-xs">
<h2 className="uppercase text-gray-400">Roadmaps</h2> <h2 className="uppercase text-gray-400">Roadmaps</h2>
<span className="mx-3 h-[1px] flex-grow bg-gray-200" /> <span className="mx-3 h-[1px] grow bg-gray-200" />
{canManageCurrentTeam && ( {canManageCurrentTeam && (
<a <a
href={`/team/roadmaps?t=${teamId}`} href={`/team/roadmaps?t=${teamId}`}

@ -17,7 +17,7 @@ export function EmptyStackMessage(props: EmptyStackMessageProps) {
<div className="absolute inset-0 flex items-center justify-center rounded-md bg-black/50"> <div className="absolute inset-0 flex items-center justify-center rounded-md bg-black/50">
<div <div
className={cn( className={cn(
'flex max-w-[200px] flex-col items-center justify-center rounded-md bg-white p-4 shadow-sm', 'flex max-w-[200px] flex-col items-center justify-center rounded-md bg-white p-4 shadow-xs',
bodyClassName, bodyClassName,
)} )}
> >

@ -111,7 +111,7 @@ export function TeamDashboard(props: TeamDashboardProps) {
<h2 className="mb-3 mt-6 flex h-[20px] items-center justify-between text-xs uppercase text-gray-400"> <h2 className="mb-3 mt-6 flex h-[20px] items-center justify-between text-xs uppercase text-gray-400">
Team Members Team Members
<span className="flex-grow h-[1px] bg-gray-200 mx-3" /> <span className="grow h-[1px] bg-gray-200 mx-3" />
{canManageCurrentTeam && ( {canManageCurrentTeam && (
<a <a
href={`/team/members?t=${teamId}`} href={`/team/members?t=${teamId}`}

@ -10,7 +10,7 @@ import DeleteAccountPopup from "./DeleteAccountPopup.astro";
<button <button
data-popup='delete-account-popup' data-popup='delete-account-popup'
class="mt-4 w-full rounded-lg bg-red-600 py-2 text-base font-regular text-white outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-1" class="mt-4 w-full rounded-lg bg-red-600 py-2 text-base font-regular text-white outline-hidden focus:ring-2 focus:ring-red-500 focus:ring-offset-1"
> >
Delete Account Delete Account
</button> </button>

@ -53,7 +53,7 @@ export function DeleteAccountForm() {
type="text" type="text"
name="delete-account" name="delete-account"
id="delete-account" id="delete-account"
className="mt-2 block w-full rounded-md border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:border-gray-400" className="mt-2 block w-full rounded-md border border-gray-300 px-3 py-2 outline-hidden placeholder:text-gray-400 focus:border-gray-400"
placeholder={'Type "delete" to confirm'} placeholder={'Type "delete" to confirm'}
required required
autoFocus autoFocus
@ -72,14 +72,14 @@ export function DeleteAccountForm() {
type="button" type="button"
disabled={isLoading} disabled={isLoading}
onClick={handleClosePopup} onClick={handleClosePopup}
className="flex-grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center" className="grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center"
> >
Cancel Cancel
</button> </button>
<button <button
type="submit" type="submit"
disabled={isLoading || confirmationText.toUpperCase() !== 'DELETE'} disabled={isLoading || confirmationText.toUpperCase() !== 'DELETE'}
className="flex-grow cursor-pointer rounded-lg bg-red-500 py-2 text-white disabled:opacity-40" className="grow cursor-pointer rounded-lg bg-red-500 py-2 text-white disabled:opacity-40"
> >
{isLoading ? 'Please wait ..' : 'Confirm'} {isLoading ? 'Please wait ..' : 'Confirm'}
</button> </button>

@ -73,7 +73,7 @@ export function DeleteTeamPopup(props: DeleteTeamPopupProps) {
<div className="relative h-full w-full max-w-md p-4 md:h-auto"> <div className="relative h-full w-full max-w-md p-4 md:h-auto">
<div <div
ref={popupBodyEl} ref={popupBodyEl}
className="popup-body relative rounded-lg bg-white p-4 shadow" className="popup-body relative rounded-lg bg-white p-4 shadow-sm"
> >
<h2 className="text-2xl font-semibold text-black">Delete Team</h2> <h2 className="text-2xl font-semibold text-black">Delete Team</h2>
<p className="text-gray-500"> <p className="text-gray-500">
@ -90,7 +90,7 @@ export function DeleteTeamPopup(props: DeleteTeamPopupProps) {
type="text" type="text"
name="delete-account" name="delete-account"
id="delete-account" id="delete-account"
className="mt-2 block w-full rounded-md border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:border-gray-400" className="mt-2 block w-full rounded-md border border-gray-300 px-3 py-2 outline-hidden placeholder:text-gray-400 focus:border-gray-400"
placeholder={'Type "delete" to confirm'} placeholder={'Type "delete" to confirm'}
required required
autoFocus autoFocus
@ -111,7 +111,7 @@ export function DeleteTeamPopup(props: DeleteTeamPopupProps) {
type="button" type="button"
disabled={isLoading} disabled={isLoading}
onClick={handleClosePopup} onClick={handleClosePopup}
className="flex-grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center" className="grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center"
> >
Cancel Cancel
</button> </button>
@ -120,7 +120,7 @@ export function DeleteTeamPopup(props: DeleteTeamPopupProps) {
disabled={ disabled={
isLoading || confirmationText.toUpperCase() !== 'DELETE' isLoading || confirmationText.toUpperCase() !== 'DELETE'
} }
className="flex-grow cursor-pointer rounded-lg bg-red-500 py-2 text-white disabled:opacity-40" className="grow cursor-pointer rounded-lg bg-red-500 py-2 text-white disabled:opacity-40"
> >
{isLoading ? 'Please wait ..' : 'Confirm'} {isLoading ? 'Please wait ..' : 'Confirm'}
</button> </button>

@ -41,7 +41,7 @@ export function DiscoverRoadmapSorting(props: DiscoverRoadmapSortingProps) {
return ( return (
<div <div
className="min-auto relative flex flex-shrink-0 sm:min-w-[140px]" className="min-auto relative flex shrink-0 sm:min-w-[140px]"
ref={dropdownRef} ref={dropdownRef}
> >
<button <button

@ -53,7 +53,7 @@ export function SearchRoadmap(props: SearchRoadmapProps) {
type="text" type="text"
minLength={3} minLength={3}
placeholder="Type 3 or more characters to search..." placeholder="Type 3 or more characters to search..."
className="w-full rounded-md border border-gray-200 px-3 py-2 pl-9 text-sm transition-colors focus:border-black focus:outline-none" className="w-full rounded-md border border-gray-200 px-3 py-2 pl-9 text-sm transition-colors focus:border-black focus:outline-hidden"
value={term} value={term}
onChange={(e) => setTerm(e.target.value)} onChange={(e) => setTerm(e.target.value)}
/> />
@ -64,7 +64,7 @@ export function SearchRoadmap(props: SearchRoadmapProps) {
)} )}
</form> </form>
{total > 0 && ( {total > 0 && (
<p className="hidden flex-shrink-0 text-sm text-gray-500 sm:block"> <p className="hidden shrink-0 text-sm text-gray-500 sm:block">
{Intl.NumberFormat('en-US', { {Intl.NumberFormat('en-US', {
notation: 'compact', notation: 'compact',
}).format(total)}{' '} }).format(total)}{' '}

@ -35,7 +35,7 @@ export function AIRoadmapsList(props: AIRoadmapsListProps) {
className="flex min-h-[95px] flex-col rounded-md border transition-colors hover:bg-gray-100" className="flex min-h-[95px] flex-col rounded-md border transition-colors hover:bg-gray-100"
target={'_blank'} target={'_blank'}
> >
<h2 className="flex-grow px-2.5 py-2.5 text-base font-medium leading-tight"> <h2 className="grow px-2.5 py-2.5 text-base font-medium leading-tight">
{roadmap.title} {roadmap.title}
</h2> </h2>
<div className="flex items-center justify-between gap-2 px-2.5 py-2"> <div className="flex items-center justify-between gap-2 px-2.5 py-2">

@ -46,7 +46,7 @@ export function ExploreAISearch(props: ExploreAISearchProps) {
name="search" name="search"
type="text" type="text"
placeholder="Type 3 or more characters to search..." placeholder="Type 3 or more characters to search..."
className="w-full rounded-md border border-gray-200 px-3 py-2 pl-9 text-sm transition-colors focus:border-black focus:outline-none" className="w-full rounded-md border border-gray-200 px-3 py-2 pl-9 text-sm transition-colors focus:border-black focus:outline-hidden"
value={term} value={term}
onChange={(e) => setTerm(e.target.value)} onChange={(e) => setTerm(e.target.value)}
/> />
@ -57,7 +57,7 @@ export function ExploreAISearch(props: ExploreAISearchProps) {
)} )}
</div> </div>
{total > 0 && ( {total > 0 && (
<p className="flex-shrink-0 text-sm text-gray-500 hidden sm:block"> <p className="shrink-0 text-sm text-gray-500 hidden sm:block">
{Intl.NumberFormat('en-US', { {Intl.NumberFormat('en-US', {
notation: 'compact', notation: 'compact',
}).format(total)}{' '} }).format(total)}{' '}

@ -37,7 +37,7 @@ export function ExploreAISorting(props: ExploreAISortingProps) {
return ( return (
<div <div
className="min-auto relative flex flex-shrink-0 sm:min-w-[140px]" className="min-auto relative flex shrink-0 sm:min-w-[140px]"
ref={dropdownRef} ref={dropdownRef}
> >
<button <button

@ -31,7 +31,7 @@ const sortedGuides: (QuestionGroupType | GuideFileType)[] = [
<a <a
href='/guides' href='/guides'
class='hidden rounded-full bg-gradient-to-r from-slate-600 to-black px-3 py-2 text-xs font-medium text-white transition-colors hover:from-blue-600 hover:to-blue-800 sm:inline' class='hidden rounded-full bg-linear-to-r from-slate-600 to-black px-3 py-2 text-xs font-medium text-white transition-colors hover:from-blue-600 hover:to-blue-800 sm:inline'
> >
View All Guides &rarr; View All Guides &rarr;
</a> </a>

@ -19,7 +19,7 @@ const { heading, videos } = Astro.props;
<a <a
href='/videos' href='/videos'
class='hidden sm:inline transition-colors py-2 px-3 text-xs font-medium rounded-full bg-gradient-to-r from-slate-600 to-black hover:from-blue-600 hover:to-blue-800 text-white' class='hidden sm:inline transition-colors py-2 px-3 text-xs font-medium rounded-full bg-linear-to-r from-slate-600 to-black hover:from-blue-600 hover:to-blue-800 text-white'
> >
View All Videos &rarr; View All Videos &rarr;
</a> </a>

@ -68,7 +68,7 @@ export function SubmitFeedbackPopup(props: SubmitFeedbackPopupProps) {
<div className="relative h-full w-full max-w-md p-4 md:h-auto"> <div className="relative h-full w-full max-w-md p-4 md:h-auto">
<div <div
ref={popupBodyEl} ref={popupBodyEl}
className="popup-body relative rounded-lg bg-white p-4 shadow" className="popup-body relative rounded-lg bg-white p-4 shadow-sm"
> >
{!isSuccess && ( {!isSuccess && (
<> <>
@ -84,7 +84,7 @@ export function SubmitFeedbackPopup(props: SubmitFeedbackPopupProps) {
ref={inputEl} ref={inputEl}
name="submit-feedback" name="submit-feedback"
id="submit-feedback" id="submit-feedback"
className="mt-2 block min-h-[150px] w-full resize-none rounded-md border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400" className="mt-2 block min-h-[150px] w-full resize-none rounded-md border border-gray-300 px-3 py-2 outline-hidden placeholder:text-gray-400"
placeholder="Enter your feedback" placeholder="Enter your feedback"
required required
autoFocus autoFocus
@ -105,14 +105,14 @@ export function SubmitFeedbackPopup(props: SubmitFeedbackPopupProps) {
type="button" type="button"
disabled={isLoading} disabled={isLoading}
onClick={handleClosePopup} onClick={handleClosePopup}
className="flex-grow cursor-pointer rounded-md bg-gray-200 py-2 text-center" className="grow cursor-pointer rounded-md bg-gray-200 py-2 text-center"
> >
Cancel Cancel
</button> </button>
<button <button
disabled={isLoading} disabled={isLoading}
type="submit" type="submit"
className="flex-grow cursor-pointer rounded-md bg-black py-2 text-white disabled:opacity-40" className="grow cursor-pointer rounded-md bg-black py-2 text-white disabled:opacity-40"
> >
{isLoading ? 'Please wait ..' : 'Send'} {isLoading ? 'Please wait ..' : 'Send'}
</button> </button>
@ -133,7 +133,7 @@ export function SubmitFeedbackPopup(props: SubmitFeedbackPopupProps) {
<button <button
type="button" type="button"
onClick={handleClosePopup} onClick={handleClosePopup}
className="mt-4 w-full flex-grow cursor-pointer rounded-lg bg-black py-2 text-center text-white disabled:opacity-40" className="mt-4 w-full grow cursor-pointer rounded-lg bg-black py-2 text-center text-white disabled:opacity-40"
> >
Close Close
</button> </button>

@ -88,7 +88,7 @@ export function ProgressNudge(props: ProgressNudgeProps) {
}} }}
className="group relative flex items-center gap-2 rounded-full bg-stone-900 px-3 text-sm text-yellow-400" className="group relative flex items-center gap-2 rounded-full bg-stone-900 px-3 text-sm text-yellow-400"
> >
<Calendar className="h-4 w-4 flex-shrink-0" strokeWidth={2.5} /> <Calendar className="h-4 w-4 shrink-0" strokeWidth={2.5} />
</button> </button>
)} )}
<button <button
@ -97,7 +97,7 @@ export function ProgressNudge(props: ProgressNudgeProps) {
}} }}
className="group relative flex items-center gap-2 rounded-full bg-stone-900 px-3 text-sm text-yellow-400" className="group relative flex items-center gap-2 rounded-full bg-stone-900 px-3 text-sm text-yellow-400"
> >
<X className="h-4 w-4 flex-shrink-0" strokeWidth={2.5} /> <X className="h-4 w-4 shrink-0" strokeWidth={2.5} />
</button> </button>
</div> </div>
</> </>

@ -28,7 +28,7 @@ export function EmptyFriends(props: EmptyFriendsProps) {
}} }}
type="text" type="text"
value={befriendUrl} value={befriendUrl}
className="w-full border-none bg-transparent px-1.5 outline-none" className="w-full border-none bg-transparent px-1.5 outline-hidden"
readOnly readOnly
/> />
<button <button

@ -98,7 +98,7 @@ export function FriendProgressItem(props: FriendProgressItemProps) {
progress?.renderer, progress?.renderer,
) )
} }
className="group relative overflow-hidden rounded-md border p-2 hover:border-gray-300 hover:text-black focus:outline-none" className="group relative overflow-hidden rounded-md border p-2 hover:border-gray-300 hover:text-black focus:outline-hidden"
key={progress.resourceId} key={progress.resourceId}
> >
<span className="relative z-10 flex items-center justify-between text-sm"> <span className="relative z-10 flex items-center justify-between text-sm">
@ -186,7 +186,7 @@ export function FriendProgressItem(props: FriendProgressItemProps) {
{friend.status === 'rejected' && ( {friend.status === 'rejected' && (
<> <>
<div <div
className={'flex w-full flex-grow items-center justify-center'} className={'flex w-full grow items-center justify-center'}
> >
<span className=" flex flex-col items-center text-red-500"> <span className=" flex flex-col items-center text-red-500">
<DeleteUserIcon additionalClasses="mr-2 h-8 w-8 mb-1" /> <DeleteUserIcon additionalClasses="mr-2 h-8 w-8 mb-1" />
@ -214,7 +214,7 @@ export function FriendProgressItem(props: FriendProgressItemProps) {
{friend.status === 'got_rejected' && ( {friend.status === 'got_rejected' && (
<> <>
<div <div
className={'flex w-full flex-grow items-center justify-center'} className={'flex w-full grow items-center justify-center'}
> >
<span className=" flex flex-col items-center text-sm text-red-500"> <span className=" flex flex-col items-center text-sm text-red-500">
<DeleteUserIcon additionalClasses="mr-2 h-8 w-8 mb-1" /> <DeleteUserIcon additionalClasses="mr-2 h-8 w-8 mb-1" />
@ -242,7 +242,7 @@ export function FriendProgressItem(props: FriendProgressItemProps) {
{friend.status === 'sent' && ( {friend.status === 'sent' && (
<> <>
<div <div
className={'flex w-full flex-grow items-center justify-center'} className={'flex w-full grow items-center justify-center'}
> >
<span className=" flex flex-col items-center text-green-500"> <span className=" flex flex-col items-center text-green-500">
<AddedUserIcon additionalClasses="mr-2 h-8 w-8 mb-1" /> <AddedUserIcon additionalClasses="mr-2 h-8 w-8 mb-1" />
@ -296,7 +296,7 @@ export function FriendProgressItem(props: FriendProgressItemProps) {
<> <>
<div <div
className={ className={
'flex w-full flex-grow flex-col items-center justify-center px-4' 'flex w-full grow flex-col items-center justify-center px-4'
} }
> >
<AddUserIcon additionalClasses="mr-2 h-8 w-8 mb-1 text-green-500" /> <AddUserIcon additionalClasses="mr-2 h-8 w-8 mb-1 text-green-500" />

@ -27,7 +27,7 @@ export function InviteFriendPopup(props: InviteFriendPopupProps) {
<div className="relative h-full w-full max-w-md p-4 md:h-auto"> <div className="relative h-full w-full max-w-md p-4 md:h-auto">
<div <div
ref={popupBodyRef} ref={popupBodyRef}
className="popup-body relative rounded-lg bg-white p-4 shadow" className="popup-body relative rounded-lg bg-white p-4 shadow-sm"
> >
<h3 className="mb-1.5 text-xl font-medium sm:text-2xl">Invite URL</h3> <h3 className="mb-1.5 text-xl font-medium sm:text-2xl">Invite URL</h3>
<p className="mb-3 hidden text-sm leading-none text-gray-400 sm:block"> <p className="mb-3 hidden text-sm leading-none text-gray-400 sm:block">
@ -37,7 +37,7 @@ export function InviteFriendPopup(props: InviteFriendPopupProps) {
<div className="mt-4 flex flex-col gap-2 sm:mt-4"> <div className="mt-4 flex flex-col gap-2 sm:mt-4">
<input <input
readOnly={true} readOnly={true}
className="mt-2 block w-full rounded-md border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:border-gray-400" className="mt-2 block w-full rounded-md border border-gray-300 px-3 py-2 outline-hidden placeholder:text-gray-400 focus:border-gray-400"
value={befriendUrl} value={befriendUrl}
onClick={(e: MouseEvent<HTMLInputElement>) => { onClick={(e: MouseEvent<HTMLInputElement>) => {
(e?.target as HTMLInputElement)?.select(); (e?.target as HTMLInputElement)?.select();

@ -176,7 +176,7 @@ export function AITermSuggestionInput(props: AITermSuggestionInputProps) {
type="text" type="text"
value={defaultValue} value={defaultValue}
className={cn( className={cn(
'w-full rounded-md border border-gray-400 px-3 py-2.5 pr-8 transition-colors focus:border-black focus:outline-none', 'w-full rounded-md border border-gray-400 px-3 py-2.5 pr-8 transition-colors focus:border-black focus:outline-hidden',
inputClassName, inputClassName,
)} )}
placeholder={placeholder} placeholder={placeholder}
@ -240,7 +240,7 @@ export function AITermSuggestionInput(props: AITermSuggestionInputProps) {
searchResults.length > 0 && searchResults.length > 0 &&
searchedText.length > 0 && ( searchedText.length > 0 && (
<div <div
className="absolute top-full z-50 mt-1 w-full rounded-md border bg-white p-1 shadow" className="absolute top-full z-50 mt-1 w-full rounded-md border bg-white p-1 shadow-sm"
ref={dropdownRef} ref={dropdownRef}
> >
<div className="flex flex-col"> <div className="flex flex-col">
@ -250,7 +250,7 @@ export function AITermSuggestionInput(props: AITermSuggestionInputProps) {
key={result?._id} key={result?._id}
type="button" type="button"
className={cn( className={cn(
'flex w-full items-start rounded p-2 text-left text-sm', 'flex w-full items-start rounded-sm p-2 text-left text-sm',
counter === activeCounter ? 'bg-gray-100' : '', counter === activeCounter ? 'bg-gray-100' : '',
)} )}
onMouseOver={() => setActiveCounter(counter)} onMouseOver={() => setActiveCounter(counter)}

@ -507,7 +507,7 @@ export function GenerateRoadmap(props: GenerateRoadmapProps) {
/> />
)} )}
<section className="flex flex-grow flex-col bg-gray-100"> <section className="flex grow flex-col bg-gray-100">
<div className="flex items-center justify-center border-b bg-white py-3 sm:py-6"> <div className="flex items-center justify-center border-b bg-white py-3 sm:py-6">
{isLoading && ( {isLoading && (
<span className="flex items-center gap-2 rounded-full bg-black px-3 py-1 text-white"> <span className="flex items-center gap-2 rounded-full bg-black px-3 py-1 text-white">
@ -516,7 +516,7 @@ export function GenerateRoadmap(props: GenerateRoadmapProps) {
</span> </span>
)} )}
{!isLoading && ( {!isLoading && (
<div className="container flex flex-grow flex-col items-start"> <div className="container flex grow flex-col items-start">
<AIRoadmapAlert /> <AIRoadmapAlert />
{isKeyOnly && isAuthenticatedUser && ( {isKeyOnly && isAuthenticatedUser && (
<div className="flex flex-row gap-4"> <div className="flex flex-row gap-4">
@ -606,7 +606,7 @@ export function GenerateRoadmap(props: GenerateRoadmapProps) {
<button <button
type={'submit'} type={'submit'}
className={cn( className={cn(
'flex min-w-[127px] flex-shrink-0 items-center justify-center gap-2 rounded-md bg-black px-4 py-2 text-white', 'flex min-w-[127px] shrink-0 items-center justify-center gap-2 rounded-md bg-black px-4 py-2 text-white',
'disabled:cursor-not-allowed disabled:opacity-50', 'disabled:cursor-not-allowed disabled:opacity-50',
)} )}
onClick={(e) => { onClick={(e) => {
@ -732,7 +732,7 @@ export function GenerateRoadmap(props: GenerateRoadmapProps) {
/> />
{!isAuthenticatedUser && ( {!isAuthenticatedUser && (
<div className="absolute bottom-0 left-0 right-0"> <div className="absolute bottom-0 left-0 right-0">
<div className="h-80 w-full bg-gradient-to-t from-gray-100 to-transparent" /> <div className="h-80 w-full bg-linear-to-t from-gray-100 to-transparent" />
<div className="bg-gray-100"> <div className="bg-gray-100">
<div className="mx-auto max-w-[600px] flex-col items-center justify-center bg-gray-100 px-5 pt-px"> <div className="mx-auto max-w-[600px] flex-col items-center justify-center bg-gray-100 px-5 pt-px">
<div className="mt-8 text-center"> <div className="mt-8 text-center">

@ -32,7 +32,7 @@ export function OpenAISettings(props: OpenAISettingsProps) {
<div className="p-4"> <div className="p-4">
<button <button
onClick={onBack} onClick={onBack}
className="mb-5 flex items-center gap-1.5 text-sm leading-none opacity-40 transition-opacity hover:opacity-100 focus:outline-none" className="mb-5 flex items-center gap-1.5 text-sm leading-none opacity-40 transition-opacity hover:opacity-100 focus:outline-hidden"
> >
<ChevronLeft size={16} /> <ChevronLeft size={16} />
Back to options Back to options
@ -97,7 +97,7 @@ export function OpenAISettings(props: OpenAISettingsProps) {
name="openai-api-key" name="openai-api-key"
id="openai-api-key" id="openai-api-key"
className={cn( className={cn(
'block w-full rounded-md border border-gray-300 px-3 py-2 text-gray-800 transition-colors focus:border-black focus:outline-none', 'block w-full rounded-md border border-gray-300 px-3 py-2 text-gray-800 transition-colors focus:border-black focus:outline-hidden',
{ {
'border-red-500 bg-red-100 focus:border-red-500': error, 'border-red-500 bg-red-100 focus:border-red-500': error,
}, },

@ -22,7 +22,7 @@ export function PayToBypass(props: PayToBypassProps) {
<div className="p-4"> <div className="p-4">
<button <button
onClick={onBack} onClick={onBack}
className="mb-5 flex items-center gap-1.5 text-sm leading-none opacity-40 transition-opacity hover:opacity-100 focus:outline-none" className="mb-5 flex items-center gap-1.5 text-sm leading-none opacity-40 transition-opacity hover:opacity-100 focus:outline-hidden"
> >
<ChevronLeft size={16} /> <ChevronLeft size={16} />
Back to options Back to options
@ -46,7 +46,7 @@ export function PayToBypass(props: PayToBypassProps) {
id={userId} id={userId}
name={userId} name={userId}
type="text" type="text"
className="block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
value={user?.id} value={user?.id}
readOnly readOnly
/> />
@ -59,7 +59,7 @@ export function PayToBypass(props: PayToBypassProps) {
id={nameId} id={nameId}
name={nameId} name={nameId}
type="text" type="text"
className="block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
value={user?.name} value={user?.name}
readOnly readOnly
/> />
@ -72,7 +72,7 @@ export function PayToBypass(props: PayToBypassProps) {
id={emailId} id={emailId}
name={emailId} name={emailId}
type="email" type="email"
className="block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
value={user?.email} value={user?.email}
readOnly readOnly
/> />
@ -90,7 +90,7 @@ export function PayToBypass(props: PayToBypassProps) {
name={amountId} name={amountId}
type="text" type="text"
required required
className="block w-full rounded-lg border p-3 py-2 shadow-sm outline-none placeholder:text-sm placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1" className="block w-full rounded-lg border p-3 py-2 shadow-xs outline-hidden placeholder:text-sm placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="How much are you willing to pay for this?" placeholder="How much are you willing to pay for this?"
/> />
</div> </div>
@ -105,7 +105,7 @@ export function PayToBypass(props: PayToBypassProps) {
id={roadmapCountId} id={roadmapCountId}
name={roadmapCountId} name={roadmapCountId}
required required
className="placeholder-text-gray-400 block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-sm focus:ring-2 focus:ring-black focus:ring-offset-1" className="placeholder-text-gray-400 block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden placeholder:text-sm focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="How many roadmaps you will be generating (daily, or monthly)?" placeholder="How many roadmaps you will be generating (daily, or monthly)?"
/> />
</div> </div>
@ -117,7 +117,7 @@ export function PayToBypass(props: PayToBypassProps) {
id={usageId} id={usageId}
name={usageId} name={usageId}
required required
className="placeholder-text-gray-400 block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-sm focus:ring-2 focus:ring-black focus:ring-offset-1" className="placeholder-text-gray-400 block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden placeholder:text-sm focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="How will you be using this" placeholder="How will you be using this"
/> />
</div> </div>
@ -131,7 +131,7 @@ export function PayToBypass(props: PayToBypassProps) {
<textarea <textarea
id={feedbackId} id={feedbackId}
name={feedbackId} name={feedbackId}
className="placeholder-text-gray-400 block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-sm focus:ring-2 focus:ring-black focus:ring-offset-1" className="placeholder-text-gray-400 block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-xs outline-hidden placeholder:text-sm focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Do you have any feedback?" placeholder="Do you have any feedback?"
/> />
</div> </div>

@ -32,7 +32,7 @@ export function ReferYourFriend(props: ReferYourFriendProps) {
<div className="p-4"> <div className="p-4">
<button <button
onClick={onBack} onClick={onBack}
className="mb-5 flex items-center gap-1.5 text-sm leading-none opacity-40 transition-opacity hover:opacity-100 focus:outline-none" className="mb-5 flex items-center gap-1.5 text-sm leading-none opacity-40 transition-opacity hover:opacity-100 focus:outline-hidden"
> >
<ChevronLeft size={16} /> <ChevronLeft size={16} />
Back to options Back to options
@ -49,7 +49,7 @@ export function ReferYourFriend(props: ReferYourFriendProps) {
<label className="mt-4 flex flex-col gap-2"> <label className="mt-4 flex flex-col gap-2">
<input <input
ref={inputRef} ref={inputRef}
className="w-full rounded-md border bg-gray-100 p-2 px-2.5 text-gray-700 focus:outline-none" className="w-full rounded-md border bg-gray-100 p-2 px-2.5 text-gray-700 focus:outline-hidden"
value={referralLink} value={referralLink}
readOnly={true} readOnly={true}
onClick={handleCopy} onClick={handleCopy}

@ -124,7 +124,7 @@ export function RoadmapTopicDetail(props: RoadmapTopicDetailProps) {
const openAIKey = getOpenAIKey(); const openAIKey = getOpenAIKey();
return ( return (
<div className={'relative z-[92]'}> <div className={'relative z-92'}>
<div <div
ref={topicRef} ref={topicRef}
tabIndex={0} tabIndex={0}

@ -20,7 +20,7 @@ export function RoadmapCard(props: RoadmapCardProps) {
if (isUpcoming) { if (isUpcoming) {
return ( return (
<div className="group relative block rounded-xl border border-gray-300 bg-gradient-to-br from-gray-100 to-gray-50 p-5 overflow-hidden"> <div className="group relative block rounded-xl border border-gray-300 bg-linear-to-br from-gray-100 to-gray-50 p-5 overflow-hidden">
<div className="mb-2 sm:mb-5 flex flex-row items-center"> <div className="mb-2 sm:mb-5 flex flex-row items-center">
<div className="flex h-7 w-7 sm:h-9 sm:w-9 items-center justify-center rounded-full bg-gray-900 text-white"> <div className="flex h-7 w-7 sm:h-9 sm:w-9 items-center justify-center rounded-full bg-gray-900 text-white">
<Icon className="h-3 sm:h-5" /> <Icon className="h-3 sm:h-5" />
@ -52,8 +52,8 @@ export function RoadmapCard(props: RoadmapCardProps) {
<a <a
href={link} href={link}
target={'_blank'} target={'_blank'}
className="group relative block rounded-xl border border-gray-300 bg-gradient-to-br from-gray-100 to-gray-50 className="group relative block rounded-xl border border-gray-300 bg-linear-to-br from-gray-100 to-gray-50
p-3.5 sm:p-5 transition-colors duration-200 ease-in-out hover:cursor-pointer hover:border-black/30 hover:bg-gray-50/70 hover:shadow-sm" p-3.5 sm:p-5 transition-colors duration-200 ease-in-out hover:cursor-pointer hover:border-black/30 hover:bg-gray-50/70 hover:shadow-xs"
> >
<div className="mb-2 sm:mb-5 flex flex-row items-center"> <div className="mb-2 sm:mb-5 flex flex-row items-center">
<div className="flex h-7 w-7 sm:h-9 sm:w-9 items-center justify-center rounded-full bg-gray-900 text-white"> <div className="flex h-7 w-7 sm:h-9 sm:w-9 items-center justify-center rounded-full bg-gray-900 text-white">

@ -16,7 +16,7 @@ export function RoadmapMultiCard(props: RoadmapMultiCardProps) {
const { roadmaps, description, secondaryRoadmaps, secondaryDescription } = props; const { roadmaps, description, secondaryRoadmaps, secondaryDescription } = props;
return ( return (
<div <div
className="relative flex flex-col overflow-hidden rounded-xl border border-gray-300 bg-gradient-to-br from-gray-100 className="relative flex flex-col overflow-hidden rounded-xl border border-gray-300 bg-linear-to-br from-gray-100
to-gray-50 ease-in-out" to-gray-50 ease-in-out"
> >
<div className="flex flex-col divide-y"> <div className="flex flex-col divide-y">
@ -25,7 +25,7 @@ export function RoadmapMultiCard(props: RoadmapMultiCardProps) {
target={'_blank'} target={'_blank'}
key={index} key={index}
href={roadmap.link} href={roadmap.link}
className="group text-sm sm:text-base flex w-full items-center justify-between gap-2 bg-gradient-to-br from-gray-100 to-gray-50 px-4 sm:px-5 py-2 transition-colors duration-200" className="group text-sm sm:text-base flex w-full items-center justify-between gap-2 bg-linear-to-br from-gray-100 to-gray-50 px-4 sm:px-5 py-2 transition-colors duration-200"
> >
{roadmap.title} {roadmap.title}
<ExternalLink className="lucide lucide-external-link h-4 text-gray-300 transition group-hover:text-gray-700" /> <ExternalLink className="lucide lucide-external-link h-4 text-gray-300 transition group-hover:text-gray-700" />
@ -33,7 +33,7 @@ export function RoadmapMultiCard(props: RoadmapMultiCardProps) {
))} ))}
</div> </div>
<p className="flex-grow bg-gray-200/70 p-4 sm:p-5 text-sm text-gray-500"> <p className="grow bg-gray-200/70 p-4 sm:p-5 text-sm text-gray-500">
{description} {description}
</p> </p>
@ -44,7 +44,7 @@ export function RoadmapMultiCard(props: RoadmapMultiCardProps) {
target={'_blank'} target={'_blank'}
key={index} key={index}
href={roadmap.link} href={roadmap.link}
className="group text-sm sm:text-base flex w-full items-center justify-between gap-2 bg-gradient-to-br from-gray-100 to-gray-50 px-5 py-2 transition-colors duration-200" className="group text-sm sm:text-base flex w-full items-center justify-between gap-2 bg-linear-to-br from-gray-100 to-gray-50 px-5 py-2 transition-colors duration-200"
> >
{roadmap.title} {roadmap.title}
<ExternalLink className="lucide lucide-external-link h-4 text-gray-300 transition group-hover:text-gray-700" /> <ExternalLink className="lucide lucide-external-link h-4 text-gray-300 transition group-hover:text-gray-700" />
@ -54,7 +54,7 @@ export function RoadmapMultiCard(props: RoadmapMultiCardProps) {
)} )}
{secondaryDescription && ( {secondaryDescription && (
<p className="flex-grow bg-gray-200/70 p-4 sm:p-5 text-sm text-gray-500"> <p className="grow bg-gray-200/70 p-4 sm:p-5 text-sm text-gray-500">
{secondaryDescription} {secondaryDescription}
</p> </p>
)} )}

@ -12,7 +12,7 @@ export function RoleRoadmaps(props: RoleRoadmapsProps) {
const { badge, title, description, children } = props; const { badge, title, description, children } = props;
return ( return (
<div className="bg-gradient-to-b from-gray-100 to-white py-5 sm:py-8 md:py-12"> <div className="bg-linear-to-b from-gray-100 to-white py-5 sm:py-8 md:py-12">
<div className="container"> <div className="container">
<div className="text-left"> <div className="text-left">
<SectionBadge title={badge} /> <SectionBadge title={badge} />

@ -27,7 +27,7 @@ const { url, title, description, isNew } = Astro.props;
{ {
isNew && ( isNew && (
<span class='flex items-center gap-1.5 absolute bottom-1.5 right-1 rounded-sm text-xs font-semibold uppercase text-purple-500 sm:px-1.5'> <span class='flex items-center gap-1.5 absolute bottom-1.5 right-1 rounded-xs text-xs font-semibold uppercase text-purple-500 sm:px-1.5'>
<span class='relative flex h-2 w-2'> <span class='relative flex h-2 w-2'>
<span class='absolute inline-flex h-full w-full animate-ping rounded-full bg-purple-400 opacity-75' /> <span class='absolute inline-flex h-full w-full animate-ping rounded-full bg-purple-400 opacity-75' />
<span class='relative inline-flex h-2 w-2 rounded-full bg-purple-500' /> <span class='relative inline-flex h-2 w-2 rounded-full bg-purple-500' />

@ -22,7 +22,7 @@ const { frontmatter: guideFrontmatter, author } = guide;
<article class='lg:grid lg:max-w-full lg:grid-cols-[1fr_minmax(0,700px)_1fr]'> <article class='lg:grid lg:max-w-full lg:grid-cols-[1fr_minmax(0,700px)_1fr]'>
{ {
(showTableOfContent || showRelatedGuides) && ( (showTableOfContent || showRelatedGuides) && (
<div class='sticky top-0 lg:relative bg-gradient-to-r from-gray-50 py-0 lg:col-start-3 lg:col-end-4 lg:row-start-1'> <div class='sticky top-0 lg:relative bg-linear-to-r from-gray-50 py-0 lg:col-start-3 lg:col-end-4 lg:row-start-1'>
<RelatedGuides <RelatedGuides
relatedTitle={guideFrontmatter?.relatedTitle} relatedTitle={guideFrontmatter?.relatedTitle}
relatedGuides={guide?.relatedGuides || {}} relatedGuides={guide?.relatedGuides || {}}

@ -42,7 +42,7 @@ export function RelatedGuides(props: RelatedGuidesProps) {
<ol <ol
className={cn( className={cn(
'mt-0.5 space-y-0 max-lg:absolute max-lg:top-full max-lg:z-10 max-lg:mt-0 max-lg:w-full max-lg:bg-white max-lg:shadow', 'mt-0.5 space-y-0 max-lg:absolute max-lg:top-full max-lg:z-10 max-lg:mt-0 max-lg:w-full max-lg:bg-white max-lg:shadow-sm',
!isOpen && 'hidden lg:block', !isOpen && 'hidden lg:block',
isOpen && 'block', isOpen && 'block',
)} )}

@ -41,7 +41,7 @@ if (isQuestionGroupType(guide)) {
{ {
frontmatter.isNew && ( frontmatter.isNew && (
<span class='ml-1.5 rounded-sm bg-green-300 px-1.5 py-0.5 text-xs font-medium uppercase text-green-900'> <span class='ml-1.5 rounded-xs bg-green-300 px-1.5 py-0.5 text-xs font-medium uppercase text-green-900'>
New New
<span class='hidden sm:inline'> <span class='hidden sm:inline'>
&middot; &middot;

@ -143,7 +143,7 @@ export function FavoriteRoadmaps() {
className={`transition-opacity duration-500 opacity-${containerOpacity}`} className={`transition-opacity duration-500 opacity-${containerOpacity}`}
> >
<div <div
className={`flex min-h-[192px] bg-gradient-to-b sm:min-h-[280px] ${ className={`flex min-h-[192px] bg-linear-to-b sm:min-h-[280px] ${
hasProgress && `border-t border-t-[#1e293c]` hasProgress && `border-t border-t-[#1e293c]`
}`} }`}
> >

@ -14,7 +14,7 @@ import { FeatureAnnouncement } from "../FeatureAnnouncement";
</p> </p>
<h1 <h1
class='mb-2 bg-gradient-to-b from-amber-50 to-purple-500 bg-clip-text text-2xl font-bold text-transparent sm:mb-4 sm:text-5xl sm:leading-tight' class='mb-2 bg-linear-to-b from-amber-50 to-purple-500 bg-clip-text text-2xl font-bold text-transparent sm:mb-4 sm:text-5xl sm:leading-tight'
> >
Developer Roadmaps Developer Roadmaps
</h1> </h1>

@ -112,7 +112,7 @@ function LeaderboardLane(props: LeaderboardLaneProps) {
const { users: usersToShow, emptyIcon, emptyText } = activeTab; const { users: usersToShow, emptyIcon, emptyText } = activeTab;
return ( return (
<div className="flex min-h-[450px] flex-col overflow-hidden rounded-xl border bg-white shadow-sm"> <div className="flex min-h-[450px] flex-col overflow-hidden rounded-xl border bg-white shadow-xs">
<div className="mb-3 flex items-center justify-between gap-2 px-3 py-3"> <div className="mb-3 flex items-center justify-between gap-2 px-3 py-3">
<h3 className="text-sm font-medium"> <h3 className="text-sm font-medium">
{title}{' '} {title}{' '}
@ -149,7 +149,7 @@ function LeaderboardLane(props: LeaderboardLaneProps) {
</div> </div>
{usersToShow.length === 0 && emptyText && ( {usersToShow.length === 0 && emptyText && (
<div className="flex flex-grow flex-col items-center justify-center p-8"> <div className="flex grow flex-col items-center justify-center p-8">
{emptyIcon} {emptyIcon}
<p className="mt-4 text-sm text-gray-500">{emptyText}</p> <p className="mt-4 text-sm text-gray-500">{emptyText}</p>
</div> </div>

@ -8,7 +8,7 @@ const { class: className } = Astro.props;
<div <div
class:list={[ class:list={[
'container prose prose-xl prose-h2:mb-3 prose-h2:mt-10 prose-h2:scroll-mt-5 prose-h2:text-balance prose-h2:text-3xl prose-h3:mt-2 prose-h3:scroll-mt-5 prose-h3:text-balance prose-h4:text-balance prose-h5:text-balance prose-h5:font-medium prose-blockquote:font-normal prose-code:bg-transparent prose-img:mt-1 prose-h2:sm:scroll-mt-10 prose-h3:sm:scroll-mt-10', 'container prose prose-xl prose-h2:mb-3 prose-h2:mt-10 prose-h2:scroll-mt-5 prose-h2:text-balance prose-h2:text-3xl prose-h3:mt-2 prose-h3:scroll-mt-5 prose-h3:text-balance prose-h4:text-balance prose-h5:text-balance prose-h5:font-medium prose-blockquote:font-normal prose-code:bg-transparent prose-img:mt-1 sm:prose-h2:scroll-mt-10 sm:prose-h3:scroll-mt-10',
className, className,
]} ]}
> >

@ -33,7 +33,7 @@ export function Modal(props: ModalProps) {
return ( return (
<div <div
className={cn( className={cn(
'fixed left-0 right-0 top-0 z-[99] flex h-full items-center justify-center overflow-y-auto overflow-x-hidden bg-black/50', 'fixed left-0 right-0 top-0 z-99 flex h-full items-center justify-center overflow-y-auto overflow-x-hidden bg-black/50',
overlayClassName, overlayClassName,
)} )}
> >
@ -46,7 +46,7 @@ export function Modal(props: ModalProps) {
<div <div
ref={popupBodyEl} ref={popupBodyEl}
className={cn( className={cn(
'relative h-full rounded-lg bg-white shadow', 'relative h-full rounded-lg bg-white shadow-sm',
bodyClassName, bodyClassName,
)} )}
> >

@ -4,7 +4,7 @@ import Icon from '../AstroIcon.astro';
<div class='relative hidden' data-auth-required> <div class='relative hidden' data-auth-required>
<button <button
class='flex h-8 w-38 items-center justify-center rounded-full bg-gradient-to-r from-purple-500 to-purple-700 px-4 py-2 text-sm font-medium text-white hover:from-purple-500 hover:to-purple-600' class='flex h-8 w-38 items-center justify-center rounded-full bg-linear-to-r from-purple-500 to-purple-700 px-4 py-2 text-sm font-medium text-white hover:from-purple-500 hover:to-purple-600'
type='button' type='button'
data-account-button data-account-button
> >
@ -25,7 +25,7 @@ import Icon from '../AstroIcon.astro';
<li class='px-1'> <li class='px-1'>
<a <a
href='/account' href='/account'
class='block rounded px-4 py-2 text-sm font-medium text-slate-100 hover:bg-slate-700' class='block rounded-sm px-4 py-2 text-sm font-medium text-slate-100 hover:bg-slate-700'
> >
Profile Profile
</a> </a>
@ -33,7 +33,7 @@ import Icon from '../AstroIcon.astro';
<li class='px-1'> <li class='px-1'>
<a <a
href='/account/friends' href='/account/friends'
class='block rounded px-4 py-2 text-sm font-medium text-slate-100 hover:bg-slate-700' class='block rounded-sm px-4 py-2 text-sm font-medium text-slate-100 hover:bg-slate-700'
> >
Friends Friends
</a> </a>
@ -41,14 +41,14 @@ import Icon from '../AstroIcon.astro';
<li class='px-1'> <li class='px-1'>
<a <a
href='/team' href='/team'
class='block rounded px-4 py-2 text-sm font-medium text-slate-100 hover:bg-slate-700' class='block rounded-sm px-4 py-2 text-sm font-medium text-slate-100 hover:bg-slate-700'
> >
Teams Teams
</a> </a>
</li> </li>
<li class='px-1'> <li class='px-1'>
<button <button
class='block w-full rounded px-4 py-2 text-left text-sm font-medium text-slate-100 hover:bg-slate-700' class='block w-full rounded-sm px-4 py-2 text-left text-sm font-medium text-slate-100 hover:bg-slate-700'
type='button' type='button'
data-logout-button data-logout-button
> >

@ -105,7 +105,7 @@ export function AccountDropdown() {
/> />
)} )}
<div className="relative z-[90] animate-fade-in"> <div className="relative z-90 animate-fade-in">
{isOnboardingModalOpen && onboardingConfig && ( {isOnboardingModalOpen && onboardingConfig && (
<OnboardingModal <OnboardingModal
onboardingConfig={onboardingConfig} onboardingConfig={onboardingConfig}
@ -126,7 +126,7 @@ export function AccountDropdown() {
)} )}
<button <button
className="relative flex h-8 w-40 items-center justify-center gap-1.5 rounded-full bg-gradient-to-r from-purple-500 to-purple-700 px-4 py-2 text-sm font-medium text-white hover:from-purple-500 hover:to-purple-600" className="relative flex h-8 w-40 items-center justify-center gap-1.5 rounded-full bg-linear-to-r from-purple-500 to-purple-700 px-4 py-2 text-sm font-medium text-white hover:from-purple-500 hover:to-purple-600"
onClick={() => { onClick={() => {
setIsTeamsOpen(false); setIsTeamsOpen(false);
setShowDropdown(!showDropdown); setShowDropdown(!showDropdown);

@ -43,7 +43,7 @@ export function AccountDropdownList(props: AccountDropdownListProps) {
<li className="mb-1 px-1"> <li className="mb-1 px-1">
<button <button
className={cn( className={cn(
'flex h-9 w-full items-center rounded py-1 pl-3 pr-2 text-sm font-medium text-slate-100 hover:opacity-80', 'flex h-9 w-full items-center rounded-sm py-1 pl-3 pr-2 text-sm font-medium text-slate-100 hover:opacity-80',
isConfigLoading isConfigLoading
? 'striped-loader-darker flex border-slate-800 opacity-70' ? 'striped-loader-darker flex border-slate-800 opacity-70'
: 'border-slate-600 bg-slate-700', : 'border-slate-600 bg-slate-700',
@ -70,7 +70,7 @@ export function AccountDropdownList(props: AccountDropdownListProps) {
<li className="px-1"> <li className="px-1">
<a <a
href="/account" href="/account"
className="group flex items-center gap-2 rounded py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="group flex items-center gap-2 rounded-sm py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<User2 className="h-4 w-4 stroke-[2.5px] text-slate-400 group-hover:text-white" /> <User2 className="h-4 w-4 stroke-[2.5px] text-slate-400 group-hover:text-white" />
Account Account
@ -79,13 +79,13 @@ export function AccountDropdownList(props: AccountDropdownListProps) {
<li className="px-1"> <li className="px-1">
<a <a
href="/account/update-profile" href="/account/update-profile"
className="group flex items-center justify-between gap-2 rounded py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="group flex items-center justify-between gap-2 rounded-sm py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<span className="flex items-center gap-2"> <span className="flex items-center gap-2">
<SquareUserRound className="h-4 w-4 stroke-[2.5px] text-slate-400 group-hover:text-white" /> <SquareUserRound className="h-4 w-4 stroke-[2.5px] text-slate-400 group-hover:text-white" />
My Profile My Profile
</span> </span>
<span className="rounded-sm bg-yellow-300 px-1 text-xs uppercase tracking-wide text-black"> <span className="rounded-xs bg-yellow-300 px-1 text-xs uppercase tracking-wide text-black">
New New
</span> </span>
</a> </a>
@ -93,7 +93,7 @@ export function AccountDropdownList(props: AccountDropdownListProps) {
<li className="px-1"> <li className="px-1">
<a <a
href="/account/friends" href="/account/friends"
className="group flex items-center gap-2 rounded py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="group flex items-center gap-2 rounded-sm py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<Users2 className="h-4 w-4 stroke-[2px] text-slate-400 group-hover:text-white" /> <Users2 className="h-4 w-4 stroke-[2px] text-slate-400 group-hover:text-white" />
Friends Friends
@ -104,7 +104,7 @@ export function AccountDropdownList(props: AccountDropdownListProps) {
onClick={() => { onClick={() => {
onCreateRoadmap(); onCreateRoadmap();
}} }}
className="group flex w-full items-center gap-2 rounded py-2 pl-3 pr-2 text-left text-sm font-medium text-slate-100 hover:bg-slate-700" className="group flex w-full items-center gap-2 rounded-sm py-2 pl-3 pr-2 text-left text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<Plus className="h-4 w-4 stroke-[2px] text-slate-400 group-hover:text-white" /> <Plus className="h-4 w-4 stroke-[2px] text-slate-400 group-hover:text-white" />
New Roadmap New Roadmap
@ -113,7 +113,7 @@ export function AccountDropdownList(props: AccountDropdownListProps) {
<li className="border-b border-b-gray-700/60 px-1 pb-1"> <li className="border-b border-b-gray-700/60 px-1 pb-1">
<a <a
href="/account/roadmaps" href="/account/roadmaps"
className="group flex items-center gap-2 rounded py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="group flex items-center gap-2 rounded-sm py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
<Map className="h-4 w-4 stroke-[2px] text-slate-400 group-hover:text-white" /> <Map className="h-4 w-4 stroke-[2px] text-slate-400 group-hover:text-white" />
Roadmaps Roadmaps
@ -121,7 +121,7 @@ export function AccountDropdownList(props: AccountDropdownListProps) {
</li> </li>
<li className="px-1 pt-1"> <li className="px-1 pt-1">
<button <button
className="group flex w-full items-center justify-between rounded py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="group flex w-full items-center justify-between rounded-sm py-2 pl-3 pr-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
onClick={() => setIsTeamsOpen(true)} onClick={() => setIsTeamsOpen(true)}
> >
<span className="flex items-center gap-2.5"> <span className="flex items-center gap-2.5">
@ -133,7 +133,7 @@ export function AccountDropdownList(props: AccountDropdownListProps) {
</li> </li>
<li className="px-1"> <li className="px-1">
<button <button
className="group flex w-full items-center gap-2 rounded py-2 pl-3 pr-2 text-left text-sm font-medium text-slate-100 hover:bg-slate-700" className="group flex w-full items-center gap-2 rounded-sm py-2 pl-3 pr-2 text-left text-sm font-medium text-slate-100 hover:bg-slate-700"
type="button" type="button"
onClick={logout} onClick={logout}
> >

@ -52,13 +52,13 @@ export function DropdownTeamList(props: DropdownTeamListProps) {
<> <>
<div className="flex items-center justify-between px-2"> <div className="flex items-center justify-between px-2">
<button <button
className="mt-1 flex h-5 w-5 items-center justify-center rounded text-slate-400 hover:bg-slate-50/10 hover:text-slate-50" className="mt-1 flex h-5 w-5 items-center justify-center rounded-sm text-slate-400 hover:bg-slate-50/10 hover:text-slate-50"
onClick={() => setIsTeamsOpen(false)} onClick={() => setIsTeamsOpen(false)}
> >
<ChevronLeft className="h-4 w-4 stroke-[2.5px]" /> <ChevronLeft className="h-4 w-4 stroke-[2.5px]" />
</button> </button>
<a <a
className="mt-1 flex h-5 w-5 items-center justify-center rounded text-slate-400 hover:bg-slate-50/10 hover:text-slate-50" className="mt-1 flex h-5 w-5 items-center justify-center rounded-sm text-slate-400 hover:bg-slate-50/10 hover:text-slate-50"
href="/team/new" href="/team/new"
> >
<Plus className="h-4 w-4 stroke-[2.5px]" /> <Plus className="h-4 w-4 stroke-[2.5px]" />
@ -80,7 +80,7 @@ export function DropdownTeamList(props: DropdownTeamListProps) {
<li key={team._id} className="px-1"> <li key={team._id} className="px-1">
<a <a
href={pageLink} href={pageLink}
className="block truncate rounded px-4 py-2 text-sm font-medium text-slate-100 hover:bg-slate-700" className="block truncate rounded-sm px-4 py-2 text-sm font-medium text-slate-100 hover:bg-slate-700"
> >
{team.name} {team.name}
</a> </a>
@ -90,7 +90,7 @@ export function DropdownTeamList(props: DropdownTeamListProps) {
{teamList.length === 0 && !isLoading && ( {teamList.length === 0 && !isLoading && (
<li className="mt-2 px-1 text-center"> <li className="mt-2 px-1 text-center">
<p className="block rounded px-4 py-2 text-sm font-medium text-slate-500"> <p className="block rounded-sm px-4 py-2 text-sm font-medium text-slate-500">
<Users className="mx-auto mb-2 h-7 w-7 text-slate-600" /> <Users className="mx-auto mb-2 h-7 w-7 text-slate-600" />
No teams found.{' '} No teams found.{' '}
<a <a

@ -73,7 +73,7 @@ import { AccountDropdown } from './AccountDropdown';
<a <a
data-guest-required data-guest-required
class='flex hidden h-8 w-28 cursor-pointer items-center justify-center rounded-full bg-gradient-to-r from-blue-500 to-blue-700 px-4 py-2 text-sm font-medium text-white hover:from-blue-500 hover:to-blue-600' class='flex hidden h-8 w-28 cursor-pointer items-center justify-center rounded-full bg-linear-to-r from-blue-500 to-blue-700 px-4 py-2 text-sm font-medium text-white hover:from-blue-500 hover:to-blue-600'
href='/signup' href='/signup'
> >
<span>Sign Up</span> <span>Sign Up</span>

@ -232,7 +232,7 @@ export function OnboardingModal(props: OnboardingModalProps) {
<div className="mt-2 px-11 pb-5"> <div className="mt-2 px-11 pb-5">
<button <button
className="w-full rounded-md bg-gradient-to-r from-purple-500 to-purple-700 px-4 py-2 text-sm font-medium text-white hover:from-purple-500 hover:to-purple-600" className="w-full rounded-md bg-linear-to-r from-purple-500 to-purple-700 px-4 py-2 text-sm font-medium text-white hover:from-purple-500 hover:to-purple-600"
onClick={onClose} onClick={onClose}
> >
Do it later Do it later

@ -109,7 +109,7 @@ export function NavigationDropdown() {
</button> </button>
<div <div
className={cn( className={cn(
'pointer-events-none invisible absolute left-0 top-full z-[999] mt-2 w-48 min-w-[320px] -translate-y-1 rounded-lg bg-slate-800 py-2 opacity-0 shadow-xl transition-all duration-100', 'pointer-events-none invisible absolute left-0 top-full z-999 mt-2 w-48 min-w-[320px] -translate-y-1 rounded-lg bg-slate-800 py-2 opacity-0 shadow-xl transition-all duration-100',
{ {
'pointer-events-auto visible translate-y-2.5 opacity-100': 'pointer-events-auto visible translate-y-2.5 opacity-100':
$navigationDropdownOpen, $navigationDropdownOpen,

@ -103,7 +103,7 @@ export function NotificationPage() {
<button <button
type="button" type="button"
disabled={isLoading} disabled={isLoading}
className="inline-flex rounded border p-1 hover:bg-gray-50 disabled:opacity-75" className="inline-flex rounded-sm border p-1 hover:bg-gray-50 disabled:opacity-75"
onClick={() => respondInvitation('accept', notification?._id!)} onClick={() => respondInvitation('accept', notification?._id!)}
> >
<AcceptIcon className="h-4 w-4" /> <AcceptIcon className="h-4 w-4" />
@ -111,7 +111,7 @@ export function NotificationPage() {
<button <button
type="button" type="button"
disabled={isLoading} disabled={isLoading}
className="inline-flex rounded border p-1 hover:bg-gray-50 disabled:opacity-75" className="inline-flex rounded-sm border p-1 hover:bg-gray-50 disabled:opacity-75"
onClick={() => respondInvitation('reject', notification?._id!)} onClick={() => respondInvitation('reject', notification?._id!)}
> >
<XIcon className="h-4 w-4" /> <XIcon className="h-4 w-4" />

@ -40,7 +40,7 @@ export function OnboardingNudge(props: OnboardingNudgeProps) {
return ( return (
<div <div
className={cn( className={cn(
'fixed left-0 right-0 top-0 z-[91] flex w-full items-center justify-center border-b border-b-yellow-500/30 bg-yellow-300 pb-2 pt-1.5', 'fixed left-0 right-0 top-0 z-91 flex w-full items-center justify-center border-b border-b-yellow-500/30 bg-yellow-300 pb-2 pt-1.5',
{ {
'striped-loader': isLoading, 'striped-loader': isLoading,
}, },

@ -12,7 +12,7 @@ const discordInfo = await getDiscordInfo();
--- ---
<div class='border-b border-t bg-white py-6 text-left sm:py-16 sm:text-center'> <div class='border-b border-t bg-white py-6 text-left sm:py-16 sm:text-center'>
<div class='container !max-w-[650px]'> <div class='container max-w-[650px]!'>
<p class='text-2xl font-bold sm:text-5xl'>Join the Community</p> <p class='text-2xl font-bold sm:text-5xl'>Join the Community</p>
<p class='my-2.5 text-sm leading-relaxed text-gray-600 sm:my-5 sm:text-lg'> <p class='my-2.5 text-sm leading-relaxed text-gray-600 sm:my-5 sm:text-lg'>
roadmap.sh is the <a roadmap.sh is the <a

@ -28,7 +28,7 @@ export function PageProgress(props: Props) {
return ( return (
<div> <div>
{/* Tailwind based spinner for full page */} {/* Tailwind based spinner for full page */}
<div className="fixed left-0 top-0 z-[100] flex h-full w-full items-center justify-center bg-white bg-opacity-75"> <div className="fixed left-0 top-0 z-100 flex h-full w-full items-center justify-center bg-white bg-opacity-75">
<div className="flex items-center justify-center rounded-md border bg-white px-4 py-2 "> <div className="flex items-center justify-center rounded-md border bg-white px-4 py-2 ">
<Spinner <Spinner
className="h-4 w-4 sm:h-4 sm:w-4" className="h-4 w-4 sm:h-4 sm:w-4"

@ -55,7 +55,7 @@ export function StickyTopSponsor(props: StickyTopSponsorProps) {
href={sponsor.url} href={sponsor.url}
onClick={onSponsorClick} onClick={onSponsorClick}
className={cn( className={cn(
'fixed left-0 right-0 top-0 z-[91] flex min-h-[45px] w-full flex-row items-center justify-center px-14 pb-2 pt-1.5 text-base font-medium text-yellow-950', 'fixed left-0 right-0 top-0 z-91 flex min-h-[45px] w-full flex-row items-center justify-center px-14 pb-2 pt-1.5 text-base font-medium text-yellow-950',
)} )}
style={{ style={{
backgroundImage: `linear-gradient(to bottom, ${sponsor.style?.fromColor}, ${sponsor.style?.toColor})`, backgroundImage: `linear-gradient(to bottom, ${sponsor.style?.fromColor}, ${sponsor.style?.toColor})`,

@ -15,10 +15,10 @@ const { id, title, subtitle } = Astro.props;
<div <div
id={id} id={id}
tabindex='-1' tabindex='-1'
class='hidden bg-black/50 overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-[999] h-full items-center justify-center popup' class='hidden bg-black/50 overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-999 h-full items-center justify-center popup'
> >
<div class='relative p-4 w-full max-w-md h-full md:h-auto'> <div class='relative p-4 w-full max-w-md h-full md:h-auto'>
<div class='relative bg-white rounded-lg shadow popup-body'> <div class='relative bg-white rounded-lg shadow-sm popup-body'>
<button <button
type='button' type='button'
class='absolute top-3 right-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center popup-close' class='absolute top-3 right-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center popup-close'

@ -271,7 +271,7 @@ export function ListProjectSolutions(props: ListProjectSolutionsProps) {
counter % submittedAlternatives.length counter % submittedAlternatives.length
] || 'submitted their solution'} ] || 'submitted their solution'}
</span>{' '} </span>{' '}
<span className="flex-grow text-right text-gray-400 sm:flex-grow-0 sm:text-left sm:font-medium sm:text-black"> <span className="grow text-right text-gray-400 sm:grow-0 sm:text-left sm:font-medium sm:text-black">
{getRelativeTimeString(solution?.submittedAt!)} {getRelativeTimeString(solution?.submittedAt!)}
</span> </span>
</div> </div>

@ -46,8 +46,8 @@ export function ProjectCard(props: ProjectCardProps) {
<span className="flex min-h-[22px] items-center justify-between gap-2 text-xs text-gray-400"> <span className="flex min-h-[22px] items-center justify-between gap-2 text-xs text-gray-400">
{isLoadingStatus ? ( {isLoadingStatus ? (
<> <>
<span className="h-5 w-24 animate-pulse rounded bg-gray-200" />{' '} <span className="h-5 w-24 animate-pulse rounded-sm bg-gray-200" />{' '}
<span className="h-5 w-20 animate-pulse rounded bg-gray-200" />{' '} <span className="h-5 w-20 animate-pulse rounded-sm bg-gray-200" />{' '}
</> </>
) : ( ) : (
<> <>

@ -114,7 +114,7 @@ export function ProjectsPage(props: ProjectsPageProps) {
<div className="container relative flex flex-col gap-4 sm:flex-row"> <div className="container relative flex flex-col gap-4 sm:flex-row">
<div <div
className={cn( className={cn(
'hidden w-full flex-col from-gray-100 sm:w-[160px] sm:shrink-0 sm:border-r sm:bg-gradient-to-l sm:pt-6', 'hidden w-full flex-col from-gray-100 sm:w-[160px] sm:shrink-0 sm:border-r sm:bg-linear-to-l sm:pt-6',
{ {
'hidden sm:flex': !isFilterOpen, 'hidden sm:flex': !isFilterOpen,
'z-50 flex': isFilterOpen, 'z-50 flex': isFilterOpen,
@ -171,7 +171,7 @@ export function ProjectsPage(props: ProjectsPageProps) {
</div> </div>
</div> </div>
</div> </div>
<div className="flex flex-grow flex-col pb-20 pt-2 sm:pt-6"> <div className="flex grow flex-col pb-20 pt-2 sm:pt-6">
<div className="mb-4 flex items-center justify-between text-sm text-gray-500"> <div className="mb-4 flex items-center justify-between text-sm text-gray-500">
<h3 className={'flex items-center'}> <h3 className={'flex items-center'}>
<Box size={15} className="mr-1" strokeWidth={2} /> <Box size={15} className="mr-1" strokeWidth={2} />

@ -15,7 +15,7 @@ function StepLabel(props: StepLabelProps) {
const { label } = props; const { label } = props;
return ( return (
<span className="flex-shrink-0 rounded-full bg-gray-200 px-2 py-1 text-xs text-gray-600"> <span className="shrink-0 rounded-full bg-gray-200 px-2 py-1 text-xs text-gray-600">
{label} {label}
</span> </span>
); );

@ -9,7 +9,7 @@ export function StepperStepSeparator(props: StepperStepSeparatorProps) {
return ( return (
<hr <hr
className={cn('flex-grow hidden sm:flex border border-gray-300', { className={cn('grow hidden sm:flex border border-gray-300', {
'border-green-500': isActive, 'border-green-500': isActive,
})} })}
/> />

@ -23,11 +23,11 @@ export function SubmissionRequirement(props: SubmissionRequirementProps) {
{!isLoading && ( {!isLoading && (
<> <>
{status === 'pending' ? ( {status === 'pending' ? (
<CircleDashed className="h-4 w-4 flex-shrink-0 text-gray-400" /> <CircleDashed className="h-4 w-4 shrink-0 text-gray-400" />
) : status === 'success' ? ( ) : status === 'success' ? (
<CheckIcon className="h-4 w-4 flex-shrink-0 text-green-800" /> <CheckIcon className="h-4 w-4 shrink-0 text-green-800" />
) : ( ) : (
<X className="h-4 w-4 flex-shrink-0 text-yellow-800" /> <X className="h-4 w-4 shrink-0 text-yellow-800" />
)} )}
</> </>
)} )}

@ -33,7 +33,7 @@ export function SubmitSuccessModal(props: SubmitSuccessModalProps) {
type="text" type="text"
readOnly={true} readOnly={true}
value={projectSolutionUrl} value={projectSolutionUrl}
className="w-full rounded-md border bg-gray-50 px-2.5 py-2 text-sm text-gray-700 focus:outline-none" className="w-full rounded-md border bg-gray-50 px-2.5 py-2 text-sm text-gray-700 focus:outline-hidden"
onClick={(e) => { onClick={(e) => {
e.currentTarget.select(); e.currentTarget.select();
}} }}

@ -13,7 +13,7 @@ export function VoteButton(props: VoteButtonProps) {
return ( return (
<button <button
className={cn( className={cn(
'flex gap-1 px-2 py-1 text-sm text-gray-500 hover:bg-gray-100 hover:text-black focus:outline-none', 'flex gap-1 px-2 py-1 text-sm text-gray-500 hover:bg-gray-100 hover:text-black focus:outline-hidden',
{ {
'bg-gray-100 text-orange-600 hover:text-orange-700': isActive, 'bg-gray-100 text-orange-600 hover:text-orange-700': isActive,
'bg-transparent text-gray-500 hover:text-black': !isActive, 'bg-transparent text-gray-500 hover:text-black': !isActive,

@ -51,7 +51,7 @@ export function QuestionCard(props: QuestionCardProps) {
<> <>
<div <div
ref={questionRef} ref={questionRef}
className={`flex flex-grow flex-col items-center justify-center py-5 sm:py-8`} className={`flex grow flex-col items-center justify-center py-5 sm:py-8`}
> >
<div className="hidden text-gray-400 sm:block"> <div className="hidden text-gray-400 sm:block">
{question.topics?.map((topic, counter) => { {question.topics?.map((topic, counter) => {
@ -69,7 +69,7 @@ export function QuestionCard(props: QuestionCardProps) {
</div> </div>
<div className="mx-auto flex max-w-[550px] flex-1 items-center justify-center py-3 sm:py-8"> <div className="mx-auto flex max-w-[550px] flex-1 items-center justify-center py-3 sm:py-8">
<p className="px-4 text-xl font-semibold !leading-snug text-black sm:text-3xl"> <p className="px-4 text-xl font-semibold leading-snug! text-black sm:text-3xl">
{question.question} {question.question}
</p> </p>
</div> </div>
@ -94,7 +94,7 @@ export function QuestionCard(props: QuestionCardProps) {
> >
{!question.isLongAnswer && ( {!question.isLongAnswer && (
<div <div
className={`mx-auto flex max-w-[600px] flex-grow flex-col items-center justify-center py-0 px-5 text-center text-base [&>p]:leading-relaxed sm:text-xl`} className={`mx-auto flex max-w-[600px] grow flex-col items-center justify-center py-0 px-5 text-center text-base [&>p]:leading-relaxed sm:text-xl`}
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
__html: markdownToHtml(question.answer, false), __html: markdownToHtml(question.answer, false),
}} }}
@ -103,7 +103,7 @@ export function QuestionCard(props: QuestionCardProps) {
{question.isLongAnswer && ( {question.isLongAnswer && (
<div <div
className={`qa-answer prose prose-sm prose-quoteless mx-auto flex w-full max-w-[600px] flex-grow flex-col items-start justify-center py-0 px-4 text-left text-sm prose-h1:mb-2.5 prose-h1:mt-7 prose-h2:mb-3 prose-h2:mt-0 prose-h3:mb-[5px] prose-h3:mt-[10px] prose-p:mb-2 prose-p:mt-0 prose-blockquote:font-normal prose-blockquote:not-italic prose-blockquote:text-gray-700 prose-pre:!mb-6 prose-pre:w-full prose-ul:my-2 prose-li:m-0 prose-li:mb-0.5 sm:px-5 sm:text-lg sm:prose-p:mb-4`} className={`qa-answer prose prose-sm prose-quoteless mx-auto flex w-full max-w-[600px] grow flex-col items-start justify-center py-0 px-4 text-left text-sm prose-h1:mb-2.5 prose-h1:mt-7 prose-h2:mb-3 prose-h2:mt-0 prose-h3:mb-[5px] prose-h3:mt-[10px] prose-p:mb-2 prose-p:mt-0 prose-blockquote:font-normal prose-blockquote:not-italic prose-blockquote:text-gray-700 prose-pre:mb-6! prose-pre:w-full prose-ul:my-2 prose-li:m-0 prose-li:mb-0.5 sm:px-5 sm:text-lg sm:prose-p:mb-4`}
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
__html: markdownToHtml(question.answer, false), __html: markdownToHtml(question.answer, false),
}} }}

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

Loading…
Cancel
Save