studio-ui-patterns

작성자: supabase

Supabase Studio를 위한 디자인 시스템 UI 패턴입니다. 빌드하거나 업데이트할 때 사용하세요.

npx skills add https://github.com/supabase/supabase --skill studio-ui-patterns

Studio UI Patterns

The Design System docs and demos are the source of truth. Always check the relevant demo file before composing new UI.

Layout

Docs: apps/design-system/content/docs/ui-patterns/layout.mdx

Build pages with PageContainer, PageHeader, and PageSection.

Content typesize
Settings / config"default"
Lists / tables"large"
Full-screen views"full"
  • If filters/search exist on a list page, align table actions with the filters (don't use PageHeaderAside/PageSectionAside for those actions)
  • If no filters, actions can go in PageHeaderAside or PageSectionAside

Demos: page-layout-settings.tsx, page-layout-list.tsx, page-layout-list-simple.tsx, page-layout-detail.tsx (all in apps/design-system/registry/default/example/)

Forms

Docs: apps/design-system/content/docs/ui-patterns/forms.mdx

  • Use react-hook-form + zod
  • Use FormItemLayout instead of manually composing FormItem/FormLabel/FormMessage/FormDescription
  • Wrap inputs with FormControl; use _Shadcn_ imports from ui for primitives

Layout selection:

ContextLayoutContainer
Page (settings/config)FormItemLayout layout="flex-row-reverse"Card (CardContent per field; CardFooter for actions)
Side panel — wideFormItemLayout layout="horizontal"SheetSection
Side panel — narrow (size="sm" or below)FormItemLayout layout="vertical"SheetSection

Dirty state / submit:

  • Destructure isDirty from form.formState to show Cancel and disable Save
  • Show loading on submit button via loading prop
  • If submit button is outside <form>, set a stable formId and use form prop on the button

Demos: form-patterns-pagelayout.tsx, form-patterns-sidepanel.tsx

Tables

Docs: apps/design-system/content/docs/ui-patterns/tables.mdx

PatternUse when
TableSimple, static, semantic display
Data TableTanStack-powered; sorting, filtering, pagination; composed per use-case
Data GridVirtualization, column resizing, or complex cell editing
  • Actions: above the table, aligned right
  • Search/filters: above the table, aligned left
  • If table is primary content with no filters, actions can live in the page's primary/secondary actions area

Demos: table-demo.tsx, data-table-demo.tsx, data-grid-demo.tsx

Charts

Docs: apps/design-system/content/docs/ui-patterns/charts.mdx

  • Use provided chart building blocks; avoid passing raw Recharts components to ChartContent
  • Use useChart context flags for loading/disabled states
  • Keep composition straightforward — avoid over-abstraction

Demos (in apps/design-system/__registry__/default/block/): chart-composed-demo.tsx, chart-composed-basic.tsx, chart-composed-states.tsx, chart-composed-metrics.tsx, chart-composed-actions.tsx, chart-composed-table.tsx

Empty States

Docs: apps/design-system/content/docs/ui-patterns/empty-states.mdx

ScenarioPattern
Initial / onboardingPresentational empty state with value prop + clear next action
Data-heavy listsInformational empty state matching the list/table layout
Zero results from searchKeep layout consistent with data state to avoid jarring transitions
Missing routeCentered Admonition

Demos: empty-state-presentational-icon.tsx, empty-state-initial-state-informational.tsx, empty-state-zero-items-table.tsx, data-grid-empty-state.tsx, empty-state-missing-route.tsx

Navigation

Docs: apps/design-system/content/docs/ui-patterns/navigation.mdx

  • Use NavMenu for a horizontal list of related views within a consistent page layout
  • Activating an item must trigger a URL change — no local-only tab state

Cards

  • Group related information in cards
  • CardContent for sections, CardFooter for actions
  • Only use CardHeader/CardTitle when context isn't already provided by surrounding content
  • Use headers/titles when multiple cards represent distinct groups (e.g. multiple settings sections)

Alerts

  • Use Admonition to call out important actions, restrictions, or critical context
  • Place at the top of a page's content (below page title) or top of the relevant section (below section title)
  • Use sparingly

Sheets (Side Panels)

Use a Sheet when switching pages would be disruptive and the user needs to maintain context (e.g. selecting a row from a list to edit).

Structure:

  • SheetContent with size="lg" for forms needing horizontal layout
  • Use SheetHeader, SheetTitle, SheetSection, SheetFooter
  • Submit/cancel actions go in SheetFooter

Forms in sheets:

  • layout="horizontal" for wider sheets
  • layout="vertical" for narrow sheets (size="sm" or below)

Copy

Source of truth: apps/design-system/content/docs/copywriting.mdx — sentence case, title case, proper nouns, voice and tone.

When changing visible copy, grep e2e/studio/ for the old string.

supabase의 다른 스킬

studio-e2e-tests
supabase
Supabase Studio용 Playwright E2E 테스트를 작성하고 실행합니다. 요청 시 사용하세요.
official
vitest
supabase
Vite 기반의 Jest 호환 API를 갖춘 빠른 단위 테스트 프레임워크입니다. 테스트 작성, 모킹, 커버리지 구성 또는 테스트 작업 시 사용하세요.
official
skill-creator
supabase
모듈형 스킬을 생성하기 위한 종합 가이드로, 전문 지식과 워크플로우를 통해 Claude의 기능을 확장합니다. 스킬은 YAML 프론트매터와 마크다운 지침이 포함된 필수 SKILL.md 파일과, 목적별로 구성되고 컨텍스트를 절약하기 위해 점진적으로 로드되는 선택적 번들 리소스(스크립트, 참조 자료, 에셋)로 구성됩니다. 구체적인 사용 예시를 중심으로 스킬을 설계하고, 결정적 작업을 위한 재사용 가능한 스크립트, 도메인 지식을 위한 참조 파일, 에셋을 식별합니다...
official
supabase
supabase
Supabase와 관련된 모든 작업을 수행할 때 사용합니다. 트리거: Supabase 제품(데이터베이스, 인증, 엣지 함수, 실시간, 스토리지, 벡터, 크론, 큐); 클라이언트…
official
supabase-server
supabase
Supabase를 사용한 서버 측 코드 작성 시 — Edge Functions, Hono 앱, 웹훅 핸들러, 또는 Supabase 인증 및 클라이언트 생성이 필요한 모든 백엔드에서 사용합니다.
official
clickhouse-logs-queries
supabase
Write, review, and migrate Supabase logs queries against the ClickHouse-backed `logs` table (the `logs.all.otel` analytics endpoint). Use this whenever a task…
official
dev-toolbar-review
supabase
PR을 검토할 때 사용하세요. packages/dev-tools/, packages/common/posthog-client.ts 파일을 다루는 경우에 해당합니다.
official
e2e-studio-tests
supabase
Studio 앱에서 e2e 테스트를 실행합니다. e2e 테스트 실행, 스튜디오 테스트 실행, Playwright 테스트 실행, 또는 기능 테스트를 요청받았을 때 사용하세요.
official