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
No build step required. Add a single <link> tag and start using Wilout UI components immediately.
Quick start
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://brandbook.prod.wilout-internal.com/cdn/ui.min.css">
</head>
<body>
<div class="ui-container">
<h1>Hello Wilout UI</h1>
<button class="ui-btn ui-btn--primary">Click me</button>
</div>
</body>
</html>
Available files
| File | Description |
|---|---|
cdn/tokens.css |
Design tokens only (CSS custom properties). Use when you only need variables. |
cdn/ui.css |
Full bundle: tokens + all component styles. |
cdn/ui.min.css |
Minified full bundle. Recommended for production. |
Mirrors
<!-- Primary (Kubernetes) -->
<link rel="stylesheet" href="https://brandbook.prod.wilout-internal.com/cdn/ui.min.css">
<!-- Mirror (GitLab Pages) -->
<link rel="stylesheet" href="https://wilout.gitlab.io/wilout-ui/cdn/ui.min.css">
Note: The CDN delivers CSS only. For interactive components (collapse, dropdown, modal, tabs), add the JS plugin via npm or a
<script> tag.
Step 1: Install packages
npm install @wilout/ui-css @wilout/ui-js @wilout/ui-angular
Step 2: Import CSS in styles.scss
@import '@wilout/ui-css/dist/ui.css';
Step 3: Use directives in your components
import { Component } from '@angular/core';
import { UiCollapseDirective, UiDropdownDirective } from '@wilout/ui-angular';
@Component({
standalone: true,
imports: [UiCollapseDirective, UiDropdownDirective],
template: `
<!-- Collapse with Signal state -->
<button uiCollapse [uiCollapseTarget]="'#content'"
#collapse="uiCollapse">
{{ collapse.isOpen() ? 'Close' : 'Open' }}
</button>
<div id="content" class="ui-collapse">Hidden content</div>
<!-- Dropdown -->
<div class="ui-dropdown">
<button uiDropdown (uiDropdownShown)="onOpen()">Menu</button>
<div class="ui-dropdown__menu">...</div>
</div>
`
})
export class MyComponent {
onOpen() { console.log('Dropdown opened'); }
}
Alternative: Programmatic control
import { WiloutUiService } from '@wilout/ui-angular';
export class MyComponent {
private uiService = inject(WiloutUiService);
openModal() {
this.uiService.showModal('#myModal');
}
}
Step 1: Install packages
npm install @wilout/ui-css @wilout/ui-angularjs
Step 2: Import CSS
<link rel="stylesheet" href="node_modules/@wilout/ui-css/dist/ui.css">
Step 3: Add module dependency
angular.module('myApp', ['wilout.ui'])
.controller('MyCtrl', function(wiloutUi, $scope) {
// Initialize plugins
wiloutUi.init();
// Callbacks for directives
$scope.onCollapsed = function() {
console.log('Collapsed!');
};
});
Step 4: Use directives in templates
<!-- Collapse with state tracking -->
<button ui-collapse ui-collapse-target="#content"
on-collapse-shown="onShown()">
{{ collapseCtrl.isOpen ? 'Close' : 'Open' }}
</button>
<div id="content" class="ui-collapse">Hidden content</div>
<!-- Dropdown -->
<div class="ui-dropdown">
<button ui-dropdown on-dropdown-shown="onOpen()">
{{ dropdownCtrl.isOpen ? 'Close' : 'Menu' }}
</button>
<div class="ui-dropdown__menu">...</div>
</div>
<!-- Modal -->
<button ui-modal-trigger="#myModal">Open Modal</button>
<div id="myModal" class="ui-modal" ui-modal
on-modal-hidden="onClosed()">...</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-angular |
Angular 17+ standalone directives and services |
@wilout/ui-angularjs |
AngularJS 1.x directives and services |
@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