CentercodeDitto
DittoPorygonAPI

Taxonomy Block

Generic Type → Item hierarchy pattern for User Segments, Traits, and more

Overview

A flexible taxonomy system for managing hierarchical Type → Item relationships. Used for User Segments, Project Traits, and any domain requiring categorization with inheritance.

Features

  • Two-level hierarchy: Types (categories) and Items (entries)
  • Source tracking: Platform, Program, or Project level
  • Visual card grids with counts and source indicators
  • Multi-select interface with grouped organization
  • Integrated PrettyDesigner support for rich visual customization

Examples

TaxonomySelector

Multi-select interface with type grouping and source indicators

TaxonomyTypeCardGrid

Visual card grid for taxonomy types with source badges and counts

Industry

Business sectors and verticals

4items
Platform
Platform

Role

Job functions and responsibilities

3items
Program
Program

Experience

Skill and experience levels

2items
Program
Program

TaxonomyItemCardGrid

Visual card grid for taxonomy items with source project badges

Healthcare

Medical and healthcare industry professionals

42items
Created from Beta Program 2024
Beta Program 2024

Finance

Banking and financial services

28items

Developer

Software engineers and developers

156items

Designer

UX/UI and product designers

34items
Created from Design System v3
Design System v3

Props

TaxonomyTypeSheet / TaxonomyItemSheet

PropTypeDefaultDescription
openbooleanrequiredWhether the sheet is open
onOpenChange(open: boolean) => voidrequiredCalled when open state changes
type / itemTaxonomyType | TaxonomyItem | null-Entity to edit (null for create mode)
onSubmit(data) => Promise<{ success: boolean; error?: string }>requiredForm submission handler
onSuccess() => void-Called after successful submission
entityNamestringrequiredDisplay name (e.g., "Segment", "Trait")
i18nNamespacestring'taxonomy'Override i18n namespace
showAiContextbooleantrueShow AI context field (item sheet only)

TaxonomyTypeCardGrid / TaxonomyItemCardGrid

PropTypeDefaultDescription
types / itemsTaxonomyType[] | TaxonomyItem[]requiredArray of entities to display
onTypeClick / onItemClick(entity) => void-Called when card is clicked
onEditClick(entity) => void-Called when edit action is clicked
onDeleteClick(entity) => void-Called when delete action is clicked
entityNamestringrequiredDisplay name for empty states
showCountsbooleantrueShow item/assignment counts
showSourceboolean-Show Platform/Program badge (types only)
showSourceProjectboolean-Show source project badge (items only)
currentProjectIdstring-Highlight current project items

TaxonomySelector

PropTypeDefaultDescription
groupsTaxonomySelectorGroup[]requiredTaxonomy types with nested items
selectedstring[]requiredArray of selected item IDs
onChange(ids: string[]) => voidrequiredCalled when selection changes
entityNamestringrequiredDisplay name for placeholders
showSourceIndicatorsboolean-Show Platform/Program badges on types
showProjectBadgesboolean-Show project source badges on items
currentProjectIdstring-Highlight current project items
disabledbooleanfalseDisable the selector

Usage

import {
  TaxonomyTypeSheet,
  TaxonomyItemSheet,
  TaxonomyTypeCardGrid,
  TaxonomyItemCardGrid,
  TaxonomySelector,
  type TaxonomyType,
  type TaxonomyItem,
} from '@/ui/blocks';

// Type Management (Level 1)
<TaxonomyTypeCardGrid
  types={segmentTypes}
  onTypeClick={(type) => router.push(`/segments/${type.slug}`)}
  onEditClick={(type) => openEditSheet(type)}
  onDeleteClick={(type) => handleDelete(type)}
  entityName="Segment Type"
  showCounts
  showSource
/>

<TaxonomyTypeSheet
  open={sheetOpen}
  onOpenChange={setSheetOpen}
  type={editingType}
  onSubmit={handleSubmit}
  onSuccess={refreshData}
  entityName="Segment Type"
/>

// Item Management (Level 2)
<TaxonomyItemCardGrid
  items={segments}
  onEditClick={(item) => openEditSheet(item)}
  onDeleteClick={(item) => handleDelete(item)}
  entityName="Segment"
  showCounts
  showSourceProject
  currentProjectId={projectId}
/>

<TaxonomyItemSheet
  open={sheetOpen}
  onOpenChange={setSheetOpen}
  item={editingItem}
  types={segmentTypes}
  defaultTypeId={selectedTypeId}
  onSubmit={handleSubmit}
  onSuccess={refreshData}
  entityName="Segment"
  typeEntityName="Segment Type"
  showAiContext
/>

// Selection UI
<TaxonomySelector
  groups={selectorGroups}
  selected={selectedIds}
  onChange={setSelectedIds}
  entityName="Segment"
  showSourceIndicators
  showProjectBadges
  currentProjectId={projectId}
/>