
Docyrus App Dev React
- 63 installs
- 13 repo stars
- Updated July 15, 2026
- docyrus/agent-skills
Build Docyrus-backed React TypeScript apps end-to-end, combining auth, API access, runtime helpers, generated collections, and production UI patterns.
About
A comprehensive skill uniting Docyrus app architecture, authentication, data access, and UI implementation with TanStack Query/Form and preferred component libraries. A developer uses it to build dashboards, forms, tables, and detail pages on Docyrus in one place.
- Combines @docyrus/api-client, /signin, and /app-utils runtime helpers
- Covers ACL-driven UI, saved grid views, and shadcn/diceui/animate-ui/docyrus-ui component selection
Docyrus App Dev React by the numbers
- 63 all-time installs (skills.sh)
- Ranked #1,191 of 2,245 Frontend Development skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/docyrus/agent-skills --skill docyrus-app-dev-reactAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 63 |
|---|---|
| repo stars | ★ 13 |
| Last updated | July 15, 2026 |
| Repository | docyrus/agent-skills ↗ |
What it does
Build Docyrus-backed React TypeScript apps end-to-end, combining auth, API access, runtime helpers, generated collections, and production UI patterns.
Files
Docyrus App Dev React
Build Docyrus React TypeScript applications end-to-end. This skill combines app architecture, authentication, data access, query patterns, and production-grade UI guidance in one place.
Tech Stack
- React 19 + TypeScript + Vite
- TanStack Router (code-based), TanStack Query (server state), TanStack Form
- Tailwind CSS v4, shadcn/ui components
@docyrus/api-client+@docyrus/signin+@docyrus/app-utils- Auto-generated collections from OpenAPI spec
- Preferred UI libraries: shadcn, diceui, animate-ui, docyrus-ui, reui
When to Use This Skill
Use this skill when you are:
- Building or modifying a Docyrus-backed React app
- Setting up authentication with
@docyrus/signin - Bootstrapping tenant-aware runtime utilities with
@docyrus/app-utils - Fetching or mutating data with generated collections or
@docyrus/api-client - Persisting app-level config or user-level config or saved grid views with
AppConfig,UserAppConfig, andDataViews - Building record sharing, role management, or ACL-driven UI flows
- Designing feature UIs such as dashboards, forms, tables, layouts, dialogs, analytics, or detail pages
- Selecting between shadcn, diceui, animate-ui, docyrus-ui, and reui components
- Implementing complete feature flows that combine data access and polished UI
End-to-End Feature Workflow
1. Set up app auth, routing, and query providers. 2. Bootstrap TenantPreferences, date/number utilities, and shared app runtime helpers from @docyrus/app-utils. 3. Use generated Docyrus collection hooks or the REST client for data access. 4. Define columns, filters, formulas, child queries, and mutations correctly. 5. Use AppConfig for per-app persisted settings, UserAppConfig for per-user per-app settings, and DataViews for saved grid views. 6. Check preferred UI components before building anything custom. 7. Use Docyrus form and detail patterns for create, edit, item detail, and editable grid flows. 8. Connect UI actions to TanStack Query mutations and invalidate relevant queries.
Quick Start: App Bootstrap
Root provider setup
import { DocyrusAuthProvider } from '@docyrus/signin'
<DocyrusAuthProvider
apiUrl={import.meta.env.VITE_API_BASE_URL}
clientId={import.meta.env.VITE_OAUTH2_CLIENT_ID}
redirectUri={import.meta.env.VITE_OAUTH2_REDIRECT_URI}
scopes={['offline_access', 'Read.All', 'DS.ReadWrite.All', 'Users.Read']}
callbackPath="/auth/callback"
>
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />
</QueryClientProvider>
</DocyrusAuthProvider>Auth gate and current-user access
const { status, user, hasRole, hasPermission } = useDocyrusAuth()
if (status === 'loading') return <Spinner />
if (status === 'unauthenticated') return <SignInButton />
// user is auto-fetched from /v1/users/me after authentication
// hasRole('super_admin') — check role by slug or uid
// hasPermission('edit', dataSourceId) — check ACL permission on a data sourceTenant-aware app utilities
Use @docyrus/app-utils as the default runtime layer for tenant-level formatting and persisted app/grid preferences.
import {
createAppConfigClient,
createUserAppConfigClient,
createDataViewClient,
createDateUtils,
createNumberUtils,
getTenantPreferences,
} from '@docyrus/app-utils'
function useAppRuntime(appId: string) {
const client = useDocyrusClient()
const { getMyInfo } = useUsersCollection()
return useQuery({
queryKey: ['app-runtime', appId],
enabled: !!client && !!appId,
queryFn: async () => {
const [preferences, me] = await Promise.all([
getTenantPreferences(client!),
getMyInfo(),
])
return {
preferences,
me,
dateUtils: createDateUtils({
preferences,
userTimezone: me.timeZone?.id,
}),
numberUtils: createNumberUtils({ preferences }),
appConfig: createAppConfigClient(client!, appId),
userConfig: createUserAppConfigClient(client!, appId),
dataViews: createDataViewClient(client!, appId),
}
},
})
}Use this runtime to:
- Format dates and datetimes with tenant format strings and the user's timezone.
- Format numbers, currency-like values, and decimals using tenant separators and precision.
- Read and upsert the app's single persisted
AppConfigdocument. - Read and upsert the current user's
UserAppConfigdocument (per-user per-app settings). - Read and persist saved grid views through
DataViews.
Data fetching with generated collections
const { list } = useBaseProjectCollection()
const { data: projects } = useQuery({
queryKey: ['projects'],
queryFn: () =>
list({
columns: ['name', 'status', 'record_owner(firstname,lastname)'],
filters: { rules: [{ field: 'status', operator: '!=', value: 'archived' }] },
orderBy: 'created_on DESC',
limit: 50,
}),
})ACL, roles, and record sharing
Use direct useDocyrusClient() calls for ACL features. These routes may be hidden from generated OpenAPI output, so they are typically not available through generated collection hooks.
const client = useDocyrusClient()
const { data: roles } = useQuery({
queryKey: ['acl', 'roles'],
queryFn: () => client!.get('/v1/users/acl/roles'),
})
const replaceUserRoles = useMutation({
mutationFn: ({ userId, roleIds }: { userId: string; roleIds: string[] }) =>
client!.put(`/v1/users/acl/users/${userId}/roles`, { roleIds }),
})
const createRoleQuery = useMutation({
mutationFn: (payload: Record<string, unknown>) =>
client!.post('/v1/users/acl/role-queries', payload),
})Prefer role uid values returned by the API when sending roleIds for user-role updates or role-query payloads.
Saved data grid views
Use DataGridViewSelect as the default saved-view UI for Docyrus grids, and persist those views with createDataViewClient(client, appId).
DataGridViewSelectis the default component for showing and editing saved grid views.- Pass the TanStack table instance via
tableso the selector/editor can read column definitions. - Pass
fieldswhen you want the built-in filter builder enabled in the editor. - Back
views,onViewCreate,onViewSave,onViewDelete,onViewHide, andonViewUnhidewithDataViewsCRUD. - Use
DataGridViewEditorseparately only when you need a standalone editor outside the selector.
Critical App/Data Rules
1. Always send `columns` in .list() and .get() calls. Without it, only id is returned. 2. Collections are React hooks — call useBaseProjectCollection(), useUsersCollection(), and similar hooks inside React components. 3. Data source endpoints are dynamic — they only exist if the data source is defined in the tenant OpenAPI spec. 4. Use `id` for `count` calculations. Use actual field slugs for sum, avg, min, and max. 5. Child query keys must appear in `columns`. 6. Formula keys must appear in `columns`. 7. Use `useUsersCollection().getMyInfo()` for current user profile instead of making a direct profile call. 8. Initialize `TenantPreferences` once per app runtime and create shared dateUtils / numberUtils instances from @docyrus/app-utils. 9. Formatting functions from `@docyrus/app-utils` are regionalized — do not hardcode locale, date format, decimal separator, thousand separator, or decimal precision when tenant preferences should drive them. 10. Use `createAppConfigClient(client, appId)` for the app's single persisted config document; upsert is the default write path. 11. Use `createUserAppConfigClient(client, appId)` for the current user's persisted config document scoped to an app (e.g. theme, layout preferences, sidebar state); upsert is the default write path. 12. Use `createDataViewClient(client, appId)` for saved grid-view CRUD. 13. Use `DataViews` with `DataGridViewSelect` to show, create, edit, reorder, hide, unhide, soft-delete, and hard-delete saved data grid views. 14. `DataGridViewSelect` needs a TanStack table instance and should receive fields when you want the built-in filter builder/editor experience. 15. Data view creation requires `name` and `tenant_data_source_id`. 16. Use `dataViews.update(viewId, { archived: true })` for soft-delete and dataViews.remove(viewId) only for irreversible hard-delete. 17. Regenerate collections after schema changes by rebuilding the tenant OpenAPI spec, downloading the latest openapi.json, and re-running the collection generator. 18. ACL endpoints are usually raw-client integrations — use useDocyrusClient() or RestApiClient for roles, user-role assignments, role queries, record sharing, and ownership transfer. 19. Prefer role `uid` values for ACL role writes, user-role roleIds, and role-query roleIds. 20. Treat `PUT /v1/users/acl/users/:userId/roles` as full replacement and POST /v1/users/acl/users/:userId/roles as additive. 21. Send role-query `query` as raw JSON and omit tenantAppId when dataSourceId is present; backend derives it. 22. After deleting a role, invalidate dependent app queries for role lists, user-role lists, role-query lists, and any UI that renders primary-role labels.
Critical UI/UX Rules
1. Always check preferred components first before creating anything custom. 2. Use `AwesomeCard` for dashboards unless the user explicitly wants a different card style. 3. Use animate-ui `Sidebar` for app layouts unless another layout is requested. 4. Prefer Recharts for charts. shadcn chart primitives are the default wrapper. 5. Use icons in this order: hugeicons, then fontawesome light, then lucide. 6. Use `AwesomeDialog` for item create forms.
- Small/simple forms:
container="sheet"withside="right" - Long/complex forms:
container="modal"orcontainer="drawer"
7. Choose detail containers based on item complexity.
- Large items: dedicated page
- Small items:
AwesomeDialogright sheet
8. All forms must use TanStack Form + the Docyrus form system. Do not build feature forms with plain HTML forms or React Hook Form directly. 9. Use `EditableRecordDetail` for inline editing in item detail views. 10. Always enable `trackChanges` for editable detail and grid experiences. 11. Use `DataGridViewSelect` for saved grid views and back it with DataViews from @docyrus/app-utils. 12. Prefer `DataGridViewEditor` only when you need a standalone grid-view editor outside the selector component.
Default UI Choices
| Use Case | Default Component | Library |
|---|---|---|
| Item create form | AwesomeDialog | docyrus |
| Quick record create | CreateRecordDialog | docyrus |
| Item detail (small) | AwesomeDialog sheet right | docyrus |
| Item detail (large) | Dedicated page | — |
| Inline editing | EditableRecordDetail | docyrus |
| Dashboard card | AwesomeCard | docyrus |
| Stat dashboards | AwesomeStats | docyrus |
| App navigation | Sidebar | animate-ui |
| Data table | DataTable | diceui |
| Editable grid | Data Grid | docyrus |
| Grid saved views | DataGridViewSelect + DataViews | docyrus + @docyrus/app-utils |
| Forms | Docyrus form fields + TanStack Form | docyrus |
| Charts | shadcn chart + Recharts | shadcn |
| File upload | File Upload | diceui |
| Gantt/project scheduling | Gantt | docyrus |
| Resource scheduling | ResourceSchedulerPanel | docyrus |
| Team chat | TeamChatChannel | docyrus |
| AI interface | DocyrusAgent | docyrus |
| Pricing / quoting | PricingEnginePanel | docyrus |
| Analytics / pivot | PivotGrid | docyrus |
Quick UI Patterns
Item create form
<AwesomeDialog open={open} onOpenChange={setOpen} container="sheet" side="right" size="default">
<AwesomeDialogHeader title="Create Task" icon="far-plus" />
<AwesomeDialogBody>
<form.Field name="title">{(field) => <TextFormField field={field} label="Title" />}</form.Field>
<form.Field name="status">{(field) => <SelectFormField field={field} label="Status" />}</form.Field>
</AwesomeDialogBody>
<AwesomeDialogFooter>
<Button variant="outline" onClick={() => setOpen(false)}>Cancel</Button>
<Button onClick={handleSubmit}>Create</Button>
</AwesomeDialogFooter>
</AwesomeDialog>Item detail with inline editing
<AwesomeDialog open={open} onOpenChange={setOpen} container="sheet" side="right" size="lg" fullscreenable>
<AwesomeDialogHeader
title="Task Detail"
description="Review and edit task fields inline"
headerButtons={<Button variant="outline" size="sm" onClick={switchToFullForm}>Edit All</Button>}
/>
<AwesomeDialogBody>
<EditableRecordDetail fields={fields} record={record} onSave={handleSave} trackChanges>
<EditableRecordDetailField slug="title" />
<EditableRecordDetailField slug="status" />
<EditableRecordDetailField slug="assignee" />
<EditableRecordDetailField slug="due_date" />
</EditableRecordDetail>
</AwesomeDialogBody>
</AwesomeDialog>TanStack Query Pattern
function useProjects(params?: ICollectionListParams) {
const { list } = useBaseProjectCollection()
return useQuery({
queryKey: ['projects', 'list', params],
queryFn: () => list({ columns: PROJECT_COLUMNS, ...params }),
})
}
function useCreateProject() {
const { create } = useBaseProjectCollection()
const qc = useQueryClient()
return useMutation({
mutationFn: (data: Record<string, unknown>) => create(data),
onSuccess: () => {
void qc.invalidateQueries({ queryKey: ['projects'] })
},
})
}Collection CRUD Methods
const { list, get, create, update, delete: deleteOne, deleteMany } = useBaseProjectCollection()
list(params?: ICollectionListParams)
get(id, { columns })
create(data)
update(id, data)
deleteOne(id)
deleteMany({ recordIds })API endpoint pattern: /v1/apps/{appSlug}/data-sources/{slug}/items
Query Capabilities Summary
The .list() method supports:
columnsfiltersfilterKeywordorderBylimitandoffsetfullCountcalculationsformulaschildQueriespivotexpand
Component Installation Pattern
pnpm dlx shadcn@latest add button
pnpm dlx shadcn@latest add @diceui/data-table
pnpm dlx shadcn@latest add @animate-ui/sidebar
pnpm dlx @docyrus/cli add @docyrus/ui-awesome-card
pnpm dlx shadcn@latest add @reui/file-upload-defaultReferences
For deep dives, read:
references/README.md— merged reference map for app development and UI designreferences/api-client-and-auth.mdreferences/collections-and-patterns.md- the docyrus-acl-design skill — ACL roles, permissions, and role-queries (
docyrus acl); plus the ACL REST endpoints in docyrus-api-dev's SKILL.md ../docyrus-api-dev/references/data-source-query-guide.md../docyrus-api-dev/references/formula-design-guide-llm.md../docyrus-api-dev/references/query-guide.mdreferences/preferred-components-catalog.mdreferences/component-selection-guide.mdreferences/icon-usage-guide.md
@docyrus/api-client & @docyrus/signin Reference
Table of Contents
1. RestApiClient 2. Authentication with @docyrus/signin 3. Authorization (Roles & Permissions) 4. API Client Access Pattern 5. Interceptors 6. Error Handling 7. Advanced Features
---
RestApiClient
Type-safe REST API client from @docyrus/api-client.
HTTP Methods
import { RestApiClient } from '@docyrus/api-client'
client.get<T>(endpoint, params?) // GET
client.post<T>(endpoint, data) // POST
client.patch<T>(endpoint, data) // PATCH
client.put(endpoint, data) // PUT
client.delete(endpoint, data?) // DELETETyped Responses
interface User { id: string; name: string; email: string }
const response = await client.get<User[]>('/v1/users')Config Options
interface ApiClientConfig {
baseURL?: string
tokenManager?: TokenManager
headers?: Record<string, string>
timeout?: number
fetch?: typeof fetch
FormData?: typeof FormData
AbortController?: typeof AbortController
storage?: Storage
}---
Authentication with @docyrus/signin
Package: @docyrus/signin (peer dep: @docyrus/api-client >= 0.0.10, react >= 18)
DocyrusAuthProvider Setup
Wrap application root:
import { DocyrusAuthProvider } from '@docyrus/signin'
<DocyrusAuthProvider
apiUrl={import.meta.env.VITE_API_BASE_URL}
clientId={import.meta.env.VITE_OAUTH2_CLIENT_ID}
redirectUri={import.meta.env.VITE_OAUTH2_REDIRECT_URI}
scopes={['offline_access', 'Read.All', 'DS.ReadWrite.All', 'Users.Read']}
callbackPath="/auth/callback"
>
<App />
</DocyrusAuthProvider>Provider Props
| Prop | Type | Default | Description |
|---|---|---|---|
apiUrl | string | https://alpha-api.docyrus.com | API base URL |
clientId | string | Built-in default | OAuth2 client ID |
redirectUri | string | origin + callbackPath | OAuth2 redirect URI |
scopes | string[] | ['offline_access', 'Read.All', ...] | OAuth2 scopes |
callbackPath | string | /auth/callback | OAuth callback route |
forceMode | `'standalone' \ | 'iframe'` | Auto-detected |
storageKeyPrefix | string | docyrus_oauth2_ | localStorage prefix |
allowedHostOrigins | string[] | undefined | Extra trusted iframe origins |
Auth Modes
- Standalone: OAuth2 Authorization Code + PKCE via page redirect. Tokens stored in localStorage, auto-refreshed.
- Iframe: Receives tokens via
window.postMessagefrom*.docyrus.apphosts. Requests refresh from host when expired.
useDocyrusAuth() Hook
const {
status, // 'loading' | 'authenticated' | 'unauthenticated'
mode, // 'standalone' | 'iframe'
client, // RestApiClient | null
tokens, // { accessToken, refreshToken, ... } | null
user, // DocyrusUser | null — auto-fetched from /v1/users/me
signIn, // () => void — redirects to Docyrus login
signOut, // () => void — logout and clear tokens
hasRole, // (role: string | string[]) => boolean — check role by slug or uid
hasPermission, // (operation: string, dataSourceId?: string) => boolean — check ACL permission
refreshUser, // () => Promise<void> — re-fetch user from API
error, // Error | null
} = useDocyrusAuth()useDocyrusClient() Hook
const client = useDocyrusClient() // RestApiClient | nullSignInButton Component
// Basic
<SignInButton />
// Styled
<SignInButton className="btn" label="Log in with Docyrus" />
// Render prop
<SignInButton>
{({ signIn, isLoading }) => (
<button onClick={signIn} disabled={isLoading}>
{isLoading ? 'Redirecting...' : 'Sign in'}
</button>
)}
</SignInButton>Environment Variables (.env)
VITE_API_BASE_URL=https://localhost:3366
VITE_OAUTH2_CLIENT_ID=your-client-id
VITE_OAUTH2_REDIRECT_URI=http://localhost:3000/auth/callback
VITE_OAUTH2_SCOPES=openid profile offline_access Users.Read DS.ReadWrite.All---
Authorization (Roles & Permissions)
The provider auto-fetches the current user from /v1/users/me after authentication. The user, hasRole, and hasPermission are available on the useDocyrusAuth() hook.
Role-Based UI Gating
function Dashboard({ dataSourceId }: { dataSourceId: string }) {
const { user, hasRole, hasPermission } = useDocyrusAuth()
if (!user) return <Spinner />
const canEdit = hasPermission('edit', dataSourceId)
const canDelete = hasPermission('delete', dataSourceId)
const isAdmin = hasRole('super_admin')
return (
<div>
{canEdit && <Button>Edit</Button>}
{canDelete && <Button variant="destructive">Delete</Button>}
{isAdmin && <AdminPanel />}
</div>
)
}Permission Resolution Order
1. super_admin role → always granted 2. global_editor role → granted for: view, create, edit, delete, create_bulk, export, import, print 3. global_viewer role → granted only for: view 4. Always-permitted system data sources (reports, todos, notes, etc.) 5. User's aclRules array (merged from all roles by the server)
Pure Functions (No React)
import { hasRole, hasPermission } from '@docyrus/signin/core'
import type { DocyrusUser } from '@docyrus/signin/core'
hasRole(user, 'super_admin')
hasPermission(user, 'edit', 'some-ds-id')---
API Client Access Pattern
Generated collections are React hooks that use useDocyrusClient() internally to get the authenticated RestApiClient from DocyrusAuthProvider. No manual client syncing is needed.
// Collections get the client automatically via useDocyrusClient()
function useBaseProjectCollection() {
const client = useDocyrusClient()
return {
list: (params?) => client!.get('/v1/apps/base/data-sources/project/items', params),
// ... other CRUD methods
}
}
// In your component — just call the collection hook
function ProjectList() {
const { list } = useBaseProjectCollection()
const { data } = useQuery({
queryKey: ['projects'],
queryFn: () => list({ columns: ['name', 'status'] }),
})
}For direct API access outside collections, use the useDocyrusClient() hook:
const client = useDocyrusClient()
const data = await client!.get<MyType>('/v1/custom-endpoint')---
Interceptors
Add request/response interceptors via client.use():
client.use({
request: (config) => {
// Transform columns array to comma-separated string
if (config.params?.columns && Array.isArray(config.params.columns)) {
config.params.columns = config.params.columns.join(',')
}
return config
},
response: (response) => {
// Unwrap nested .data property
if (response.data?.data && !Array.isArray(response.data)) {
response.data = response.data.data
}
return response
},
error: (error, request, response) => {
if (error.status === 401) { /* handle auth error */ }
return { error, request, response }
},
})---
Error Handling
import {
ApiError, NetworkError, TimeoutError,
AuthenticationError, AuthorizationError,
NotFoundError, RateLimitError, ValidationError,
OAuth2Error, InvalidGrantError,
} from '@docyrus/api-client'
try {
await client.get('/resource')
} catch (error) {
if (error instanceof AuthenticationError) { /* 401 */ }
else if (error instanceof AuthorizationError) { /* 403 */ }
else if (error instanceof NotFoundError) { /* 404 */ }
else if (error instanceof RateLimitError) { /* 429 - error.retryAfter */ }
else if (error instanceof NetworkError) { /* network issue */ }
else if (error instanceof TimeoutError) { /* timeout */ }
}---
Advanced Features
SSE (Server-Sent Events)
const eventSource = client.sse('/events', {
onMessage(data) { console.log(data) },
onError(error) { console.error(error) },
onComplete() { console.log('done') },
})
eventSource.close()File Upload
const formData = new FormData()
formData.append('file', fileInput.files[0])
await client.post('/upload', formData)File Download
const response = await client.get('/download/file.pdf', { responseType: 'blob' })
const url = URL.createObjectURL(response.data)HTML to PDF
await client.html2pdf({
html: '<html><body>Content</body></html>',
options: { format: 'A4', margin: { top: 10, bottom: 10 } },
})Retry Logic
import { withRetry } from '@docyrus/api-client'
const response = await withRetry(() => client.get('/endpoint'), {
retries: 3, retryDelay: 1000,
retryCondition: (error) => error.status >= 500,
})Collections & App Patterns Reference
Table of Contents
1. Collection Architecture 2. Generated Collection Structure 3. Collection Types 4. useUsersCollection 5. TanStack Query Hooks Pattern 6. Query Key Factory Pattern 7. Mutation Pattern 8. App Bootstrap Flow 9. Routing Setup 10. API Endpoints
---
Collection Architecture
Collections are auto-generated from openapi.json using @docyrus/tanstack-db-generator. They provide type-safe CRUD operations for each data source.
Generate command: pnpm generate-orm (runs @docyrus/tanstack-db-generator openapi.json)
Key files:
src/collections/<app>-<entity>.collection.ts— generated React hooks with CRUD methods + entity typessrc/collections/types.ts— shared query types (filters, calculations, formulas, etc.)src/collections/users.collection.ts— special system users collection hook
---
Generated Collection Structure
Each collection exports an entity interface and a React hook that returns CRUD methods:
// Generated collection for base/project
import { useDocyrusClient } from '@docyrus/signin'
import type { ICollectionListParams } from './types'
export interface BaseProjectEntity {
id?: string
record_owner?: string
created_on?: string
created_by?: string
last_modified_on?: string
last_modified_by?: string
name: string
description?: Record<string, any>
status?: { id: string; name: string } | any
organization?: { id: string; name: string } | string
}
export function useBaseProjectCollection() {
const client = useDocyrusClient()
return {
list: (params?: ICollectionListParams): Promise<Array<BaseProjectEntity>> =>
client!.get('/v1/apps/base/data-sources/project/items', params as any),
get: (recordId: string, params?: { columns?: Array<string> }): Promise<BaseProjectEntity> =>
client!.get(`/v1/apps/base/data-sources/project/items/${recordId}`, params),
create: (data: Record<string, any>): Promise<BaseProjectEntity> =>
client!.post('/v1/apps/base/data-sources/project/items', data),
update: (recordId: string, data: Record<string, any>): Promise<BaseProjectEntity> =>
client!.patch(`/v1/apps/base/data-sources/project/items/${recordId}`, data),
delete: (recordId: string): Promise<void> =>
client!.delete(`/v1/apps/base/data-sources/project/items/${recordId}`),
deleteMany: (data: { recordIds: Array<string> }): Promise<void> =>
client!.delete('/v1/apps/base/data-sources/project/items', data),
}
}Collections are hooks because they use useDocyrusClient() internally, which provides the authenticated RestApiClient from DocyrusAuthProvider. This means collections must be called inside React components.
Default Fields (always present)
Every data source entity includes: id, record_owner, created_on, created_by, last_modified_on, last_modified_by, name
---
Collection Types
Shared query parameter types in src/collections/types.ts:
ICollectionListParams— full query payload with columns, filters, calculations, formulas, childQueries, pivot, orderBy, limit, offset, fullCount, expandICollectionFilterRule— single filter ruleICollectionFilterGroup— nested filter groupICollectionCalculation— aggregation ruleICollectionFormula— simple formulaICollectionBlockFormula— block/subquery formulaICollectionChildQuery— child query definitionICollectionPivot/ICollectionPivotMatrix— pivot configurationICollectionOrderBy— sort specification
---
useUsersCollection
System users collection hook with special methods:
export function useUsersCollection() {
const client = useDocyrusClient()
return {
getUsers: (): Promise<Array<UserEntity>> =>
client!.get('/v1/users'),
getMyInfo: (): Promise<UserEntity> =>
client!.get('/v1/users/me'),
createUser: (data: UserCreateParams): Promise<UserEntity> =>
client!.post('/v1/users', data),
updateMe: (data: UserUpdateParams): Promise<UserEntity> =>
client!.patch('/v1/users/me', data),
updateUser: (userId: string, data: UserUpdateParams): Promise<UserEntity> =>
client!.patch(`/v1/users/${userId}`, data),
changeUserStatus: (userId: string, status: number) =>
client!.put(`/v1/users/${userId}/status/${status}`),
saveUserDevice: (data: UserDeviceDto) =>
client!.post('/v1/users/device', data),
getMyTenants: () =>
client!.get('/v1/users/me/tenants'),
}
}Use useUsersCollection().getMyInfo() for current user profile.
---
TanStack Query Hooks Pattern
Wrap collection hook methods in TanStack Query hooks. Since collections are themselves hooks, call them inside the component/hook, then pass the returned methods to TanStack Query:
import { useQuery } from '@tanstack/react-query'
import { useBaseProjectCollection } from '@/collections/base-project.collection'
import { queryKeys } from '@/lib/query-keys'
const PROJECT_COLUMNS = ['name', 'status', 'description', 'record_owner(id,firstname,lastname)']
export function useProjects(params?: ICollectionListParams) {
const { list } = useBaseProjectCollection()
return useQuery({
queryKey: queryKeys.projects.list(params ?? {}),
queryFn: () =>
list({
columns: PROJECT_COLUMNS, // ALWAYS specify columns
...params,
}),
})
}
export function useProject(projectId: string) {
const { get } = useBaseProjectCollection()
return useQuery({
queryKey: queryKeys.projects.detail(projectId),
queryFn: () =>
get(projectId, {
columns: PROJECT_COLUMNS,
}),
enabled: !!projectId,
})
}---
Query Key Factory Pattern
export const queryKeys = {
projects: {
all: ['projects'] as const,
lists: () => [...queryKeys.projects.all, 'list'] as const,
list: (params: object) => [...queryKeys.projects.lists(), params] as const,
detail: (id: string) => [...queryKeys.projects.all, 'detail', id] as const,
},
tasks: {
all: ['tasks'] as const,
lists: () => [...queryKeys.tasks.all, 'list'] as const,
list: (params: object) => [...queryKeys.tasks.lists(), params] as const,
detail: (id: string) => [...queryKeys.tasks.all, 'detail', id] as const,
},
}---
Mutation Pattern
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { useBaseProjectCollection } from '@/collections/base-project.collection'
export function useCreateProject() {
const { create } = useBaseProjectCollection()
const queryClient = useQueryClient()
return useMutation({
mutationFn: (data: Record<string, unknown>) => create(data),
onSuccess: () => {
void queryClient.invalidateQueries({
queryKey: queryKeys.projects.all,
})
},
})
}
export function useUpdateProject() {
const { update } = useBaseProjectCollection()
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({ id, data }: { id: string; data: Record<string, unknown> }) =>
update(id, data),
onSuccess: (_data, { id }) => {
void queryClient.invalidateQueries({ queryKey: queryKeys.projects.detail(id) })
void queryClient.invalidateQueries({ queryKey: queryKeys.projects.lists() })
},
})
}
export function useDeleteProject() {
const { delete: deleteProject } = useBaseProjectCollection()
const queryClient = useQueryClient()
return useMutation({
mutationFn: (id: string) => deleteProject(id),
onSuccess: () => {
void queryClient.invalidateQueries({ queryKey: queryKeys.projects.all })
},
})
}---
App Bootstrap Flow
1. main.tsx: Mount DocyrusAuthProvider → QueryClientProvider → RouterProvider 2. App.tsx: Check useDocyrusAuth() status — user is auto-fetched from /v1/users/me 3. Use hasRole() / hasPermission() from useDocyrusAuth() for authorization checks 4. Use collection hooks (e.g., useUsersCollection()) for data access — they get the authenticated client via useDocyrusClient() internally 5. Render protected routes
// App.tsx
function App() {
const { status, user, hasRole, hasPermission } = useDocyrusAuth()
if (status === 'loading') return <LoadingSpinner />
if (status === 'unauthenticated') return <LoginPage />
// user auto-fetched, hasRole/hasPermission ready
return <AppLayout />
}---
Routing Setup
TanStack Router with code-based routes:
import { createRouter, createRoute, createRootRoute } from '@tanstack/react-router'
const rootRoute = createRootRoute({ component: () => <Outlet /> })
const layoutRoute = createRoute({
getParentRoute: () => rootRoute,
id: 'layout',
component: AppLayout,
})
const indexRoute = createRoute({
getParentRoute: () => layoutRoute,
path: '/',
component: DashboardPage,
})
const projectsRoute = createRoute({
getParentRoute: () => layoutRoute,
path: '/projects',
component: ProjectsPage,
})
const projectDetailRoute = createRoute({
getParentRoute: () => layoutRoute,
path: '/projects/$projectId',
component: ProjectDetailPage,
})
// Auth routes (public)
const authCallbackRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/auth/callback',
component: () => <div>Processing login...</div>,
})
const routeTree = rootRoute.addChildren([
layoutRoute.addChildren([indexRoute, projectsRoute, projectDetailRoute]),
authCallbackRoute,
])
const router = createRouter({
routeTree,
defaultPreload: 'intent',
scrollRestoration: true,
})---
API Endpoints
Data Source Items (Dynamic)
GET /v1/apps/{appSlug}/data-sources/{slug}/items — List (with query payload)
GET /v1/apps/{appSlug}/data-sources/{slug}/items/{id} — Get one
POST /v1/apps/{appSlug}/data-sources/{slug}/items — Create
PATCH /v1/apps/{appSlug}/data-sources/{slug}/items/{id} — Update
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items/{id} — Delete one
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items — Delete manyEndpoints are dynamic — they exist only if a data source is defined in the tenant. The openapi.json spec enumerates all available data sources.
System Endpoints (Always Available)
GET /v1/users — List users
POST /v1/users — Create user
GET /v1/users/me — Current user profile
PATCH /v1/users/me — Update current user
PATCH /v1/users/{userId} — Update user
PUT /v1/users/{userId}/status/{s} — Change user status
POST /v1/users/device — Save push notification deviceOther Standard Endpoints
GET /v1/api/openapi.json — Generate OpenAPI spec
HEAD /v1/oauth2 — Check rate limits
PUT reports/runCustomQuery/{id} — Run custom query/reportComponent Selection Guide
Decision trees and best practices for choosing the right component for each use case.
Table of Contents
1. UX Design Patterns 2. Selection Process 3. Common Use Case Decision Trees 4. Library-Specific Strengths 5. Default Choices 6. When to Use Each Library
---
UX Design Patterns
These patterns are mandatory and must be followed in all Docyrus applications.
Pattern 1: Item Create Forms → AwesomeDialog
All item creation and editing forms use the AwesomeDialog system. Choose the container type based on form complexity:
Form complexity → Container choice:
Small/simple form (3-6 fields) → container="sheet" side="right"
Long/complex form (7+ fields) → container="modal" size="lg"
Mobile-first form → container="drawer" side="bottom"AwesomeDialog props reference:
container:'modal'|'sheet'|'drawer'— determines the dialog presentationside:'left'|'right'|'top'|'bottom'— positioning for sheet/drawersize:'sm'|'default'|'lg'|'xl'|'full'— size presetpattern: boolean — show decorative pattern background (default: true)patternStyle:'stripes'|'dots'|'grid'|'crosshatch'|'zigzag'fullscreenable: boolean — allow fullscreen toggleminimizable: boolean — allow minimize (requires GlobalDialogProvider)resizable: boolean — allow resize handlesdialogId: string — unique ID for global dialog tracking
Sub-components: AwesomeDialogHeader, AwesomeDialogBody, AwesomeDialogFooter, AwesomeDialogToolbar
Example — Small create form (task):
<AwesomeDialog open={open} onOpenChange={setOpen} container="sheet" side="right">
<AwesomeDialogHeader title="Create Task" icon="far-plus" />
<AwesomeDialogBody>{/* TanStack Form fields */}</AwesomeDialogBody>
<AwesomeDialogFooter>
<Button variant="outline" onClick={() => setOpen(false)}>Cancel</Button>
<Button onClick={handleSubmit}>Create</Button>
</AwesomeDialogFooter>
</AwesomeDialog>Example — Large create form (project):
<AwesomeDialog open={open} onOpenChange={setOpen} container="modal" size="lg" fullscreenable>
<AwesomeDialogHeader title="Create Project" icon="far-folder-plus" />
<AwesomeDialogBody>{/* Many form fields — body scrolls */}</AwesomeDialogBody>
<AwesomeDialogFooter>
<Button variant="outline" onClick={() => setOpen(false)}>Cancel</Button>
<Button onClick={handleSubmit}>Create Project</Button>
</AwesomeDialogFooter>
</AwesomeDialog>Pattern 2: Item Detail Pages → New Page vs AwesomeDialog
Choose the right container based on item complexity:
Item complexity → Detail view choice:
Large items (projects, workspaces, reports) → Dedicated new page (full route)
Small items (tasks, contacts, comments) → AwesomeDialog with container="sheet" side="right"Decision tree:
Does the item have:
- Multiple tabs/sections?
- Sub-items or child lists?
- Complex layout with sidebar?
→ YES: Create a dedicated page route
- Simple field list?
- Quick view/edit pattern?
- Opened from a list or table?
→ YES: Use AwesomeDialog right drawerExample — Task detail in AwesomeDialog:
<AwesomeDialog open={open} onOpenChange={setOpen} container="sheet" side="right" size="lg" fullscreenable>
<AwesomeDialogHeader
title={task.title}
description={`${task.status} · ${task.assignee}`}
headerButtons={
<Button variant="outline" size="sm" onClick={switchToFullForm}>Edit All</Button>
}
/>
<AwesomeDialogBody>
<EditableRecordDetail fields={fields} record={record} onSave={handleSave}>
<EditableRecordDetailField slug="title" />
<EditableRecordDetailField slug="status" />
<EditableRecordDetailField slug="assignee" />
<EditableRecordDetailField slug="due_date" />
</EditableRecordDetail>
</AwesomeDialogBody>
</AwesomeDialog>Pattern 3: Form System → TanStack Form + Docyrus Form Fields
All forms must use TanStack Form with the Docyrus form field system. Never use plain HTML forms or React Hook Form directly.
Key components:
DynamicFormField— Auto-dispatches to the correct field type based onIField.type- 47+ field types: text, number, email, url, phone, date, dateTime, time, select, multiSelect, status, relation, file, image, code, docEditor, and more
- Each field type has a dedicated
*FormFieldcomponent (e.g.,TextFormField,SelectFormField,DateFormField)
Form field pattern:
import { useForm } from '@tanstack/react-form'
import { TextFormField, SelectFormField, DateFormField } from '@docyrus/ui/components/form-fields'
const form = useForm({ defaultValues: { title: '', status: '', dueDate: '' } })
<form.Field name="title">
{(field) => <TextFormField field={field} label="Title" />}
</form.Field>
<form.Field name="status">
{(field) => <SelectFormField field={field} label="Status" options={statusOptions} />}
</form.Field>Pattern 4: Inline Editing → EditableRecordDetail
Use EditableRecordDetail for detail views where users can edit individual fields inline without opening a full form page. Always enable `trackChanges` to highlight changed fields and show a floating ActionBar. Always include an "Edit All" button in the header to switch to a full form editing experience.
Key components:
EditableRecordDetail— Provider/wrapper that manages field state, change tracking, and save/cancelEditableRecordDetailField— Individual field that reads config from context, renders label + inline-editable valueEditableValue— Lower-level single-field inline editor (used internally by EditableRecordDetailField)useEditableRecordDetail()— Hook to access form, values, changes, and save/cancel from within the provider
How it works (with `trackChanges` enabled): 1. Fields render as read-only DynamicValue display 2. Click a field → switches to DynamicFormField editor inline 3. Changed fields get highlighted with amber background 4. Floating ActionBar appears showing "N fields changed" with Save/Cancel buttons 5. Save commits only changed fields; Cancel reverts all changes
Important: Always pass trackChanges prop when using EditableRecordDetail or DataGrid with cell editing. Without it, users have no visual feedback about which fields they've modified and no centralized Save/Cancel flow.
Field change tracking types:
interface RecordDetailField {
field: IField // Field configuration (name, slug, type)
enumOptions?: EnumOption[] // Options for select-based fields
readOnly?: boolean // Per-field read-only override
appSlug?: string // For dynamic enum loading
dataSourceSlug?: string // For dynamic enum loading
}
interface FieldChange {
fieldSlug: string
fieldName: string
originalValue: unknown
newValue: unknown
}Example — Detail view with inline editing and "Edit All" button:
<AwesomeDialogHeader
title="Task Detail"
headerButtons={<Button variant="outline" size="sm" onClick={switchToFullForm}>Edit All</Button>}
/>
<AwesomeDialogBody>
<EditableRecordDetail fields={fields} record={record} onSave={handleSave} onCancel={handleCancel} trackChanges>
<div className="space-y-3">
<h4 className="border-b pb-1.5 text-xs font-semibold uppercase tracking-wider text-muted-foreground">
General Info
</h4>
<EditableRecordDetailField slug="title" />
<EditableRecordDetailField slug="status" />
<EditableRecordDetailField slug="priority" />
<EditableRecordDetailField slug="assignee" />
<EditableRecordDetailField slug="due_date" />
</div>
</EditableRecordDetail>
</AwesomeDialogBody>---
Selection Process
Follow this process when selecting a component:
1. Check if there's a default preference for the use case
↓
2. If no default, search for matching components by:
- Name match (exact or similar)
- Functionality match
- Category match (form, data, navigation, etc.)
↓
3. If multiple matches found, apply library priority:
- docyrus (if Docyrus-specific data handling needed)
- shadcn (for basic/common components)
- diceui (for advanced/specialized features)
- animate-ui (when animation/transitions are important)
- reui (for specific utility needs)
↓
4. Verify the component meets requirements by checking docs
↓
5. Install and implement---
Common Use Case Decision Trees
Dashboard & Data Visualization
| Need | Component | Library | Rationale |
|---|---|---|---|
| Stat/metric card | AwesomeCard | docyrus | Default choice - hatched header design, perfect for metrics |
| Stat dashboard (multi-card) | AwesomeStats | docyrus | Grid/flex/tabs layouts, mini-charts, comparisons, drag-reorder |
| Alternative card | Card | shadcn | Basic card for custom designs |
| Stat display | Stat | diceui | Dedicated stat display with formatting |
| Pivot table / analytics | PivotGrid | docyrus | 3-level hierarchies, subtotals, drilldown, export (CSV/Excel/PDF) |
| Chart/graph | Chart + Recharts | shadcn | Built-in Recharts integration |
| Gauge/dial | Gauge | diceui | Circular progress indicator |
| Progress bar | Progress | shadcn | Linear progress indicator |
| Circular progress | Circular Progress | diceui | Ring-style progress |
Navigation & Layout
| Need | Component | Library | Rationale |
|---|---|---|---|
| Dynamic forms (default) | Form Fields + TanStack Form | docyrus | 47 field types with auto-dispatch — always use this |
| Inline record editing | EditableRecordDetail | docyrus | Click-to-edit fields with change tracking + ActionBar |
| Single field inline edit | EditableValue | docyrus | Lower-level click-to-edit for individual values |
| Text input | Input | shadcn | Basic text input (use via TextFormField in forms) |
| Text area | Textarea | shadcn | Multi-line text (use via TextareaFormField in forms) |
| Select dropdown | Select | shadcn | Basic select (use via SelectFormField in forms) |
| Combobox/autocomplete | Combobox | diceui | Search + select |
| Date picker | Date Time Picker | docyrus | Date + time combined |
| Date range picker | Date Time Range Picker | docyrus | Start/end date+time pair with size variants |
| Date only | Calendar | shadcn | Date selection only |
| Time only | Time Picker | diceui | Time selection only |
| Phone number | Phone Input | diceui | International formatting |
| Color selection | Color Picker | diceui | Full spectrum + palette |
| File upload | File Upload | diceui | Drag-drop, preview, progress |
| Tags input | Tags Input | diceui | Multiple tag entry |
| Rating | Rating | diceui | Star/heart rating |
| Checkbox group | Checkbox Group | diceui | Multiple selections |
| Radio group (animated) | Radio Group | animate-ui | Single selection with animation |
| Radio group (card/grid) | Radio Group | docyrus | Card variant with icons, descriptions, grid columns |
| Switch | Switch | animate-ui | Toggle with animation |
| Slider | Slider | shadcn | Range selection |
| OTP input | Input OTP | shadcn | One-time password codes |
Data Display & Tables
| Need | Component | Library | Rationale |
|---|---|---|---|
| Editable grid | Data Grid | docyrus | Virtualized, keyboard nav, cell editing — enable trackChanges for edit tracking |
| Grid saved views | Data Grid View Select | docyrus | Saved view management with sort/filter/columns — persist with DataViews from @docyrus/app-utils |
| Read-only table | Table | shadcn | Simple, responsive tables |
| Advanced data table | Data Table | diceui | Filtering, sorting, pagination built-in |
| Table filters | Data Table Filter | docyrus | Multi-column filter bar |
| Value display | Value Renderers | docyrus | 44 renderer types for read-only display |
| Empty state | Empty | shadcn | No data placeholder |
When using Data Grid View Select, back its views, onViewCreate, onViewSave, onViewDelete, onViewHide, and onViewUnhide flows with createDataViewClient(client, appId) from @docyrus/app-utils. Always pass the TanStack table instance, and pass fields when you want the editor's built-in filter builder enabled.
Forms & Inputs
Always use TanStack Form + Docyrus form fields. The DynamicFormField component auto-dispatches to the correct field type.
| Need | Component | Library | Rationale |
|---|---|---|---|
| Dynamic forms (default) | Form Fields + TanStack Form | docyrus | 47 field types with auto-dispatch — always use this |
| Inline record editing | EditableRecordDetail | docyrus | Click-to-edit fields with change tracking + ActionBar |
| Single field inline edit | EditableValue | docyrus | Lower-level click-to-edit for individual values |
| Text input | Input | shadcn | Basic text input (use via TextFormField in forms) |
| Text area | Textarea | shadcn | Multi-line text (use via TextareaFormField in forms) |
| Select dropdown | Select | shadcn | Basic select (use via SelectFormField in forms) |
| Combobox/autocomplete | Combobox | diceui | Search + select |
| Date picker | Date Time Picker | docyrus | Date + time combined |
| Date range picker | Date Time Range Picker | docyrus | Start/end date+time pair with size variants |
| Date only | Calendar | shadcn | Date selection only |
| Time only | Time Picker | diceui | Time selection only |
| Phone number | Phone Input | diceui | International formatting |
| Color selection | Color Picker | diceui | Full spectrum + palette |
| File upload | File Upload | diceui | Drag-drop, preview, progress |
| Tags input | Tags Input | diceui | Multiple tag entry |
| Rating | Rating | diceui | Star/heart rating |
| Checkbox group | Checkbox Group | diceui | Multiple selections |
| Radio group (animated) | Radio Group | animate-ui | Single selection with animation |
| Radio group (card/grid) | Radio Group | docyrus | Card variant with icons, descriptions, grid columns |
| Switch | Switch | animate-ui | Toggle with animation |
| Slider | Slider | shadcn | Range selection |
| OTP input | Input OTP | shadcn | One-time password codes |
Dialogs & Overlays
| Need | Component | Library | Rationale |
|---|---|---|---|
| Item create form (small) | AwesomeDialog (sheet) | docyrus | Default — sheet right for quick forms |
| Item create form (large) | AwesomeDialog (modal) | docyrus | Default — modal for complex forms |
| Item detail (small item) | AwesomeDialog (sheet right) | docyrus | Default — right drawer for task/contact detail |
| Minimizable/global dialogs | AwesomeDialog + GlobalDialogProvider | docyrus | Taskbar-style dialog management |
| Responsive dialog | Responsive Dialog | diceui | Auto-switches to drawer on mobile |
| Alert/confirmation dialog | Alert Dialog | animate-ui | Confirmation prompts |
| Basic dialog | Dialog | animate-ui | Animated modal (non-form use cases) |
| Drawer | Drawer | shadcn | Simple side/bottom panel |
| Sheet | Sheet | animate-ui | Complementary content |
| Popover | Popover | animate-ui | Floating content |
| Tooltip | Tooltip | animate-ui | Hover hints |
| Hover card | Hover Card | animate-ui | Rich preview on hover |
Specialized Components
| Need | Component | Library | Rationale |
|---|---|---|---|
| Kanban board | Kanban | docyrus | Drag-drop columns with dnd-kit, keyboard nav |
| Gantt chart | Gantt | docyrus | Project timeline scheduling |
| Resource scheduling | Resource Scheduler Panel | docyrus | Horizontal timeline with drag-drop events |
| Appointment booking | Time Slot Scheduler | docyrus | Columns/month views, capacity, timezone |
| Timeline | Timeline | diceui | Event/step display |
| Stepper / wizard | Stepper | docyrus | 6 variants, horizontal/vertical, animated connectors |
| Tour/onboarding | Tour | diceui | Interactive tutorials |
| Query builder | Query Builder | docyrus | Docyrus query construction |
| Notifications | NotificationStack | docyrus | Stacked notification cards |
| Notification panel | NotificationsPanel | docyrus | Full notification management |
| Search input | SearchInput | docyrus | Dedicated search with clear |
| Location input | PlaceAutocomplete | docyrus | Address search + selection |
| Map display | Map | docyrus | Geographic data (Leaflet) |
| Tree hierarchy | TreeView | docyrus | Nested data display |
| Image editing | ImageEditor | docyrus | Crop, adjust, transform |
| Media player | Media Player | diceui | Video/audio playback |
| QR code | QR Code | diceui | QR generation |
| Cropper / Image cropping | ImageEditor | docyrus | Crop, adjust, transform |
| Mentions | Mention | diceui | @mention functionality |
| Command palette | Command | shadcn | Keyboard shortcuts |
| Confirmation action | ConfirmationButton | docyrus | Button with confirm dialog |
| Activity logging (CRM) | Log Activity Form | docyrus | Calls, emails, meetings, tasks, status updates with Plate editor |
| Dynamic repeating rows | Schema Repeater | docyrus | Structured data list with customizable input types per column |
| Rich item selector | Mega Select | docyrus | Grid picker with categories, search, detail panel |
| Quick record create | Create Record Dialog | docyrus | Popover dialog with subject, mentions, selectors |
| Email composing | Email Composer | docyrus | To/Cc/Bcc, formatting toolbar, attachments |
| Markdown editing | Simple Markdown Editor | docyrus | Lightweight MD editor with toolbar/stats |
| Team chat | Team Chat Channel | docyrus | Posts, threads, reactions, mentions, attachments |
| Contact activities | Contact Activity Panel | docyrus | Activity timeline with calls, emails, tasks, chat |
| AI agent chat | Docyrus Agent | docyrus | Chat/action-panel/trigger modes for AI agents |
| Pricing/quoting | Pricing Engine Panel | docyrus | Line items, VAT, discounts, currency, totals |
| Record sharing | Record Sharing | docyrus | Permission-based sharing with users/teams/roles |
---
Library-Specific Strengths
shadcn (43 components)
Best for: Core UI primitives, forms, basic layout
Strengths:
- Well-tested, accessible components
- Great documentation
- Broad browser support
- Foundation for other libraries
Use when: You need a standard, reliable component without special features
diceui (42 components)
Best for: Advanced interactions, specialized data components
Strengths:
- Rich feature sets (filtering, sorting, virtualization)
- Advanced input types (phone, color, mask)
- Drag-drop capabilities
- Data visualization components
Use when: You need advanced functionality beyond basic components
animate-ui (21 components)
Best for: Animated transitions, polished UX
Strengths:
- Smooth, professional animations
- Enhanced visual feedback
- Composable animated patterns
Use when: Animation/transitions are important to the UX
docyrus (51 components)
Best for: Docyrus-specific data handling, forms, dialogs, inline editing, scheduling, chat, AI agents, and business logic
Strengths:
- Deep Docyrus platform integration
- AwesomeDialog system for item creation and detail views
- EditableRecordDetail for inline field editing with change tracking
- 47 form field types with TanStack Form integration
- 44 value renderer types
- Data source query builders
- Scheduling: Gantt, Resource Scheduler, Time Slot Scheduler, Calendar
- Communication: Team Chat Channel, Email Composer, Comments Panel
- AI integration: Docyrus Agent (chat, action panel, trigger modes)
- Business: Pricing Engine, Record Sharing, Contact Activity
- Selection: Mega Select, Create Record Dialog
- Kanban board, notifications, maps, markdown editor, and more
Use when: Working with Docyrus data sources, building item create/detail flows, forms, scheduling, chat, AI features, or queries
reui (2 components)
Best for: Specific utility needs
Strengths:
- Focused implementations
- Lightweight alternatives
Use when: The specific component matches your exact need
---
Default Choices
These are the recommended defaults unless the user specifies otherwise:
| Use Case | Default Component | Library |
|---|---|---|
| Item create form | AwesomeDialog (sheet/modal) | docyrus |
| Quick record create | Create Record Dialog | docyrus |
| Item detail (small) | AwesomeDialog (sheet right) | docyrus |
| Inline record editing | EditableRecordDetail | docyrus |
| Dashboard card | AwesomeCard | docyrus |
| App navigation | Sidebar | animate-ui |
| Charts | Chart + Recharts | shadcn |
| Data table | Data Table | diceui |
| Data grid saved views | Data Grid View Select + DataViews | docyrus + @docyrus/app-utils |
| Forms | Form Fields + TanStack Form | docyrus |
| File upload | File Upload | diceui |
| Confirmation dialogs | Alert Dialog | animate-ui |
| Gantt / project scheduling | Gantt | docyrus |
| Resource scheduling | Resource Scheduler Panel | docyrus |
| Appointment booking | Time Slot Scheduler | docyrus |
| Team chat | Team Chat Channel | docyrus |
| Email composing | Email Composer | docyrus |
| AI agent interface | Docyrus Agent | docyrus |
| Kanban board | Kanban | docyrus |
| Notifications | NotificationStack | docyrus |
| Pricing / quoting | Pricing Engine Panel | docyrus |
| Record sharing | Record Sharing | docyrus |
| Stat dashboards | AwesomeStats | docyrus |
| Pivot table / analytics | PivotGrid | docyrus |
| Activity logging (CRM) | Log Activity Form | docyrus |
| Multi-step wizard | Stepper | docyrus |
---
When to Use Each Library
Use shadcn when:
- Building basic forms with standard inputs
- Creating simple layouts with cards, buttons, badges
- Need reliable, accessible primitives
- No special animation or advanced features required
Use diceui when:
- Building complex data tables with sorting/filtering
- Need advanced input types (phone, color, tags)
- Implementing drag-drop (kanban, sortable lists)
- Creating rich data visualizations (gauges, timelines)
Use animate-ui when:
- Animation/transitions are important to the design
- Building navigation with smooth interactions
- Creating polished dialog/overlay experiences
- Need animated feedback for user actions
Use docyrus when:
- Building item create forms (AwesomeDialog, Create Record Dialog)
- Building item detail views (AwesomeDialog + EditableRecordDetail)
- Working directly with Docyrus data sources
- Building forms that map to Docyrus fields (TanStack Form + DynamicFormField)
- Displaying Docyrus record data in tables/cards
- Need inline editing with change tracking
- Building scheduling UIs (Resource Scheduler, Time Slot Scheduler, Gantt, Calendar)
- Building communication features (Team Chat, Email Composer, Comments Panel)
- Integrating AI agents (Docyrus Agent with chat/action modes)
- Need pricing/quoting (Pricing Engine Panel)
- Need record sharing with permissions (Record Sharing)
- Need rich item selectors (Mega Select, Kanban)
- Need Docyrus-specific components (query builder, activity panel, notifications)
Use reui when:
- The specific component (file upload or sortable) matches your exact need
- Want a lightweight alternative to diceui versions
---
Icon Selection Guide
Priority order for icons:
1. hugeicons (first choice)
- Modern, consistent style
- Large icon set
- Use for: All general-purpose icons
2. fontawesome light (second choice)
- Professional appearance
- Familiar to users
- Use for: When hugeicons doesn't have the needed icon
3. lucide-icons (third choice)
- Clean, minimalist style
- Use for: Fallback when neither hugeicons nor fontawesome have the icon
Example:
import { HugeIconDollarCircle } from '@/components/icons/hugeicons'
import { FaLightChartLine } from '@/components/icons/fontawesome'
import { LucideActivity } from 'lucide-react'
// Prefer hugeicons
<HugeIconDollarCircle className="h-5 w-5" />
// Use fontawesome if not in hugeicons
<FaLightChartLine className="h-5 w-5" />
// Use lucide as fallback
<LucideActivity className="h-5 w-5" />---
Quick Reference: Component Categories
Dialogs & Item Flows
- Item create forms: docyrus AwesomeDialog (sheet for small, modal for large)
- Quick record create: docyrus Create Record Dialog (popover with subject/mentions)
- Item detail (small): docyrus AwesomeDialog (sheet right)
- Item detail (large): Dedicated page route
- Inline editing: docyrus EditableRecordDetail
- Confirmation: animate-ui Alert Dialog
- Responsive: diceui Responsive Dialog
Data & Display
- Tables: docyrus Data Grid, diceui Data Table, shadcn Table
- Pivot table: docyrus PivotGrid (hierarchies, subtotals, drilldown, export)
- Grid saved views: docyrus Data Grid View Select +
DataViewsfrom@docyrus/app-utils - Cards: docyrus AwesomeCard, shadcn Card
- Stat dashboards: docyrus AwesomeStats (grid/flex/tabs, mini-charts, comparisons)
- Charts: shadcn Chart + Recharts
- Stats: diceui Stat, diceui Gauge, shadcn Progress
- Gantt: docyrus Gantt
- Tree: docyrus TreeView
Forms & Input
- Dynamic forms: docyrus Form Fields + TanStack Form (always use)
- Inline editing: docyrus EditableRecordDetail, EditableValue
- Text: shadcn Input, Textarea
- Markdown: docyrus Simple Markdown Editor
- Selection: shadcn Select, diceui Combobox
- Rich selection: docyrus Mega Select (grid picker with categories)
- Radio cards: docyrus Radio Group (card variant with icons/descriptions)
- Dates: docyrus Date Time Picker, docyrus Date Time Range Picker, shadcn Calendar
- Files: diceui File Upload
- Special: diceui Phone Input, Color Picker, Tags Input
Navigation
- Sidebar: animate-ui Sidebar
- Menus: animate-ui Dropdown Menu, shadcn Menubar
- Breadcrumbs: shadcn Breadcrumb
- Tabs: animate-ui Tabs
Overlays
- Item forms/details: docyrus AwesomeDialog (preferred)
- Popovers: animate-ui Popover, Tooltip, Hover Card
- Drawers: shadcn Drawer, animate-ui Sheet
Communication
- Team chat: docyrus Team Chat Channel (threads, reactions, mentions)
- Email composing: docyrus Email Composer (To/Cc/Bcc, toolbar, attachments)
- Comments: docyrus Comments Panel (threaded conversations)
- Contact activities: docyrus Contact Activity Panel (calls, meetings, emails)
- Activity logging: docyrus Log Activity Form (calls, emails, meetings, tasks, statuses)
Scheduling
- Project timelines: docyrus Gantt
- Resource scheduling: docyrus Resource Scheduler Panel (horizontal timeline)
- Appointment booking: docyrus Time Slot Scheduler (columns/month views)
- Calendar events: docyrus Calendar (month/week/day views)
AI & Agents
- AI chat: docyrus Docyrus Agent (chat mode)
- AI actions: docyrus Docyrus Agent (action-panel mode)
- AI trigger: docyrus Docyrus Agent (floating trigger button)
Business Logic
- Pricing/quoting: docyrus Pricing Engine Panel (line items, VAT, discounts)
- Record sharing: docyrus Record Sharing (permissions, users/teams/roles)
Specialized
- Kanban: docyrus Kanban (drag-drop columns)
- Timeline: diceui Timeline
- Stepper / wizard: docyrus Stepper (6 variants, horizontal/vertical, animated)
- Query: docyrus Query Builder
- Notifications: docyrus NotificationStack
- Maps: docyrus Map
- Search: docyrus SearchInput
- Repeating rows: docyrus SchemaRepeater (dynamic structured data lists)
Icon Usage Guide
Comprehensive guide for using icon libraries in Docyrus applications: hugeicons, fontawesome light, and lucide-icons.
Table of Contents
1. Icon Library Preferences 2. Installation 3. Usage Patterns 4. Selection Strategy 5. Common Icon Mappings 6. Sizing & Styling 7. Best Practices
---
Icon Library Preferences
Priority order:
1. hugeicons (first choice)
- Modern, comprehensive icon set
- Consistent design language
- Wide coverage of common use cases
2. fontawesome light (second choice)
- Professional, familiar appearance
- Extensive icon collection
- Well-established library
3. lucide-icons (third choice)
- Clean, minimalist style
- Fallback option
- Good coverage of basic icons
Selection rule: Always try hugeicons first. If the icon doesn't exist, check fontawesome light. Use lucide-icons only as a last resort.
---
Installation
hugeicons
npm install @hugeicons/react
# or
pnpm add @hugeicons/reactImport pattern:
import { IconName } from '@hugeicons/react'fontawesome light
npm install @fortawesome/fontawesome-svg-core
npm install @fortawesome/free-solid-svg-icons
npm install @fortawesome/react-fontawesome
# For light icons (pro):
npm install @fortawesome/pro-light-svg-iconsImport pattern:
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faIconName } from '@fortawesome/pro-light-svg-icons'lucide-icons
npm install lucide-react
# or
pnpm add lucide-reactImport pattern:
import { IconName } from 'lucide-react'---
Usage Patterns
hugeicons (Preferred)
import { Home01, User01, Settings01, ChartLineData01 } from '@hugeicons/react'
// Basic usage
<Home01 />
// With className
<User01 className="h-5 w-5 text-muted-foreground" />
// In a button
<Button>
<Settings01 className="mr-2 h-4 w-4" />
Settings
</Button>
// In AwesomeCard
<AwesomeCard
icon={<ChartLineData01 className="h-8 w-8" />}
title="Revenue"
value="$124,500"
/>fontawesome light (Second Choice)
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faHome, faUser, faCog, faChartLine } from '@fortawesome/pro-light-svg-icons'
// Basic usage
<FontAwesomeIcon icon={faHome} />
// With className
<FontAwesomeIcon icon={faUser} className="h-5 w-5 text-muted-foreground" />
// In a button
<Button>
<FontAwesomeIcon icon={faCog} className="mr-2 h-4 w-4" />
Settings
</Button>lucide-icons (Fallback)
import { Home, User, Settings, TrendingUp } from 'lucide-react'
// Basic usage
<Home />
// With className
<User className="h-5 w-5 text-muted-foreground" />
// In a button
<Button>
<Settings className="mr-2 h-4 w-4" />
Settings
</Button>---
Selection Strategy
Decision Process
1. Determine what icon you need (e.g., "home", "user", "chart")
↓
2. Check hugeicons documentation/search
- Found? ✓ Use it
- Not found? → Continue to step 3
↓
3. Check fontawesome light documentation/search
- Found? ✓ Use it
- Not found? → Continue to step 4
↓
4. Check lucide-icons documentation/search
- Found? ✓ Use it
- Not found? → Use closest alternative from any libraryExample Search Flow
Scenario: Need a "dashboard" icon
1. Check hugeicons: Dashboard01 ✓ Use this 2. ~~Check fontawesome~~ (already found) 3. ~~Check lucide~~ (already found)
Scenario: Need a "bell" icon
1. Check hugeicons: Notification01 ✓ Use this 2. ~~Check fontawesome~~ (already found) 3. ~~Check lucide~~ (already found)
Scenario: Need a specific icon not in hugeicons
1. Check hugeicons: Not found ✗ 2. Check fontawesome: faBell ✓ Use this 3. ~~Check lucide~~ (already found)
---
Common Icon Mappings
| Use Case | hugeicons (1st) | fontawesome (2nd) | lucide (3rd) |
|---|---|---|---|
| Home | Home01 | faHome | Home |
| User/Profile | User01 | faUser | User |
| Settings | Settings01 | faCog | Settings |
| Search | Search01 | faSearch | Search |
| Notifications | Notification01 | faBell | Bell |
| Dashboard | Dashboard01 | faTachometer | LayoutDashboard |
| Chart/Analytics | ChartLineData01 | faChartLine | TrendingUp |
| Calendar | Calendar01 | faCalendar | Calendar |
| File | File01 | faFile | File |
| Folder | Folder01 | faFolder | Folder |
| Download | Download01 | faDownload | Download |
| Upload | Upload01 | faUpload | Upload |
| Edit | Edit01 | faEdit | Edit |
| Delete | Delete01 | faTrash | Trash2 |
| Plus/Add | Add01 | faPlus | Plus |
| Close/X | Cancel01 | faTimes | X |
| Check | CheckmarkCircle01 | faCheck | Check |
| Arrow Right | ArrowRight01 | faArrowRight | ArrowRight |
| Arrow Left | ArrowLeft01 | faArrowLeft | ArrowLeft |
| Menu | Menu01 | faBars | Menu |
| More (3 dots) | MoreVertical | faEllipsisV | MoreVertical |
| Info | InformationCircle | faInfoCircle | Info |
| Warning | Alert01 | faExclamationTriangle | AlertTriangle |
| Error | Cancel01 | faTimesCircle | XCircle |
| Success | CheckmarkCircle01 | faCheckCircle | CheckCircle |
| Lock | Lock01 | faLock | Lock |
| Unlock | Unlock01 | faUnlock | Unlock |
| Eye/View | View01 | faEye | Eye |
| Eye Off/Hide | ViewOff01 | faEyeSlash | EyeOff |
| Heart | Heart01 | faHeart | Heart |
| Star | Star01 | faStar | Star |
| Filter | Filter01 | faFilter | Filter |
| Sort | SortVertical | faSort | ArrowUpDown |
| Refresh | Reload | faSync | RotateCw |
---
Sizing & Styling
Standard Sizes
// Extra small (navigation items, tight spaces)
<Icon className="h-3 w-3" />
// Small (buttons, inline with text)
<Icon className="h-4 w-4" />
// Medium (default for most UI elements)
<Icon className="h-5 w-5" />
// Large (emphasized actions, cards)
<Icon className="h-6 w-6" />
// Extra large (dashboard cards, hero sections)
<Icon className="h-8 w-8" />
// Hero (feature highlights)
<Icon className="h-12 w-12" />Color & Style
// Inherit text color
<Icon className="h-5 w-5" />
// Muted/secondary
<Icon className="h-5 w-5 text-muted-foreground" />
// Primary color
<Icon className="h-5 w-5 text-primary" />
// Destructive/danger
<Icon className="h-5 w-5 text-destructive" />
// Success
<Icon className="h-5 w-5 text-green-600" />
// Warning
<Icon className="h-5 w-5 text-amber-600" />
// With opacity
<Icon className="h-5 w-5 text-foreground/50" />Common Patterns
Icon with text (button):
<Button>
<Icon className="mr-2 h-4 w-4" />
Button Text
</Button>Icon-only button:
<Button variant="ghost" size="icon">
<Icon className="h-5 w-5" />
<span className="sr-only">Accessible label</span>
</Button>Icon in input:
<div className="relative">
<Icon className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
<Input className="pl-9" />
</div>Icon in card header:
<AwesomeCard
icon={<Icon className="h-8 w-8 text-primary" />}
title="Title"
value="Value"
/>---
Best Practices
1. Consistency
- Use the same icon library throughout a feature/page
- Don't mix hugeicons and fontawesome for similar concepts
- Maintain consistent sizing within the same context
2. Accessibility
- Always provide accessible labels for icon-only buttons:
<Button variant="ghost" size="icon" aria-label="Settings">
<Settings01 className="h-5 w-5" />
</Button>- Use
<span className="sr-only">for screen readers:
<Button variant="ghost" size="icon">
<Settings01 className="h-5 w-5" />
<span className="sr-only">Open settings</span>
</Button>3. Performance
- Import only the icons you need (tree-shaking):
// Good
import { Home01, User01 } from '@hugeicons/react'
// Avoid
import * as HugeIcons from '@hugeicons/react'4. Semantic Usage
- Use appropriate icons for actions:
- Delete: Trash/Delete icon
- Edit: Pencil/Edit icon
- View: Eye icon
- Download: Download arrow
- Maintain icon semantics across the app
5. Spacing
- Use consistent spacing with Tailwind classes:
// Icon before text
<Icon className="mr-2 h-4 w-4" />
// Icon after text
<Icon className="ml-2 h-4 w-4" />
// Icon above text (flex column)
<Icon className="mb-2 h-6 w-6" />---
Library-Specific Tips
hugeicons
- Naming convention:
IconName01,IconName02for variants - Often includes outlined and filled versions
- Check for numbered variants (01, 02, 03) for style options
fontawesome light
- Pro license required for light icons
- Use
@fortawesome/free-solid-svg-iconsfor free versions - Prefix:
fa+ camelCase name (e.g.,faHome,faUserCircle)
lucide-icons
- PascalCase naming (e.g.,
Home,UserCircle) - Minimal, consistent stroke width
- Great for clean, modern designs
---
Quick Reference: Priority Flow
Need an icon?
↓
Search hugeicons
↓
Found? → Use it ✓
↓
Not found?
↓
Search fontawesome light
↓
Found? → Use it ✓
↓
Not found?
↓
Search lucide-icons
↓
Found? → Use it ✓
↓
Not found?
↓
Use closest semantic match from any library---
Example: Dashboard Page
import {
Dashboard01,
ChartLineData01,
User01,
ShoppingCart01
} from '@hugeicons/react'
import { AwesomeCard } from '@/components/ui/awesome-card'
export function DashboardPage() {
return (
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
<AwesomeCard
icon={<ChartLineData01 className="h-8 w-8" />}
title="Total Revenue"
value="$124,500"
/>
<AwesomeCard
icon={<User01 className="h-8 w-8" />}
title="Active Users"
value="1,234"
/>
<AwesomeCard
icon={<ShoppingCart01 className="h-8 w-8" />}
title="Orders"
value="456"
/>
<AwesomeCard
icon={<Dashboard01 className="h-8 w-8" />}
title="Conversion Rate"
value="3.2%"
/>
</div>
)
}All icons from hugeicons (first choice) ✓
Preferred Components Catalog
Complete reference of all 158 available components across shadcn, diceui, animate-ui, docyrus, and reui libraries.
Table of Contents
1. shadcn Components (43) 2. diceui Components (41) 3. animate-ui Components (21) 4. docyrus Components (51) 5. reui Components (2)
---
shadcn Components (43)
Core UI components for building accessible, well-designed interfaces.
| Component | Description | Install Command | Docs |
|---|---|---|---|
| Accordion | A vertically stacked set of interactive headings that each reveal a section of content. | pnpm dlx shadcn@latest add accordion | docs/components/shadcn-accordion.md |
| Alert | Displays a callout for user attention. | pnpm dlx shadcn@latest add alert | docs/components/shadcn-alert.md |
| Aspect Ratio | Displays content within a desired ratio. | pnpm dlx shadcn@latest add aspect-ratio | docs/components/shadcn-aspect-ratio.md |
| Avatar | An image element with a fallback for representing the user. | pnpm dlx shadcn@latest add avatar | docs/components/shadcn-avatar.md |
| Badge | Displays a badge or a component that looks like a badge. | pnpm dlx shadcn@latest add badge | docs/components/shadcn-badge.md |
| Breadcrumb | Displays the path to the current resource using a hierarchy of links. | pnpm dlx shadcn@latest add breadcrumb | docs/components/shadcn-breadcrumb.md |
| Button | Displays a button or a component that looks like a button. | pnpm dlx shadcn@latest add button | docs/components/shadcn-button.md |
| Button Group | A container that groups related buttons together with consistent styling. | pnpm dlx shadcn@latest add button-group | docs/components/shadcn-button-group.md |
| Calendar | A calendar component that allows users to select a date or a range of dates. | pnpm dlx shadcn@latest add calendar | docs/components/shadcn-calendar.md |
| Card | Displays a card with header, content, and footer. | pnpm dlx shadcn@latest add card | docs/components/shadcn-card.md |
| Carousel | Displays multiple items in a scrollable container with motion and swipe gestures, commonly used for product galleries or image showcases. | pnpm dlx shadcn@latest add carousel | docs/components/shadcn-carousel.md |
| Chart | A collection of ready-to-use chart components built using Recharts that turn raw data into visual insights. | pnpm dlx shadcn@latest add chart | docs/components/shadcn-chart.md |
| Collapsible | An interactive component that expands and collapses a panel of content, often used to organize information like FAQs or advanced settings. | pnpm dlx shadcn@latest add collapsible | docs/components/shadcn-collapsible.md |
| Command | A React command palette component for fast search and execution of actions using keyboard shortcuts. | pnpm dlx shadcn@latest add command | docs/components/shadcn-command.md |
| Context Menu | Displays a menu of actions or functions, typically triggered by a right-click or long-press. | pnpm dlx shadcn@latest add context-menu | docs/components/shadcn-context-menu.md |
| Date Picker | A date picker component with range and presets. | pnpm dlx shadcn@latest add popover calendar | — |
| Direction | A provider component that sets the text direction for your application. | pnpm dlx shadcn@latest add direction | docs/components/shadcn-direction.md |
| Drawer | A sliding panel that appears from the side or bottom of the screen, commonly used for navigation menus, settings, or additional content, especially on mobile. | pnpm dlx shadcn@latest add drawer | docs/components/shadcn-drawer.md |
| Empty | Used to display an empty state when there is no content or data to show, providing context and guiding user action. | pnpm dlx shadcn@latest add empty | docs/components/shadcn-empty.md |
| Field | Field components combine labels, inputs, error messages, and helper text into complete form field units. | pnpm dlx shadcn@latest add field | docs/components/shadcn-field.md |
| Input | Displays a form input field or a component that looks like an input field. | pnpm dlx shadcn@latest add input | docs/components/shadcn-input.md |
| Input Group | Display additional information or actions to an input or textarea. | pnpm dlx shadcn@latest add input-group | docs/components/shadcn-input-group.md |
| Input OTP | Accessible component designed to collect one-time password codes with individual input fields for each digit. | pnpm dlx shadcn@latest add input-otp | docs/components/shadcn-input-otp.md |
| Item | A versatile component for displaying content with media, title, description, and actions, often used in lists. | pnpm dlx shadcn@latest add item | docs/components/shadcn-item.md |
| Kbd | Display a keyboard key or group of keys. | pnpm dlx shadcn@latest add kbd | docs/components/shadcn-kbd.md |
| Label | Renders an accessible label associated with controls. | pnpm dlx shadcn@latest add label | docs/components/shadcn-label.md |
| Menubar | A visually persistent menu common in desktop applications that provides quick access to a consistent set of commands. | pnpm dlx shadcn@latest add menubar | docs/components/shadcn-menubar.md |
| Native Select | A styled native HTML select element with consistent design system integration. | pnpm dlx shadcn@latest add native-select | docs/components/shadcn-native-select.md |
| Navigation Menu | A React component for website navigation with dropdowns, mega menus, and organized content sections. | pnpm dlx shadcn@latest add navigation-menu | docs/components/shadcn-navigation-menu.md |
| Pagination | Pagination provides next/previous buttons and page numbers to navigate through long lists or tables. | pnpm dlx shadcn@latest add pagination | docs/components/shadcn-pagination.md |
| Progress | Displays an indicator showing the completion progress of a task, typically displayed as a progress bar. | pnpm dlx shadcn@latest add progress | docs/components/shadcn-progress.md |
| Resizable | Accessible resizable panel groups and layouts with keyboard support for creating dynamic split views, editors, and dashboards. | pnpm dlx shadcn@latest add resizable | docs/components/shadcn-resizable.md |
| Scroll Area | Augments native scroll functionality for custom, cross-browser styling | pnpm dlx shadcn@latest add scroll-area | docs/components/shadcn-scroll-area.md |
| Select | Displays a list of options for the user to pick from—triggered by a button. | pnpm dlx shadcn@latest add select | docs/components/shadcn-select.md |
| Separator | Visually or semantically separates content. | pnpm dlx shadcn@latest add separator | docs/components/shadcn-separator.md |
| Subtopic | The short description for the 'shadcn Subtopic' component is not available in the provided context. | pnpm dlx shadcn@latest add subtopic | — |
| Skeleton | Displays a placeholder while content is loading. | pnpm dlx shadcn@latest add skeleton | docs/components/shadcn-skeleton.md |
| Slider | Input where the user selects a value from within a given range. | pnpm dlx shadcn@latest add slider | docs/components/shadcn-slider.md |
| Sonner | Displays modern, opinionated, non-intrusive toast notifications for feedback. | pnpm dlx shadcn@latest add sonner | docs/components/shadcn-sonner.md |
| Spinner | An indicator that can be used to show a loading state. | pnpm dlx shadcn@latest add spinner | docs/components/shadcn-spinner.md |
| Table | A responsive component used for displaying simple, structured data like invoices or feature comparisons. | pnpm dlx shadcn@latest add table | docs/components/shadcn-table.md |
| Textarea | Handles multi-line text input, ideal for messages, descriptions, or comments. | pnpm dlx shadcn@latest add textarea | docs/components/shadcn-textarea.md |
| Typography | Styles for headings, paragraphs, lists, and captions. | pnpm dlx shadcn@latest add typography | docs/components/shadcn-typography.md |
---
diceui Components (41)
Advanced, specialized components for complex UI patterns.
| Component | Description | Install Command | Docs |
|---|---|---|---|
| Action Bar | A floating action bar that appears at the bottom or top of the viewport to display contextual actions for selected items. | pnpm dlx shadcn@latest add "@diceui/action-bar" | docs/components/action-bar.mdx |
| Badge Overflow | Displays a list of badges in confined space, using an overflow badge to show a count of hidden badges. | pnpm dlx shadcn@latest add @diceui/badge-overflow | docs/components/badge-overflow.mdx |
| Checkbox Group | A list of options where one or more choices can be selected. | pnpm dlx shadcn@latest add @diceui/checkbox-group | docs/components/checkbox-group.mdx |
| Circular Progress | A widget that shows progress along a circle. | pnpm dlx shadcn@latest add @diceui/circular-progress | docs/components/circular-progress.mdx |
| Color Picker | A compact component providing a wide color spectrum and predefined palette for precise color selection. | pnpm add @diceui/color-picker | docs/components/color-picker.mdx |
| Color Swatch | A color swatch component that displays a color value with optional transparency support. | pnpm dlx shadcn@latest add "https://diceui.com/r/color-swatch" | docs/components/color-swatch.mdx |
| Combobox | A combobox component combines an input field and a dropdown list, allowing users to search, filter, and select from a predefined set of choices. | pnpm dlx shadcn@latest add @diceui/combobox | docs/components/combobox.mdx |
| Compare Slider | Used to compare two images or components side-by-side with a draggable divider. | pnpm dlx shadcn@latest add "https://diceui.com/r/compare-slider" | docs/components/compare-slider.mdx |
| Data Grid | A high-performance editable data grid component with virtualization, keyboard navigation, and comprehensive cell editing capabilities. | pnpm dlx shadcn@latest add "@diceui/data-table" | docs/components/data-grid.mdx |
| Data Table | A powerful and flexible data table component for displaying, filtering, sorting, and paginating tabular data. | pnpm dlx shadcn@latest add "@diceui/data-table" | docs/components/data-table.mdx |
| Editable | An accessible inline editable component for editing text content in place. | pnpm dlx shadcn@latest add "@diceui/editable" | docs/components/editable.mdx |
| File Upload | A comprehensive file upload component built on top of shadcn-ui with drag-and-drop functionality, file preview, progress indicators, and multiple file support. | pnpm dlx shadcn@latest add "https://diceui.com/r/file-upload" | docs/components/file-upload.mdx |
| Gauge | A component that displays a single numeric value in a specified range, often using a dial or arc to show progress. | pnpm dlx shadcn@latest add "@diceui/gauge" | docs/components/gauge.mdx |
| Kanban | A drag and drop kanban board component for organizing items into columns. | pnpm dlx shadcn@latest add @diceui/kanban | docs/components/kanban.mdx |
| Key Value | A dynamic input component for managing key-value pairs with paste support and validation | pnpm dlx shadcn@latest add @diceui/key-value | docs/components/key-value.mdx |
| Listbox | Displays a list of selectable options for single or multiple selection. | pnpm dlx shadcn@latest add @diceui/listbox | docs/components/listbox.mdx |
| Mask Input | An input component that formats user input with predefined patterns. | pnpm dlx shadcn@latest add @diceui/mask-input | docs/components/mask-input.mdx |
| Masonry | A grid layout component that places elements in optimal position based on available vertical space. | pnpm dlx shadcn@latest add "https://diceui.com/r/masonry" | docs/components/masonry.mdx |
| Map Input | I do not have enough information to provide a short description for the "Map Input" component within the context provided. | pnpm dlx shadcn@latest add "https://diceui.com/r/map-input" | — |
| Media Player | Integrates a consistent and accessible video or audio playback experience. | pnpm dlx shadcn@latest add "https://diceui.com/r/media-player" | docs/components/media-player.mdx |
| Mention | Allows mentioning items in a list by a trigger character. | pnpm dlx shadcn@latest add @diceui/mention | docs/components/mention.mdx |
| Phone Input | An accessible phone input component with automatic country detection and international phone number formatting. | pnpm dlx shadcn@latest add @diceui/phone-input | docs/components/phone-input.mdx |
| QR Code | A flexible QR code component for generating and displaying QR codes with customization options. | pnpm dlx shadcn@latest add "@diceui/qr-code" | docs/components/qr-code.mdx |
| Rating | Enables users to apply a rating to an item or experience. | pnpm dlx shadcn@latest add "https://diceui.com/r/rating" | docs/components/rating.mdx |
| Relative Time Card | A hover card that displays relative time relative to local time with timezone information. | pnpm dlx shadcn@latest add "https://diceui.com/r/relative-time-card" | docs/components/relative-time-card.mdx |
| Responsive Dialog | A dialog component that automatically switches between a centered dialog on desktop and a bottom drawer on mobile. | pnpm dlx shadcn@latest add @diceui/responsive-dialog | docs/components/responsive-dialog.mdx |
| Scroll Spy | Dynamically highlights navigation links to indicate the current visible section in the viewport during page scroll. | pnpm dlx shadcn@latest add @diceui/scroll-spy | docs/components/scroll-spy.mdx |
| Scroller | A scrollable container with automatic navigation buttons that appear when content overflows. | pnpm dlx shadcn@latest add @diceui/scroller | docs/components/scroller.mdx |
| Segmented Input | A linear set of two or more segments, each of which functions as a button or toggle for related choices. | pnpm dlx shadcn@latest add "https://diceui.com/r/segmented-input" | docs/components/segmented-input.mdx |
| Selection Toolbar | I do not have a description for the "Selection Toolbar" component in the provided document. | pnpm dlx shadcn@latest add "@diceui/action-bar" | docs/components/action-bar.mdx |
| Sortable | A drag and drop sortable component for reordering items. | pnpm dlx shadcn@latest add @diceui/sortable | docs/components/sortable.mdx |
| Speed Dial | A floating action button that expands to reveal a set of related actions, providing quick access to frequently used functions in a compact interface. | pnpm dlx shadcn@latest add "@diceui/speed-dial" | docs/components/speed-dial.mdx |
| Stack | The main stack container that handles layout and masking of child elements. | pnpm dlx shadcn@latest add "https://diceui.com/r/stack" | docs/components/stack.mdx |
| Stat | Used to show numbers and data in a block. | pnpm dlx shadcn@latest add "https://diceui.com/r/stat" | docs/components/stat.mdx |
| Status | Displays a status indicator icon. | pnpm dlx shadcn@latest add "https://diceui.com/r/status" | docs/components/status.mdx |
| Stepper | A component that guides users through a multi-step process with clear visual progress indicators. | pnpm dlx shadcn@latest add @diceui/stepper | docs/components/stepper.mdx |
| Swap | A component that swaps between two states with click or hover activation modes. | pnpm dlx shadcn@latest add "https://diceui.com/r/swap" | docs/components/swap.mdx |
| Tags Input | A component that allows users to add tags to an input field. | pnpm dlx shadcn@latest add @diceui/tags-input | docs/components/tags-input.mdx |
| Time Picker | Allow users to select specific times for scheduling events or setting appointments. | pnpm dlx shadcn@latest add "https://diceui.com/r/time-picker" | docs/components/time-picker.mdx |
| Timeline | Timeline is a flexible family of components for displaying events, steps, or progress in a vertical or horizontal layout. | pnpm dlx shadcn@latest add @diceui/timeline | docs/components/timeline.mdx |
| Tour | Displays a multi-step component used for interactive tutorials or onboarding new features. | pnpm dlx shadcn@latest add @diceui/tour | docs/components/tour.mdx |
---
animate-ui Components (21)
Animated components with smooth transitions and interactions.
| Component | Description | Install Command | Docs |
|---|---|---|---|
| Alert Dialog | A modal dialog that interrupts the user with important content and expects a response. | pnpm dlx shadcn@latest add @animate-ui/alert-dialog | docs/components/animate-ui/alert-dialog.md |
| Avatar Group | An animated avatar group that displays overlapping user images and smoothly shifts each avatar forward on hover to highlight it. | pnpm dlx shadcn@latest add @animate-ui/avatar-group | docs/components/animate-ui/avatar-group.md |
| Checkbox | A control that allows the user to toggle between checked and not checked. | pnpm dlx shadcn@latest add @animate-ui/checkbox | docs/components/animate-ui/checkbox.md |
| Dialog | A window overlaid on either the primary window or another dialog window, rendering the content underneath inert. | pnpm dlx shadcn@latest add @animate-ui/dialog | docs/components/animate-ui/dialog.md |
| Dropdown Menu | Displays a menu to the user — such as a set of actions or functions — triggered by a button. | pnpm dlx shadcn@latest add @animate-ui/dropdown-menu | docs/components/animate-ui/dropdown-menu.md |
| Files | A component that allows you to display a list of files and folders. | pnpm dlx shadcn@latest add @animate-ui/file-tree | docs/components/animate-ui/file-tree.md |
| Flip Card | A 3D animated card component that flips to reveal content on the back. | pnpm dlx shadcn@latest add @animate-ui/flip-card | docs/components/animate-ui/flip-card.md |
| Management Bar | A management bar that combines pagination, action buttons, and a call-to-action for streamlined item handling. | pnpm dlx shadcn@latest add @animate-ui/floating-bar | docs/components/animate-ui/floating-bar.md |
| Hover Card | For sighted users to preview content available behind a link. | pnpm dlx shadcn@latest add @animate-ui/hover-card | docs/components/animate-ui/hover-card.md |
| Pin List | A playful list for pinning and unpinning items, with smooth animated transitions as items move between groups. | pnpm dlx shadcn@latest add @animate-ui/pin-list | docs/components/animate-ui/pin-list.md |
| Popover | Displays rich content in a portal, triggered by a button. | pnpm dlx shadcn@latest add @animate-ui/popover | docs/components/animate-ui/popover.md |
| Preview Link Card | Displays a preview image of a link when hovered. | pnpm dlx shadcn@latest add @animate-ui/preview-link | docs/components/animate-ui/preview-link.md |
| Radial Menu | A circular context menu built with Base UI, displaying actions in a clean radial layout with full keyboard support and smooth interaction. | pnpm dlx shadcn@latest add @animate-ui/radial-menu | docs/components/animate-ui/radial-menu.md |
| Radio Group | A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time. | pnpm dlx shadcn@latest add @animate-ui/radio-group | docs/components/animate-ui/radio-group.md |
| Sheet | Extends the Dialog component to display content that complements the main content of the screen. | pnpm dlx shadcn@latest add @animate-ui/sheet | docs/components/animate-ui/sheet.md |
| Sidebar | A composable, themeable and customizable sidebar component. Created by Shadcn and animated by Animate UI. | pnpm dlx shadcn@latest add @animate-ui/sidebar | docs/components/animate-ui/sidebar.md |
| Switch | A control that allows the user to toggle between checked and not checked. | pnpm dlx shadcn@latest add @animate-ui/switch | docs/components/animate-ui/switch.md |
| Tabs | A set of layered sections of content—known as tab panels—that are displayed one at a time. | pnpm dlx shadcn@latest add @animate-ui/tabs | docs/components/animate-ui/tabs.md |
| Toggle Group | A set of two-state buttons that can be toggled on or off. | pnpm dlx shadcn@latest add @animate-ui/toggle-group | docs/components/animate-ui/toggle-group.md |
| Toggle | A two-state button that can be either on or off. | pnpm dlx shadcn@latest add @animate-ui/toggle | docs/components/animate-ui/toggle.md |
| Tooltip | A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it. | pnpm dlx shadcn@latest add @animate-ui/tooltip | docs/components/animate-ui/tooltip.md |
---
docyrus Components (51)
Docyrus-specific components for data handling, forms, dialogs, editing, scheduling, chat, AI agents, and business logic.
| Component | Description | Install Command | Docs |
|---|---|---|---|
| Awesome Dialog | Advanced dialog system with three container modes (modal, sheet, drawer), side positioning, size presets, pattern backgrounds, fullscreen/minimize/resize support, and global dialog management via GlobalDialogProvider. The primary dialog system for item creation forms and small item detail views. | pnpm dlx @docyrus/cli add @docyrus/ui-awesome-dialog | llms.txt |
| Awesome Card | A card with a hatched-stripe header and an inset content area, perfect for displaying stats and metrics. | pnpm dlx @docyrus/cli add @docyrus/ui-awesome-card | llms.txt |
| Awesome Stats | Data-driven metric cards with grid, flex, and animated tabs layouts. Supports sparkline/bar/area mini-charts, comparison deltas, drag-and-drop reordering, Intl.NumberFormat value formatting, and AwesomeCard styling mode. | pnpm dlx @docyrus/cli add @docyrus/ui-awesome-stats | llms.txt |
| Avatar Select | Avatar Select component with multiple variants and sizes. | pnpm dlx @docyrus/cli add @docyrus/ui-avatar-select | llms.txt |
| Avatar Thumbnail | Avatar Thumbnail component with multiple variants and sizes. | pnpm dlx @docyrus/cli add @docyrus/ui-avatar-thumbnail | llms.txt |
| Calendar | Advanced calendar with month/week/day/agenda views, drag-and-drop event management, multi-user support, and loading states. | pnpm dlx @docyrus/cli add @docyrus/ui-calendar | llms.txt |
| Comments Panel | Comment discussion panel with threaded conversations, mention input, and editor support. | pnpm dlx @docyrus/cli add @docyrus/ui-comments-panel | llms.txt |
| Confirmation Button | Button with built-in confirmation dialog for destructive or important actions. | pnpm dlx @docyrus/cli add @docyrus/ui-confirmation-button | llms.txt |
| Contact Activity Panel | Contact-centric activity timeline showing calls, meetings, emails, tasks, chats, and record changes. Supports threaded replies, emoji reactions, file attachments, @mentions, and entity linking. Filter by activity type with animated transitions. | pnpm dlx @docyrus/cli add @docyrus/ui-contact-activity-panel | llms.txt |
| Create Record Dialog | Quick-create popover dialog for new records with subject/description inputs, inline mention triggers, selector fields (header and footer), AI actions, footer toggles, and create-more support. Designed for fast item creation without a full form. | pnpm dlx @docyrus/cli add @docyrus/ui-create-record-dialog | llms.txt |
| Data Grid | A virtualized, editable spreadsheet-like data grid with sorting, filtering, grouping, cell selection, and keyboard navigation. Supports grid/gallery/card display modes. | pnpm dlx @docyrus/cli add @docyrus/ui-data-grid | llms.txt |
| Data Grid View Select | View selector companion for Data Grid. Supports dropdown, horizontal-tabs, and vertical-tabs variants. Manages saved views with sort, filter (query builder), column visibility, grouping, and view CRUD operations. | pnpm dlx @docyrus/cli add @docyrus/ui-data-grid-view-select | llms.txt |
| Data Table Filter | A composable filter bar for data tables with text, number, date, option, and multi-option column types. | pnpm dlx @docyrus/cli add @docyrus/ui-data-table-filter | llms.txt |
| Date Time Picker | Date Time Picker component with multiple variants and sizes. | pnpm dlx @docyrus/cli add @docyrus/ui-date-time-picker | llms.txt |
| Date Time Range Picker | Select start and end date/time pairs with sm/default/lg size variants. Integrates with react-hook-form. | pnpm dlx @docyrus/cli add @docyrus/ui-date-time-range-picker | llms.txt |
| Day Picker | Day Picker component with multiple variants and sizes. | pnpm dlx @docyrus/cli add @docyrus/ui-day-picker | llms.txt |
| Delete Confirm Dialog | Delete Confirm Dialog component with multiple variants and sizes. | pnpm dlx @docyrus/cli add @docyrus/ui-delete-confirm-dialog | llms.txt |
| Docyrus Agent | AI agent interface with three modes: chat (conversational), action-panel (parameter-based actions), and trigger (floating button that opens dialog). Supports Vercel AI SDK messages, file attachments, action execution with typed params, agent profiles, and source documents. | pnpm dlx @docyrus/cli add @docyrus/ui-docyrus-agent | llms.txt |
| Docyrus Icon | Docyrus Icon component with multiple variants and sizes. | pnpm dlx @docyrus/cli add @docyrus/ui-docyrus-icon | llms.txt |
| Duration Select | Duration Select component with multiple variants and sizes. | pnpm dlx @docyrus/cli add @docyrus/ui-duration-select | llms.txt |
| Editable Record Detail | Complete inline record editor with field-level change tracking, floating ActionBar showing pending changes, save/cancel with diff preview, and TanStack Form compatible API. Use for detail views where users edit individual fields without opening a full form. | pnpm dlx @docyrus/cli add @docyrus/ui-editable-record-detail | llms.txt |
| Editable Value | Single-field inline editor that renders DynamicValue in display mode and switches to DynamicFormField on click. Supports inline, popover, and instant-save field types with automatic save/cancel behavior. | pnpm dlx @docyrus/cli add @docyrus/ui-editable-value | llms.txt |
| Email Composer | Email composition component with To/Cc/Bcc recipient fields (chip-based input with validation), subject line, rich-text body with formatting toolbar (bold, italic, underline, strikethrough, links, lists), file attachments display, and send/discard actions. Supports default/outline/minimal variants and sm/default/lg sizes. | pnpm dlx @docyrus/cli add @docyrus/ui-email-composer | llms.txt |
| File Attachment Panel | File management panel with upload zone, file list/grid views, and empty state handling. | pnpm dlx @docyrus/cli add @docyrus/ui-file-attachment-panel | llms.txt |
| Form Fields | Dynamic form field system powered by TanStack Form. 47 field types with automatic dispatch via DynamicFormField. | pnpm dlx @docyrus/cli add @docyrus/ui-form-fields | llms.txt |
| Gantt | Gantt chart visualization for project timelines, task dependencies, and scheduling. | pnpm dlx @docyrus/cli add @docyrus/ui-gantt | llms.txt |
| Image Editor | Advanced image editor with cropping, adjustments, and transformation tools. | pnpm dlx @docyrus/cli add @docyrus/ui-image-editor | llms.txt |
| Kanban | Drag-and-drop kanban board with sortable columns and cards. Built on dnd-kit with keyboard navigation, multi-container support, collision detection, and drag overlay. Compound components: Kanban, KanbanBoard, KanbanColumn, KanbanCard, KanbanCardHandle, KanbanOverlay. | pnpm dlx @docyrus/cli add @docyrus/ui-kanban | llms.txt |
| Log Activity Form | Capture activities (calls, emails, meetings, tasks, status updates, comments) with rich Plate editor, mention users, calendar event linking, status tracking, and follow-up dates. Specialized sections for each activity type. | pnpm dlx @docyrus/cli add @docyrus/ui-log-activity-form | llms.txt |
| Map | Map visualization component built on Leaflet for displaying geographic data and locations. | pnpm dlx @docyrus/cli add @docyrus/ui-map | llms.txt |
| Mega Select | Large grid-based item selector with category tabs, search, detail panel, and keyboard navigation. Supports thin/default/large/full sizes and default/elevated/flat variants. Ideal for template pickers, product catalogs, or any rich selection UI with icons, images, colors, and descriptions. | pnpm dlx @docyrus/cli add @docyrus/ui-mega-select | llms.txt |
| Morph Popover | Morphing popover that smoothly transitions between trigger and content states. | pnpm dlx @docyrus/cli add @docyrus/ui-morph-popover | llms.txt |
| Notification Stack | Stacked notification cards with animation for displaying multiple notifications. | pnpm dlx @docyrus/cli add @docyrus/ui-notification-stack | llms.txt |
| Notifications Panel | Full notification panel for managing and displaying user notifications. | pnpm dlx @docyrus/cli add @docyrus/ui-notifications-panel | llms.txt |
| Pivot Grid | Sophisticated pivot table with 3-level row/column hierarchies, subtotals, grand totals, drilldown to raw data, pinning, resizing, conditional cell coloring via JSONata, and export to CSV/Excel/PDF. Built on TanStack Table + TanStack Virtual. | pnpm dlx @docyrus/cli add @docyrus/ui-pivot-grid | llms.txt |
| Place Autocomplete | Location autocomplete input with address search and selection. | pnpm dlx @docyrus/cli add @docyrus/ui-place-autocomplete | llms.txt |
| Pricing Engine Panel | Full pricing/quoting engine with editable line items table, product catalog integration, category hierarchy, per-line and global discounts, multi-VAT rate support, currency with secondary currency and exchange rates, net/gross view modes, totals/VAT summary, description and terms sections, and save/draft actions. Variants: default/bordered/compact. | pnpm dlx @docyrus/cli add @docyrus/ui-pricing-engine-panel | llms.txt |
| Query Builder | Visual query builder for constructing filter conditions with drag-and-drop, rule numbers, and depth control. | pnpm dlx @docyrus/cli add @docyrus/ui-query-builder | llms.txt |
| Radio Group | Radio group with "default" (simple list) and "card" (selectable cards) variants. Options support icons, descriptions, and color accents. Grid layout with configurable column count (1-4). | pnpm dlx @docyrus/cli add @docyrus/ui-radio-group | llms.txt |
| Record Activity Panel | Activity log panel for displaying record history and audit trail. | pnpm dlx @docyrus/cli add @docyrus/ui-record-activity-panel | llms.txt |
| Record Delete Confirm Dialog | Domain-specific delete confirmation with record context. | pnpm dlx @docyrus/cli add @docyrus/ui-record-delete-confirm-dialog | llms.txt |
| Record Sharing | Record sharing panel with bitmask permission system (Read/Write/Comment/Share/Delete), permission presets (Can View/Comment/Edit/Share/Full Access), search for users/teams/roles/tenants, and per-entity permission management. Trigger variants: button or avatar-group. | pnpm dlx @docyrus/cli add @docyrus/ui-record-sharing | llms.txt |
| Resource Scheduler Panel | Horizontal timeline resource scheduler with configurable presets (hour/day/week/month/year), drag-and-drop event moving and resizing, resource list with custom TanStack Table columns, today indicator, event popovers, and event bar variants (solid/outlined/subtle). | pnpm dlx @docyrus/cli add @docyrus/ui-resource-scheduler-panel | llms.txt |
| Schema Repeater | Dynamic list manager for structured data entries with customizable input types per column. Ideal for filter rule builders, key-value editors, and repeating field groups. | pnpm dlx @docyrus/cli add @docyrus/ui-schema-repeater | llms.txt |
| Search Input | Dedicated search input component with search icon and clear button. | pnpm dlx @docyrus/cli add @docyrus/ui-search-input | llms.txt |
| Simple Markdown Editor | Lightweight markdown editor powered by overtype with configurable toolbar, auto-resize, word/character stats, spellcheck, and resizable handle. Variants: default/muted. Sizes: sm/default/lg. Exposes imperative ref for focus/blur/getValue/setValue. | pnpm dlx @docyrus/cli add @docyrus/ui-simple-markdown-editor | llms.txt |
| Stepper | Multi-step progress indicator with 6 visual variants (default, outline, dots, dashed, gradient, minimal), horizontal/vertical orientations, three sizes, non-linear navigation, alternative label positioning, custom icons, and animated connectors. | pnpm dlx @docyrus/cli add @docyrus/ui-stepper | llms.txt |
| Team Chat Channel | Full-featured team chat component with rich text posts (Plate editor), threaded replies, emoji reactions, file attachments, link previews, entity mentions (@-trigger linked to data sources), hashtags, post editing/deletion, and real-time-ready callbacks. | pnpm dlx @docyrus/cli add @docyrus/ui-team-chat-channel | llms.txt |
| Time Slot Scheduler | Appointment booking scheduler with columns view (multi-day time grid) and month calendar view. Manages slot capacity, reservations, unavailable ranges, timezone selection, weekend toggle, min/max date bounds, and slot popover with reservation details. Ideal for booking pages and availability scheduling. | pnpm dlx @docyrus/cli add @docyrus/ui-time-slot-scheduler | llms.txt |
| Tree View | Tree/hierarchy visualization component for displaying nested data structures. | pnpm dlx @docyrus/cli add @docyrus/ui-tree-view | llms.txt |
| Value Renderers | Read-only value display system for table cells, detail views, and kanban cards. 44 renderer types with automatic dispatch via DynamicValue. | pnpm dlx @docyrus/cli add @docyrus/ui-value-renderers | llms.txt |
---
reui Components (2)
Utility components for specialized file and sorting operations.
| Component | Description | Install Command | Docs |
|---|---|---|---|
| File Upload | Allows users to transfer files from their devices to a web application. | pnpm dlx shadcn@latest add @reui/file-upload-default | docs/components/reui-file-upload.md |
| Sortable | Allows reordering of items within a list or grid using drag-and-drop functionality. | pnpm dlx shadcn@latest add @reui/sortable | docs/components/reui-sortable.md |
---
Docyrus UI Guide Documentation
Fetch these llms.txt endpoints for detailed guidance on installation, theming, and patterns:
| Guide | Description | Docs |
|---|---|---|
| Components Overview | Production-ready UI components built with React, TypeScript, Tailwind CSS v4, and CVA variants. | llms.txt |
| Installation | How to install and set up Docyrus UI components in your project. | llms.txt |
| Theming | Customize the look and feel of Docyrus UI components with CSS variables and the theme generator. | llms.txt |
| Distributions | Component distributions and core libraries that power Docyrus UI web components. | llms.txt |
| Examples & Recipes | Practical multi-component patterns and recipes for common UI scenarios. | llms.txt |
| Troubleshooting | Common issues and solutions when using Docyrus UI web components. | llms.txt |
| Releases | Latest releases and updates for Docyrus UI web components. | llms.txt |
---
Component Count Summary
- shadcn: 43 components
- diceui: 41 components
- animate-ui: 21 components
- docyrus: 51 components
- reui: 2 components
Total: 158 components
Docyrus App Dev React Reference Map
This directory contains the full reference set for docyrus-app-dev-react.
App Development References
Read these files for data access, auth, query design, and collection patterns:
api-client-and-auth.mdcollections-and-patterns.md- the docyrus-acl-design skill — ACL roles, permissions, and role-queries (
docyrus acl); plus the ACL REST endpoints in docyrus-api-dev's SKILL.md ../../docyrus-api-dev/references/data-source-query-guide.md../../docyrus-api-dev/references/formula-design-guide-llm.md../../docyrus-api-dev/references/query-guide.md
UI Design References
Read these files for component selection, design patterns, and UI library guidance:
preferred-components-catalog.mdcomponent-selection-guide.mdicon-usage-guide.md
How to Use This Skill
1. Start with ../SKILL.md for the merged operating guidance. 2. Use the app-development references when working on auth, queries, collections, routing, and mutations. 3. Use the UI-design references when selecting components, designing layouts, or implementing polished feature flows. 4. Combine both when building end-to-end Docyrus React features.