rhf-password-field
shuip/rhf-password-fieldFreeComponent
shuip publishes no description for this item.
Install it
npx shadcn@latest add https://shuip.plvo.dev/r/rhf-password-field.jsonSource
1'use client';23import type { Lens } from '@hookform/lenses';4import { Eye, EyeOff, InfoIcon } from 'lucide-react';5import * as React from 'react';6import { useController } from 'react-hook-form';7import { Field, FieldDescription, FieldError, FieldLabel } from '@/components/ui/field';8import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from '@/components/ui/input-group';9import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';1011export interface PasswordFieldProps extends Omit<React.ComponentProps<typeof InputGroupInput>, 'value' | 'onChange'> {12 lens: Lens<string>;13 label?: string;14 description?: string;15 tooltip?: React.ReactNode;16}1718export function PasswordField({ lens, label, description, tooltip, ...props }: PasswordFieldProps) {19 const { field, fieldState } = useController(lens.interop());20 const [showPassword, setShowPassword] = React.useState(false);21 const id = props.id ?? field.name;2223 const handleTogglePassword = React.useCallback(() => {24 setShowPassword((prev) => !prev);25 }, []);2627 return (28 <Field className='gap-2' data-invalid={fieldState.invalid}>29 {label && <FieldLabel htmlFor={id}>{label}</FieldLabel>}30 <InputGroup>31 <InputGroupInput32 {...field}33 placeholder='Enter password'34 {...props}35 id={id}36 type={showPassword ? 'text' : 'password'}37 value={field.value ?? ''}38 aria-invalid={fieldState.invalid}39 />40 <InputGroupAddon align='inline-end'>41 <InputGroupButton aria-label='Toggle password' onClick={handleTogglePassword}>42 {showPassword ? <EyeOff className='size-4' /> : <Eye className='size-4' />}43 </InputGroupButton>4445 {tooltip && (46 <Tooltip>47 <TooltipTrigger asChild>48 <InputGroupButton aria-label='Info' size='icon-xs'>49 <InfoIcon />50 </InputGroupButton>51 </TooltipTrigger>52 <TooltipContent>{tooltip}</TooltipContent>53 </Tooltip>54 )}55 </InputGroupAddon>56 </InputGroup>57 {fieldState.invalid && <FieldError className='text-xs text-left opacity-80' errors={[fieldState.error]} />}58 {description && <FieldDescription className='text-xs'>{description}</FieldDescription>}59 </Field>60 );61}
What it pulls in
npm packages
Other registry items
Files it writes
More from shuip
All 52 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| confirmation-dialogconfirmation-dialog | shuip | Components | Free | 1 dep | |
| copy-buttoncopy-button | shuip | Components | Free | 3 deps | |
| hover-revealhover-reveal | shuip | Components | Free | 1 dep | |
| rhf-address-fieldrhf-address-field | shuip | Components | Free | 5 deps · 2 files | |
| rhf-autocomplete-fieldrhf-autocomplete-field | shuip | Components | Free | 4 deps | |
| rhf-checkbox-fieldrhf-checkbox-field | shuip | Components | Free | 3 deps | |
| rhf-combobox-fieldrhf-combobox-field | shuip | Components | Free | 5 deps | |
| rhf-date-fieldrhf-date-field | shuip | Components | Free | 6 deps |
