code-review
Use to review code changes with a two-stage process - first checking spec/requirements…
Use when writing or editing React/TSX in `openmetadata-ui/src/main/resources/ui/src/` or `openmetadata-ui-core-components/`, before reaching for a raw `<div>` + Tailwind utility classes to build layout (flex rows/columns, grids, bordered panels with header/body/footer,
$ npx -y skills add open-metadata/OpenMetadata --skill ui-core-components --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/ui-core-componentsContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when writing or editing React/TSX in `openmetadata-ui/src/main/resources/ui/src/` or `openmetadata-ui-core-components/`, before reaching for a raw `<div>` + Tailwind utility classes to build layout (flex rows/columns, grids, bordered panels with header/body/footer,
name: ui-core-components description: Use when writing or editing React/TSX in `openmetadata-ui/src/main/resources/ui/src/` or `openmetadata-ui-core-components/`, before reaching for a raw `<div>` + Tailwind utility classes to build layout (flex rows/columns, grids, bordered panels with header/body/footer, separators), and before writing any Tailwind color class (`tw:bg-*`, `tw:text-*`, `tw:border-*`) or hex color value. Applies whenever the change adds or restructures a layout container or touches color/dark-mode styling, not to every div. user-invocable: true argument-hint: "[component name to look up, e.g. Box, Grid, Card, Divider]" allowed-tools: - Read - Grep - Glob
`@openmetadata/ui-core-components` ships layout primitives that replace common `<div className="tw:flex ...">` / `<div className="tw:grid ...">` patterns. 383+ files in `openmetadata-ui` already import from this package. Baseline testing shows agents default to raw `div` + Tailwind for layout unless told these exist — check this table before writing layout markup.
Only **layout container** divs (the ones whose `className` is mostly `flex`/`grid`/`gap`/`items-*`/`justify-*`/border-as-separator) go through a primitive. Leave alone: single non-layout divs, text wrappers, spans, icon wrappers, and anything built from antd/other external library form components — this is not a "replace every div" rule.
| Raw pattern | Use instead | |---|---| | `<div className="tw:flex ...">` (row) | `<Box>` | | `<div className="tw:flex tw:flex-col ...">` | `<Box direction="col">` | | `<div className="tw:grid ...">` with column spans | `<Grid>` + `<Grid.Item span={n} start={n}>` | | Bordered container with a title/actions row, body, footer row | `<Card>` + `<Card.Header title=.. extra=..>` / `<Card.Content>` / `<Card.Footer>` | | `<hr>` or `<div className="tw:h-px tw:bg-...">` separator, optionally with a centered label | `<Divider>` (`orientation`, `label`, `labelAlign`) |
Import from the package root:
import { Box, Card, Divider, Grid } from '@openmetadata/ui-core-components';`Box` renders a `flex` (or `inline-flex`) div. Layout goes through props, not `className`:
`className` is still accepted for one-off overrides (margins, borders, backgrounds) — use it for what isn't a layout-direction/gap concern, not to re-add `tw:flex`.
Real usage, `openmetadata-ui/src/main/resources/ui/src/components/DomainListing/DomainListPage.tsx:310-342`:
<Box direction="col" style={isTreeView ? { height: 'calc(100vh - 80px)' } : {}}>
<HeaderBreadcrumb items={[...]} />
{pageHeader}
<Card style={{ marginBottom: 20 }} variant="elevated">
<Box
className="tw:px-6 tw:py-4 tw:border-b tw:border-secondary"
direction="col"
gap={4}>
<Box align="center" direction="row" gap={5}>
{titleAndCount}
{search}
{!isTreeView && quickFilters}
<Box className="tw:ml-auto" />
{viewToggle}
{deleteIconButton}
</Box>
{!isTreeView && filterSelectionDisplay}
</Box>
{content}
</Card>
</Box>24-column grid. `Grid` takes `gap`/`rowGap`/`colGap` (scale `0`–`12`). `Grid.Item` takes `span` (default 24 = full width) and optional `start` (1-indexed column); both are clamped to the 24-column track.
<Grid gap="4">
<Grid.Item span={16}>{main}</Grid.Item>
<Grid.Item span={8}>{sidebar}</Grid.Item>
</Grid>`variant`: `default | elevated | outlined | ghost`. `color`: `default | brand | brandOutlined | error | warning | success`. `size`: `sm | md | lg` (controls `Card.Header`/`Card.Content`/`Card.Footer` padding). `isClickable` / `isSelected` add interactive/selected styling.
<Card isClickable variant="elevated">
<Card.Header extra={<Button>Edit</Button>} subtitle="Updated 2h ago" title="orders" />
<Card.Content>{body}</Card.Content>
<Card.Footer>{footerActions}</Card.Footer>
</Card>`orientation`: `horizontal | vertical` (default horizontal). `label` + `labelAlign` (`start | center | end`) render a labeled separator instead of a plain line.
<Divider label="or" labelAlign="center" /> <Divider orientation="vertical" />
Never write a raw Tailwind palette class (`tw:bg-gray-50`, `tw:text-red-600`, `tw:border-blue-500`, ...) or a hardcoded hex value (`style={{ color: '#1570ef' }}`). Use the semantic color tokens instead — they remap automatically in dark mode via the `.dark-mode` class, raw palette classes do not.
**REQUIRED REFERENCE:** read `openmetadata-ui/src/main/resources/ui/docs/colors.md` before writing or reviewing any color class — it has the full token table (backgrounds, text, borders, foreground/icon, utility/badge colors) plus a `dark-gray-red-green` → semantic-token cheat sheet. Highlights:
| Raw pattern | Use instead | |---|---| | `tw:bg-white` / `tw:bg-gray-50` | `tw:bg-primary` / `tw:bg-secondary` | | `tw:text-gray-900` / `tw:text-gray-500` | `tw:text-primary` / `tw:text-quaternary` | | `tw:border-gray-300` | `tw:border-primary` | | `tw:text-red-600` / `tw:border-red-500` | `tw:text-error-primary` / `tw:border-error` | | `tw:bg-green-50 tw:text-green-700` (badge) | `tw:bg-utility-success-50 tw:text-utility-success-700` | | `style={{ color: '#1570ef' }}` | `tw:text-fg-brand-primary` |
Icons use `tw:text-fg-*` tokens, not `tw:text-*` — foreground tokens are tuned for icon contrast, text tokens aren't.
After using these, run the `
The Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.
Repo: open-metadata/OpenMetadata
Use to review code changes with a two-stage process - first checking spec/requirements…
Deep reliability audit for OpenMetadata connectors — runs 7 investigation prompts (metadata,…
Build a new OpenMetadata connector from scratch — scaffold JSON Schema, Python boilerplate,…
Review an OpenMetadata connector against golden standards. Runs multi-agent analysis covering…
Load all OpenMetadata connector development standards into context. Use before building or…
Set up, verify, or repair a local OpenMetadata development environment on macOS or Linux.…