diff --git a/.vscode/settings.json b/.vscode/settings.json index 47b2103f..b0cf9d0c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { + "typescript.tsdk": "./node_modules/typescript/lib", "eslint.experimental.useFlatConfig": true, "prettier.enable": false, "editor.formatOnSave": false, diff --git a/apps/www/__registry__/index.ts b/apps/www/__registry__/index.ts index a44f89e3..82a3c403 100644 --- a/apps/www/__registry__/index.ts +++ b/apps/www/__registry__/index.ts @@ -486,6 +486,48 @@ export const Index = { component: () => import("../src/lib/registry/default/example/InputFormAutoAnimate.vue").then((m) => m.default), files: ["../src/lib/registry/default/example/InputFormAutoAnimate.vue"], }, + "InputOtpControlled": { + name: "InputOtpControlled", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/default/example/InputOtpControlled.vue").then((m) => m.default), + files: ["../src/lib/registry/default/example/InputOtpControlled.vue"], + }, + "InputOtpDemo": { + name: "InputOtpDemo", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/default/example/InputOtpDemo.vue").then((m) => m.default), + files: ["../src/lib/registry/default/example/InputOtpDemo.vue"], + }, + "InputOtpDisabled": { + name: "InputOtpDisabled", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/default/example/InputOtpDisabled.vue").then((m) => m.default), + files: ["../src/lib/registry/default/example/InputOtpDisabled.vue"], + }, + "InputOtpForm": { + name: "InputOtpForm", + type: "components:example", + registryDependencies: ["button","form","toast","input-otp"], + component: () => import("../src/lib/registry/default/example/InputOtpForm.vue").then((m) => m.default), + files: ["../src/lib/registry/default/example/InputOtpForm.vue"], + }, + "InputOtpPattern": { + name: "InputOtpPattern", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/default/example/InputOtpPattern.vue").then((m) => m.default), + files: ["../src/lib/registry/default/example/InputOtpPattern.vue"], + }, + "InputOtpSeparatorDemo": { + name: "InputOtpSeparatorDemo", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/default/example/InputOtpSeparatorDemo.vue").then((m) => m.default), + files: ["../src/lib/registry/default/example/InputOtpSeparatorDemo.vue"], + }, "InputWithButton": { name: "InputWithButton", type: "components:example", @@ -1516,6 +1558,48 @@ export const Index = { component: () => import("../src/lib/registry/new-york/example/InputFormAutoAnimate.vue").then((m) => m.default), files: ["../src/lib/registry/new-york/example/InputFormAutoAnimate.vue"], }, + "InputOtpControlled": { + name: "InputOtpControlled", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/new-york/example/InputOtpControlled.vue").then((m) => m.default), + files: ["../src/lib/registry/new-york/example/InputOtpControlled.vue"], + }, + "InputOtpDemo": { + name: "InputOtpDemo", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/new-york/example/InputOtpDemo.vue").then((m) => m.default), + files: ["../src/lib/registry/new-york/example/InputOtpDemo.vue"], + }, + "InputOtpDisabled": { + name: "InputOtpDisabled", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/new-york/example/InputOtpDisabled.vue").then((m) => m.default), + files: ["../src/lib/registry/new-york/example/InputOtpDisabled.vue"], + }, + "InputOtpForm": { + name: "InputOtpForm", + type: "components:example", + registryDependencies: ["button","form","toast","input-otp"], + component: () => import("../src/lib/registry/new-york/example/InputOtpForm.vue").then((m) => m.default), + files: ["../src/lib/registry/new-york/example/InputOtpForm.vue"], + }, + "InputOtpPattern": { + name: "InputOtpPattern", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/new-york/example/InputOtpPattern.vue").then((m) => m.default), + files: ["../src/lib/registry/new-york/example/InputOtpPattern.vue"], + }, + "InputOtpSeparatorDemo": { + name: "InputOtpSeparatorDemo", + type: "components:example", + registryDependencies: ["input-otp"], + component: () => import("../src/lib/registry/new-york/example/InputOtpSeparatorDemo.vue").then((m) => m.default), + files: ["../src/lib/registry/new-york/example/InputOtpSeparatorDemo.vue"], + }, "InputWithButton": { name: "InputWithButton", type: "components:example", diff --git a/apps/www/package.json b/apps/www/package.json index fff425c8..60533f11 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -37,6 +37,7 @@ "vaul-vue": "^0.1.0", "vee-validate": "4.12.5", "vue": "^3.4.21", + "vue-input-otp": "^0.0.11", "vue-sonner": "^1.1.2", "vue-wrap-balancer": "^1.1.3", "zod": "^3.22.4" diff --git a/apps/www/src/content/docs/components/input-otp.md b/apps/www/src/content/docs/components/input-otp.md new file mode 100644 index 00000000..8f84183f --- /dev/null +++ b/apps/www/src/content/docs/components/input-otp.md @@ -0,0 +1,167 @@ +--- +title: Input OTP +description: Accessible one-time password component with copy paste functionality. +source: apps/www/src/lib/registry/default/ui/input-otp +primitive: https://vue-input-otp.vercel.app/ +--- + + + +## About + +Input OTP is built on top of [vue-input-otp](https://github.com/wobsoriano/vue-input-otp) by [@wobsoriano](https://github.com/wobsoriano). + +## Installation + +```bash +npx shadcn-vue@latest add input-otp +``` + +#### Update `tailwind.config` + +```js:line-numbers {6-9,12} +/** @type {import('tailwindcss').Config} */ +module.exports = { + theme: { + extend: { + keyframes: { + 'caret-blink': { + '0%,70%,100%': { opacity: '1' }, + '20%,50%': { opacity: '0' }, + }, + }, + animation: { + 'caret-blink': 'caret-blink 1.25s ease-out infinite', + }, + }, + }, +} +``` + +## Usage + +```vue + + + + + + + + + + + + + +``` + +## Examples + +### Pattern + +Use the `pattern` prop to define a custom pattern for the OTP input. + + + +```vue:line-numbers + + + + + + + + + +``` + +### Disabled + + + +```vue:line-numbers + + + + + + + + + +``` + +### Separator + +You can use the `` component to add a separator between the input groups. + + + +```vue:line-numbers {5,19} + + + + + + + + + + + + + + +``` + +### Controlled + +You can use the `v-model` prop to control the input value. + + + +### Form + + diff --git a/apps/www/src/lib/registry/default/example/InputOtpControlled.vue b/apps/www/src/lib/registry/default/example/InputOtpControlled.vue new file mode 100644 index 00000000..7efb2ce1 --- /dev/null +++ b/apps/www/src/lib/registry/default/example/InputOtpControlled.vue @@ -0,0 +1,30 @@ + + + + + + + + + + + {{ input === '' + ? 'Enter your one-time password.' + : `You entered: ${input}` + }} + + + diff --git a/apps/www/src/lib/registry/default/example/InputOtpDemo.vue b/apps/www/src/lib/registry/default/example/InputOtpDemo.vue new file mode 100644 index 00000000..d53f0f79 --- /dev/null +++ b/apps/www/src/lib/registry/default/example/InputOtpDemo.vue @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/apps/www/src/lib/registry/default/example/InputOtpDisabled.vue b/apps/www/src/lib/registry/default/example/InputOtpDisabled.vue new file mode 100644 index 00000000..d5d25f5c --- /dev/null +++ b/apps/www/src/lib/registry/default/example/InputOtpDisabled.vue @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/apps/www/src/lib/registry/default/example/InputOtpForm.vue b/apps/www/src/lib/registry/default/example/InputOtpForm.vue new file mode 100644 index 00000000..0d61ee21 --- /dev/null +++ b/apps/www/src/lib/registry/default/example/InputOtpForm.vue @@ -0,0 +1,65 @@ + + + + + + + OTP + + + + + + + + + Please enter the one-time password sent to your phone. + + + + + + Submit + + diff --git a/apps/www/src/lib/registry/default/example/InputOtpPattern.vue b/apps/www/src/lib/registry/default/example/InputOtpPattern.vue new file mode 100644 index 00000000..a3b1fb83 --- /dev/null +++ b/apps/www/src/lib/registry/default/example/InputOtpPattern.vue @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/apps/www/src/lib/registry/default/example/InputOtpSeparatorDemo.vue b/apps/www/src/lib/registry/default/example/InputOtpSeparatorDemo.vue new file mode 100644 index 00000000..1a7a0101 --- /dev/null +++ b/apps/www/src/lib/registry/default/example/InputOtpSeparatorDemo.vue @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/apps/www/src/lib/registry/default/example/PinInputFormDemo.vue b/apps/www/src/lib/registry/default/example/PinInputFormDemo.vue index 0f909a95..a315f936 100644 --- a/apps/www/src/lib/registry/default/example/PinInputFormDemo.vue +++ b/apps/www/src/lib/registry/default/example/PinInputFormDemo.vue @@ -6,7 +6,7 @@ import * as z from 'zod' import { PinInput, PinInputInput, -} from '@/lib/registry/new-york/ui/pin-input' +} from '@/lib/registry/default/ui/pin-input' import { Button } from '@/lib/registry/default/ui/button' import { FormControl, diff --git a/apps/www/src/lib/registry/default/ui/input-otp/InputOtp.vue b/apps/www/src/lib/registry/default/ui/input-otp/InputOtp.vue new file mode 100644 index 00000000..a4be4c18 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/input-otp/InputOtp.vue @@ -0,0 +1,28 @@ + + + + + + + diff --git a/apps/www/src/lib/registry/default/ui/input-otp/InputOtpGroup.vue b/apps/www/src/lib/registry/default/ui/input-otp/InputOtpGroup.vue new file mode 100644 index 00000000..a04c0ea6 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/input-otp/InputOtpGroup.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/apps/www/src/lib/registry/default/ui/input-otp/InputOtpSeparator.vue b/apps/www/src/lib/registry/default/ui/input-otp/InputOtpSeparator.vue new file mode 100644 index 00000000..fe6956b0 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/input-otp/InputOtpSeparator.vue @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/apps/www/src/lib/registry/default/ui/input-otp/InputOtpSlot.vue b/apps/www/src/lib/registry/default/ui/input-otp/InputOtpSlot.vue new file mode 100644 index 00000000..ec9b09ba --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/input-otp/InputOtpSlot.vue @@ -0,0 +1,35 @@ + + + + + + {{ char }} + + + + + + + diff --git a/apps/www/src/lib/registry/default/ui/input-otp/index.ts b/apps/www/src/lib/registry/default/ui/input-otp/index.ts new file mode 100644 index 00000000..f35eed1d --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/input-otp/index.ts @@ -0,0 +1,4 @@ +export { default as InputOtp } from './InputOtp.vue' +export { default as InputOtpGroup } from './InputOtpGroup.vue' +export { default as InputOtpSeparator } from './InputOtpSeparator.vue' +export { default as InputOtpSlot } from './InputOtpSlot.vue' diff --git a/apps/www/src/lib/registry/new-york/example/DrawerDemo.vue b/apps/www/src/lib/registry/new-york/example/DrawerDemo.vue index aec72f27..a92c3e04 100644 --- a/apps/www/src/lib/registry/new-york/example/DrawerDemo.vue +++ b/apps/www/src/lib/registry/new-york/example/DrawerDemo.vue @@ -2,7 +2,7 @@ import { ref } from 'vue' import { Minus, Plus } from 'lucide-vue-next' import { VisStackedBar, VisXYContainer } from '@unovis/vue' -import { Button } from '@/lib/registry/default/ui/button' +import { Button } from '@/lib/registry/new-york/ui/button' import { Drawer, DrawerClose, @@ -12,7 +12,7 @@ import { DrawerHeader, DrawerTitle, DrawerTrigger, -} from '@/lib/registry/default/ui/drawer' +} from '@/lib/registry/new-york/ui/drawer' const goal = ref(350) diff --git a/apps/www/src/lib/registry/new-york/example/DrawerDialog.vue b/apps/www/src/lib/registry/new-york/example/DrawerDialog.vue index 488ca7f0..8f515b51 100644 --- a/apps/www/src/lib/registry/new-york/example/DrawerDialog.vue +++ b/apps/www/src/lib/registry/new-york/example/DrawerDialog.vue @@ -1,7 +1,7 @@ + + + + + + + + + + {{ input === '' + ? 'Enter your one-time password.' + : `You entered: ${input}` + }} + + + diff --git a/apps/www/src/lib/registry/new-york/example/InputOtpDemo.vue b/apps/www/src/lib/registry/new-york/example/InputOtpDemo.vue new file mode 100644 index 00000000..663b4889 --- /dev/null +++ b/apps/www/src/lib/registry/new-york/example/InputOtpDemo.vue @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/apps/www/src/lib/registry/new-york/example/InputOtpDisabled.vue b/apps/www/src/lib/registry/new-york/example/InputOtpDisabled.vue new file mode 100644 index 00000000..553bd964 --- /dev/null +++ b/apps/www/src/lib/registry/new-york/example/InputOtpDisabled.vue @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/apps/www/src/lib/registry/new-york/example/InputOtpForm.vue b/apps/www/src/lib/registry/new-york/example/InputOtpForm.vue new file mode 100644 index 00000000..a4cb6dd2 --- /dev/null +++ b/apps/www/src/lib/registry/new-york/example/InputOtpForm.vue @@ -0,0 +1,65 @@ + + + + + + + OTP + + + + + + + + + Please enter the one-time password sent to your phone. + + + + + + Submit + + diff --git a/apps/www/src/lib/registry/new-york/example/InputOtpPattern.vue b/apps/www/src/lib/registry/new-york/example/InputOtpPattern.vue new file mode 100644 index 00000000..243548b9 --- /dev/null +++ b/apps/www/src/lib/registry/new-york/example/InputOtpPattern.vue @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/apps/www/src/lib/registry/new-york/example/InputOtpSeparatorDemo.vue b/apps/www/src/lib/registry/new-york/example/InputOtpSeparatorDemo.vue new file mode 100644 index 00000000..0bf4802d --- /dev/null +++ b/apps/www/src/lib/registry/new-york/example/InputOtpSeparatorDemo.vue @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtp.vue b/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtp.vue new file mode 100644 index 00000000..a4be4c18 --- /dev/null +++ b/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtp.vue @@ -0,0 +1,28 @@ + + + + + + + diff --git a/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtpGroup.vue b/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtpGroup.vue new file mode 100644 index 00000000..a04c0ea6 --- /dev/null +++ b/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtpGroup.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtpSeparator.vue b/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtpSeparator.vue new file mode 100644 index 00000000..e1283991 --- /dev/null +++ b/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtpSeparator.vue @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtpSlot.vue b/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtpSlot.vue new file mode 100644 index 00000000..214d1427 --- /dev/null +++ b/apps/www/src/lib/registry/new-york/ui/input-otp/InputOtpSlot.vue @@ -0,0 +1,33 @@ + + + + + {{ char }} + + + + + + diff --git a/apps/www/src/lib/registry/new-york/ui/input-otp/index.ts b/apps/www/src/lib/registry/new-york/ui/input-otp/index.ts new file mode 100644 index 00000000..f35eed1d --- /dev/null +++ b/apps/www/src/lib/registry/new-york/ui/input-otp/index.ts @@ -0,0 +1,4 @@ +export { default as InputOtp } from './InputOtp.vue' +export { default as InputOtpGroup } from './InputOtpGroup.vue' +export { default as InputOtpSeparator } from './InputOtpSeparator.vue' +export { default as InputOtpSlot } from './InputOtpSlot.vue' diff --git a/apps/www/src/public/registry/index.json b/apps/www/src/public/registry/index.json index 875832c8..81c556ea 100644 --- a/apps/www/src/public/registry/index.json +++ b/apps/www/src/public/registry/index.json @@ -337,6 +337,21 @@ ], "type": "components:ui" }, + { + "name": "input-otp", + "dependencies": [], + "registryDependencies": [ + "utils" + ], + "files": [ + "ui/input-otp/InputOtp.vue", + "ui/input-otp/InputOtpGroup.vue", + "ui/input-otp/InputOtpSeparator.vue", + "ui/input-otp/InputOtpSlot.vue", + "ui/input-otp/index.ts" + ], + "type": "components:ui" + }, { "name": "label", "dependencies": [], @@ -716,4 +731,4 @@ ], "type": "components:ui" } -] \ No newline at end of file +] diff --git a/apps/www/src/public/registry/styles/default/input-otp.json b/apps/www/src/public/registry/styles/default/input-otp.json new file mode 100644 index 00000000..a9674ab2 --- /dev/null +++ b/apps/www/src/public/registry/styles/default/input-otp.json @@ -0,0 +1,30 @@ +{ + "name": "input-otp", + "dependencies": [], + "registryDependencies": [ + "utils" + ], + "files": [ + { + "name": "InputOtp.vue", + "content": "\n\n\n \n \n \n\n" + }, + { + "name": "InputOtpGroup.vue", + "content": "\n\n\n \n \n \n\n" + }, + { + "name": "InputOtpSeparator.vue", + "content": "\n\n\n \n \n \n \n \n\n" + }, + { + "name": "InputOtpSlot.vue", + "content": "\n\n\n \n \n {{ char }}\n \n\n \n \n \n \n\n" + }, + { + "name": "index.ts", + "content": "export { default as InputOtp } from './InputOtp.vue'\nexport { default as InputOtpGroup } from './InputOtpGroup.vue'\nexport { default as InputOtpSeparator } from './InputOtpSeparator.vue'\nexport { default as InputOtpSlot } from './InputOtpSlot.vue'\n" + } + ], + "type": "components:ui" +} diff --git a/apps/www/src/public/registry/styles/new-york/input-otp.json b/apps/www/src/public/registry/styles/new-york/input-otp.json new file mode 100644 index 00000000..4cdadec8 --- /dev/null +++ b/apps/www/src/public/registry/styles/new-york/input-otp.json @@ -0,0 +1,30 @@ +{ + "name": "input-otp", + "dependencies": [], + "registryDependencies": [ + "utils" + ], + "files": [ + { + "name": "InputOtp.vue", + "content": "\n\n\n \n \n \n\n" + }, + { + "name": "InputOtpGroup.vue", + "content": "\n\n\n \n \n \n\n" + }, + { + "name": "InputOtpSeparator.vue", + "content": "\n\n\n \n \n \n \n \n\n" + }, + { + "name": "InputOtpSlot.vue", + "content": "\n\n\n \n {{ char }}\n\n \n \n \n \n\n" + }, + { + "name": "index.ts", + "content": "export { default as InputOtp } from './InputOtp.vue'\nexport { default as InputOtpGroup } from './InputOtpGroup.vue'\nexport { default as InputOtpSeparator } from './InputOtpSeparator.vue'\nexport { default as InputOtpSlot } from './InputOtpSlot.vue'\n" + } + ], + "type": "components:ui" +} diff --git a/package.json b/package.json index 1cdb11a4..236490eb 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "lint-staged": "^15.2.2", "simple-git-hooks": "^2.9.0", "taze": "^0.13.3", - "typescript": "^5.3.3", + "typescript": "^5.4.2", "vitest": "^0.34.6" }, "commitlint": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 464d3b83..2dd5dd7b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^2.7.0 - version: 2.7.0(@vue/compiler-sfc@3.4.21)(eslint@8.57.0)(typescript@5.3.3)(vitest@0.34.6) + version: 2.7.0(@vue/compiler-sfc@3.4.21)(eslint@8.57.0)(typescript@5.4.2)(vitest@0.34.6) '@commitlint/cli': specifier: ^19.0.3 - version: 19.0.3(@types/node@20.11.25)(typescript@5.3.3) + version: 19.0.3(@types/node@20.11.25)(typescript@5.4.2) '@commitlint/config-conventional': specifier: ^19.0.3 version: 19.0.3 @@ -33,8 +33,8 @@ importers: specifier: ^0.13.3 version: 0.13.3 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.2 + version: 5.4.2 vitest: specifier: ^0.34.6 version: 0.34.6(@vitest/ui@0.34.7) @@ -107,6 +107,9 @@ importers: vue: specifier: ^3.4.21 version: 3.4.21(typescript@5.4.2) + vue-input-otp: + specifier: ^0.0.11 + version: 0.0.11(vue@3.4.21) vue-sonner: specifier: ^1.1.2 version: 1.1.2 @@ -485,7 +488,7 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 - /@antfu/eslint-config@2.7.0(@vue/compiler-sfc@3.4.21)(eslint@8.57.0)(typescript@5.3.3)(vitest@0.34.6): + /@antfu/eslint-config@2.7.0(@vue/compiler-sfc@3.4.21)(eslint@8.57.0)(typescript@5.4.2)(vitest@0.34.6): resolution: {integrity: sha512-CMILR+ZeiahWk8LhDlsHij/LPygX6QvQxl5AknTXm2QcFpMR6CZ14JHxTgkQJnRLM78D/CYZXwV38rU3us3PlQ==} hasBin: true peerDependencies: @@ -527,9 +530,9 @@ packages: '@eslint-types/jsdoc': 46.8.2-1 '@eslint-types/typescript-eslint': 7.0.2 '@eslint-types/unicorn': 51.0.1 - '@stylistic/eslint-plugin': 1.6.3(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/eslint-plugin': 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@stylistic/eslint-plugin': 1.6.3(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/eslint-plugin': 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 eslint-config-flat-gitignore: 0.1.3 eslint-merge-processors: 0.1.0(eslint@8.57.0) @@ -541,11 +544,11 @@ packages: eslint-plugin-markdown: 3.0.1(eslint@8.57.0) eslint-plugin-n: 16.6.2(eslint@8.57.0) eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-perfectionist: 2.5.0(eslint@8.57.0)(typescript@5.3.3)(vue-eslint-parser@9.4.2) + eslint-plugin-perfectionist: 2.5.0(eslint@8.57.0)(typescript@5.4.2)(vue-eslint-parser@9.4.2) eslint-plugin-toml: 0.9.2(eslint@8.57.0) eslint-plugin-unicorn: 51.0.1(eslint@8.57.0) eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@7.1.0)(eslint@8.57.0) - eslint-plugin-vitest: 0.3.22(@typescript-eslint/eslint-plugin@7.1.0)(eslint@8.57.0)(typescript@5.3.3)(vitest@0.34.6) + eslint-plugin-vitest: 0.3.22(@typescript-eslint/eslint-plugin@7.1.0)(eslint@8.57.0)(typescript@5.4.2)(vitest@0.34.6) eslint-plugin-vue: 9.22.0(eslint@8.57.0) eslint-plugin-yml: 1.12.2(eslint@8.57.0) eslint-processor-vue-blocks: 0.1.1(@vue/compiler-sfc@3.4.21)(eslint@8.57.0) @@ -1088,14 +1091,14 @@ packages: mime: 3.0.0 dev: true - /@commitlint/cli@19.0.3(@types/node@20.11.25)(typescript@5.3.3): + /@commitlint/cli@19.0.3(@types/node@20.11.25)(typescript@5.4.2): resolution: {integrity: sha512-mGhh/aYPib4Vy4h+AGRloMY+CqkmtdeKPV9poMcZeImF5e3knQ5VYaSeAM0mEzps1dbKsHvABwaDpafLUuM96g==} engines: {node: '>=v18'} hasBin: true dependencies: '@commitlint/format': 19.0.3 '@commitlint/lint': 19.0.3 - '@commitlint/load': 19.0.3(@types/node@20.11.25)(typescript@5.3.3) + '@commitlint/load': 19.0.3(@types/node@20.11.25)(typescript@5.4.2) '@commitlint/read': 19.0.3 '@commitlint/types': 19.0.3 execa: 8.0.1 @@ -1164,7 +1167,7 @@ packages: '@commitlint/types': 19.0.3 dev: true - /@commitlint/load@19.0.3(@types/node@20.11.25)(typescript@5.3.3): + /@commitlint/load@19.0.3(@types/node@20.11.25)(typescript@5.4.2): resolution: {integrity: sha512-18Tk/ZcDFRKIoKfEcl7kC+bYkEQ055iyKmGsYDoYWpKf6FUvBrP9bIWapuy/MB+kYiltmP9ITiUx6UXtqC9IRw==} engines: {node: '>=v18'} dependencies: @@ -1173,8 +1176,8 @@ packages: '@commitlint/resolve-extends': 19.0.3 '@commitlint/types': 19.0.3 chalk: 5.3.0 - cosmiconfig: 8.3.6(typescript@5.3.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.25)(cosmiconfig@8.3.6)(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.4.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.25)(cosmiconfig@8.3.6)(typescript@5.4.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -3497,20 +3500,20 @@ packages: picomatch: 4.0.1 dev: true - /@stylistic/eslint-plugin-plus@1.6.3(eslint@8.57.0)(typescript@5.3.3): + /@stylistic/eslint-plugin-plus@1.6.3(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-TuwQOdyVGycDPw5XeF7W4f3ZonAVzOAzORSaD2yGAJ0fRAbJ+l/v3CkKzIAqBBwWkc+c2aRMsWtLP2+viBnmlQ==} peerDependencies: eslint: '*' dependencies: '@types/eslint': 8.56.5 - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@stylistic/eslint-plugin-ts@1.6.3(eslint@8.57.0)(typescript@5.3.3): + /@stylistic/eslint-plugin-ts@1.6.3(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-v5GwZsPLblWM9uAIdaSi31Sed3XBWlTFQJ3b5upEmj6QsKYivA5nmIYutwqqL133QdVWjmC86pINlx2Muq3uNQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3518,14 +3521,14 @@ packages: dependencies: '@stylistic/eslint-plugin-js': 1.6.3(eslint@8.57.0) '@types/eslint': 8.56.5 - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@stylistic/eslint-plugin@1.6.3(eslint@8.57.0)(typescript@5.3.3): + /@stylistic/eslint-plugin@1.6.3(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-WDa4FjhImp7YcztRaMG09svhKYYhi2Hc4p9ltQRSqyB4fsUUFm+GKzStqqH7xfjHnxacMJaOnaMGRTUqIIZDLA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3533,8 +3536,8 @@ packages: dependencies: '@stylistic/eslint-plugin-js': 1.6.3(eslint@8.57.0) '@stylistic/eslint-plugin-jsx': 1.6.3(eslint@8.57.0) - '@stylistic/eslint-plugin-plus': 1.6.3(eslint@8.57.0)(typescript@5.3.3) - '@stylistic/eslint-plugin-ts': 1.6.3(eslint@8.57.0)(typescript@5.3.3) + '@stylistic/eslint-plugin-plus': 1.6.3(eslint@8.57.0)(typescript@5.4.2) + '@stylistic/eslint-plugin-ts': 1.6.3(eslint@8.57.0)(typescript@5.4.2) '@types/eslint': 8.56.5 eslint: 8.57.0 transitivePeerDependencies: @@ -4068,7 +4071,7 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4080,10 +4083,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/scope-manager': 7.1.0 - '@typescript-eslint/type-utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/type-utils': 7.1.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/visitor-keys': 7.1.0 debug: 4.3.4 eslint: 8.57.0 @@ -4091,8 +4094,8 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.0.3(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true @@ -4118,7 +4121,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4130,11 +4133,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 7.1.0 '@typescript-eslint/types': 7.1.0 - '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.4.2) '@typescript-eslint/visitor-keys': 7.1.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.3.3 + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true @@ -4183,7 +4186,7 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@7.1.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4193,12 +4196,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) - '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.4.2) + '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.0.3(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true @@ -4240,7 +4243,7 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.2): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4256,13 +4259,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.0.3(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.1.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@7.1.0(typescript@5.4.2): resolution: {integrity: sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4278,8 +4281,8 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.0.3(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true @@ -4303,7 +4306,7 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4314,7 +4317,7 @@ packages: '@types/semver': 7.5.6 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.2) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -4322,7 +4325,7 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/utils@7.1.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4333,7 +4336,7 @@ packages: '@types/semver': 7.5.6 '@typescript-eslint/scope-manager': 7.1.0 '@typescript-eslint/types': 7.1.0 - '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.4.2) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -6026,7 +6029,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.25)(cosmiconfig@8.3.6)(typescript@5.3.3): + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.25)(cosmiconfig@8.3.6)(typescript@5.4.2): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} peerDependencies: @@ -6035,9 +6038,9 @@ packages: typescript: '>=4' dependencies: '@types/node': 20.11.25 - cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.4.2) jiti: 1.21.0 - typescript: 5.3.3 + typescript: 5.4.2 dev: true /cosmiconfig@7.1.0: @@ -6051,7 +6054,7 @@ packages: yaml: 1.10.2 dev: false - /cosmiconfig@8.3.6(typescript@5.3.3): + /cosmiconfig@8.3.6(typescript@5.4.2): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -6064,7 +6067,7 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.3.3 + typescript: 5.4.2 dev: true /crc-32@1.2.2: @@ -7148,7 +7151,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.4.2) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -7282,7 +7285,7 @@ packages: engines: {node: '>=5.0.0'} dev: true - /eslint-plugin-perfectionist@2.5.0(eslint@8.57.0)(typescript@5.3.3)(vue-eslint-parser@9.4.2): + /eslint-plugin-perfectionist@2.5.0(eslint@8.57.0)(typescript@5.4.2)(vue-eslint-parser@9.4.2): resolution: {integrity: sha512-F6XXcq4mKKUe/SREoMGQqzgw6cgCgf3pFzkFfQVIGtqD1yXVpQjnhTepzhBeZfxZwgMzR9HO4yH4CUhIQ2WBcQ==} peerDependencies: astro-eslint-parser: ^0.16.0 @@ -7300,7 +7303,7 @@ packages: vue-eslint-parser: optional: true dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 minimatch: 9.0.3 natural-compare-lite: 1.4.0 @@ -7362,12 +7365,12 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 eslint-rule-composer: 0.3.0 dev: true - /eslint-plugin-vitest@0.3.22(@typescript-eslint/eslint-plugin@7.1.0)(eslint@8.57.0)(typescript@5.3.3)(vitest@0.34.6): + /eslint-plugin-vitest@0.3.22(@typescript-eslint/eslint-plugin@7.1.0)(eslint@8.57.0)(typescript@5.4.2)(vitest@0.34.6): resolution: {integrity: sha512-atkFGQ7aVgcuSeSMDqnyevIyUpfBPMnosksgEPrKE7Y8xQlqG/5z2IQ6UDau05zXaaFv7Iz8uzqvIuKshjZ0Zw==} engines: {node: ^18.0.0 || >= 20.0.0} peerDependencies: @@ -7380,8 +7383,8 @@ packages: vitest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 vitest: 0.34.6(@vitest/ui@0.34.7) transitivePeerDependencies: @@ -12429,15 +12432,6 @@ packages: hasBin: true dev: true - /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.3.3 - dev: true - /ts-api-utils@1.0.3(typescript@5.4.2): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} @@ -12598,12 +12592,6 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: false - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - /typescript@5.4.2: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} @@ -13650,6 +13638,14 @@ packages: - supports-color dev: true + /vue-input-otp@0.0.11(vue@3.4.21): + resolution: {integrity: sha512-wy7e1zxB0R/QamWkB9lAvukVJJzQCsiUcx8Bws0Ezbh1OaddiF3wZRnk5hKKSB1Ohqv3VtWygRvB6lJTEcpJYg==} + peerDependencies: + vue: ^3.2.0 + dependencies: + vue: 3.4.21(typescript@5.4.2) + dev: false + /vue-router@4.3.0(vue@3.4.21): resolution: {integrity: sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==} peerDependencies: