@sfxcode/formkit-nuxt-ui 0.7.6 → 0.7.8

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 (27) hide show
  1. package/dist/module.d.ts +7 -0
  2. package/dist/module.json +1 -1
  3. package/dist/runtime/composables/useFormKitRepeater.mjs +54 -0
  4. package/dist/runtime/composables/useFormKitSchema.mjs +58 -0
  5. package/dist/runtime/{definitions → formkit/definitions}/index.js +2 -2
  6. package/dist/runtime/formkit/definitions/index.mjs +28 -0
  7. package/dist/runtime/{definitions → formkit/definitions}/input.js +16 -16
  8. package/dist/runtime/formkit/definitions/input.mjs +81 -0
  9. package/dist/runtime/{definitions → formkit/definitions}/output.js +6 -6
  10. package/dist/runtime/formkit/definitions/output.mjs +31 -0
  11. package/dist/runtime/formkit/index.mjs +0 -0
  12. package/dist/runtime/formkit/plugins/index.mjs +55 -0
  13. package/dist/runtime/plugin.mjs +5 -0
  14. package/dist/runtime/utils/colorConverter.mjs +134 -0
  15. package/dist/runtime/utils/durationConverter.mjs +32 -0
  16. package/dist/runtime/utils/useFormKitInput.mjs +42 -0
  17. package/dist/runtime/utils/useFormKitOutput.mjs +73 -0
  18. package/package.json +15 -10
  19. package/dist/runtime/formkit.config.d.ts +0 -3
  20. package/dist/runtime/formkit.config.js +0 -33
  21. /package/dist/runtime/{definitions → formkit/definitions}/index.d.ts +0 -0
  22. /package/dist/runtime/{definitions → formkit/definitions}/input.d.ts +0 -0
  23. /package/dist/runtime/{definitions → formkit/definitions}/output.d.ts +0 -0
  24. /package/dist/runtime/{index.d.ts → formkit/index.d.ts} +0 -0
  25. /package/dist/runtime/{index.js → formkit/index.js} +0 -0
  26. /package/dist/runtime/{plugins → formkit/plugins}/index.d.ts +0 -0
  27. /package/dist/runtime/{plugins → formkit/plugins}/index.js +0 -0
@@ -0,0 +1,7 @@
1
+ import * as _nuxt_schema from '@nuxt/schema';
2
+
3
+ type ModuleOptions = Record<string, never>;
4
+ declare const _default: _nuxt_schema.NuxtModule<ModuleOptions, ModuleOptions, false>;
5
+
6
+ export { _default as default };
7
+ export type { ModuleOptions };
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=4.0.0"
6
6
  },
7
- "version": "0.7.6",
7
+ "version": "0.7.8",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
@@ -0,0 +1,54 @@
1
+ import { useFormKitSchema } from "./useFormKitSchema.mjs";
2
+ export function useFormKitRepeater() {
3
+ const { addElement, addComponent, addElementsInOuterDiv } = useFormKitSchema();
4
+ function addInsertButton(label = "Add", innerClass = "", outerClass = "", buttonClass = "p-button-sm", iconClass = "pi pi-plus") {
5
+ return addElementsInOuterDiv([
6
+ addComponent("Button", { onClick: "$addNode($node.parent)", label, class: buttonClass, icon: iconClass }, "$node.parent.value.length == 0")
7
+ ], innerClass, outerClass);
8
+ }
9
+ function addListGroupFunctions(data, addNodeDefaultObject = {}) {
10
+ const swapElements = (array, index1, index2) => {
11
+ const newArray = [...array];
12
+ const temp = newArray[index1];
13
+ newArray[index1] = newArray[index2];
14
+ newArray[index2] = temp;
15
+ return newArray;
16
+ };
17
+ data.addNode = (parentNode) => () => {
18
+ const newArray = [...parentNode.value, addNodeDefaultObject];
19
+ parentNode.input(newArray, false);
20
+ };
21
+ data.removeNode = (parentNode, index) => () => {
22
+ parentNode.input(parentNode._value.filter((_, i) => i !== index), false);
23
+ };
24
+ data.moveNodeUp = (parentNode, index) => () => {
25
+ const array = [...parentNode.value];
26
+ if (index > 0)
27
+ parentNode.input(swapElements(array, index - 1, index), false);
28
+ };
29
+ data.moveNodeDown = (parentNode, index) => () => {
30
+ const array = [...parentNode.value];
31
+ if (index < array.length - 1)
32
+ parentNode.input(swapElements(array, index, index + 1), false);
33
+ };
34
+ data.copyNode = (parentNode, index) => () => {
35
+ const obj = parentNode.value[index];
36
+ const newArray = [...parentNode.value, { ...obj }];
37
+ parentNode.input(newArray, false);
38
+ };
39
+ }
40
+ function addGroupButtons(innerClass = "", outerClass = "col-4", label = "Actions", help = "", render = "true") {
41
+ const addButtonComponent = (onClick = "", label2 = "", icon = "", severity = "", render2 = "true", styleClass = "p-button-sm") => {
42
+ return addComponent("Button", { onClick, label: label2, icon, class: styleClass, severity }, render2);
43
+ };
44
+ return addElementsInOuterDiv([
45
+ addButtonComponent("$removeNode($node.parent, $index)", "", "pi pi-times", "danger"),
46
+ addButtonComponent("$copyNode($node.parent, $index)", "", "pi pi-plus"),
47
+ addButtonComponent("$moveNodeUp($node.parent, $index)", "", "pi pi-arrow-up", "secondary", "$index != 0"),
48
+ addElement("span", [], { class: "p-space" }, "$index == 0"),
49
+ addButtonComponent("$moveNodeDown($node.parent, $index)", "", "pi pi-arrow-down", "secondary", "$index < $node.parent.value.length -1"),
50
+ addElement("span", [], { class: "p-space" }, "$index == $node.parent.value.length -1")
51
+ ], `p-action-buttons ${innerClass}`, outerClass, label, help, render);
52
+ }
53
+ return { addInsertButton, addGroupButtons, addListGroupFunctions };
54
+ }
@@ -0,0 +1,58 @@
1
+ export function useFormKitSchema() {
2
+ const addComponent = (component = "Button", props = {}, render = true, formKitAttrs = {}) => {
3
+ return {
4
+ $cmp: component,
5
+ if: render.toString(),
6
+ props,
7
+ ...formKitAttrs
8
+ };
9
+ };
10
+ const addElement = (element = "div", children = [], attrs = {}, render = true, formKitAttrs = {}) => {
11
+ return {
12
+ $el: element,
13
+ if: render.toString(),
14
+ attrs,
15
+ children,
16
+ ...formKitAttrs
17
+ };
18
+ };
19
+ const addGroup = (name, children = [], render = true, formKitAttrs = {}) => {
20
+ return {
21
+ $formkit: "group",
22
+ if: render.toString(),
23
+ name,
24
+ children,
25
+ ...formKitAttrs
26
+ };
27
+ };
28
+ const addList = (name, children = [], dynamic = true, render = true, formKitAttrs = {}) => {
29
+ return {
30
+ $formkit: "list",
31
+ if: render.toString(),
32
+ name,
33
+ dynamic,
34
+ children,
35
+ ...formKitAttrs
36
+ };
37
+ };
38
+ const addListGroup = (children = [], render = true, formKitAttrs = {}) => {
39
+ return {
40
+ $formkit: "group",
41
+ if: render.toString(),
42
+ for: ["item", "index", "$items"],
43
+ // 👈 $items is in the slot’s scope
44
+ key: "$item",
45
+ index: "$index",
46
+ children,
47
+ ...formKitAttrs
48
+ };
49
+ };
50
+ const addElementsInOuterDiv = (children = [], innerClass = "", outerClass = "", label = "", help = "", render = true) => {
51
+ const inner = addElement("div", children, { class: `formkit-inner ${innerClass}`, style: "position: relative;" });
52
+ const labelDiv = addElement("label", [label], { class: "formkit-label" });
53
+ const wrapperDiv = addElement("div", [labelDiv, inner], { class: "formkit-wrapper" });
54
+ const helpDiv = addElement("div", [help], { class: "formkit-help" });
55
+ return addElement("div", [wrapperDiv, helpDiv], { class: `formkit-outer ${outerClass}`, style: "position: relative;" }, render);
56
+ };
57
+ return { addComponent, addElement, addGroup, addList, addListGroup, addElementsInOuterDiv };
58
+ }
@@ -1,5 +1,5 @@
1
- import { nuxtUICheckboxDefinition, nuxtUICheckboxGroupDefinition, nuxtUIColorPickerDefinition, nuxtUIInputDateDefinition, nuxtUIInputDefinition, nuxtUIInputMenuDefinition, nuxtUIInputNumberDefinition, nuxtUIInputTagsDefinition, nuxtUIInputTimeDefinition, nuxtUIPinInputDefinition, nuxtUIRadioGroupDefinition, nuxtUISelectDefinition, nuxtUISelectMenuDefinition, nuxtUISliderDefinition, nuxtUISwitchDefinition, nuxtUITextareaDefinition } from "../definitions/input.js";
2
- import { nuxtUIOutputBooleanDefinition, nuxtUIOutputDateDefinition, nuxtUIOutputLinkDefinition, nuxtUIOutputListDefinition, nuxtUIOutputNumberDefinition, nuxtUIOutputTextDefinition } from "../definitions/output.js";
1
+ import { nuxtUICheckboxDefinition, nuxtUICheckboxGroupDefinition, nuxtUIColorPickerDefinition, nuxtUIInputDateDefinition, nuxtUIInputDefinition, nuxtUIInputMenuDefinition, nuxtUIInputNumberDefinition, nuxtUIInputTagsDefinition, nuxtUIInputTimeDefinition, nuxtUIPinInputDefinition, nuxtUIRadioGroupDefinition, nuxtUISelectDefinition, nuxtUISelectMenuDefinition, nuxtUISliderDefinition, nuxtUISwitchDefinition, nuxtUITextareaDefinition } from "./input.js";
2
+ import { nuxtUIOutputBooleanDefinition, nuxtUIOutputDateDefinition, nuxtUIOutputLinkDefinition, nuxtUIOutputListDefinition, nuxtUIOutputNumberDefinition, nuxtUIOutputTextDefinition } from "./output.js";
3
3
  export const nuxtUIInputs = {
4
4
  nuxtUICheckbox: nuxtUICheckboxDefinition,
5
5
  nuxtUICheckboxGroup: nuxtUICheckboxGroupDefinition,
@@ -0,0 +1,28 @@
1
+ import { nuxtUICheckboxDefinition, nuxtUICheckboxGroupDefinition, nuxtUIColorPickerDefinition, nuxtUIInputDateDefinition, nuxtUIInputDefinition, nuxtUIInputMenuDefinition, nuxtUIInputNumberDefinition, nuxtUIInputTagsDefinition, nuxtUIInputTimeDefinition, nuxtUIPinInputDefinition, nuxtUIRadioGroupDefinition, nuxtUISelectDefinition, nuxtUISelectMenuDefinition, nuxtUISliderDefinition, nuxtUISwitchDefinition, nuxtUITextareaDefinition } from "./input.mjs";
2
+ import { nuxtUIOutputBooleanDefinition, nuxtUIOutputDateDefinition, nuxtUIOutputLinkDefinition, nuxtUIOutputListDefinition, nuxtUIOutputNumberDefinition, nuxtUIOutputTextDefinition } from "./output.mjs";
3
+ export const nuxtUIInputs = {
4
+ nuxtUICheckbox: nuxtUICheckboxDefinition,
5
+ nuxtUICheckboxGroup: nuxtUICheckboxGroupDefinition,
6
+ nuxtUIColorPicker: nuxtUIColorPickerDefinition,
7
+ nuxtUIInput: nuxtUIInputDefinition,
8
+ nuxtUIInputDate: nuxtUIInputDateDefinition,
9
+ nuxtUIInputMenu: nuxtUIInputMenuDefinition,
10
+ nuxtUIInputNumber: nuxtUIInputNumberDefinition,
11
+ nuxtUIInputTags: nuxtUIInputTagsDefinition,
12
+ nuxtUIInputTime: nuxtUIInputTimeDefinition,
13
+ nuxtUIPinInput: nuxtUIPinInputDefinition,
14
+ nuxtUIRadioGroup: nuxtUIRadioGroupDefinition,
15
+ nuxtUISelect: nuxtUISelectDefinition,
16
+ nuxtUISelectMenu: nuxtUISelectMenuDefinition,
17
+ nuxtUISlider: nuxtUISliderDefinition,
18
+ nuxtUISwitch: nuxtUISwitchDefinition,
19
+ nuxtUITextarea: nuxtUITextareaDefinition
20
+ };
21
+ export const nuxtUIOutputs = {
22
+ nuxtUIOutputBoolean: nuxtUIOutputBooleanDefinition,
23
+ nuxtUIOutputDate: nuxtUIOutputDateDefinition,
24
+ nuxtUIOutputLink: nuxtUIOutputLinkDefinition,
25
+ nuxtUIOutputList: nuxtUIOutputListDefinition,
26
+ nuxtUIOutputNumber: nuxtUIOutputNumberDefinition,
27
+ nuxtUIOutputText: nuxtUIOutputTextDefinition
28
+ };
@@ -1,20 +1,20 @@
1
1
  import { createInput } from "@formkit/vue";
2
- import FUCheckbox from "../components/inputs/FUCheckbox.vue";
3
- import FUCheckboxGroup from "../components/inputs/FUCheckboxGroup.vue";
4
- import FUColorPicker from "../components/inputs/FUColorPicker.vue";
5
- import FUInput from "../components/inputs/FUInput.vue";
6
- import FUInputDate from "../components/inputs/FUInputDate.vue";
7
- import FUInputMenu from "../components/inputs/FUInputMenu.vue";
8
- import FUInputNumber from "../components/inputs/FUInputNumber.vue";
9
- import FUInputTags from "../components/inputs/FUInputTags.vue";
10
- import FUInputTime from "../components/inputs/FUInputTime.vue";
11
- import FUPinInput from "../components/inputs/FUPinInput.vue";
12
- import FURadioGroup from "../components/inputs/FURadioGroup.vue";
13
- import FUSelect from "../components/inputs/FUSelect.vue";
14
- import FUSelectMenu from "../components/inputs/FUSelectMenu.vue";
15
- import FUSlider from "../components/inputs/FUSlider.vue";
16
- import FUSwitch from "../components/inputs/FUSwitch.vue";
17
- import FUTextarea from "../components/inputs/FUTextarea.vue";
2
+ import FUCheckbox from "../../runtime/components/inputs/FUCheckbox.vue";
3
+ import FUCheckboxGroup from "../../runtime/components/inputs/FUCheckboxGroup.vue";
4
+ import FUColorPicker from "../../runtime/components/inputs/FUColorPicker.vue";
5
+ import FUInput from "../../runtime/components/inputs/FUInput.vue";
6
+ import FUInputDate from "../../runtime/components/inputs/FUInputDate.vue";
7
+ import FUInputMenu from "../../runtime/components/inputs/FUInputMenu.vue";
8
+ import FUInputNumber from "../../runtime/components/inputs/FUInputNumber.vue";
9
+ import FUInputTags from "../../runtime/components/inputs/FUInputTags.vue";
10
+ import FUInputTime from "../../runtime/components/inputs/FUInputTime.vue";
11
+ import FUPinInput from "../../runtime/components/inputs/FUPinInput.vue";
12
+ import FURadioGroup from "../../runtime/components/inputs/FURadioGroup.vue";
13
+ import FUSelect from "../../runtime/components/inputs/FUSelect.vue";
14
+ import FUSelectMenu from "../../runtime/components/inputs/FUSelectMenu.vue";
15
+ import FUSlider from "../../runtime/components/inputs/FUSlider.vue";
16
+ import FUSwitch from "../../runtime/components/inputs/FUSwitch.vue";
17
+ import FUTextarea from "../../runtime/components/inputs/FUTextarea.vue";
18
18
  export const nuxtUICheckboxDefinition = createInput(FUCheckbox, {
19
19
  props: ["label", "description", "color", "variant", "size", "indicator", "icon", "indeterminateIcon", "autofocus", "ui"],
20
20
  family: "NuxtUIInput"
@@ -0,0 +1,81 @@
1
+ import { createInput } from "@formkit/vue";
2
+ import FUCheckbox from "../../runtime/components/inputs/FUCheckbox.vue";
3
+ import FUCheckboxGroup from "../../runtime/components/inputs/FUCheckboxGroup.vue";
4
+ import FUColorPicker from "../../runtime/components/inputs/FUColorPicker.vue";
5
+ import FUInput from "../../runtime/components/inputs/FUInput.vue";
6
+ import FUInputDate from "../../runtime/components/inputs/FUInputDate.vue";
7
+ import FUInputMenu from "../../runtime/components/inputs/FUInputMenu.vue";
8
+ import FUInputNumber from "../../runtime/components/inputs/FUInputNumber.vue";
9
+ import FUInputTags from "../../runtime/components/inputs/FUInputTags.vue";
10
+ import FUInputTime from "../../runtime/components/inputs/FUInputTime.vue";
11
+ import FUPinInput from "../../runtime/components/inputs/FUPinInput.vue";
12
+ import FURadioGroup from "../../runtime/components/inputs/FURadioGroup.vue";
13
+ import FUSelect from "../../runtime/components/inputs/FUSelect.vue";
14
+ import FUSelectMenu from "../../runtime/components/inputs/FUSelectMenu.vue";
15
+ import FUSlider from "../../runtime/components/inputs/FUSlider.vue";
16
+ import FUSwitch from "../../runtime/components/inputs/FUSwitch.vue";
17
+ import FUTextarea from "../../runtime/components/inputs/FUTextarea.vue";
18
+ export const nuxtUICheckboxDefinition = createInput(FUCheckbox, {
19
+ props: ["label", "description", "color", "variant", "size", "indicator", "icon", "indeterminateIcon", "autofocus", "ui"],
20
+ family: "NuxtUIInput"
21
+ });
22
+ export const nuxtUICheckboxGroupDefinition = createInput(FUCheckboxGroup, {
23
+ props: ["options", "legend", "valueKey", "labelKey", "descriptionKey", "size", "variant", "orientation", "loop", "color", "indicator", "icon", "ui", "items"],
24
+ family: "NuxtUIInput"
25
+ });
26
+ export const nuxtUIColorPickerDefinition = createInput(FUColorPicker, {
27
+ props: ["size", "inputClass", "format", "throttle", "ui"],
28
+ family: "NuxtUIInput"
29
+ });
30
+ export const nuxtUIInputDefinition = createInput(FUInput, {
31
+ props: ["inputType", "size", "autocomplete", "autofocus", "autofocusDelay", "highlight", "fixed", "color", "icon", "avatar", "leading", "leadingIcon", "trailing", "trailingIcon", "loading", "loadingIcon", "placeholder", "list", "max", "maxLength", "min", "minLength", "pattern", "step", "variant", "ui"],
32
+ family: "NuxtUIInput"
33
+ });
34
+ export const nuxtUIInputDateDefinition = createInput(FUInputDate, {
35
+ props: ["defaultValue", "color", "variant", "size", "highlight", "fixed", "autofocus", "autofocusDelay", "range", "separatorIcon", "icon", "avatar", "leading", "leadingIcon", "trailing", "trailingIcon", "loading", "loadingIcon", "placeholder", "defaultPlaceholder", "hourCycle", "step", "granularity", "hideTimeZone", "maxValue", "minValue", "isDateUnavailable", "ui"],
36
+ family: "NuxtUIInput"
37
+ });
38
+ export const nuxtUIInputMenuDefinition = createInput(FUInputMenu, {
39
+ props: ["options", "inputType", "placeholder", "color", "variant", "size", "autofocus", "autofocusDelay", "trailingIcon", "selectedIcon", "deleteIcon", "clear", "clearIcon", "arrow", "portal", "virtualize", "valueKey", "labelKey", "descriptionKey", "multiple", "highlight", "fixed", "createItem", "filterFields", "ignoreFilter", "defaultOpen", "resetSearchTermOnBlur", "resetSearchTermOnSelect", "resetModelValueOnClear", "highlightOnHover", "openOnClick", "openOnFocus", "icon", "leading", "leadingIcon", "trailing", "loading", "loadingIcon", "list", "autocomplete", "searchTerm", "ui"],
40
+ family: "NuxtUIInput"
41
+ });
42
+ export const nuxtUIInputNumberDefinition = createInput(FUInputNumber, {
43
+ props: ["placeholder", "color", "variant", "size", "highlight", "fixed", "orientation", "increment", "incrementIcon", "incrementDisabled", "decrement", "decrementIcon", "decrementDisabled", "autofocus", "autofocusDelay", "min", "max", "step", "stepSnapping", "formatOptions", "disableWheelChange", "invertWheelChange", "focusOnChange", "list", "autocomplete", "ui"],
44
+ family: "NuxtUIInput"
45
+ });
46
+ export const nuxtUIInputTagsDefinition = createInput(FUInputTags, {
47
+ props: ["placeholder", "maxLength", "color", "variant", "size", "autofocus", "autofocusDelay", "deleteIcon", "highlight", "fixed", "addOnPaste", "addOnTab", "addOnBlur", "duplicate", "delimiters", "max", "convertValue", "displayValue", "icon", "avatar", "leading", "leadingIcon", "trailing", "trailingIcon", "loading", "loadingIcon", "list", "autocomplete", "ui"],
48
+ family: "NuxtUIInput"
49
+ });
50
+ export const nuxtUIInputTimeDefinition = createInput(FUInputTime, {
51
+ props: ["color", "variant", "size", "highlight", "fixed", "autofocus", "autofocusDelay", "defaultValue", "placeholder", "defaultPlaceholder", "hourCycle", "step", "stepSnapping", "granularity", "hideTimeZone", "maxValue", "minValue", "icon", "avatar", "leading", "leadingIcon", "trailing", "trailingIcon", "loading", "loadingIcon", "ui"],
52
+ family: "NuxtUIInput"
53
+ });
54
+ export const nuxtUIPinInputDefinition = createInput(FUPinInput, {
55
+ props: ["color", "variant", "size", "length", "autofocus", "autofocusDelay", "highlight", "fixed", "defaultValue", "mask", "otp", "placeholder", "ui"],
56
+ family: "NuxtUIInput"
57
+ });
58
+ export const nuxtUIRadioGroupDefinition = createInput(FURadioGroup, {
59
+ props: ["options", "legend", "valueKey", "labelKey", "descriptionKey", "size", "variant", "orientation", "loop", "name", "color", "indicator", "ui"],
60
+ family: "NuxtUIInput"
61
+ });
62
+ export const nuxtUISelectDefinition = createInput(FUSelect, {
63
+ props: ["options", "placeholder", "color", "variant", "size", "selectedIcon", "arrow", "portal", "valueKey", "labelKey", "descriptionKey", "defaultValue", "multiple", "highlight", "fixed", "autofocus", "autofocusDelay", "open", "defaultOpen", "autocomplete", "icon", "avatar", "leading", "leadingIcon", "trailing", "trailingIcon", "loading", "loadingIcon", "ui"],
64
+ family: "NuxtUIInput"
65
+ });
66
+ export const nuxtUISelectMenuDefinition = createInput(FUSelectMenu, {
67
+ props: ["options", "placeholder", "searchInput", "color", "variant", "icon", "avatar", "leading", "leadingIcon", "trailing", "trailingIcon", "loading", "loadingIcon", "selectedIcon", "clear", "clearIcon", "arrow", "portal", "virtualize", "valueKey", "labelKey", "descriptionKey", "defaultValue", "multiple", "highlight", "fixed", "createItem", "filterFields", "ignoreFilter", "autofocus", "autofocusDelay", "open", "defaultOpen", "resetSearchTermOnBlur", "resetSearchTermOnSelect", "resetModelValueOnClear", "highlightOnHover", "searchTerm", "ui"],
68
+ family: "NuxtUIInput"
69
+ });
70
+ export const nuxtUISliderDefinition = createInput(FUSlider, {
71
+ props: ["color", "size", "orientation", "tooltip", "defaultValue", "name", "inverted", "min", "max", "step", "minStepsBetweenThumbs", "ui"],
72
+ family: "NuxtUIInput"
73
+ });
74
+ export const nuxtUISwitchDefinition = createInput(FUSwitch, {
75
+ props: ["color", "size", "loading", "loadingIcon", "checkedIcon", "uncheckedIcon", "label", "description", "defaultValue", "autofocus", "ui"],
76
+ family: "NuxtUIInput"
77
+ });
78
+ export const nuxtUITextareaDefinition = createInput(FUTextarea, {
79
+ props: ["color", "size", "variant", "placeholder", "autofocus", "autofocusDelay", "autoresize", "autoresizeDelay", "rows", "maxrows", "highlight", "fixed", "icon", "avatar", "leading", "leadingIcon", "trailing", "trailingIcon", "loading", "loadingIcon", "cols", "dirname", "maxlength", "minlength", "wrap", "ui"],
80
+ family: "NuxtUIInput"
81
+ });
@@ -1,10 +1,10 @@
1
1
  import { createInput } from "@formkit/vue";
2
- import FUOutputDate from "../components/output/FUOutputDate.vue";
3
- import FUOutputBoolean from "../components/output/FUOutputBoolean.vue";
4
- import FUOutputText from "../components/output/FUOutputText.vue";
5
- import FUOutputLink from "../components/output/FUOutputLink.vue";
6
- import FUOutputNumber from "../components/output/FUOutputNumber.vue";
7
- import FUOutputList from "../components/output/FUOutputList.vue";
2
+ import FUOutputDate from "../../runtime/components/output/FUOutputDate.vue";
3
+ import FUOutputBoolean from "../../runtime/components/output/FUOutputBoolean.vue";
4
+ import FUOutputText from "../../runtime/components/output/FUOutputText.vue";
5
+ import FUOutputLink from "../../runtime/components/output/FUOutputLink.vue";
6
+ import FUOutputNumber from "../../runtime/components/output/FUOutputNumber.vue";
7
+ import FUOutputList from "../../runtime/components/output/FUOutputList.vue";
8
8
  export const nuxtUIOutputTextDefinition = createInput(FUOutputText, {
9
9
  props: ["size", "color", "variant", "icon", "leadingIcon", "trailingIcon", "leading", "trailing", "onIconClicked", "onLeadingIconClicked", "onTrailingIconClicked", "outputType"],
10
10
  family: "NuxtUIOutput"
@@ -0,0 +1,31 @@
1
+ import { createInput } from "@formkit/vue";
2
+ import FUOutputDate from "../../runtime/components/output/FUOutputDate.vue";
3
+ import FUOutputBoolean from "../../runtime/components/output/FUOutputBoolean.vue";
4
+ import FUOutputText from "../../runtime/components/output/FUOutputText.vue";
5
+ import FUOutputLink from "../../runtime/components/output/FUOutputLink.vue";
6
+ import FUOutputNumber from "../../runtime/components/output/FUOutputNumber.vue";
7
+ import FUOutputList from "../../runtime/components/output/FUOutputList.vue";
8
+ export const nuxtUIOutputTextDefinition = createInput(FUOutputText, {
9
+ props: ["size", "color", "variant", "icon", "leadingIcon", "trailingIcon", "leading", "trailing", "onIconClicked", "onLeadingIconClicked", "onTrailingIconClicked", "outputType"],
10
+ family: "NuxtUIOutput"
11
+ });
12
+ export const nuxtUIOutputBooleanDefinition = createInput(FUOutputBoolean, {
13
+ props: ["size", "color", "variant", "icon", "leadingIcon", "trailingIcon", "leading", "trailing", "trueValue", "falseValue", "trueIcon", "falseIcon", "onIconClicked", "onLeadingIconClicked", "onTrailingIconClicked"],
14
+ family: "NuxtUIOutput"
15
+ });
16
+ export const nuxtUIOutputDateDefinition = createInput(FUOutputDate, {
17
+ props: ["size", "color", "variant", "icon", "leadingIcon", "trailingIcon", "leading", "trailing", "dateStyle", "timeStyle", "locale", "relative", "onIconClicked", "onLeadingIconClicked", "onTrailingIconClicked"],
18
+ family: "NuxtUIOutput"
19
+ });
20
+ export const nuxtUIOutputLinkDefinition = createInput(FUOutputLink, {
21
+ props: ["size", "color", "variant", "icon", "leadingIcon", "trailingIcon", "leading", "trailing", "target", "rel", "underline", "onIconClicked", "onLeadingIconClicked", "onTrailingIconClicked"],
22
+ family: "NuxtUIOutput"
23
+ });
24
+ export const nuxtUIOutputNumberDefinition = createInput(FUOutputNumber, {
25
+ props: ["size", "color", "variant", "icon", "leadingIcon", "trailingIcon", "leading", "trailing", "locale", "formatOptions", "onIconClicked", "onLeadingIconClicked", "onTrailingIconClicked"],
26
+ family: "NuxtUIOutput"
27
+ });
28
+ export const nuxtUIOutputListDefinition = createInput(FUOutputList, {
29
+ props: ["size", "color", "variant", "icon", "leadingIcon", "trailingIcon", "leading", "trailing", "listType", "separator", "itemClass", "onIconClicked", "onLeadingIconClicked", "onTrailingIconClicked"],
30
+ family: "NuxtUIOutput"
31
+ });
File without changes
@@ -0,0 +1,55 @@
1
+ export function addNuxtAsteriskPlugin(node) {
2
+ if (!node.props.type.startsWith("nuxtUI") || node.props.type.startsWith("FUOutput"))
3
+ return;
4
+ node.on("created", () => {
5
+ if (node.props.definition?.schema) {
6
+ const schemaFn = node.props.definition?.schema;
7
+ node.props.definition.schema = (sectionsSchema = {}) => {
8
+ sectionsSchema.label = {
9
+ children: ["$label", {
10
+ $el: "span",
11
+ if: "$state.required",
12
+ attrs: {
13
+ class: "text-error nuxt-ui-formkit--asterisk"
14
+ },
15
+ children: [" *"]
16
+ }]
17
+ };
18
+ return schemaFn(sectionsSchema);
19
+ };
20
+ }
21
+ });
22
+ }
23
+ export function addNuxtLabelPlugin(node) {
24
+ if (!node.props.type.startsWith("nuxtUi"))
25
+ return;
26
+ node.on("created", () => {
27
+ if (node.props.definition?.schema) {
28
+ const schemaFn = node.props.definition?.schema;
29
+ node.props.definition.schema = (sectionsSchema = {}) => {
30
+ sectionsSchema.label = {
31
+ children: [{
32
+ $el: "span",
33
+ attrs: {
34
+ title: "$help",
35
+ class: "p-formkit-label"
36
+ },
37
+ children: ["$label"]
38
+ }, {
39
+ $el: "span",
40
+ if: "$state.required",
41
+ attrs: {
42
+ class: "p-formkit-required",
43
+ title: "$help"
44
+ },
45
+ children: ["*"]
46
+ }]
47
+ };
48
+ sectionsSchema.help = {
49
+ children: []
50
+ };
51
+ return schemaFn(sectionsSchema);
52
+ };
53
+ }
54
+ });
55
+ }
@@ -0,0 +1,5 @@
1
+ import { defineNuxtPlugin } from "#app";
2
+ import { consola } from "consola";
3
+ export default defineNuxtPlugin((_nuxtApp) => {
4
+ consola.info("Plugin injected by @sfxcode/formkit-nuxt-ui!");
5
+ });
@@ -0,0 +1,134 @@
1
+ export function convertColorToHex(color) {
2
+ if (!color)
3
+ return "#000000";
4
+ const trimmedColor = color.trim();
5
+ if (trimmedColor.startsWith("#")) {
6
+ return normalizeHex(trimmedColor);
7
+ }
8
+ if (trimmedColor.toLowerCase().startsWith("rgb")) {
9
+ return rgbToHex(trimmedColor);
10
+ }
11
+ if (trimmedColor.toLowerCase().startsWith("hsl")) {
12
+ return hslToHex(trimmedColor);
13
+ }
14
+ if (trimmedColor.toLowerCase().startsWith("cmyk")) {
15
+ return cmykToHex(trimmedColor);
16
+ }
17
+ if (trimmedColor.toLowerCase().startsWith("lab")) {
18
+ return labToHex(trimmedColor);
19
+ }
20
+ if (/^[\da-f]{3,8}$/i.test(trimmedColor)) {
21
+ return normalizeHex(`#${trimmedColor}`);
22
+ }
23
+ return "#000000";
24
+ }
25
+ function normalizeHex(hex) {
26
+ const cleaned = hex.replace("#", "").toLowerCase();
27
+ if (!/^[\da-f]+$/i.test(cleaned) || cleaned.length === 0) {
28
+ return "#000000";
29
+ }
30
+ if (cleaned.length === 3) {
31
+ return `#${cleaned[0]}${cleaned[0]}${cleaned[1]}${cleaned[1]}${cleaned[2]}${cleaned[2]}`;
32
+ }
33
+ if (cleaned.length === 4) {
34
+ return `#${cleaned[0]}${cleaned[0]}${cleaned[1]}${cleaned[1]}${cleaned[2]}${cleaned[2]}`;
35
+ }
36
+ if (cleaned.length === 8) {
37
+ return `#${cleaned.substring(0, 6)}`;
38
+ }
39
+ if (cleaned.length === 6) {
40
+ return `#${cleaned}`;
41
+ }
42
+ if (cleaned.length < 6) {
43
+ return `#${cleaned.padEnd(6, "0")}`;
44
+ }
45
+ return `#${cleaned.substring(0, 6)}`;
46
+ }
47
+ function rgbToHex(rgb) {
48
+ const match = rgb.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*[\d.]+)?\)/i);
49
+ if (!match)
50
+ return "#000000";
51
+ const r = Number.parseInt(match[1], 10);
52
+ const g = Number.parseInt(match[2], 10);
53
+ const b = Number.parseInt(match[3], 10);
54
+ return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;
55
+ }
56
+ function hslToHex(hsl) {
57
+ const match = hsl.match(/hsla?\((\d+),\s*([\d.]+)%,\s*([\d.]+)%(?:,\s*[\d.]+)?\)/);
58
+ if (!match)
59
+ return "#000000";
60
+ const h = Number.parseInt(match[1], 10) / 360;
61
+ const s = Number.parseFloat(match[2]) / 100;
62
+ const l = Number.parseFloat(match[3]) / 100;
63
+ let r, g, b;
64
+ if (s === 0) {
65
+ r = g = b = l;
66
+ } else {
67
+ const hue2rgb = (p2, q2, t) => {
68
+ if (t < 0)
69
+ t += 1;
70
+ if (t > 1)
71
+ t -= 1;
72
+ if (t < 1 / 6)
73
+ return p2 + (q2 - p2) * 6 * t;
74
+ if (t < 1 / 2)
75
+ return q2;
76
+ if (t < 2 / 3)
77
+ return p2 + (q2 - p2) * (2 / 3 - t) * 6;
78
+ return p2;
79
+ };
80
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
81
+ const p = 2 * l - q;
82
+ r = hue2rgb(p, q, h + 1 / 3);
83
+ g = hue2rgb(p, q, h);
84
+ b = hue2rgb(p, q, h - 1 / 3);
85
+ }
86
+ return `#${componentToHex(Math.round(r * 255))}${componentToHex(Math.round(g * 255))}${componentToHex(Math.round(b * 255))}`;
87
+ }
88
+ function cmykToHex(cmyk) {
89
+ const match = cmyk.match(/cmyk\(([\d.]+)%?,\s*([\d.]+)%?,\s*([\d.]+)%?,\s*([\d.]+)%?\)/);
90
+ if (!match)
91
+ return "#000000";
92
+ const c = Number.parseFloat(match[1]) / 100;
93
+ const m = Number.parseFloat(match[2]) / 100;
94
+ const y = Number.parseFloat(match[3]) / 100;
95
+ const k = Number.parseFloat(match[4]) / 100;
96
+ const r = Math.round(255 * (1 - c) * (1 - k));
97
+ const g = Math.round(255 * (1 - m) * (1 - k));
98
+ const b = Math.round(255 * (1 - y) * (1 - k));
99
+ return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;
100
+ }
101
+ function labToHex(lab) {
102
+ const match = lab.match(/lab\(([\d.]+)%?,\s*([-\d.]+),\s*([-\d.]+)\)/);
103
+ if (!match)
104
+ return "#000000";
105
+ const l = Number.parseFloat(match[1]);
106
+ const a = Number.parseFloat(match[2]);
107
+ const b = Number.parseFloat(match[3]);
108
+ let y = (l + 16) / 116;
109
+ let x = a / 500 + y;
110
+ let z = y - b / 200;
111
+ const labToXyzHelper = (t) => {
112
+ return t > 0.206897 ? t ** 3 : (t - 16 / 116) / 7.787;
113
+ };
114
+ x = 95.047 * labToXyzHelper(x);
115
+ y = 100 * labToXyzHelper(y);
116
+ z = 108.883 * labToXyzHelper(z);
117
+ x = x / 100;
118
+ y = y / 100;
119
+ z = z / 100;
120
+ let r = x * 3.2406 + y * -1.5372 + z * -0.4986;
121
+ let g = x * -0.9689 + y * 1.8758 + z * 0.0415;
122
+ let bl = x * 0.0557 + y * -0.204 + z * 1.057;
123
+ const xyzToRgbHelper = (t) => {
124
+ return t > 31308e-7 ? 1.055 * t ** (1 / 2.4) - 0.055 : 12.92 * t;
125
+ };
126
+ r = xyzToRgbHelper(r);
127
+ g = xyzToRgbHelper(g);
128
+ bl = xyzToRgbHelper(bl);
129
+ return `#${componentToHex(Math.max(0, Math.min(255, Math.round(r * 255))))}${componentToHex(Math.max(0, Math.min(255, Math.round(g * 255))))}${componentToHex(Math.max(0, Math.min(255, Math.round(bl * 255))))}`;
130
+ }
131
+ function componentToHex(c) {
132
+ const hex = Math.max(0, Math.min(255, c)).toString(16);
133
+ return hex.length === 1 ? `0${hex}` : hex;
134
+ }
@@ -0,0 +1,32 @@
1
+ export function durationToMinutes(duration) {
2
+ let hours = 0;
3
+ let minutes = 0;
4
+ const lowerDuration = duration.toLowerCase();
5
+ if (lowerDuration.includes(":")) {
6
+ const [h, m] = lowerDuration.split(":").map((part) => +(part?.trim() || "0"));
7
+ hours = h ?? 0;
8
+ minutes = m ?? 0;
9
+ } else {
10
+ if (lowerDuration.includes("h")) {
11
+ hours = +(lowerDuration.split("h")[0]?.trim() || "0");
12
+ const remainder = lowerDuration.split("h")[1] || "";
13
+ if (remainder.includes("m"))
14
+ minutes = +(remainder.split("m")[0]?.trim() || "0");
15
+ else if (/^\d+$/.test(remainder))
16
+ minutes = +remainder;
17
+ } else if (lowerDuration.includes("m")) {
18
+ minutes = +(lowerDuration.split("m")[0]?.trim() || "0");
19
+ } else if (/^\d+$/.test(lowerDuration)) {
20
+ minutes = +lowerDuration;
21
+ }
22
+ }
23
+ return hours * 60 + minutes;
24
+ }
25
+ export function formattedDuration(duration) {
26
+ const minutes = durationToMinutes(duration);
27
+ const hours = Math.trunc(minutes / 60);
28
+ const remainingMinutes = minutes % 60;
29
+ if (minutes === 0)
30
+ return "0";
31
+ return `${hours > 0 ? `${hours}h` : ""}${hours > 0 && remainingMinutes > 0 ? " " : ""}${remainingMinutes > 0 ? `${remainingMinutes}m` : ""}`;
32
+ }
@@ -0,0 +1,42 @@
1
+ import { computed } from "vue";
2
+ export function useFormKitInput(context) {
3
+ const isInvalid = computed(() => {
4
+ return context?.state?.validationVisible && !context?.state?.valid;
5
+ });
6
+ const styleClass = computed(() => {
7
+ return isInvalid.value ? `${context?.attrs?.class || ""} nuxt-ui-formkit--invalid` : String(context?.attrs?.class || "");
8
+ });
9
+ const color = computed(() => {
10
+ return isInvalid.value ? "error" : context?.color || "primary";
11
+ });
12
+ const formKitCreateInputSlots = /* @__PURE__ */ new Set(["label", "help", "messages", "message", "input"]);
13
+ const validSlotNames = computed(
14
+ () => Object.keys(context?.slots || {}).filter((slotName) => !formKitCreateInputSlots.has(slotName))
15
+ );
16
+ function handleBlur(event) {
17
+ context?.handlers?.blur?.(event);
18
+ }
19
+ function handleChange(_) {
20
+ context?.node?.input?.(context?._value);
21
+ }
22
+ function handleInput(_) {
23
+ context?.node?.input?.(context?._value);
24
+ }
25
+ function handleSelect(e) {
26
+ context?.node?.input?.(e);
27
+ }
28
+ const modelValue = computed({
29
+ get: () => context._value,
30
+ set: (value) => {
31
+ context.node.input(value);
32
+ }
33
+ });
34
+ const items = computed(() => {
35
+ const options = context.options ?? context.attrs.items;
36
+ if (Array.isArray(options)) {
37
+ return options;
38
+ }
39
+ return [];
40
+ });
41
+ return { isInvalid, validSlotNames, styleClass, color, handleBlur, handleChange, handleInput, handleSelect, modelValue, items };
42
+ }
@@ -0,0 +1,73 @@
1
+ import { computed } from "vue";
2
+ export function useFormKitOutput(context) {
3
+ const colorClass = computed(() => {
4
+ const color = context.color ?? "neutral";
5
+ const colorMap = {
6
+ primary: "text-primary",
7
+ secondary: "text-secondary",
8
+ success: "text-success",
9
+ info: "text-info",
10
+ warning: "text-warning",
11
+ error: "text-error",
12
+ neutral: "text-gray-900 dark:text-gray-100"
13
+ };
14
+ return colorMap[color] || colorMap.neutral;
15
+ });
16
+ const sizeClass = computed(() => {
17
+ const size = context.size ?? "md";
18
+ const sizeMap = {
19
+ xs: "text-xs",
20
+ sm: "text-sm",
21
+ md: "text-base",
22
+ lg: "text-lg",
23
+ xl: "text-xl"
24
+ };
25
+ return sizeMap[size] || sizeMap.md;
26
+ });
27
+ const variantClass = computed(() => {
28
+ const variant = context.variant ?? "none";
29
+ const variantMap = {
30
+ outline: "border border-gray-300 dark:border-gray-700 rounded-md px-2 py-1",
31
+ soft: "bg-gray-100 dark:bg-gray-800 rounded-md",
32
+ subtle: "bg-gray-50 dark:bg-gray-900 rounded-md",
33
+ ghost: "hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md",
34
+ none: ""
35
+ };
36
+ return variantMap[variant] || variantMap.none;
37
+ });
38
+ const containerClass = computed(() => {
39
+ return [
40
+ "inline-flex items-center gap-2",
41
+ colorClass.value,
42
+ sizeClass.value,
43
+ variantClass.value,
44
+ context?.attrs?.class
45
+ ].filter(Boolean).join(" ");
46
+ });
47
+ const iconClass = computed(() => {
48
+ const size = context.size ?? "md";
49
+ const iconSizeMap = {
50
+ xs: "h-3 w-3",
51
+ sm: "h-4 w-4",
52
+ md: "h-5 w-5",
53
+ lg: "h-6 w-6",
54
+ xl: "h-7 w-7"
55
+ };
56
+ return iconSizeMap[size] || iconSizeMap.md;
57
+ });
58
+ const leadingIconName = computed(() => {
59
+ return context.leadingIcon || context.leading && context.icon || null;
60
+ });
61
+ const trailingIconName = computed(() => {
62
+ return context.trailingIcon || context.trailing && context.icon || null;
63
+ });
64
+ return {
65
+ colorClass,
66
+ sizeClass,
67
+ variantClass,
68
+ containerClass,
69
+ iconClass,
70
+ leadingIconName,
71
+ trailingIconName
72
+ };
73
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sfxcode/formkit-nuxt-ui",
3
- "version": "0.7.6",
3
+ "version": "0.7.8",
4
4
  "description": "FormKit integration for Nuxt UI - Seamlessly connect FormKit form handling with Nuxt UI components",
5
5
  "author": {
6
6
  "name": "Tom",
@@ -41,17 +41,20 @@
41
41
  "types": "./dist/types.d.mts",
42
42
  "import": "./dist/module.mjs"
43
43
  },
44
- "./runtime": {
45
- "types": "./dist/runtime/index.d.ts",
46
- "import": "./dist/runtime/index.js"
44
+ "./runtime/formkit": {
45
+ "types": "./dist/runtime/formkit/index.d.ts",
46
+ "import": "./dist/runtime/formkit/index.mjs",
47
+ "require": "./dist/runtime/formkit/index.js"
47
48
  },
48
- "./runtime/definitions": {
49
- "types": "./dist/runtime/definitions/index.d.ts",
50
- "import": "./dist/runtime/definitions/index.js"
49
+ "./runtime/formkit/definitions": {
50
+ "types": "./dist/runtime/formkit/definitions/index.d.ts",
51
+ "import": "./dist/runtime/formkit/definitions/index.mjs",
52
+ "require": "./dist/runtime/formkit/definitions/index.js"
51
53
  },
52
- "./runtime/plugins": {
53
- "types": "./dist/runtime/plugins/index.d.ts",
54
- "import": "./dist/runtime/plugins/index.js"
54
+ "./runtime/formkit/plugins": {
55
+ "types": "./dist/runtime/formkit/plugins/index.d.ts",
56
+ "import": "./dist/runtime/formkit/plugins/index.mjs",
57
+ "require": "./dist/runtime/formkit/plugins/index.js"
55
58
  }
56
59
  },
57
60
  "main": "./dist/module.mjs",
@@ -94,9 +97,11 @@
94
97
  "@types/node": "latest",
95
98
  "changelogen": "^0.6.2",
96
99
  "eslint": "^10.0.1",
100
+ "mkdist": "^2.4.1",
97
101
  "nuxt": "^4.3.1",
98
102
  "sass-embedded": "^1.97.3",
99
103
  "typescript": "~5.9.3",
104
+ "unbuild": "^3.6.1",
100
105
  "vitest": "^4.0.18",
101
106
  "vue-tsc": "^3.2.5"
102
107
  }
@@ -1,3 +0,0 @@
1
- import type { DefaultConfigOptions } from '@formkit/vue';
2
- declare const config: DefaultConfigOptions;
3
- export default config;
@@ -1,33 +0,0 @@
1
- import { createAutoAnimatePlugin } from "@formkit/addons";
2
- import { de, en } from "@formkit/i18n";
3
- import { nuxtUIInputs, nuxtUIOutputs } from "../runtime/definitions";
4
- import { addNuxtAsteriskPlugin } from "../runtime/plugins";
5
- const config = {
6
- locales: { en, de },
7
- // Define the active locale
8
- locale: "en",
9
- inputs: { ...nuxtUIInputs, ...nuxtUIOutputs },
10
- // ignore FormKit iconLoader since we use our own icons and don't want to load the default ones
11
- iconLoader: (_) => {
12
- return void 0;
13
- },
14
- plugins: [
15
- createAutoAnimatePlugin(
16
- {
17
- /* optional AutoAnimate config */
18
- // default:
19
- duration: 250,
20
- easing: "ease-in-out"
21
- },
22
- {
23
- /* optional animation targets object */
24
- // default:
25
- global: ["outer", "inner"],
26
- form: ["form"],
27
- repeater: ["items"]
28
- }
29
- ),
30
- addNuxtAsteriskPlugin
31
- ]
32
- };
33
- export default config;
File without changes
File without changes