@wishbone-media/spark 1.1.0 → 1.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.
- package/dist/index.js +2330 -2311
- package/formkit.theme.mjs +283 -283
- package/package.json +1 -1
- package/src/components/SparkButton.vue +5 -3
- package/src/components/SparkCard.vue +51 -32
- package/src/components/SparkSubNav.vue +3 -3
package/package.json
CHANGED
|
@@ -18,8 +18,8 @@ defineEmits(['click'])
|
|
|
18
18
|
const props = defineProps({
|
|
19
19
|
size: {
|
|
20
20
|
type: String,
|
|
21
|
-
default:
|
|
22
|
-
validator: (value) => ['xs', 'sm', 'md', 'lg', 'xl'].includes(value),
|
|
21
|
+
default: undefined,
|
|
22
|
+
validator: (value) => value === undefined || ['xs', 'sm', 'md', 'lg', 'xl'].includes(value),
|
|
23
23
|
},
|
|
24
24
|
variant: {
|
|
25
25
|
type: String,
|
|
@@ -37,6 +37,8 @@ const props = defineProps({
|
|
|
37
37
|
|
|
38
38
|
const buttonRef = ref(null)
|
|
39
39
|
const buttonGroup = inject('buttonGroup', null)
|
|
40
|
+
const headerContext = inject('sparkCardHeaderContext', null)
|
|
41
|
+
const effectiveSize = computed(() => props.size ?? headerContext?.buttonSize ?? 'md')
|
|
40
42
|
|
|
41
43
|
const groupPosition = computed(() => {
|
|
42
44
|
if (!buttonGroup?.isInGroup || !buttonRef.value) return null
|
|
@@ -91,7 +93,7 @@ const computedButtonClass = computed(() => {
|
|
|
91
93
|
let classes = 'cursor-pointer'
|
|
92
94
|
let roundingSize = ''
|
|
93
95
|
|
|
94
|
-
switch (
|
|
96
|
+
switch (effectiveSize.value) {
|
|
95
97
|
case 'xs':
|
|
96
98
|
classes += ' px-4 py-1 text-xs'
|
|
97
99
|
roundingSize = 'sm'
|
|
@@ -10,40 +10,52 @@
|
|
|
10
10
|
<slot name="header" />
|
|
11
11
|
</div>
|
|
12
12
|
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
v-if="props.title"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
<
|
|
13
|
+
<HeaderContext v-else-if="hasDefaultHeader">
|
|
14
|
+
<div
|
|
15
|
+
:class="[
|
|
16
|
+
'flex h-20 items-stretch justify-between gap-2.5 border-b border-gray-300 px-5',
|
|
17
|
+
props.headerClass,
|
|
18
|
+
]"
|
|
19
|
+
>
|
|
20
|
+
<div class="flex min-w-0 items-center gap-3">
|
|
21
|
+
<SparkButton
|
|
22
|
+
v-if="props.backTo"
|
|
23
|
+
variant="secondary"
|
|
24
|
+
size="sm"
|
|
25
|
+
button-class="w-[34px] h-[34px] grid place-content-center"
|
|
26
|
+
@click="router?.push(props.backTo)"
|
|
27
|
+
>
|
|
28
|
+
<FontAwesomeIcon :icon="Icons.farChevronLeft" class="text-gray-500" />
|
|
29
|
+
</SparkButton>
|
|
30
|
+
<h3 v-if="props.title" class="min-w-0 truncate font-semibold leading-6 text-gray-800">
|
|
31
|
+
{{ props.title }}
|
|
32
|
+
</h3>
|
|
33
|
+
<slot name="title-extra" />
|
|
34
|
+
<div v-if="$slots.nav" class="flex self-stretch items-stretch">
|
|
35
|
+
<slot name="nav" />
|
|
36
|
+
</div>
|
|
37
|
+
<div
|
|
38
|
+
v-if="$slots['header-left']"
|
|
39
|
+
class="flex items-center gap-2.5 text-sm text-gray-700 [&_.formkit-outer]:!mb-0"
|
|
40
|
+
>
|
|
41
|
+
<slot name="header-left" />
|
|
42
|
+
</div>
|
|
38
43
|
</div>
|
|
39
|
-
<slot name="header-left" />
|
|
40
|
-
</div>
|
|
41
44
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
<div
|
|
46
|
+
v-if="$slots['header-right'] || $slots.actions"
|
|
47
|
+
class="flex shrink-0 items-center gap-2.5"
|
|
48
|
+
>
|
|
49
|
+
<div
|
|
50
|
+
v-if="$slots['header-right']"
|
|
51
|
+
class="flex items-center gap-2.5 text-sm text-gray-700 [&_.formkit-outer]:!mb-0"
|
|
52
|
+
>
|
|
53
|
+
<slot name="header-right" />
|
|
54
|
+
</div>
|
|
55
|
+
<slot name="actions" />
|
|
56
|
+
</div>
|
|
45
57
|
</div>
|
|
46
|
-
</
|
|
58
|
+
</HeaderContext>
|
|
47
59
|
|
|
48
60
|
<div
|
|
49
61
|
ref="bodyEl"
|
|
@@ -60,12 +72,19 @@
|
|
|
60
72
|
</template>
|
|
61
73
|
|
|
62
74
|
<script setup>
|
|
63
|
-
import { computed, ref, useSlots } from 'vue'
|
|
75
|
+
import { computed, defineComponent, provide, ref, useSlots } from 'vue'
|
|
64
76
|
import { useRouter } from 'vue-router'
|
|
65
77
|
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
|
|
66
78
|
import { Icons } from '../plugins/fontawesome.js'
|
|
67
79
|
import SparkButton from './SparkButton.vue'
|
|
68
80
|
|
|
81
|
+
const HeaderContext = defineComponent({
|
|
82
|
+
setup(_, { slots }) {
|
|
83
|
+
provide('sparkCardHeaderContext', { buttonSize: 'xl' })
|
|
84
|
+
return () => slots.default?.()
|
|
85
|
+
},
|
|
86
|
+
})
|
|
87
|
+
|
|
69
88
|
const props = defineProps({
|
|
70
89
|
padded: {
|
|
71
90
|
type: Boolean,
|
|
@@ -220,10 +220,10 @@ function getItemClasses(item) {
|
|
|
220
220
|
|
|
221
221
|
// Tabs layout (underline style)
|
|
222
222
|
function getTabsClasses(isActive, isDisabled) {
|
|
223
|
-
const classes = ['border-b-2 -mb-
|
|
223
|
+
const classes = ['border-b-2 -mb-2px rounded-t font-medium']
|
|
224
224
|
|
|
225
225
|
// Size classes
|
|
226
|
-
const sizeClasses = props.compact ? 'text-sm px-3 py-1.5' : 'text-sm px-
|
|
226
|
+
const sizeClasses = props.compact ? 'text-sm px-3 py-1.5' : 'text-sm px-5 py-4'
|
|
227
227
|
classes.push(sizeClasses)
|
|
228
228
|
|
|
229
229
|
if (isActive) {
|
|
@@ -241,7 +241,7 @@ function getTabsClasses(isActive, isDisabled) {
|
|
|
241
241
|
function getButtonClasses(isActive, isDisabled) {
|
|
242
242
|
const classes = ['rounded-lg border font-medium']
|
|
243
243
|
|
|
244
|
-
classes.push(props.compact ? 'text-sm px-3 py-1.5' : 'text-sm px-4 py-2')
|
|
244
|
+
classes.push(props.compact ? 'text-sm px-3 py-1.5' : 'text-sm px-4 py-2.5')
|
|
245
245
|
|
|
246
246
|
if (isActive) {
|
|
247
247
|
classes.push('border-gray-300 bg-white text-gray-900')
|