Build System
Understanding OxyMade's build tools and framework generation.
This guide covers OxyMade’s build system for developers who want to customize the framework or understand how it works.
Overview
OxyMade uses Node.js build scripts to generate:
- CSS framework file
- Selector definitions
- Class mappings
- Component bundles
Build Scripts
Available npm scripts in package.json:
| Script | Command | Description |
|---|---|---|
build:css | npm run build:css | Generate framework CSS |
build:framework | npm run build:framework | Build framework modules |
build:components | npm run build:components | Build component bundles |
build:all | npm run build:all | Run all build steps |
generate:mappings | npm run generate:mappings | Generate class mappings |
Framework Source Files
Located in /framework/src/:
Utility Modules
| File | Purpose |
|---|---|
shared-utils.js | Shared utilities, breakpoint mapping |
grid-utilities.js | Grid system generation |
flexbox-utilities.js | Flexbox utilities |
spacing-utilities.js | Spacing utilities |
typography.js | Typography definitions |
color-utilities.js | Color utilities |
borders.js | Border utilities |
padding.js | Padding utilities |
margins.js | Margin utilities |
layout-utilities.js | Display, position, overflow |
Build Scripts
| File | Purpose |
|---|---|
build.js | Main build orchestration |
build-components.js | Component builder |
generate-full-css.js | CSS file generator |
CSS Generation
Process
- Load selector definitions from JSON
- Process each selector’s properties
- Handle nested properties
- Generate breakpoint variants
- Output to
oxymade-framework.css
generate-full-css.js
Main CSS generator (~69KB):
// Simplified structure
const selectors = loadSelectors();
let css = '';
for (const selector of selectors) {
css += generateSelectorCSS(selector);
css += generateBreakpointVariants(selector);
}
writeFile('assets/oxymade-framework.css', css);
Output Structure
/* Base classes */
.flex { display: flex; }
.grid { display: grid; }
/* Breakpoint variants */
@media (min-width: 480px) {
.sm-flex { display: flex; }
.sm-grid { display: grid; }
}
@media (min-width: 768px) {
.lg-flex { display: flex; }
.lg-grid { display: grid; }
}
Breakpoint System
Mapping
OxyMade breakpoints map to Oxygen:
const breakpoints = {
'breakpoint_base': null,
'breakpoint_sm': 'phone_portrait',
'breakpoint_md': 'phone_landscape',
'breakpoint_lg': 'tablet_portrait',
'breakpoint_xl': 'tablet_landscape'
};
Breakpoint Widths
| Prefix | Width |
|---|---|
| (base) | All |
sm- | ≥480px |
md- | ≥640px |
lg- | ≥768px |
xl- | ≥1024px |
Selector JSON Structure
Selectors are defined in /data/selectors-only.json:
{
"id": "uuid-string",
"name": "flex",
"collection": "OxyMade Flexbox",
"type": "class",
"locked": true,
"children": [],
"properties": {
"breakpoint_base": {
"layout": {
"display": "flex"
}
}
}
}
Property Categories
| Category | Properties |
|---|---|
layout | display, position, overflow |
typography | font-size, font-weight, line-height |
spacing | margin, padding |
sizing | width, height |
custom_css | Raw CSS values |
Class Mappings
/data/class-mappings.json maps UUIDs to class names:
{
"uuid-123": "flex",
"uuid-456": "grid",
"uuid-789": "text-lg"
}
Used for:
- Quick lookups
- Oxygen integration
- Class name resolution
Customizing the Build
Adding New Utilities
- Create a new module in
/framework/src/:
// my-utilities.js
export function generateMyUtilities() {
return [
{
name: 'my-utility',
collection: 'OxyMade Custom',
properties: {
breakpoint_base: {
custom_css: {
'my-property': 'value'
}
}
}
}
];
}
- Import in the build script
- Run
npm run build:css
Modifying Existing Utilities
- Find the source file in
/framework/src/ - Modify the generation function
- Run
npm run build:css - Test the output
Adding Breakpoint Variants
Ensure your utility includes breakpoint properties:
{
name: 'my-utility',
properties: {
breakpoint_base: { /* base styles */ },
breakpoint_sm: { /* sm styles */ },
breakpoint_lg: { /* lg styles */ }
}
}
Build Output
oxymade-framework.css
Main CSS output (~49KB):
- All utility classes
- Breakpoint variants
- CSS custom properties
- Organized by collection
selectors-only.json
Lightweight selector data:
- Class names
- Collections
- Property references
- Used for Oxygen sync
Development Workflow
Making Changes
- Modify source files in
/framework/src/ - Run appropriate build script
- Test in development
- Verify Oxygen integration
Testing Changes
- Run build script
- Open Oxygen builder
- Apply classes to elements
- Check browser dev tools
- Test responsive behavior
Debugging
Add console logging in build scripts:
console.log('Processing selector:', selector.name);
console.log('Generated CSS:', css);
File Structure
/framework/
├── src/
│ ├── shared-utils.js
│ ├── grid-utilities.js
│ ├── flexbox-utilities.js
│ └── ...
├── build.js
└── build-components.js
/data/
├── selectors-only.json
├── class-mappings.json
├── variables.json
└── layers.json
/assets/
└── oxymade-framework.css
/generate-full-css.js
Performance Considerations
CSS Size
- Full framework: ~49KB
- Minified: ~35KB
- Gzipped: ~8KB
Build Time
- Full build: ~2-5 seconds
- CSS only: ~1-2 seconds
Runtime Performance
- CSS variables: Hardware accelerated
- Utility classes: No specificity issues
- Media queries: Standard browser handling