Wilout UI
A production-ready Bootstrap-like UI library with raw CSS and vanilla JavaScript. Zero runtime dependencies. Works with Angular, AngularJS, React, or vanilla HTML.
Features
Zero Dependencies
Published artifacts are plain CSS and plain JS. No runtime libraries.
Framework Agnostic
Works with Angular, AngularJS, React, Vue, or vanilla HTML.
Design Tokens
Consistent theming via CSS custom properties. Easy customization.
TypeScript
Full type definitions included for better DX.
SSR Safe
No top-level window/document access. Safe for server rendering.
Accessible
Focus-visible, ARIA support, keyboard navigation built-in.
Installation
Step 1: Install packages
npm install @wilout/ui-css @wilout/ui-js
Step 2: Import CSS in styles.scss
@import '@wilout/ui-css/dist/ui.css';
Step 3: Initialize in AppComponent
import { Component, AfterViewInit, OnDestroy } from '@angular/core';
@Component({
selector: 'app-root',
template: `<router-outlet></router-outlet>`
})
export class AppComponent implements AfterViewInit, OnDestroy {
ngAfterViewInit() {
import('@wilout/ui-js').then(({ init }) => init());
}
ngOnDestroy() {
import('@wilout/ui-js').then(({ destroy }) => destroy());
}
}
Step 1: Include files in index.html
<link rel="stylesheet" href="node_modules/@wilout/ui-css/dist/ui.css">
<script src="node_modules/@wilout/ui-js/dist/index.umd.js"></script>
Step 2: Create a directive
angular.module('app', [])
.directive('uiInit', function() {
return {
link: function(scope, element) {
UI.init(element[0]);
scope.$on('$destroy', function() {
UI.destroy(element[0]);
});
}
};
});
Step 3: Use in templates
<div ui-init>
<button class="ui-btn ui-btn--primary">Click me</button>
</div>
Step 1: Install packages
npm install @wilout/ui-css @wilout/ui-js
Step 2: Import CSS in App.tsx
import '@wilout/ui-css/dist/ui.css';
Step 3: Initialize with useEffect
import { useEffect, useRef } from 'react';
import { init, destroy } from '@wilout/ui-js';
function App() {
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
if (containerRef.current) {
init(containerRef.current);
return () => destroy(containerRef.current!);
}
}, []);
return (
<div ref={containerRef}>
<button className="ui-btn ui-btn--primary">Click me</button>
</div>
);
}
Step 1: Install package
npm install @wilout/ui-rn
Step 2: Import tokens and styles
import { tokens, createStyles } from '@wilout/ui-rn';
import { StyleSheet } from 'react-native';
Step 3: Create styled components
const styles = StyleSheet.create({
button: createStyles.button('primary'),
buttonText: createStyles.buttonText('primary'),
});
function Button({ children }) {
return (
<TouchableOpacity style={styles.button}>
<Text style={styles.buttonText}>{children}</Text>
</TouchableOpacity>
);
}
Note: DOM plugins are not available in React Native. Only tokens and style helpers are included.
Packages
| Package | Description |
|---|---|
@wilout/ui-tokens |
Design tokens (CSS variables + JSON) |
@wilout/ui-css |
Component styles (buttons, forms, cards, etc.) |
@wilout/ui-js |
DOM plugins (collapse, tabs, dropdown, modal) |
@wilout/ui-react |
Optional React wrappers |
@wilout/ui-rn |
React Native tokens helper |
Browser Support
- Chrome/Edge (last 2 versions)
- Firefox (last 2 versions)
- Safari (last 2 versions)
- No IE11 support