Login.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <script setup lang="ts">
  2. import type {HTMLAttributes} from "vue"
  3. import {Rocket, CircleCheckBig, ArrowUpIcon, Loader2} from "lucide-vue-next"
  4. import {cn} from '@/Packages/Shadcn/Lib/utils'
  5. import {Button} from '@/Packages/Shadcn/Components/ui/button'
  6. import {
  7. Card,
  8. CardContent,
  9. CardDescription,
  10. CardHeader,
  11. CardTitle,
  12. } from '@/Packages/Shadcn/Components/ui/card'
  13. import {Input} from '@/Packages/Shadcn/Components/ui/input'
  14. import {Label} from '@/Packages/Shadcn/Components/ui/label'
  15. import {Alert, AlertDescription} from "@/Packages/Shadcn/Components/ui/alert"
  16. import {Form} from '@inertiajs/vue3'
  17. const props = defineProps<{
  18. class?: HTMLAttributes["class"],
  19. status?: String
  20. }>()
  21. </script>
  22. <template>
  23. <div class="flex h-screen w-full items-center justify-center px-4">
  24. <div class="min-w-[400px]" :class="cn('flex flex-col gap-6', props.class)">
  25. <Alert variant="positive" v-if="status">
  26. <CircleCheckBig class="h-4 w-4"/>
  27. <AlertDescription>{{ status }}</AlertDescription>
  28. </Alert>
  29. <Card>
  30. <CardHeader>
  31. <CardTitle>Вход в аккаунт</CardTitle>
  32. <CardDescription>Введите Ваш Email, чтобы войти в аккаунт</CardDescription>
  33. </CardHeader>
  34. <CardContent>
  35. <Form :action="route('login')" method="post" :show-progress="false" disable-while-processing
  36. :resetOnError="['password']" #default="{ errors, processing, isDirty }">
  37. <div class="flex flex-col gap-6">
  38. <div class="grid gap-3">
  39. <Label for="email" class="cursor-pointer">Email</Label>
  40. <Input
  41. id="email"
  42. name="email"
  43. type="email"
  44. placeholder="email@example.com"
  45. required
  46. />
  47. <div class="text-destructive/90 text-sm" v-if="errors.email">
  48. {{ errors.email }}
  49. </div>
  50. </div>
  51. <div class="grid gap-3">
  52. <div class="flex items-center">
  53. <Label for="password" class="cursor-pointer">Пароль</Label>
  54. </div>
  55. <Input id="password" type="password" name="password" required/>
  56. <div class="text-destructive/90 text-sm" v-if="errors.password">
  57. {{ errors.password }}
  58. </div>
  59. </div>
  60. <div class="flex flex-col gap-3">
  61. <Button type="submit" class="w-full cursor-pointer" :disabled="!isDirty || processing">
  62. <template v-if="!processing">
  63. <span>Войти</span>
  64. </template>
  65. <template v-else>
  66. <Loader2 class="w-4 h-4 animate-spin"/>
  67. Авторизация
  68. </template>
  69. </Button>
  70. </div>
  71. </div>
  72. </Form>
  73. </CardContent>
  74. </Card>
  75. </div>
  76. </div>
  77. </template>