sprintify-ui 0.0.19 → 0.0.21
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/sprintify-ui.es.js +6877 -4264
- package/dist/types/src/components/BaseActionItem.vue.d.ts +121 -0
- package/dist/types/src/components/BaseAlert.vue.d.ts +3 -3
- package/dist/types/src/components/BaseAppDialogs.vue.d.ts +1 -1
- package/dist/types/src/components/BaseBoolean.vue.d.ts +2 -2
- package/dist/types/src/components/BaseCounter.vue.d.ts +3 -3
- package/dist/types/src/components/BaseDialog.vue.d.ts +4 -4
- package/dist/types/src/components/BaseInput.vue.d.ts +1 -1
- package/dist/types/src/components/BaseLayoutNotificationDropdown.vue.d.ts +24 -0
- package/dist/types/src/components/BaseLayoutNotificationItem.vue.d.ts +14 -0
- package/dist/types/src/components/BaseLayoutSidebar.vue.d.ts +114 -0
- package/dist/types/src/components/BaseLayoutSidebarConfigurable.vue.d.ts +182 -0
- package/dist/types/src/components/BaseLayoutStacked.vue.d.ts +76 -0
- package/dist/types/src/components/BaseLayoutStackedConfigurable.vue.d.ts +182 -0
- package/dist/types/src/components/BaseMenu.vue.d.ts +17 -15
- package/dist/types/src/components/BaseMenuItem.vue.d.ts +5 -5
- package/dist/types/src/components/BaseNavbar.vue.d.ts +20 -1
- package/dist/types/src/components/BaseNavbarItem.vue.d.ts +17 -71
- package/dist/types/src/components/BaseNavbarItemContent.vue.d.ts +11 -2
- package/dist/types/src/components/BaseNavbarSideItem.vue.d.ts +26 -0
- package/dist/types/src/components/BaseNavbarSideItemContent.vue.d.ts +50 -0
- package/dist/types/src/components/BaseSwitch.vue.d.ts +3 -3
- package/dist/types/src/components/BaseSystemAlert.vue.d.ts +8 -8
- package/dist/types/src/components/BaseTableColumn.vue.d.ts +1 -1
- package/dist/types/src/components/index.d.ts +6 -1
- package/dist/types/src/index.d.ts +12 -0
- package/dist/types/src/types/Notification.d.ts +8 -0
- package/dist/types/src/types/types.d.ts +9 -0
- package/package.json +6 -3
- package/src/components/BaseActionItem.vue +68 -0
- package/src/components/{HasMany.stories.js → BaseHasMany.stories.js} +0 -0
- package/src/components/BaseLayoutNotificationDropdown.vue +101 -0
- package/src/components/BaseLayoutNotificationItem.vue +58 -0
- package/src/components/BaseLayoutSidebar.vue +199 -0
- package/src/components/BaseLayoutSidebarConfigurable.stories.js +129 -0
- package/src/components/BaseLayoutSidebarConfigurable.vue +118 -0
- package/src/components/BaseLayoutStacked.vue +52 -0
- package/src/components/BaseLayoutStackedConfigurable.stories.js +110 -0
- package/src/components/BaseLayoutStackedConfigurable.vue +129 -0
- package/src/components/BaseMediaItem.vue +7 -7
- package/src/components/BaseMediaLibrary.vue +3 -3
- package/src/components/BaseMediaPreview.vue +1 -1
- package/src/components/BaseMenu.vue +12 -4
- package/src/components/BaseNavbar.stories.js +18 -14
- package/src/components/BaseNavbar.vue +19 -3
- package/src/components/BaseNavbarItem.vue +17 -43
- package/src/components/BaseNavbarItemContent.vue +36 -16
- package/src/components/BaseNavbarSideItem.vue +42 -0
- package/src/components/BaseNavbarSideItemContent.vue +77 -0
- package/src/components/index.ts +11 -0
- package/src/lang/en.json +3 -0
- package/src/lang/fr.json +3 -0
- package/src/types/Notification.ts +10 -0
- package/src/types/types.ts +11 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import BaseNavbar from './BaseNavbar.vue';
|
|
2
2
|
import BaseNavbarItem from './BaseNavbarItem.vue';
|
|
3
|
+
import BaseNavbarSideItem from './BaseNavbarSideItem.vue';
|
|
3
4
|
import BaseAvatar from './BaseAvatar.vue';
|
|
4
5
|
import BaseMenu from './BaseMenu.vue';
|
|
5
6
|
import { Icon as BaseIcon } from '@iconify/vue';
|
|
@@ -8,12 +9,16 @@ export default {
|
|
|
8
9
|
title: 'Layout/BaseNavbar',
|
|
9
10
|
component: BaseNavbar,
|
|
10
11
|
args: {},
|
|
12
|
+
parameters: {
|
|
13
|
+
layout: 'fullscreen',
|
|
14
|
+
},
|
|
11
15
|
};
|
|
12
16
|
|
|
13
17
|
const Template = (args) => ({
|
|
14
18
|
components: {
|
|
15
19
|
BaseNavbar,
|
|
16
20
|
BaseNavbarItem,
|
|
21
|
+
BaseNavbarSideItem,
|
|
17
22
|
BaseIcon,
|
|
18
23
|
BaseAvatar,
|
|
19
24
|
BaseMenu,
|
|
@@ -36,13 +41,13 @@ const Template = (args) => ({
|
|
|
36
41
|
},
|
|
37
42
|
{
|
|
38
43
|
label: 'Products',
|
|
39
|
-
to: '/',
|
|
44
|
+
to: '/setup',
|
|
40
45
|
count: 234,
|
|
41
46
|
type: 'RouterLink',
|
|
42
47
|
},
|
|
43
48
|
{
|
|
44
49
|
label: 'Settings',
|
|
45
|
-
to: '/',
|
|
50
|
+
to: '/settings',
|
|
46
51
|
type: 'RouterLink',
|
|
47
52
|
},
|
|
48
53
|
];
|
|
@@ -66,28 +71,29 @@ const Template = (args) => ({
|
|
|
66
71
|
return { args, menu, userMenu, user };
|
|
67
72
|
},
|
|
68
73
|
template: `
|
|
69
|
-
<div class="
|
|
74
|
+
<div class="sticky top-0 left-0 w-full shadow">
|
|
70
75
|
<BaseNavbar v-bind="args">
|
|
71
76
|
<template #navbar>
|
|
72
77
|
<div class="flex h-16 justify-between">
|
|
73
78
|
<!-- Left -->
|
|
74
79
|
|
|
75
|
-
<div class="flex
|
|
80
|
+
<div class="flex justify-center">
|
|
76
81
|
<!-- Logo -->
|
|
77
82
|
<router-link to="/" class="flex flex-shrink-0 grow items-center p-2 pl-0">
|
|
78
83
|
<img
|
|
79
84
|
class="block h-8 w-auto"
|
|
80
|
-
src="https://sprintify.witify.io/img/logo/logo-side
|
|
85
|
+
src="https://sprintify.witify.io/img/logo/logo-side.svg"
|
|
81
86
|
alt="Sprintify"
|
|
82
87
|
/>
|
|
83
88
|
</router-link>
|
|
84
89
|
|
|
85
90
|
<!-- Links (desktop) -->
|
|
86
|
-
<div class="ml-10 hidden
|
|
91
|
+
<div class="ml-10 hidden space-x-4 md:flex">
|
|
87
92
|
<BaseNavbarItem
|
|
88
93
|
v-for="item in menu"
|
|
89
94
|
:key="item.label"
|
|
90
95
|
:item="item"
|
|
96
|
+
item-class="flex"
|
|
91
97
|
/>
|
|
92
98
|
</div>
|
|
93
99
|
</div>
|
|
@@ -102,7 +108,7 @@ const Template = (args) => ({
|
|
|
102
108
|
class="flex rounded-full"
|
|
103
109
|
:class="[open ? 'bg-slate-700 ring-2 ring-blue-500 ring-offset-2 ring-offset-slate-700' : '']"
|
|
104
110
|
>
|
|
105
|
-
<BaseAvatar
|
|
111
|
+
<BaseAvatar :user="user" />
|
|
106
112
|
</div>
|
|
107
113
|
</template>
|
|
108
114
|
</BaseMenu>
|
|
@@ -112,16 +118,15 @@ const Template = (args) => ({
|
|
|
112
118
|
|
|
113
119
|
<template #mobile>
|
|
114
120
|
<!-- Links mobile -->
|
|
115
|
-
<div class="space-y-1 p-2">
|
|
116
|
-
<
|
|
121
|
+
<div class="space-y-1 p-2 pt-0">
|
|
122
|
+
<BaseNavbarSideItem
|
|
117
123
|
v-for="item in menu"
|
|
118
124
|
:key="item.label"
|
|
119
125
|
:item="item"
|
|
120
|
-
class="flex w-full"
|
|
121
126
|
/>
|
|
122
127
|
</div>
|
|
123
128
|
|
|
124
|
-
<hr class="
|
|
129
|
+
<hr class="mb-4 mt-2 border-slate-200" />
|
|
125
130
|
|
|
126
131
|
<!-- Profile links -->
|
|
127
132
|
<div class="p-2 pb-6">
|
|
@@ -129,14 +134,13 @@ const Template = (args) => ({
|
|
|
129
134
|
:user="user"
|
|
130
135
|
show-details
|
|
131
136
|
size="base"
|
|
132
|
-
class="px-3
|
|
137
|
+
class="px-3"
|
|
133
138
|
/>
|
|
134
139
|
<div class="mt-4 space-y-1">
|
|
135
|
-
<
|
|
140
|
+
<BaseNavbarSideItem
|
|
136
141
|
v-for="item in userMenu"
|
|
137
142
|
:key="item.label"
|
|
138
143
|
:item="item"
|
|
139
|
-
class="flex w-full"
|
|
140
144
|
/>
|
|
141
145
|
</div>
|
|
142
146
|
</div>
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<nav
|
|
2
|
+
<nav
|
|
3
|
+
class="border-t-[3px] border-primary-500"
|
|
4
|
+
:class="[dark ? 'bg-slate-900' : 'bg-white']"
|
|
5
|
+
>
|
|
3
6
|
<BaseContainer :size="size">
|
|
4
7
|
<div class="flex h-16 justify-between">
|
|
5
8
|
<!-- Navbar (desktop and mobile) -->
|
|
@@ -11,7 +14,12 @@
|
|
|
11
14
|
<div class="-mr-2 flex items-center md:hidden">
|
|
12
15
|
<button
|
|
13
16
|
type="button"
|
|
14
|
-
class="inline-flex items-center justify-center rounded-md
|
|
17
|
+
class="inline-flex items-center justify-center rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-offset-2"
|
|
18
|
+
:class="[
|
|
19
|
+
dark
|
|
20
|
+
? 'text-slate-200 hover:bg-slate-800 hover:text-white focus:ring-slate-700 focus:ring-offset-slate-900'
|
|
21
|
+
: 'text-slate-500 hover:bg-slate-100 hover:text-slate-900 focus:ring-slate-300 focus:ring-offset-white',
|
|
22
|
+
]"
|
|
15
23
|
@click="toggleMenu()"
|
|
16
24
|
>
|
|
17
25
|
<span class="sr-only">Open main menu</span>
|
|
@@ -33,7 +41,11 @@
|
|
|
33
41
|
</BaseContainer>
|
|
34
42
|
|
|
35
43
|
<!-- Mobile -->
|
|
36
|
-
<div
|
|
44
|
+
<div
|
|
45
|
+
v-if="showMobileMenu"
|
|
46
|
+
class="absolute w-full md:hidden"
|
|
47
|
+
:class="[dark ? 'bg-slate-900' : 'bg-white']"
|
|
48
|
+
>
|
|
37
49
|
<slot
|
|
38
50
|
name="mobile"
|
|
39
51
|
:toggle-menu="toggleMenu"
|
|
@@ -53,6 +65,10 @@ defineProps({
|
|
|
53
65
|
default: '7xl',
|
|
54
66
|
type: String,
|
|
55
67
|
},
|
|
68
|
+
dark: {
|
|
69
|
+
default: false,
|
|
70
|
+
type: Boolean,
|
|
71
|
+
},
|
|
56
72
|
});
|
|
57
73
|
|
|
58
74
|
const showMobileMenu = ref(false);
|
|
@@ -1,57 +1,28 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
<div class="flex">
|
|
3
|
+
<BaseActionItem
|
|
4
|
+
:item="item"
|
|
5
|
+
:dark="dark"
|
|
6
|
+
item-class="flex w-full"
|
|
7
|
+
@click="onClick"
|
|
8
8
|
>
|
|
9
|
-
<
|
|
10
|
-
:active="isActive"
|
|
11
|
-
:href="slotHref"
|
|
12
|
-
:aria-current="isActive ? 'page' : undefined"
|
|
13
|
-
class="block w-full"
|
|
14
|
-
@click.prevent="onClick(navigate)"
|
|
15
|
-
>
|
|
16
|
-
<slot :active="isActive">
|
|
17
|
-
<BaseNavbarItemContent
|
|
18
|
-
:label="item.label"
|
|
19
|
-
:icon="item.icon"
|
|
20
|
-
:active="isActive"
|
|
21
|
-
:count="item.count"
|
|
22
|
-
/>
|
|
23
|
-
</slot>
|
|
24
|
-
</a>
|
|
25
|
-
</RouterLink>
|
|
26
|
-
<button
|
|
27
|
-
v-else-if="item.action"
|
|
28
|
-
type="button"
|
|
29
|
-
class="block w-full"
|
|
30
|
-
@click="item.action"
|
|
31
|
-
>
|
|
32
|
-
<slot :active="false">
|
|
9
|
+
<template #default="{ active }">
|
|
33
10
|
<BaseNavbarItemContent
|
|
34
11
|
:label="item.label"
|
|
35
12
|
:icon="item.icon"
|
|
13
|
+
:active="active"
|
|
36
14
|
:count="item.count"
|
|
15
|
+
:dark="dark"
|
|
37
16
|
/>
|
|
38
|
-
</
|
|
39
|
-
</
|
|
40
|
-
<a v-else-if="item.href" :href="item.href" class="block w-full">
|
|
41
|
-
<slot :active="false">
|
|
42
|
-
<BaseNavbarItemContent
|
|
43
|
-
:label="item.label"
|
|
44
|
-
:icon="item.icon"
|
|
45
|
-
:count="item.count"
|
|
46
|
-
/>
|
|
47
|
-
</slot>
|
|
48
|
-
</a>
|
|
17
|
+
</template>
|
|
18
|
+
</BaseActionItem>
|
|
49
19
|
</div>
|
|
50
20
|
</template>
|
|
51
21
|
|
|
52
22
|
<script setup lang="ts">
|
|
53
23
|
import { PropType } from 'vue';
|
|
54
24
|
import { ActionItem } from '@/types/types';
|
|
25
|
+
import BaseActionItem from './BaseActionItem.vue';
|
|
55
26
|
import BaseNavbarItemContent from './BaseNavbarItemContent.vue';
|
|
56
27
|
|
|
57
28
|
defineProps({
|
|
@@ -59,14 +30,17 @@ defineProps({
|
|
|
59
30
|
required: true,
|
|
60
31
|
type: Object as PropType<ActionItem>,
|
|
61
32
|
},
|
|
33
|
+
dark: {
|
|
34
|
+
default: false,
|
|
35
|
+
type: Boolean,
|
|
36
|
+
},
|
|
62
37
|
});
|
|
63
38
|
|
|
64
39
|
const closeMenu = inject('closeMenu') as () => void;
|
|
65
40
|
|
|
66
41
|
const emit = defineEmits(['click']);
|
|
67
42
|
|
|
68
|
-
function onClick(
|
|
69
|
-
navigate();
|
|
43
|
+
async function onClick() {
|
|
70
44
|
emit('click');
|
|
71
45
|
closeMenu();
|
|
72
46
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div :class="classes">
|
|
3
|
-
<div class="flex grow items-center">
|
|
3
|
+
<div class="group flex grow items-center">
|
|
4
4
|
<BaseIcon v-if="icon" :icon="icon" :class="iconClasses" />
|
|
5
5
|
{{ label }}
|
|
6
6
|
</div>
|
|
@@ -14,12 +14,6 @@
|
|
|
14
14
|
import { Icon as BaseIcon } from '@iconify/vue';
|
|
15
15
|
import BaseCounter from './BaseCounter.vue';
|
|
16
16
|
|
|
17
|
-
const buttonClasses =
|
|
18
|
-
'px-3 py-2 text-left rounded-md md:text-sm flex text-base font-normal w-full';
|
|
19
|
-
const buttonInactiveClasses =
|
|
20
|
-
'hover:bg-slate-700 hover:text-white text-slate-300';
|
|
21
|
-
const buttonActiveClasses = 'bg-slate-900 text-white';
|
|
22
|
-
|
|
23
17
|
const props = defineProps({
|
|
24
18
|
label: {
|
|
25
19
|
default: undefined,
|
|
@@ -37,24 +31,50 @@ const props = defineProps({
|
|
|
37
31
|
default: undefined,
|
|
38
32
|
type: Number,
|
|
39
33
|
},
|
|
34
|
+
dark: {
|
|
35
|
+
default: false,
|
|
36
|
+
type: Boolean,
|
|
37
|
+
},
|
|
40
38
|
});
|
|
41
39
|
|
|
42
40
|
const classes = computed(() => {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
props.active ? buttonActiveClasses : buttonInactiveClasses,
|
|
41
|
+
const classList = [
|
|
42
|
+
'text-left border-b-2 px-2 flex items-center text-base font-medium w-full',
|
|
46
43
|
];
|
|
47
|
-
});
|
|
48
44
|
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
if (props.dark) {
|
|
46
|
+
classList.push('');
|
|
47
|
+
} else {
|
|
48
|
+
classList.push('');
|
|
49
|
+
}
|
|
51
50
|
|
|
52
51
|
if (props.active) {
|
|
53
|
-
|
|
52
|
+
if (props.dark) {
|
|
53
|
+
classList.push('border-white text-white');
|
|
54
|
+
} else {
|
|
55
|
+
classList.push('border-primary-500 text-slate-900');
|
|
56
|
+
}
|
|
54
57
|
} else {
|
|
55
|
-
|
|
58
|
+
classList.push('border-transparent');
|
|
59
|
+
if (props.dark) {
|
|
60
|
+
classList.push('hover:border-white hover:text-white text-slate-200');
|
|
61
|
+
} else {
|
|
62
|
+
classList.push(
|
|
63
|
+
'hover:border-primary-500 hover:text-slate-900 text-slate-800'
|
|
64
|
+
);
|
|
65
|
+
}
|
|
56
66
|
}
|
|
57
67
|
|
|
58
|
-
return
|
|
68
|
+
return classList;
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const iconClasses = computed((): string[] => {
|
|
72
|
+
const classList = ['w-5 h-5 shrink-0 mr-2 leading-none inline-block'];
|
|
73
|
+
if (props.active) {
|
|
74
|
+
classList.push('opacity-100');
|
|
75
|
+
} else {
|
|
76
|
+
classList.push('opacity-70 group-hover:opacity-100');
|
|
77
|
+
}
|
|
78
|
+
return classList;
|
|
59
79
|
});
|
|
60
80
|
</script>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<BaseActionItem
|
|
3
|
+
:item="item"
|
|
4
|
+
:dark="dark"
|
|
5
|
+
item-class="flex w-full"
|
|
6
|
+
@click="onClick"
|
|
7
|
+
>
|
|
8
|
+
<template #default="{ active }">
|
|
9
|
+
<BaseNavbarSideItemContent
|
|
10
|
+
:label="item.label"
|
|
11
|
+
:icon="item.icon"
|
|
12
|
+
:active="active"
|
|
13
|
+
:count="item.count"
|
|
14
|
+
:dark="dark"
|
|
15
|
+
/>
|
|
16
|
+
</template>
|
|
17
|
+
</BaseActionItem>
|
|
18
|
+
</template>
|
|
19
|
+
|
|
20
|
+
<script setup lang="ts">
|
|
21
|
+
import { PropType } from 'vue';
|
|
22
|
+
import { ActionItem } from '@/types/types';
|
|
23
|
+
import BaseActionItem from './BaseActionItem.vue';
|
|
24
|
+
import BaseNavbarSideItemContent from './BaseNavbarSideItemContent.vue';
|
|
25
|
+
|
|
26
|
+
defineProps({
|
|
27
|
+
item: {
|
|
28
|
+
required: true,
|
|
29
|
+
type: Object as PropType<ActionItem>,
|
|
30
|
+
},
|
|
31
|
+
dark: {
|
|
32
|
+
default: false,
|
|
33
|
+
type: Boolean,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const emit = defineEmits(['click']);
|
|
38
|
+
|
|
39
|
+
async function onClick() {
|
|
40
|
+
emit('click');
|
|
41
|
+
}
|
|
42
|
+
</script>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div :class="classes">
|
|
3
|
+
<div class="group flex grow items-center">
|
|
4
|
+
<BaseIcon v-if="icon" :icon="icon" :class="iconClasses" />
|
|
5
|
+
{{ label }}
|
|
6
|
+
</div>
|
|
7
|
+
<div v-if="count" class="relative -top-px ml-[5px]">
|
|
8
|
+
<BaseCounter :count="count" :max-digit="2" :color="'primary'" />
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script lang="ts" setup>
|
|
14
|
+
import { Icon as BaseIcon } from '@iconify/vue';
|
|
15
|
+
import BaseCounter from './BaseCounter.vue';
|
|
16
|
+
|
|
17
|
+
const props = defineProps({
|
|
18
|
+
label: {
|
|
19
|
+
default: undefined,
|
|
20
|
+
type: String,
|
|
21
|
+
},
|
|
22
|
+
icon: {
|
|
23
|
+
default: undefined,
|
|
24
|
+
type: String,
|
|
25
|
+
},
|
|
26
|
+
active: {
|
|
27
|
+
default: false,
|
|
28
|
+
type: Boolean,
|
|
29
|
+
},
|
|
30
|
+
count: {
|
|
31
|
+
default: undefined,
|
|
32
|
+
type: Number,
|
|
33
|
+
},
|
|
34
|
+
dark: {
|
|
35
|
+
default: false,
|
|
36
|
+
type: Boolean,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const classes = computed(() => {
|
|
41
|
+
const classList = [
|
|
42
|
+
'text-left px-3 py-2 rounded-md flex text-base font-medium w-full',
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
if (props.dark) {
|
|
46
|
+
classList.push('');
|
|
47
|
+
} else {
|
|
48
|
+
classList.push('');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (props.active) {
|
|
52
|
+
if (props.dark) {
|
|
53
|
+
classList.push('bg-slate-700 text-white');
|
|
54
|
+
} else {
|
|
55
|
+
classList.push('bg-slate-100 text-slate-900');
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
if (props.dark) {
|
|
59
|
+
classList.push('hover:bg-slate-800 hover:text-white text-slate-300');
|
|
60
|
+
} else {
|
|
61
|
+
classList.push('hover:bg-slate-50 hover:text-slate-900 text-slate-800');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return classList;
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const iconClasses = computed((): string[] => {
|
|
69
|
+
const classList = ['w-5 h-5 shrink-0 mr-2 leading-none inline-block'];
|
|
70
|
+
if (props.active) {
|
|
71
|
+
classList.push('opacity-100');
|
|
72
|
+
} else {
|
|
73
|
+
classList.push('opacity-70 group-hover:opacity-100');
|
|
74
|
+
}
|
|
75
|
+
return classList;
|
|
76
|
+
});
|
|
77
|
+
</script>
|
package/src/components/index.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import BaseActionItem from './BaseActionItem.vue';
|
|
1
2
|
import BaseAlert from './BaseAlert.vue';
|
|
2
3
|
import BaseApp from './BaseApp.vue';
|
|
3
4
|
import BaseAppDialogs from './BaseAppDialogs.vue';
|
|
@@ -60,7 +61,13 @@ import BaseTableColumn from './BaseTableColumn.vue';
|
|
|
60
61
|
import BaseTextarea from './BaseTextarea.vue';
|
|
61
62
|
import BaseTextareaAutoresize from './BaseTextareaAutoresize.vue';
|
|
62
63
|
|
|
64
|
+
import BaseLayoutStacked from './BaseLayoutStacked.vue';
|
|
65
|
+
import BaseLayoutStackedConfigurable from './BaseLayoutStackedConfigurable.vue';
|
|
66
|
+
import BaseLayoutSidebar from './BaseLayoutSidebar.vue';
|
|
67
|
+
import BaseLayoutSidebarConfigurable from './BaseLayoutSidebarConfigurable.vue';
|
|
68
|
+
|
|
63
69
|
export {
|
|
70
|
+
BaseActionItem,
|
|
64
71
|
BaseAlert,
|
|
65
72
|
BaseApp,
|
|
66
73
|
BaseAppDialogs,
|
|
@@ -122,4 +129,8 @@ export {
|
|
|
122
129
|
BaseTableColumn,
|
|
123
130
|
BaseTextarea,
|
|
124
131
|
BaseTextareaAutoresize,
|
|
132
|
+
BaseLayoutStacked,
|
|
133
|
+
BaseLayoutStackedConfigurable,
|
|
134
|
+
BaseLayoutSidebar,
|
|
135
|
+
BaseLayoutSidebarConfigurable,
|
|
125
136
|
};
|
package/src/lang/en.json
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"next_month": "Next month",
|
|
26
26
|
"none": "None",
|
|
27
27
|
"nothing_found": "Nothing found",
|
|
28
|
+
"notifications_empty": "You have no new notifications",
|
|
28
29
|
"or": "or",
|
|
29
30
|
"pagination_detail": "{page} records of {total}",
|
|
30
31
|
"previous": "Previous",
|
|
@@ -33,6 +34,7 @@
|
|
|
33
34
|
"remove": "Remove",
|
|
34
35
|
"remove_file": "Remove file?",
|
|
35
36
|
"remove_file_description": "Are you sure you want to remove the file? This action is irreversible.",
|
|
37
|
+
"see_all_notifications": "See all notifications",
|
|
36
38
|
"select_an_item": "Select an item",
|
|
37
39
|
"select_an_option": "Select an option",
|
|
38
40
|
"success": "Success",
|
|
@@ -49,6 +51,7 @@
|
|
|
49
51
|
"up_to_x": "Up to {x}",
|
|
50
52
|
"upload_failed": "Upload failed",
|
|
51
53
|
"whoops": "Whoops",
|
|
54
|
+
"x_ago": "{duration} ago",
|
|
52
55
|
"x_rows_selected": "1 item selected | {count} items selected",
|
|
53
56
|
"year": "Year",
|
|
54
57
|
"yes_delete": "Yes, delete",
|
package/src/lang/fr.json
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"next_month": "Mois prochain",
|
|
26
26
|
"none": "Aucun",
|
|
27
27
|
"nothing_found": "Rien n'a été trouvé",
|
|
28
|
+
"notifications_empty": "Vous n'avez aucune nouvelle notification",
|
|
28
29
|
"or": "ou",
|
|
29
30
|
"pagination_detail": "{page} items de {total}",
|
|
30
31
|
"previous": "Précédent",
|
|
@@ -33,6 +34,7 @@
|
|
|
33
34
|
"remove": "Retirer",
|
|
34
35
|
"remove_file": "Retirer le fichier?",
|
|
35
36
|
"remove_file_description": "Voulez-vous vraiment supprimer le fichier ? \nCette action est irréversible.",
|
|
37
|
+
"see_all_notifications": "Voir toutes les notifications",
|
|
36
38
|
"select_an_item": "Sélectionner un élément",
|
|
37
39
|
"select_an_option": "Sélectionner une option",
|
|
38
40
|
"success": "Succès",
|
|
@@ -49,6 +51,7 @@
|
|
|
49
51
|
"up_to_x": "Jusqu'à {x}",
|
|
50
52
|
"upload_failed": "Le téléchargement a échoué",
|
|
51
53
|
"whoops": "Oups",
|
|
54
|
+
"x_ago": "il y a {durée}",
|
|
52
55
|
"x_rows_selected": "1 item sélectionné | \n{count} items sélectionnés",
|
|
53
56
|
"year": "Année",
|
|
54
57
|
"yes_delete": "Oui, supprimer",
|
package/src/types/types.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { RouteLocationRaw } from 'vue-router';
|
|
4
4
|
import { UploadedFile } from './UploadedFile';
|
|
5
|
+
import { Notification as AppNotification } from './Notification';
|
|
5
6
|
|
|
6
7
|
export interface Breadcrumb {
|
|
7
8
|
icon?: string;
|
|
@@ -177,3 +178,13 @@ export interface Notification {
|
|
|
177
178
|
color: 'info' | 'success' | 'danger' | 'warning';
|
|
178
179
|
duration: number;
|
|
179
180
|
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* App Notification
|
|
184
|
+
*/
|
|
185
|
+
|
|
186
|
+
export interface NotificationsConfig {
|
|
187
|
+
items: AppNotification[];
|
|
188
|
+
footerLabel?: string;
|
|
189
|
+
footerTo?: RouteLocationRaw;
|
|
190
|
+
}
|