@ilokesto/utilinent
v1.2.1
Published
**English** | [한국어](./README.ko.md)
Maintainers
Readme
@ilokesto/utilinent
English | 한국어
Documentation
- Full docs: English · 한국어
- Source: packages/utilinent
- npm: @ilokesto/utilinent
As React apps grow, JSX often becomes cluttered with nested ternary operators and bloated map callbacks, which rapidly degrades readability. utilinent was created to solve these recurring UI patterns by providing small, declarative components.
Inspired by the concise and expressive style of SolidJS, utilinent encapsulates common tasks — conditional rendering, list rendering, and lazy loading — into clear APIs. For example, replace complex ternaries with a Show component, or use For to render arrays along with a built-in fallback for empty data.
By moving noisy logic out of views and into reusable components, utilinent improves readability, maintainability, and lets developers focus more on business logic while boosting team productivity.
Installation
utilinent can be installed using several methods listed below.
npm install @ilokesto/utilinent
pnpm add @ilokesto/utilinent
yarn add @ilokesto/utilinent
bun add @ilokesto/utilinent
Quick start
When handling async data in React, it's common to render different UI for loading, empty, or populated states. The examples below show typical patterns and how utilinent components simplify them.
import React, { useState, useEffect } from 'react';
const UserList = () => {
const { data: users } = useQuery( ... )
return (
<div>
<h2>User List</h2>
{loading ? (
<p>Loading users...</p>
) : (
users.length > 0 ? (
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
) : (
<p>No users found.</p>
)
)}
</div>
);
};
export default UserList;utilinent's Show and For components make conditional and list rendering more declarative and concise. They help express loading and list states clearly so your UI intent is easier to read and maintain.
import React, { useState, useEffect } from 'react';
import { Show, For } from '@ilokesto/utilinent';
const UserListAfter = () => {
const { data: users } = useQuery( ... )
return (
<div>
<h2>User List</h2>
<Show when={!loading} fallback={<p>Loading users...</p>}>
<For.ul each={users} fallback={<p>No users found.</p>}>
{(user) => (
<li key={user.id}>{user.name}</li>
)}
</For.ul>
</Show>
</div>
);
};
export default UserListAfter;
Mount async contract
Mount accepts direct non-Promise React nodes. Asynchronous work must be passed as a factory, so the contract remains the same with React 18 and React 19 types.
import { Mount } from '@ilokesto/utilinent';
<Mount fallback={<p>Loading preview...</p>} onError={reportError}>
{() => loadPreview().then((preview) => <Preview data={preview} />)}
</Mount>Direct Promise and PromiseLike children are intentionally rejected. A factory may return either a node synchronously or a Promise of a node.
Custom proxy components
If you want to build your own Show-style component (for example, Clickable),
there is a short guide in the repo:
CUSTOM_CLICKABLE.md
