# Value Renderers URL: /docs/web/components/value-renderers Read-only value display system for table cells, detail views, and kanban cards. 44 renderer types with automatic dispatch via DynamicValue. **Demo:** ```tsx 'use client'; // @custom-demo import { type ReactNode } from 'react'; import { ApprovalStatusValue } from '@docyrus/ui/components/value-renderers/approval-status-value'; import { AvatarValue } from '@docyrus/ui/components/value-renderers/avatar-value'; import { ButtonValue } from '@docyrus/ui/components/value-renderers/button-value'; import { CheckboxValue } from '@docyrus/ui/components/value-renderers/checkbox-value'; import { CodeValue } from '@docyrus/ui/components/value-renderers/code-value'; import { ColorValue } from '@docyrus/ui/components/value-renderers/color-value'; import { ConversationChannelValue } from '@docyrus/ui/components/value-renderers/conversation-channel-value'; import { CurrencyCodeValue } from '@docyrus/ui/components/value-renderers/currency-code-value'; import { DateRangeValue } from '@docyrus/ui/components/value-renderers/date-range-value'; import { DateValue } from '@docyrus/ui/components/value-renderers/date-value'; import { DateTimeValue } from '@docyrus/ui/components/value-renderers/datetime-value'; import { DocEditorValue } from '@docyrus/ui/components/value-renderers/doc-editor-value'; import { DurationValue } from '@docyrus/ui/components/value-renderers/duration-value'; import { EmailValue } from '@docyrus/ui/components/value-renderers/email-value'; import { FileStorageFolderValue } from '@docyrus/ui/components/value-renderers/file-storage-folder-value'; import { FileValue } from '@docyrus/ui/components/value-renderers/file-value'; import { FormulaValue } from '@docyrus/ui/components/value-renderers/formula-value'; import { IconValue } from '@docyrus/ui/components/value-renderers/icon-value'; import { IdentityValue } from '@docyrus/ui/components/value-renderers/identity-value'; import { ImageValue } from '@docyrus/ui/components/value-renderers/image-value'; import { InlineDataValue } from '@docyrus/ui/components/value-renderers/inline-data-value'; import { JsonValue } from '@docyrus/ui/components/value-renderers/json-value'; import { ListValue } from '@docyrus/ui/components/value-renderers/list-value'; import { LocationValue } from '@docyrus/ui/components/value-renderers/location-value'; import { MoneyValue } from '@docyrus/ui/components/value-renderers/money-value'; import { MultiSelectValue } from '@docyrus/ui/components/value-renderers/multi-select-value'; import { NumberValue } from '@docyrus/ui/components/value-renderers/number-value'; import { PercentValue } from '@docyrus/ui/components/value-renderers/percent-value'; import { PhoneValue } from '@docyrus/ui/components/value-renderers/phone-value'; import { RatingValue } from '@docyrus/ui/components/value-renderers/rating-value'; import { RelatedFieldValue } from '@docyrus/ui/components/value-renderers/related-field-value'; import { RelationValue } from '@docyrus/ui/components/value-renderers/relation-value'; import { RichTextValue } from '@docyrus/ui/components/value-renderers/rich-text-value'; import { SelectValue } from '@docyrus/ui/components/value-renderers/select-value'; import { StatusValue } from '@docyrus/ui/components/value-renderers/status-value'; import { SwitchValue } from '@docyrus/ui/components/value-renderers/switch-value'; import { TaskListValue } from '@docyrus/ui/components/value-renderers/task-list-value'; import { TextValue } from '@docyrus/ui/components/value-renderers/text-value'; import { TimeValue } from '@docyrus/ui/components/value-renderers/time-value'; import { TodoValue } from '@docyrus/ui/components/value-renderers/todo-value'; import { UrlValue } from '@docyrus/ui/components/value-renderers/url-value'; import { UserMultiValue } from '@docyrus/ui/components/value-renderers/user-multi-value'; import { UserValue } from '@docyrus/ui/components/value-renderers/user-value'; import { APPROVAL_OPTIONS, CATEGORY_OPTIONS, DEMO_FIELDS, DEMO_RECORD, DEPARTMENT_OPTIONS, LIST_OPTIONS, PRIORITY_OPTIONS, RELATION_OPTIONS, SKILL_OPTIONS, STATUS_OPTIONS, TAG_OPTIONS, USER_OPTIONS } from '@/data/value-renderers-data'; function SectionHeader({ children }: { children: string }) { return (

{children}

); } function ValueCard({ label, children }: { label: string; children: ReactNode }) { return (
{label}
{children}
); } export function ValueRenderersDemo() { return (
{/* Text & Content */}
{/* Numbers */}
{/* Selection */}
{/* Date & Time */}
{/* Toggle */}
{/* Users & Relations */}
{/* Contact */}
{/* Visual */}
{/* Files & Media */}
{/* Structure */}
{/* System */}
); } ``` ## Installation ```bash pnpm dlx @docyrus/cli add @docyrus/ui-value-renderers ``` **Dependencies:** - [lucide-react](https://www.npmjs.com/package/lucide-react) ## Usage ```tsx import { DynamicValue } from '@docyrus/ui/components/value-renderers'; import type { IField, DocyrusValueProps } from '@docyrus/ui/components/value-renderers'; const fields: IField[] = [ { id: '1', name: 'Full Name', slug: 'full_name', type: 'field-text' }, { id: '2', name: 'Priority', slug: 'priority', type: 'field-select' }, { id: '3', name: 'Status', slug: 'status', type: 'field-status' }, ]; const record = { full_name: 'Erhan ERDOGAN', priority: 'high', status: 'in_progress', __status_description: 'Working on API', }; const enumOptions = [ { id: 'low', name: 'Low', color: '#22c55e' }, { id: 'medium', name: 'Medium', color: '#f59e0b' }, { id: 'high', name: 'High', color: '#ef4444' }, ]; function RecordDetail() { return (
{fields.map((field) => ( ))}
); } ``` ### Individual Import You can import individual renderers to reduce bundle size: ```tsx import { TextValue } from '@docyrus/ui/components/value-renderers/text-value'; import { SelectValue } from '@docyrus/ui/components/value-renderers/select-value'; import { StatusValue } from '@docyrus/ui/components/value-renderers/status-value'; ``` ## Renderer Types ### Text & Content | Type | Component | Description | |------|-----------|-------------| | `field-text` | `TextValue` | Plain text display | | `field-textarea` | `TextValue` | Multi-line text (shared renderer) | | `field-display` | `TextValue` | Display-only text (shared renderer) | | `field-code` | `TextValue` | Code snippet display (shared renderer) | | `field-codeEditor` | `CodeValue` | Code block with monospace font | | `field-htmlEditor` | `RichTextValue` | Rendered HTML content | | `field-emailEditor` | `RichTextValue` | Email template preview | | `field-docEditor` | `DocEditorValue` | Document content preview | | `field-json` | `JsonValue` | JSON display with formatting | | `field-formula` | `FormulaValue` | Formula expression display | | `field-relatedField` | `RelatedFieldValue` | Related field value display | ### Numbers | Type | Component | Description | |------|-----------|-------------| | `field-number` | `NumberValue` | Formatted number display | | `field-money` | `MoneyValue` | Currency-formatted amount | | `field-percent` | `PercentValue` | Percentage display | | `field-duration` | `DurationValue` | Duration in HH:MM:SS format | | `field-rating` | `RatingValue` | Star rating display | | `field-currency` | `CurrencyCodeValue` | Currency code with symbol | ### Selection | Type | Component | Description | |------|-----------|-------------| | `field-select` | `SelectValue` | Badge with color/icon | | `field-radioGroup` | `SelectValue` | Badge display (shared renderer) | | `field-enum` | `SelectValue` | Badge display (shared renderer) | | `field-multiSelect` | `MultiSelectValue` | Multiple badges | | `field-tagSelect` | `MultiSelectValue` | Tag badges (shared renderer) | | `field-status` | `StatusValue` | Status badge with description + follow-up date | | `field-approvalStatus` | `ApprovalStatusValue` | Approval workflow badge | | `field-list` | `ListValue` | List item badge | ### Date & Time | Type | Component | Description | |------|-----------|-------------| | `field-date` | `DateValue` | Localized date display | | `field-dateTime` | `DateTimeValue` | Localized date + time display | | `field-time` | `TimeValue` | Localized time display | | `field-dateRange` | `DateRangeValue` | Date range with separator | ### Toggle | Type | Component | Description | |------|-----------|-------------| | `field-checkbox` | `CheckboxValue` | Check/X icon indicator | | `field-switch` | `SwitchValue` | On/Off text indicator | ### Users & Relations | Type | Component | Description | |------|-----------|-------------| | `field-userSelect` | `UserValue` | User avatar with name | | `field-userMultiSelect` | `UserMultiValue` | Stacked user avatars | | `field-relation` | `RelationValue` | Related record link | ### Contact | Type | Component | Description | |------|-----------|-------------| | `field-email` | `EmailValue` | Email link with icon | | `field-phone` | `PhoneValue` | Phone with country code | | `field-url` | `UrlValue` | URL link with hostname | ### Visual | Type | Component | Description | |------|-----------|-------------| | `field-color` | `ColorValue` | Color swatch supporting hex and Tailwind color tokens | | `field-icon` | `IconValue` | Rendered Docyrus icon string such as `huge ai-brain-03` | ### Files & Media | Type | Component | Description | |------|-----------|-------------| | `field-file` | `FileValue` | File name with icon | | `field-image` | `ImageValue` | Single image thumbnail or gallery thumbnail group | | `field-avatar` | `AvatarValue` | Avatar thumbnail | ### Structure | Type | Component | Description | |------|-----------|-------------| | `field-taskList` | `TaskListValue` | Checklist progress | | `field-todo` | `TodoValue` | Todo item count | | `field-inlineData` | `InlineDataValue` | Inline data row count | | `field-locationSelect` | `LocationValue` | Address with map pin | ### System | Type | Component | Description | |------|-----------|-------------| | `field-identity` | `IdentityValue` | Identity hash display | | `field-autonumber` | `IdentityValue` | Auto-number display | | `field-button` | `ButtonValue` | Action button label | | `field-conversationChannel` | `ConversationChannelValue` | Channel name | | `field-fileStorageFolder` | `FileStorageFolderValue` | Folder name | ## API Reference ### DynamicValue Dispatcher component that renders the correct value renderer based on `field.type`. Notes: - `ColorValue` accepts hex values and Tailwind-style tokens such as `emerald-500`. - `IconValue` expects a Docyrus icon string, for example `huge ai-brain-03`. - `ImageValue` accepts either a single `{ file_name, signed_url }` object or an array of those objects for gallery-style output. ```tsx ``` ### DocyrusValueProps All value renderer components share this interface: | Prop | Type | Default | Description | |------|------|---------|-------------| | `field` | `IField` | — | Field configuration from the data source | | `value` | `unknown` | — | The field value to display | | `record` | `Record` | — | Full record for accessing companion columns | | `enumOptions` | `EnumOption[]` | `[]` | Options for select-based fields | | `className` | `string` | — | Additional CSS class | ### IField | Field | Type | Description | |-------|------|-------------| | `id` | `string` | Unique field identifier | | `name` | `string` | Display label | | `slug` | `string` | Record key for accessing the value | | `type` | `IFieldType` | Field type — determines which renderer is used | | `defaultValue` | `string \| null` | Default value | | `validations` | `string[] \| null` | Validation rules | | `readOnly` | `boolean \| null` | Read-only flag | ### EnumOption | Field | Type | Description | |-------|------|-------------| | `id` | `string` | Option identifier | | `name` | `string` | Display label | | `color` | `string` | Color indicator (hex) | | `icon` | `string` | Docyrus icon name | | `slug` | `string` | Slug value | | `sort_order` | `number` | Display order |