TutorLoom
기업·대학·교육기관을 위한 학습 플랫폼, 무료 오픈소스이며 엔터프라이즈 버전 제공
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기BlinkLandingPage
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Site do Blink, app de estudo com flashcards, quiz e repetição espaçada. A IA transforma o material do estudante (PDF, PPTX, DOCX, fotos ou um assunto digitado) em cards prontos e explica cada erro. Página direta: o que o app faz, o preço e o download.
Vite · React 18 · TypeScript · Tailwind CSS v4 · shadcn (estrutura) · React Router
npm install
npm run dev # http://localhost:5173
| Script | O que faz |
|---|---|
npm run dev | Servidor de desenvolvimento com HMR |
npm run build | Checagem de tipos + build de produção em dist/ |
npm run preview | Serve o dist/ para conferir o build |
npm run typecheck | Só a checagem de tipos |
index.html Entry do Vite
components.json Config do shadcn (aliases, tema, lucide)
vite.config.ts Plugins e alias @ -> ./src
public/assets/mockups/ Capturas de tela do app (WebP)
public/assets/brand/ Ícones
src/
main.tsx Bootstrap + BrowserRouter
App.tsx Rotas
index.css Tailwind + ponte de tokens shadcn -> Blink
styles/blink.css Sistema visual (tokens, componentes, responsivo)
components/
ui/ Componentes shadcn / 21st.dev
Header.tsx Footer.tsx StoreBadges.tsx ThemeToggle.tsx BlinkMark.tsx
sections/ Uma seção da landing por arquivo, na ordem da página:
Hero, HowItWorks, Features, Plans, Faq, DownloadCta
pages/ Home, Privacidade, Termos, deck e autor compartilhados
hooks/ useTheme, useScrollReveal
data/ pricing.ts (preços, itens, limites), faq.tsx, site.ts
lib/utils.ts cn()
DESIGN.md Referência de linguagem visual (extraída do Foodnoms)
LANDING_BRIEF.md Brief original (preços, planos e recursos já mudaram — vale o site)
O components.json já está configurado (estilo new-york, cssVariables, ícones
lucide, alias @/components/ui), então dá para colar componentes direto:
npx shadcn@latest add button
Componentes do 21st.dev que trazem "use client" funcionam — a diretiva é ignorada
fora do Next e não atrapalha.
Animação: o projeto usa o pacote motion (import { motion } from "motion/react"),
que é a continuação do framer-motion com a mesma API. Componentes de terceiros que
importam de "framer-motion" só precisam ter o import trocado para "motion/react" —
não instale as duas bibliotecas, o bundle carregaria dois motores de animação.
Já integrados em src/components/ui/:
| Componente | Onde é usado | Origem |
|---|---|---|
interactive-accordion.tsx | seção FAQ | 21st.dev |
dot-pattern.tsx | textura do herói | Magic UI |
phone-carousel.tsx | carrossel de telas do herói | reescrito no desenho do "Phone Mockups 1" (solaceui, 21st.dev) |
bento.tsx | seção Recursos (o grid e os cantos ficam em .bento, no blink.css) | BentoCard do "FUI Bento Grid Dark" (21st.dev), adaptado para motion/react |
Preto e branco, como o app: paleta monocromática, com tema claro e escuro (o
botão no header alterna; sem escolha salva, segue o sistema). O destaque é de tom —
o resto do título em secundário e o resultado em forte (.tt + <strong>) —,
nunca de cor. Muito espaço em branco, uma ideia por seção, e o CSS é escrito celular
primeiro (a regra solta vale para o celular; as media queries só acrescentam).
| Token | Claro | Escuro | Uso |
|---|---|---|---|
--bg | #e2e2df | #000000 | Fundo da página |
--card | #f6f6f4 | #121212 | Cards |
--text | #111111 | #c9c9c9 | Texto principal |
--text-2 | #66666b | #7c7c84 | Texto secundário |
--invert | #111111 | #c9c9c9 | Botões, números dos passos, "Melhor escolha" |
Tipografia: Manrope (400–800), via Google Fonts, em títulos e texto.
Os tokens vivem em src/styles/blink.css; trocar a paleta é editar o bloco :root
de lá. O src/index.css só faz a ponte: mapeia os nomes que o shadcn espera
(--color-background, --color-primary, --color-border…) para esses tokens, de
modo que componentes de terceiros já nascem na paleta certa.
O tema é carimbado em <html data-theme="…"> por um script inline no index.html,
antes da primeira pintura, para não piscar. A variante dark: do Tailwind está
ligada a esse mesmo atributo via @custom-variant.
Cuidado com a ordem das camadas. O blink.css é importado com
layer(components), e isso não é decorativo: CSS fora de qualquer @layer vence
qualquer regra dentro de uma layer, então o reset daqui (p { margin: 0 },
a { color: inherit }, img { display: block }) passaria por cima dos utilitários
do Tailwind — um mb-8 num <p> simplesmente não teria efeito. Em components a
precedência fica certa: o reset ainda vence o preflight, e as utilities vencem o
reset. Se algum dia um utilitário do Tailwind parecer ignorado, é aqui que se olha.
Capturas reais do app, em public/assets/mockups/ — WebP com fundo transparente e a
moldura do aparelho já embutida na imagem (por isso o realce é drop-shadow, que
segue o recorte, e não box-shadow).
| Arquivo | Tela | Onde aparece |
|---|---|---|
decks.webp | Decks | carrossel do herói e bento "Decks gerados por IA" |
inicio.webp | Início | carrossel do herói (abre nela) |
chat.webp | Conversa sobre a questão | carrossel do herói e bento "Chat sobre a questão" |
questao.webp | Questão com alternativas | carrossel do herói e bento "Repetição espaçada" |
revisar.webp | Revisar | carrossel do herói e bento "Aba Revisar" |
comunidade.webp | Comunidade | carrossel do herói e bento "Comunidade" |
progresso.webp | Progresso | carrossel do herói e bento "Hábito e progresso" |
O carrossel do herói passa por todas as telas; a lista e a ordem ficam em
src/sections/Hero.tsx, e o texto alternativo de cada tela em src/data/telas.ts.
Geradas a partir dos PNGs de 1451×2828 (mockups de iPhone 15) com recorte da área pintada e reamostragem para 700×1398. Para trocar uma tela, basta substituir o arquivo mantendo essa proporção.
src/pages/PrivacyPolicyBody.tsx e TermsBody.tsx) são rascunhos redigidos a
partir do brief e trazem marcadores [DEFINIR] (titular, endereço, comarca do
foro, data de vigência, prazo de backup). Precisam de revisão jurídica — as URLs
são exigidas pelo App Store Connect e pelo Play Console.mailto: para o suporte). Quando
a compra abrir, trocar PLUS_A_VENDA para true em src/data/pricing.ts: o botão
vira "Assinar o Plus" e aponta para o download.src/data/pricing.ts
(o equivalente mensal e a economia do anual são calculados). Se mudarem, ajustar
também a seção 8 dos Termos.URL_APP_STORE em src/data/site.ts ainda é provisório.public/assets/brand/, gerada a partir
do ícone 1024 do app: blink_logo.png (header/footer), blink_favicon.png e
apple-touch-icon.png. Se o ícone do app mudar, regere os três a partir dele.og:image e og:url — dependem do domínio e de uma
imagem de compartilhamento.npm run build gera dist/. Publique essa pasta em Vercel, Netlify, Cloudflare
Pages ou GitHub Pages.
Como as rotas /privacidade e /termos são do React Router, o host precisa
devolver o index.html para qualquer caminho. Isso já está configurado:
vercel.json para a Vercel e public/_redirects para Netlify e Cloudflare Pages.
Em outros hosts, configure o fallback de SPA para index.html.