@hanamura/rcgen
Version:
Generate optimized React container components from configuration
147 lines (116 loc) • 4.49 kB
Markdown
# React Containers Static Generator
A tool for generating optimized React container components with static CSS from configuration files.
## Overview
This tool generates responsive React container components based on a simple JSON configuration file. It produces code optimized for Server-Side Rendering with no layout flash issues.
Generated files include:
1. React component files (`.tsx`)
2. CSS Module files (`.module.css`) with media queries
3. TypeScript type definitions
4. Core utility files
## Benefits
- **SSR Compatible**: No more layout flash issues with server-side rendering
- **Performance**: Static CSS is more performant than runtime matchMedia evaluations
- **CSS Variables Based**: Uses CSS variables and media queries instead of JavaScript
- **Type Safety**: Strong TypeScript typings for all components and options
- **Zero Runtime Overhead**: All responsive behavior happens entirely in CSS
- **Framework Agnostic**: Works with any React-based framework
## Installation
```bash
# Install the generator (not yet published)
npm install @hanamura/rcgen
# Or clone this repository and build it locally
git clone https://github.com/hanamura/react-containers.git
cd react-containers/static-generator
npm install
npm run build
```
## Usage
```bash
# Generate components based on your configuration
npx rcgen --config ./config.json --output ./src/generated
# Use the --force flag to overwrite existing files
npx rcgen --config ./config.json --output ./src/generated --force
# Use the --verbose flag for detailed output
npx rcgen --config ./config.json --verbose
```
## Configuration Format
The configuration file uses a JSON format that defines your queries (breakpoints), spacing values, and container components to generate:
```json
{
"queries": [
{ "name": "vp_sm", "query": "(min-width: 0px)" },
{ "name": "vp_md", "query": "(min-width: 640px)" },
{ "name": "vp_lg", "query": "(min-width: 1024px)" }
],
"spacing": [
{ "name": "sp_sm", "value": "var(--spacing-sm)" },
{ "name": "sp_md", "value": "var(--spacing-md)" },
{ "name": "sp_lg", "value": "var(--spacing-lg)" }
],
"containers": ["Stack", "Tile", "Cluster", "Reel", "Switcher", "Panorama"],
"variablePrefix": "rcg"
}
```
### Configuration Properties
- **queries**: Array of query objects with `name` and `query` (CSS media query) properties
- **spacing**: Array of spacing objects with `name` and `value` (CSS value) properties
- **containers**: Array of container component names to generate
- **variablePrefix** (optional): Prefix for CSS variables to avoid naming collisions
## Available Containers
The system includes these built-in container components:
| Component | Description | CSS Implementation | Key Options |
|-----------|-------------|-------------------|-------------|
| Stack | Vertical layout | Flexbox with column direction | gap, direction |
| Tile | Grid layout | CSS Grid with configurable columns | columns, gap |
| Cluster | Wrapped flex layout | Flexbox with wrap | gap, align, justify |
| Reel | Horizontal scroll | CSS scroll snap with overflow | gap, snap |
| Switcher | Content switching | CSS-based display switching | threshold, gap |
| Panorama | Full-width container | 100vw width and negative margins | indent |
## Generated Output Structure
The generator creates the following directory structure:
```
output-dir/
├── core/
│ ├── index.ts - Exports all utilities and types
│ ├── types.ts - Type definitions
│ └── utils.ts - Utility functions
└── components/
├── Stack.tsx
├── Stack.module.css
├── Tile.tsx
├── Tile.module.css
└── ... other components
```
## Using the Generated Components
```tsx
import { Stack, Tile, spacing } from './generated';
function App() {
return (
<Stack
options={{ gap: spacing.sp_md }}
adaptiveOptions={{
vp_sm: { gap: spacing.sp_sm },
vp_lg: { gap: spacing.sp_lg }
}}
>
<Tile
options={{ columns: 1 }}
adaptiveOptions={{
vp_md: { columns: 2 },
vp_lg: { columns: 3 }
}}
>
{/* Content */}
</Tile>
</Stack>
)
}
```
## Roadmap
- Support for custom component templates
- Plugin system for extending with custom behaviors
- Visual editor for configuration
- Integration with popular frameworks (Next.js, Gatsby, etc.)
- Additional container component types
## License
MIT