@redseed/redseed-ui-vue3 1.2.0 → 1.4.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/index.js +28 -8
- package/package.json +1 -1
- package/src/components/Button/ButtonDanger.vue +40 -0
- package/src/components/Button/ButtonDangerFull.vue +24 -0
- package/src/components/Button/ButtonDangerFullRounded.vue +25 -0
- package/src/components/Button/ButtonDangerRounded.vue +24 -0
- package/src/components/Button/ButtonPrimary.vue +2 -21
- package/src/components/Button/{ButtonPrimaryLight.vue → ButtonPrimaryFull.vue} +1 -1
- package/src/components/Button/{ButtonPrimaryLightRounded.vue → ButtonPrimaryFullRounded.vue} +1 -1
- package/src/components/Button/ButtonSecondary.vue +2 -21
- package/src/components/Button/{ButtonSecondaryLight.vue → ButtonSecondaryFull.vue} +1 -1
- package/src/components/Button/{ButtonSecondaryLightRounded.vue → ButtonSecondaryFullRounded.vue} +1 -1
- package/src/components/Button/ButtonSlot.vue +15 -3
- package/src/components/Button/ButtonTertiary.vue +40 -0
- package/src/components/Button/ButtonTertiaryFull.vue +24 -0
- package/src/components/Button/ButtonTertiaryFullRounded.vue +25 -0
- package/src/components/Button/ButtonTertiaryRounded.vue +24 -0
- package/src/components/DropdownMenu/DropdownMenu.vue +123 -0
- package/src/components/DropdownMenu/DropdownOption.vue +16 -0
- package/src/components/Form/FormFieldsLogin.vue +3 -3
- package/src/components/Form/FormFieldsRegister.vue +3 -3
- package/src/components/Modal/Modal.vue +27 -8
- package/src/components/PageHeading/PageHeading.vue +5 -5
package/index.js
CHANGED
|
@@ -1,13 +1,23 @@
|
|
|
1
|
+
import ButtonDanger from './src/components/Button/ButtonDanger.vue'
|
|
2
|
+
import ButtonDangerFull from './src/components/Button/ButtonDangerFull.vue'
|
|
3
|
+
import ButtonDangerFullRounded from './src/components/Button/ButtonDangerFullRounded.vue'
|
|
4
|
+
import ButtonDangerRounded from './src/components/Button/ButtonDangerRounded.vue'
|
|
1
5
|
import ButtonPrimary from './src/components/Button/ButtonPrimary.vue'
|
|
2
|
-
import
|
|
3
|
-
import
|
|
6
|
+
import ButtonPrimaryFull from './src/components/Button/ButtonPrimaryFull.vue'
|
|
7
|
+
import ButtonPrimaryFullRounded from './src/components/Button/ButtonPrimaryFullRounded.vue'
|
|
4
8
|
import ButtonPrimaryRounded from './src/components/Button/ButtonPrimaryRounded.vue'
|
|
5
9
|
import ButtonSecondary from './src/components/Button/ButtonSecondary.vue'
|
|
6
|
-
import
|
|
7
|
-
import
|
|
10
|
+
import ButtonSecondaryFull from './src/components/Button/ButtonSecondaryFull.vue'
|
|
11
|
+
import ButtonSecondaryFullRounded from './src/components/Button/ButtonSecondaryFullRounded.vue'
|
|
8
12
|
import ButtonSecondaryRounded from './src/components/Button/ButtonSecondaryRounded.vue'
|
|
9
13
|
import ButtonSlot from './src/components/Button/ButtonSlot.vue'
|
|
14
|
+
import ButtonTertiary from './src/components/Button/ButtonTertiary.vue'
|
|
15
|
+
import ButtonTertiaryFull from './src/components/Button/ButtonTertiaryFull.vue'
|
|
16
|
+
import ButtonTertiaryFullRounded from './src/components/Button/ButtonTertiaryFullRounded.vue'
|
|
17
|
+
import ButtonTertiaryRounded from './src/components/Button/ButtonTertiaryRounded.vue'
|
|
10
18
|
import Card from './src/components/Card/Card.vue'
|
|
19
|
+
import DropdownMenu from './src/components/DropdownMenu/DropdownMenu.vue'
|
|
20
|
+
import DropdownOption from './src/components/DropdownMenu/DropdownOption.vue'
|
|
11
21
|
import FormFieldCheckbox from './src/components/FormField/FormFieldCheckbox.vue'
|
|
12
22
|
import FormFieldEmail from './src/components/FormField/FormFieldEmail.vue'
|
|
13
23
|
import FormFieldHidden from './src/components/FormField/FormFieldHidden.vue'
|
|
@@ -35,16 +45,26 @@ import SignUpWithGoogle from './src/components/Social/SignUpWithGoogle.vue'
|
|
|
35
45
|
import TwoColumnLayout from './src/components/TwoColumnLayout/TwoColumnLayout.vue'
|
|
36
46
|
|
|
37
47
|
export {
|
|
48
|
+
ButtonDanger,
|
|
49
|
+
ButtonDangerFull,
|
|
50
|
+
ButtonDangerFullRounded,
|
|
51
|
+
ButtonDangerRounded,
|
|
38
52
|
ButtonPrimary,
|
|
39
|
-
|
|
40
|
-
|
|
53
|
+
ButtonPrimaryFull,
|
|
54
|
+
ButtonPrimaryFullRounded,
|
|
41
55
|
ButtonPrimaryRounded,
|
|
42
56
|
ButtonSecondary,
|
|
43
|
-
|
|
44
|
-
|
|
57
|
+
ButtonSecondaryFull,
|
|
58
|
+
ButtonSecondaryFullRounded,
|
|
45
59
|
ButtonSecondaryRounded,
|
|
46
60
|
ButtonSlot,
|
|
61
|
+
ButtonTertiary,
|
|
62
|
+
ButtonTertiaryFull,
|
|
63
|
+
ButtonTertiaryFullRounded,
|
|
64
|
+
ButtonTertiaryRounded,
|
|
47
65
|
Card,
|
|
66
|
+
DropdownMenu,
|
|
67
|
+
DropdownOption,
|
|
48
68
|
FormFieldCheckbox,
|
|
49
69
|
FormFieldEmail,
|
|
50
70
|
FormFieldHidden,
|
package/package.json
CHANGED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import ButtonSlot from './ButtonSlot.vue'
|
|
4
|
+
|
|
5
|
+
defineOptions({
|
|
6
|
+
inheritAttrs: false,
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
const buttonClass = computed(() => [
|
|
10
|
+
'button-danger',
|
|
11
|
+
])
|
|
12
|
+
</script>
|
|
13
|
+
<template>
|
|
14
|
+
<ButtonSlot
|
|
15
|
+
:class="buttonClass"
|
|
16
|
+
v-bind="$attrs"
|
|
17
|
+
>
|
|
18
|
+
<template #icon v-if="$slots.icon">
|
|
19
|
+
<slot name="icon"></slot>
|
|
20
|
+
</template>
|
|
21
|
+
<template #label v-if="$slots.default">
|
|
22
|
+
<slot></slot>
|
|
23
|
+
</template>
|
|
24
|
+
</ButtonSlot>
|
|
25
|
+
</template>
|
|
26
|
+
<style lang="scss" scoped>
|
|
27
|
+
.button-danger {
|
|
28
|
+
// default colors
|
|
29
|
+
@apply bg-white text-danger ring-danger/20 border-danger;
|
|
30
|
+
// default hover state
|
|
31
|
+
@apply hover:bg-white hover:text-danger-dark hover:border-danger-dark;
|
|
32
|
+
// default focus state
|
|
33
|
+
@apply focus-visible:border-transparent focus-visible:text-danger;
|
|
34
|
+
// default active state
|
|
35
|
+
@apply active:ring-0 active:text-danger active:border-danger;
|
|
36
|
+
// default disabled state
|
|
37
|
+
@apply disabled:text-danger/30 disabled:border-danger/30 disabled:bg-white;
|
|
38
|
+
@apply disabled:active:ring-0 disabled:focus:ring-0;
|
|
39
|
+
}
|
|
40
|
+
</style>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import ButtonDanger from './ButtonDanger.vue'
|
|
4
|
+
|
|
5
|
+
defineOptions({
|
|
6
|
+
inheritAttrs: false,
|
|
7
|
+
})
|
|
8
|
+
</script>
|
|
9
|
+
<template>
|
|
10
|
+
<ButtonDanger
|
|
11
|
+
full
|
|
12
|
+
v-bind="$attrs"
|
|
13
|
+
>
|
|
14
|
+
<template #icon v-if="$slots.icon">
|
|
15
|
+
<slot name="icon"></slot>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<template #default v-if="$slots.default">
|
|
19
|
+
<slot></slot>
|
|
20
|
+
</template>
|
|
21
|
+
</ButtonDanger>
|
|
22
|
+
</template>
|
|
23
|
+
<style lang="scss" scoped>
|
|
24
|
+
</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import ButtonDanger from './ButtonDanger.vue'
|
|
4
|
+
|
|
5
|
+
defineOptions({
|
|
6
|
+
inheritAttrs: false,
|
|
7
|
+
})
|
|
8
|
+
</script>
|
|
9
|
+
<template>
|
|
10
|
+
<ButtonDanger
|
|
11
|
+
full
|
|
12
|
+
rounded
|
|
13
|
+
v-bind="$attrs"
|
|
14
|
+
>
|
|
15
|
+
<template #icon v-if="$slots.icon">
|
|
16
|
+
<slot name="icon"></slot>
|
|
17
|
+
</template>
|
|
18
|
+
|
|
19
|
+
<template #default v-if="$slots.default">
|
|
20
|
+
<slot></slot>
|
|
21
|
+
</template>
|
|
22
|
+
</ButtonDanger>
|
|
23
|
+
</template>
|
|
24
|
+
<style lang="scss" scoped>
|
|
25
|
+
</style>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import ButtonDanger from './ButtonDanger.vue'
|
|
4
|
+
|
|
5
|
+
defineOptions({
|
|
6
|
+
inheritAttrs: false,
|
|
7
|
+
})
|
|
8
|
+
</script>
|
|
9
|
+
<template>
|
|
10
|
+
<ButtonDanger
|
|
11
|
+
rounded
|
|
12
|
+
v-bind="$attrs"
|
|
13
|
+
>
|
|
14
|
+
<template #icon v-if="$slots.icon">
|
|
15
|
+
<slot name="icon"></slot>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<template #default v-if="$slots.default">
|
|
19
|
+
<slot></slot>
|
|
20
|
+
</template>
|
|
21
|
+
</ButtonDanger>
|
|
22
|
+
</template>
|
|
23
|
+
<style lang="scss" scoped>
|
|
24
|
+
</style>
|
|
@@ -6,23 +6,13 @@ defineOptions({
|
|
|
6
6
|
inheritAttrs: false,
|
|
7
7
|
})
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
light: {
|
|
11
|
-
type: Boolean,
|
|
12
|
-
default: false,
|
|
13
|
-
},
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
const buttonPrimaryClass = computed(() => [
|
|
9
|
+
const buttonClass = computed(() => [
|
|
17
10
|
'button-primary',
|
|
18
|
-
{
|
|
19
|
-
'button-primary--light': props.light,
|
|
20
|
-
},
|
|
21
11
|
])
|
|
22
12
|
</script>
|
|
23
13
|
<template>
|
|
24
14
|
<ButtonSlot
|
|
25
|
-
:class="
|
|
15
|
+
:class="buttonClass"
|
|
26
16
|
v-bind="$attrs"
|
|
27
17
|
>
|
|
28
18
|
<template #icon v-if="$slots.icon">
|
|
@@ -44,14 +34,5 @@ const buttonPrimaryClass = computed(() => [
|
|
|
44
34
|
// default disabled state
|
|
45
35
|
@apply disabled:bg-primary/20 disabled:border-transparent;
|
|
46
36
|
@apply disabled:active:ring-0 disabled:focus:ring-0;
|
|
47
|
-
|
|
48
|
-
&--light {
|
|
49
|
-
@apply bg-white text-primary;
|
|
50
|
-
@apply hover:bg-white hover:text-primary-dark;
|
|
51
|
-
@apply focus-visible:border-transparent;
|
|
52
|
-
@apply active:ring-0 active:text-primary;
|
|
53
|
-
@apply disabled:text-primary/30 disabled:border-primary/30 disabled:bg-white;
|
|
54
|
-
@apply disabled:active:ring-0 disabled:focus:ring-0;
|
|
55
|
-
}
|
|
56
37
|
}
|
|
57
38
|
</style>
|
|
@@ -6,23 +6,13 @@ defineOptions({
|
|
|
6
6
|
inheritAttrs: false,
|
|
7
7
|
})
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
light: {
|
|
11
|
-
type: Boolean,
|
|
12
|
-
default: false,
|
|
13
|
-
},
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
const buttonSecondaryClass = computed(() => [
|
|
9
|
+
const buttonClass = computed(() => [
|
|
17
10
|
'button-secondary',
|
|
18
|
-
{
|
|
19
|
-
'button-secondary--light': props.light,
|
|
20
|
-
},
|
|
21
11
|
])
|
|
22
12
|
</script>
|
|
23
13
|
<template>
|
|
24
14
|
<ButtonSlot
|
|
25
|
-
:class="
|
|
15
|
+
:class="buttonClass"
|
|
26
16
|
v-bind="$attrs"
|
|
27
17
|
>
|
|
28
18
|
<template #icon v-if="$slots.icon">
|
|
@@ -44,14 +34,5 @@ const buttonSecondaryClass = computed(() => [
|
|
|
44
34
|
// default disabled state
|
|
45
35
|
@apply disabled:bg-secondary/20 disabled:border-transparent;
|
|
46
36
|
@apply disabled:active:ring-0 disabled:focus:ring-0;
|
|
47
|
-
|
|
48
|
-
&--light {
|
|
49
|
-
@apply bg-white text-secondary;
|
|
50
|
-
@apply hover:bg-white hover:text-secondary-dark;
|
|
51
|
-
@apply focus-visible:border-transparent;
|
|
52
|
-
@apply active:ring-0 active:text-secondary;
|
|
53
|
-
@apply disabled:text-secondary/30 disabled:border-secondary/30 disabled:bg-white;
|
|
54
|
-
@apply disabled:active:ring-0 disabled:focus:ring-0;
|
|
55
|
-
}
|
|
56
37
|
}
|
|
57
38
|
</style>
|
|
@@ -150,15 +150,18 @@ const buttonSlotIconClass = computed(() => [
|
|
|
150
150
|
@apply px-1.5;
|
|
151
151
|
}
|
|
152
152
|
.button-slot__icon {
|
|
153
|
-
@apply w-
|
|
153
|
+
@apply w-4 h-4;
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
// modifier sm size
|
|
157
157
|
&--sm {
|
|
158
158
|
@apply text-sm;
|
|
159
|
-
@apply px-3 py-
|
|
159
|
+
@apply px-3 py-2;
|
|
160
160
|
&--icon {
|
|
161
|
-
@apply px-
|
|
161
|
+
@apply px-2;
|
|
162
|
+
}
|
|
163
|
+
.button-slot__icon {
|
|
164
|
+
@apply w-5 h-5;
|
|
162
165
|
}
|
|
163
166
|
}
|
|
164
167
|
// modifier md size
|
|
@@ -168,6 +171,12 @@ const buttonSlotIconClass = computed(() => [
|
|
|
168
171
|
&--icon {
|
|
169
172
|
@apply px-2;
|
|
170
173
|
}
|
|
174
|
+
.button-slot__icon {
|
|
175
|
+
@apply w-5 h-5;
|
|
176
|
+
&--only {
|
|
177
|
+
@apply w-6 h-6;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
171
180
|
}
|
|
172
181
|
// modifier lg size
|
|
173
182
|
&--lg {
|
|
@@ -178,6 +187,9 @@ const buttonSlotIconClass = computed(() => [
|
|
|
178
187
|
}
|
|
179
188
|
.button-slot__icon {
|
|
180
189
|
@apply w-5 h-5;
|
|
190
|
+
&--only {
|
|
191
|
+
@apply w-7 h-7;
|
|
192
|
+
}
|
|
181
193
|
}
|
|
182
194
|
}
|
|
183
195
|
// modifier icon at the end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import ButtonSlot from './ButtonSlot.vue'
|
|
4
|
+
|
|
5
|
+
defineOptions({
|
|
6
|
+
inheritAttrs: false,
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
const buttonClass = computed(() => [
|
|
10
|
+
'button-tertiary',
|
|
11
|
+
])
|
|
12
|
+
</script>
|
|
13
|
+
<template>
|
|
14
|
+
<ButtonSlot
|
|
15
|
+
:class="buttonClass"
|
|
16
|
+
v-bind="$attrs"
|
|
17
|
+
>
|
|
18
|
+
<template #icon v-if="$slots.icon">
|
|
19
|
+
<slot name="icon"></slot>
|
|
20
|
+
</template>
|
|
21
|
+
<template #label v-if="$slots.default">
|
|
22
|
+
<slot></slot>
|
|
23
|
+
</template>
|
|
24
|
+
</ButtonSlot>
|
|
25
|
+
</template>
|
|
26
|
+
<style lang="scss" scoped>
|
|
27
|
+
.button-tertiary {
|
|
28
|
+
// default colors
|
|
29
|
+
@apply bg-white text-tertiary-dark ring-tertiary-dark/20 border-tertiary-dark;
|
|
30
|
+
// default hover state
|
|
31
|
+
@apply hover:bg-white hover:text-tertiary hover:border-tertiary;
|
|
32
|
+
// default focus state
|
|
33
|
+
@apply focus-visible:border-transparent focus-visible:text-tertiary;
|
|
34
|
+
// default active state
|
|
35
|
+
@apply active:ring-0 active:text-tertiary-dark active:border-tertiary-dark;
|
|
36
|
+
// default disabled state
|
|
37
|
+
@apply disabled:text-tertiary-dark/30 disabled:border-tertiary-dark/30 disabled:bg-white;
|
|
38
|
+
@apply disabled:active:ring-0 disabled:focus:ring-0;
|
|
39
|
+
}
|
|
40
|
+
</style>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import ButtonTertiary from './ButtonTertiary.vue'
|
|
4
|
+
|
|
5
|
+
defineOptions({
|
|
6
|
+
inheritAttrs: false,
|
|
7
|
+
})
|
|
8
|
+
</script>
|
|
9
|
+
<template>
|
|
10
|
+
<ButtonTertiary
|
|
11
|
+
full
|
|
12
|
+
v-bind="$attrs"
|
|
13
|
+
>
|
|
14
|
+
<template #icon v-if="$slots.icon">
|
|
15
|
+
<slot name="icon"></slot>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<template #default v-if="$slots.default">
|
|
19
|
+
<slot></slot>
|
|
20
|
+
</template>
|
|
21
|
+
</ButtonTertiary>
|
|
22
|
+
</template>
|
|
23
|
+
<style lang="scss" scoped>
|
|
24
|
+
</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import ButtonTertiary from './ButtonTertiary.vue'
|
|
4
|
+
|
|
5
|
+
defineOptions({
|
|
6
|
+
inheritAttrs: false,
|
|
7
|
+
})
|
|
8
|
+
</script>
|
|
9
|
+
<template>
|
|
10
|
+
<ButtonTertiary
|
|
11
|
+
full
|
|
12
|
+
rounded
|
|
13
|
+
v-bind="$attrs"
|
|
14
|
+
>
|
|
15
|
+
<template #icon v-if="$slots.icon">
|
|
16
|
+
<slot name="icon"></slot>
|
|
17
|
+
</template>
|
|
18
|
+
|
|
19
|
+
<template #default v-if="$slots.default">
|
|
20
|
+
<slot></slot>
|
|
21
|
+
</template>
|
|
22
|
+
</ButtonTertiary>
|
|
23
|
+
</template>
|
|
24
|
+
<style lang="scss" scoped>
|
|
25
|
+
</style>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import ButtonTertiary from './ButtonTertiary.vue'
|
|
4
|
+
|
|
5
|
+
defineOptions({
|
|
6
|
+
inheritAttrs: false,
|
|
7
|
+
})
|
|
8
|
+
</script>
|
|
9
|
+
<template>
|
|
10
|
+
<ButtonTertiary
|
|
11
|
+
rounded
|
|
12
|
+
v-bind="$attrs"
|
|
13
|
+
>
|
|
14
|
+
<template #icon v-if="$slots.icon">
|
|
15
|
+
<slot name="icon"></slot>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<template #default v-if="$slots.default">
|
|
19
|
+
<slot></slot>
|
|
20
|
+
</template>
|
|
21
|
+
</ButtonTertiary>
|
|
22
|
+
</template>
|
|
23
|
+
<style lang="scss" scoped>
|
|
24
|
+
</style>
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed, onMounted, onUnmounted, ref } from 'vue'
|
|
3
|
+
import ButtonTertiary from '../Button/ButtonTertiary.vue'
|
|
4
|
+
|
|
5
|
+
const props = defineProps({
|
|
6
|
+
right: {
|
|
7
|
+
type: Boolean,
|
|
8
|
+
default: false,
|
|
9
|
+
},
|
|
10
|
+
left: {
|
|
11
|
+
type: Boolean,
|
|
12
|
+
default: false,
|
|
13
|
+
},
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const isOpen = ref(false)
|
|
17
|
+
|
|
18
|
+
const defaultAlignment = computed(() => !props.right && !props.left)
|
|
19
|
+
|
|
20
|
+
const containerClass = computed(() => [
|
|
21
|
+
'dropdown-menu__container',
|
|
22
|
+
{
|
|
23
|
+
'dropdown-menu__container--open': isOpen.value,
|
|
24
|
+
'dropdown-menu__container--left': props.left || defaultAlignment.value,
|
|
25
|
+
'dropdown-menu__container--right': props.right,
|
|
26
|
+
},
|
|
27
|
+
])
|
|
28
|
+
|
|
29
|
+
function open() {
|
|
30
|
+
isOpen.value = true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function close() {
|
|
34
|
+
isOpen.value = false
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function closeOnEscape(e) {
|
|
38
|
+
if (isOpen.value && e.key === 'Escape') {
|
|
39
|
+
isOpen.value = false
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
onMounted(() => document.addEventListener('keydown', closeOnEscape))
|
|
44
|
+
onUnmounted(() => document.removeEventListener('keydown', closeOnEscape))
|
|
45
|
+
</script>
|
|
46
|
+
<template>
|
|
47
|
+
<div class="dropdown-menu">
|
|
48
|
+
<slot name="trigger" :open="open">
|
|
49
|
+
<ButtonTertiary @click="open">
|
|
50
|
+
<template #icon v-if="$slots['trigger-icon']">
|
|
51
|
+
<slot name=trigger-icon></slot>
|
|
52
|
+
</template>
|
|
53
|
+
<template #default v-if="$slots['trigger-label']">
|
|
54
|
+
<slot name="trigger-label"></slot>
|
|
55
|
+
</template>
|
|
56
|
+
</ButtonTertiary>
|
|
57
|
+
</slot>
|
|
58
|
+
|
|
59
|
+
<!-- Full Screen Dropdown Overlay -->
|
|
60
|
+
<div v-show="isOpen"
|
|
61
|
+
class="dropdown-menu__overlay"
|
|
62
|
+
@click="close"
|
|
63
|
+
></div>
|
|
64
|
+
|
|
65
|
+
<transition
|
|
66
|
+
enter-active-class="enter-active-class"
|
|
67
|
+
enter-from-class="enter-from-class"
|
|
68
|
+
enter-to-class="enter-to-class"
|
|
69
|
+
leave-active-class="leave-active-class"
|
|
70
|
+
leave-from-class="leave-from-class"
|
|
71
|
+
leave-to-class="leave-to-class"
|
|
72
|
+
>
|
|
73
|
+
<div
|
|
74
|
+
v-show="isOpen"
|
|
75
|
+
:class="containerClass"
|
|
76
|
+
@click="close"
|
|
77
|
+
>
|
|
78
|
+
<slot></slot>
|
|
79
|
+
</div>
|
|
80
|
+
</transition>
|
|
81
|
+
</div>
|
|
82
|
+
</template>
|
|
83
|
+
<style lang="scss" scoped>
|
|
84
|
+
.enter-active-class {
|
|
85
|
+
@apply transition ease-out duration-200;
|
|
86
|
+
}
|
|
87
|
+
.enter-from-class {
|
|
88
|
+
@apply transform opacity-0 scale-95;
|
|
89
|
+
}
|
|
90
|
+
.enter-to-class {
|
|
91
|
+
@apply transform opacity-100 scale-100;
|
|
92
|
+
}
|
|
93
|
+
.leave-active-class {
|
|
94
|
+
@apply transition ease-in duration-75;
|
|
95
|
+
}
|
|
96
|
+
.leave-from-class {
|
|
97
|
+
@apply transform opacity-100 scale-100;
|
|
98
|
+
}
|
|
99
|
+
.leave-to-class {
|
|
100
|
+
@apply transform opacity-0 scale-95;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.dropdown-menu {
|
|
104
|
+
@apply w-fit relative;
|
|
105
|
+
&__overlay {
|
|
106
|
+
@apply fixed inset-0 z-40;
|
|
107
|
+
}
|
|
108
|
+
&__container {
|
|
109
|
+
@apply hidden absolute z-50 mt-2 p-2 w-76 origin-top;
|
|
110
|
+
@apply rounded-md shadow-full-light bg-white;
|
|
111
|
+
@apply flex flex-col space-y-2;
|
|
112
|
+
&--open {
|
|
113
|
+
@apply block;
|
|
114
|
+
}
|
|
115
|
+
&--left {
|
|
116
|
+
@apply origin-top-left left-0;
|
|
117
|
+
}
|
|
118
|
+
&--right {
|
|
119
|
+
@apply origin-top-right right-0;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
</style>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
const emit = defineEmits(['click'])
|
|
3
|
+
</script>
|
|
4
|
+
<template>
|
|
5
|
+
<div class="dropdown-option"
|
|
6
|
+
@click="$emit('click')"
|
|
7
|
+
>
|
|
8
|
+
<slot></slot>
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
11
|
+
<style lang="scss" scoped>
|
|
12
|
+
.dropdown-option {
|
|
13
|
+
@apply cursor-pointer p-4 bg-white rounded-md text-base transition;
|
|
14
|
+
@apply hover:bg-gray-200;
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { ref } from 'vue'
|
|
3
|
-
import
|
|
3
|
+
import ButtonPrimaryFull from '../Button/ButtonPrimaryFull.vue'
|
|
4
4
|
import FormFieldEmail from '../FormField/FormFieldEmail.vue'
|
|
5
5
|
import FormFieldPassword from '../FormField/FormFieldPassword.vue'
|
|
6
6
|
import FormFieldSlot from '../FormField/FormFieldSlot.vue'
|
|
@@ -67,11 +67,11 @@ const formRef = ref(props.form)
|
|
|
67
67
|
<slot name="submit"
|
|
68
68
|
:formRef="formRef"
|
|
69
69
|
>
|
|
70
|
-
<
|
|
70
|
+
<ButtonPrimaryFull lg submit :disabled="form.processing">
|
|
71
71
|
<slot name="submit-label">
|
|
72
72
|
Log in
|
|
73
73
|
</slot>
|
|
74
|
-
</
|
|
74
|
+
</ButtonPrimaryFull>
|
|
75
75
|
</slot>
|
|
76
76
|
|
|
77
77
|
<div v-if="$slots.signup" class="form-login__signup">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { ref } from 'vue'
|
|
3
|
-
import
|
|
3
|
+
import ButtonPrimaryFull from '../Button/ButtonPrimaryFull.vue'
|
|
4
4
|
import FormFieldCheckbox from '../FormField/FormFieldCheckbox.vue'
|
|
5
5
|
import FormFieldEmail from '../FormField/FormFieldEmail.vue'
|
|
6
6
|
import FormFieldPasswordToggle from '../FormField/FormFieldPasswordToggle.vue'
|
|
@@ -99,11 +99,11 @@ const formRef = ref(props.form)
|
|
|
99
99
|
<slot name="submit"
|
|
100
100
|
:formRef="formRef"
|
|
101
101
|
>
|
|
102
|
-
<
|
|
102
|
+
<ButtonPrimaryFull lg submit :disabled="form.processing">
|
|
103
103
|
<slot name="submit-label">
|
|
104
104
|
Register
|
|
105
105
|
</slot>
|
|
106
|
-
</
|
|
106
|
+
</ButtonPrimaryFull>
|
|
107
107
|
</slot>
|
|
108
108
|
|
|
109
109
|
<div v-if="$slots.signin" class="form-register__signin">
|
|
@@ -77,13 +77,13 @@ watch(() => props.show, () => {
|
|
|
77
77
|
}
|
|
78
78
|
})
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
function close() {
|
|
81
81
|
if (props.closeable) {
|
|
82
82
|
emit('close')
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
function closeOnEscape(e) {
|
|
87
87
|
if (e.key === 'Escape' && props.show) {
|
|
88
88
|
close()
|
|
89
89
|
}
|
|
@@ -115,12 +115,12 @@ onUnmounted(() => {
|
|
|
115
115
|
</transition>
|
|
116
116
|
|
|
117
117
|
<transition
|
|
118
|
-
enter-active-class="
|
|
119
|
-
enter-from-class="
|
|
120
|
-
enter-to-class="
|
|
121
|
-
leave-active-class="
|
|
122
|
-
leave-from-class="
|
|
123
|
-
leave-to-class="
|
|
118
|
+
enter-active-class="enter-active-class"
|
|
119
|
+
enter-from-class="enter-from-class"
|
|
120
|
+
enter-to-class="enter-to-class"
|
|
121
|
+
leave-active-class="leave-active-class"
|
|
122
|
+
leave-from-class="leave-from-class"
|
|
123
|
+
leave-to-class="leave-to-class"
|
|
124
124
|
>
|
|
125
125
|
<div v-if="show"
|
|
126
126
|
:class="modalContentClass"
|
|
@@ -150,6 +150,25 @@ onUnmounted(() => {
|
|
|
150
150
|
</teleport>
|
|
151
151
|
</template>
|
|
152
152
|
<style lang="scss" scoped>
|
|
153
|
+
.enter-active-class {
|
|
154
|
+
@apply transition ease-out duration-200;
|
|
155
|
+
}
|
|
156
|
+
.enter-from-class {
|
|
157
|
+
@apply transform opacity-0 scale-95;
|
|
158
|
+
}
|
|
159
|
+
.enter-to-class {
|
|
160
|
+
@apply transform opacity-100 scale-100;
|
|
161
|
+
}
|
|
162
|
+
.leave-active-class {
|
|
163
|
+
@apply transition ease-in duration-75;
|
|
164
|
+
}
|
|
165
|
+
.leave-from-class {
|
|
166
|
+
@apply transform opacity-100 scale-100;
|
|
167
|
+
}
|
|
168
|
+
.leave-to-class {
|
|
169
|
+
@apply transform opacity-0 scale-95;
|
|
170
|
+
}
|
|
171
|
+
|
|
153
172
|
.modal {
|
|
154
173
|
@apply fixed inset-0 overflow-y-auto px-4 py-6 md:px-0 z-50;
|
|
155
174
|
&__background-wrapper {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { ref, computed } from 'vue'
|
|
3
3
|
import Modal from '../Modal/Modal.vue'
|
|
4
|
-
import
|
|
4
|
+
import ButtonTertiary from '../Button/ButtonTertiary.vue'
|
|
5
5
|
|
|
6
6
|
const showMetaModal = ref(false)
|
|
7
7
|
</script>
|
|
@@ -29,9 +29,9 @@ const showMetaModal = ref(false)
|
|
|
29
29
|
<div v-if="$slots['meta-action-label'] && $slots['meta']"
|
|
30
30
|
class="page-heading__meta-action"
|
|
31
31
|
>
|
|
32
|
-
<
|
|
32
|
+
<ButtonTertiary @click="showMetaModal = true">
|
|
33
33
|
<slot name="meta-action-label"></slot>
|
|
34
|
-
</
|
|
34
|
+
</ButtonTertiary>
|
|
35
35
|
|
|
36
36
|
<Modal v-if="$slots['meta']"
|
|
37
37
|
class="page-heading__meta-modal"
|
|
@@ -55,9 +55,9 @@ const showMetaModal = ref(false)
|
|
|
55
55
|
<slot name="meta-modal-footer"></slot>
|
|
56
56
|
</div>
|
|
57
57
|
|
|
58
|
-
<
|
|
58
|
+
<ButtonTertiary @click="showMetaModal = false">
|
|
59
59
|
<slot name="meta-modal-close-label"></slot>
|
|
60
|
-
</
|
|
60
|
+
</ButtonTertiary>
|
|
61
61
|
</template>
|
|
62
62
|
</Modal>
|
|
63
63
|
</div>
|