Skip to content

kiaraengineer-dev/portfolio-react

Repository files navigation

💻 Portfólio - Kiara Toster

Olá! 👋
Sou a Kiara, estudante de Engenharia de Software com foco em desenvolvimento Front-End.

Este projeto foi desenvolvido para apresentar meus projetos, certificados e evolução como desenvolvedora, com foco em design moderno, responsividade e experiência do usuário.

✨ Funcionalidades

  • 📱 Design totalmente responsivo (mobile, tablet e desktop)
  • 🎯 Interface moderna e intuitiva
  • ⚡ Navegação entre páginas
  • 🎬 Animações e transições suaves
  • 📂 Exibição de projetos e certificados

🛠️ Tecnologias utilizadas


📸 Preview (Imagem)

preview


📋 Pré-requisitos

Antes de começar, você precisa ter instalado:

  • Node.js (versão 14 ou superior)
  • npm ou yarn

⚙️ Clonar e instalar

1. Clone o repositório

git clone https://github.com/kiaraengineer-dev/portfolio-react.git
cd portfolio-react
npm install

Se encontrar problemas de dependências de versões anteriores (peer dependencies), use:

npm install --legacy-peer-deps

⚙️ Configuração (Supabase)

Os dados do backend para este projeto (projetos e certificados) são gerenciados pelo Supabase.

1. Criar Projeto no Supabase

  • Vá para o Supabase e crie um novo projeto.
  • Copie sua Project URL e sua anon public key. Você as encontra em Settings > API.

2.0 Configurar Tabelas e Políticas

Execute o seguinte script SQL no SQL Editor do seu Supabase. Isso configurará as tabelas e políticas de segurança necessárias.

-- Cria a tabela 'projects' para os itens do portfólio
CREATE TABLE public.projects (
  id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  created_at timestamp with time zone DEFAULT now() NOT NULL,
  "Title" text,
  "Description" text,
  "Img" text,
  "Link" text,
  "Github" text,
  "Features" jsonb,
  "TechStack" jsonb
);

-- Cria a tabela 'certificates'
CREATE TABLE public.certificates (
  id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  created_at timestamp with time zone DEFAULT now() NOT NULL,
  "Img" text
);

-- Habilitar RLS
ALTER TABLE public.projects ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.certificates ENABLE ROW LEVEL SECURITY;

-- Políticas de Acesso Público para Leitura
CREATE POLICY "Acesso público de leitura para Projetos" ON public.projects FOR SELECT TO public USING (true);
CREATE POLICY "Acesso público de leitura para Certificados" ON public.certificates FOR SELECT TO public USING (true);

2.1 Variáveis ​​de Ambiente

Crie um arquivo .env na raiz do projeto:
VITE_SUPABASE_URL=sua-url-do-supabase
VITE_SUPABASE_ANON_KEY=sua-chave-anon

Encontre essas informações no seu projeto Supabase em Configurações → API.

⚠️ Nunca faça commits .env no controle de versão — certifique-se de que estejam em .gitignore.

2.2 Cliente Supabase (src/supabase.js)

import { createClient } from '@supabase/supabase-js'

const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY

if (!supabaseUrl || !supabaseKey) {
  throw new Error('Credenciais do Supabase não encontradas. Verifique o arquivo .env')
}

export const supabase = createClient(supabaseUrl, supabaseKey)

3.0🗄️ Configuração do Banco de Dados

Acesse o painel do Supabase → SQL Editor, Execute o script abaixo (apenas uma vez): OBS: A pasta de comments foi apagada desse projeto.

-- ============================
-- TABELAS
-- ============================
CREATE TABLE public.projects (
  id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  title text,
  description text,
  img text,
  link text,
  github text,
  features jsonb,
  tech_stack jsonb,
  is_published boolean DEFAULT true,
  order_index int DEFAULT 0,
  created_at timestamptz DEFAULT now()
);

CREATE TABLE public.certificates (
  id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  img text,
  created_at timestamptz DEFAULT now()
);

CREATE TABLE public.portfolio_comments (
  id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
  content text NOT NULL,
  user_name text NOT NULL,
  profile_image text,
  is_pinned boolean DEFAULT false,
  created_at timestamptz DEFAULT now()
);

CREATE TABLE public.profiles (
  id uuid PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
  username text UNIQUE NOT NULL,
  role text NOT NULL CHECK (role IN ('admin', 'user')),
  created_at timestamptz DEFAULT now()
);

-- ============================
-- SEGURANÇA (RLS)
-- ============================
ALTER TABLE public.projects ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.certificates ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.portfolio_comments ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Leitura pública de projetos"
ON public.projects FOR SELECT USING (true);

CREATE POLICY "Leitura pública de certificados"
ON public.certificates FOR SELECT USING (true);

CREATE POLICY "Leitura pública de comentários"
ON public.portfolio_comments FOR SELECT USING (true);

CREATE POLICY "Inserção pública de comentários"
ON public.portfolio_comments FOR INSERT
WITH CHECK (is_pinned = false);

CREATE POLICY "Admin gerencia projetos"
ON public.projects FOR ALL
USING (
  EXISTS (
    SELECT 1 FROM public.profiles
    WHERE id = auth.uid() AND role = 'admin'
  )
);

CREATE POLICY "Admin gerencia certificados"
ON public.certificates FOR ALL
USING (
  EXISTS (
    SELECT 1 FROM public.profiles
    WHERE id = auth.uid() AND role = 'admin'
  )
);

CREATE POLICY "Admin gerencia comentários"
ON public.portfolio_comments FOR UPDATE, DELETE
USING (
  EXISTS (
    SELECT 1 FROM public.profiles
    WHERE id = auth.uid() AND role = 'admin'
  )
);

-- ============================
-- STORAGE
-- ============================
INSERT INTO storage.buckets (id, name, public)
VALUES ('project-images', 'project-images', true)
ON CONFLICT DO NOTHING;

CREATE POLICY "Admin envia imagens de projetos"
ON storage.objects FOR INSERT
WITH CHECK (
  bucket_id = 'project-images'
  AND EXISTS (
    SELECT 1 FROM public.profiles
    WHERE id = auth.uid() AND role = 'admin'
  )
);

CREATE POLICY "Leitura pública imagens de projetos"
ON storage.objects FOR SELECT
USING (bucket_id = 'project-images');

INSERT INTO storage.buckets (id, name, public)
VALUES ('certificate-images', 'certificate-images', true)
ON CONFLICT DO NOTHING;

CREATE POLICY "Admin envia imagens de certificados"
ON storage.objects FOR INSERT
WITH CHECK (
  bucket_id = 'certificate-images'
  AND EXISTS (
    SELECT 1 FROM public.profiles
    WHERE id = auth.uid() AND role = 'admin'
  )
);

CREATE POLICY "Leitura pública imagens de certificados"
ON storage.objects FOR SELECT
USING (bucket_id = 'certificate-images');

4.0 Abrir no Navegador

Acesse a aplicação através do link exibido no seu terminal (geralmente http://localhost:5173).

Importante:

  • Todas as variáveis de ambiente devem começar com VITE_ para que o Vite possa acessá-las.
  • Reinicie o servidor de desenvolvimento após criar ou modificar o arquivo .env.
  • Nunca envie seu arquivo .env para o GitHub. Certifique-se de que ele está listado no seu arquivo .gitignore.

Solução de Problemas

Se encontrar problemas ao rodar o projeto:

  • Verifique se o Node.js está instalado corretamente.
  • Verifique se você está no diretório correto do projeto.
  • Certifique-se de que todas as dependências foram instaladas sem erros.
  • Verifique se as credenciais no .env estão corretas e se o servidor foi reiniciado.
  • Limpe o cache do navegador e tente novamente.

Contato

Se tiver dúvidas ou precisar de ajuda com a configuração, sinta-se à vontade para entrar em contato!

⭐ Se este projeto te ajudou, considere dar uma estrela no GitHub!

About

Portfólio de desenvolvedora front-end com projetos responsivos e interativos, demonstrando habilidades em criação de interfaces modernas e experiência do usuário.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors