tr]:last:border-b-0',
+ "bg-muted/50 border-t font-medium [&>tr]:last:border-b-0",
className,
)}
{...props}
/>
- )
+ );
}
-function TableRow({ className, ...props }: React.ComponentProps<'tr'>) {
+function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
return (
- )
+ );
}
-function TableHead({ className, ...props }: React.ComponentProps<'th'>) {
+function TableHead({ className, ...props }: React.ComponentProps<"th">) {
return (
[role=checkbox]]:translate-y-[2px]',
+ "text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
className,
)}
{...props}
/>
- )
+ );
}
-function TableCell({ className, ...props }: React.ComponentProps<'td'>) {
+function TableCell({ className, ...props }: React.ComponentProps<"td">) {
return (
| [role=checkbox]]:translate-y-[2px]',
+ "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
className,
)}
{...props}
/>
- )
+ );
}
function TableCaption({
className,
...props
-}: React.ComponentProps<'caption'>) {
+}: React.ComponentProps<"caption">) {
return (
- )
+ );
}
export {
@@ -113,4 +113,4 @@ export {
TableRow,
TableCell,
TableCaption,
-}
+};
diff --git a/components/ui/tabs.tsx b/src/components/ui/tabs.tsx
similarity index 78%
rename from components/ui/tabs.tsx
rename to src/components/ui/tabs.tsx
index ff67104..509cced 100644
--- a/components/ui/tabs.tsx
+++ b/src/components/ui/tabs.tsx
@@ -1,9 +1,9 @@
-'use client'
+"use client";
-import * as React from 'react'
-import * as TabsPrimitive from '@radix-ui/react-tabs'
+import * as React from "react";
+import * as TabsPrimitive from "@radix-ui/react-tabs";
-import { cn } from '@/lib/utils'
+import { cn } from "@/src/lib/utils";
function Tabs({
className,
@@ -12,10 +12,10 @@ function Tabs({
return (
- )
+ );
}
function TabsList({
@@ -26,12 +26,12 @@ function TabsList({
- )
+ );
}
function TabsTrigger({
@@ -47,7 +47,7 @@ function TabsTrigger({
)}
{...props}
/>
- )
+ );
}
function TabsContent({
@@ -57,10 +57,10 @@ function TabsContent({
return (
- )
+ );
}
-export { Tabs, TabsList, TabsTrigger, TabsContent }
+export { Tabs, TabsList, TabsTrigger, TabsContent };
diff --git a/components/ui/textarea.tsx b/src/components/ui/textarea.tsx
similarity index 75%
rename from components/ui/textarea.tsx
rename to src/components/ui/textarea.tsx
index 3809775..c09aff2 100644
--- a/components/ui/textarea.tsx
+++ b/src/components/ui/textarea.tsx
@@ -1,18 +1,18 @@
-import * as React from 'react'
+import * as React from "react";
-import { cn } from '@/lib/utils'
+import { cn } from "@/src/lib/utils";
-function Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {
+function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
return (
- )
+ );
}
-export { Textarea }
+export { Textarea };
diff --git a/components/ui/toast.tsx b/src/components/ui/toast.tsx
similarity index 74%
rename from components/ui/toast.tsx
rename to src/components/ui/toast.tsx
index 40eedf5..fffdf61 100644
--- a/components/ui/toast.tsx
+++ b/src/components/ui/toast.tsx
@@ -1,13 +1,13 @@
-'use client'
+"use client";
-import * as React from 'react'
-import * as ToastPrimitives from '@radix-ui/react-toast'
-import { cva, type VariantProps } from 'class-variance-authority'
-import { X } from 'lucide-react'
+import * as React from "react";
+import * as ToastPrimitives from "@radix-ui/react-toast";
+import { cva, type VariantProps } from "class-variance-authority";
+import { X } from "lucide-react";
-import { cn } from '@/lib/utils'
+import { cn } from "@/src/lib/utils";
-const ToastProvider = ToastPrimitives.Provider
+const ToastProvider = ToastPrimitives.Provider;
const ToastViewport = React.forwardRef<
React.ElementRef,
@@ -16,29 +16,29 @@ const ToastViewport = React.forwardRef<
-))
-ToastViewport.displayName = ToastPrimitives.Viewport.displayName
+));
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
const toastVariants = cva(
- 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',
+ "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
{
variants: {
variant: {
- default: 'border bg-background text-foreground',
+ default: "border bg-background text-foreground",
destructive:
- 'destructive group border-destructive bg-destructive text-destructive-foreground',
+ "destructive group border-destructive bg-destructive text-destructive-foreground",
},
},
defaultVariants: {
- variant: 'default',
+ variant: "default",
},
},
-)
+);
const Toast = React.forwardRef<
React.ElementRef,
@@ -51,9 +51,9 @@ const Toast = React.forwardRef<
className={cn(toastVariants({ variant }), className)}
{...props}
/>
- )
-})
-Toast.displayName = ToastPrimitives.Root.displayName
+ );
+});
+Toast.displayName = ToastPrimitives.Root.displayName;
const ToastAction = React.forwardRef<
React.ElementRef,
@@ -62,13 +62,13 @@ const ToastAction = React.forwardRef<
-))
-ToastAction.displayName = ToastPrimitives.Action.displayName
+));
+ToastAction.displayName = ToastPrimitives.Action.displayName;
const ToastClose = React.forwardRef<
React.ElementRef,
@@ -77,7 +77,7 @@ const ToastClose = React.forwardRef<
-))
-ToastClose.displayName = ToastPrimitives.Close.displayName
+));
+ToastClose.displayName = ToastPrimitives.Close.displayName;
const ToastTitle = React.forwardRef<
React.ElementRef,
@@ -94,11 +94,11 @@ const ToastTitle = React.forwardRef<
>(({ className, ...props }, ref) => (
-))
-ToastTitle.displayName = ToastPrimitives.Title.displayName
+));
+ToastTitle.displayName = ToastPrimitives.Title.displayName;
const ToastDescription = React.forwardRef<
React.ElementRef,
@@ -106,15 +106,15 @@ const ToastDescription = React.forwardRef<
>(({ className, ...props }, ref) => (
-))
-ToastDescription.displayName = ToastPrimitives.Description.displayName
+));
+ToastDescription.displayName = ToastPrimitives.Description.displayName;
-type ToastProps = React.ComponentPropsWithoutRef
+type ToastProps = React.ComponentPropsWithoutRef;
-type ToastActionElement = React.ReactElement
+type ToastActionElement = React.ReactElement;
export {
type ToastProps,
@@ -126,4 +126,4 @@ export {
ToastDescription,
ToastClose,
ToastAction,
-}
+};
diff --git a/components/ui/toaster.tsx b/src/components/ui/toaster.tsx
similarity index 81%
rename from components/ui/toaster.tsx
rename to src/components/ui/toaster.tsx
index 3b91885..9808fcf 100644
--- a/components/ui/toaster.tsx
+++ b/src/components/ui/toaster.tsx
@@ -1,6 +1,6 @@
-'use client'
+"use client";
-import { useToast } from '@/hooks/use-toast'
+import { useToast } from "@/src/hooks/use-toast";
import {
Toast,
ToastClose,
@@ -8,10 +8,10 @@ import {
ToastProvider,
ToastTitle,
ToastViewport,
-} from '@/components/ui/toast'
+} from "@/src/components/ui/toast";
export function Toaster() {
- const { toasts } = useToast()
+ const { toasts } = useToast();
return (
@@ -27,9 +27,9 @@ export function Toaster() {
{action}
- )
+ );
})}
- )
+ );
}
diff --git a/components/ui/toggle-group.tsx b/src/components/ui/toggle-group.tsx
similarity index 69%
rename from components/ui/toggle-group.tsx
rename to src/components/ui/toggle-group.tsx
index 0ab9971..05b10eb 100644
--- a/components/ui/toggle-group.tsx
+++ b/src/components/ui/toggle-group.tsx
@@ -1,18 +1,18 @@
-'use client'
+"use client";
-import * as React from 'react'
-import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'
-import { type VariantProps } from 'class-variance-authority'
+import * as React from "react";
+import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
+import { type VariantProps } from "class-variance-authority";
-import { cn } from '@/lib/utils'
-import { toggleVariants } from '@/components/ui/toggle'
+import { cn } from "@/src/lib/utils";
+import { toggleVariants } from "@/src/components/ui/toggle";
const ToggleGroupContext = React.createContext<
VariantProps
>({
- size: 'default',
- variant: 'default',
-})
+ size: "default",
+ variant: "default",
+});
function ToggleGroup({
className,
@@ -28,7 +28,7 @@ function ToggleGroup({
data-variant={variant}
data-size={size}
className={cn(
- 'group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs',
+ "group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs",
className,
)}
{...props}
@@ -37,7 +37,7 @@ function ToggleGroup({
{children}
- )
+ );
}
function ToggleGroupItem({
@@ -48,7 +48,7 @@ function ToggleGroupItem({
...props
}: React.ComponentProps &
VariantProps) {
- const context = React.useContext(ToggleGroupContext)
+ const context = React.useContext(ToggleGroupContext);
return (
{children}
- )
+ );
}
-export { ToggleGroup, ToggleGroupItem }
+export { ToggleGroup, ToggleGroupItem };
diff --git a/components/ui/toggle.tsx b/src/components/ui/toggle.tsx
similarity index 65%
rename from components/ui/toggle.tsx
rename to src/components/ui/toggle.tsx
index ad6b286..fbe22ca 100644
--- a/components/ui/toggle.tsx
+++ b/src/components/ui/toggle.tsx
@@ -1,32 +1,32 @@
-'use client'
+"use client";
-import * as React from 'react'
-import * as TogglePrimitive from '@radix-ui/react-toggle'
-import { cva, type VariantProps } from 'class-variance-authority'
+import * as React from "react";
+import * as TogglePrimitive from "@radix-ui/react-toggle";
+import { cva, type VariantProps } from "class-variance-authority";
-import { cn } from '@/lib/utils'
+import { cn } from "@/src/lib/utils";
const toggleVariants = cva(
"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",
{
variants: {
variant: {
- default: 'bg-transparent',
+ default: "bg-transparent",
outline:
- 'border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground',
+ "border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground",
},
size: {
- default: 'h-9 px-2 min-w-9',
- sm: 'h-8 px-1.5 min-w-8',
- lg: 'h-10 px-2.5 min-w-10',
+ default: "h-9 px-2 min-w-9",
+ sm: "h-8 px-1.5 min-w-8",
+ lg: "h-10 px-2.5 min-w-10",
},
},
defaultVariants: {
- variant: 'default',
- size: 'default',
+ variant: "default",
+ size: "default",
},
},
-)
+);
function Toggle({
className,
@@ -41,7 +41,7 @@ function Toggle({
className={cn(toggleVariants({ variant, size, className }))}
{...props}
/>
- )
+ );
}
-export { Toggle, toggleVariants }
+export { Toggle, toggleVariants };
diff --git a/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx
similarity index 84%
rename from components/ui/tooltip.tsx
rename to src/components/ui/tooltip.tsx
index 877239c..072613d 100644
--- a/components/ui/tooltip.tsx
+++ b/src/components/ui/tooltip.tsx
@@ -1,9 +1,9 @@
-'use client'
+"use client";
-import * as React from 'react'
-import * as TooltipPrimitive from '@radix-ui/react-tooltip'
+import * as React from "react";
+import * as TooltipPrimitive from "@radix-ui/react-tooltip";
-import { cn } from '@/lib/utils'
+import { cn } from "@/src/lib/utils";
function TooltipProvider({
delayDuration = 0,
@@ -15,7 +15,7 @@ function TooltipProvider({
delayDuration={delayDuration}
{...props}
/>
- )
+ );
}
function Tooltip({
@@ -25,13 +25,13 @@ function Tooltip({
- )
+ );
}
function TooltipTrigger({
...props
}: React.ComponentProps) {
- return
+ return ;
}
function TooltipContent({
@@ -46,7 +46,7 @@ function TooltipContent({
data-slot="tooltip-content"
sideOffset={sideOffset}
className={cn(
- 'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',
+ "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
className,
)}
{...props}
@@ -55,7 +55,7 @@ function TooltipContent({
- )
+ );
}
-export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
diff --git a/components/ui/use-mobile.tsx b/src/components/ui/use-mobile.tsx
similarity index 100%
rename from components/ui/use-mobile.tsx
rename to src/components/ui/use-mobile.tsx
diff --git a/hooks/use-toast.ts b/src/components/ui/use-toast.ts
similarity index 97%
rename from hooks/use-toast.ts
rename to src/components/ui/use-toast.ts
index 8932bc5..a82ef54 100644
--- a/hooks/use-toast.ts
+++ b/src/components/ui/use-toast.ts
@@ -3,7 +3,7 @@
// Inspired by react-hot-toast library
import * as React from 'react'
-import type { ToastActionElement, ToastProps } from '@/components/ui/toast'
+import type { ToastActionElement, ToastProps } from '@/src/components/ui/toast'
const TOAST_LIMIT = 1
const TOAST_REMOVE_DELAY = 1000000
diff --git a/components/workshops-section.tsx b/src/components/workshops-section.tsx
similarity index 68%
rename from components/workshops-section.tsx
rename to src/components/workshops-section.tsx
index b37d838..2b3f840 100644
--- a/components/workshops-section.tsx
+++ b/src/components/workshops-section.tsx
@@ -1,21 +1,23 @@
-import { workshops } from "@/lib/constants"
-import { Card } from "@/components/ui/card"
-import { Button } from "@/components/ui/button"
-import { Badge } from "@/components/ui/badge"
-import { Clock, BarChart3 } from "lucide-react"
-import Image from "next/image"
-import Link from "next/link"
+import { workshops } from "@/src/lib/constants";
+import { Card } from "@/src/components/ui/card";
+import { Button } from "@/src/components/ui/button";
+import { Badge } from "@/src/components/ui/badge";
+import { Clock, BarChart3 } from "lucide-react";
+import Image from "next/image";
+import Link from "next/link";
export function WorkshopsSection() {
return (
-
+
{/* Section header */}
- Learning & Workshops
+
+ Learning & Workshops
+
- Master Django through our comprehensive workshops, from fundamentals to advanced patterns. Learn by doing
- with real-world projects.
+ Master Django through our comprehensive workshops, from fundamentals
+ to advanced patterns. Learn by doing with real-world projects.
@@ -40,16 +42,23 @@ export function WorkshopsSection() {
{/* Content */}
- {workshop.title}
+
+ {workshop.title}
+
- {workshop.description}
+
+ {workshop.description}
+
{/* Meta info */}
-
-
+
+
{workshop.level}
@@ -61,7 +70,7 @@ export function WorkshopsSection() {
{/* CTA */}
-
- )
+ );
}
diff --git a/hooks/use-mobile.ts b/src/hooks/use-mobile.ts
similarity index 100%
rename from hooks/use-mobile.ts
rename to src/hooks/use-mobile.ts
diff --git a/components/ui/use-toast.ts b/src/hooks/use-toast.ts
similarity index 97%
rename from components/ui/use-toast.ts
rename to src/hooks/use-toast.ts
index 8932bc5..a82ef54 100644
--- a/components/ui/use-toast.ts
+++ b/src/hooks/use-toast.ts
@@ -3,7 +3,7 @@
// Inspired by react-hot-toast library
import * as React from 'react'
-import type { ToastActionElement, ToastProps } from '@/components/ui/toast'
+import type { ToastActionElement, ToastProps } from '@/src/components/ui/toast'
const TOAST_LIMIT = 1
const TOAST_REMOVE_DELAY = 1000000
diff --git a/lib/constants.ts b/src/lib/constants.ts
similarity index 96%
rename from lib/constants.ts
rename to src/lib/constants.ts
index ee61610..db8a8e8 100644
--- a/lib/constants.ts
+++ b/src/lib/constants.ts
@@ -1,3 +1,5 @@
+import { id } from "date-fns/locale"
+
// Community content constants
export const navigationItems = [
{ label: "Home", href: "#home" },
@@ -196,5 +198,12 @@ export const teamMembers = [
role: "Django Girls Community Lead",
image: "/placeholder-user.svg",
bio: "Empowering women in tech through Django Girls initiatives.",
+ },
+ {
+ id: 7,
+ name: "Didas Mbarushimana",
+ role: "Community Advocate",
+ image: "/placeholder-user.svg",
+ bio: "Promoting community values and advocating for member needs.",
}
]
diff --git a/lib/utils.ts b/src/lib/utils.ts
similarity index 100%
rename from lib/utils.ts
rename to src/lib/utils.ts
|