├── .eslintrc.js ├── .gitignore ├── .prettierrc.cjs ├── .vscode └── extensions.json ├── README.md ├── components.json ├── cover.png ├── index.html ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public └── vite.svg ├── src ├── App.vue ├── assets │ └── images │ │ ├── icon_Api.png │ │ ├── icon_Code.png │ │ ├── icon_Condition.png │ │ ├── icon_End.png │ │ ├── icon_Google.jpeg │ │ ├── icon_Knowledge.png │ │ ├── icon_LLM.png │ │ ├── icon_Start.png │ │ └── icon_Variable.png ├── components │ ├── main-canvas.vue │ ├── monaco-editor.vue │ ├── ui │ │ ├── button │ │ │ ├── Button.vue │ │ │ └── index.ts │ │ ├── collapsible │ │ │ ├── Collapsible.vue │ │ │ ├── CollapsibleContent.vue │ │ │ ├── CollapsibleTrigger.vue │ │ │ └── index.ts │ │ ├── command │ │ │ ├── Command.vue │ │ │ ├── CommandDialog.vue │ │ │ ├── CommandEmpty.vue │ │ │ ├── CommandGroup.vue │ │ │ ├── CommandInput.vue │ │ │ ├── CommandItem.vue │ │ │ ├── CommandList.vue │ │ │ ├── CommandSeparator.vue │ │ │ ├── CommandShortcut.vue │ │ │ └── index.ts │ │ ├── dialog │ │ │ ├── Dialog.vue │ │ │ ├── DialogClose.vue │ │ │ ├── DialogContent.vue │ │ │ ├── DialogDescription.vue │ │ │ ├── DialogFooter.vue │ │ │ ├── DialogHeader.vue │ │ │ ├── DialogTitle.vue │ │ │ ├── DialogTrigger.vue │ │ │ └── index.ts │ │ ├── form │ │ │ ├── FormControl.vue │ │ │ ├── FormDescription.vue │ │ │ ├── FormItem.vue │ │ │ ├── FormLabel.vue │ │ │ ├── FormMessage.vue │ │ │ ├── index.ts │ │ │ └── useFormField.ts │ │ ├── input │ │ │ ├── Input.vue │ │ │ └── index.ts │ │ ├── label │ │ │ ├── Label.vue │ │ │ └── index.ts │ │ ├── menubar │ │ │ ├── Menubar.vue │ │ │ ├── MenubarCheckboxItem.vue │ │ │ ├── MenubarContent.vue │ │ │ ├── MenubarGroup.vue │ │ │ ├── MenubarItem.vue │ │ │ ├── MenubarLabel.vue │ │ │ ├── MenubarMenu.vue │ │ │ ├── MenubarRadioGroup.vue │ │ │ ├── MenubarRadioItem.vue │ │ │ ├── MenubarSeparator.vue │ │ │ ├── MenubarShortcut.vue │ │ │ ├── MenubarSub.vue │ │ │ ├── MenubarSubContent.vue │ │ │ ├── MenubarSubTrigger.vue │ │ │ ├── MenubarTrigger.vue │ │ │ └── index.ts │ │ ├── popover │ │ │ ├── Popover.vue │ │ │ ├── PopoverContent.vue │ │ │ ├── PopoverTrigger.vue │ │ │ └── index.ts │ │ ├── scroll-area │ │ │ ├── ScrollArea.vue │ │ │ ├── ScrollBar.vue │ │ │ └── index.ts │ │ ├── select │ │ │ ├── Select.vue │ │ │ ├── SelectContent.vue │ │ │ ├── SelectGroup.vue │ │ │ ├── SelectItem.vue │ │ │ ├── SelectItemText.vue │ │ │ ├── SelectLabel.vue │ │ │ ├── SelectSeparator.vue │ │ │ ├── SelectTrigger.vue │ │ │ ├── SelectValue.vue │ │ │ └── index.ts │ │ ├── slider │ │ │ ├── Slider.vue │ │ │ └── index.ts │ │ ├── switch │ │ │ ├── Switch.vue │ │ │ └── index.ts │ │ ├── tabs │ │ │ ├── Tabs.vue │ │ │ ├── TabsContent.vue │ │ │ ├── TabsList.vue │ │ │ ├── TabsTrigger.vue │ │ │ └── index.ts │ │ ├── textarea │ │ │ ├── Textarea.vue │ │ │ └── index.ts │ │ ├── toast │ │ │ ├── Toast.vue │ │ │ ├── ToastAction.vue │ │ │ ├── ToastClose.vue │ │ │ ├── ToastDescription.vue │ │ │ ├── ToastProvider.vue │ │ │ ├── ToastTitle.vue │ │ │ ├── ToastViewport.vue │ │ │ ├── Toaster.vue │ │ │ ├── index.ts │ │ │ └── use-toast.ts │ │ └── tooltip │ │ │ ├── Tooltip.vue │ │ │ ├── TooltipContent.vue │ │ │ ├── TooltipProvider.vue │ │ │ ├── TooltipTrigger.vue │ │ │ └── index.ts │ └── vue-flow │ │ ├── common-basic-module.vue │ │ ├── common-code-module.vue │ │ ├── common-input-module.vue │ │ ├── common-knowledge-module.vue │ │ ├── common-output-module.vue │ │ ├── common-prompt-module.vue │ │ ├── nodes │ │ ├── LLM-node.vue │ │ ├── api-node.vue │ │ ├── code-node.vue │ │ ├── end-node.vue │ │ ├── index.ts │ │ ├── knowledge-node.vue │ │ └── start-node.vue │ │ ├── start-input-module.vue │ │ ├── static-output-item.vue │ │ └── static-output-module.vue ├── hooks │ ├── index.ts │ └── use-monaco-editor.ts ├── lib │ ├── constant.ts │ └── utils.ts ├── main.ts ├── style.css └── vite-env.d.ts ├── tailwind.config.js ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | browser: true 6 | }, 7 | extends: ['plugin:vue/recommended', 'eslint:recommended', 'plugin:prettier/recommended'], 8 | rules: { 9 | 'prettier/prettier': 'error', 10 | 'vue/component-name-in-template-casing': ['error', 'PascalCase'], 11 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 13 | }, 14 | globals: {}, 15 | parserOptions: { 16 | parser: '@babel/eslint-parser', 17 | requireConfigFile: false 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /.prettierrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | printWidth: 120, 3 | tabWidth: 2, 4 | useTabs: false, 5 | semi: false, 6 | singleQuote: true, 7 | trailingComma: 'none', 8 | bracketSpacing: true, 9 | jsxBracketSameLine: false, 10 | proseWrap: 'always', 11 | plugins: ['prettier-plugin-tailwindcss'] 12 | } 13 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"], 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue Flow Quickstart and Best Practices 🚀 2 | 3 | This project demonstrates building workflow apps with Vue Flow and Vue.js. 4 | 5 | 6 | 7 | ## Table of Contents 8 | 9 | - [Introduction](#introduction) 10 | - [Demo](#demo) 11 | - [Getting Started](#getting-started) 12 | - [Tech Stack](#tech-stack) 13 | - [Contributing](#contributing) 14 | 15 | ## Introduction 16 | 17 | Vue Flow is a library for flowchart diagrams. This project shows quickstart and best practices: 18 | 19 | - Drag and drop nodes 🖱 20 | - Connect nodes ➡️ 21 | - Customize nodes ⚙️ 22 | - Pass data between nodes 📤 23 | - Save/restore workflows 💾 24 | 25 | ## Demo 26 | 27 | https://chat-bot-workflow.vercel.app/ 28 | 29 | Try the live demo 🖥 30 | 31 | ## Getting Started 32 | 33 | These steps will get you started: 34 | 35 | - Prerequisites: Node.js (v16+) and pnpm 36 | - Clone the repo 37 | - Install dependencies with `pnpm install` 38 | - Start dev server with `pnpm run dev` 39 | - App will be at http://localhost:5173/ 40 | 41 | ## Tech Stack 42 | 43 | - [Vue Flow](https://vueflow.dev/) - Flowchart 44 | - [Vue.js](https://vuejs.org/) - Framework 45 | - [Tailwind CSS](https://tailwindcss.com/) - Styling 46 | - [Shadcn-vue](https://www.shadcn-vue.com/) - UI components 47 | - [Vite](https://vitejs.dev/) - Build tool 48 | 49 | ## Contributing 50 | 51 | Feel free to open PRs to contribute fixes or improvements! 52 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://shadcn-vue.com/schema.json", 3 | "style": "default", 4 | "typescript": true, 5 | "tailwind": { 6 | "config": "tailwind.config.js", 7 | "css": "src/style.css", 8 | "baseColor": "slate", 9 | "cssVariables": true 10 | }, 11 | "framework": "vite", 12 | "aliases": { 13 | "components": "@/components", 14 | "utils": "@/lib/utils" 15 | } 16 | } -------------------------------------------------------------------------------- /cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/cover.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | LLM workflow 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chatbot-workflow", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "@radix-ui/react-slot": "^1.0.2", 13 | "@vee-validate/zod": "^4.12.5", 14 | "@vue-flow/background": "^1.2.0", 15 | "@vue-flow/controls": "^1.1.0", 16 | "@vue-flow/core": "^1.29.2", 17 | "@vueuse/core": "^10.7.2", 18 | "class-variance-authority": "^0.7.0", 19 | "clsx": "^2.1.0", 20 | "lucide-vue-next": "^0.315.0", 21 | "monaco-editor": "^0.45.0", 22 | "radix-vue": "^1.3.2", 23 | "tailwind-merge": "^2.2.1", 24 | "tailwindcss-animate": "^1.0.7", 25 | "vee-validate": "^4.12.5", 26 | "vue": "^3.3.11", 27 | "zod": "^3.22.4" 28 | }, 29 | "devDependencies": { 30 | "@babel/eslint-parser": "^7.23.9", 31 | "@types/node": "^20.11.7", 32 | "@vitejs/plugin-vue": "^4.5.2", 33 | "autoprefixer": "^10.4.17", 34 | "eslint": "^8.56.0", 35 | "eslint-config-prettier": "^9.1.0", 36 | "eslint-loader": "^4.0.2", 37 | "eslint-plugin-prettier": "^5.1.3", 38 | "eslint-plugin-vue": "^9.20.1", 39 | "postcss": "^8.4.33", 40 | "prettier": "^3.2.4", 41 | "prettier-plugin-tailwindcss": "^0.5.11", 42 | "tailwindcss": "^3.4.1", 43 | "typescript": "^5.2.2", 44 | "vite": "^5.0.8", 45 | "vite-plugin-monaco-editor": "^1.1.0", 46 | "vue-tsc": "^1.8.25" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 177 | -------------------------------------------------------------------------------- /src/assets/images/icon_Api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/src/assets/images/icon_Api.png -------------------------------------------------------------------------------- /src/assets/images/icon_Code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/src/assets/images/icon_Code.png -------------------------------------------------------------------------------- /src/assets/images/icon_Condition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/src/assets/images/icon_Condition.png -------------------------------------------------------------------------------- /src/assets/images/icon_End.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/src/assets/images/icon_End.png -------------------------------------------------------------------------------- /src/assets/images/icon_Google.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/src/assets/images/icon_Google.jpeg -------------------------------------------------------------------------------- /src/assets/images/icon_Knowledge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/src/assets/images/icon_Knowledge.png -------------------------------------------------------------------------------- /src/assets/images/icon_LLM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/src/assets/images/icon_LLM.png -------------------------------------------------------------------------------- /src/assets/images/icon_Start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/src/assets/images/icon_Start.png -------------------------------------------------------------------------------- /src/assets/images/icon_Variable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MonsterPi13/chatBot-workflow/fbbb80ecac7fdec256143883f239c82df9e2aec2/src/assets/images/icon_Variable.png -------------------------------------------------------------------------------- /src/components/main-canvas.vue: -------------------------------------------------------------------------------- 1 | 105 | 106 | 114 | 115 | 129 | -------------------------------------------------------------------------------- /src/components/monaco-editor.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | 64 | -------------------------------------------------------------------------------- /src/components/ui/button/Button.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 27 | -------------------------------------------------------------------------------- /src/components/ui/button/index.ts: -------------------------------------------------------------------------------- 1 | import { cva } from 'class-variance-authority' 2 | 3 | export { default as Button } from './Button.vue' 4 | 5 | export const buttonVariants = cva( 6 | 'inline-flex items-center justify-center rounded-md whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', 7 | { 8 | variants: { 9 | variant: { 10 | default: 'bg-primary text-primary-foreground hover:bg-primary/90', 11 | destructive: 12 | 'bg-destructive text-destructive-foreground hover:bg-destructive/90', 13 | outline: 14 | 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', 15 | secondary: 16 | 'bg-secondary text-secondary-foreground hover:bg-secondary/80', 17 | ghost: 'hover:bg-accent hover:text-accent-foreground', 18 | link: 'text-primary underline-offset-4 hover:underline', 19 | }, 20 | size: { 21 | default: 'h-10 px-4 py-2', 22 | sm: 'h-9 rounded-md px-3', 23 | lg: 'h-11 rounded-md px-8', 24 | icon: 'h-10 w-10', 25 | }, 26 | }, 27 | defaultVariants: { 28 | variant: 'default', 29 | size: 'default', 30 | }, 31 | }, 32 | ) 33 | -------------------------------------------------------------------------------- /src/components/ui/collapsible/Collapsible.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /src/components/ui/collapsible/CollapsibleContent.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ui/collapsible/CollapsibleTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ui/collapsible/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Collapsible } from './Collapsible.vue' 2 | export { default as CollapsibleTrigger } from './CollapsibleTrigger.vue' 3 | export { default as CollapsibleContent } from './CollapsibleContent.vue' 4 | -------------------------------------------------------------------------------- /src/components/ui/command/Command.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 22 | -------------------------------------------------------------------------------- /src/components/ui/command/CommandDialog.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /src/components/ui/command/CommandEmpty.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /src/components/ui/command/CommandGroup.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /src/components/ui/command/CommandInput.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | 15 | 25 | -------------------------------------------------------------------------------- /src/components/ui/command/CommandItem.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /src/components/ui/command/CommandList.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | -------------------------------------------------------------------------------- /src/components/ui/command/CommandSeparator.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/ui/command/CommandShortcut.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /src/components/ui/command/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Command } from './Command.vue' 2 | export { default as CommandDialog } from './CommandDialog.vue' 3 | export { default as CommandEmpty } from './CommandEmpty.vue' 4 | export { default as CommandGroup } from './CommandGroup.vue' 5 | export { default as CommandInput } from './CommandInput.vue' 6 | export { default as CommandItem } from './CommandItem.vue' 7 | export { default as CommandList } from './CommandList.vue' 8 | export { default as CommandSeparator } from './CommandSeparator.vue' 9 | export { default as CommandShortcut } from './CommandShortcut.vue' 10 | -------------------------------------------------------------------------------- /src/components/ui/dialog/Dialog.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /src/components/ui/dialog/DialogClose.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ui/dialog/DialogContent.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 43 | -------------------------------------------------------------------------------- /src/components/ui/dialog/DialogDescription.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/components/ui/dialog/DialogFooter.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 23 | -------------------------------------------------------------------------------- /src/components/ui/dialog/DialogHeader.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /src/components/ui/dialog/DialogTitle.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | -------------------------------------------------------------------------------- /src/components/ui/dialog/DialogTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ui/dialog/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Dialog } from './Dialog.vue' 2 | export { default as DialogClose } from './DialogClose.vue' 3 | export { default as DialogTrigger } from './DialogTrigger.vue' 4 | export { default as DialogHeader } from './DialogHeader.vue' 5 | export { default as DialogTitle } from './DialogTitle.vue' 6 | export { default as DialogDescription } from './DialogDescription.vue' 7 | export { default as DialogContent } from './DialogContent.vue' 8 | export { default as DialogFooter } from './DialogFooter.vue' 9 | -------------------------------------------------------------------------------- /src/components/ui/form/FormControl.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /src/components/ui/form/FormDescription.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /src/components/ui/form/FormItem.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 22 | 23 | 28 | -------------------------------------------------------------------------------- /src/components/ui/form/FormLabel.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 31 | -------------------------------------------------------------------------------- /src/components/ui/form/FormMessage.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/ui/form/index.ts: -------------------------------------------------------------------------------- 1 | export { Form, Field as FormField } from 'vee-validate' 2 | export { default as FormItem } from './FormItem.vue' 3 | export { default as FormLabel } from './FormLabel.vue' 4 | export { default as FormControl } from './FormControl.vue' 5 | export { default as FormMessage } from './FormMessage.vue' 6 | export { default as FormDescription } from './FormDescription.vue' 7 | -------------------------------------------------------------------------------- /src/components/ui/form/useFormField.ts: -------------------------------------------------------------------------------- 1 | import { FieldContextKey, useFieldError, useIsFieldDirty, useIsFieldTouched, useIsFieldValid } from 'vee-validate' 2 | import { inject } from 'vue' 3 | import { FORM_ITEM_INJECTION_KEY } from './FormItem.vue' 4 | 5 | export function useFormField() { 6 | const fieldContext = inject(FieldContextKey) 7 | const fieldItemContext = inject(FORM_ITEM_INJECTION_KEY) 8 | 9 | const fieldState = { 10 | valid: useIsFieldValid(), 11 | isDirty: useIsFieldDirty(), 12 | isTouched: useIsFieldTouched(), 13 | error: useFieldError(), 14 | } 15 | 16 | if (!fieldContext) 17 | throw new Error('useFormField should be used within ') 18 | 19 | const { name } = fieldContext 20 | const id = fieldItemContext 21 | 22 | return { 23 | id, 24 | name, 25 | formItemId: `${id}-form-item`, 26 | formDescriptionId: `${id}-form-item-description`, 27 | formMessageId: `${id}-form-item-message`, 28 | ...fieldState, 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/components/ui/input/Input.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 25 | -------------------------------------------------------------------------------- /src/components/ui/input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Input } from './Input.vue' 2 | -------------------------------------------------------------------------------- /src/components/ui/label/Label.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | -------------------------------------------------------------------------------- /src/components/ui/label/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Label } from './Label.vue' 2 | -------------------------------------------------------------------------------- /src/components/ui/menubar/Menubar.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 28 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarCheckboxItem.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 36 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarContent.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 39 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarItem.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 29 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarLabel.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarMenu.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarRadioGroup.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarRadioItem.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 36 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarSeparator.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarShortcut.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarSub.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarSubContent.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 41 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarSubTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 24 | -------------------------------------------------------------------------------- /src/components/ui/menubar/MenubarTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | -------------------------------------------------------------------------------- /src/components/ui/menubar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Menubar } from './Menubar.vue' 2 | export { default as MenubarItem } from './MenubarItem.vue' 3 | export { default as MenubarContent } from './MenubarContent.vue' 4 | export { default as MenubarGroup } from './MenubarGroup.vue' 5 | export { default as MenubarMenu } from './MenubarMenu.vue' 6 | export { default as MenubarRadioGroup } from './MenubarRadioGroup.vue' 7 | export { default as MenubarRadioItem } from './MenubarRadioItem.vue' 8 | export { default as MenubarCheckboxItem } from './MenubarCheckboxItem.vue' 9 | export { default as MenubarSeparator } from './MenubarSeparator.vue' 10 | export { default as MenubarSub } from './MenubarSub.vue' 11 | export { default as MenubarSubContent } from './MenubarSubContent.vue' 12 | export { default as MenubarSubTrigger } from './MenubarSubTrigger.vue' 13 | export { default as MenubarTrigger } from './MenubarTrigger.vue' 14 | export { default as MenubarShortcut } from './MenubarShortcut.vue' 15 | export { default as MenubarLabel } from './MenubarLabel.vue' 16 | -------------------------------------------------------------------------------- /src/components/ui/popover/Popover.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /src/components/ui/popover/PopoverContent.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 37 | -------------------------------------------------------------------------------- /src/components/ui/popover/PopoverTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ui/popover/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Popover } from './Popover.vue' 2 | export { default as PopoverTrigger } from './PopoverTrigger.vue' 3 | export { default as PopoverContent } from './PopoverContent.vue' 4 | -------------------------------------------------------------------------------- /src/components/ui/scroll-area/ScrollArea.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 31 | -------------------------------------------------------------------------------- /src/components/ui/scroll-area/ScrollBar.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 24 | -------------------------------------------------------------------------------- /src/components/ui/scroll-area/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ScrollArea } from './ScrollArea.vue' 2 | export { default as ScrollBar } from './ScrollBar.vue' 3 | -------------------------------------------------------------------------------- /src/components/ui/select/Select.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /src/components/ui/select/SelectContent.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 48 | -------------------------------------------------------------------------------- /src/components/ui/select/SelectGroup.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/components/ui/select/SelectItem.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 35 | -------------------------------------------------------------------------------- /src/components/ui/select/SelectItemText.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ui/select/SelectLabel.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/components/ui/select/SelectSeparator.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/components/ui/select/SelectTrigger.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 34 | -------------------------------------------------------------------------------- /src/components/ui/select/SelectValue.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ui/select/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Select } from './Select.vue' 2 | export { default as SelectValue } from './SelectValue.vue' 3 | export { default as SelectTrigger } from './SelectTrigger.vue' 4 | export { default as SelectContent } from './SelectContent.vue' 5 | export { default as SelectGroup } from './SelectGroup.vue' 6 | export { default as SelectItem } from './SelectItem.vue' 7 | export { default as SelectItemText } from './SelectItemText.vue' 8 | export { default as SelectLabel } from './SelectLabel.vue' 9 | export { default as SelectSeparator } from './SelectSeparator.vue' 10 | -------------------------------------------------------------------------------- /src/components/ui/slider/Slider.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 25 | -------------------------------------------------------------------------------- /src/components/ui/slider/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Slider } from './Slider.vue' 2 | -------------------------------------------------------------------------------- /src/components/ui/switch/Switch.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 36 | -------------------------------------------------------------------------------- /src/components/ui/switch/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Switch } from './Switch.vue' 2 | -------------------------------------------------------------------------------- /src/components/ui/tabs/Tabs.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /src/components/ui/tabs/TabsContent.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/components/ui/tabs/TabsList.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | -------------------------------------------------------------------------------- /src/components/ui/tabs/TabsTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | -------------------------------------------------------------------------------- /src/components/ui/tabs/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Tabs } from './Tabs.vue' 2 | export { default as TabsTrigger } from './TabsTrigger.vue' 3 | export { default as TabsList } from './TabsList.vue' 4 | export { default as TabsContent } from './TabsContent.vue' 5 | -------------------------------------------------------------------------------- /src/components/ui/textarea/Textarea.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 |