val 0.3.6

An arbitrary precision calculator language
Documentation
import { Button } from '@/components/ui/button';
import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogHeader,
  DialogTitle,
} from '@/components/ui/dialog';
import { Label } from '@/components/ui/label';
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from '@/components/ui/select';
import { Switch } from '@/components/ui/switch';
import { useEditorSettings } from '@/providers/editor-settings-provider';
import { Settings } from 'lucide-react';
import { useState } from 'react';

export const EditorSettingsDialog = () => {
  const { settings, updateSettings } = useEditorSettings();

  const [settingsOpen, setSettingsOpen] = useState<boolean>(false);

  return (
    <>
      <Button
        variant='ghost'
        size='icon'
        onClick={() => setSettingsOpen(true)}
        title='Settings'
        className='h-7 w-7 cursor-pointer'
      >
        <Settings className='h-4 w-4' />
      </Button>

      <Dialog open={settingsOpen} onOpenChange={setSettingsOpen}>
        <DialogContent className='sm:max-w-[425px]'>
          <DialogHeader>
            <DialogTitle>Settings</DialogTitle>
            <DialogDescription>
              Customize your editor experience with these settings.
            </DialogDescription>
          </DialogHeader>
          <div className='grid gap-4 py-4'>
            <div className='flex items-center justify-between'>
              <Label className='text-sm font-medium'>Line numbers</Label>
              <Switch
                checked={settings.lineNumbers}
                onCheckedChange={(checked) =>
                  updateSettings({ lineNumbers: checked })
                }
              />
            </div>

            <div className='flex items-center justify-between'>
              <Label className='text-sm font-medium'>Word wrap</Label>
              <Switch
                checked={settings.lineWrapping}
                onCheckedChange={(checked) =>
                  updateSettings({ lineWrapping: checked })
                }
              />
            </div>

            <div className='flex items-center justify-between'>
              <Label className='text-sm font-medium'>Font size</Label>
              <Select
                value={settings.fontSize.toString()}
                onValueChange={(value) =>
                  updateSettings({ fontSize: parseInt(value) })
                }
              >
                <SelectTrigger className='w-28'>
                  <SelectValue placeholder='Font size' />
                </SelectTrigger>
                <SelectContent>
                  <SelectItem value='12'>12px</SelectItem>
                  <SelectItem value='14'>14px</SelectItem>
                  <SelectItem value='16'>16px</SelectItem>
                  <SelectItem value='18'>18px</SelectItem>
                </SelectContent>
              </Select>
            </div>

            <div className='flex items-center justify-between'>
              <Label className='text-sm font-medium'>Keybindings</Label>
              <Select
                value={settings.keybindings.toString()}
                onValueChange={(value) =>
                  updateSettings({ keybindings: value as 'default' | 'vim' })
                }
              >
                <SelectTrigger className='w-28'>
                  <SelectValue placeholder='Default' />
                </SelectTrigger>
                <SelectContent>
                  <SelectItem value='default'>Default</SelectItem>
                  <SelectItem value='vim'>Vim</SelectItem>
                </SelectContent>
              </Select>
            </div>

            <div className='flex items-center justify-between'>
              <Label className='text-sm font-medium'>Tab size</Label>
              <Select
                value={settings.tabSize.toString()}
                onValueChange={(value) =>
                  updateSettings({ tabSize: parseInt(value) })
                }
              >
                <SelectTrigger className='w-28'>
                  <SelectValue placeholder='Tab Size' />
                </SelectTrigger>
                <SelectContent>
                  <SelectItem value='2'>2 spaces</SelectItem>
                  <SelectItem value='4'>4 spaces</SelectItem>
                  <SelectItem value='8'>8 spaces</SelectItem>
                </SelectContent>
              </Select>
            </div>
          </div>
        </DialogContent>
      </Dialog>
    </>
  );
};