@wishbone-media/spark 0.44.0 → 0.46.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.
- package/dist/index.js +1914 -1878
- package/formkit.config.js +21 -14
- package/formkit.theme.mjs +2 -1
- package/package.json +1 -1
- package/src/components/SparkImageUpload.vue +6 -1
- package/src/plugins/fontawesome.js +4 -0
- package/src/plugins/formkit-password.js +56 -0
- package/src/plugins/index.js +1 -0
package/formkit.config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Note: Consumer apps should wrap the returned config with defaultConfig()
|
|
2
|
-
import { createAutoAnimatePlugin } from '@formkit/addons'
|
|
2
|
+
import { createAutoAnimatePlugin } from '@formkit/addons'
|
|
3
3
|
import {
|
|
4
4
|
createProPlugin,
|
|
5
5
|
autocomplete,
|
|
@@ -12,9 +12,14 @@ import {
|
|
|
12
12
|
taglist,
|
|
13
13
|
toggle,
|
|
14
14
|
togglebuttons,
|
|
15
|
-
} from '@formkit/pro'
|
|
16
|
-
import { rootClasses } from '@wishbone-media/spark/formkit.theme.mjs'
|
|
17
|
-
import {
|
|
15
|
+
} from '@formkit/pro'
|
|
16
|
+
import { rootClasses } from '@wishbone-media/spark/formkit.theme.mjs'
|
|
17
|
+
import {
|
|
18
|
+
formKitIcons,
|
|
19
|
+
formKitIconLoader,
|
|
20
|
+
formKitGenesisOverride,
|
|
21
|
+
createPasswordTogglePlugin,
|
|
22
|
+
} from '@wishbone-media/spark'
|
|
18
23
|
|
|
19
24
|
const autoAnimatePlugin = createAutoAnimatePlugin(
|
|
20
25
|
{
|
|
@@ -22,20 +27,22 @@ const autoAnimatePlugin = createAutoAnimatePlugin(
|
|
|
22
27
|
// default:
|
|
23
28
|
duration: 250,
|
|
24
29
|
easing: 'ease-in-out',
|
|
25
|
-
delay: 0
|
|
30
|
+
delay: 0,
|
|
26
31
|
},
|
|
27
32
|
{
|
|
28
33
|
/* optional animation targets object */
|
|
29
34
|
// default:
|
|
30
35
|
global: ['outer', 'inner'],
|
|
31
36
|
form: ['form'],
|
|
32
|
-
repeater: ['items']
|
|
33
|
-
}
|
|
34
|
-
)
|
|
37
|
+
repeater: ['items'],
|
|
38
|
+
},
|
|
39
|
+
)
|
|
35
40
|
|
|
36
41
|
export default function createFormKitConfig(formKitProKey) {
|
|
37
42
|
if (!formKitProKey) {
|
|
38
|
-
throw new Error(
|
|
43
|
+
throw new Error(
|
|
44
|
+
'FormKit Pro key is required. Please provide VITE_FORMKIT_PRO_KEY in your environment variables.',
|
|
45
|
+
)
|
|
39
46
|
}
|
|
40
47
|
|
|
41
48
|
const proPlugin = createProPlugin(formKitProKey, {
|
|
@@ -49,18 +56,18 @@ export default function createFormKitConfig(formKitProKey) {
|
|
|
49
56
|
taglist,
|
|
50
57
|
toggle,
|
|
51
58
|
togglebuttons,
|
|
52
|
-
})
|
|
59
|
+
})
|
|
53
60
|
|
|
54
61
|
// Return plain config object - consumer apps wrap with defaultConfig()
|
|
55
62
|
return {
|
|
56
63
|
config: {
|
|
57
|
-
rootClasses
|
|
64
|
+
rootClasses,
|
|
58
65
|
},
|
|
59
66
|
icons: {
|
|
60
67
|
...formKitGenesisOverride, // FontAwesome replacements for FormKit's built-in icons
|
|
61
|
-
...formKitIcons,
|
|
68
|
+
...formKitIcons, // Additional FA icons available via prefix-icon/suffix-icon
|
|
62
69
|
},
|
|
63
70
|
iconLoader: formKitIconLoader,
|
|
64
|
-
plugins: [proPlugin, autoAnimatePlugin]
|
|
65
|
-
}
|
|
71
|
+
plugins: [proPlugin, autoAnimatePlugin, createPasswordTogglePlugin()],
|
|
72
|
+
}
|
|
66
73
|
}
|
package/formkit.theme.mjs
CHANGED
package/package.json
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
:alt="label || 'Image preview'"
|
|
9
9
|
:class="[
|
|
10
10
|
height,
|
|
11
|
-
'
|
|
11
|
+
circle ? 'aspect-square object-cover rounded-full' : 'w-auto object-contain rounded-md',
|
|
12
|
+
'border border-gray-300 cursor-pointer hover:opacity-80 transition-opacity',
|
|
12
13
|
]"
|
|
13
14
|
/>
|
|
14
15
|
</a>
|
|
@@ -93,6 +94,10 @@ const props = defineProps({
|
|
|
93
94
|
type: Boolean,
|
|
94
95
|
default: false,
|
|
95
96
|
},
|
|
97
|
+
circle: {
|
|
98
|
+
type: Boolean,
|
|
99
|
+
default: false,
|
|
100
|
+
},
|
|
96
101
|
responseParser: {
|
|
97
102
|
type: Function,
|
|
98
103
|
default: (response) => response.data.url || response.data,
|
|
@@ -40,6 +40,8 @@ import {
|
|
|
40
40
|
faXmark,
|
|
41
41
|
faSignOut,
|
|
42
42
|
faEye,
|
|
43
|
+
faEyeSlash,
|
|
44
|
+
faLock,
|
|
43
45
|
faUndo,
|
|
44
46
|
faBolt,
|
|
45
47
|
faCloudDownload,
|
|
@@ -109,6 +111,8 @@ export const Icons = {
|
|
|
109
111
|
farXmark: faXmark,
|
|
110
112
|
farSignOut: faSignOut,
|
|
111
113
|
farEye: faEye,
|
|
114
|
+
farEyeSlash: faEyeSlash,
|
|
115
|
+
farLock: faLock,
|
|
112
116
|
farUndo: faUndo,
|
|
113
117
|
farBolt: faBolt,
|
|
114
118
|
farCloudDownload: faCloudDownload,
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
function isTruthy(value) {
|
|
2
|
+
return value !== undefined && value !== false
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
function loadIcon(node, sectionKey, iconName) {
|
|
6
|
+
const iconHandler = node.props.iconHandler
|
|
7
|
+
if (!iconHandler) return
|
|
8
|
+
|
|
9
|
+
const rawProp = `_raw${sectionKey.charAt(0).toUpperCase()}${sectionKey.slice(1)}`
|
|
10
|
+
node.addProps([sectionKey, rawProp])
|
|
11
|
+
|
|
12
|
+
node.props[sectionKey] = iconName
|
|
13
|
+
const svg = iconHandler(iconName)
|
|
14
|
+
if (svg instanceof Promise) {
|
|
15
|
+
svg.then((s) => {
|
|
16
|
+
node.props[rawProp] = s
|
|
17
|
+
})
|
|
18
|
+
} else {
|
|
19
|
+
node.props[rawProp] = svg
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
node.on(`prop:${sectionKey}`, (event) => {
|
|
23
|
+
const newSvg = iconHandler(event.payload)
|
|
24
|
+
if (newSvg instanceof Promise) {
|
|
25
|
+
newSvg.then((s) => {
|
|
26
|
+
node.props[rawProp] = s
|
|
27
|
+
})
|
|
28
|
+
} else {
|
|
29
|
+
node.props[rawProp] = newSvg
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function createPasswordTogglePlugin() {
|
|
35
|
+
return function passwordTogglePlugin(node) {
|
|
36
|
+
if (node.props.type !== 'password') return
|
|
37
|
+
|
|
38
|
+
node.addProps(['toggleVisibility', 'showPrefixLock'])
|
|
39
|
+
|
|
40
|
+
if (isTruthy(node.props.toggleVisibility)) {
|
|
41
|
+
loadIcon(node, 'suffixIcon', 'farEyeSlash')
|
|
42
|
+
node.addProps(['onSuffixIconClick'])
|
|
43
|
+
node.props.onSuffixIconClick = (innerNode) => {
|
|
44
|
+
const el = document.getElementById(innerNode.props.id)
|
|
45
|
+
if (!el) return
|
|
46
|
+
const isHidden = el.type === 'password'
|
|
47
|
+
el.type = isHidden ? 'text' : 'password'
|
|
48
|
+
innerNode.props.suffixIcon = isHidden ? 'farEye' : 'farEyeSlash'
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (isTruthy(node.props.showPrefixLock)) {
|
|
53
|
+
loadIcon(node, 'prefixIcon', 'farLock')
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
package/src/plugins/index.js
CHANGED