@functionalcms/svelte-components 3.5.19 → 4.0.0-pre
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/css/functional.css +1 -1
- package/css/functional.css.map +1 -1
- package/dist/auth/authenticationHandle.js +0 -4
- package/dist/auth/redisSessionProvider.js +1 -2
- package/dist/auth/sessionIdGenerator.d.ts +1 -1
- package/dist/components/form/Button.svelte +379 -0
- package/dist/components/form/Button.svelte.d.ts +27 -0
- package/dist/components/form/Input.d.ts +21 -0
- package/dist/components/form/Input.js +23 -0
- package/dist/components/form/Input.svelte +142 -177
- package/dist/components/form/Input.svelte.d.ts +24 -46
- package/dist/components/{Banner.svelte → layouts/Banner.svelte} +5 -5
- package/dist/components/layouts/DefaultLayout.svelte +5 -5
- package/dist/components/layouts/DefaultLayout.svelte.d.ts +4 -4
- package/dist/components/layouts/SimpleFooter.svelte +4 -4
- package/dist/components/layouts/SimpleFooter.svelte.d.ts +3 -3
- package/dist/components/layouts/Well.svelte +46 -0
- package/dist/components/layouts/Well.svelte.d.ts +12 -0
- package/dist/components/menu/CollapsibleMenu.svelte +2 -2
- package/dist/components/menu/CollapsibleMenu.svelte.d.ts +3 -16
- package/dist/components/menu/DynamicMenu.svelte +25 -13
- package/dist/components/menu/DynamicMenu.svelte.d.ts +10 -28
- package/dist/components/menu/HamburgerMenu.svelte +29 -21
- package/dist/components/menu/HamburgerMenu.svelte.d.ts +11 -24
- package/dist/components/menu/ListMenu.svelte +53 -0
- package/dist/components/menu/ListMenu.svelte.d.ts +17 -0
- package/dist/components/menu/{Menu.d.ts → types.d.ts} +2 -0
- package/dist/components/menu/{Menu.js → types.js} +5 -0
- package/dist/components/presentation/Card.svelte +77 -92
- package/dist/components/presentation/Card.svelte.d.ts +10 -13
- package/dist/components/presentation/{Carusele.d.ts → Carousel.d.ts} +1 -1
- package/dist/components/presentation/Carousel.svelte +98 -1
- package/dist/components/presentation/Carousel.svelte.d.ts +14 -15
- package/dist/components/presentation/Drawer.svelte +131 -0
- package/dist/components/presentation/Drawer.svelte.d.ts +13 -0
- package/dist/components/presentation/Gallery.svelte +7 -7
- package/dist/components/presentation/Gallery.svelte.d.ts +3 -3
- package/dist/components/presentation/ImageCompare.svelte +39 -46
- package/dist/components/presentation/ImageCompare.svelte.d.ts +8 -26
- package/dist/components/presentation/Link.svelte +362 -0
- package/dist/components/presentation/Link.svelte.d.ts +27 -0
- package/dist/components/presentation/Logo.svelte +36 -0
- package/dist/components/presentation/Logo.svelte.d.ts +8 -0
- package/dist/components/presentation/ShowItem.d.ts +7 -7
- package/dist/components/presentation/ShowItem.js +1 -8
- package/dist/index-server.d.ts +0 -1
- package/dist/index-server.js +0 -3
- package/dist/index.d.ts +16 -26
- package/dist/index.js +39 -57
- package/dist/server-side/getServices.d.ts +1 -1
- package/dist/server-side/types.d.ts +1 -2
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +54 -0
- package/package.json +27 -27
- package/dist/components/CssHelper.d.ts +0 -1
- package/dist/components/CssHelper.js +0 -3
- package/dist/components/Link.svelte +0 -349
- package/dist/components/Link.svelte.d.ts +0 -48
- package/dist/components/Logo.svelte +0 -38
- package/dist/components/Logo.svelte.d.ts +0 -28
- package/dist/components/Spacer.svelte +0 -22
- package/dist/components/Spacer.svelte.d.ts +0 -6
- package/dist/components/Well.svelte +0 -40
- package/dist/components/Well.svelte.d.ts +0 -12
- package/dist/components/agnostic/Button/Button.svelte +0 -371
- package/dist/components/agnostic/Button/Button.svelte.d.ts +0 -52
- package/dist/components/agnostic/Button/ButtonGroup.svelte +0 -21
- package/dist/components/agnostic/Button/ButtonGroup.svelte.d.ts +0 -32
- package/dist/components/agnostic/Button/button-base.css +0 -12
- package/dist/components/agnostic/Button/button-core.css +0 -237
- package/dist/components/agnostic/Button/button-empty.css +0 -31
- package/dist/components/agnostic/Button/button-group.css +0 -8
- package/dist/components/agnostic/Close/Close.svelte +0 -124
- package/dist/components/agnostic/Close/Close.svelte.d.ts +0 -25
- package/dist/components/agnostic/Close/api.d.ts +0 -1
- package/dist/components/agnostic/Disclose/Disclose.svelte +0 -116
- package/dist/components/agnostic/Disclose/Disclose.svelte.d.ts +0 -11
- package/dist/components/agnostic/Divider/Divider.svelte +0 -141
- package/dist/components/agnostic/Divider/Divider.svelte.d.ts +0 -24
- package/dist/components/agnostic/Divider/api.d.ts +0 -3
- package/dist/components/agnostic/Divider/api.js +0 -1
- package/dist/components/agnostic/Loader/Loader.svelte +0 -116
- package/dist/components/agnostic/Loader/Loader.svelte.d.ts +0 -22
- package/dist/components/agnostic/animation.css +0 -37
- package/dist/components/blog/BlogDescription.svelte +0 -9
- package/dist/components/blog/BlogDescription.svelte.d.ts +0 -23
- package/dist/components/blog/BlogPost.d.ts +0 -13
- package/dist/components/blog/BlogPost.js +0 -1
- package/dist/components/blog/BlogTitle.svelte +0 -19
- package/dist/components/blog/BlogTitle.svelte.d.ts +0 -23
- package/dist/components/blog/blog.d.ts +0 -8
- package/dist/components/blog/blog.js +0 -29
- package/dist/components/converters/ShowItemToNavigationItems.d.ts +0 -3
- package/dist/components/converters/ShowItemToNavigationItems.js +0 -10
- package/dist/components/form/DateTimePicker.svelte +0 -59
- package/dist/components/form/DateTimePicker.svelte.d.ts +0 -18
- package/dist/components/form/InputAddonItem.svelte +0 -42
- package/dist/components/form/InputAddonItem.svelte.d.ts +0 -31
- package/dist/components/form/InputTypes.d.ts +0 -9
- package/dist/components/form/InputTypes.js +0 -10
- package/dist/components/form/Select.svelte +0 -157
- package/dist/components/form/Select.svelte.d.ts +0 -34
- package/dist/components/form/Switch.svelte +0 -275
- package/dist/components/form/Switch.svelte.d.ts +0 -30
- package/dist/components/menu/Menu.svelte +0 -526
- package/dist/components/menu/Menu.svelte.d.ts +0 -33
- package/dist/components/menu/MenuItem.svelte +0 -121
- package/dist/components/menu/MenuItem.svelte.d.ts +0 -39
- package/dist/components/menu/NavigationItems.svelte +0 -44
- package/dist/components/menu/NavigationItems.svelte.d.ts +0 -32
- package/dist/components/menu/authentication.d.ts +0 -1
- package/dist/components/menu/authentication.js +0 -6
- package/dist/components/presentation/Carousel/carousel-content.svelte +0 -35
- package/dist/components/presentation/Carousel/carousel-content.svelte.d.ts +0 -28
- package/dist/components/presentation/Carousel/carousel-item.svelte +0 -25
- package/dist/components/presentation/Carousel/carousel-item.svelte.d.ts +0 -28
- package/dist/components/presentation/Carousel/carousel-next.svelte +0 -39
- package/dist/components/presentation/Carousel/carousel-next.svelte.d.ts +0 -18
- package/dist/components/presentation/Carousel/carousel-previous.svelte +0 -40
- package/dist/components/presentation/Carousel/carousel-previous.svelte.d.ts +0 -18
- package/dist/components/presentation/Carousel/carousel.svelte +0 -99
- package/dist/components/presentation/Carousel/carousel.svelte.d.ts +0 -31
- package/dist/components/presentation/Carousel/context.d.ts +0 -32
- package/dist/components/presentation/Carousel/context.js +0 -12
- package/dist/components/presentation/Carusele.js +0 -5
- /package/dist/components/{Markdown.svelte → content/Markdown.svelte} +0 -0
- /package/dist/components/{Markdown.svelte.d.ts → content/Markdown.svelte.d.ts} +0 -0
- /package/dist/components/{Banner.svelte.d.ts → layouts/Banner.svelte.d.ts} +0 -0
- /package/dist/components/{agnostic/Close/api.js → presentation/Carousel.js} +0 -0
|
@@ -1,526 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { onDestroy, onMount } from 'svelte';
|
|
3
|
-
|
|
4
|
-
export let id;
|
|
5
|
-
export let type: 'simple' | 'kebab' | 'hamburger' | 'meatball' = 'simple';
|
|
6
|
-
export let size: 'small' | 'large' | '' = '';
|
|
7
|
-
export let menuTitle;
|
|
8
|
-
export let menuItems = [];
|
|
9
|
-
export let isDisabled = false;
|
|
10
|
-
export let isRounded = false;
|
|
11
|
-
export let isBordered = false;
|
|
12
|
-
export let isItemsRight = false;
|
|
13
|
-
export let icon = '▾';
|
|
14
|
-
export let onOpen;
|
|
15
|
-
export let onClose;
|
|
16
|
-
export let closeOnClickOutside = true;
|
|
17
|
-
export let closeOnSelect = true;
|
|
18
|
-
|
|
19
|
-
// References aka bindings
|
|
20
|
-
let rootRef;
|
|
21
|
-
let triggerRef;
|
|
22
|
-
|
|
23
|
-
let menuItemRefs = []; //https://svelte.dev/tutorial/component-this
|
|
24
|
-
$: menuItemRefs = [];
|
|
25
|
-
|
|
26
|
-
// State management
|
|
27
|
-
let expanded = false;
|
|
28
|
-
const setExpanded = (b) => expanded = b;
|
|
29
|
-
let selectedItem = -1;
|
|
30
|
-
const setSelectedItem = (n) => selectedItem = n;
|
|
31
|
-
|
|
32
|
-
const setOpened = (open) => {
|
|
33
|
-
if (open && onOpen) {
|
|
34
|
-
onOpen(selectedItem);
|
|
35
|
-
} else if (onClose) {
|
|
36
|
-
onClose();
|
|
37
|
-
}
|
|
38
|
-
setExpanded(open);
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
// Focus management
|
|
42
|
-
const focusItem = (index: number, direction?: 'asc' | 'desc') => {
|
|
43
|
-
let i = index;
|
|
44
|
-
if (direction === 'asc') {
|
|
45
|
-
i += 1;
|
|
46
|
-
} else if (direction === 'desc') {
|
|
47
|
-
i -= 1;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Circular navigation
|
|
51
|
-
//
|
|
52
|
-
// If we've went beyond "start" circle around to last
|
|
53
|
-
if (i < 0) {
|
|
54
|
-
i = menuItems.length - 1;
|
|
55
|
-
} else if (i >= menuItems.length) {
|
|
56
|
-
// We've went beyond "last" so circle around to first
|
|
57
|
-
i = 0;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const nextMenuItem = menuItemRefs[i];
|
|
61
|
-
|
|
62
|
-
if (nextMenuItem) {
|
|
63
|
-
// Edge case: We hit a tab button that's been disabled. If so, we recurse, but
|
|
64
|
-
// only if we've been supplied a `direction`. Otherwise, nothing left to do.
|
|
65
|
-
if (nextMenuItem.isDisabled() && direction) {
|
|
66
|
-
// Retry with new `i` index going in same direction
|
|
67
|
-
focusItem(i, direction);
|
|
68
|
-
} else {
|
|
69
|
-
// Note that .focus is available here as a result of agnostic-svelte/src/lib/components/Menu/MenuItem.svelte
|
|
70
|
-
// maintaining its own reference to the native <button> element and then exposing itw own export function focus
|
|
71
|
-
nextMenuItem.focus();
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const focusTriggerButton = () => triggerRef && triggerRef.focus();
|
|
77
|
-
|
|
78
|
-
const isInside = (el) => {
|
|
79
|
-
if (rootRef) {
|
|
80
|
-
const children = rootRef.querySelectorAll('*');
|
|
81
|
-
for (let i = 0; i < children.length; i += 1) {
|
|
82
|
-
const child = children[i];
|
|
83
|
-
if (el === child) {
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
const clickedOutside = (ev) => {
|
|
92
|
-
if (expanded && closeOnClickOutside) {
|
|
93
|
-
if (!isInside(ev.target)) {
|
|
94
|
-
setExpanded(false);
|
|
95
|
-
focusTriggerButton();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
onMount(() => {
|
|
101
|
-
if (typeof window !== 'undefined') {
|
|
102
|
-
document.addEventListener('click', clickedOutside);
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
onDestroy(() => {
|
|
107
|
-
if (typeof window !== 'undefined') {
|
|
108
|
-
document.removeEventListener('click', clickedOutside);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
// CSS Classes
|
|
113
|
-
let triggerSizeClasses;
|
|
114
|
-
let itemSizeClasses;
|
|
115
|
-
switch (size) {
|
|
116
|
-
case 'small':
|
|
117
|
-
triggerSizeClasses = "menu-trigger-small";
|
|
118
|
-
itemSizeClasses = "menu-item-small";
|
|
119
|
-
break;
|
|
120
|
-
case 'large':
|
|
121
|
-
triggerSizeClasses = "menu-trigger-large";
|
|
122
|
-
itemSizeClasses = "menu-item-large";
|
|
123
|
-
break;
|
|
124
|
-
default:
|
|
125
|
-
triggerSizeClasses = '';
|
|
126
|
-
itemSizeClasses = '';
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const dotBarClasses = [
|
|
130
|
-
type === 'hamburger' ? 'bar' : 'dot'
|
|
131
|
-
]
|
|
132
|
-
.filter((cls) => cls)
|
|
133
|
-
.join(' ');
|
|
134
|
-
|
|
135
|
-
const triggerClasses = [
|
|
136
|
-
type === 'simple' ? "menu-trigger" : '',
|
|
137
|
-
triggerSizeClasses,
|
|
138
|
-
isBordered ? "menu-trigger-bordered" : '',
|
|
139
|
-
isRounded ? "menu-trigger-rounded" : '',
|
|
140
|
-
type !== 'simple' ? "btn-base" : '',
|
|
141
|
-
type !== 'simple' ? "btn-blank" : '',
|
|
142
|
-
type === 'kebab' ? "btn-kebab" : '',
|
|
143
|
-
type === 'meatball' ? "btn-meatball" : '',
|
|
144
|
-
type === 'hamburger' ? "btn-hamburger" : '',
|
|
145
|
-
]
|
|
146
|
-
.filter((cls) => cls)
|
|
147
|
-
.join(' ');
|
|
148
|
-
|
|
149
|
-
const itemClasses = [itemSizeClasses, isRounded ? "menu-item-rounded" : '']
|
|
150
|
-
.filter((cls) => cls)
|
|
151
|
-
.join(' ');
|
|
152
|
-
|
|
153
|
-
const afterOpened = () => {
|
|
154
|
-
requestAnimationFrame(() => {
|
|
155
|
-
// If selectedItem < 1 probably hasn't been opened before (or happens to be on
|
|
156
|
-
// first item). Otherwise, might be "reopening" and has previously selected item
|
|
157
|
-
if (selectedItem < 1) {
|
|
158
|
-
setSelectedItem(0);
|
|
159
|
-
onMenuItemKeyDown('Home', 0);
|
|
160
|
-
} else {
|
|
161
|
-
focusItem(selectedItem);
|
|
162
|
-
setSelectedItem(selectedItem);
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* @param evOrString arg of either keyboard event or a string w/direction key like Up Down etc.
|
|
169
|
-
* @param index
|
|
170
|
-
* @returns
|
|
171
|
-
*/
|
|
172
|
-
const onMenuItemKeyDown = (evOrString, index) => {
|
|
173
|
-
const key = typeof evOrString === 'string' ? evOrString : evOrString.key;
|
|
174
|
-
switch (key) {
|
|
175
|
-
case 'Up': // These first cases are IEEdge :(
|
|
176
|
-
case 'ArrowUp':
|
|
177
|
-
focusItem(index, 'desc');
|
|
178
|
-
break;
|
|
179
|
-
case 'Down':
|
|
180
|
-
case 'ArrowDown':
|
|
181
|
-
focusItem(index, 'asc');
|
|
182
|
-
break;
|
|
183
|
-
case 'Home':
|
|
184
|
-
case 'ArrowHome':
|
|
185
|
-
focusItem(0);
|
|
186
|
-
break;
|
|
187
|
-
case 'End':
|
|
188
|
-
case 'ArrowEnd':
|
|
189
|
-
focusItem(menuItems.length - 1);
|
|
190
|
-
break;
|
|
191
|
-
case 'Enter':
|
|
192
|
-
case 'Space':
|
|
193
|
-
// Focus and select the item
|
|
194
|
-
focusItem(index);
|
|
195
|
-
setSelectedItem(index);
|
|
196
|
-
// If we're to close the menu on selection (default) then do so
|
|
197
|
-
if (closeOnSelect) {
|
|
198
|
-
setOpened(false);
|
|
199
|
-
focusTriggerButton();
|
|
200
|
-
}
|
|
201
|
-
break;
|
|
202
|
-
case 'Escape':
|
|
203
|
-
setOpened(false);
|
|
204
|
-
focusTriggerButton();
|
|
205
|
-
break;
|
|
206
|
-
case 'Tab':
|
|
207
|
-
// Trap tabs while capturing these menu events
|
|
208
|
-
if (typeof evOrString !== 'string') {
|
|
209
|
-
evOrString.preventDefault();
|
|
210
|
-
}
|
|
211
|
-
break;
|
|
212
|
-
default:
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
if (typeof evOrString !== 'string') {
|
|
216
|
-
evOrString.preventDefault();
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
const onTriggerButtonKeyDown = (e) => {
|
|
221
|
-
switch (e.key) {
|
|
222
|
-
case 'Down':
|
|
223
|
-
case 'ArrowDown':
|
|
224
|
-
// If not expanded and we haven't previously selected an item other then first item
|
|
225
|
-
// puts focus on first item in menu list. Otherwise,
|
|
226
|
-
if (!expanded) {
|
|
227
|
-
setOpened(true);
|
|
228
|
-
afterOpened();
|
|
229
|
-
e.preventDefault();
|
|
230
|
-
}
|
|
231
|
-
break;
|
|
232
|
-
case 'Escape':
|
|
233
|
-
if (expanded) {
|
|
234
|
-
setOpened(false);
|
|
235
|
-
focusTriggerButton();
|
|
236
|
-
}
|
|
237
|
-
break;
|
|
238
|
-
default:
|
|
239
|
-
// Noop
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
const onTriggerButtonClicked = () => {
|
|
244
|
-
// toggled is local reference to !expanded since setExpanded is async (avoids race condition)
|
|
245
|
-
const toggled = !expanded;
|
|
246
|
-
setOpened(toggled);
|
|
247
|
-
setTimeout(() => {
|
|
248
|
-
if (toggled) {
|
|
249
|
-
afterOpened();
|
|
250
|
-
} else if (closeOnSelect) {
|
|
251
|
-
// If we're to close the menu on selection (default) then do so
|
|
252
|
-
setOpened(false);
|
|
253
|
-
focusTriggerButton();
|
|
254
|
-
}
|
|
255
|
-
}, 10);
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
$: menuItemClasses = (isSelected) => {
|
|
259
|
-
return [
|
|
260
|
-
`menu-item`,
|
|
261
|
-
itemClasses,
|
|
262
|
-
isSelected ? "menu-item-selected" : "",
|
|
263
|
-
].filter((klass) => klass.length).join(" ");
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
$: menuItemsClasses = () => {
|
|
267
|
-
return [
|
|
268
|
-
isItemsRight ? "menu-items-right" : "",
|
|
269
|
-
!isItemsRight ? "menu-items" : ""
|
|
270
|
-
].filter(c => c && c.length).join(' ');
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
$: onMenuItemClicked = (index) => {
|
|
274
|
-
setSelectedItem(index);
|
|
275
|
-
if (closeOnSelect) {
|
|
276
|
-
setOpened(false);
|
|
277
|
-
focusTriggerButton();
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
</script>
|
|
281
|
-
<div bind:this={rootRef} class="menu">
|
|
282
|
-
<button
|
|
283
|
-
bind:this={triggerRef}
|
|
284
|
-
class={triggerClasses}
|
|
285
|
-
aria-haspopup="true"
|
|
286
|
-
aria-expanded={expanded}
|
|
287
|
-
disabled={isDisabled}
|
|
288
|
-
on:keydown={onTriggerButtonKeyDown}
|
|
289
|
-
on:click={onTriggerButtonClicked}
|
|
290
|
-
>
|
|
291
|
-
{#if type === 'simple'}
|
|
292
|
-
{menuTitle}
|
|
293
|
-
<span class="menu-icon" aria-hidden="true">
|
|
294
|
-
{icon}
|
|
295
|
-
</span>
|
|
296
|
-
{:else}
|
|
297
|
-
<span class="screenreader-only">{menuTitle}</span>
|
|
298
|
-
<span class={dotBarClasses}></span>
|
|
299
|
-
<span class={dotBarClasses}></span>
|
|
300
|
-
<span class={dotBarClasses}></span>
|
|
301
|
-
{/if}
|
|
302
|
-
</button>
|
|
303
|
-
<div class={menuItemsClasses()} id={id} role="menu" hidden={!expanded}>
|
|
304
|
-
{#each menuItems as item, i}
|
|
305
|
-
<svelte:component
|
|
306
|
-
this={item.menuItemComponent}
|
|
307
|
-
bind:this={menuItemRefs[i]}
|
|
308
|
-
classes={menuItemClasses(selectedItem === i)}
|
|
309
|
-
isSelected={selectedItem === i}
|
|
310
|
-
disabled={item.isDisabled}
|
|
311
|
-
on:click={() => onMenuItemClicked(i)}
|
|
312
|
-
on:keydown={(ev) => onMenuItemKeyDown(ev, i)}
|
|
313
|
-
>
|
|
314
|
-
{item.label}
|
|
315
|
-
</svelte:component>
|
|
316
|
-
{/each}
|
|
317
|
-
</div>
|
|
318
|
-
</div>
|
|
319
|
-
<style>
|
|
320
|
-
.menu {
|
|
321
|
-
display: inline-flex;
|
|
322
|
-
position: relative;
|
|
323
|
-
background-color: inherit;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
:is(.menu-items, .menu-items-right) {
|
|
327
|
-
position: absolute;
|
|
328
|
-
background-color: var(--functional-light);
|
|
329
|
-
margin-block-start: var(--fluid-6);
|
|
330
|
-
z-index: 10;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
.menu-items {
|
|
334
|
-
right: initial;
|
|
335
|
-
left: 0;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
.menu-items-right {
|
|
339
|
-
left: initial;
|
|
340
|
-
right: 0;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
.btn-base {
|
|
344
|
-
display: inline-flex;
|
|
345
|
-
align-items: center;
|
|
346
|
-
justify-content: center;
|
|
347
|
-
white-space: nowrap;
|
|
348
|
-
user-select: none;
|
|
349
|
-
appearance: none;
|
|
350
|
-
cursor: pointer;
|
|
351
|
-
box-sizing: border-box;
|
|
352
|
-
transition-property: all;
|
|
353
|
-
transition-duration: var(--functional-timing-medium);
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
/**
|
|
357
|
-
* Invisible buttons. Generally used for a Cancel or icon button that behaves like a button,
|
|
358
|
-
* semantically and for a11y, but, does so without all the typical "button chrome" behind it.
|
|
359
|
-
*/
|
|
360
|
-
:is(.btn-link, .btn-blank) {
|
|
361
|
-
font-family: var(--functional-btn-font-family, var(--functional-font-family-body));
|
|
362
|
-
font-size: var(--functional-btn-font-size, 1rem);
|
|
363
|
-
background-color: transparent;
|
|
364
|
-
border: 0;
|
|
365
|
-
border-radius: 0;
|
|
366
|
-
box-shadow: none;
|
|
367
|
-
transition: none;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
/* Since blank buttons can be used for things like input addons we don't want to go crazy
|
|
371
|
-
on the side padding. As such, these have a good bit less then regular buttons. */
|
|
372
|
-
.btn-blank {
|
|
373
|
-
--functional-btn-blank-side-padding: var(--btn-blank-side-padding, 0.25rem);
|
|
374
|
-
|
|
375
|
-
padding-inline-start: var(--functional-btn-blank-side-padding);
|
|
376
|
-
padding-inline-end: var(--functional-btn-blank-side-padding);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
/* A button blank with link color text */
|
|
380
|
-
.btn-link {
|
|
381
|
-
color: var(--functional-btn-primary, var(--functional-primary));
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
.btn-link:hover {
|
|
385
|
-
cursor: pointer;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
.menu-trigger {
|
|
389
|
-
display: flex;
|
|
390
|
-
align-items: center;
|
|
391
|
-
justify-content: space-between;
|
|
392
|
-
max-width: 100%;
|
|
393
|
-
background-color: var(--functional-btn-bgcolor, var(--functional-gray-light));
|
|
394
|
-
cursor: pointer;
|
|
395
|
-
text-align: left;
|
|
396
|
-
|
|
397
|
-
/* TODO -- can we compose some of this from the button styles? */
|
|
398
|
-
border-color: var(--functional-btn-bgcolor, var(--functional-gray-light));
|
|
399
|
-
border-style: solid;
|
|
400
|
-
border-width: var(--functional-btn-border-size, 1px);
|
|
401
|
-
font-size: inherit;
|
|
402
|
-
|
|
403
|
-
/* this can be overriden, but it might mess with the balance of the button heights across variants */
|
|
404
|
-
line-height: var(--functional-line-height, var(--fluid-20, 1.25rem));
|
|
405
|
-
padding-block-start: var(--functional-vertical-pad, 0.5rem);
|
|
406
|
-
padding-block-end: var(--functional-vertical-pad, 0.5rem);
|
|
407
|
-
padding-inline-start: var(--functional-side-padding, 0.75rem);
|
|
408
|
-
padding-inline-end: var(--functional-side-padding, 0.75rem);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
.menu-trigger[disabled] {
|
|
412
|
-
background: var(--functional-input-disabled-bg, var(--functional-disabled-bg)) !important;
|
|
413
|
-
color: var(--functional-input-disabled-color, var(--functional-disabled-color)) !important;
|
|
414
|
-
cursor: not-allowed !important;
|
|
415
|
-
opacity: 80% !important;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
.menu-trigger:focus {
|
|
419
|
-
box-shadow: 0 0 0 var(--functional-focus-ring-outline-width) var(--functional-focus-ring-color);
|
|
420
|
-
|
|
421
|
-
/* Needed for High Contrast mode */
|
|
422
|
-
outline:
|
|
423
|
-
var(--functional-focus-ring-outline-width) var(--functional-focus-ring-outline-style)
|
|
424
|
-
var(--functional-focus-ring-outline-color);
|
|
425
|
-
transition: box-shadow var(--functional-timing-fast) ease-out;
|
|
426
|
-
|
|
427
|
-
/* In order for the focused element's box-shadow to appear above its siblings we need to
|
|
428
|
-
establish a new stacking context: https://stackoverflow.com/a/28042700 */
|
|
429
|
-
isolation: isolate;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
/* Sizes */
|
|
433
|
-
.menu-trigger-large {
|
|
434
|
-
font-size: calc(var(--functional-btn-font-size, 1rem) + 0.25rem);
|
|
435
|
-
height: 3rem;
|
|
436
|
-
line-height: 2rem;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
.menu-trigger-small {
|
|
440
|
-
font-size: calc(var(--functional-btn-font-size, 1rem) - 0.25rem);
|
|
441
|
-
height: 2rem;
|
|
442
|
-
line-height: 1rem;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
.menu-trigger-bordered {
|
|
446
|
-
--menu-item-background-color: var(--functional-menu-item-background-color, inherit);
|
|
447
|
-
|
|
448
|
-
background-color: var(--menu-item-background-color);
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
.menu-trigger-rounded {
|
|
452
|
-
border-radius: var(--functional-radius);
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
/* TODO make this more flexible eventually */
|
|
456
|
-
.menu-icon {
|
|
457
|
-
font-family: sans-serif;
|
|
458
|
-
font-size: var(--fluid-18);
|
|
459
|
-
margin-inline-start: var(--fluid-8);
|
|
460
|
-
line-height: 1;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
:is(.btn-kebab, .btn-meatball) {
|
|
464
|
-
justify-content: space-around;
|
|
465
|
-
height: var(--fluid-24);
|
|
466
|
-
width: var(--fluid-24);
|
|
467
|
-
|
|
468
|
-
/* Rest here is supplied by btn-base and btn-blank */
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
/* We use btn-blank which doesn't include this :( */
|
|
472
|
-
:is(.btn-hamburger:focus, .btn-kebab:focus, .btn-meatball:focus) {
|
|
473
|
-
box-shadow: 0 0 0 var(--functional-focus-ring-outline-width) var(--functional-focus-ring-color);
|
|
474
|
-
outline:
|
|
475
|
-
var(--functional-focus-ring-outline-width)
|
|
476
|
-
var(--functional-focus-ring-outline-style)
|
|
477
|
-
var(--functional-focus-ring-outline-color);
|
|
478
|
-
transition: box-shadow var(--functional-timing-fast) ease-out;
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
.btn-hamburger,
|
|
482
|
-
.btn-kebab {
|
|
483
|
-
flex-direction: column;
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
.btn-meatball {
|
|
487
|
-
flex-direction: row;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
/* stylelint-disable-next-line no-duplicate-selectors */
|
|
491
|
-
.btn-meatball {
|
|
492
|
-
--block-padding: var(--functional-side-padding);
|
|
493
|
-
|
|
494
|
-
padding-block-start: var(--block-padding);
|
|
495
|
-
padding-block-end: var(--block-padding);
|
|
496
|
-
padding-inline-start: 0;
|
|
497
|
-
padding-inline-end: 0;
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
.btn-hamburger {
|
|
501
|
-
--vertical-padding: 3px;
|
|
502
|
-
|
|
503
|
-
padding-block-start: var(--vertical-padding);
|
|
504
|
-
padding-block-end: var(--vertical-padding);
|
|
505
|
-
padding-inline-end: var(--fluid-2);
|
|
506
|
-
padding-inline-start: var(--fluid-2);
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
.dot,
|
|
510
|
-
.bar {
|
|
511
|
-
background-color: var(--functional-dark);
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
.dot {
|
|
515
|
-
width: 5px;
|
|
516
|
-
height: 5px;
|
|
517
|
-
border-radius: 50px;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
.bar {
|
|
521
|
-
width: var(--fluid-20);
|
|
522
|
-
height: var(--fluid-2);
|
|
523
|
-
margin: var(--fluid-2) 0;
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
</style>
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
-
$$bindings?: Bindings;
|
|
4
|
-
} & Exports;
|
|
5
|
-
(internal: unknown, props: Props & {
|
|
6
|
-
$$events?: Events;
|
|
7
|
-
$$slots?: Slots;
|
|
8
|
-
}): Exports & {
|
|
9
|
-
$set?: any;
|
|
10
|
-
$on?: any;
|
|
11
|
-
};
|
|
12
|
-
z_$$bindings?: Bindings;
|
|
13
|
-
}
|
|
14
|
-
declare const Menu: $$__sveltets_2_IsomorphicComponent<{
|
|
15
|
-
id: any;
|
|
16
|
-
type?: "simple" | "kebab" | "hamburger" | "meatball";
|
|
17
|
-
size?: "small" | "large" | "";
|
|
18
|
-
menuTitle: any;
|
|
19
|
-
menuItems?: any[];
|
|
20
|
-
isDisabled?: boolean;
|
|
21
|
-
isRounded?: boolean;
|
|
22
|
-
isBordered?: boolean;
|
|
23
|
-
isItemsRight?: boolean;
|
|
24
|
-
icon?: string;
|
|
25
|
-
onOpen: any;
|
|
26
|
-
onClose: any;
|
|
27
|
-
closeOnClickOutside?: boolean;
|
|
28
|
-
closeOnSelect?: boolean;
|
|
29
|
-
}, {
|
|
30
|
-
[evt: string]: CustomEvent<any>;
|
|
31
|
-
}, {}, {}, string>;
|
|
32
|
-
type Menu = InstanceType<typeof Menu>;
|
|
33
|
-
export default Menu;
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
export let disabled = false;
|
|
3
|
-
export let isSelected = false;
|
|
4
|
-
export let classes;
|
|
5
|
-
|
|
6
|
-
// This is a component reference which we need to control the keyboard navigation
|
|
7
|
-
// in our tabs implementation. See: https://svelte.dev/tutorial/component-this
|
|
8
|
-
let btn;
|
|
9
|
-
export function focus() {
|
|
10
|
-
return btn.focus();
|
|
11
|
-
}
|
|
12
|
-
export function isDisabled() {
|
|
13
|
-
return btn.disabled;
|
|
14
|
-
}
|
|
15
|
-
</script>
|
|
16
|
-
<button
|
|
17
|
-
on:click
|
|
18
|
-
on:keydown
|
|
19
|
-
bind:this={btn}
|
|
20
|
-
role="menuitem"
|
|
21
|
-
tabindex={isSelected ? 0 : -1}
|
|
22
|
-
disabled={disabled}
|
|
23
|
-
class={classes}
|
|
24
|
-
>
|
|
25
|
-
<slot />
|
|
26
|
-
</button>
|
|
27
|
-
|
|
28
|
-
<style>
|
|
29
|
-
.menu-item {
|
|
30
|
-
--menu-item-background-color: var(--functional-menu-item-background-color, inherit);
|
|
31
|
-
|
|
32
|
-
text-align: left;
|
|
33
|
-
|
|
34
|
-
/* TODO -- can we compose some of this from the button styles? */
|
|
35
|
-
border-color: var(--functional-btn-bgcolor, var(--functional-gray-light));
|
|
36
|
-
border-style: solid;
|
|
37
|
-
border-width: var(--functional-btn-border-size, 1px);
|
|
38
|
-
font-size: inherit;
|
|
39
|
-
|
|
40
|
-
/* this can be overriden, but it might mess with the balance of the button heights across variants */
|
|
41
|
-
line-height: var(--functional-line-height, var(--fluid-20, 1.25rem));
|
|
42
|
-
padding-block-start: var(--functional-vertical-pad, 0.5rem);
|
|
43
|
-
padding-block-end: var(--functional-vertical-pad, 0.5rem);
|
|
44
|
-
padding-inline-start: var(--functional-side-padding, 0.75rem);
|
|
45
|
-
padding-inline-end: var(--functional-side-padding, 0.75rem);
|
|
46
|
-
background-color: var(--menu-item-background-color);
|
|
47
|
-
display: block;
|
|
48
|
-
min-width: 100%;
|
|
49
|
-
white-space: nowrap;
|
|
50
|
-
cursor: default;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.menu-item[disabled] {
|
|
54
|
-
background: var(--functional-input-disabled-bg, var(--functional-disabled-bg)) !important;
|
|
55
|
-
color: var(--functional-input-disabled-color, var(--functional-disabled-color)) !important;
|
|
56
|
-
cursor: not-allowed !important;
|
|
57
|
-
opacity: 80% !important;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.menu-item:focus {
|
|
61
|
-
box-shadow: 0 0 0 var(--functional-focus-ring-outline-width) var(--functional-focus-ring-color);
|
|
62
|
-
|
|
63
|
-
/* Needed for High Contrast mode */
|
|
64
|
-
outline:
|
|
65
|
-
var(--functional-focus-ring-outline-width) var(--functional-focus-ring-outline-style)
|
|
66
|
-
var(--functional-focus-ring-outline-color);
|
|
67
|
-
transition: box-shadow var(--functional-timing-fast) ease-out;
|
|
68
|
-
|
|
69
|
-
/* In order for the focused element's box-shadow to appear above its siblings we need to
|
|
70
|
-
establish a new stacking context: https://stackoverflow.com/a/28042700 */
|
|
71
|
-
isolation: isolate;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
.menu-item:not(:first-of-type) {
|
|
75
|
-
border-top: 0;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.menu-item-selected {
|
|
79
|
-
color: var(--functional-light);
|
|
80
|
-
background-color: var(--functional-primary);
|
|
81
|
-
border-color: var(--functional-primary);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.menu-item:active:not(.menu-item-selected) {
|
|
85
|
-
color: var(--functional-primary);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
.menu-item [aria-checked="true"]::before {
|
|
89
|
-
/* TODO make this more flexible eventually */
|
|
90
|
-
content: "\2713\0020";
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/* Sizes */
|
|
94
|
-
.menu-item-large {
|
|
95
|
-
font-size: calc(var(--functional-btn-font-size, 1rem) + 0.25rem);
|
|
96
|
-
height: 3rem;
|
|
97
|
-
line-height: 2rem;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
.menu-item-small {
|
|
101
|
-
font-size: calc(var(--functional-btn-font-size, 1rem) - 0.25rem);
|
|
102
|
-
height: 2rem;
|
|
103
|
-
line-height: 1rem;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.menu-item-rounded:first-of-type {
|
|
107
|
-
border-top-left-radius: var(--functional-radius);
|
|
108
|
-
border-top-right-radius: var(--functional-radius);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
.menu-item-rounded:last-of-type {
|
|
112
|
-
border-bottom-left-radius: var(--functional-radius);
|
|
113
|
-
border-bottom-right-radius: var(--functional-radius);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
.menu-item:hover:not([disabled]):not(.menu-item-selected) {
|
|
117
|
-
background-color: var(--functional-gray-extra-light);
|
|
118
|
-
cursor: pointer;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
</style>
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
-
$$bindings?: Bindings;
|
|
4
|
-
} & Exports;
|
|
5
|
-
(internal: unknown, props: Props & {
|
|
6
|
-
$$events?: Events;
|
|
7
|
-
$$slots?: Slots;
|
|
8
|
-
}): Exports & {
|
|
9
|
-
$set?: any;
|
|
10
|
-
$on?: any;
|
|
11
|
-
};
|
|
12
|
-
z_$$bindings?: Bindings;
|
|
13
|
-
}
|
|
14
|
-
type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
|
|
15
|
-
default: any;
|
|
16
|
-
} ? Props extends Record<string, never> ? any : {
|
|
17
|
-
children?: any;
|
|
18
|
-
} : {});
|
|
19
|
-
declare const MenuItem: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
|
|
20
|
-
disabled?: boolean;
|
|
21
|
-
isSelected?: boolean;
|
|
22
|
-
classes: any;
|
|
23
|
-
focus?: () => any;
|
|
24
|
-
isDisabled?: () => any;
|
|
25
|
-
}, {
|
|
26
|
-
default: {};
|
|
27
|
-
}>, {
|
|
28
|
-
click: MouseEvent;
|
|
29
|
-
keydown: KeyboardEvent;
|
|
30
|
-
} & {
|
|
31
|
-
[evt: string]: CustomEvent<any>;
|
|
32
|
-
}, {
|
|
33
|
-
default: {};
|
|
34
|
-
}, {
|
|
35
|
-
focus: () => any;
|
|
36
|
-
isDisabled: () => any;
|
|
37
|
-
}, string>;
|
|
38
|
-
type MenuItem = InstanceType<typeof MenuItem>;
|
|
39
|
-
export default MenuItem;
|