DEPRECATED PROJECT, NOW REFER TO https://github.com/ChronicStone/vue-sweettools/
A Vue 3 package based on Naive UI that provides highly customizable promised-based popup forms, with features like form advanced validation, optional http request handling, multiple-steps, and many more !
Key Features • How To Use • Documentation & Live Examples • Improvements roadmap • Credits
-
📝 Schema-based form definition
-
🔀 Supports function-based and component-based usage
-
📐 Auto grid-based templating, with breakpoint-based responsiveness control (Tailwind-like API)
-
✏️ Any type of field supported A lot of field types supported (
text
|textarea
|password
|number
|slider
|switch
|select
|radio
|checkbox
|checkboxGroup
|date
|time
|datetime
|datetimerange
|daterange
|month
|year
|file
|array
|object
|customComponent
) -
📁 Supports deeply nested data structures (objects & arrays)
-
🔗 Advanced cross-fields dependency system (conditional rendering, validation, field options, ...)
-
✔️ Advanced validation based on Vuelidate
-
🌙 Dark/Light mode
-
🎨 Highly customizable design
-
⚙️ Supports multiple steps forms
-
➕ And many more !
- DOCUMENTATION : https://sweetforms.netlify.app/
- LIVE EXAMPLES : https://sweetforms-demo.netlify.app/
npm i -s @chronicstone/vue-sweetforms
import "vue-sweetforms/dist/style.css"
// App.vue
<script setup>
import { FormProvider } from "vue-sweetforms"
</script>
<template>
<FormProvider>
<!-- Your app content here -->
<router-view/>
</FormProvider
</template>
<script setup>
import { useSweetform } from "vue-sweetforms"
import axios from "axios"
const GetDogBreeds = async () => await axios.get('https://dog.ceo/api/breeds/list/all').then(response => Object.keys(response.data.message).map(item => ({ label: item, value: item }))).catch(_ => [])
const GetSubbreedByBreed = async ({ dogBreed }) => !dogBreed ? [] : await axios.get(`https://dog.ceo/api/breed/${dogBreed}/list`).then(response => response.data.message.map(item => ({ label: item, value: item }))).catch(err => [])
const { createForm } = useSweetform()
const OpenForm = async () => {
const { isCompleted, formData } = await createForm({
title: "Demonstration",
gridSize: 6,
fields: [
{ key: "firstName", type: "text", label: "First name", placeholder: "John", size: 2 },
{ key: "lastName", type: "text", label: "Last name", placeholder: "Doe", size: 2 },
{ key: "email", type: "text", label: "Email address", placeholder: "john.doe@gmail.com", size: 2 },
{ key: "dogBreed", type: "select", label: "Dog breed", placeholder: "Select a breed", options: GetDogBreeds, size: 3 },
{ key: "dogSubBreed", type: "select", label: "Dog sub-breed", placeholder: "Select a sub-breed", dependencies: ['dogBreed'], options: GetSubbreedByBreed, size: 3 }
]
})
}
</script>
<template>
<button @click="OpenForm">OPEN FORM</button>
</template>
- Improve / complete documentation
- Migrate documentation to VitePress or IlesJs
- Integrate documentation examples to docs app (w/ Vitepress or IlesJs)
- Make Sweetform work as standalone component (If user don't want to use the function-based API)
- Make optimizations to improve performance
- Add full WAI-ARIA support
- Improve styles customization API
Any PR is gladly welcomed and will be greatly appreciated.
This packages uses Naive UI component library internally to render most field types. Particular thanks to @TuSimple who was of a big help in how to immplement the underlying concepts behin
MIT
GitHub @ChronicStone ·