From 533a7621511f6367ca2fa1a36b50ea117620d36a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=A5=E6=B5=A9?= <37316281+yanhao98@users.noreply.github.com> Date: Sat, 23 Nov 2024 22:00:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20PrimeVue=20=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 20 +++ formkit.config.ts | 33 ++-- index.html | 5 +- package.json | 6 + pnpm-lock.yaml | 161 ++++++++++++++++++ src/App.vue | 17 +- .../all-custom-primevue.vue | 76 +++++++++ src/all-custom/all-custom.vue | 31 ++++ src/inputs/form.ts | 48 ++++++ src/main.ts | 14 ++ vite.config.ts | 11 +- 11 files changed, 402 insertions(+), 20 deletions(-) create mode 100644 components.d.ts create mode 100644 src/all-custom-primevue/all-custom-primevue.vue create mode 100644 src/all-custom/all-custom.vue create mode 100644 src/inputs/form.ts diff --git a/components.d.ts b/components.d.ts new file mode 100644 index 0000000..66e84c7 --- /dev/null +++ b/components.d.ts @@ -0,0 +1,20 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + Button: typeof import('primevue/button')['default'] + BUtton: typeof import('primevue/button')['default'] + Fieldset: typeof import('primevue/fieldset')['default'] + Form: typeof import('@primevue/forms/form')['default'] + FormField: typeof import('@primevue/forms/formfield')['default'] + InputText: typeof import('primevue/inputtext')['default'] + Message: typeof import('primevue/message')['default'] + Password: typeof import('primevue/password')['default'] + Toast: typeof import('primevue/toast')['default'] + } +} diff --git a/formkit.config.ts b/formkit.config.ts index 247ad30..d8d00a1 100644 --- a/formkit.config.ts +++ b/formkit.config.ts @@ -2,37 +2,38 @@ import { createAutoAnimatePlugin, createAutoHeightTextareaPlugin } from '@formki import type { FormKitOptions } from '@formkit/core' import { createI18nPlugin, zh } from '@formkit/i18n' import { genesisIcons } from '@formkit/icons' -import { createLibraryPlugin } from '@formkit/inputs' +import { createLibraryPlugin, submit } from '@formkit/inputs' import { createProPlugin, toggle } from '@formkit/pro' import * as defaultRules from '@formkit/rules' import { createThemePlugin } from '@formkit/themes' import { createValidationPlugin } from '@formkit/validation' import { /* defaultConfig, */ bindings, createInput } from '@formkit/vue' import { addAsteriskPlugin } from './formkit.addAsteriskPlugin' -import { fkLibrary } from './formkit.config.fkLibrary' +// import { fkLibrary } from './formkit.config.fkLibrary' import { rootClasses } from "./formkit.config.theme" import HeadlessuiToggle from "./src/headlessui-switch.vue" +import { register as decodeErrors } from '@formkit/dev' + +decodeErrors(); const validation = createValidationPlugin(defaultRules) -const i18n = createI18nPlugin({ zh }) + const theme = undefined; const icons = genesisIcons; -const themePlugin = createThemePlugin(theme, icons/* , iconLoaderUrl, iconLoader */) const apiKey = 'fk-6cdd5192223' export default { plugins: [ createProPlugin(apiKey, { toggle }), - - createLibraryPlugin(fkLibrary), - - createLibraryPlugin( - { - 'headlessuiSwitch': createInput(HeadlessuiToggle), - } - ), - - themePlugin, bindings, i18n, validation, addAsteriskPlugin, + // createLibraryPlugin(fkLibrary), + createLibraryPlugin({ + submit, + }), + createThemePlugin(theme, icons/* , iconLoaderUrl, iconLoader */), + bindings, + createI18nPlugin({ zh }), + validation, + addAsteriskPlugin, // https://github.com/formkit/formkit/blob/ac1947a305eb5082ba95f53800305d080787cb32/packages/addons/src/plugins/autoHeightTextarea.ts createAutoHeightTextareaPlugin(), @@ -54,5 +55,7 @@ export default { // } ) ], - config: { rootClasses }, + config: { + // rootClasses, + }, } satisfies FormKitOptions \ No newline at end of file diff --git a/index.html b/index.html index dcae95e..68588ce 100644 --- a/index.html +++ b/index.html @@ -15,12 +15,13 @@ Vue FormKit Example + diff --git a/package.json b/package.json index 6da38db..755d980 100644 --- a/package.json +++ b/package.json @@ -19,19 +19,25 @@ "@formkit/vue": "latest", "@formkit/zod": "^1.6.9", "@headlessui/vue": "^1.7.23", + "@primevue/forms": "^4.2.3", + "@primevue/themes": "^4.2.3", "autoprefixer": "latest", "i18next": "^23.16.6", "postcss": "latest", + "primeicons": "^7.0.0", + "primevue": "^4.2.3", "sweetalert2": "^11.14.5", "tailwindcss": "latest", "vue": "^3.5.13", "zod-i18n-map": "^2.27.0" }, "devDependencies": { + "@primevue/auto-import-resolver": "^4.2.3", "@unocss/extractor-arbitrary-variants": "^0.64.1", "@vitejs/plugin-vue": "^5.2.0", "typescript": "~5.6.3", "unocss": "^0.64.1", + "unplugin-vue-components": "^0.27.4", "vite": "^5.4.11", "vue-tsc": "^2.1.10" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4f746d..3e90e80 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,12 @@ importers: '@headlessui/vue': specifier: ^1.7.23 version: 1.7.23(vue@3.5.13(typescript@5.6.3)) + '@primevue/forms': + specifier: ^4.2.3 + version: 4.2.3(vue@3.5.13(typescript@5.6.3)) + '@primevue/themes': + specifier: ^4.2.3 + version: 4.2.3 autoprefixer: specifier: latest version: 10.4.20(postcss@8.4.49) @@ -41,6 +47,12 @@ importers: postcss: specifier: latest version: 8.4.49 + primeicons: + specifier: ^7.0.0 + version: 7.0.0 + primevue: + specifier: ^4.2.3 + version: 4.2.3(vue@3.5.13(typescript@5.6.3)) sweetalert2: specifier: ^11.14.5 version: 11.14.5 @@ -54,6 +66,9 @@ importers: specifier: ^2.27.0 version: 2.27.0(i18next@23.16.6)(zod@3.23.8) devDependencies: + '@primevue/auto-import-resolver': + specifier: ^4.2.3 + version: 4.2.3 '@unocss/extractor-arbitrary-variants': specifier: ^0.64.1 version: 0.64.1 @@ -66,6 +81,9 @@ importers: unocss: specifier: ^0.64.1 version: 0.64.1(postcss@8.4.49)(rollup@4.27.2)(vite@5.4.11)(vue@3.5.13(typescript@5.6.3)) + unplugin-vue-components: + specifier: ^0.27.4 + version: 0.27.4(@babel/parser@7.26.2)(rollup@4.27.2)(vue@3.5.13(typescript@5.6.3)) vite: specifier: ^5.4.11 version: 5.4.11 @@ -515,6 +533,44 @@ packages: '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@primeuix/forms@0.0.2': + resolution: {integrity: sha512-DpecPQd/Qf/kav4LKCaIeGuT3AkwhJzuHCkLANTVlN/zBvo8KIj3OZHsCkm0zlIMVVnaJdtx1ULNlRQdudef+A==} + engines: {node: '>=12.11.0'} + + '@primeuix/styled@0.3.2': + resolution: {integrity: sha512-ColZes0+/WKqH4ob2x8DyNYf1NENpe5ZguOvx5yCLxaP8EIMVhLjWLO/3umJiDnQU4XXMLkn2mMHHw+fhTX/mw==} + engines: {node: '>=12.11.0'} + + '@primeuix/utils@0.3.2': + resolution: {integrity: sha512-B+nphqTQeq+i6JuICLdVWnDMjONome2sNz0xI65qIOyeB4EF12CoKRiCsxuZ5uKAkHi/0d1LqlQ9mIWRSdkavw==} + engines: {node: '>=12.11.0'} + + '@primevue/auto-import-resolver@4.2.3': + resolution: {integrity: sha512-X3rrTr+HBDnjOegVomq4GmYUSCBeol/DQdwIEU6M/t2+u3kiSpQ346sfwcfdWDOwp3Ks3gPunbcn6iglXSHphQ==} + engines: {node: '>=12.11.0'} + + '@primevue/core@4.2.3': + resolution: {integrity: sha512-Qjxl6rPzkvLaUQQeM5wXlmFQK9Pox+rSC+r7sX9ZGXeacD0LJny9YAF0APDv/V5Z1RiXApDvfOQGeu7Xg50vyg==} + engines: {node: '>=12.11.0'} + peerDependencies: + vue: ^3.3.0 + + '@primevue/forms@4.2.3': + resolution: {integrity: sha512-PX3KmqY5n+VdXsnZpASGmLZmjv77zjRQclihSvQUkwg+5iMnzvcJgbqQsyTtjTaCIel6va6VeUs/Xfk1N4fHHg==} + engines: {node: '>=12.11.0'} + + '@primevue/icons@4.2.3': + resolution: {integrity: sha512-2yitSASyLdKtKPy8Fw8A71wycfZ14/lIlJ70JP0yGRy1nYbEBzEteMDGFOnlkFokbK/wdx9oOdYTDEul37FDdg==} + engines: {node: '>=12.11.0'} + + '@primevue/metadata@4.2.3': + resolution: {integrity: sha512-ou47oOgcmsEyeXE85VHHXpefb2OS/XlYFWRoWZS6p1W6rHaEWI3TMBD6NwgsFZ5F4zRVnR/SPXuCURIm5HBi+Q==} + engines: {node: '>=12.11.0'} + + '@primevue/themes@4.2.3': + resolution: {integrity: sha512-hzHEwUWkTQihUEDmT9U3QADoAsYbA6mif6RJSR/hDTnPdXIcmr5RuZGq3pnLl943KfJTBiSp98F6LvSB8boJAw==} + engines: {node: '>=12.11.0'} + '@rollup/pluginutils@5.1.3': resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} @@ -1226,6 +1282,13 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} + primeicons@7.0.0: + resolution: {integrity: sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==} + + primevue@4.2.3: + resolution: {integrity: sha512-kAkSOHmyBhe0NNzjfmZSAFNlxAWPTuTjWvYSxSv2OLVdy61F+IPQAENygaB7UdB4wY7NNxeBVbphEgjuipwTww==} + engines: {node: '>=12.11.0'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1369,6 +1432,23 @@ packages: vite: optional: true + unplugin-vue-components@0.27.4: + resolution: {integrity: sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@1.16.0: + resolution: {integrity: sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==} + engines: {node: '>=14.0.0'} + update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -1431,6 +1511,9 @@ packages: typescript: optional: true + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1787,6 +1870,47 @@ snapshots: '@polka/url@1.0.0-next.28': {} + '@primeuix/forms@0.0.2': + dependencies: + '@primeuix/utils': 0.3.2 + + '@primeuix/styled@0.3.2': + dependencies: + '@primeuix/utils': 0.3.2 + + '@primeuix/utils@0.3.2': {} + + '@primevue/auto-import-resolver@4.2.3': + dependencies: + '@primevue/metadata': 4.2.3 + + '@primevue/core@4.2.3(vue@3.5.13(typescript@5.6.3))': + dependencies: + '@primeuix/styled': 0.3.2 + '@primeuix/utils': 0.3.2 + vue: 3.5.13(typescript@5.6.3) + + '@primevue/forms@4.2.3(vue@3.5.13(typescript@5.6.3))': + dependencies: + '@primeuix/forms': 0.0.2 + '@primeuix/utils': 0.3.2 + '@primevue/core': 4.2.3(vue@3.5.13(typescript@5.6.3)) + transitivePeerDependencies: + - vue + + '@primevue/icons@4.2.3(vue@3.5.13(typescript@5.6.3))': + dependencies: + '@primeuix/utils': 0.3.2 + '@primevue/core': 4.2.3(vue@3.5.13(typescript@5.6.3)) + transitivePeerDependencies: + - vue + + '@primevue/metadata@4.2.3': {} + + '@primevue/themes@4.2.3': + dependencies: + '@primeuix/styled': 0.3.2 + '@rollup/pluginutils@5.1.3(rollup@4.27.2)': dependencies: '@types/estree': 1.0.6 @@ -2541,6 +2665,17 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + primeicons@7.0.0: {} + + primevue@4.2.3(vue@3.5.13(typescript@5.6.3)): + dependencies: + '@primeuix/styled': 0.3.2 + '@primeuix/utils': 0.3.2 + '@primevue/core': 4.2.3(vue@3.5.13(typescript@5.6.3)) + '@primevue/icons': 4.2.3(vue@3.5.13(typescript@5.6.3)) + transitivePeerDependencies: + - vue + queue-microtask@1.2.3: {} read-cache@1.0.0: @@ -2739,6 +2874,30 @@ snapshots: - supports-color - vue + unplugin-vue-components@0.27.4(@babel/parser@7.26.2)(rollup@4.27.2)(vue@3.5.13(typescript@5.6.3)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.3(rollup@4.27.2) + chokidar: 3.6.0 + debug: 4.3.7 + fast-glob: 3.3.2 + local-pkg: 0.5.1 + magic-string: 0.30.12 + minimatch: 9.0.5 + mlly: 1.7.3 + unplugin: 1.16.0 + vue: 3.5.13(typescript@5.6.3) + optionalDependencies: + '@babel/parser': 7.26.2 + transitivePeerDependencies: + - rollup + - supports-color + + unplugin@1.16.0: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 @@ -2778,6 +2937,8 @@ snapshots: optionalDependencies: typescript: 5.6.3 + webpack-virtual-modules@0.6.2: {} + which@2.0.2: dependencies: isexe: 2.0.0 diff --git a/src/App.vue b/src/App.vue index 1e06ee2..8b83eaa 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,9 +1,22 @@ diff --git a/src/all-custom-primevue/all-custom-primevue.vue b/src/all-custom-primevue/all-custom-primevue.vue new file mode 100644 index 0000000..2a26460 --- /dev/null +++ b/src/all-custom-primevue/all-custom-primevue.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/all-custom/all-custom.vue b/src/all-custom/all-custom.vue new file mode 100644 index 0000000..0429103 --- /dev/null +++ b/src/all-custom/all-custom.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/inputs/form.ts b/src/inputs/form.ts new file mode 100644 index 0000000..57f0986 --- /dev/null +++ b/src/inputs/form.ts @@ -0,0 +1,48 @@ +import { FormKitTypeDefinition } from '@formkit/core' +import { + formInput, + messages, + message, + actions, + submitInput, + forms, + disablesChildren, +} from '@formkit/inputs' + +/** + * Input definition for a form. + * @public + */ +export const form: FormKitTypeDefinition = { + /** + * The actual schema of the input, or a function that returns the schema. + */ + schema: formInput( + '$slots.default', + messages(message('$message.value')), + actions(submitInput()) + ), + /** + * The type of node, can be a list, group, or input. + */ + type: 'group', + /** + * An array of extra props to accept for this input. + */ + props: [ + 'actions', + 'submit', + 'submitLabel', + 'submitAttrs', + 'submitBehavior', + 'incompleteMessage', + ], + /** + * Additional features that should be added to your input + */ + features: [forms, disablesChildren], + /** + * The key used to memoize the schema. + */ + schemaMemoKey: 'rorzq1rsrf', +} diff --git a/src/main.ts b/src/main.ts index aabfa62..46f0e5a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,11 +4,25 @@ import { createApp } from 'vue' import formKitConfig from '../formkit.config' import App from './App.vue' +import PrimeVue from "primevue/config"; +import Aura from '@primevue/themes/aura'; +import ToastService from 'primevue/toastservice'; + + +// import '@unocss/reset/normalize.css' +// import '@unocss/reset/sanitize/sanitize.css' +// import '@unocss/reset/sanitize/assets.css' +// import '@unocss/reset/eric-meyer.css' // import '@unocss/reset/tailwind-compat.css' // import '@unocss/reset/tailwind.css' + import 'virtual:uno.css' +import 'primeicons/primeicons.css' const app = createApp(App) +app.use(PrimeVue, { theme: { preset: Aura } }); +app.use(ToastService); + // https://github.dev/formkit/auto-animate/blob/master/docs/src/examples/formkit/ActualFormKit.vue app.use(autoAnimatePlugin) // v-auto-animate="{ duration: 100 }" diff --git a/vite.config.ts b/vite.config.ts index 6643f8a..257a9b9 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,10 +1,19 @@ import UnoCSS from 'unocss/vite' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' +import Components from 'unplugin-vue-components/vite'; +import { PrimeVueResolver } from '@primevue/auto-import-resolver'; // https://vite.dev/config/ export default defineConfig({ - plugins: [vue(), UnoCSS(),], + plugins: [vue(), UnoCSS(), + Components({ + resolvers: [ + PrimeVueResolver() + ] + }) + + ], build: { sourcemap: true }