pdyform 2.0.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/README.md +98 -74
  2. package/package.json +9 -3
  3. package/packages/core/dist/chunk-6F4PWJZI.js +0 -0
  4. package/packages/core/dist/chunk-KA6QUMVR.js +158 -0
  5. package/packages/core/dist/chunk-REHKL5VH.js +76 -0
  6. package/packages/core/dist/formState.cjs +132 -78
  7. package/packages/core/dist/formState.d.cts +14 -10
  8. package/packages/core/dist/formState.d.ts +14 -10
  9. package/packages/core/dist/formState.js +4 -12
  10. package/packages/core/dist/index.cjs +138 -78
  11. package/packages/core/dist/index.d.cts +4 -3
  12. package/packages/core/dist/index.d.ts +4 -3
  13. package/packages/core/dist/index.js +11 -12
  14. package/packages/core/dist/types.d.cts +17 -5
  15. package/packages/core/dist/types.d.ts +17 -5
  16. package/packages/core/dist/types.js +1 -0
  17. package/packages/core/dist/utils.cjs +78 -19
  18. package/packages/core/dist/utils.d.cts +17 -5
  19. package/packages/core/dist/utils.d.ts +17 -5
  20. package/packages/core/dist/utils.js +7 -1
  21. package/packages/react/dist/index.cjs +1 -461
  22. package/packages/react/dist/index.d.cts +33 -2
  23. package/packages/react/dist/index.d.ts +33 -2
  24. package/packages/react/dist/index.js +1 -411
  25. package/packages/vue/dist/index.d.ts +51 -39
  26. package/packages/vue/dist/index.js +1 -28
  27. package/packages/vue/dist/index.mjs +630 -6527
  28. package/eslint.config.mjs +0 -53
  29. package/example/README.md +0 -36
  30. package/example/react-demo/index.html +0 -12
  31. package/example/react-demo/node_modules/.bin/browserslist +0 -17
  32. package/example/react-demo/node_modules/.bin/tsc +0 -17
  33. package/example/react-demo/node_modules/.bin/tsserver +0 -17
  34. package/example/react-demo/node_modules/.bin/vite +0 -17
  35. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-checkbox.js +0 -300
  36. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-checkbox.js.map +0 -7
  37. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-label.js +0 -194
  38. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-label.js.map +0 -7
  39. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-radio-group.js +0 -530
  40. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-radio-group.js.map +0 -7
  41. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-select.js +0 -4808
  42. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-select.js.map +0 -7
  43. package/example/react-demo/node_modules/.vite/deps/_metadata.json +0 -115
  44. package/example/react-demo/node_modules/.vite/deps/chunk-3D5PZ6F6.js +0 -49
  45. package/example/react-demo/node_modules/.vite/deps/chunk-3D5PZ6F6.js.map +0 -7
  46. package/example/react-demo/node_modules/.vite/deps/chunk-5Q2RBQLA.js +0 -127
  47. package/example/react-demo/node_modules/.vite/deps/chunk-5Q2RBQLA.js.map +0 -7
  48. package/example/react-demo/node_modules/.vite/deps/chunk-G3PMV62Z.js +0 -36
  49. package/example/react-demo/node_modules/.vite/deps/chunk-G3PMV62Z.js.map +0 -7
  50. package/example/react-demo/node_modules/.vite/deps/chunk-GX7YZ5KV.js +0 -370
  51. package/example/react-demo/node_modules/.vite/deps/chunk-GX7YZ5KV.js.map +0 -7
  52. package/example/react-demo/node_modules/.vite/deps/chunk-PUFJGYAC.js +0 -928
  53. package/example/react-demo/node_modules/.vite/deps/chunk-PUFJGYAC.js.map +0 -7
  54. package/example/react-demo/node_modules/.vite/deps/chunk-SIU35MPB.js +0 -21
  55. package/example/react-demo/node_modules/.vite/deps/chunk-SIU35MPB.js.map +0 -7
  56. package/example/react-demo/node_modules/.vite/deps/chunk-TOMGVNQP.js +0 -1906
  57. package/example/react-demo/node_modules/.vite/deps/chunk-TOMGVNQP.js.map +0 -7
  58. package/example/react-demo/node_modules/.vite/deps/chunk-YYN6DZAU.js +0 -21628
  59. package/example/react-demo/node_modules/.vite/deps/chunk-YYN6DZAU.js.map +0 -7
  60. package/example/react-demo/node_modules/.vite/deps/chunk-ZE5VSJFE.js +0 -144
  61. package/example/react-demo/node_modules/.vite/deps/chunk-ZE5VSJFE.js.map +0 -7
  62. package/example/react-demo/node_modules/.vite/deps/class-variance-authority.js +0 -51
  63. package/example/react-demo/node_modules/.vite/deps/class-variance-authority.js.map +0 -7
  64. package/example/react-demo/node_modules/.vite/deps/clsx.js +0 -10
  65. package/example/react-demo/node_modules/.vite/deps/clsx.js.map +0 -7
  66. package/example/react-demo/node_modules/.vite/deps/lucide-react.js +0 -29725
  67. package/example/react-demo/node_modules/.vite/deps/lucide-react.js.map +0 -7
  68. package/example/react-demo/node_modules/.vite/deps/package.json +0 -3
  69. package/example/react-demo/node_modules/.vite/deps/react-dom.js +0 -7
  70. package/example/react-demo/node_modules/.vite/deps/react-dom.js.map +0 -7
  71. package/example/react-demo/node_modules/.vite/deps/react-dom_client.js +0 -39
  72. package/example/react-demo/node_modules/.vite/deps/react-dom_client.js.map +0 -7
  73. package/example/react-demo/node_modules/.vite/deps/react.js +0 -6
  74. package/example/react-demo/node_modules/.vite/deps/react.js.map +0 -7
  75. package/example/react-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js +0 -913
  76. package/example/react-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +0 -7
  77. package/example/react-demo/node_modules/.vite/deps/react_jsx-runtime.js +0 -7
  78. package/example/react-demo/node_modules/.vite/deps/react_jsx-runtime.js.map +0 -7
  79. package/example/react-demo/node_modules/.vite/deps/tailwind-merge.js +0 -2534
  80. package/example/react-demo/node_modules/.vite/deps/tailwind-merge.js.map +0 -7
  81. package/example/react-demo/package.json +0 -23
  82. package/example/react-demo/postcss.config.mjs +0 -6
  83. package/example/react-demo/src/App.tsx +0 -64
  84. package/example/react-demo/src/main.tsx +0 -10
  85. package/example/react-demo/src/styles.css +0 -102
  86. package/example/react-demo/tailwind.config.mjs +0 -50
  87. package/example/react-demo/tsconfig.json +0 -16
  88. package/example/react-demo/vite.config.ts +0 -14
  89. package/example/shared/defaultSchema.ts +0 -68
  90. package/example/vue-demo/index.html +0 -12
  91. package/example/vue-demo/node_modules/.bin/tsc +0 -17
  92. package/example/vue-demo/node_modules/.bin/tsserver +0 -17
  93. package/example/vue-demo/node_modules/.bin/vite +0 -17
  94. package/example/vue-demo/node_modules/.vite/deps/_metadata.json +0 -46
  95. package/example/vue-demo/node_modules/.vite/deps/chunk-PZ5AY32C.js +0 -10
  96. package/example/vue-demo/node_modules/.vite/deps/chunk-PZ5AY32C.js.map +0 -7
  97. package/example/vue-demo/node_modules/.vite/deps/chunk-TCXBSQ4M.js +0 -12877
  98. package/example/vue-demo/node_modules/.vite/deps/chunk-TCXBSQ4M.js.map +0 -7
  99. package/example/vue-demo/node_modules/.vite/deps/clsx.js +0 -22
  100. package/example/vue-demo/node_modules/.vite/deps/clsx.js.map +0 -7
  101. package/example/vue-demo/node_modules/.vite/deps/lucide-vue-next.js +0 -29720
  102. package/example/vue-demo/node_modules/.vite/deps/lucide-vue-next.js.map +0 -7
  103. package/example/vue-demo/node_modules/.vite/deps/package.json +0 -3
  104. package/example/vue-demo/node_modules/.vite/deps/radix-vue.js +0 -24321
  105. package/example/vue-demo/node_modules/.vite/deps/radix-vue.js.map +0 -7
  106. package/example/vue-demo/node_modules/.vite/deps/tailwind-merge.js +0 -2534
  107. package/example/vue-demo/node_modules/.vite/deps/tailwind-merge.js.map +0 -7
  108. package/example/vue-demo/node_modules/.vite/deps/vue.js +0 -348
  109. package/example/vue-demo/node_modules/.vite/deps/vue.js.map +0 -7
  110. package/example/vue-demo/package.json +0 -20
  111. package/example/vue-demo/postcss.config.mjs +0 -6
  112. package/example/vue-demo/src/App.vue +0 -61
  113. package/example/vue-demo/src/env.d.ts +0 -1
  114. package/example/vue-demo/src/main.ts +0 -5
  115. package/example/vue-demo/src/style.css +0 -102
  116. package/example/vue-demo/tailwind.config.mjs +0 -50
  117. package/example/vue-demo/tsconfig.json +0 -15
  118. package/example/vue-demo/vite.config.ts +0 -14
  119. package/packages/core/dist/chunk-TP3IHKWV.js +0 -69
  120. package/packages/core/dist/chunk-WEDHXOHH.js +0 -102
  121. package/packages/core/node_modules/.bin/api-extractor +0 -17
  122. package/packages/core/node_modules/.bin/esbuild +0 -14
  123. package/packages/core/node_modules/.bin/jiti +0 -17
  124. package/packages/core/node_modules/.bin/tsc +0 -17
  125. package/packages/core/node_modules/.bin/tsserver +0 -17
  126. package/packages/core/node_modules/.bin/tsup +0 -17
  127. package/packages/core/node_modules/.bin/tsup-node +0 -17
  128. package/packages/core/node_modules/.bin/vitest +0 -17
  129. package/packages/core/node_modules/.vite/vitest/results.json +0 -1
  130. package/packages/core/package.json +0 -37
  131. package/packages/core/src/formState.ts +0 -79
  132. package/packages/core/src/index.ts +0 -3
  133. package/packages/core/src/types.ts +0 -42
  134. package/packages/core/src/utils.ts +0 -104
  135. package/packages/core/test/formState.test.ts +0 -71
  136. package/packages/core/test/utils.test.ts +0 -178
  137. package/packages/core/tsconfig.json +0 -15
  138. package/packages/core/tsup.config.ts +0 -9
  139. package/packages/react/node_modules/.bin/api-extractor +0 -17
  140. package/packages/react/node_modules/.bin/browserslist +0 -17
  141. package/packages/react/node_modules/.bin/esbuild +0 -14
  142. package/packages/react/node_modules/.bin/jiti +0 -17
  143. package/packages/react/node_modules/.bin/tsc +0 -17
  144. package/packages/react/node_modules/.bin/tsserver +0 -17
  145. package/packages/react/node_modules/.bin/tsup +0 -17
  146. package/packages/react/node_modules/.bin/tsup-node +0 -17
  147. package/packages/react/node_modules/.bin/vite +0 -17
  148. package/packages/react/node_modules/.bin/vitest +0 -17
  149. package/packages/react/node_modules/.vite/vitest/results.json +0 -1
  150. package/packages/react/package.json +0 -57
  151. package/packages/react/postcss.config.mjs +0 -6
  152. package/packages/react/src/DynamicForm.tsx +0 -69
  153. package/packages/react/src/FormFieldRenderer.tsx +0 -50
  154. package/packages/react/src/components/Checkbox.tsx +0 -28
  155. package/packages/react/src/components/CheckboxRenderer.tsx +0 -37
  156. package/packages/react/src/components/Input.tsx +0 -24
  157. package/packages/react/src/components/InputRenderer.tsx +0 -25
  158. package/packages/react/src/components/Label.tsx +0 -24
  159. package/packages/react/src/components/RadioGroup.tsx +0 -42
  160. package/packages/react/src/components/RadioRenderer.tsx +0 -29
  161. package/packages/react/src/components/Select.tsx +0 -93
  162. package/packages/react/src/components/SelectRenderer.tsx +0 -27
  163. package/packages/react/src/components/Textarea.tsx +0 -23
  164. package/packages/react/src/components/TextareaRenderer.tsx +0 -17
  165. package/packages/react/src/components/index.ts +0 -55
  166. package/packages/react/src/components/types.ts +0 -17
  167. package/packages/react/src/index.tsx +0 -3
  168. package/packages/react/src/utils.ts +0 -7
  169. package/packages/react/tailwind.config.mjs +0 -10
  170. package/packages/react/test/DynamicForm.test.tsx +0 -25
  171. package/packages/react/test/FormFieldRenderer.test.tsx +0 -127
  172. package/packages/react/tsconfig.json +0 -15
  173. package/packages/react/vitest.config.ts +0 -16
  174. package/packages/vue/node_modules/.bin/rollup +0 -17
  175. package/packages/vue/node_modules/.bin/tsc +0 -17
  176. package/packages/vue/node_modules/.bin/tsserver +0 -17
  177. package/packages/vue/node_modules/.bin/vite +0 -17
  178. package/packages/vue/node_modules/.bin/vitest +0 -17
  179. package/packages/vue/node_modules/.bin/vue-tsc +0 -17
  180. package/packages/vue/node_modules/.vite/vitest/results.json +0 -1
  181. package/packages/vue/node_modules/.vue-global-types/vue_3.5_0_0_0.d.ts +0 -118
  182. package/packages/vue/node_modules/.vue-global-types/vue_3.5_false.d.ts +0 -128
  183. package/packages/vue/package.json +0 -53
  184. package/packages/vue/postcss.config.mjs +0 -6
  185. package/packages/vue/src/DynamicForm.vue +0 -63
  186. package/packages/vue/src/FormFieldRenderer.vue +0 -70
  187. package/packages/vue/src/components/Checkbox.vue +0 -28
  188. package/packages/vue/src/components/CheckboxRenderer.vue +0 -35
  189. package/packages/vue/src/components/Input.vue +0 -21
  190. package/packages/vue/src/components/InputRenderer.vue +0 -24
  191. package/packages/vue/src/components/Label.vue +0 -21
  192. package/packages/vue/src/components/RadioGroup.vue +0 -30
  193. package/packages/vue/src/components/RadioGroupItem.vue +0 -26
  194. package/packages/vue/src/components/RadioRenderer.vue +0 -24
  195. package/packages/vue/src/components/Select.vue +0 -40
  196. package/packages/vue/src/components/SelectContent.vue +0 -38
  197. package/packages/vue/src/components/SelectItem.vue +0 -43
  198. package/packages/vue/src/components/SelectRenderer.vue +0 -30
  199. package/packages/vue/src/components/SelectTrigger.vue +0 -27
  200. package/packages/vue/src/components/Textarea.vue +0 -19
  201. package/packages/vue/src/components/TextareaRenderer.vue +0 -18
  202. package/packages/vue/src/components/index.ts +0 -24
  203. package/packages/vue/src/env.d.ts +0 -7
  204. package/packages/vue/src/fieldComponentMap.ts +0 -34
  205. package/packages/vue/src/index.ts +0 -4
  206. package/packages/vue/src/utils.ts +0 -6
  207. package/packages/vue/tailwind.config.mjs +0 -10
  208. package/packages/vue/test/DynamicForm.test.ts +0 -19
  209. package/packages/vue/test/FormFieldRenderer.test.ts +0 -133
  210. package/packages/vue/tsconfig.json +0 -16
  211. package/packages/vue/vite.config.ts +0 -29
  212. package/packages/vue/vitest.config.ts +0 -16
  213. package/pnpm-workspace.yaml +0 -4
  214. package/tsconfig.json +0 -21
  215. package/turbo.json +0 -25
@@ -1,21 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { Label, type LabelProps } from 'radix-vue'
4
- import { cn } from '../utils'
5
-
6
- const props = defineProps<LabelProps & { class?: any }>()
7
-
8
- const delegatedProps = computed(() => {
9
- const { class: _, ...delegated } = props
10
- return delegated
11
- })
12
- </script>
13
-
14
- <template>
15
- <Label
16
- v-bind="delegatedProps"
17
- :class="cn('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70', props.class)"
18
- >
19
- <slot />
20
- </Label>
21
- </template>
@@ -1,30 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { RadioGroupItem, type RadioGroupItemProps, RadioGroupRoot, type RadioGroupRootEmits, type RadioGroupRootProps, useForwardPropsEmits } from 'radix-vue'
4
- import { Circle } from 'lucide-vue-next'
5
- import { cn } from '../utils'
6
-
7
- // Root
8
- const props = defineProps<RadioGroupRootProps & { class?: any }>()
9
- const emits = defineEmits<RadioGroupRootEmits>()
10
-
11
- const delegatedProps = computed(() => {
12
- const { class: _, ...delegated } = props
13
- return delegated
14
- })
15
-
16
- const forwarded = useForwardPropsEmits(delegatedProps, emits)
17
- </script>
18
-
19
- <script lang="ts">
20
- export { default as RadioGroupItem } from './RadioGroupItem.vue'
21
- </script>
22
-
23
- <template>
24
- <RadioGroupRoot
25
- v-bind="forwarded"
26
- :class="cn('grid gap-2', props.class)"
27
- >
28
- <slot />
29
- </RadioGroupRoot>
30
- </template>
@@ -1,26 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { RadioGroupIndicator, RadioGroupItem, type RadioGroupItemProps, useForwardProps } from 'radix-vue'
4
- import { Circle } from 'lucide-vue-next'
5
- import { cn } from '../utils'
6
-
7
- const props = defineProps<RadioGroupItemProps & { class?: any }>()
8
-
9
- const delegatedProps = computed(() => {
10
- const { class: _, ...delegated } = props
11
- return delegated
12
- })
13
-
14
- const forwardedProps = useForwardProps(delegatedProps)
15
- </script>
16
-
17
- <template>
18
- <RadioGroupItem
19
- v-bind="forwardedProps"
20
- :class="cn('aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', props.class)"
21
- >
22
- <RadioGroupIndicator class="flex items-center justify-center">
23
- <Circle class="h-2.5 w-2.5 fill-current text-current" />
24
- </RadioGroupIndicator>
25
- </RadioGroupItem>
26
- </template>
@@ -1,24 +0,0 @@
1
- <script setup lang="ts">
2
- import type { FieldRendererProps } from '../fieldComponentMap';
3
- import RadioGroup from '../components/RadioGroup.vue';
4
- import RadioGroupItem from '../components/RadioGroupItem.vue';
5
- import Label from '../components/Label.vue';
6
-
7
- const props = defineProps<FieldRendererProps>();
8
- const emit = defineEmits<{ 'update:modelValue': [value: any] }>();
9
- </script>
10
-
11
- <template>
12
- <RadioGroup
13
- class="flex flex-wrap gap-4"
14
- :disabled="field.disabled"
15
- :name="field.name"
16
- :modelValue="modelValue != null ? String(modelValue) : ''"
17
- @update:modelValue="emit('update:modelValue', $event)"
18
- >
19
- <div v-for="opt in field.options" :key="opt.value" class="flex items-center space-x-2">
20
- <RadioGroupItem :id="`radio-${field.name}-${opt.value}`" :value="String(opt.value)" />
21
- <Label :for="`radio-${field.name}-${opt.value}`" class="font-normal">{{ opt.label }}</Label>
22
- </div>
23
- </RadioGroup>
24
- </template>
@@ -1,40 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import {
4
- SelectContent,
5
- SelectGroup,
6
- SelectItem,
7
- SelectItemIndicator,
8
- SelectItemText,
9
- SelectPortal,
10
- SelectRoot,
11
- type SelectRootEmits,
12
- type SelectRootProps,
13
- SelectScrollDownButton,
14
- SelectScrollUpButton,
15
- SelectTrigger,
16
- SelectValue,
17
- SelectViewport,
18
- useForwardPropsEmits,
19
- } from 'radix-vue'
20
- import { Check, ChevronDown, ChevronUp } from 'lucide-vue-next'
21
- import { cn } from '../utils'
22
-
23
- const props = defineProps<SelectRootProps>()
24
- const emits = defineEmits<SelectRootEmits>()
25
-
26
- const forwarded = useForwardPropsEmits(props, emits)
27
- </script>
28
-
29
- <script lang="ts">
30
- export { default as SelectTrigger } from './SelectTrigger.vue'
31
- export { default as SelectContent } from './SelectContent.vue'
32
- export { default as SelectItem } from './SelectItem.vue'
33
- export { SelectValue, SelectGroup } from 'radix-vue'
34
- </script>
35
-
36
- <template>
37
- <SelectRoot v-bind="forwarded">
38
- <slot />
39
- </SelectRoot>
40
- </template>
@@ -1,38 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import {
4
- SelectContent,
5
- type SelectContentProps,
6
- SelectPortal,
7
- SelectViewport,
8
- useForwardProps,
9
- } from 'radix-vue'
10
- import { cn } from '../utils'
11
-
12
- const props = withDefaults(
13
- defineProps<SelectContentProps & { class?: any }>(),
14
- {
15
- position: 'popper',
16
- },
17
- )
18
-
19
- const delegatedProps = computed(() => {
20
- const { class: _, ...delegated } = props
21
- return delegated
22
- })
23
-
24
- const forwardedProps = useForwardProps(delegatedProps)
25
- </script>
26
-
27
- <template>
28
- <SelectPortal>
29
- <SelectContent
30
- v-bind="forwardedProps"
31
- :class="cn('relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', props.class)"
32
- >
33
- <SelectViewport :class="cn('p-1', position === 'popper' && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]')">
34
- <slot />
35
- </SelectViewport>
36
- </SelectContent>
37
- </SelectPortal>
38
- </template>
@@ -1,43 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import {
4
- SelectItem,
5
- SelectItemIndicator,
6
- type SelectItemProps,
7
- SelectItemText,
8
- useForwardProps,
9
- } from 'radix-vue'
10
- import { Check } from 'lucide-vue-next'
11
- import { cn } from '../utils'
12
-
13
- const props = defineProps<SelectItemProps & { class?: any }>()
14
-
15
- const delegatedProps = computed(() => {
16
- const { class: _, ...delegated } = props
17
- return delegated
18
- })
19
-
20
- const forwardedProps = useForwardProps(delegatedProps)
21
- </script>
22
-
23
- <template>
24
- <SelectItem
25
- v-bind="forwardedProps"
26
- :class="
27
- cn(
28
- 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
29
- props.class,
30
- )
31
- "
32
- >
33
- <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
34
- <SelectItemIndicator>
35
- <Check class="h-4 w-4" />
36
- </SelectItemIndicator>
37
- </span>
38
-
39
- <SelectItemText>
40
- <slot />
41
- </SelectItemText>
42
- </SelectItem>
43
- </template>
@@ -1,30 +0,0 @@
1
- <script setup lang="ts">
2
- import type { FieldRendererProps } from '../fieldComponentMap';
3
- import Select from '../components/Select.vue';
4
- import SelectTrigger from '../components/SelectTrigger.vue';
5
- import SelectContent from '../components/SelectContent.vue';
6
- import SelectItem from '../components/SelectItem.vue';
7
- import { SelectValue } from 'radix-vue';
8
-
9
-
10
- const props = defineProps<FieldRendererProps>();
11
- const emit = defineEmits<{ 'update:modelValue': [value: any] }>();
12
- </script>
13
-
14
- <template>
15
- <Select
16
- :disabled="field.disabled"
17
- :name="field.name"
18
- :modelValue="modelValue != null ? String(modelValue) : ''"
19
- @update:modelValue="emit('update:modelValue', $event)"
20
- >
21
- <SelectTrigger :id="fieldId">
22
- <SelectValue :placeholder="field.placeholder || 'Select an option'" />
23
- </SelectTrigger>
24
- <SelectContent>
25
- <SelectItem v-for="opt in field.options" :key="opt.value" :value="String(opt.value)">
26
- {{ opt.label }}
27
- </SelectItem>
28
- </SelectContent>
29
- </Select>
30
- </template>
@@ -1,27 +0,0 @@
1
- <script setup lang="ts">
2
- import { SelectIcon, SelectTrigger, type SelectTriggerProps, useForwardProps } from 'radix-vue'
3
- import { ChevronDown } from 'lucide-vue-next'
4
- import { computed } from 'vue'
5
- import { cn } from '../utils'
6
-
7
- const props = defineProps<SelectTriggerProps & { class?: any }>()
8
-
9
- const delegatedProps = computed(() => {
10
- const { class: _, ...delegated } = props
11
- return delegated
12
- })
13
-
14
- const forwardedProps = useForwardProps(delegatedProps)
15
- </script>
16
-
17
- <template>
18
- <SelectTrigger
19
- v-bind="forwardedProps"
20
- :class="cn('flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', props.class)"
21
- >
22
- <slot />
23
- <SelectIcon as-child>
24
- <ChevronDown class="h-4 w-4 opacity-50" />
25
- </SelectIcon>
26
- </SelectTrigger>
27
- </template>
@@ -1,19 +0,0 @@
1
- <script setup lang="ts">
2
- import { cn } from '../utils'
3
-
4
- const props = defineProps<{
5
- class?: any
6
- modelValue?: any
7
- }>()
8
-
9
- const emit = defineEmits(['update:modelValue', 'blur'])
10
- </script>
11
-
12
- <template>
13
- <textarea
14
- :class="cn('flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', props.class)"
15
- :value="modelValue"
16
- @input="emit('update:modelValue', ($event.target as HTMLTextAreaElement).value)"
17
- @blur="emit('blur', $event)"
18
- />
19
- </template>
@@ -1,18 +0,0 @@
1
- <script setup lang="ts">
2
- import type { FieldRendererProps } from '../fieldComponentMap';
3
- import Textarea from '../components/Textarea.vue';
4
-
5
- const props = defineProps<FieldRendererProps>();
6
- const emit = defineEmits<{ 'update:modelValue': [value: any] }>();
7
- </script>
8
-
9
- <template>
10
- <Textarea
11
- :id="fieldId"
12
- :placeholder="field.placeholder"
13
- :disabled="field.disabled"
14
- :name="field.name"
15
- :modelValue="modelValue ?? ''"
16
- @update:modelValue="emit('update:modelValue', $event)"
17
- />
18
- </template>
@@ -1,24 +0,0 @@
1
- // ─── Primitive UI components ─────────────────────────────────────────────────
2
- export { default as Input } from './Input.vue';
3
- export { default as Textarea } from './Textarea.vue';
4
- export { default as Checkbox } from './Checkbox.vue';
5
- export { default as RadioGroup } from './RadioGroup.vue';
6
- export { default as RadioGroupItem } from './RadioGroupItem.vue';
7
- export { default as Select } from './Select.vue';
8
- export { default as SelectTrigger } from './SelectTrigger.vue';
9
- export { default as SelectContent } from './SelectContent.vue';
10
- export { default as SelectItem } from './SelectItem.vue';
11
- export { default as Label } from './Label.vue';
12
-
13
- // ─── Field renderer components ────────────────────────────────────────────────
14
- export { default as InputRenderer } from './InputRenderer.vue';
15
- export { default as TextareaRenderer } from './TextareaRenderer.vue';
16
- export { default as SelectRenderer } from './SelectRenderer.vue';
17
- export { default as CheckboxRenderer } from './CheckboxRenderer.vue';
18
- export { default as RadioRenderer } from './RadioRenderer.vue';
19
-
20
- // ─── Types ───────────────────────────────────────────────────────────────────
21
- export type { FieldComponentMap, FieldRendererProps } from '../fieldComponentMap';
22
-
23
- // ─── Default component map ───────────────────────────────────────────────────
24
- export { defaultComponentMap } from '../fieldComponentMap';
@@ -1,7 +0,0 @@
1
- /// <reference types="vite/client" />
2
-
3
- declare module '*.vue' {
4
- import type { DefineComponent } from 'vue'
5
- const component: DefineComponent<object, object, any>
6
- export default component
7
- }
@@ -1,34 +0,0 @@
1
- import type { FormField } from 'pdyform/core';
2
- import type { Component } from 'vue';
3
-
4
- import InputRenderer from './components/InputRenderer.vue';
5
- import TextareaRenderer from './components/TextareaRenderer.vue';
6
- import SelectRenderer from './components/SelectRenderer.vue';
7
- import CheckboxRenderer from './components/CheckboxRenderer.vue';
8
- import RadioRenderer from './components/RadioRenderer.vue';
9
-
10
- /**
11
- * The props interface that every field renderer component must accept.
12
- * Custom field renderers must implement this interface.
13
- */
14
- export interface FieldRendererProps {
15
- field: FormField;
16
- modelValue: any;
17
- fieldId: string;
18
- }
19
-
20
- /** Map from field type to a Vue component */
21
- export type FieldComponentMap = Record<string, Component>;
22
-
23
- /** The default built-in component map */
24
- export const defaultComponentMap: FieldComponentMap = {
25
- text: InputRenderer,
26
- number: InputRenderer,
27
- password: InputRenderer,
28
- email: InputRenderer,
29
- date: InputRenderer,
30
- textarea: TextareaRenderer,
31
- select: SelectRenderer,
32
- checkbox: CheckboxRenderer,
33
- radio: RadioRenderer,
34
- };
@@ -1,4 +0,0 @@
1
- export { default as DynamicForm } from './DynamicForm.vue';
2
- export { default as FormFieldRenderer } from './FormFieldRenderer.vue';
3
- export { defaultComponentMap } from './fieldComponentMap';
4
- export type { FieldComponentMap, FieldRendererProps } from './fieldComponentMap';
@@ -1,6 +0,0 @@
1
- import { type ClassValue, clsx } from 'clsx'
2
- import { twMerge } from 'tailwind-merge'
3
-
4
- export function cn(...inputs: ClassValue[]) {
5
- return twMerge(clsx(inputs))
6
- }
@@ -1,10 +0,0 @@
1
- /** @type {import('tailwindcss').Config} */
2
- export default {
3
- content: [
4
- "./src/**/*.{vue,js,ts,jsx,tsx}",
5
- ],
6
- theme: {
7
- extend: {},
8
- },
9
- plugins: [],
10
- }
@@ -1,19 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect } from 'vitest';
3
- import { mount } from '@vue/test-utils';
4
- import DynamicForm from '../src/DynamicForm.vue';
5
-
6
- describe('Vue DynamicForm', () => {
7
- const schema: any = {
8
- fields: [
9
- { name: 'username', label: 'Username', type: 'text' }
10
- ]
11
- };
12
-
13
- it('renders correctly', () => {
14
- const wrapper = mount(DynamicForm, {
15
- props: { schema }
16
- });
17
- expect(wrapper.find('label').text()).toBe('Username');
18
- });
19
- });
@@ -1,133 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect } from 'vitest';
3
- import { mount } from '@vue/test-utils';
4
- import FormFieldRenderer from '../src/FormFieldRenderer.vue';
5
- import type { FormField } from 'pdyform/core';
6
-
7
- describe('FormFieldRenderer', () => {
8
- const defaultField: FormField = {
9
- name: 'testField',
10
- label: 'Test Label',
11
- type: 'text',
12
- id: 'test-field-id',
13
- };
14
-
15
- it('renders a text input correctly', async () => {
16
- const wrapper = mount(FormFieldRenderer, {
17
- props: { field: defaultField, modelValue: 'test value' }
18
- });
19
-
20
- expect(wrapper.find('label').text()).toBe('Test Label');
21
- const input = wrapper.find('input');
22
- expect((input.element as HTMLInputElement).value).toBe('test value');
23
- expect((input.element as HTMLInputElement).type).toBe('text');
24
-
25
- await input.setValue('new value');
26
- expect(wrapper.emitted('update:modelValue')![0]).toEqual(['new value']);
27
- });
28
-
29
- it('emits number for number inputs', async () => {
30
- const field: FormField = { ...defaultField, type: 'number' };
31
- const wrapper = mount(FormFieldRenderer, {
32
- props: { field, modelValue: 22 }
33
- });
34
-
35
- const input = wrapper.find('input');
36
- await input.setValue('23');
37
- expect(wrapper.emitted('update:modelValue')![0]).toEqual([23]);
38
- });
39
-
40
- it('renders a textarea correctly', async () => {
41
- const field: FormField = { ...defaultField, type: 'textarea' };
42
- const wrapper = mount(FormFieldRenderer, {
43
- props: { field, modelValue: 'text\narea' }
44
- });
45
-
46
- const textarea = wrapper.find('textarea');
47
- expect((textarea.element as HTMLTextAreaElement).value).toBe('text\narea');
48
-
49
- await textarea.setValue('new textarea value');
50
- expect(wrapper.emitted('update:modelValue')![0]).toEqual(['new textarea value']);
51
- });
52
-
53
- it('renders a select correctly', async () => {
54
- const field: FormField = {
55
- ...defaultField,
56
- type: 'select',
57
- options: [
58
- { label: 'Option 1', value: 'opt1' },
59
- { label: 'Option 2', value: 'opt2' }
60
- ]
61
- };
62
- const wrapper = mount(FormFieldRenderer, {
63
- props: { field, modelValue: 'opt1' }
64
- });
65
-
66
- // Radix Select renders a combobox trigger
67
- expect(wrapper.find('[role="combobox"]').exists()).toBe(true);
68
-
69
- // Simulate the SelectField emitting the new value (Radix portal doesn't fully function in jsdom)
70
- const selectField = wrapper.findComponent({ name: 'Select' });
71
- await selectField.vm.$emit('update:modelValue', 'opt2');
72
-
73
- expect(wrapper.emitted('update:modelValue')![0]).toEqual(['opt2']);
74
- });
75
-
76
- it('renders a checkbox correctly', async () => {
77
- const field: FormField = {
78
- ...defaultField,
79
- type: 'checkbox',
80
- options: [
81
- { label: 'Check 1', value: 'c1' },
82
- { label: 'Check 2', value: 'c2' }
83
- ]
84
- };
85
- const wrapper = mount(FormFieldRenderer, {
86
- props: { field, modelValue: ['c1'] }
87
- });
88
-
89
- const checkboxes = wrapper.findAll('[role="checkbox"]');
90
- expect(checkboxes[0].attributes('data-state')).toBe('checked');
91
- expect(checkboxes[1].attributes('data-state')).toBe('unchecked');
92
-
93
- // Emit from the internal CheckboxComponent logic since Radix click simulation can be tricky with simple DOM wrapper
94
- const checkboxComponents = wrapper.findAllComponents({ name: 'Checkbox' });
95
- await checkboxComponents[1].vm.$emit('update:checked', true);
96
-
97
- expect(wrapper.emitted('update:modelValue')![0]).toEqual([['c1', 'c2']]);
98
- });
99
-
100
- it('renders a radio correctly', async () => {
101
- const field: FormField = {
102
- ...defaultField,
103
- type: 'radio',
104
- options: [
105
- { label: 'Radio 1', value: 'r1' },
106
- { label: 'Radio 2', value: 'r2' }
107
- ]
108
- };
109
- const wrapper = mount(FormFieldRenderer, {
110
- props: { field, modelValue: 'r1' }
111
- });
112
-
113
- const radios = wrapper.findAll('[role="radio"]');
114
- expect(radios[0].attributes('data-state')).toBe('checked');
115
- expect(radios[1].attributes('data-state')).toBe('unchecked');
116
-
117
- // Radix Vue uses a radio group component wrapper for selecting
118
- const radioGroupComp = wrapper.findComponent({ name: 'RadioGroup' });
119
- await radioGroupComp.vm.$emit('update:modelValue', 'r2');
120
-
121
- expect(wrapper.emitted('update:modelValue')![0]).toEqual(['r2']);
122
- });
123
-
124
- it('displays description and error', () => {
125
- const field: FormField = { ...defaultField, description: 'Desc text' };
126
- const wrapper = mount(FormFieldRenderer, {
127
- props: { field, modelValue: '', error: 'Error text' }
128
- });
129
-
130
- expect(wrapper.text()).toContain('Desc text');
131
- expect(wrapper.text()).toContain('Error text');
132
- });
133
- });
@@ -1,16 +0,0 @@
1
- {
2
- "extends": "@vue/tsconfig/tsconfig.json",
3
- "compilerOptions": {
4
- "composite": false,
5
- "target": "ESNext",
6
- "module": "ESNext",
7
- "moduleResolution": "bundler",
8
- "outDir": "./dist",
9
- "strict": true,
10
- "esModuleInterop": true,
11
- "skipLibCheck": true,
12
- "declaration": true
13
- },
14
- "include": ["src/**/*.ts", "src/**/*.vue"],
15
- "exclude": ["node_modules", "dist", "**/*.test.ts"]
16
- }
@@ -1,29 +0,0 @@
1
- import { defineConfig } from 'vite';
2
- import vue from '@vitejs/plugin-vue';
3
- import dts from 'vite-plugin-dts';
4
- import path from 'path';
5
-
6
- export default defineConfig({
7
- plugins: [vue(), dts({ rollupTypes: true })],
8
- build: {
9
- lib: {
10
- entry: path.resolve(__dirname, 'src/index.ts'),
11
- name: 'PdDynamicFormVue',
12
- fileName: (format) => `index.${format === 'es' ? 'mjs' : 'js'}`,
13
- },
14
- rollupOptions: {
15
- external: ['vue', 'pdyform/core'],
16
- output: {
17
- globals: {
18
- vue: 'Vue',
19
- 'pdyform/core': 'PdyformCore',
20
- },
21
- },
22
- },
23
- },
24
- resolve: {
25
- alias: {
26
- 'pdyform/core': path.resolve(__dirname, '../core/src'),
27
- },
28
- },
29
- });
@@ -1,16 +0,0 @@
1
- import { defineConfig } from 'vitest/config';
2
- import vue from '@vitejs/plugin-vue';
3
- import path from 'path';
4
-
5
- export default defineConfig({
6
- plugins: [vue()],
7
- test: {
8
- environment: 'jsdom',
9
- globals: true,
10
- },
11
- resolve: {
12
- alias: {
13
- 'pdyform/core': path.resolve(__dirname, '../core/src'),
14
- },
15
- },
16
- });
@@ -1,4 +0,0 @@
1
- packages:
2
- - 'packages/*'
3
- - 'example/*'
4
- - '.'