
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
@rainersoft/ui
Advanced tools
Componentes UI reutilizáveis construídos com Radix UI, Tailwind CSS e design tokens
Versão 2.1.0 - Testes abrangentes, componentes completos, setup de testes profissional
Esta biblioteca fornece componentes de UI prontos para uso:
@rainersoft/design-tokens# Com pnpm (recomendado)
pnpm add @rainersoft/ui @rainersoft/design-tokens
# Com npm
npm install @rainersoft/ui @rainersoft/design-tokens
// No seu app principal, importe os estilos globais
import '@rainersoft/ui/styles/global.css';
// OU importe apenas os CSS Variables do design-tokens
import '@rainersoft/design-tokens/formats/css-vars.css';
// Agora use os componentes
import { Button, Card, Input } from '@rainersoft/ui';
function App() {
return (
<Card>
<Input placeholder="Digite algo..." />
<Button>Enviar</Button>
</Card>
);
}
Novidade v2.1.0: Importe apenas os componentes que precisa para um bundle menor!
// ✅ Importação completa (padrão)
import { Button, Card, Input } from '@rainersoft/ui';
// 🌳 Importação individual (recomendado para performance)
import { Button } from '@rainersoft/ui/components/ui/button';
import { Card } from '@rainersoft/ui/components/layout/card';
import { Input } from '@rainersoft/ui/components/forms/input';
// 🎯 Importação por categoria
import * as UI from '@rainersoft/ui/components/ui';
import * as Social from '@rainersoft/ui/components/social';
import * as Forms from '@rainersoft/ui/components/forms';
Novidade v2.1.0: Componentes sociais genéricos para qualquer tipo de conteúdo!
// 🚀 ActionButton - Botão de ação genérico
import { ActionButton } from '@rainersoft/ui/components/social/action-button';
<ActionButton
icon={<Heart />}
activeIcon={<Heart className="fill-current" />}
count={likes}
isActive={isLiked}
onToggle={handleLike}
activeColor="error"
activeLabel="Curtido"
inactiveLabel="Curtir"
/>
// 📤 ShareMenu - Menu de compartilhamento completo
import { ShareMenu } from '@rainersoft/ui/components/social/share-menu';
<ShareMenu
url="/blog/post-123"
title="Como usar React Hooks"
description="Aprenda os fundamentos..."
platforms={['twitter', 'facebook', 'linkedin', 'whatsapp', 'copy', 'qr']}
/>
// 📋 ContentCard - Card genérico com ações
import { ContentCard } from '@rainersoft/ui/components/social/content-card';
<ContentCard
title="Como usar React Hooks"
description="Aprenda os fundamentos dos Hooks React..."
image="/blog/react-hooks.jpg"
category="Tutorial"
readTime={8}
actions={{
like: { count: 42, active: true },
bookmark: { active: false },
share: { url: "/blog/post", title: "Como usar React Hooks" }
}}
/>
import { ContentCard } from '@rainersoft/ui/components/social/content-card';
import { ReadingTime } from '@rainersoft/ui/components/social/reading-time';
import { ActionButton } from '@rainersoft/ui/components/social/action-button';
// Post completo com metadados e ações
<ContentCard
title="Título do Post"
description="Resumo do conteúdo..."
category="Tutorial"
readTime={8}
actions={{
like: { count: 42, active: true },
bookmark: { active: false },
share: { url: "/blog/post", title: "Título do Post" }
}}
/>
import { ContentCard } from '@rainersoft/ui/components/social/content-card';
import { ActionButton } from '@rainersoft/ui/components/social/action-button';
import { ShareMenu } from '@rainersoft/ui/components/social/share-menu';
// Card de produto com ações
<ContentCard
title="Produto Incrível"
description="Descrição do produto..."
price="R$ 199,90"
badge="Promoção"
variant="product"
actions={{
favorite: { count: 89, active: false },
share: { url: "/product/123", title: "Produto Incrível" }
}}
/>
import { ShareMenu } from '@rainersoft/ui/components/social/share-menu';
import { KPI } from '@rainersoft/ui/components/feedback/kpi';
import { Table } from '@rainersoft/ui/components/layout/table';
// Relatório compartilhável
<ShareMenu
url="/dashboard/report/123"
title="Relatório Mensal"
platforms={['copy', 'email']}
variant="ghost"
size="sm"
/>
// Os componentes se adaptam automaticamente ao tema
<div data-theme="dark">
<Button variant="primary">Tema escuro</Button>
</div>
<div data-theme="light">
<Button variant="primary">Tema claro</Button>
</div>
Internamente, os componentes usam classes Tailwind que mapeiam para os tokens de cor, por exemplo:
bg-primary, bg-secondary, bg-accenttext-primary-foreground, text-muted-foregroundborder-border, bg-card, text-card-foregroundEssas classes são resolvidas para CSS Variables definidas em @rainersoft/design-tokens (como --color-primary, --color-background, etc.). Ao trocar o data-theme, você troca o conjunto de variáveis ativas e toda a UI se atualiza automaticamente.
A própria biblioteca usa uma configuração de Tailwind semelhante a esta:
// tailwind.config.ts (simplificado)
import type { Config } from 'tailwindcss';
const config: Config = {
darkMode: ['class', '[data-theme="dark"]'],
theme: {
extend: {
colors: {
background: 'rgb(var(--color-background) / <alpha-value>)',
foreground: 'rgb(var(--color-foreground) / <alpha-value>)',
primary: {
DEFAULT: 'rgb(var(--color-primary) / <alpha-value>)',
foreground: 'rgb(var(--color-primary-foreground) / <alpha-value>)',
},
secondary: {
DEFAULT: 'rgb(var(--color-secondary) / <alpha-value>)',
foreground: 'rgb(var(--color-secondary-foreground) / <alpha-value>)',
},
muted: {
DEFAULT: 'rgb(var(--color-muted) / <alpha-value>)',
foreground: 'rgb(var(--color-muted-foreground) / <alpha-value>)',
},
card: {
DEFAULT: 'rgb(var(--color-card) / <alpha-value>)',
foreground: 'rgb(var(--color-card-foreground) / <alpha-value>)',
},
},
},
},
};
export default config;
ActionButton - Botão de ação genérico (curtir, favoritar, follow)ShareMenu - Menu de compartilhamento completoContentCard - Card genérico com metadados e açõesLikeButton - Botão de curtir específicoBookmarkButton - Botão de salvar específicoShareButton - Botão de compartilhamento específicoReadingTime - Tempo de leitura estimadoButton, Avatar, Input, Label, TextareaSelect, Checkbox, RadioGroup, Switch, Slider, ToggleIcon-Button, Link-Button, FAB, Segmented-ControlForm, Input, Textarea, Select, Checkbox, RadioGroup, Switch, LabelDate-Picker, Time-Picker, Phone-Input, Search-Input, File-Upload, Range-SliderCard, Sheet, Table, ScrollArea, Separator, AspectRatio, ContainerFlex, Grid, Spacer, Panel, Breadcrumb, DividerAlert, AlertDialog, Badge, EmptyState, Progress, Skeleton, SonnerKPI, Notification, SpinnerDialog, Modal, Popover, Tooltip, HoverCard, DropdownMenu, ContextMenuDrawer, Lightbox, Confirm-DialogTabs, Accordion, NavigationMenu, Command, Collapsible, MenuPagination, Sidebar, Steps, Top-BarAvatar, Calendar, Carousel, Chip, Masonry, Rating, TimelineParticlesEffect, StarsBackground, FloatingGrid, CelestialBackground, MatrixBackgroundThemeProviderBackToTop, CookieBanner, InstallPrompt, LoadingScreen, PageHeader, UpdateNotificationErrorBoundary, Center, Kbd, Code, Quote, VisuallyHidden, ThemeToggle, TokensDemoAspect-Ratio-Box# Construir biblioteca
pnpm build
# Desenvolvimento com hot reload
pnpm dev
# Executar testes
pnpm test
# Storybook (documentação visual)
pnpm storybook
# Limpar build
pnpm clean
@rainersoft/ui/
├── src/
│ ├── components/
│ │ ├── ui/ # Componentes UI básicos
│ │ ├── social/ # 🆕 Componentes sociais genéricos
│ │ ├── forms/ # Elementos de formulário
│ │ ├── layout/ # Containers e layout
│ │ ├── feedback/ # Feedback visual
│ │ ├── overlays/ # Modais e overlays
│ │ ├── navigation/ # Navegação
│ │ ├── data-display/ # Exibição de dados
│ │ ├── effects/ # Efeitos visuais
│ │ ├── utilities/ # Utilitários
│ │ └── providers/ # Context providers
│ ├── lib/
│ │ ├── utils.ts # Função cn() e motion helpers
│ │ └── color-utils.ts # Utilitários de cor
│ ├── styles/
│ │ └── global.css # Estilos globais + utilitários visuais
│ └── index.ts # Exportações
├── stories/ # Stories do Storybook
├── scripts/ # Scripts de build e geração
└── dist/ # Build para distribuição
└── components/ # 🆕 Exports individuais
├── ui/
├── social/
├── forms/
├── layout/
├── feedback/
├── overlays/
├── navigation/
├── data-display/
├── effects/
└── providers/
<ActionButton
icon={<Heart />}
activeIcon={<Heart className="fill-current" />}
count={42}
isActive={true}
onToggle={handleLike}
activeColor="error"
activeLabel="Curtido"
inactiveLabel="Curtir"
variant="default"
size="sm"
/>
<ShareMenu
url="/blog/post-123"
title="Como usar React Hooks"
description="Aprenda os fundamentos..."
platforms={['twitter', 'facebook', 'linkedin', 'whatsapp', 'copy', 'qr']}
variant="outline"
size="sm"
showLabel={true}
onShare={(platform) => console.log('Shared:', platform)}
/>
<ContentCard
title="Como usar React Hooks"
description="Aprenda os fundamentos dos Hooks React..."
image="/blog/react-hooks.jpg"
category="Tutorial"
readTime={8}
link="/blog/react-hooks"
variant="default"
orientation="vertical"
actions={{
like: { count: 42, active: true },
bookmark: { active: false },
share: { url: "/blog/post", title: "Como usar React Hooks" }
}}
/>
<Button variant="default">Default</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="destructive">Destructive</Button>
<Button size="sm">Small</Button>
<Button size="default">Default</Button>
<Button size="lg">Large</Button>
<Button size="icon">🚀</Button>
<Input placeholder="Digite..." />
<Input type="email" />
<Input disabled />
<Input aria-invalid="true" />
<Card>
<CardHeader>
<CardTitle>Título</CardTitle>
<CardDescription>Descrição</CardDescription>
</CardHeader>
<CardContent>Conteúdo</CardContent>
<CardFooter>Rodapé</CardFooter>
</Card>
Contribuições são bem-vindas! Consulte o Guia de Contribuição para saber como contribuir com este projeto.
🔒 Governança e Zero Hardcode
styles/global.css e lib/*🎨 Utilitários Visuais Integrados
.glass, .neon-*, .gradient-*, .animate-*@rainersoft/design-tokenssrc/styles/global.css com todos os utilitáriosClasses Utilitárias Disponíveis:
/* Glassmorphism */
.glass, .glass-dark
/* Neon Effects */
.neon-text, .neon-box
/* Gradients */
.gradient-primary, .gradient-accent, .gradient-cyberpunk, .gradient-neon
/* Animações */
.animate-pulse-glow, .animate-slide-up, .animate-fade-in, .animate-float
/* Scrollbar */
.custom-scrollbar
Migração:
- import '@rainersoft/design-tokens/src/css-vars.css';
+ import '@rainersoft/ui/styles/global.css';
MIT © Rainer Teixeira
FAQs
Componentes UI reutilizáveis com Radix UI e Tailwind CSS
We found that @rainersoft/ui demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.