@softwareone/spi-sv5-library 1.3.2 → 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/dist/Header/Header.svelte +48 -5
- package/dist/Header/Header.svelte.d.ts +3 -0
- package/dist/Home/Home.svelte +6 -12
- package/dist/Menu/Menu.svelte +7 -9
- package/dist/Menu/MenuItem.svelte +2 -14
- package/dist/Menu/MenuItem.svelte.d.ts +0 -1
- package/dist/Modal/Modal.svelte +2 -1
- package/dist/Modal/ModalContent.svelte +0 -1
- package/dist/Modal/ModalHeader.svelte +14 -10
- package/dist/Modal/modalState.svelte.d.ts +1 -0
- package/dist/Processing/Processing.svelte +89 -0
- package/dist/Processing/Processing.svelte.d.ts +4 -0
- package/dist/Processing/processingState.svelte.d.ts +6 -0
- package/dist/Processing/processingState.svelte.js +1 -0
- package/dist/Switcher/Switcher.svelte +78 -0
- package/dist/Switcher/Switcher.svelte.d.ts +8 -0
- package/dist/Switcher/switcherState.svelte.d.ts +4 -0
- package/dist/Switcher/switcherState.svelte.js +1 -0
- package/dist/Waffle/Waffle.svelte +95 -0
- package/dist/Waffle/Waffle.svelte.d.ts +8 -0
- package/dist/Waffle/WaffleItems.svelte +82 -0
- package/dist/Waffle/WaffleItems.svelte.d.ts +9 -0
- package/dist/Waffle/waffleState.svelte.d.ts +6 -0
- package/dist/Waffle/waffleState.svelte.js +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +4 -1
- package/package.json +1 -1
|
@@ -9,11 +9,14 @@
|
|
|
9
9
|
title?: string;
|
|
10
10
|
homeUrl?: string;
|
|
11
11
|
hideAccount?: boolean;
|
|
12
|
+
hideHelp?: boolean;
|
|
13
|
+
hideNotification?: boolean;
|
|
12
14
|
accountName?: string;
|
|
13
15
|
userName?: string;
|
|
14
16
|
profileUrl?: string;
|
|
15
17
|
hideLoader?: boolean;
|
|
16
18
|
menu?: Snippet<[showMenu: boolean]>;
|
|
19
|
+
waffle?: Snippet<[showWaffle: boolean]>;
|
|
17
20
|
}
|
|
18
21
|
|
|
19
22
|
let {
|
|
@@ -24,25 +27,53 @@
|
|
|
24
27
|
userName = '',
|
|
25
28
|
profileUrl = '/profile',
|
|
26
29
|
hideLoader,
|
|
27
|
-
menu
|
|
30
|
+
menu,
|
|
31
|
+
waffle
|
|
28
32
|
}: HeaderProps = $props();
|
|
29
33
|
|
|
34
|
+
let showWaffle = $state(false);
|
|
30
35
|
let showMenu = $state(false);
|
|
31
36
|
|
|
37
|
+
const toggleWaffle = () => {
|
|
38
|
+
showWaffle = !showWaffle;
|
|
39
|
+
showMenu = false;
|
|
40
|
+
};
|
|
41
|
+
|
|
32
42
|
const toggleMenu = () => {
|
|
33
43
|
showMenu = !showMenu;
|
|
44
|
+
showWaffle = false;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const handleKeydown = (event: KeyboardEvent) => {
|
|
48
|
+
if (event.key === 'Escape' && (showWaffle || showMenu)) {
|
|
49
|
+
showWaffle = false;
|
|
50
|
+
showMenu = false;
|
|
51
|
+
}
|
|
34
52
|
};
|
|
35
53
|
</script>
|
|
36
54
|
|
|
55
|
+
<svelte:window onkeydown={handleKeydown} />
|
|
56
|
+
|
|
37
57
|
<div class="header-container">
|
|
38
58
|
<nav class="header-section">
|
|
39
59
|
{#if !hideLoader}
|
|
40
60
|
<HeaderLoader />
|
|
41
61
|
{/if}
|
|
42
|
-
|
|
62
|
+
{#if waffle}
|
|
63
|
+
<button
|
|
64
|
+
type="button"
|
|
65
|
+
class={[showWaffle && 'active', 'header-button']}
|
|
66
|
+
onclick={toggleWaffle}
|
|
67
|
+
aria-label="Waffle Component"
|
|
68
|
+
aria-expanded={showWaffle}
|
|
69
|
+
>
|
|
70
|
+
<span class="material-icons icon-span">apps</span>
|
|
71
|
+
</button>
|
|
72
|
+
{@render waffle(showWaffle)}
|
|
73
|
+
{/if}
|
|
43
74
|
{#if menu}
|
|
44
75
|
<button type="button" class="header-button" onclick={toggleMenu} aria-label="menu button">
|
|
45
|
-
<span class="material-icons icon-span">menu</span>
|
|
76
|
+
<span class="material-icons icon-span menu-icon">menu</span>
|
|
46
77
|
</button>
|
|
47
78
|
{@render menu(showMenu)}
|
|
48
79
|
{/if}
|
|
@@ -69,20 +100,30 @@
|
|
|
69
100
|
justify-content: center;
|
|
70
101
|
align-items: center;
|
|
71
102
|
border-radius: 50%;
|
|
72
|
-
background:
|
|
103
|
+
background: transparent;
|
|
73
104
|
z-index: 40;
|
|
74
105
|
cursor: pointer;
|
|
75
106
|
border: none;
|
|
76
107
|
width: 40px;
|
|
77
108
|
height: 40px;
|
|
109
|
+
transition: background-color 0.2s ease-in-out;
|
|
78
110
|
}
|
|
79
111
|
|
|
80
112
|
.header-button:hover {
|
|
81
113
|
background: #e0e5e8;
|
|
82
114
|
}
|
|
83
115
|
|
|
116
|
+
.header-button.active {
|
|
117
|
+
background: #fff;
|
|
118
|
+
color: #374151;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.header-button .menu-icon {
|
|
122
|
+
transform: scale(1.26);
|
|
123
|
+
}
|
|
124
|
+
|
|
84
125
|
.icon-span {
|
|
85
|
-
font-size:
|
|
126
|
+
font-size: 24px;
|
|
86
127
|
color: #6b7180;
|
|
87
128
|
}
|
|
88
129
|
|
|
@@ -95,6 +136,8 @@
|
|
|
95
136
|
background: #fff;
|
|
96
137
|
height: 80px;
|
|
97
138
|
border-bottom: 3px solid #aeb1b9;
|
|
139
|
+
position: relative;
|
|
140
|
+
z-index: 50;
|
|
98
141
|
}
|
|
99
142
|
|
|
100
143
|
.header-section {
|
|
@@ -3,11 +3,14 @@ interface HeaderProps {
|
|
|
3
3
|
title?: string;
|
|
4
4
|
homeUrl?: string;
|
|
5
5
|
hideAccount?: boolean;
|
|
6
|
+
hideHelp?: boolean;
|
|
7
|
+
hideNotification?: boolean;
|
|
6
8
|
accountName?: string;
|
|
7
9
|
userName?: string;
|
|
8
10
|
profileUrl?: string;
|
|
9
11
|
hideLoader?: boolean;
|
|
10
12
|
menu?: Snippet<[showMenu: boolean]>;
|
|
13
|
+
waffle?: Snippet<[showWaffle: boolean]>;
|
|
11
14
|
}
|
|
12
15
|
declare const Header: import("svelte").Component<HeaderProps, {}, "">;
|
|
13
16
|
type Header = ReturnType<typeof Header>;
|
package/dist/Home/Home.svelte
CHANGED
|
@@ -19,9 +19,7 @@
|
|
|
19
19
|
<section class={['home-container', hasSingleItem && 'centered', hasManyItems && 'grid']}>
|
|
20
20
|
{#each homeItems as homeItem}
|
|
21
21
|
<a href={homeItem.url} class="home-item">
|
|
22
|
-
<
|
|
23
|
-
<img src={homeItem.icon} alt={homeItem.text} />
|
|
24
|
-
</span>
|
|
22
|
+
<img src={homeItem.icon} alt={homeItem.text} />
|
|
25
23
|
<div>
|
|
26
24
|
<h2>{homeItem.text}</h2>
|
|
27
25
|
<p>{homeItem.detail}</p>
|
|
@@ -82,15 +80,11 @@
|
|
|
82
80
|
background: var(--black-1);
|
|
83
81
|
transition: background 0.2s ease-in-out;
|
|
84
82
|
|
|
85
|
-
>
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
width: 40px;
|
|
91
|
-
height: 40px;
|
|
92
|
-
filter: invert(100%);
|
|
93
|
-
}
|
|
83
|
+
> img {
|
|
84
|
+
width: 36px;
|
|
85
|
+
height: 36px;
|
|
86
|
+
margin: auto 0;
|
|
87
|
+
filter: invert(100%);
|
|
94
88
|
}
|
|
95
89
|
|
|
96
90
|
> div {
|
package/dist/Menu/Menu.svelte
CHANGED
|
@@ -10,16 +10,9 @@
|
|
|
10
10
|
showMenu: boolean;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
let isMainMenu: boolean = $state(true);
|
|
14
|
-
let activeItem: string = $state('');
|
|
15
|
-
|
|
16
13
|
let { menuItems, showMenu }: MenuProps = $props();
|
|
17
14
|
|
|
18
|
-
$
|
|
19
|
-
if (showMenu) {
|
|
20
|
-
setActiveMenuItem();
|
|
21
|
-
}
|
|
22
|
-
});
|
|
15
|
+
let activeItem = $state('');
|
|
23
16
|
|
|
24
17
|
const setActiveMenuItem = () => {
|
|
25
18
|
activeItem = menuItems.find((menuItem: MenuItem) => isActiveMenuItem(menuItem.url))?.text || '';
|
|
@@ -43,6 +36,12 @@
|
|
|
43
36
|
const onHandleMenu = () => {
|
|
44
37
|
showMenu = !showMenu;
|
|
45
38
|
};
|
|
39
|
+
|
|
40
|
+
$effect(() => {
|
|
41
|
+
if (showMenu) {
|
|
42
|
+
setActiveMenuItem();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
46
45
|
</script>
|
|
47
46
|
|
|
48
47
|
{#if showMenu}
|
|
@@ -60,7 +59,6 @@
|
|
|
60
59
|
item={menuItem}
|
|
61
60
|
isCollapsed={false}
|
|
62
61
|
activeItem={activeItem === menuItem.text}
|
|
63
|
-
{isMainMenu}
|
|
64
62
|
onClick={onClickMenuItem}
|
|
65
63
|
/>
|
|
66
64
|
{/each}
|
|
@@ -7,10 +7,9 @@
|
|
|
7
7
|
isCollapsed: boolean;
|
|
8
8
|
onClick?: (item: MenuItem) => void;
|
|
9
9
|
activeItem: boolean;
|
|
10
|
-
isMainMenu?: boolean;
|
|
11
10
|
}
|
|
12
11
|
|
|
13
|
-
let { item, isCollapsed = false, onClick, activeItem
|
|
12
|
+
let { item, isCollapsed = false, onClick, activeItem }: MenuItemProps = $props();
|
|
14
13
|
</script>
|
|
15
14
|
|
|
16
15
|
<li>
|
|
@@ -20,8 +19,7 @@
|
|
|
20
19
|
class={[
|
|
21
20
|
'item',
|
|
22
21
|
isCollapsed ? 'collapsed' : 'expanded',
|
|
23
|
-
activeItem && `active-${isCollapsed ? 'collapsed' : 'expanded'}
|
|
24
|
-
isMainMenu && 'main-menu'
|
|
22
|
+
activeItem && `active-${isCollapsed ? 'collapsed' : 'expanded'}`
|
|
25
23
|
]}
|
|
26
24
|
onclick={() => onClick?.(item)}
|
|
27
25
|
>
|
|
@@ -108,16 +106,6 @@
|
|
|
108
106
|
color: #472aff;
|
|
109
107
|
}
|
|
110
108
|
|
|
111
|
-
.main-menu.expanded:hover:not(.active-expanded),
|
|
112
|
-
.main-menu.collapsed:hover:not(.active-collapsed) {
|
|
113
|
-
background-color: #eaecff;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
.main-menu:hover .item-name-span,
|
|
117
|
-
.main-menu:hover .icon-span {
|
|
118
|
-
color: #472aff;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
109
|
.item.collapsed:focus,
|
|
122
110
|
.item.collapsed:focus-visible {
|
|
123
111
|
outline: none;
|
package/dist/Modal/Modal.svelte
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
title,
|
|
12
12
|
width = 'xs',
|
|
13
13
|
errorIcon,
|
|
14
|
+
hideHeader,
|
|
14
15
|
onclose = () => {},
|
|
15
16
|
children,
|
|
16
17
|
footer,
|
|
@@ -33,7 +34,7 @@
|
|
|
33
34
|
start: 0.95
|
|
34
35
|
}}
|
|
35
36
|
>
|
|
36
|
-
<ModalHeader {title} {errorIcon} onclose={onHandleClose} />
|
|
37
|
+
<ModalHeader {title} {errorIcon} {hideHeader} onclose={onHandleClose} />
|
|
37
38
|
<ModalContent content={children} {disablePadding} />
|
|
38
39
|
<ModalFooter {footer} onclose={onHandleClose} />
|
|
39
40
|
</div>
|
|
@@ -4,20 +4,23 @@
|
|
|
4
4
|
let {
|
|
5
5
|
title = '',
|
|
6
6
|
errorIcon = false,
|
|
7
|
+
hideHeader = false,
|
|
7
8
|
onclose
|
|
8
9
|
}: ModalHeaderProps & { onclose: VoidFunction } = $props();
|
|
9
10
|
</script>
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
<
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
{#if !hideHeader}
|
|
13
|
+
<header class="modal-header">
|
|
14
|
+
<div class="modal-header-title">
|
|
15
|
+
{#if errorIcon}
|
|
16
|
+
<span class="icon error material-icons-outlined">report</span>
|
|
17
|
+
{/if}
|
|
18
|
+
<h2>{title}</h2>
|
|
19
|
+
</div>
|
|
20
|
+
<button type="button" class="close-button material-icons-outlined" onclick={onclose}>close</button
|
|
21
|
+
>
|
|
22
|
+
</header>
|
|
23
|
+
{/if}
|
|
21
24
|
|
|
22
25
|
<style>
|
|
23
26
|
.modal-header,
|
|
@@ -29,6 +32,7 @@
|
|
|
29
32
|
.modal-header {
|
|
30
33
|
padding: 24px;
|
|
31
34
|
align-self: stretch;
|
|
35
|
+
border-bottom: 1px solid #aeb1b9;
|
|
32
36
|
}
|
|
33
37
|
|
|
34
38
|
.modal-header-title > .icon {
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Modal from '../Modal/Modal.svelte';
|
|
3
|
+
import type { ProcessingProps } from './processingState.svelte.js';
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
title = 'Processing your request',
|
|
7
|
+
text = '',
|
|
8
|
+
show = $bindable(true),
|
|
9
|
+
asModal = false
|
|
10
|
+
}: ProcessingProps = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
{#snippet processingContent()}
|
|
14
|
+
<div class="processing-header">
|
|
15
|
+
<span class="material-icons-outlined processing-icon">autorenew</span>
|
|
16
|
+
<div class="processing-content">
|
|
17
|
+
<h2 class="processing-title">{title}</h2>
|
|
18
|
+
{#if text}
|
|
19
|
+
<p class="processing-text">{text}</p>
|
|
20
|
+
{/if}
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
{/snippet}
|
|
24
|
+
|
|
25
|
+
{#if show}
|
|
26
|
+
{#if asModal}
|
|
27
|
+
<Modal bind:showModal={show} width="xs" hideHeader>
|
|
28
|
+
<div class="modal-processing-content">
|
|
29
|
+
{@render processingContent()}
|
|
30
|
+
</div>
|
|
31
|
+
</Modal>
|
|
32
|
+
{:else}
|
|
33
|
+
{@render processingContent()}
|
|
34
|
+
{/if}
|
|
35
|
+
{/if}
|
|
36
|
+
|
|
37
|
+
<style>
|
|
38
|
+
.processing-header {
|
|
39
|
+
display: flex;
|
|
40
|
+
flex-direction: column;
|
|
41
|
+
align-items: center;
|
|
42
|
+
text-align: center;
|
|
43
|
+
gap: 24px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.processing-content {
|
|
47
|
+
display: flex;
|
|
48
|
+
flex-direction: column;
|
|
49
|
+
gap: 8px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.processing-title {
|
|
53
|
+
font-size: 18px;
|
|
54
|
+
font-weight: 700;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.processing-text {
|
|
58
|
+
font-size: 16px;
|
|
59
|
+
white-space: pre-line;
|
|
60
|
+
line-height: 1.5;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.processing-icon {
|
|
64
|
+
background: linear-gradient(256deg, #00c9cd -2.41%, #472aff 31.72%, #392d9c 65.86%, #000 100%);
|
|
65
|
+
background-clip: text;
|
|
66
|
+
-webkit-background-clip: text;
|
|
67
|
+
-webkit-text-fill-color: transparent;
|
|
68
|
+
font-size: 32px;
|
|
69
|
+
animation: rotate 2s linear infinite;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@keyframes rotate {
|
|
73
|
+
from {
|
|
74
|
+
transform: rotate(0deg);
|
|
75
|
+
}
|
|
76
|
+
to {
|
|
77
|
+
transform: rotate(360deg);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.modal-processing-content {
|
|
82
|
+
display: flex;
|
|
83
|
+
flex-direction: column;
|
|
84
|
+
justify-content: center;
|
|
85
|
+
align-items: center;
|
|
86
|
+
min-height: 200px;
|
|
87
|
+
width: 100%;
|
|
88
|
+
}
|
|
89
|
+
</style>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { type SwitcherOption } from '../index.js';
|
|
3
|
+
|
|
4
|
+
interface SwitcherProps {
|
|
5
|
+
options: string[] | SwitcherOption[];
|
|
6
|
+
value?: string | null;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let { options, value = $bindable() }: SwitcherProps = $props();
|
|
10
|
+
|
|
11
|
+
const isStringArray = (items: string[] | SwitcherOption[]): items is string[] =>
|
|
12
|
+
typeof items[0] === 'string';
|
|
13
|
+
|
|
14
|
+
const originalOptions = $derived<SwitcherOption[]>(
|
|
15
|
+
isStringArray(options) ? options.map((option) => ({ label: option, value: option })) : options
|
|
16
|
+
);
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<div class="switcher-container">
|
|
20
|
+
{#each originalOptions as option}
|
|
21
|
+
<button
|
|
22
|
+
type="button"
|
|
23
|
+
class={['switcher-option', option.value === value && 'active']}
|
|
24
|
+
onclick={() => (value = option.value)}
|
|
25
|
+
>
|
|
26
|
+
{option.label}
|
|
27
|
+
</button>
|
|
28
|
+
{/each}
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<style>
|
|
32
|
+
.switcher-container {
|
|
33
|
+
--primary-color: #472aff;
|
|
34
|
+
--white: #fff;
|
|
35
|
+
--info-1: #eaecff;
|
|
36
|
+
--gray-1: #f4f6f8;
|
|
37
|
+
--gray-3: #aeb1b9;
|
|
38
|
+
--gray-4: #6b7180;
|
|
39
|
+
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-wrap: wrap;
|
|
42
|
+
width: fit-content;
|
|
43
|
+
padding: 4px;
|
|
44
|
+
gap: 12px;
|
|
45
|
+
border: 1px solid var(--gray-3);
|
|
46
|
+
border-radius: 8px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.switcher-container > .switcher-option {
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
border: none;
|
|
52
|
+
padding: 4px 20px;
|
|
53
|
+
font-size: 14px;
|
|
54
|
+
color: var(--gray-4);
|
|
55
|
+
font-weight: 500;
|
|
56
|
+
border-radius: 8px;
|
|
57
|
+
background: none;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.switcher-container > .switcher-option:hover {
|
|
61
|
+
background: var(--gray-1);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.switcher-container > .switcher-option:focus-visible {
|
|
65
|
+
box-shadow: 0px 0px 0px 3px #959bff;
|
|
66
|
+
outline: none;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.switcher-container > .switcher-option.active {
|
|
70
|
+
color: var(--white);
|
|
71
|
+
background: var(--primary-color);
|
|
72
|
+
transition: background 0.2s ease-in-out;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.switcher-container > .switcher-option.active:hover {
|
|
76
|
+
background: #3520bf;
|
|
77
|
+
}
|
|
78
|
+
</style>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type SwitcherOption } from '../index.js';
|
|
2
|
+
interface SwitcherProps {
|
|
3
|
+
options: string[] | SwitcherOption[];
|
|
4
|
+
value?: string | null;
|
|
5
|
+
}
|
|
6
|
+
declare const Switcher: import("svelte").Component<SwitcherProps, {}, "value">;
|
|
7
|
+
type Switcher = ReturnType<typeof Switcher>;
|
|
8
|
+
export default Switcher;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { fade } from 'svelte/transition';
|
|
3
|
+
import type { WaffleItem } from './waffleState.svelte.js';
|
|
4
|
+
import WaffleItems from './WaffleItems.svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
items?: WaffleItem[];
|
|
8
|
+
showWaffle?: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let { items = [], showWaffle = false }: Props = $props();
|
|
12
|
+
|
|
13
|
+
const handleTileClick = (item: WaffleItem) => {
|
|
14
|
+
onHandleWaffle();
|
|
15
|
+
window.open(item.url, '_blank', 'noopener,noreferrer');
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const onHandleWaffle = () => {
|
|
19
|
+
showWaffle = !showWaffle;
|
|
20
|
+
};
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
{#if showWaffle}
|
|
24
|
+
<div
|
|
25
|
+
class="waffle-backdrop"
|
|
26
|
+
onclick={onHandleWaffle}
|
|
27
|
+
onkeydown={onHandleWaffle}
|
|
28
|
+
transition:fade={{ duration: 200 }}
|
|
29
|
+
role="button"
|
|
30
|
+
tabindex="0"
|
|
31
|
+
aria-label="Close waffle menu"
|
|
32
|
+
></div>
|
|
33
|
+
|
|
34
|
+
<aside
|
|
35
|
+
class="waffle-dropdown"
|
|
36
|
+
transition:fade={{ duration: 250 }}
|
|
37
|
+
role="dialog"
|
|
38
|
+
aria-labelledby="waffle-title"
|
|
39
|
+
aria-modal="true"
|
|
40
|
+
>
|
|
41
|
+
<h2 class="waffle-title">SoftwareOne Cloud</h2>
|
|
42
|
+
|
|
43
|
+
<div class="waffle-content">
|
|
44
|
+
<ul class="waffle-grid" role="list">
|
|
45
|
+
{#each items as item (item.title)}
|
|
46
|
+
<li role="listitem">
|
|
47
|
+
<WaffleItems {...item} onclickwaffleitems={() => handleTileClick(item)} />
|
|
48
|
+
</li>
|
|
49
|
+
{/each}
|
|
50
|
+
</ul>
|
|
51
|
+
</div>
|
|
52
|
+
</aside>
|
|
53
|
+
{/if}
|
|
54
|
+
|
|
55
|
+
<style>
|
|
56
|
+
.waffle-backdrop {
|
|
57
|
+
position: fixed;
|
|
58
|
+
inset: 0;
|
|
59
|
+
background: rgba(243, 244, 246, 0.5);
|
|
60
|
+
cursor: pointer;
|
|
61
|
+
z-index: 30;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.waffle-dropdown {
|
|
65
|
+
position: absolute;
|
|
66
|
+
display: flex;
|
|
67
|
+
flex-direction: column;
|
|
68
|
+
border-radius: 8px;
|
|
69
|
+
background: #fff;
|
|
70
|
+
box-shadow:
|
|
71
|
+
0 10px 15px -3px rgba(0, 0, 0, 0.1),
|
|
72
|
+
0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
|
73
|
+
top: 80px;
|
|
74
|
+
left: 0;
|
|
75
|
+
z-index: 40;
|
|
76
|
+
width: 600px;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.waffle-content {
|
|
80
|
+
padding: 20px 24px 24px 24px;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.waffle-title {
|
|
84
|
+
padding: 24px 24px 0 24px;
|
|
85
|
+
font-size: 14px;
|
|
86
|
+
font-weight: 600;
|
|
87
|
+
text-align: center;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.waffle-grid {
|
|
91
|
+
display: grid;
|
|
92
|
+
grid-template-columns: repeat(3, 1fr);
|
|
93
|
+
gap: 16px;
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
title: string;
|
|
4
|
+
icon: string;
|
|
5
|
+
isNew?: boolean;
|
|
6
|
+
onclickwaffleitems: VoidFunction;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let { title, icon, isNew = false, onclickwaffleitems }: Props = $props();
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<button onclick={onclickwaffleitems} class="waffle-item-button">
|
|
13
|
+
{#if isNew}
|
|
14
|
+
<span class="waffle-new-badge" aria-label="New application">New</span>
|
|
15
|
+
{/if}
|
|
16
|
+
|
|
17
|
+
<figure class="waffle-icon-container" aria-hidden="true">
|
|
18
|
+
{@html icon}
|
|
19
|
+
</figure>
|
|
20
|
+
|
|
21
|
+
<h3 class="waffle-title">
|
|
22
|
+
{title}
|
|
23
|
+
</h3>
|
|
24
|
+
</button>
|
|
25
|
+
|
|
26
|
+
<style>
|
|
27
|
+
.waffle-item-button {
|
|
28
|
+
position: relative;
|
|
29
|
+
width: 150px;
|
|
30
|
+
height: 110px;
|
|
31
|
+
display: flex;
|
|
32
|
+
flex-direction: column;
|
|
33
|
+
align-items: center;
|
|
34
|
+
justify-content: center;
|
|
35
|
+
border-radius: 8px;
|
|
36
|
+
text-align: center;
|
|
37
|
+
border: none;
|
|
38
|
+
background: transparent;
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
transition: background-color 0.2s ease-in-out;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.waffle-item-button:hover {
|
|
44
|
+
background: #f4f6f8;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.waffle-item-button:focus, .waffle-item-button:focus-visible {
|
|
48
|
+
background: #eaecff;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.waffle-new-badge {
|
|
52
|
+
position: absolute;
|
|
53
|
+
top: 8px;
|
|
54
|
+
right: 8px;
|
|
55
|
+
background: #e6f9f2;
|
|
56
|
+
color: #29764d;
|
|
57
|
+
font-size: 14px;
|
|
58
|
+
font-weight: 500;
|
|
59
|
+
padding: 2px 6px;
|
|
60
|
+
border-radius: 4px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.waffle-icon-container {
|
|
64
|
+
width: 40px;
|
|
65
|
+
height: 40px;
|
|
66
|
+
margin-bottom: 12px;
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
justify-content: center;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.waffle-title {
|
|
73
|
+
color: #000;
|
|
74
|
+
font-weight: 500;
|
|
75
|
+
font-size: inherit;
|
|
76
|
+
word-break: break-words;
|
|
77
|
+
line-height: 1.25;
|
|
78
|
+
text-align: center;
|
|
79
|
+
padding: 0 4px;
|
|
80
|
+
margin: 0;
|
|
81
|
+
}
|
|
82
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
title: string;
|
|
3
|
+
icon: string;
|
|
4
|
+
isNew?: boolean;
|
|
5
|
+
onclickwaffleitems: VoidFunction;
|
|
6
|
+
}
|
|
7
|
+
declare const WaffleItems: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type WaffleItems = ReturnType<typeof WaffleItems>;
|
|
9
|
+
export default WaffleItems;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -27,15 +27,20 @@ import type { MenuItem } from './Menu/SidebarState.svelte';
|
|
|
27
27
|
import Modal from './Modal/Modal.svelte';
|
|
28
28
|
import type { ModalProps } from './Modal/modalState.svelte.js';
|
|
29
29
|
import Notification from './Notification/Notification.svelte';
|
|
30
|
+
import Processing from './Processing/Processing.svelte';
|
|
30
31
|
import ProgressPage from './ProgressPage/ProgressPage.svelte';
|
|
31
32
|
import { setProgressWizardStepsContext, getProgressWizardContext } from './ProgressWizard/context.js';
|
|
32
33
|
import ProgressWizard from './ProgressWizard/ProgressWizard.svelte';
|
|
33
34
|
import { setStepValidity, type ProgressWizardStep } from './ProgressWizard/progressWizardState.svelte.js';
|
|
34
35
|
import Search from './Search/Search.svelte';
|
|
35
36
|
import Spinner from './Spinner/Spinner.svelte';
|
|
37
|
+
import Switcher from './Switcher/Switcher.svelte';
|
|
38
|
+
import type { SwitcherOption } from './Switcher/switcherState.svelte.js';
|
|
36
39
|
import Tabs from './Tabs/Tabs.svelte';
|
|
37
40
|
import type { Tab } from './Tabs/tabsState.svelte.js';
|
|
38
41
|
import Toaster from './Toast/Toast.svelte';
|
|
39
42
|
import { addToast, type Toast } from './Toast/toastState.svelte';
|
|
40
43
|
import Tooltip from './Tooltip/Tooltip.svelte';
|
|
41
|
-
|
|
44
|
+
import Waffle from './Waffle/Waffle.svelte';
|
|
45
|
+
import type { WaffleItem } from './Waffle/waffleState.svelte.js';
|
|
46
|
+
export { Accordion, addBreadcrumbsNameMap, addToast, Avatar, Breadcrumbs, Button, Card, Chips, ChipType, ColumnType, ErrorPage, Footer, getProgressWizardContext, Header, HeaderAccount, HeaderLoader, HeaderLogo, HighlightPanel, Home, ImageType, Input, Menu, Modal, Notification, Processing, ProgressPage, ProgressWizard, Search, Select, setStepValidity, setProgressWizardStepsContext, Sidebar, Spinner, Switcher, Tabs, TextArea, Toaster, Toggle, Tooltip, Waffle, type BreadcrumbsNameMap, type HighlightPanelColumn, type HomeItem, type MenuItem, type ModalProps, type ProgressWizardStep, type SelectOption, type SwitcherOption, type Tab, type Toast, type WaffleItem };
|
package/dist/index.js
CHANGED
|
@@ -23,14 +23,17 @@ import Menu from './Menu/Menu.svelte';
|
|
|
23
23
|
import Sidebar from './Menu/Sidebar.svelte';
|
|
24
24
|
import Modal from './Modal/Modal.svelte';
|
|
25
25
|
import Notification from './Notification/Notification.svelte';
|
|
26
|
+
import Processing from './Processing/Processing.svelte';
|
|
26
27
|
import ProgressPage from './ProgressPage/ProgressPage.svelte';
|
|
27
28
|
import { setProgressWizardStepsContext, getProgressWizardContext } from './ProgressWizard/context.js';
|
|
28
29
|
import ProgressWizard from './ProgressWizard/ProgressWizard.svelte';
|
|
29
30
|
import { setStepValidity } from './ProgressWizard/progressWizardState.svelte.js';
|
|
30
31
|
import Search from './Search/Search.svelte';
|
|
31
32
|
import Spinner from './Spinner/Spinner.svelte';
|
|
33
|
+
import Switcher from './Switcher/Switcher.svelte';
|
|
32
34
|
import Tabs from './Tabs/Tabs.svelte';
|
|
33
35
|
import Toaster from './Toast/Toast.svelte';
|
|
34
36
|
import { addToast } from './Toast/toastState.svelte';
|
|
35
37
|
import Tooltip from './Tooltip/Tooltip.svelte';
|
|
36
|
-
|
|
38
|
+
import Waffle from './Waffle/Waffle.svelte';
|
|
39
|
+
export { Accordion, addBreadcrumbsNameMap, addToast, Avatar, Breadcrumbs, Button, Card, Chips, ChipType, ColumnType, ErrorPage, Footer, getProgressWizardContext, Header, HeaderAccount, HeaderLoader, HeaderLogo, HighlightPanel, Home, ImageType, Input, Menu, Modal, Notification, Processing, ProgressPage, ProgressWizard, Search, Select, setStepValidity, setProgressWizardStepsContext, Sidebar, Spinner, Switcher, Tabs, TextArea, Toaster, Toggle, Tooltip, Waffle };
|