Build a Settings Page with React and Tailwind CSS v4
Build a clean, accessible settings page with tabbed sections, form controls, toggle switches, and a save bar — using Ninna UI components.
Settings pages are harder than they look
A settings page seems simple, but it involves tabs, form state, validation, toggle switches, and a save mechanism. Getting all of this accessible — keyboard navigation through tabs, proper form labels, focus management — is where most implementations fall short. Ninna UI handles the accessibility layer so you can focus on the data.
1. Tabbed sections with Tabs
Use the Tabs component from @ninna-ui/navigation for section switching. Arrow-key navigation and ARIA tab semantics are built in:
import { Tabs } from "@ninna-ui/navigation";
<Tabs defaultValue="profile">
<Tabs.List>
<Tabs.Trigger value="profile">Profile</Tabs.Trigger>
<Tabs.Trigger value="security">Security</Tabs.Trigger>
<Tabs.Trigger value="notifications">Notifications</Tabs.Trigger>
</Tabs.List>
<Tabs.Content value="profile">{/* Profile form */}</Tabs.Content>
<Tabs.Content value="security">{/* Security settings */}</Tabs.Content>
<Tabs.Content value="notifications">{/* Notification prefs */}</Tabs.Content>
</Tabs>2. Form controls
Use Field, Input, Select, and Switch for accessible form controls. Each Field renders a proper label association:
import { Field, Input, Select, Switch } from "@ninna-ui/forms";
import { VStack } from "@ninna-ui/layout";
<VStack gap="4">
<Field label="Display Name"><Input defaultValue="Alice" /></Field>
<Field label="Email"><Input type="email" defaultValue="alice@example.com" /></Field>
<Field label="Timezone">
<Select defaultValue="utc">
<Select.Item value="utc">UTC</Select.Item>
<Select.Item value="est">EST</Select.Item>
</Select>
</Field>
<Field label="Email Notifications" hint="Receive product updates">
<Switch defaultChecked />
</Field>
</VStack>3. Sticky save bar
Use a sticky positioned container at the bottom of the page for the save/cancel actions:
import { Button } from "@ninna-ui/primitives";
import { HStack } from "@ninna-ui/layout";
<div className="sticky bottom-0 border-t border-base-200 bg-base-100/95 backdrop-blur p-4">
<HStack justify="end" gap="3">
<Button variant="ghost">Cancel</Button>
<Button color="primary">Save Changes</Button>
</HStack>
</div>