Components

DefinitionBrowser

Tabbed browser for exploring semantic models, metrics, and dimensions with search.

Category: DI Domain / Composite

Import

import {
  DefinitionBrowser,
  type DefinitionBrowserProps,
  type DiSemanticModel,
  type DiMetric,
  type DiDimension,
  type BrowserTab,
} from "@hareru/ui"

Exports

NameTypeDescription
DefinitionBrowserComponentDefinition browser panel
DefinitionBrowserPropsTypeProps interface
DiSemanticModelTypeSemantic model definition
DiMetricTypeMetric definition
DiDimensionTypeDimension definition
BrowserTabType"models" | "metrics" | "dimensions"

Key Props

PropTypeDefaultDescription
modelsDiSemanticModel[][]Semantic model list
metricsDiMetric[][]Metric list
dimensionsDiDimension[][]Dimension list
loadingbooleanfalseLoading state (shows skeleton)
errorstringError message
defaultTabBrowserTab"models"Initial active tab
onSelectModel(model: DiSemanticModel) => voidModel selection handler
onSelectMetric(metric: DiMetric) => voidMetric selection handler
onSelectDimension(dimension: DiDimension) => voidDimension selection handler

Types

interface DiSemanticModel {
  name: string
  description?: string
  metricCount?: number
  dimensionCount?: number
  validationStatus?: "valid" | "invalid" | "pending"
}

interface DiMetric {
  name: string
  description?: string
  semanticModelName: string
  aiContext?: string
}

interface DiDimension {
  name: string
  description?: string
  semanticModelName: string
  datasetName?: string
  isTime?: boolean
}

States

StateTypeValuesDefaultCSS Reflection
loadingboolean

Accessibility

  • ARIA attributes: aria-label, aria-selected
  • Keyboard:
    • Tab to navigate definitions
    • Enter to select definition
  • Live region: Yes (screen readers announce changes automatically)

Usage

import { DefinitionBrowser } from "@hareru/ui"

<DefinitionBrowser
  models={[
    {
      name: "smb_sales",
      description: "SMB sales model",
      metricCount: 5,
      dimensionCount: 12,
      validationStatus: "valid",
    },
  ]}
  metrics={[
    {
      name: "total_amount",
      description: "Total sales amount",
      semanticModelName: "smb_sales",
    },
  ]}
  dimensions={[
    {
      name: "order_date",
      description: "Order date",
      semanticModelName: "smb_sales",
      isTime: true,
    },
  ]}
  defaultTab="metrics"
  onSelectMetric={(metric) => console.log("Selected:", metric)}
/>

Notes

  • Three tabs: Models, Metrics, Dimensions — each with a count badge.
  • Built-in text search filters items by name and description.
  • Model items show a validation badge (Validated, Error, Validating).
  • Dimension items show a "Time" tag when isTime is true.
  • Tab navigation uses role="tablist" / role="tab" / role="tabpanel" for accessibility.
  • Designed for use with DI MCP list_semantic_models, list_metrics, and list_dimensions tool outputs.

On this page