diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index d7d1b42..faf5ece 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -27,6 +27,7 @@ export default tseslint.config([ }, rules: { 'prettier/prettier': 'error', + 'react-refresh/only-export-components': 'off', }, }, ]); diff --git a/frontend/index.html b/frontend/index.html index 34952e2..560edd8 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,17 +1,15 @@ + + + + + + Py013 + - - - - - - Py013 - - - -
- - - - \ No newline at end of file + +
+ + + diff --git a/frontend/package.json b/frontend/package.json index 1b91a23..6ee9d65 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,6 +7,7 @@ "dev": "vite", "build": "tsc -b && vite build", "lint": "eslint .", + "lint:fix": "eslint . --fix", "preview": "vite preview", "format": "prettier --write .", "format:check": "prettier --check ." diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index e5e6ea9..25ddcbb 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,14 +1,19 @@ -import { useState } from "react"; -import Navbar from "./Navbar"; -import { Button } from "./components/ui/button"; -import { Card, CardContent } from "./components/ui/card"; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./components/ui/collapsible"; -import { RiWhatsappFill } from "./components/RiWhatsappFill"; -import { RiGithubFill } from "./components/RiGithubFill"; -import { RiLinkedinFill } from "./components/RiLinkedinFill"; -import { RiMailFill } from "./components/RiMailFill"; -import { RiInstagramFill } from "./components/RiInstagramFill"; -import { IcBaselineDiscord } from "./components/IcBaselineDiscord"; +import { useState } from 'react'; + +import Navbar from './Navbar'; +import { IcBaselineDiscord } from './components/IcBaselineDiscord'; +import { RiGithubFill } from './components/RiGithubFill'; +import { RiInstagramFill } from './components/RiInstagramFill'; +import { RiLinkedinFill } from './components/RiLinkedinFill'; +import { RiMailFill } from './components/RiMailFill'; +import { RiWhatsappFill } from './components/RiWhatsappFill'; +import { Button } from './components/ui/button'; +import { Card, CardContent } from './components/ui/card'; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from './components/ui/collapsible'; function App() { const [openItems, setOpenItems] = useState([]); @@ -28,9 +33,15 @@ function App() {

Comunidade Py013

-

< Comunidade de Python da Baixada Santista />

-

Produzindo conhecimento em tecnologia de forma colaborativa

-

Eventos | workshops | Aulas e muito mais sobre o universo Python

+

+ < Comunidade de Python da Baixada Santista /> +

+

+ Produzindo conhecimento em tecnologia de forma colaborativa +

+

+ Eventos | workshops | Aulas e muito mais sobre o universo Python +

@@ -42,12 +53,18 @@ function App() { alt="Quem Somos" className="w-full h-80 object-cover rounded-lg" /> -

Comunidade de Python da Baixada Santista

+

+ Comunidade de Python da Baixada Santista +

Quem Somos

- A Py013 é uma comunidade de aprendizagem colaborativa da linguagem de programação Python na Baixada Santista. A comunidade foi criada em 2016, por um grupo de entusiastas. Hoje, é mantida por um grupo de voluntários. Nossa missão é democratizar o acesso ao conhecimento. + A Py013 é uma comunidade de aprendizagem colaborativa da linguagem + de programação Python na Baixada Santista. A comunidade foi criada + em 2016, por um grupo de entusiastas. Hoje, é mantida por um grupo + de voluntários. Nossa missão é democratizar o acesso ao + conhecimento.

@@ -82,15 +103,21 @@ function App() {
-

Aumentar pessoas e desenvolver em empresas da região

+

+ Aumentar pessoas e desenvolver em empresas da região +

-

Fomentar o ecossistema tech local

+

+ Fomentar o ecossistema tech local +

-

Conectar desenvolvedores e empresas

+

+ Conectar desenvolvedores e empresas +

@@ -143,40 +170,57 @@ function App() {
-

Valores

+

+ Valores +

-

Colaboração – Acreditamos na aprendizagem coletiva e no compartilhamento de conhecimento

+

+ Colaboração – Acreditamos na aprendizagem coletiva e no + compartilhamento de conhecimento +

-

Democratização da tecnologia – A programação e a computação devem ser acessíveis

+

+ Democratização da tecnologia – A programação e a computação + devem ser acessíveis +

-

Inovação aberta – Amamos projetos de software livre e open source

+

+ Inovação aberta – Amamos projetos de software livre e open + source +

-

Inclusão – Aceitamos e incentivamos a participação de qualquer pessoa interessada em aprender ou colaborar

+

+ Inclusão – Aceitamos e incentivamos a participação de + qualquer pessoa interessada em aprender ou colaborar +

-

Afeto e amizade – Python é divertido como Monty Python, acreditamos no poder do afeto e da amizade

+

+ Afeto e amizade – Python é divertido como Monty Python, + acreditamos no poder do afeto e da amizade +

@@ -202,7 +246,8 @@ function App() { -
+
+ @@ -210,7 +255,10 @@ function App() {

FAQ

- toggleItem('python')}> + toggleItem('python')} + > {openItems.includes('python') ? '▲' : '▼'} @@ -219,14 +267,19 @@ function App() {

- Python é uma linguagem de programação de alto nível, interpretada e de propósito geral. - É conhecida por sua sintaxe simples e legível, sendo amplamente utilizada em desenvolvimento web, - ciência de dados, inteligência artificial, automação e muito mais. + Python é uma linguagem de programação de alto nível, + interpretada e de propósito geral. É conhecida por sua sintaxe + simples e legível, sendo amplamente utilizada em + desenvolvimento web, ciência de dados, inteligência + artificial, automação e muito mais.

- toggleItem('py013')}> + toggleItem('py013')} + > {openItems.includes('py013') ? '▲' : '▼'} @@ -235,29 +288,41 @@ function App() {

- Py013 é uma referência ao código de área 13 da Baixada Santista. O "013" representa nossa região, - mostrando que somos uma comunidade local focada em Python, mas com alcance global através da internet. + Py013 é uma referência ao código de área 13 da Baixada + Santista. O "013" representa nossa região, mostrando que somos + uma comunidade local focada em Python, mas com alcance global + através da internet.

- toggleItem('comunidade')}> + toggleItem('comunidade')} + > {openItems.includes('comunidade') ? '▲' : '▼'} - Por quê criar uma comunidade de aprendizagem? + + Por quê criar uma comunidade de aprendizagem? +

- Acreditamos que o aprendizado colaborativo é mais eficaz e motivador. Uma comunidade permite - troca de experiências, networking, apoio mútuo e democratização do conhecimento, criando - um ambiente inclusivo para todos os níveis de experiência. + Acreditamos que o aprendizado colaborativo é mais eficaz e + motivador. Uma comunidade permite troca de experiências, + networking, apoio mútuo e democratização do conhecimento, + criando um ambiente inclusivo para todos os níveis de + experiência.

- toggleItem('participar')}> + toggleItem('participar')} + > {openItems.includes('participar') ? '▲' : '▼'} @@ -266,14 +331,19 @@ function App() {

- É muito fácil! Você pode participar seguindo nossas redes sociais, entrando no nosso Discord, - participando dos eventos presenciais e online, ou simplesmente acompanhando nosso conteúdo. - Não há processo formal de inscrição - todos são bem-vindos! + É muito fácil! Você pode participar seguindo nossas redes + sociais, entrando no nosso Discord, participando dos eventos + presenciais e online, ou simplesmente acompanhando nosso + conteúdo. Não há processo formal de inscrição - todos são + bem-vindos!

- toggleItem('custo')}> + toggleItem('custo')} + > {openItems.includes('custo') ? '▲' : '▼'} @@ -282,46 +352,64 @@ function App() {

- A participação na comunidade Py013 é completamente gratuita! Todos os nossos eventos, - workshops e atividades são oferecidos sem custo. Acreditamos que o conhecimento deve - ser acessível a todos. + A participação na comunidade Py013 é completamente gratuita! + Todos os nossos eventos, workshops e atividades são oferecidos + sem custo. Acreditamos que o conhecimento deve ser acessível a + todos.

- toggleItem('programador')}> + toggleItem('programador')} + > {openItems.includes('programador') ? '▲' : '▼'} - Preciso ser programador para participar? + + Preciso ser programador para participar? +

- Não! A comunidade é aberta a pessoas de todos os níveis e backgrounds. Se você é iniciante, - programador experiente, ou apenas curioso sobre tecnologia, você é bem-vindo. - Nosso objetivo é justamente democratizar o acesso ao conhecimento. + Não! A comunidade é aberta a pessoas de todos os níveis e + backgrounds. Se você é iniciante, programador experiente, ou + apenas curioso sobre tecnologia, você é bem-vindo. Nosso + objetivo é justamente democratizar o acesso ao conhecimento.

- toggleItem('iniciante')}> + toggleItem('iniciante')} + > {openItems.includes('iniciante') ? '▲' : '▼'} - Eu gostaria de aprender, mas não sei nada de Python, posso participar? + + Eu gostaria de aprender, mas não sei nada de Python, posso + participar? +

- Claro que sim! Na verdade, iniciantes são muito bem-vindos. Oferecemos workshops básicos, - tutoriais e um ambiente acolhedor para quem está começando. Nossa comunidade é conhecida - por ser inclusiva e ajudar pessoas em todos os níveis de experiência. + Claro que sim! Na verdade, iniciantes são muito bem-vindos. + Oferecemos workshops básicos, tutoriais e um ambiente + acolhedor para quem está começando. Nossa comunidade é + conhecida por ser inclusiva e ajudar pessoas em todos os + níveis de experiência.

- toggleItem('apoiar')}> + toggleItem('apoiar')} + > {openItems.includes('apoiar') ? '▲' : '▼'} @@ -330,9 +418,10 @@ function App() {

- Você pode apoiar de várias formas: sendo voluntário, sugerindo atividades, - ajudando com conteúdo, fazendo doações ou simplesmente participando dos nossos eventos. - Toda contribuição é bem-vinda! + Você pode apoiar de várias formas: sendo voluntário, sugerindo + atividades, ajudando com conteúdo, fazendo doações ou + simplesmente participando dos nossos eventos. Toda + contribuição é bem-vinda!

@@ -342,9 +431,7 @@ function App() {
-
- @2025 Py013 -
+
@2025 Py013
@@ -355,8 +442,8 @@ function App() {
-
- ) +
+ ); } export default App; diff --git a/frontend/src/Navbar.tsx b/frontend/src/Navbar.tsx index b5e97ca..08bd05f 100644 --- a/frontend/src/Navbar.tsx +++ b/frontend/src/Navbar.tsx @@ -1,20 +1,25 @@ -import { IcBaselineDiscord } from "./components/IcBaselineDiscord"; -import { RiGithubFill } from "./components/RiGithubFill"; -import { RiWhatsappFill } from "./components/RiWhatsappFill"; -import { RiMailFill } from "./components/RiMailFill"; -import { RiLinkedinFill } from "./components/RiLinkedinFill"; +import { IcBaselineDiscord } from './components/IcBaselineDiscord'; +import { RiGithubFill } from './components/RiGithubFill'; +import { RiLinkedinFill } from './components/RiLinkedinFill'; +import { RiMailFill } from './components/RiMailFill'; +import { RiWhatsappFill } from './components/RiWhatsappFill'; export default function Navbar() { return (
-
- Py013 -
+
Py013
@@ -27,4 +32,4 @@ export default function Navbar() {
); -} \ No newline at end of file +} diff --git a/frontend/src/components/IcBaselineDiscord.tsx b/frontend/src/components/IcBaselineDiscord.tsx index c50fa8f..eaac6c4 100644 --- a/frontend/src/components/IcBaselineDiscord.tsx +++ b/frontend/src/components/IcBaselineDiscord.tsx @@ -2,5 +2,18 @@ import React from 'react'; import type { SVGProps } from 'react'; export function IcBaselineDiscord(props: SVGProps) { - return (); -} \ No newline at end of file + return ( + + + + ); +} diff --git a/frontend/src/components/RiGithubFill.tsx b/frontend/src/components/RiGithubFill.tsx index a5bc7a9..fab78f9 100644 --- a/frontend/src/components/RiGithubFill.tsx +++ b/frontend/src/components/RiGithubFill.tsx @@ -2,15 +2,10 @@ interface RiGithubFillProps { className?: string; } -export function RiGithubFill({ className = "w-6 h-6" }: RiGithubFillProps) { +export function RiGithubFill({ className = 'w-6 h-6' }: RiGithubFillProps) { return ( - + ); } - diff --git a/frontend/src/components/RiInstagramFill.tsx b/frontend/src/components/RiInstagramFill.tsx index 2e23c35..c5ab5c0 100644 --- a/frontend/src/components/RiInstagramFill.tsx +++ b/frontend/src/components/RiInstagramFill.tsx @@ -2,5 +2,18 @@ import React from 'react'; import type { SVGProps } from 'react'; export function RiInstagramFill(props: SVGProps) { - return (); -} \ No newline at end of file + return ( + + + + ); +} diff --git a/frontend/src/components/RiLinkedinFill.tsx b/frontend/src/components/RiLinkedinFill.tsx index d6a10e6..275b547 100644 --- a/frontend/src/components/RiLinkedinFill.tsx +++ b/frontend/src/components/RiLinkedinFill.tsx @@ -2,15 +2,10 @@ interface RiLinkedinFillProps { className?: string; } -export function RiLinkedinFill({ className = "w-6 h-6" }: RiLinkedinFillProps) { +export function RiLinkedinFill({ className = 'w-6 h-6' }: RiLinkedinFillProps) { return ( - + ); } - diff --git a/frontend/src/components/RiMailFill.tsx b/frontend/src/components/RiMailFill.tsx index f59a011..3016983 100644 --- a/frontend/src/components/RiMailFill.tsx +++ b/frontend/src/components/RiMailFill.tsx @@ -2,15 +2,10 @@ interface RiMailFillProps { className?: string; } -export function RiMailFill({ className = "w-6 h-6" }: RiMailFillProps) { +export function RiMailFill({ className = 'w-6 h-6' }: RiMailFillProps) { return ( - + ); } - diff --git a/frontend/src/components/RiWhatsappFill.tsx b/frontend/src/components/RiWhatsappFill.tsx index 81f34dc..e3fb41c 100644 --- a/frontend/src/components/RiWhatsappFill.tsx +++ b/frontend/src/components/RiWhatsappFill.tsx @@ -1,5 +1,12 @@ import type { SVGProps } from 'react'; export function RiWhatsappFill(props: SVGProps) { - return (); -} \ No newline at end of file + return ( + + + + ); +} diff --git a/frontend/src/components/ui/button.tsx b/frontend/src/components/ui/button.tsx index a2df8dc..94559de 100644 --- a/frontend/src/components/ui/button.tsx +++ b/frontend/src/components/ui/button.tsx @@ -1,8 +1,9 @@ -import * as React from "react" -import { Slot } from "@radix-ui/react-slot" -import { cva, type VariantProps } from "class-variance-authority" +import { cn } from '@/lib/utils'; -import { cn } from "@/lib/utils" +import * as React from 'react'; + +import { Slot } from '@radix-ui/react-slot'; +import { type VariantProps, cva } from 'class-variance-authority'; const buttonVariants = cva( "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", @@ -10,30 +11,30 @@ const buttonVariants = cva( variants: { variant: { default: - "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", + 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90', destructive: - "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', outline: - "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50', secondary: - "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80', ghost: - "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", - link: "text-primary underline-offset-4 hover:underline", + 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', + link: 'text-primary underline-offset-4 hover:underline', }, size: { - default: "h-9 px-4 py-2 has-[>svg]:px-3", - sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", - lg: "h-10 rounded-md px-6 has-[>svg]:px-4", - icon: "size-9", + default: 'h-9 px-4 py-2 has-[>svg]:px-3', + sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', + lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', + icon: 'size-9', }, }, defaultVariants: { - variant: "default", - size: "default", + variant: 'default', + size: 'default', }, } -) +); function Button({ className, @@ -41,11 +42,11 @@ function Button({ size, asChild = false, ...props -}: React.ComponentProps<"button"> & +}: React.ComponentProps<'button'> & VariantProps & { - asChild?: boolean + asChild?: boolean; }) { - const Comp = asChild ? Slot : "button" + const Comp = asChild ? Slot : 'button'; return ( - ) + ); } -export { Button, buttonVariants } +export { Button, buttonVariants }; diff --git a/frontend/src/components/ui/card.tsx b/frontend/src/components/ui/card.tsx index d05bbc6..a62ceca 100644 --- a/frontend/src/components/ui/card.tsx +++ b/frontend/src/components/ui/card.tsx @@ -1,84 +1,84 @@ -import * as React from "react" +import { cn } from '@/lib/utils'; -import { cn } from "@/lib/utils" +import * as React from 'react'; -function Card({ className, ...props }: React.ComponentProps<"div">) { +function Card({ className, ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } -function CardHeader({ className, ...props }: React.ComponentProps<"div">) { +function CardHeader({ className, ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } -function CardTitle({ className, ...props }: React.ComponentProps<"div">) { +function CardTitle({ className, ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } -function CardDescription({ className, ...props }: React.ComponentProps<"div">) { +function CardDescription({ className, ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } -function CardAction({ className, ...props }: React.ComponentProps<"div">) { +function CardAction({ className, ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } -function CardContent({ className, ...props }: React.ComponentProps<"div">) { +function CardContent({ className, ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } -function CardFooter({ className, ...props }: React.ComponentProps<"div">) { +function CardFooter({ className, ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } export { @@ -89,4 +89,4 @@ export { CardAction, CardDescription, CardContent, -} +}; diff --git a/frontend/src/components/ui/collapsible.tsx b/frontend/src/components/ui/collapsible.tsx index 77f86be..0ced43e 100644 --- a/frontend/src/components/ui/collapsible.tsx +++ b/frontend/src/components/ui/collapsible.tsx @@ -1,9 +1,9 @@ -import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" +import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'; function Collapsible({ ...props }: React.ComponentProps) { - return + return ; } function CollapsibleTrigger({ @@ -14,7 +14,7 @@ function CollapsibleTrigger({ data-slot="collapsible-trigger" {...props} /> - ) + ); } function CollapsibleContent({ @@ -25,7 +25,7 @@ function CollapsibleContent({ data-slot="collapsible-content" {...props} /> - ) + ); } -export { Collapsible, CollapsibleTrigger, CollapsibleContent } +export { Collapsible, CollapsibleTrigger, CollapsibleContent }; diff --git a/frontend/src/index.css b/frontend/src/index.css index 1485494..f94e2d0 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,5 +1,5 @@ -@import "tailwindcss"; -@import "tw-animate-css"; +@import 'tailwindcss'; +@import 'tw-animate-css'; @custom-variant dark (&:is(.dark *)); @@ -121,11 +121,11 @@ /* Custom styles for Py013 */ .hero-bg { - background: linear-gradient(135deg, #173c5c 0%, #2D4A6B 100%); + background: linear-gradient(135deg, #173c5c 0%, #2d4a6b 100%); } .code-pattern { - background-image: + background-image: linear-gradient(90deg, rgba(54, 144, 217, 0.1) 1px, transparent 1px), linear-gradient(rgba(54, 144, 217, 0.1) 1px, transparent 1px); background-size: 20px 20px; diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index bd0c391..9ad0df4 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -1,6 +1,6 @@ -import { clsx, type ClassValue } from "clsx" -import { twMerge } from "tailwind-merge" +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) + return twMerge(clsx(inputs)); } diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json index 18c8d2f..e317fa7 100644 --- a/frontend/tsconfig.app.json +++ b/frontend/tsconfig.app.json @@ -3,17 +3,11 @@ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", "baseUrl": ".", "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] }, "target": "ES2022", "useDefineForClassFields": true, - "lib": [ - "ES2022", - "DOM", - "DOM.Iterable" - ], + "lib": ["ES2022", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, /* Bundler mode */ @@ -31,7 +25,5 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "include": [ - "src" - ] -} \ No newline at end of file + "include": ["src"] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 20ff94b..1e17393 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -11,9 +11,7 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] } } -} \ No newline at end of file +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 55c37d2..d07dd82 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,14 +1,14 @@ +import tailwindcss from '@tailwindcss/vite'; import react from '@vitejs/plugin-react-swc'; +import path from 'path'; import { defineConfig } from 'vite'; -import path from "path" -import tailwindcss from "@tailwindcss/vite" // https://vite.dev/config/ export default defineConfig({ plugins: [react(), tailwindcss()], resolve: { alias: { - "@": path.resolve(__dirname, "./src"), + '@': path.resolve(__dirname, './src'), }, }, });