Skip to content

Component Gallery

Every component that ships on at least one platform, one live demo per platform it's actually available on, switched by the tabs — React and Web Components embed their real, already-deployed Storybook story; React Native has no web-viewable Storybook (it's a mobile/Expo app, not a browser target), so its tab shows only the usage snippet, verified on a real Simulator instead. Code blocks are syntax-highlighted with the same GNOME/Adwaita palette as the rest of this site.

This page is generated by scripts/generate-component-gallery.mjs from each package's own README/story files — re-run it after shipping a new component rather than hand-editing this file.

AboutDialog

gnome-ui.org/react — AboutDialog
import { AboutDialog } from '@gnome-ui/react';

<AboutDialog />

Full docs & controls →

ActionRow

gnome-ui.org/react — ActionRow
import { ActionRow } from '@gnome-ui/react';

<ActionRow />

Full docs & controls →

AffectedPackage

gnome-ui.org/react — AffectedPackage
import { AffectedPackage } from "@gnome-ui/react";

<AffectedPackage
  ecosystem="npm"
  name="lodash"
  version="4.17.20"
  fixedVersion="4.17.21"
/>

Full docs & controls →

AnimatedIcon

gnome-ui.org/react — AnimatedIcon
import { AnimatedIcon } from "@gnome-ui/react";
import { Syncing } from "@gnome-ui/icons";

<AnimatedIcon icon={Syncing} playing={isSyncing} label="Syncing" />

Full docs & controls →

Avatar

gnome-ui.org/react — Avatar
import { Avatar } from '@gnome-ui/react';

<Avatar />

Full docs & controls →

AvatarGroup

gnome-ui.org/react — AvatarGroup
import { AvatarGroup } from '@gnome-ui/react';

<AvatarGroup />

Full docs & controls →

AvatarRotator

gnome-ui.org/react — AvatarRotator
import { AvatarRotator } from '@gnome-ui/react';

<AvatarRotator />

Full docs & controls →

Badge

gnome-ui.org/react — Badge
import { Badge } from '@gnome-ui/react';

<Badge />

Full docs & controls →

gnome-ui.org/react — Banner
import { Banner } from '@gnome-ui/react';

<Banner />

Full docs & controls →

Bin

gnome-ui.org/react — Bin
import { Bin } from '@gnome-ui/react';

<Bin />

Full docs & controls →

Blockquote

gnome-ui.org/react — Blockquote
import { Blockquote } from '@gnome-ui/react';

<Blockquote />

Full docs & controls →

BottomSheet

gnome-ui.org/react — BottomSheet
import { BottomSheet } from '@gnome-ui/react';

<BottomSheet />

Full docs & controls →

BottomTabBar

import { BottomTabBar } from '@gnome-ui/react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';

const insets = useSafeAreaInsets();

<BottomTabBar
  items={[
    { value: 'home', label: 'Home', icon: HomeOutline, activeIcon: HomeFilled },
    { value: 'search', label: 'Search', icon: Search },
    { value: 'profile', label: 'Profile', icon: Person, badge: true },
  ]}
  value={tab}
  onChange={setTab}
  bottomInset={insets.bottom}
/>

No web-viewable Storybook for this platform — verified on a real iOS Simulator instead. See the React Native package's own README.

Box

import { Box } from '@gnome-ui/react';

<Box />

Live demo unavailable — couldn't find a deployed Storybook story for this component.

BoxedList

gnome-ui.org/react — BoxedList
import { BoxedList } from '@gnome-ui/react';

<BoxedList />

Full docs & controls →

BreakpointBin

gnome-ui.org/react — BreakpointBin
import { BreakpointBin } from '@gnome-ui/react';

<BreakpointBin />

Full docs & controls →

Button

gnome-ui.org/react — Button
import { Button } from '@gnome-ui/react';

<Button />

Full docs & controls →

ButtonContent

gnome-ui.org/react — ButtonContent
import { ButtonContent } from '@gnome-ui/react';

<ButtonContent />

Full docs & controls →

ButtonRow

gnome-ui.org/react — ButtonRow
import { ButtonRow } from '@gnome-ui/react';

<ButtonRow />

Full docs & controls →

Calendar

gnome-ui.org/react — Calendar
<Calendar defaultView="years" max={new Date()} onViewChange={(view) => console.log(view)} />

Full docs & controls →

CalendarRange

gnome-ui.org/react — CalendarRange
import { CalendarRange } from '@gnome-ui/react/components/CalendarRange';

function Example() {
  const [range, setRange] = useState<DateRange>({ start: null, end: null });
  return <CalendarRange value={range} onChange={setRange} />;
}

Full docs & controls →

Callout

gnome-ui.org/react — Callout
import { Callout } from '@gnome-ui/react';

<Callout>Changes are saved automatically.</Callout>
<Callout variant="warning">This action can't be undone.</Callout>
<Callout variant="tip">Press Ctrl+K to open the command palette.</Callout>

Full docs & controls →

Card

gnome-ui.org/react — Card
import { Card } from '@gnome-ui/react';

<Card />

Full docs & controls →

gnome-ui.org/react — Carousel
<Carousel visibleSlides={{ base: 3, wide: 2, narrow: 1 }} peek={{ base: 32, narrow: 0 }} />

Full docs & controls →

Checkbox

gnome-ui.org/react — Checkbox
import { Checkbox } from '@gnome-ui/react';

<Checkbox />

Full docs & controls →

CheckRow

gnome-ui.org/react — CheckRow
import { CheckRow } from '@gnome-ui/react';

<CheckRow />

Full docs & controls →

Chip

gnome-ui.org/react — Chip
import { Chip } from '@gnome-ui/react';

<Chip />

Full docs & controls →

ChoiceCardGroup

gnome-ui.org/react — ChoiceCardGroup
import { useState } from 'react';
import { ChoiceCardGroup } from '@gnome-ui/react';

const [plan, setPlan] = useState('personal');

<ChoiceCardGroup
  label="Account type"
  value={plan}
  onChange={setPlan}
  options={[
    { value: 'personal', title: 'Personal', description: 'For individual use' },
    { value: 'team', title: 'Team', description: 'For small groups' },
    { value: 'enterprise', title: 'Enterprise', description: 'Advanced controls and support' },
  ]}
/>

Full docs & controls →

Clamp

gnome-ui.org/react — Clamp
import { Clamp } from '@gnome-ui/react';

<Clamp />

Full docs & controls →

CoachMark

gnome-ui.org/react — CoachMark
import { useRef, useState } from 'react';
import { CoachMark } from '@gnome-ui/react/components/CoachMark';

function Example() {
  const target = useRef<HTMLButtonElement>(null);
  const [open, setOpen] = useState(true);

  return (
    <>
      <button ref={target}>Sync</button>
      <CoachMark
        open={open}
        targetRef={target}
        title="Sync your files"
        description="Press this to keep every device up to date."
        primaryAction={{ label: 'Got it', onClick: () => setOpen(false) }}
        onDismiss={() => setOpen(false)}
      />
    </>
  );
}

Full docs & controls →

CodeBlock

gnome-ui.org/react — CodeBlock
import { CodeBlock } from '@gnome-ui/react';

<CodeBlock
  filename="config.yaml"
  language="YAML"
  lineNumbers
  code={`server:\n  port: 8080\n  host: 0.0.0.0`}
/>

Full docs & controls →

ColorPicker

gnome-ui.org/react — ColorPicker
import { ColorPicker, GNOME_PALETTE } from "@gnome-ui/react";

const [color, setColor] = useState("#3584e4");

<ColorPicker value={color} onChange={setColor} />
<ColorPicker value={color} onChange={setColor} allowCustom />

Full docs & controls →

ColumnView

gnome-ui.org/react — ColumnView
import { ColumnView } from '@gnome-ui/react';

<ColumnView />

Full docs & controls →

ComboRow

gnome-ui.org/react — ComboRow
import { ComboRow } from '@gnome-ui/react';

<ComboRow />

Full docs & controls →

ContributionGraph

gnome-ui.org/react — ContributionGraph
import { ContributionGraph } from '@gnome-ui/react';

<ContributionGraph />

Full docs & controls →

CopyButton

gnome-ui.org/react — CopyButton
import { CopyButton } from '@gnome-ui/react';

<CopyButton value="CVE-2024-3094" label="Copy CVE ID" />

Full docs & controls →

CopyField

gnome-ui.org/react — CopyField
import { CopyField } from '@gnome-ui/react';

<CopyField label="API key" value="sk-live-4242424242424242" />
<CopyField label="Webhook URL" value="https://example.com/hooks/abc123" monospace={false} />

Full docs & controls →

CountDownTimer

gnome-ui.org/react — CountDownTimer
import { CountDownTimer } from '@gnome-ui/react';

<CountDownTimer />

Full docs & controls →

CveIdentifier

gnome-ui.org/react — CveIdentifier
import { CveIdentifier } from "@gnome-ui/react";

<CveIdentifier cveId="CVE-2024-3094" />
<CveIdentifier cveId="CVE-2024-3094" source="nvd" />
<CveIdentifier cveId="CVE-2024-3094" link={false} />

Full docs & controls →

CvssScore

gnome-ui.org/react — CvssScore
import { CvssScore } from "@gnome-ui/react";

<CvssScore score={9.8} />
<CvssScore score={0} severity="minimal" />

Full docs & controls →

CvssVector

gnome-ui.org/react — CvssVector
import { CvssVector } from "@gnome-ui/react";

<CvssVector vector="CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" />

Full docs & controls →

CweIdentifier

gnome-ui.org/react — CweIdentifier
import { CweIdentifier } from "@gnome-ui/react";

<CweIdentifier cweId="CWE-79" />

Full docs & controls →

DatePicker

gnome-ui.org/react — DatePicker
import { DatePicker } from '@gnome-ui/react/components/DatePicker';

function Example() {
  const [date, setDate] = useState<Date | null>(null);
  return <DatePicker label="Start date" value={date} onChange={setDate} />;
}

Full docs & controls →

DateRangePicker

gnome-ui.org/react — DateRangePicker
import { DateRangePicker } from '@gnome-ui/react/components/DateRangePicker';

function Example() {
  const [range, setRange] = useState<DateRange | null>(null);
  return <DateRangePicker label="Stay" value={range} onChange={setRange} />;
}

Full docs & controls →

Dialog

gnome-ui.org/react — Dialog
import { Dialog } from '@gnome-ui/react';

<Dialog />

Full docs & controls →

Divider

gnome-ui.org/react — Divider
import { Divider } from '@gnome-ui/react';

<Divider>OR</Divider>
<Divider>Continue with</Divider>
<Divider />

Full docs & controls →

Drawer

gnome-ui.org/react — Drawer
import { Drawer } from '@gnome-ui/react';

<Drawer />

Full docs & controls →

gnome-ui.org/react — Dropdown
import { Dropdown } from '@gnome-ui/react';

<Dropdown />

Full docs & controls →

EmojiPicker

gnome-ui.org/react — EmojiPicker
import { EmojiPicker, IconButton } from '@gnome-ui/react';
import { EmojiObjects } from '@gnome-ui/icons';

<EmojiPicker onSelect={(emoji) => console.log(emoji)}>
  <IconButton icon={EmojiObjects} label="Insert emoji" tooltip="Insert emoji" />
</EmojiPicker>

Full docs & controls →

EntryRow

gnome-ui.org/react — EntryRow
import { EntryRow } from '@gnome-ui/react';

<EntryRow />

Full docs & controls →

Expander

gnome-ui.org/react — Expander
import { Expander } from '@gnome-ui/react';

<Expander label="Show advanced options">
  <TextField label="Custom endpoint" />
</Expander>

Full docs & controls →

ExpanderRow

gnome-ui.org/react — ExpanderRow
import { ExpanderRow } from '@gnome-ui/react';

<ExpanderRow />

Full docs & controls →

FieldGroup

gnome-ui.org/react — FieldGroup
import { FieldGroup, RadioButton } from '@gnome-ui/react';

<FieldGroup label="Notification method" helperText="Choose how you want to be notified.">
  <label style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
    <RadioButton name="notify" value="email" /> Email
  </label>
  <label style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
    <RadioButton name="notify" value="sms" /> SMS
  </label>
</FieldGroup>

Full docs & controls →

FileDropZone

gnome-ui.org/react — FileDropZone
import { FileDropZone } from '@gnome-ui/react';

<FileDropZone
  onFilesSelected={(files) => upload(files)}
  onError={(message) => showToast(message)}
  accept="image/*"
  maxSize={5 * 1024 * 1024}
  helperText="PNG or JPG, up to 5 MB"
/>

Full docs & controls →

FileTypeIcon

gnome-ui.org/react — FileTypeIcon
import { FileTypeIcon } from '@gnome-ui/react';

<FileTypeIcon name="report.pdf" />
<FileTypeIcon mimeType="image/png" />
<FileTypeIcon name="cover.jpg" thumbnail={thumbnailUrl} />
<FileTypeIcon isFolder />

Full docs & controls →

FilterableMultiSelectDropdown

gnome-ui.org/react — FilterableMultiSelectDropdown
import { useState } from 'react';
import { FilterableMultiSelectDropdown } from '@gnome-ui/react';

const [countries, setCountries] = useState<string[]>(['us']);

<FilterableMultiSelectDropdown
  aria-label="Countries"
  options={[
    { value: 'us', label: 'United States' },
    { value: 'gb', label: 'United Kingdom' },
    { value: 'de', label: 'Germany' },
  ]}
  value={countries}
  onChange={setCountries}
/>

Full docs & controls →

FontPicker

gnome-ui.org/react — FontPicker
import { useState } from 'react';
import { FontPicker } from '@gnome-ui/react';

const [font, setFont] = useState({ family: 'Cantarell', size: 11, weight: 400 });

<FontPicker value={font} onChange={setFont} />

Full docs & controls →

gnome-ui.org/react — Footer
import { Footer } from '@gnome-ui/react';

<Footer />

Full docs & controls →

Frame

gnome-ui.org/react — Frame
import { Frame } from '@gnome-ui/react';

<Frame />

Full docs & controls →

HeaderBar

gnome-ui.org/react — HeaderBar
import { HeaderBar } from '@gnome-ui/react';

<HeaderBar />

Full docs & controls →

Highlight

gnome-ui.org/react — Highlight
import { Highlight } from '@gnome-ui/react';

<Highlight text="Preferences for accessibility" query="access" />
<Highlight text="The quick brown fox" query={['quick', 'fox']} />

Full docs & controls →

Icon

gnome-ui.org/react — Icon
<Icon icon={Search} color="blue" />
<Icon icon={Search} color="red" size="lg" />
<Icon icon={Search} /> {/* inherits currentColor */}

Full docs & controls →

IconButton

gnome-ui.org/react — IconButton
import { Search, Settings } from '@gnome-ui/icons';
import { IconButton } from '@gnome-ui/react';

<IconButton icon={Search} label="Search" />
<IconButton icon={Settings} label="Settings" variant="flat" tooltip="Open settings" />

Full docs & controls →

InlineViewSwitcher

gnome-ui.org/react — InlineViewSwitcher
import { InlineViewSwitcher } from '@gnome-ui/react';

<InlineViewSwitcher />

Full docs & controls →

Kbd

gnome-ui.org/react — Kbd
import { Kbd } from '@gnome-ui/react';

<p>Press <Kbd>Enter</Kbd> to continue.</p>
<p>Hold <Kbd>Shift</Kbd> while dragging to select multiple files.</p>

Full docs & controls →

LevelBar

gnome-ui.org/react — LevelBar
import { LevelBar } from '@gnome-ui/react';

<LevelBar value={0.82} low={0.25} high={0.9} aria-label="Disk usage" />

Full docs & controls →

gnome-ui.org/react — Link
import { Link } from '@gnome-ui/react';

<Link />

Full docs & controls →

LinkedGroup

gnome-ui.org/react — LinkedGroup
import { LinkedGroup } from '@gnome-ui/react';

<LinkedGroup />

Full docs & controls →

gnome-ui.org/web-components — Menu
<gnome-menu placement="bottom">
  <button type="button" data-slot="menu-trigger">Project options</button>

  <section data-slot="menu-content">
    <span data-slot="menu-label">Project</span>
    <button type="button" data-menu-item data-value="rename">Rename</button>
    <button type="button" data-menu-item disabled>Duplicate</button>
    <button type="button" data-menu-item data-value="archive">
      Archive
      <span data-slot="menu-shortcut" aria-hidden="true">⇧⌘A</span>
    </button>
    <hr data-slot="menu-separator" />
    <a href="/settings" data-menu-item data-value="settings">
      Project settings
    </a>
  </section>
</gnome-menu>

<script type="module">
  document.querySelector('gnome-menu').addEventListener('gnome-select', (event) => {
    if (event.detail.value === 'archive' && !window.confirm('Archive project?')) {
      event.preventDefault();
    }
  });
</script>

Full docs & controls →

gnome-ui.org/react — Modal
import { Modal } from '@gnome-ui/react';

<Modal />

Full docs & controls →

MultiSelectDropdown

gnome-ui.org/react — MultiSelectDropdown
import { useState } from 'react';
import { MultiSelectDropdown } from '@gnome-ui/react';

const [languages, setLanguages] = useState<string[]>(['ts']);

<MultiSelectDropdown
  aria-label="Languages"
  options={[
    { value: 'js', label: 'JavaScript' },
    { value: 'ts', label: 'TypeScript' },
    { value: 'py', label: 'Python' },
  ]}
  value={languages}
  onChange={setLanguages}
/>

Full docs & controls →

gnome-ui.org/react — NavigationSplitView
import { NavigationSplitView } from '@gnome-ui/react';

<NavigationSplitView />

Full docs & controls →

gnome-ui.org/react — NavigationView
import { NavigationView } from '@gnome-ui/react';

<NavigationView />

Full docs & controls →

OtpInput

gnome-ui.org/react — OtpInput
import { useState } from 'react';
import { OtpInput } from '@gnome-ui/react';

const [code, setCode] = useState('');

<OtpInput
  label="Verification code"
  value={code}
  onChange={setCode}
  onComplete={(fullCode) => verify(fullCode)}
/>

Full docs & controls →

Overlay

gnome-ui.org/react — Overlay
import { Overlay } from '@gnome-ui/react';

<Overlay open={open} onDismiss={() => setOpen(false)}>
  <MyCustomPanel />
</Overlay>

Full docs & controls →

OverlaySplitView

gnome-ui.org/react — OverlaySplitView
import { OverlaySplitView } from '@gnome-ui/react';

<OverlaySplitView />

Full docs & controls →

PasswordEntryRow

gnome-ui.org/react — PasswordEntryRow
import { PasswordEntryRow } from '@gnome-ui/react';

<PasswordEntryRow />

Full docs & controls →

PasswordField

gnome-ui.org/react — PasswordField
import { PasswordField } from '@gnome-ui/react';

<PasswordField label="Password" helperText="Must be at least 8 characters." />
<PasswordField label="Confirm password" error="Passwords do not match." />
<PasswordField label="PIN" revealable={false} />

Full docs & controls →

PathBar

gnome-ui.org/react — PathBar
import { PathBar } from "@gnome-ui/react";

<PathBar
  segments={[
    { label: "Home",      path: "/home"                     },
    { label: "Documents", path: "/home/documents"           },
    { label: "Projects",  path: "/home/documents/projects"  },
  ]}
  onNavigate={(path) => navigate(path)}
/>

Full docs & controls →

Popover

gnome-ui.org/react — Popover
import { Popover } from '@gnome-ui/react';

<Popover />

Full docs & controls →

Portal

gnome-ui.org/react — Portal
import { Portal } from '@gnome-ui/react';

<Portal>
  <div role="alert">Rendered at the end of document.body</div>
</Portal>

<Portal container={someElement}>
  <div>Rendered inside someElement instead</div>
</Portal>

Full docs & controls →

PreferencesDialog

gnome-ui.org/react — PreferencesDialog
<PreferencesDialog open={open} onClose={() => setOpen(false)}>
  <PreferencesPage title="General" iconName="preferences-system-symbolic">
    <PreferencesGroup title="Appearance">
      <BoxedList>
        <SwitchRow title="Dark mode" />
      </BoxedList>
    </PreferencesGroup>
  </PreferencesPage>
</PreferencesDialog>

Full docs & controls →

PreferencesGroup

gnome-ui.org/react — PreferencesGroup
import { PreferencesGroup } from '@gnome-ui/react';

<PreferencesGroup />

Full docs & controls →

PreferencesPage

gnome-ui.org/react — PreferencesPage
import { PreferencesPage } from '@gnome-ui/react';

<PreferencesPage />

Full docs & controls →

ProgressBar

gnome-ui.org/react — ProgressBar
import { ProgressBar } from '@gnome-ui/react';

<ProgressBar />

Full docs & controls →

RadioButton

gnome-ui.org/react — RadioButton
import { RadioButton } from '@gnome-ui/react';

<RadioButton />

Full docs & controls →

RangeSlider

gnome-ui.org/react — RangeSlider
import { useState } from 'react';
import { RangeSlider } from '@gnome-ui/react';

const [range, setRange] = useState<[number, number]>([20, 80]);

<RangeSlider value={range} onChange={setRange} minLabel="Minimum price" maxLabel="Maximum price" />

Full docs & controls →

RatingStars

gnome-ui.org/react — RatingStars
import { RatingStars } from '@gnome-ui/react';

// Read-only — omit onChange
<RatingStars value={4.2} max={5} aria-label="Average rating: 4.2 out of 5" />

// Interactive — pass onChange
<RatingStars value={rating} onChange={setRating} />

Full docs & controls →

ScrollToTop

gnome-ui.org/react — ScrollToTop
import { ScrollToTop } from '@gnome-ui/react';

<ScrollToTop />

Full docs & controls →

gnome-ui.org/react — SearchBar
import { SearchBar } from '@gnome-ui/react';

<SearchBar />

Full docs & controls →

SecurityMetric

gnome-ui.org/react — SecurityMetric
import { SecurityMetric } from "@gnome-ui/react";

<SecurityMetric
  label="Critical findings"
  value={7}
  severity="critical"
  description="Require immediate triage"
  delta="+2 since last scan"
  trend="up"
/>

Full docs & controls →

SegmentedBar

gnome-ui.org/react — SegmentedBar
<SegmentedBar
  values={[
    { label: "TypeScript", value: 60, color: "#3178c6" },
    { label: "JavaScript", value: 30, color: "#f7df1e" },
    { label: "CSS",        value: 10, color: "#563d7c" },
  ]}
/>

Full docs & controls →

Separator

gnome-ui.org/react — Separator
import { Separator } from '@gnome-ui/react';

<Separator />

Full docs & controls →

SeverityBadge

gnome-ui.org/react — SeverityBadge
import { SeverityBadge } from "@gnome-ui/react";

<SeverityBadge severity="critical" />
<SeverityBadge severity="minimal" />

Full docs & controls →

ShortcutLabel

gnome-ui.org/react — ShortcutLabel
import { ShortcutLabel } from '@gnome-ui/react';

<ShortcutLabel />

Full docs & controls →

ShortcutsDialog

gnome-ui.org/react — ShortcutsDialog
import { ShortcutsDialog } from '@gnome-ui/react';

<ShortcutsDialog />

Full docs & controls →

gnome-ui.org/react — Sidebar
import { Sidebar } from '@gnome-ui/react';

<Sidebar />

Full docs & controls →

Skeleton

gnome-ui.org/react — Skeleton
import { Skeleton } from '@gnome-ui/react';

<Skeleton />

Full docs & controls →

Slider

gnome-ui.org/react — Slider
import { Slider } from '@gnome-ui/react';

<Slider />

Full docs & controls →

Spacer

gnome-ui.org/react — Spacer
import { Spacer } from '@gnome-ui/react';

<Spacer />

Full docs & controls →

SpinButton

gnome-ui.org/react — SpinButton
import { SpinButton } from '@gnome-ui/react';

<SpinButton />

Full docs & controls →

Spinner

gnome-ui.org/react — Spinner
import { Spinner } from '@gnome-ui/react';

<Spinner />

Full docs & controls →

SpinRow

gnome-ui.org/react — SpinRow
import { SpinRow } from '@gnome-ui/react';

<SpinRow />

Full docs & controls →

SplitButton

gnome-ui.org/react — SplitButton
import { SplitButton } from '@gnome-ui/react';

<SplitButton />

Full docs & controls →

StatusBadge

gnome-ui.org/react — StatusBadge
import { StatusBadge } from "@gnome-ui/react";

<StatusBadge variant="success">published</StatusBadge>
<StatusBadge variant="warning">beta</StatusBadge>
<StatusBadge variant="new">new</StatusBadge>

Full docs & controls →

StatusPage

gnome-ui.org/react — StatusPage
import { StatusPage } from '@gnome-ui/react';

<StatusPage />

Full docs & controls →

StepIndicator

gnome-ui.org/react — StepIndicator
import { StepIndicator } from '@gnome-ui/react';

<StepIndicator steps={4} currentStep={1} />
<StepIndicator steps={['Account', 'Profile', 'Confirm']} currentStep={1} />

Full docs & controls →

Switch

gnome-ui.org/react — Switch
import { Switch } from '@gnome-ui/react';

<Switch />

Full docs & controls →

SwitchRow

gnome-ui.org/react — SwitchRow
import { SwitchRow } from '@gnome-ui/react';

<SwitchRow />

Full docs & controls →

TabBar

gnome-ui.org/web-components — TabBar
<gnome-tab-bar aria-label="Settings sections">
  <button role="tab" aria-selected="true">General</button>
  <button role="tab" aria-selected="false">Notifications</button>
  <button role="tab" aria-selected="false">Privacy</button>
</gnome-tab-bar>

<script type="module">
  const tabBar = document.querySelector('gnome-tab-bar');

  tabBar.addEventListener('click', (event) => {
    const tab = event.target.closest('[role="tab"]');
    if (!tab) return;

    for (const other of tabBar.querySelectorAll('[role="tab"]')) {
      other.setAttribute('aria-selected', String(other === tab));
    }
  });
</script>

Full docs & controls →

Tabs

gnome-ui.org/react — Tabs
import { Tabs } from '@gnome-ui/react';

<Tabs />

Full docs & controls →

TagInput

gnome-ui.org/react — TagInput
import { useState } from 'react';
import { TagInput } from '@gnome-ui/react';

const [tags, setTags] = useState(['react', 'gnome']);

<TagInput label="Tags" value={tags} onChange={setTags} placeholder="Add a tag…" />

Full docs & controls →

TerminalView

gnome-ui.org/react — TerminalView
import { TerminalView } from "@gnome-ui/react";

<TerminalView lines={["$ npm install", "added 42 packages"]} />

Full docs & controls →

Text

gnome-ui.org/react — Text
import { Text } from '@gnome-ui/react';

<Text />

Full docs & controls →

TextField

gnome-ui.org/react — TextField
import { TextField } from '@gnome-ui/react';

<TextField />

Full docs & controls →

TextTruncate

gnome-ui.org/react — TextTruncate
import { TextTruncate } from '@gnome-ui/react';

<TextTruncate>A very long file name that might not fit in the sidebar.txt</TextTruncate>
<TextTruncate lines={3}>A longer description that should clamp after three lines…</TextTruncate>

Full docs & controls →

Timeline

gnome-ui.org/react — Timeline
import { Timeline } from "@gnome-ui/react";

<Timeline
  items={[
    {
      leading: <Text variant="caption" color="dim">10:32</Text>,
      icon: <Icon icon={Check} />,
      content: <Text variant="body">Document approved</Text>,
    },
  ]}
/>

Full docs & controls →

TimePicker

gnome-ui.org/react — TimePicker
import { TimePicker, type TimeValue } from '@gnome-ui/react/components/TimePicker';

function Example() {
  const [time, setTime] = useState<TimeValue | null>(null);
  return <TimePicker label="Start time" value={time} onChange={setTime} />;
}

Full docs & controls →

Toast

gnome-ui.org/react — Toast
import { Toast } from '@gnome-ui/react';

<Toast />

Full docs & controls →

ToggleGroup

gnome-ui.org/react — ToggleGroup
import { ToggleGroup } from '@gnome-ui/react';

<ToggleGroup />

Full docs & controls →

Toolbar

gnome-ui.org/react — Toolbar
import { Toolbar } from '@gnome-ui/react';

<Toolbar />

Full docs & controls →

ToolbarView

gnome-ui.org/react — ToolbarView
import { ToolbarView } from '@gnome-ui/react';

<ToolbarView />

Full docs & controls →

Tooltip

gnome-ui.org/react — Tooltip
import { Tooltip } from '@gnome-ui/react';

<Tooltip />

Full docs & controls →

ViewSwitcher

gnome-ui.org/react — ViewSwitcher
import { ViewSwitcher } from '@gnome-ui/react';

<ViewSwitcher />

Full docs & controls →

ViewSwitcherBar

gnome-ui.org/react — ViewSwitcherBar
import { ViewSwitcherBar } from '@gnome-ui/react';

<ViewSwitcherBar />

Full docs & controls →

ViewSwitcherSidebar

gnome-ui.org/react — ViewSwitcherSidebar
import { ViewSwitcherSidebar } from '@gnome-ui/react';

<ViewSwitcherSidebar />

Full docs & controls →

VisuallyHidden

gnome-ui.org/react — VisuallyHidden
import { VisuallyHidden } from '@gnome-ui/react';

<VisuallyHidden role="status" aria-live="polite">Copied to clipboard</VisuallyHidden>
<VisuallyHidden as="div" focusable>
  <a href="#main">Skip to content</a>
</VisuallyHidden>

Full docs & controls →

VulnerabilityFinding

gnome-ui.org/react — VulnerabilityFinding
import { VulnerabilityFinding } from "@gnome-ui/react";

<VulnerabilityFinding
  heading="XZ Utils backdoor"
  severity="critical"
  cveId="CVE-2024-3094"
  cvssScore={10}
  affected="xz 5.6.0"
  fixedVersion="5.6.1"
  description="Malicious build chain behavior detected in affected package versions."
/>

Full docs & controls →

VulnerabilitySummary

gnome-ui.org/react — VulnerabilitySummary
import { VulnerabilitySummary } from "@gnome-ui/react";

<VulnerabilitySummary
  counts={{
    critical: 3,
    high: 12,
    medium: 40,
    low: 8,
  }}
  description="Container image scan"
/>

Full docs & controls →

WidgetManager

gnome-ui.org/react — WidgetManager
import { WidgetManager } from '@gnome-ui/react';

<WidgetManager />

Full docs & controls →

WindowTitle

gnome-ui.org/react — WindowTitle
import { WindowTitle } from '@gnome-ui/react';

<WindowTitle />

Full docs & controls →

WrapBox

gnome-ui.org/react — WrapBox
import { WrapBox } from '@gnome-ui/react';

<WrapBox />

Full docs & controls →