OSX UI is a macOS-style desktop window manager framework for web apps. It's a TypeScript library that provides components (buttons, cards, modals, etc.) and core window management (traffic lights, drag, resize, dock, menu bar) for building desktop-like web applications.
# Build all (ESM + CJS + CSS)
npm run build
# Build ESM module
npm run build:esm
# Build CommonJS module
npm run build:cjs
# Build CSS
npm run build:css
# Clean dist folder
npm run clean
# Development watch mode (ESM + CJS in parallel)
npm run dev
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage report
npm run test:coverage
# Lint source files
npm run lint
# Auto-fix lint issues
npm run lint:fix
# Format source files
npm run format
# Check formatting
npm run format:check
# Type-check without emitting
npm run typecheck- Target: ES2022
- Strict mode: enabled
- Declaration files: generated
- No unused locals/parameters allowed
- Interfaces/Types: PascalCase (e.g.,
WindowCreateOptions,ButtonOptions,AppConfig) - Types only: Use
export type { ... }syntax - Functions: camelCase (e.g.,
createWindow,createButton,createDesktop) - Classes: PascalCase (e.g.,
WindowManager,MenuBar,Router) - Files: kebab-case (e.g.,
window-manager.ts,link-interceptor.ts)
- Use
.jsextension for all local imports (ESM style):import { WindowManager } from './core/window-manager.js'; import type { WindowCreateOptions } from '../types.js';
- Use
import typefor type-only imports - Use named exports only (no default exports)
- Group exports in index.ts files by category (Types, Core, Router, Theme, Components, Utils)
- Use 2 spaces for indentation
- No semicolons at end of statements
- Single quotes for strings
- No trailing commas
- No comments unless explaining complex logic
- Return
nullor fallback values instead of throwing errors when possible - Provide default values for optional parameters (e.g.,
opts.minW || 320) - Callbacks should handle their own errors; errors propagate silently to caller
All components follow this pattern:
// Type definitions first
export type ButtonVariant = 'default' | 'primary' | 'danger' | 'ghost' | 'icon' | 'status';
export interface ButtonOptions {
label?: string;
variant?: ButtonVariant;
onClick?: () => void;
}
// Factory function
export function createButton(opts: ButtonOptions): HTMLButtonElement {
const btn = document.createElement('button');
// ... implementation
return btn;
}- Use
document.createElement()for DOM creation - Add class names using
classNameproperty - Attach event listeners directly to elements
- Return the created DOM element
src/
├── index.ts # Main export file
├── app.ts # createApp function
├── types.ts # Global type definitions
├── core/ # Window management, desktop, dock, menu bar
├── components/ # UI components (button, card, modal, etc.)
├── router/ # Router and link interceptor
├── theme/ # Theme manager and themes
└── utils/ # Utility functions
- CSS is bundled separately (see
scripts/bundle-css.js) - Components use BEM-like class names (e.g.,
osx-window,osx-titlebar,osx-btn) - CSS custom properties defined in tokens.ts
- Express server available at
./serverexport - Use
express-spa.tsfor SPA routing wants-json.tsfor API detection middleware
createApp- Main app entry pointWindowManager- Window management (create, minimize, maximize, close, drag, resize)createDesktop- Desktop containerDock- macOS-style dockMenuBar- Menu bar with dropdowns
createButton- Button with variants (default, primary, danger, ghost, icon, status)createCard- Card containercreatePill/createDot- Status indicatorscreateField- Text input, select, textareacreatePasswordField- Password input with show/hide togglecreateModal- Modal dialogcreateToolbar- Button toolbar
createCalendar- Date picker calendarcreateDateRangePicker- Date range picker with two calendars
createCheckbox- Checkbox with labelcreateRadioGroup- Radio button groupcreateToggle- Toggle switchcreateAutocomplete- Autocomplete input with dropdown suggestionscreateFileUpload- Drag & drop file uploadcreateColorPicker- Color picker with presets
createTabs- Tab navigationcreateAccordion- Accordion/collapsible sectionscreateSidebar- Collapsible sidebar navigation
createTable- Data table with sorting and paginationcreateList- List componentcreateTree- Tree/hierarchical viewcreateBadge- Badge/countercreateAvatar- User avatar with image or initials
createToast- Toast notifications (info, success, warning, error)createProgress- Progress barcreateSpinner- Loading spinner
createTooltip- Tooltip on hovercreateContextMenu- Right-click context menucreateDropdown- Dropdown menucreatePopover- Positionable popover
ThemeManager- Theme switchingdarkTheme/lightTheme- Predefined themes
Router- Client-side routingLinkInterceptor- Intercept link clicks for SPA routing