sprintify-ui 0.5.4 → 0.5.7

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 (32) hide show
  1. package/dist/sprintify-ui.es.js +1425 -1399
  2. package/dist/types/src/components/BaseActionItem.vue.d.ts +1 -1
  3. package/dist/types/src/components/BaseActionItemButton.vue.d.ts +1 -1
  4. package/dist/types/src/components/BaseDataIterator.vue.d.ts +1 -1
  5. package/dist/types/src/components/BaseDataTable.vue.d.ts +1 -1
  6. package/dist/types/src/components/BaseHeader.vue.d.ts +1 -2
  7. package/dist/types/src/components/BaseLayoutSidebarConfigurable.vue.d.ts +1 -1
  8. package/dist/types/src/components/BaseLayoutStacked.vue.d.ts +1 -0
  9. package/dist/types/src/components/BaseLayoutStackedConfigurable.vue.d.ts +1 -2
  10. package/dist/types/src/components/BaseMenu.vue.d.ts +1 -1
  11. package/dist/types/src/components/BaseNavbar.vue.d.ts +1 -0
  12. package/dist/types/src/components/BaseNavbarItem.vue.d.ts +1 -1
  13. package/dist/types/src/components/BaseNavbarSideItem.vue.d.ts +1 -1
  14. package/dist/types/src/types/index.d.ts +13 -1
  15. package/package.json +1 -1
  16. package/src/components/BaseActionItem.vue +1 -1
  17. package/src/components/BaseActionItemButton.vue +1 -1
  18. package/src/components/BaseDataIterator.vue +1 -1
  19. package/src/components/BaseDataTable.vue +1 -1
  20. package/src/components/BaseHeader.vue +1 -2
  21. package/src/components/BaseLayoutSidebarConfigurable.vue +1 -1
  22. package/src/components/BaseLayoutStacked.vue +0 -1
  23. package/src/components/BaseLayoutStackedConfigurable.stories.js +4 -0
  24. package/src/components/BaseLayoutStackedConfigurable.vue +22 -9
  25. package/src/components/BaseMenu.vue +1 -1
  26. package/src/components/BaseNavbar.vue +30 -7
  27. package/src/components/BaseNavbarItem.vue +1 -1
  28. package/src/components/BaseNavbarItemContent.vue +12 -3
  29. package/src/components/BaseNavbarSideItem.vue +6 -5
  30. package/src/types/index.ts +15 -3
  31. package/dist/types/src/types/ActionItem.d.ts +0 -15
  32. package/src/types/ActionItem.ts +0 -16
@@ -1,4 +1,4 @@
1
- import { ActionItem } from '@/types/ActionItem';
1
+ import { ActionItem } from '@/types';
2
2
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
3
3
  item: {
4
4
  type: import("vue").PropType<ActionItem>;
@@ -1,4 +1,4 @@
1
- import { ActionItem } from '@/types/ActionItem';
1
+ import { ActionItem } from '@/types';
2
2
  declare const _default: import("vue").DefineComponent<{
3
3
  item: {
4
4
  type: import("vue").PropType<ActionItem>;
@@ -1,6 +1,6 @@
1
1
  import { PropType } from 'vue';
2
2
  import { Collection, DataIteratorSection, DataTableQuery } from '@/types';
3
- import { ActionItem } from '@/types/ActionItem';
3
+ import { ActionItem } from '@/types';
4
4
  type Direction = 'asc' | 'desc';
5
5
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
6
6
  /**
@@ -1,7 +1,7 @@
1
1
  import { PropType } from 'vue';
2
2
  import { CollectionItem, DataIteratorSection, DataTableQuery, RowAction } from '@/types';
3
3
  import { RouteLocationRaw } from 'vue-router';
4
- import { ActionItem } from '@/types/ActionItem';
4
+ import { ActionItem } from '@/types';
5
5
  declare function fetch(): void;
6
6
  declare function fetchWithoutLoading(): void;
7
7
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
@@ -1,5 +1,4 @@
1
- import { Breadcrumb } from '@/types';
2
- import { ActionItem } from '@/types/ActionItem';
1
+ import { Breadcrumb, ActionItem } from '@/types';
3
2
  declare const _default: import("vue").DefineComponent<{
4
3
  title: {
5
4
  type: import("vue").PropType<string>;
@@ -1,7 +1,7 @@
1
1
  import { User } from '@/types/User';
2
+ import { ActionItem } from '@/types';
2
3
  import { PropType } from 'vue';
3
4
  import { NotificationsConfig } from '../types';
4
- import { ActionItem } from '@/types/ActionItem';
5
5
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
6
6
  appName: {
7
7
  default: string;
@@ -36,6 +36,7 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
36
36
  navbar: Record<string, unknown>;
37
37
  }, {}>, {
38
38
  navbar?(_: {
39
+ mobile: boolean;
39
40
  dark: boolean;
40
41
  height: number;
41
42
  }): any;
@@ -1,7 +1,6 @@
1
1
  import { User } from '@/types/User';
2
+ import { ActionItem, NotificationsConfig } from '@/types';
2
3
  import { PropType } from 'vue';
3
- import { NotificationsConfig } from '../types';
4
- import { ActionItem } from '@/types/ActionItem';
5
4
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
6
5
  appName: {
7
6
  default: string;
@@ -1,5 +1,5 @@
1
1
  import { PropType } from 'vue';
2
- import { ActionItem } from '@/types/ActionItem';
2
+ import { ActionItem } from '@/types';
3
3
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
4
4
  items: {
5
5
  default: undefined;
@@ -52,6 +52,7 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
52
52
  breakpoint: number;
53
53
  }, {}>, {
54
54
  navbar?(_: {
55
+ mobile: boolean;
55
56
  dark: boolean;
56
57
  height: number;
57
58
  }): any;
@@ -1,5 +1,5 @@
1
1
  import { PropType } from 'vue';
2
- import { ActionItem } from '@/types/ActionItem';
2
+ import { ActionItem } from '@/types';
3
3
  declare const _default: import("vue").DefineComponent<{
4
4
  item: {
5
5
  required: true;
@@ -1,5 +1,5 @@
1
1
  import { PropType } from 'vue';
2
- import { ActionItem } from '@/types/ActionItem';
2
+ import { ActionItem } from '@/types';
3
3
  declare const _default: import("vue").DefineComponent<{
4
4
  item: {
5
5
  required: true;
@@ -52,6 +52,19 @@ export interface PaginatedCollection extends PaginationMetadata {
52
52
  data: Collection;
53
53
  }
54
54
  export type ActionColors = 'dark' | 'light' | 'danger' | 'success' | 'warning' | 'primary' | 'secondary';
55
+ export interface ActionItem {
56
+ label?: string;
57
+ description?: string;
58
+ href?: string;
59
+ to?: RouteLocationRaw;
60
+ action?: () => Promise<void> | void;
61
+ icon?: string;
62
+ count?: number;
63
+ color?: ActionColors;
64
+ disabled?: boolean;
65
+ meta?: Record<string, any>;
66
+ actions?: ActionItem[];
67
+ }
55
68
  export type Row = Record<string, any>;
56
69
  export interface BaseTableColumn {
57
70
  id: string;
@@ -191,4 +204,3 @@ export interface BaseCropperConfig {
191
204
  presetOptions?: Record<string, any>;
192
205
  saveOptions?: ResultOptions;
193
206
  }
194
- export { ActionItem } from './ActionItem';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sprintify-ui",
3
- "version": "0.5.4",
3
+ "version": "0.5.7",
4
4
  "scripts": {
5
5
  "build": "rimraf dist && vue-tsc && vite build",
6
6
  "build-fast": "rimraf dist && vite build",
@@ -46,7 +46,7 @@ export default {
46
46
  </script>
47
47
 
48
48
  <script setup lang="ts">
49
- import { ActionItem } from '@/types/ActionItem';
49
+ import { ActionItem } from '@/types';
50
50
  import { twMerge } from 'tailwind-merge';
51
51
 
52
52
  const props = defineProps<{
@@ -18,7 +18,7 @@
18
18
 
19
19
  <script lang="ts" setup>
20
20
  import { BaseIcon } from '..';
21
- import { ActionItem } from '@/types/ActionItem';
21
+ import { ActionItem } from '@/types';
22
22
  import BaseActionItem from './BaseActionItem.vue';
23
23
 
24
24
  const props = withDefaults(
@@ -231,7 +231,7 @@ import {
231
231
  PaginatedCollection,
232
232
  ResourceCollection,
233
233
  } from '@/types';
234
- import { ActionItem } from '@/types/ActionItem';
234
+ import { ActionItem } from '@/types';
235
235
 
236
236
  import BaseMenu from './BaseMenu.vue';
237
237
  import BasePagination from './BasePagination.vue';
@@ -260,7 +260,7 @@ import BaseEmptyState from '../svg/BaseEmptyState.vue';
260
260
  import { RouteLocationRaw } from 'vue-router';
261
261
  import BaseMenu from './BaseMenu.vue';
262
262
  import BaseDataTableRowAction from './BaseDataTableRowAction.vue';
263
- import { ActionItem } from '@/types/ActionItem';
263
+ import { ActionItem } from '@/types';
264
264
 
265
265
  const router = useRouter();
266
266
 
@@ -99,8 +99,7 @@
99
99
  </template>
100
100
 
101
101
  <script setup lang="ts">
102
- import { Breadcrumb } from '@/types';
103
- import { ActionItem } from '@/types/ActionItem';
102
+ import { Breadcrumb, ActionItem } from '@/types';
104
103
  import { useResizeObserver } from '@vueuse/core';
105
104
  import { BaseBreadcrumbs, BaseIcon } from '..';
106
105
  import BaseActionItemButton from './BaseActionItemButton.vue';
@@ -101,9 +101,9 @@
101
101
 
102
102
  <script setup lang="ts">
103
103
  import { User } from '@/types/User';
104
+ import { ActionItem } from '@/types';
104
105
  import { PropType } from 'vue';
105
106
  import { NotificationsConfig } from '../types';
106
- import { ActionItem } from '@/types/ActionItem';
107
107
  import BaseAvatar from './BaseAvatar.vue';
108
108
  import BaseLayoutNotificationDropdown from './BaseLayoutNotificationDropdown.vue';
109
109
  import BaseLayoutSidebar from './BaseLayoutSidebar.vue';
@@ -16,7 +16,6 @@
16
16
  v-bind="navbar"
17
17
  :dark="dark"
18
18
  :size="size"
19
- class="shadow"
20
19
  >
21
20
  <template #navbar="navbarProps">
22
21
  <slot
@@ -8,6 +8,10 @@ export default {
8
8
  layout: 'fullscreen',
9
9
  },
10
10
  args: {
11
+ navbar: {
12
+ dark: true,
13
+ class: 'shadow-sm border-t-[3px] border-primary-500'
14
+ },
11
15
  appName: 'Sprintify',
12
16
  user: {
13
17
  email: 'jane@witify.io',
@@ -2,8 +2,9 @@
2
2
  <BaseLayoutStacked
3
3
  :size="size"
4
4
  :dark="dark"
5
+ :navbar="navbar"
5
6
  >
6
- <template #navbar>
7
+ <template #navbar="{ mobile }">
7
8
  <div class="flex w-full justify-between">
8
9
  <!-- Left -->
9
10
 
@@ -21,7 +22,15 @@
21
22
  </RouterLink>
22
23
 
23
24
  <!-- Links (desktop) -->
24
- <div class="ml-10 hidden space-x-2 md:flex">
25
+ <div
26
+ v-if="!mobile"
27
+ class="flex"
28
+ :class="{
29
+ 'ml-4': size == 'xs',
30
+ 'ml-6 space-x-0.5': size == 'sm',
31
+ 'ml-8 space-x-1': size == 'md',
32
+ }"
33
+ >
25
34
  <BaseNavbarItem
26
35
  v-for="item in menu"
27
36
  :key="item.label"
@@ -33,11 +42,14 @@
33
42
  </div>
34
43
 
35
44
  <!-- Right -->
36
- <div class="flex shrink-0 items-center md:ml-6">
45
+ <div
46
+ class="flex shrink-0 items-center"
47
+ :class="[mobile ? '' : 'ml-6']"
48
+ >
37
49
  <!-- Notification dropdown -->
38
50
  <BaseLayoutNotificationDropdown
39
51
  v-if="notifications"
40
- class="mr-4 md:mr-5"
52
+ :class="[mobile ? 'mr-4' : 'mr-5']"
41
53
  :dark="dark"
42
54
  :size="size"
43
55
  :notifications-config="notifications"
@@ -47,9 +59,9 @@
47
59
 
48
60
  <!-- Profile dropdown -->
49
61
  <BaseMenu
62
+ v-if="!mobile"
50
63
  tw-menu="w-52"
51
- :size="size == 'xs' ? 'xs' : 'sm'"
52
- class="hidden md:block"
64
+ :size="size"
53
65
  :items="userMenu"
54
66
  >
55
67
  <template #button="{ open }">
@@ -71,11 +83,12 @@
71
83
 
72
84
  <template #mobile>
73
85
  <!-- Links mobile -->
74
- <div class="space-y-1 p-2 pt-0">
86
+ <div class="space-y-0.5 p-2 pt-0">
75
87
  <BaseNavbarSideItem
76
88
  v-for="item in menu"
77
89
  :key="item.label"
78
90
  :item="item"
91
+ size="sm"
79
92
  :dark="dark"
80
93
  />
81
94
  </div>
@@ -99,6 +112,7 @@
99
112
  v-for="item in userMenu"
100
113
  :key="item.label"
101
114
  :item="item"
115
+ size="sm"
102
116
  :dark="dark"
103
117
  />
104
118
  </div>
@@ -113,9 +127,8 @@
113
127
 
114
128
  <script lang="ts" setup>
115
129
  import { User } from '@/types/User';
130
+ import { ActionItem, NotificationsConfig } from '@/types';
116
131
  import { PropType } from 'vue';
117
- import { NotificationsConfig } from '../types';
118
- import { ActionItem } from '@/types/ActionItem';
119
132
  import BaseAvatar from './BaseAvatar.vue';
120
133
  import BaseLayoutStacked from './BaseLayoutStacked.vue';
121
134
  import BaseMenu from './BaseMenu.vue';
@@ -120,7 +120,7 @@ import { PropType } from 'vue';
120
120
  import { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/vue';
121
121
  import BaseMenuItem from './BaseMenuItem.vue';
122
122
  import { twMerge } from 'tailwind-merge';
123
- import { ActionItem } from '@/types/ActionItem';
123
+ import { ActionItem } from '@/types';
124
124
 
125
125
  const props = defineProps({
126
126
  items: {
@@ -11,6 +11,7 @@
11
11
  <div class="grow flex">
12
12
  <slot
13
13
  name="navbar"
14
+ :mobile="mobile"
14
15
  :dark="dark"
15
16
  :height="heightInner"
16
17
  />
@@ -52,7 +53,7 @@
52
53
  <!-- Mobile -->
53
54
  <div
54
55
  v-if="mobile && showMobileMenu"
55
- class="absolute w-full"
56
+ class="w-full"
56
57
  :class="backgroundClass"
57
58
  >
58
59
  <slot
@@ -72,6 +73,7 @@ import BaseContainer from './BaseContainer.vue';
72
73
  import { twMerge } from 'tailwind-merge';
73
74
  import { PropType } from 'vue';
74
75
  import { useWindowSize } from '@vueuse/core';
76
+ import { disableScroll, enableScroll } from '..';
75
77
 
76
78
  defineOptions({
77
79
  inheritAttrs: false,
@@ -106,6 +108,15 @@ const mobile = computed(() => {
106
108
  return window.width.value < props.breakpoint;
107
109
  });
108
110
 
111
+ watch(
112
+ () => window.width.value,
113
+ () => {
114
+ if (!mobile.value) {
115
+ closeMenu();
116
+ }
117
+ },
118
+ );
119
+
109
120
  const heightInner = computed(() => {
110
121
  if (props.height) {
111
122
  return props.height;
@@ -123,28 +134,40 @@ const heightInner = computed(() => {
123
134
  });
124
135
 
125
136
  const backgroundClass = computed(() => {
126
- return props.dark ? 'bg-slate-900' : 'bg-white';
137
+ return props.dark ? 'bg-slate-800' : 'bg-white';
127
138
  });
128
139
 
129
140
  const classInternal = computed(() => {
130
- return twMerge(
131
- 'w-full',
141
+
142
+ const classes = [
143
+ 'fixed flex flex-col top-0 left-0 w-full max-h-screen',
132
144
  backgroundClass.value,
133
- props.class,
134
- )
145
+ ];
146
+
147
+ if (mobile.value) {
148
+ classes.push('overflow-y-auto');
149
+ }
150
+
151
+ return twMerge(classes, props.class)
135
152
  })
136
153
 
137
154
  const showMobileMenu = ref(false);
138
155
 
139
156
  function toggleMenu() {
140
- showMobileMenu.value = !showMobileMenu.value;
157
+ if (showMobileMenu.value) {
158
+ closeMenu();
159
+ } else {
160
+ openMenu();
161
+ }
141
162
  }
142
163
 
143
164
  function openMenu() {
165
+ disableScroll();
144
166
  showMobileMenu.value = true;
145
167
  }
146
168
 
147
169
  function closeMenu() {
170
+ enableScroll();
148
171
  showMobileMenu.value = false;
149
172
  }
150
173
 
@@ -47,7 +47,7 @@
47
47
 
48
48
  <script setup lang="ts">
49
49
  import { PropType, Ref } from 'vue';
50
- import { ActionItem } from '@/types/ActionItem';
50
+ import { ActionItem } from '@/types';
51
51
  import BaseActionItem from './BaseActionItem.vue';
52
52
  import BaseNavbarItemContent from './BaseNavbarItemContent.vue';
53
53
  import BaseMenuItem from './BaseMenuItem.vue';
@@ -14,6 +14,7 @@
14
14
  class="relative -top-px ml-[5px]"
15
15
  >
16
16
  <BaseCounter
17
+ :size="size"
17
18
  :count="count"
18
19
  :max-digit="2"
19
20
  color="danger"
@@ -64,11 +65,11 @@ const classes = computed(() => {
64
65
  if (props.dark) {
65
66
  classList.push('text-white');
66
67
  } else {
67
- classList.push('text-slate-900');
68
+ classList.push('text-primary-600');
68
69
  }
69
70
  } else {
70
71
  if (props.dark) {
71
- classList.push('hover:text-white text-slate-200');
72
+ classList.push('hover:text-white text-slate-300');
72
73
  } else {
73
74
  classList.push(
74
75
  'hover:text-slate-900 text-slate-800'
@@ -81,9 +82,17 @@ const classes = computed(() => {
81
82
 
82
83
  const classesInner = computed(() => {
83
84
  const classList = [
84
- 'px-3 py-1 grow rounded-md duration-100 flex items-center font-medium',
85
+ 'py-1 grow rounded-md duration-100 flex items-center font-medium',
85
86
  ];
86
87
 
88
+ if (props.size == 'xs') {
89
+ classList.push('px-2 h-7')
90
+ } else if (props.size == 'sm') {
91
+ classList.push('px-2 h-8')
92
+ } else {
93
+ classList.push('px-3 h-10')
94
+ }
95
+
87
96
  if (props.dark) {
88
97
  classList.push('hover:bg-slate-700');
89
98
  } else {
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <div>
3
3
  <BaseActionItem
4
+ v-if="!item.meta?.line"
4
5
  :item="item"
5
6
  class="flex w-full"
6
7
  @click="onClick"
@@ -19,7 +20,7 @@
19
20
 
20
21
  <div
21
22
  v-if="showSubActions && item.actions && item.actions.length"
22
- class="mt-2 mb-3"
23
+ class="mt-1 sm:mt-2 mb-3"
23
24
  >
24
25
  <div
25
26
  v-for="subItem in item.actions"
@@ -51,7 +52,7 @@
51
52
 
52
53
  <script setup lang="ts">
53
54
  import { PropType } from 'vue';
54
- import { ActionItem } from '@/types/ActionItem';
55
+ import { ActionItem } from '@/types';
55
56
  import BaseActionItem from './BaseActionItem.vue';
56
57
  import BaseNavbarSideItemContent from './BaseNavbarSideItemContent.vue';
57
58
  import BaseCounter from './BaseCounter.vue';
@@ -107,11 +108,11 @@ const subItemClasses = computed((): string[] => {
107
108
  }
108
109
 
109
110
  if (props.size == 'xs') {
110
- classList.push('pl-[33.5px] text-[13px] mb-1 pr-2.5');
111
+ classList.push('pl-3 sm:pl-[33.5px] text-[13px] mb-1 pr-2.5');
111
112
  } else if (props.size == 'sm') {
112
- classList.push('pl-[36px] text-sm mb-1.5 pr-3');
113
+ classList.push('pl-3 sm:pl-[36px] text-sm mb-1.5 pr-3');
113
114
  } else {
114
- classList.push('pl-[40px] text-base mb-1 pr-3');
115
+ classList.push('pl-3 sm:pl-[40px] text-base mb-1 pr-3');
115
116
  }
116
117
 
117
118
  return classList;
@@ -75,6 +75,20 @@ export type ActionColors =
75
75
  | 'primary'
76
76
  | 'secondary';
77
77
 
78
+ export interface ActionItem {
79
+ label?: string;
80
+ description?: string;
81
+ href?: string;
82
+ to?: RouteLocationRaw;
83
+ action?: () => Promise<void> | void;
84
+ icon?: string;
85
+ count?: number;
86
+ color?: ActionColors;
87
+ disabled?: boolean;
88
+ meta?: Record<string, any>;
89
+ actions?: ActionItem[];
90
+ }
91
+
78
92
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
93
  export type Row = Record<string, any>;
80
94
 
@@ -236,6 +250,4 @@ export interface BaseCropperConfig {
236
250
  preset?: CropperPreset;
237
251
  presetOptions?: Record<string, any>;
238
252
  saveOptions?: ResultOptions;
239
- }
240
-
241
- export { ActionItem } from './ActionItem';
253
+ }
@@ -1,15 +0,0 @@
1
- import { RouteLocationRaw } from "vue-router";
2
- import { ActionColors } from ".";
3
- export interface ActionItem {
4
- label?: string;
5
- description?: string;
6
- href?: string;
7
- to?: RouteLocationRaw;
8
- action?: () => Promise<void> | void;
9
- icon?: string;
10
- count?: number;
11
- color?: ActionColors;
12
- disabled?: boolean;
13
- meta?: Record<string, any>;
14
- actions?: ActionItem[];
15
- }
@@ -1,16 +0,0 @@
1
- import { RouteLocationRaw } from "vue-router";
2
- import { ActionColors } from ".";
3
-
4
- export interface ActionItem {
5
- label?: string;
6
- description?: string;
7
- href?: string;
8
- to?: RouteLocationRaw;
9
- action?: () => Promise<void> | void;
10
- icon?: string;
11
- count?: number;
12
- color?: ActionColors;
13
- disabled?: boolean;
14
- meta?: Record<string, any>;
15
- actions?: ActionItem[];
16
- }