reablocks — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited reablocks (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Reablocks is a React UI component library with 50+ components built on Tailwind CSS and Framer Motion. It provides a comprehensive theming system, accessible components, and consistent design patterns.
npm install reablocksEvery app using reablocks must be wrapped in a ThemeProvider:
import { ThemeProvider, theme } from 'reablocks';
function App() {
return (
<ThemeProvider theme={theme}>
<YourApp />
</ThemeProvider>
);
}| Prop | Type | Required | Description |
|---|---|---|---|
theme | ReablocksTheme | Yes | The theme to apply |
Reablocks ships two theme options:
themeUnify export + reablocks/unify.css import (one-line setup, fixed tokens).themeUnify.ts download (every component theme + composed ReablocksTheme) plus the CSS bundle zip (index.css, common.css, root.css, light.css, dark.css, tw.css) produced by the Reablocks Figma Plugin's one-click Export Styles button. This is what powers per-component detail tokens like --buttons-details-height-core-icon-lg.// Default theme
import { ThemeProvider, theme } from 'reablocks';
<ThemeProvider theme={theme}>...</ThemeProvider>
// Unify theme — quick-start
import { ThemeProvider, themeUnify } from 'reablocks';
import 'reablocks/unify.css';
<ThemeProvider theme={themeUnify}>...</ThemeProvider>Switch to Unify when any of these apply:
themeUnify.ts, root.css / dark.css / light.css / tw.css, or per-component detail tokens like --buttons-details-*, --inputs-details-*, --tabs-details-*.For the quick-start path (single import, no Figma): use themeUnify as shown above. No further setup required.
For the production / Figma-synced path (single-file themeUnify.ts + Figma-generated CSS layers, customization via CSS, designer ↔ engineer sync): see the dedicated skill at unify-theme/SKILL.md. It covers:
root.css / dark.css / light.css / tw.css / common.css)Do not offer Unify when the user only wants minor color/variant tweaks — extendTheme(theme, …) against the default theme is simpler. Do not offer Unify when the user is not on Tailwind v4+ or reablocks v10+.
Use extendTheme() to deep-merge partial overrides into a base theme. Only specify the properties you want to change:
import { ThemeProvider, theme, extendTheme, PartialReablocksTheme } from 'reablocks';
const customTheme: PartialReablocksTheme = {
components: {
button: {
colors: {
primary: {
filled: 'bg-blue-500 hover:bg-blue-600 text-white'
}
}
}
}
};
<ThemeProvider theme={extendTheme(theme, customTheme)}>
<App />
</ThemeProvider>You can extend any component with new variants and colors. Only provide the keys you want to add — existing values remain intact:
import { ThemeProvider, theme, extendTheme, PartialReablocksTheme } from 'reablocks';
const customTheme: PartialReablocksTheme = {
components: {
button: {
// Add a new variant with its base styles
variants: {
gradient: 'border rounded-lg'
},
// Add color mappings for the new variant
colors: {
primary: {
gradient: 'bg-linear-to-r from-blue-500 to-purple-500 border-blue-500 text-white'
},
secondary: {
gradient: 'bg-linear-to-r from-pink-500 to-purple-500 border-pink-500 text-white'
}
}
}
}
};
<ThemeProvider theme={extendTheme(theme, customTheme)}>
{/* Use the new variant just like built-in ones */}
<Button variant="gradient" color="primary">Gradient Primary</Button>
<Button variant="gradient" color="secondary">Gradient Secondary</Button>
</ThemeProvider>The same pattern works for adding custom colors, sizes, or entirely new theme keys to any component.
By default, extendTheme replaces theme string values. To merge Tailwind classes (append instead of replace), pass mergeThemeClasses as the third argument:
import { extendTheme, mergeThemeClasses, theme } from 'reablocks';
const merged = extendTheme(theme, customTheme, mergeThemeClasses);Extend a single component's theme:
import { extendComponentTheme, defaultButtonTheme } from 'reablocks';
const myButtonTheme = extendComponentTheme(defaultButtonTheme, {
sizes: { xlarge: 'text-xl px-6 py-3' }
});Reablocks exports several utility types for typing partial themes:
PartialReablocksTheme — DeepPartial<ReablocksTheme>, ideal for extendTheme(theme, ...) overridesDeepPartial<T> — recursive Partial<T>, useful for typing custom component theme fragmentsimport type { DeepPartial, PartialReablocksTheme } from 'reablocks';
import type { ButtonTheme } from 'reablocks';
const myButton: DeepPartial<ButtonTheme> = {
sizes: { xlarge: 'text-xl px-6 py-3' }
};Get a specific component's theme from context. Pass an optional custom theme to override:
import { useComponentTheme } from 'reablocks';
function MyComponent({ theme: customTheme }) {
const theme = useComponentTheme('button', customTheme);
return <button className={theme.base}>...</button>;
}Access the full theme context including CSS tokens and runtime updates:
import { useTheme } from 'reablocks';
function MyComponent() {
const { theme, tokens, updateTheme, updateTokens } = useTheme();
// tokens = Record<string, string> of CSS custom properties
// updateTheme() for runtime theme switching
}When working with reablocks components, follow these conventions:
import { Component } from 'reablocks'forwardRef and accept a ref propclassName which is merged last (highest priority) via cn() (tailwind-merge)theme prop for per-instance theme overridecn() for Tailwind class merging — combines classnames + tailwind-merge to deduplicate/resolve conflictsanimated prop (boolean) to toggleThe theme.components object contains theme configs for every component:
avatar, avatarGroup, badge, button, chip, checkbox, contextMenu,
dateFormat, dialog, divider, dotsLoader, drawer, ellipsis, field,
select, list, menu, sort, card, kbd, notification, input, dateInput,
calendar, calendarRange, commandPalette, collapse, textarea, radio,
range, redact, toggle, tooltip, tree, jsonTree, popover, pager,
tabs, breadcrumbs, stepper, callout, backdrop, navigation, skeleton,
typographyAvatar, AvatarGroup, Badge, Button, Chip, CommandPalette, IconButton, Kbd, Loader, Navigation, Skeleton
Calendar, Checkbox, DateInput, Input (DebouncedInput, InlineInput), Radio, Range, Select (SingleSelect, MultiSelect), Textarea, Toggle
Breadcrumbs, Card, Collapse, Divider, Field, List, Motion, Stepper, Tabs, Tree
Backdrop, Callout, ConfirmDialog, ContextMenu, Dialog, Drawer, Menu, Notification, Popover, Tooltip
H1, H2, H3, H4, H5, H6, P, BlockQuote, Lead, Large, Small, Muted
DataSize, DateFormat, Duration, Ellipsis, InfinityList, Pager, Pluralize, Redact, Sort
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.