An open API service indexing awesome lists of open source software.

https://github.com/srdjan/ui-lib

ui-lib is an ultra-lightweight, type-safe SSR component library with DOM-native state management, HTMX inside and hybrid reactivity. Built with ❤️ for the modern web.
https://github.com/srdjan/ui-lib

css frontend html htmx javascript javascript-weekly react-status ssr typescript ui web

Last synced: 3 months ago
JSON representation

ui-lib is an ultra-lightweight, type-safe SSR component library with DOM-native state management, HTMX inside and hybrid reactivity. Built with ❤️ for the modern web.

Awesome Lists containing this project

README

          

# ui-lib

Ultra-lightweight, type-safe SSR components with DOM-native state management and
hybrid reactivity.

## Features

- 🌐 SSR-first, JSX-always rendering
- 🧭 Light Functional Programming: types-first, pure functions, Result, no
classes
- 🧩 DOM-native **state management**: classes, data-* attributes, element content, CSS custom
properties
- 🔒 **Composition-Only Pattern**: Apps compose pre-styled components, enforcing
UI consistency
- 🎨 **Zero Style Conflicts**: No custom CSS in apps
- 🕵️ **HTMX** encapsulated via component APIs (no hx-* in application code)
- 📦 Component-colocated API, styles, and reactivity
- 🔧 Type-safe end-to-end with strict TypeScript
- 📚 50+ pre-styled components with rich variant APIs; progressive enhancement
optional (zero framework runtime)

## Quick Start

### Installation

```bash
# Local clone (recommended)
git clone https://github.com/srdjan/ui-lib.git
cd ui-lib

# Dev server & tasks
deno task start # type-check then start the Todo demo
deno task serve # start the Todo demo directly
deno task bundle:state # emits dist/ui-lib-state.js for optional client helpers
```

### Basic Usage

```tsx
import { defineComponent, h, render } from "ui-lib/mod.ts";
import { Card } from "ui-lib/components";

// Application components compose pre-styled library components
defineComponent("user-card", {
render: ({ name = "Guest", role = "User" }) => (

{name}


{role}



),
});

// Use it (JSX + render to produce HTML on the server)
const html = render();
```

> **Why Composition-Only?** Applications cannot add custom styles when using
> `mod.ts`. This enforces UI consistency, reduces code by 94%, and ensures all
> apps using ui-lib have a uniform look. Custom styling is reserved for library
> component development (see `lib/internal.ts`).

> Note: In application code, call `render()` to produce HTML.
> `renderComponent` is still available for low-level access when needed.

### With Function-Style Props

```tsx
import { boolean, defineComponent, h, number, string } from "ui-lib";
import { Button, Card } from "ui-lib/components";

defineComponent("counter", {
render: ({
label = string("Count"),
value = number(0),
disabled = boolean(false),
}) => (

{label}: {value}

Increment


),
});

// Type-safe usage (JSX-only in app code)
const html = ;
```

### Composing Library Components

Applications build UIs by composing pre-styled library components with variants:

```tsx
import { Alert, Badge, Button, Card } from "ui-lib/components";

const Page = () => (
<>

Operation completed!



Welcome New


Get started with ui-lib's 50+ components



Get Started


>
);
```

All components provide rich variant APIs (primary, secondary, success, danger,
etc.) for customization without CSS.

### Component-Colocated APIs (HTMX Abstracted Away)

Components define APIs with HTTP method helpers, keeping HTMX completely hidden from application code.
Applications compose library components with **native spread operators**:

```tsx
import { defineComponent, del, h, post } from "ui-lib/mod.ts";

defineComponent("todo-item", {
api: {
toggle: post("/api/todos/:id/toggle", toggleHandler),
remove: del("/api/todos/:id", deleteHandler),
},
render: ({ todo }, api) => (


{todo.text}
Delete

),
});
```

**Key Benefits:**
- ✅ **Zero HTMX in app code** - All `hx-*` attributes generated internally
- ✅ **Zero custom CSS** - Library's `` component provides all styling
- ✅ **Ergonomic spread syntax** - Use `{...api!.action(id)}` directly in JSX
- ✅ **Type-safe APIs** - HTTP methods (`post`, `del`, `get`, `patch`, `put`) with route params
- ✅ **Automatic route registration** - Call `registerComponentApi("todo-item", router)` once
- ✅ **Children support** - Library components accept custom children with native elements

Available HTTP helpers: `get()`, `post()`, `patch()`, `put()`, `del()` (aliased: `remove`, `create`)

## Three-Tier Reactivity

### Tier 1: CSS Property Reactivity

Instant visual updates via CSS custom properties:

```tsx
defineComponent("theme-toggle", {
reactive: {
css: {
"--theme": "data-theme",
},
},
render: () => `Toggle Theme`,
});
```

### Tier 2: Pub/Sub State Manager

Cross-component state synchronization:

```tsx
defineComponent("cart", {
reactive: {
state: {
"cart-count": "data-count",
},
},
render: () => `


Cart Items: 0

`,
});
```

### Tier 3: DOM Event Communication

Component-to-component messaging:

```tsx
defineComponent("notification", {
reactive: {
on: {
"user:login": "handleLogin",
},
},
render: () => `

`,
});
```

## Component Library

ui-lib includes 50+ production-ready components:

- **Layout**: AppLayout, Navbar, Sidebar, MainContent
- **Forms**: Input, Select, Textarea, Checkbox, Radio, Switch
- **Buttons**: Button, ButtonGroup, IconButton
- **Data**: Table, Card, List, Tree
- **Feedback**: Alert, Toast, Progress, Skeleton
- **Overlays**: Modal, Drawer, Popover, Tooltip
- **Navigation**: Tabs, Breadcrumb, Pagination, Stepper
- **Display**: Avatar, Badge, Tag, Chip

## Examples

Run the showcase server to see all components in action:

```bash
# Start the Todo app demo
deno task serve

# Open http://localhost:8080
```

Repo layout (examples)

```
examples/
└── todo-app/
├── server-custom.tsx # Custom components demo
├── server-library.tsx # Library components demo
├── api/ # Handlers, types, repository
└── components/ # SSR components with colocated API/styles/reactivity
```

## Performance

- **SSR rendering**: ~0.5ms per component
- **Zero client runtime**: No JavaScript framework needed
- **Tiny footprint**: < 10KB for optional client enhancements
- **Streaming**: Built-in support for streaming responses

## Documentation

- [Getting Started](docs/getting-started.md)
- [Architecture](docs/architecture.md)
- [Component API](docs/component-api.md)
- [Examples](docs/examples.md)
- [Modern CSS Architecture](docs/modern-css-architecture.md)

## Development

```bash
# Type check
deno task check

# Run tests
deno task test

# Format code
deno task fmt

# Run examples
deno task serve

# Build documentation
deno task docs
```

## Philosophy

ui-lib reimagines web components by embracing the platform:

1. **State belongs in the DOM** - Not in JavaScript memory
2. **CSS is the styling language** - Not JavaScript objects (for library
components)
3. **HTML is the structure** - Not virtual DOM trees
4. **Progressive enhancement** - Not hydration
5. **Server-first** - Not client-first with SSR bolted on
6. **Composition over customization** - Apps compose pre-styled components with
variants

## Library Development

While applications use the composition-only pattern, **library components** have
full styling capabilities:

```tsx
// lib/components/my-component.ts
import { css, defineComponent } from "../../internal.ts";

defineComponent("my-component", {
styles: css({
padding: "1rem",
backgroundColor: "var(--surface-bg)",
// Full CSS-in-TS capabilities
}),
render: ({ variant = "default" }) => (


{/* component content */}

),
});
```

Library components import from `lib/internal.ts` which provides unrestricted
access to:

- Full `defineComponent` with styles
- CSS-in-TS system (`css`, `createTheme`, `composeStyles`)
- Theme system and design utilities
- All internal utilities

See [Contributing Guide](CONTRIBUTING.md) for details on developing library
components.

## License

MIT License - see [LICENSE](LICENSE) file for details.

## Contributing

Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md)
for details.

## Support

- [Documentation](https://ui-lib.dev)
- [GitHub Issues](https://github.com/yourusername/ui-lib/issues)
- [Discord Community](https://discord.gg/ui-lib)