Preference Settings

PreviousNext

A clean settings panel with various preference options including selects and toggles

Docs
mui-treasuryitem

Preview

Loading preview…
blocks/preference-settings/preference-settings.tsx
"use client";

import * as React from "react";
import Box from "@mui/material/Box";
import Typography from "@mui/material/Typography";
import Select from "@mui/material/Select";
import MenuItem from "@mui/material/MenuItem";
import Switch from "@mui/material/Switch";
import Stack from "@mui/material/Stack";
import Divider from "@mui/material/Divider";
import FormControl from "@mui/material/FormControl";
import Card from "@mui/material/Card";

interface SettingRowProps {
  title: string;
  description: string;
  children: React.ReactNode;
}

function SettingRow({ title, description, children }: SettingRowProps) {
  return (
    <Box
      sx={{
        display: "flex",
        alignItems: "flex-start",
        justifyContent: "space-between",
        py: 1.5,
        px: 1.5,
        gap: 3,
      }}
    >
      <Box sx={{ flex: 1 }}>
        <Typography variant="body1" sx={{ mb: 0.5 }}>
          {title}
        </Typography>
        <Typography variant="body2" sx={{ color: "text.secondary" }}>
          {description}
        </Typography>
      </Box>
      <Box sx={{ display: "flex", alignItems: "center" }}>{children}</Box>
    </Box>
  );
}

export default function PreferenceSettings() {
  const [startupView, setStartupView] = React.useState("dashboard");
  const [autoFormat, setAutoFormat] = React.useState(true);
  const [weekStart, setWeekStart] = React.useState("monday");
  const [showAvatars, setShowAvatars] = React.useState(false);

  return (
    <Card>
      <Stack divider={<Divider />} sx={{ bgcolor: "background.paper" }}>
        <SettingRow
          title="Week starts on"
          description="Choose which day begins your calendar week"
        >
          <FormControl size="small">
            <Select
              value={weekStart}
              onChange={(e) => setWeekStart(e.target.value)}
              variant="outlined"
              aria-label="Week starts on"
              aria-describedby="week-start-description"
              sx={{ minWidth: 150 }}
            >
              <MenuItem value="sunday">Sunday</MenuItem>
              <MenuItem value="monday">Monday</MenuItem>
              <MenuItem value="tuesday">Tuesday</MenuItem>
              <MenuItem value="wednesday">Wednesday</MenuItem>
              <MenuItem value="thursday">Thursday</MenuItem>
              <MenuItem value="friday">Friday</MenuItem>
              <MenuItem value="saturday">Saturday</MenuItem>
            </Select>
          </FormControl>
        </SettingRow>

        <SettingRow
          title="Auto-format text"
          description="Automatically format text patterns like URLs and mentions"
        >
          <Switch
            checked={autoFormat}
            onChange={(e) => setAutoFormat(e.target.checked)}
            color="primary"
            aria-label="Auto-format text"
            aria-describedby="auto-format-description"
          />
        </SettingRow>

        <SettingRow
          title="Default startup page"
          description="Choose which page appears when you launch the application"
        >
          <FormControl size="small">
            <Select
              value={startupView}
              onChange={(e) => setStartupView(e.target.value)}
              variant="outlined"
              aria-label="Default startup page"
              aria-describedby="startup-page-description"
              sx={{ minWidth: 150 }}
            >
              <MenuItem value="dashboard">Dashboard</MenuItem>
              <MenuItem value="projects">Projects</MenuItem>
              <MenuItem value="calendar">Calendar</MenuItem>
              <MenuItem value="messages">Messages</MenuItem>
              <MenuItem value="analytics">Analytics</MenuItem>
            </Select>
          </FormControl>
        </SettingRow>

        <SettingRow
          title="Show user avatars"
          description="Display profile pictures next to usernames throughout the app"
        >
          <Switch
            checked={showAvatars}
            onChange={(e) => setShowAvatars(e.target.checked)}
            aria-label="Show user avatars"
            aria-describedby="show-avatars-description"
          />
        </SettingRow>
      </Stack>
    </Card>
  );
}

Installation

npx shadcn@latest add @mui-treasury/preference-settings

Usage

import { PreferenceSettings } from "@/components/preference-settings"
<PreferenceSettings />