@functionalcms/svelte-components 2.33.1 → 2.34.1

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 (98) hide show
  1. package/dist/components/Link.svelte +290 -290
  2. package/dist/components/agnostic/Alert/Alert.svelte +310 -0
  3. package/dist/components/agnostic/Alert/Alert.svelte.d.ts +31 -0
  4. package/dist/components/agnostic/Avatar/Avatar.svelte +123 -0
  5. package/dist/components/agnostic/Avatar/Avatar.svelte.d.ts +26 -0
  6. package/dist/components/agnostic/Avatar/AvatarGroup.svelte +106 -0
  7. package/dist/components/agnostic/Avatar/AvatarGroup.svelte.d.ts +29 -0
  8. package/dist/components/agnostic/Breadcrumb/Breadcrumb.svelte +56 -0
  9. package/dist/components/agnostic/Breadcrumb/Breadcrumb.svelte.d.ts +20 -0
  10. package/dist/components/agnostic/Breadcrumb/api.d.ts +4 -0
  11. package/dist/components/agnostic/Breadcrumb/api.js +1 -0
  12. package/dist/components/agnostic/Button/Button.svelte +345 -0
  13. package/dist/components/agnostic/Button/Button.svelte.d.ts +43 -0
  14. package/dist/components/agnostic/Button/ButtonGroup.svelte +20 -0
  15. package/dist/components/agnostic/Button/ButtonGroup.svelte.d.ts +23 -0
  16. package/dist/components/agnostic/Button/button-base.css +12 -0
  17. package/dist/components/agnostic/Button/button-core.css +237 -0
  18. package/dist/components/agnostic/Button/button-empty.css +31 -0
  19. package/dist/components/agnostic/Button/button-group.css +8 -0
  20. package/dist/components/agnostic/Card/Card.svelte +133 -0
  21. package/dist/components/agnostic/Card/Card.svelte.d.ts +31 -0
  22. package/dist/components/agnostic/ChoiceInput/ChoiceInput.svelte +337 -0
  23. package/dist/components/agnostic/ChoiceInput/ChoiceInput.svelte.d.ts +37 -0
  24. package/dist/components/agnostic/ChoiceInput/api.d.ts +7 -0
  25. package/dist/components/agnostic/ChoiceInput/api.js +1 -0
  26. package/dist/components/agnostic/Close/Close.svelte +120 -0
  27. package/dist/components/agnostic/Close/Close.svelte.d.ts +23 -0
  28. package/dist/components/agnostic/Close/api.d.ts +1 -0
  29. package/dist/components/agnostic/Close/api.js +1 -0
  30. package/dist/components/agnostic/Dialog/Dialog.svelte +265 -0
  31. package/dist/components/agnostic/Dialog/Dialog.svelte.d.ts +39 -0
  32. package/dist/components/agnostic/Disclose/Disclose.svelte +102 -0
  33. package/dist/components/agnostic/Disclose/Disclose.svelte.d.ts +23 -0
  34. package/dist/components/agnostic/Divider/Divider.svelte +139 -0
  35. package/dist/components/agnostic/Divider/Divider.svelte.d.ts +25 -0
  36. package/dist/components/agnostic/Divider/api.d.ts +3 -0
  37. package/dist/components/agnostic/Divider/api.js +1 -0
  38. package/dist/components/agnostic/Drawer/Drawer.svelte +30 -0
  39. package/dist/components/agnostic/Drawer/Drawer.svelte.d.ts +28 -0
  40. package/dist/components/agnostic/Drawer/api.d.ts +1 -0
  41. package/dist/components/agnostic/Drawer/api.js +1 -0
  42. package/dist/components/agnostic/EmptyState/EmptyState.svelte +46 -0
  43. package/dist/components/agnostic/EmptyState/EmptyState.svelte.d.ts +23 -0
  44. package/dist/components/agnostic/Header/Header.svelte +104 -0
  45. package/dist/components/agnostic/Header/Header.svelte.d.ts +26 -0
  46. package/dist/components/agnostic/Header/HeaderNav.svelte +28 -0
  47. package/dist/components/agnostic/Header/HeaderNav.svelte.d.ts +20 -0
  48. package/dist/components/agnostic/Header/HeaderNavItem.svelte +30 -0
  49. package/dist/components/agnostic/Header/HeaderNavItem.svelte.d.ts +20 -0
  50. package/dist/components/agnostic/Icon/Icon.svelte +180 -0
  51. package/dist/components/agnostic/Icon/Icon.svelte.d.ts +23 -0
  52. package/dist/components/agnostic/Icon/api.d.ts +2 -0
  53. package/dist/components/agnostic/Icon/api.js +1 -0
  54. package/dist/components/agnostic/Input/Input.svelte +415 -0
  55. package/dist/components/agnostic/Input/Input.svelte.d.ts +45 -0
  56. package/dist/components/agnostic/Input/InputAddonItem.svelte +42 -0
  57. package/dist/components/agnostic/Input/InputAddonItem.svelte.d.ts +33 -0
  58. package/dist/components/agnostic/Loader/Loader.svelte +113 -0
  59. package/dist/components/agnostic/Loader/Loader.svelte.d.ts +20 -0
  60. package/dist/components/agnostic/Menu/Menu.svelte +466 -0
  61. package/dist/components/agnostic/Menu/Menu.svelte.d.ts +31 -0
  62. package/dist/components/agnostic/Menu/MenuItem.svelte +117 -0
  63. package/dist/components/agnostic/Menu/MenuItem.svelte.d.ts +29 -0
  64. package/dist/components/agnostic/Progress/Progress.svelte +50 -0
  65. package/dist/components/agnostic/Progress/Progress.svelte.d.ts +20 -0
  66. package/dist/components/agnostic/Select/Select.svelte +141 -0
  67. package/dist/components/agnostic/Select/Select.svelte.d.ts +32 -0
  68. package/dist/components/agnostic/Spinner/Spinner.svelte +105 -0
  69. package/dist/components/agnostic/Spinner/Spinner.svelte.d.ts +19 -0
  70. package/dist/components/agnostic/Switch/Switch.svelte +275 -0
  71. package/dist/components/agnostic/Switch/Switch.svelte.d.ts +45 -0
  72. package/dist/components/agnostic/Table/Table.svelte +508 -0
  73. package/dist/components/agnostic/Table/Table.svelte.d.ts +36 -0
  74. package/dist/components/agnostic/Table/TableCustomRenderComponent.svelte +13 -0
  75. package/dist/components/agnostic/Table/TableCustomRenderComponent.svelte.d.ts +25 -0
  76. package/dist/components/agnostic/Tabs/TabButtonCustom.svelte +65 -0
  77. package/dist/components/agnostic/Tabs/TabButtonCustom.svelte.d.ts +35 -0
  78. package/dist/components/agnostic/Tabs/Tabs.svelte +330 -0
  79. package/dist/components/agnostic/Tabs/Tabs.svelte.d.ts +34 -0
  80. package/dist/components/agnostic/Tabs/api.d.ts +10 -0
  81. package/dist/components/agnostic/Tabs/api.js +1 -0
  82. package/dist/components/agnostic/Tag/Tag.svelte +74 -0
  83. package/dist/components/agnostic/Tag/Tag.svelte.d.ts +23 -0
  84. package/dist/components/agnostic/Tag/TagSlots.svelte +51 -0
  85. package/dist/components/agnostic/Tag/TagSlots.svelte.d.ts +16 -0
  86. package/dist/components/agnostic/Toasts/Toasts.svelte +46 -0
  87. package/dist/components/agnostic/Toasts/Toasts.svelte.d.ts +22 -0
  88. package/dist/components/agnostic/Tooltip/Tooltip.svelte +103 -0
  89. package/dist/components/agnostic/Tooltip/Tooltip.svelte.d.ts +23 -0
  90. package/dist/components/agnostic/Tooltip/TooltipSlots.svelte +81 -0
  91. package/dist/components/agnostic/Tooltip/TooltipSlots.svelte.d.ts +16 -0
  92. package/dist/components/agnostic/Tooltip/api.d.ts +1 -0
  93. package/dist/components/agnostic/Tooltip/api.js +1 -0
  94. package/dist/components/agnostic/animation.css +37 -0
  95. package/dist/components/files/utils.js +1 -1
  96. package/dist/index.d.ts +30 -1
  97. package/dist/index.js +30 -1
  98. package/package.json +1 -4
@@ -0,0 +1,466 @@
1
+ <script>import { onDestroy, onMount } from "svelte";
2
+ export let id;
3
+ export let type = "simple";
4
+ export let size = "";
5
+ export let menuTitle;
6
+ export let menuItems = [];
7
+ export let isDisabled = false;
8
+ export let isRounded = false;
9
+ export let isBordered = false;
10
+ export let isItemsRight = false;
11
+ export let icon = "\u25BE";
12
+ export let onOpen;
13
+ export let onClose;
14
+ export let closeOnClickOutside = true;
15
+ export let closeOnSelect = true;
16
+ let rootRef;
17
+ let triggerRef;
18
+ let menuItemRefs = [];
19
+ $: menuItemRefs = [];
20
+ let expanded = false;
21
+ const setExpanded = (b) => expanded = b;
22
+ let selectedItem = -1;
23
+ const setSelectedItem = (n) => selectedItem = n;
24
+ const setOpened = (open) => {
25
+ if (open && onOpen) {
26
+ onOpen(selectedItem);
27
+ } else if (onClose) {
28
+ onClose();
29
+ }
30
+ setExpanded(open);
31
+ };
32
+ const focusItem = (index, direction) => {
33
+ let i = index;
34
+ if (direction === "asc") {
35
+ i += 1;
36
+ } else if (direction === "desc") {
37
+ i -= 1;
38
+ }
39
+ if (i < 0) {
40
+ i = menuItems.length - 1;
41
+ } else if (i >= menuItems.length) {
42
+ i = 0;
43
+ }
44
+ const nextMenuItem = menuItemRefs[i];
45
+ if (nextMenuItem) {
46
+ if (nextMenuItem.isDisabled() && direction) {
47
+ focusItem(i, direction);
48
+ } else {
49
+ nextMenuItem.focus();
50
+ }
51
+ }
52
+ };
53
+ const focusTriggerButton = () => triggerRef && triggerRef.focus();
54
+ const isInside = (el) => {
55
+ if (rootRef) {
56
+ const children = rootRef.querySelectorAll("*");
57
+ for (let i = 0; i < children.length; i += 1) {
58
+ const child = children[i];
59
+ if (el === child) {
60
+ return true;
61
+ }
62
+ }
63
+ }
64
+ return false;
65
+ };
66
+ const clickedOutside = (ev) => {
67
+ if (expanded && closeOnClickOutside) {
68
+ if (!isInside(ev.target)) {
69
+ setExpanded(false);
70
+ focusTriggerButton();
71
+ }
72
+ }
73
+ };
74
+ onMount(() => {
75
+ if (typeof window !== "undefined") {
76
+ document.addEventListener("click", clickedOutside);
77
+ }
78
+ });
79
+ onDestroy(() => {
80
+ if (typeof window !== "undefined") {
81
+ document.removeEventListener("click", clickedOutside);
82
+ }
83
+ });
84
+ let triggerSizeClasses;
85
+ let itemSizeClasses;
86
+ switch (size) {
87
+ case "small":
88
+ triggerSizeClasses = "menu-trigger-small";
89
+ itemSizeClasses = "menu-item-small";
90
+ break;
91
+ case "large":
92
+ triggerSizeClasses = "menu-trigger-large";
93
+ itemSizeClasses = "menu-item-large";
94
+ break;
95
+ default:
96
+ triggerSizeClasses = "";
97
+ itemSizeClasses = "";
98
+ }
99
+ const dotBarClasses = [
100
+ type === "hamburger" ? "bar" : "dot"
101
+ ].filter((cls) => cls).join(" ");
102
+ const triggerClasses = [
103
+ type === "simple" ? "menu-trigger" : "",
104
+ triggerSizeClasses,
105
+ isBordered ? "menu-trigger-bordered" : "",
106
+ isRounded ? "menu-trigger-rounded" : "",
107
+ type !== "simple" ? "btn-base" : "",
108
+ type !== "simple" ? "btn-blank" : "",
109
+ type === "kebab" ? "btn-kebab" : "",
110
+ type === "meatball" ? "btn-meatball" : "",
111
+ type === "hamburger" ? "btn-hamburger" : ""
112
+ ].filter((cls) => cls).join(" ");
113
+ const itemClasses = [itemSizeClasses, isRounded ? "menu-item-rounded" : ""].filter((cls) => cls).join(" ");
114
+ const afterOpened = () => {
115
+ requestAnimationFrame(() => {
116
+ if (selectedItem < 1) {
117
+ setSelectedItem(0);
118
+ onMenuItemKeyDown("Home", 0);
119
+ } else {
120
+ focusItem(selectedItem);
121
+ setSelectedItem(selectedItem);
122
+ }
123
+ });
124
+ };
125
+ const onMenuItemKeyDown = (evOrString, index) => {
126
+ const key = typeof evOrString === "string" ? evOrString : evOrString.key;
127
+ switch (key) {
128
+ case "Up":
129
+ case "ArrowUp":
130
+ focusItem(index, "desc");
131
+ break;
132
+ case "Down":
133
+ case "ArrowDown":
134
+ focusItem(index, "asc");
135
+ break;
136
+ case "Home":
137
+ case "ArrowHome":
138
+ focusItem(0);
139
+ break;
140
+ case "End":
141
+ case "ArrowEnd":
142
+ focusItem(menuItems.length - 1);
143
+ break;
144
+ case "Enter":
145
+ case "Space":
146
+ focusItem(index);
147
+ setSelectedItem(index);
148
+ if (closeOnSelect) {
149
+ setOpened(false);
150
+ focusTriggerButton();
151
+ }
152
+ break;
153
+ case "Escape":
154
+ setOpened(false);
155
+ focusTriggerButton();
156
+ break;
157
+ case "Tab":
158
+ if (typeof evOrString !== "string") {
159
+ evOrString.preventDefault();
160
+ }
161
+ break;
162
+ default:
163
+ return;
164
+ }
165
+ if (typeof evOrString !== "string") {
166
+ evOrString.preventDefault();
167
+ }
168
+ };
169
+ const onTriggerButtonKeyDown = (e) => {
170
+ switch (e.key) {
171
+ case "Down":
172
+ case "ArrowDown":
173
+ if (!expanded) {
174
+ setOpened(true);
175
+ afterOpened();
176
+ e.preventDefault();
177
+ }
178
+ break;
179
+ case "Escape":
180
+ if (expanded) {
181
+ setOpened(false);
182
+ focusTriggerButton();
183
+ }
184
+ break;
185
+ default:
186
+ }
187
+ };
188
+ const onTriggerButtonClicked = () => {
189
+ const toggled = !expanded;
190
+ setOpened(toggled);
191
+ setTimeout(() => {
192
+ if (toggled) {
193
+ afterOpened();
194
+ } else if (closeOnSelect) {
195
+ setOpened(false);
196
+ focusTriggerButton();
197
+ }
198
+ }, 10);
199
+ };
200
+ $: menuItemClasses = (isSelected) => {
201
+ return [
202
+ `menu-item`,
203
+ itemClasses,
204
+ isSelected ? "menu-item-selected" : ""
205
+ ].filter((klass) => klass.length).join(" ");
206
+ };
207
+ $: menuItemsClasses = () => {
208
+ return [
209
+ isItemsRight ? "menu-items-right" : "",
210
+ !isItemsRight ? "menu-items" : ""
211
+ ].filter((c) => c && c.length).join(" ");
212
+ };
213
+ $: onMenuItemClicked = (index) => {
214
+ setSelectedItem(index);
215
+ if (closeOnSelect) {
216
+ setOpened(false);
217
+ focusTriggerButton();
218
+ }
219
+ };
220
+ </script>
221
+ <div bind:this={rootRef} class="menu">
222
+ <button
223
+ bind:this={triggerRef}
224
+ class={triggerClasses}
225
+ aria-haspopup="true"
226
+ aria-expanded={expanded}
227
+ disabled={isDisabled}
228
+ on:keydown={onTriggerButtonKeyDown}
229
+ on:click={onTriggerButtonClicked}
230
+ >
231
+ {#if type === 'simple'}
232
+ {menuTitle}
233
+ <span class="menu-icon" aria-hidden="true">
234
+ {icon}
235
+ </span>
236
+ {:else}
237
+ <span class="screenreader-only">{menuTitle}</span>
238
+ <span class={dotBarClasses} />
239
+ <span class={dotBarClasses} />
240
+ <span class={dotBarClasses} />
241
+ {/if}
242
+ </button>
243
+ <div class={menuItemsClasses()} id={id} role="menu" hidden={!expanded}>
244
+ {#each menuItems as item, i}
245
+ <svelte:component
246
+ this={item.menuItemComponent}
247
+ bind:this={menuItemRefs[i]}
248
+ classes={menuItemClasses(selectedItem === i)}
249
+ isSelected={selectedItem === i}
250
+ disabled={item.isDisabled}
251
+ on:click={() => onMenuItemClicked(i)}
252
+ on:keydown={(ev) => onMenuItemKeyDown(ev, i)}
253
+ >
254
+ {item.label}
255
+ </svelte:component>
256
+ {/each}
257
+ </div>
258
+ </div>
259
+ <style>
260
+ .menu {
261
+ display: inline-flex;
262
+ position: relative;
263
+ background-color: inherit;
264
+ }
265
+
266
+ :is(.menu-items, .menu-items-right) {
267
+ position: absolute;
268
+ background-color: var(--functional-light);
269
+ margin-block-start: var(--fluid-6);
270
+ z-index: 10;
271
+ }
272
+
273
+ .menu-items {
274
+ right: initial;
275
+ left: 0;
276
+ }
277
+
278
+ .menu-items-right {
279
+ left: initial;
280
+ right: 0;
281
+ }
282
+
283
+ .btn-base {
284
+ display: inline-flex;
285
+ align-items: center;
286
+ justify-content: center;
287
+ white-space: nowrap;
288
+ user-select: none;
289
+ appearance: none;
290
+ cursor: pointer;
291
+ box-sizing: border-box;
292
+ transition-property: all;
293
+ transition-duration: var(--functional-timing-medium);
294
+ }
295
+
296
+ /**
297
+ * Invisible buttons. Generally used for a Cancel or icon button that behaves like a button,
298
+ * semantically and for a11y, but, does so without all the typical "button chrome" behind it.
299
+ */
300
+ :is(.btn-link, .btn-blank) {
301
+ font-family: var(--functional-btn-font-family, var(--functional-font-family-body));
302
+ font-size: var(--functional-btn-font-size, 1rem);
303
+ background-color: transparent;
304
+ border: 0;
305
+ border-radius: 0;
306
+ box-shadow: none;
307
+ transition: none;
308
+ }
309
+
310
+ /* Since blank buttons can be used for things like input addons we don't want to go crazy
311
+ on the side padding. As such, these have a good bit less then regular buttons. */
312
+ .btn-blank {
313
+ --functional-btn-blank-side-padding: var(--btn-blank-side-padding, 0.25rem);
314
+
315
+ padding-inline-start: var(--functional-btn-blank-side-padding);
316
+ padding-inline-end: var(--functional-btn-blank-side-padding);
317
+ }
318
+
319
+ /* A button blank with link color text */
320
+ .btn-link {
321
+ color: var(--functional-btn-primary, var(--functional-primary));
322
+ }
323
+
324
+ .btn-link:hover {
325
+ cursor: pointer;
326
+ }
327
+
328
+ .menu-trigger {
329
+ display: flex;
330
+ align-items: center;
331
+ justify-content: space-between;
332
+ max-width: 100%;
333
+ background-color: var(--functional-btn-bgcolor, var(--functional-gray-light));
334
+ cursor: pointer;
335
+ text-align: left;
336
+
337
+ /* TODO -- can we compose some of this from the button styles? */
338
+ border-color: var(--functional-btn-bgcolor, var(--functional-gray-light));
339
+ border-style: solid;
340
+ border-width: var(--functional-btn-border-size, 1px);
341
+ font-size: inherit;
342
+
343
+ /* this can be overriden, but it might mess with the balance of the button heights across variants */
344
+ line-height: var(--functional-line-height, var(--fluid-20, 1.25rem));
345
+ padding-block-start: var(--functional-vertical-pad, 0.5rem);
346
+ padding-block-end: var(--functional-vertical-pad, 0.5rem);
347
+ padding-inline-start: var(--functional-side-padding, 0.75rem);
348
+ padding-inline-end: var(--functional-side-padding, 0.75rem);
349
+ }
350
+
351
+ .menu-trigger[disabled] {
352
+ background: var(--functional-input-disabled-bg, var(--functional-disabled-bg)) !important;
353
+ color: var(--functional-input-disabled-color, var(--functional-disabled-color)) !important;
354
+ cursor: not-allowed !important;
355
+ opacity: 80% !important;
356
+ }
357
+
358
+ .menu-trigger:focus {
359
+ box-shadow: 0 0 0 var(--functional-focus-ring-outline-width) var(--functional-focus-ring-color);
360
+
361
+ /* Needed for High Contrast mode */
362
+ outline:
363
+ var(--functional-focus-ring-outline-width) var(--functional-focus-ring-outline-style)
364
+ var(--functional-focus-ring-outline-color);
365
+ transition: box-shadow var(--functional-timing-fast) ease-out;
366
+
367
+ /* In order for the focused element's box-shadow to appear above its siblings we need to
368
+ establish a new stacking context: https://stackoverflow.com/a/28042700 */
369
+ isolation: isolate;
370
+ }
371
+
372
+ /* Sizes */
373
+ .menu-trigger-large {
374
+ font-size: calc(var(--functional-btn-font-size, 1rem) + 0.25rem);
375
+ height: 3rem;
376
+ line-height: 2rem;
377
+ }
378
+
379
+ .menu-trigger-small {
380
+ font-size: calc(var(--functional-btn-font-size, 1rem) - 0.25rem);
381
+ height: 2rem;
382
+ line-height: 1rem;
383
+ }
384
+
385
+ .menu-trigger-bordered {
386
+ --menu-item-background-color: var(--functional-menu-item-background-color, inherit);
387
+
388
+ background-color: var(--menu-item-background-color);
389
+ }
390
+
391
+ .menu-trigger-rounded {
392
+ border-radius: var(--functional-radius);
393
+ }
394
+
395
+ /* TODO make this more flexible eventually */
396
+ .menu-icon {
397
+ font-family: sans-serif;
398
+ font-size: var(--fluid-18);
399
+ margin-inline-start: var(--fluid-8);
400
+ line-height: 1;
401
+ }
402
+
403
+ :is(.btn-kebab, .btn-meatball) {
404
+ justify-content: space-around;
405
+ height: var(--fluid-24);
406
+ width: var(--fluid-24);
407
+
408
+ /* Rest here is supplied by btn-base and btn-blank */
409
+ }
410
+
411
+ /* We use btn-blank which doesn't include this :( */
412
+ :is(.btn-hamburger:focus, .btn-kebab:focus, .btn-meatball:focus) {
413
+ box-shadow: 0 0 0 var(--functional-focus-ring-outline-width) var(--functional-focus-ring-color);
414
+ outline:
415
+ var(--functional-focus-ring-outline-width)
416
+ var(--functional-focus-ring-outline-style)
417
+ var(--functional-focus-ring-outline-color);
418
+ transition: box-shadow var(--functional-timing-fast) ease-out;
419
+ }
420
+
421
+ .btn-hamburger,
422
+ .btn-kebab {
423
+ flex-direction: column;
424
+ }
425
+
426
+ .btn-meatball {
427
+ flex-direction: row;
428
+ }
429
+
430
+ /* stylelint-disable-next-line no-duplicate-selectors */
431
+ .btn-meatball {
432
+ --block-padding: var(--functional-side-padding);
433
+
434
+ padding-block-start: var(--block-padding);
435
+ padding-block-end: var(--block-padding);
436
+ padding-inline-start: 0;
437
+ padding-inline-end: 0;
438
+ }
439
+
440
+ .btn-hamburger {
441
+ --vertical-padding: 3px;
442
+
443
+ padding-block-start: var(--vertical-padding);
444
+ padding-block-end: var(--vertical-padding);
445
+ padding-inline-end: var(--fluid-2);
446
+ padding-inline-start: var(--fluid-2);
447
+ }
448
+
449
+ .dot,
450
+ .bar {
451
+ background-color: var(--functional-dark);
452
+ }
453
+
454
+ .dot {
455
+ width: 5px;
456
+ height: 5px;
457
+ border-radius: 50px;
458
+ }
459
+
460
+ .bar {
461
+ width: var(--fluid-20);
462
+ height: var(--fluid-2);
463
+ margin: var(--fluid-2) 0;
464
+ }
465
+
466
+ </style>
@@ -0,0 +1,31 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ id: any;
5
+ type?: "simple" | "kebab" | "hamburger" | "meatball";
6
+ size?: "small" | "large" | "";
7
+ menuTitle: any;
8
+ menuItems?: any[];
9
+ isDisabled?: boolean;
10
+ isRounded?: boolean;
11
+ isBordered?: boolean;
12
+ isItemsRight?: boolean;
13
+ icon?: string;
14
+ onOpen: any;
15
+ onClose: any;
16
+ closeOnClickOutside?: boolean;
17
+ closeOnSelect?: boolean;
18
+ };
19
+ events: {
20
+ [evt: string]: CustomEvent<any>;
21
+ };
22
+ slots: {};
23
+ exports?: {} | undefined;
24
+ bindings?: string | undefined;
25
+ };
26
+ export type MenuProps = typeof __propDef.props;
27
+ export type MenuEvents = typeof __propDef.events;
28
+ export type MenuSlots = typeof __propDef.slots;
29
+ export default class Menu extends SvelteComponent<MenuProps, MenuEvents, MenuSlots> {
30
+ }
31
+ export {};
@@ -0,0 +1,117 @@
1
+ <script>export let disabled = false;
2
+ export let isSelected = false;
3
+ export let classes;
4
+ let btn;
5
+ export function focus() {
6
+ return btn.focus();
7
+ }
8
+ export function isDisabled() {
9
+ return btn.disabled;
10
+ }
11
+ </script>
12
+ <button
13
+ on:click
14
+ on:keydown
15
+ bind:this={btn}
16
+ role="menuitem"
17
+ tabindex={isSelected ? 0 : -1}
18
+ disabled={disabled}
19
+ class={classes}
20
+ >
21
+ <slot />
22
+ </button>
23
+
24
+ <style>
25
+ .menu-item {
26
+ --menu-item-background-color: var(--functional-menu-item-background-color, inherit);
27
+
28
+ text-align: left;
29
+
30
+ /* TODO -- can we compose some of this from the button styles? */
31
+ border-color: var(--functional-btn-bgcolor, var(--functional-gray-light));
32
+ border-style: solid;
33
+ border-width: var(--functional-btn-border-size, 1px);
34
+ font-size: inherit;
35
+
36
+ /* this can be overriden, but it might mess with the balance of the button heights across variants */
37
+ line-height: var(--functional-line-height, var(--fluid-20, 1.25rem));
38
+ padding-block-start: var(--functional-vertical-pad, 0.5rem);
39
+ padding-block-end: var(--functional-vertical-pad, 0.5rem);
40
+ padding-inline-start: var(--functional-side-padding, 0.75rem);
41
+ padding-inline-end: var(--functional-side-padding, 0.75rem);
42
+ background-color: var(--menu-item-background-color);
43
+ display: block;
44
+ min-width: 100%;
45
+ white-space: nowrap;
46
+ cursor: default;
47
+ }
48
+
49
+ .menu-item[disabled] {
50
+ background: var(--functional-input-disabled-bg, var(--functional-disabled-bg)) !important;
51
+ color: var(--functional-input-disabled-color, var(--functional-disabled-color)) !important;
52
+ cursor: not-allowed !important;
53
+ opacity: 80% !important;
54
+ }
55
+
56
+ .menu-item:focus {
57
+ box-shadow: 0 0 0 var(--functional-focus-ring-outline-width) var(--functional-focus-ring-color);
58
+
59
+ /* Needed for High Contrast mode */
60
+ outline:
61
+ var(--functional-focus-ring-outline-width) var(--functional-focus-ring-outline-style)
62
+ var(--functional-focus-ring-outline-color);
63
+ transition: box-shadow var(--functional-timing-fast) ease-out;
64
+
65
+ /* In order for the focused element's box-shadow to appear above its siblings we need to
66
+ establish a new stacking context: https://stackoverflow.com/a/28042700 */
67
+ isolation: isolate;
68
+ }
69
+
70
+ .menu-item:not(:first-of-type) {
71
+ border-top: 0;
72
+ }
73
+
74
+ .menu-item-selected {
75
+ color: var(--functional-light);
76
+ background-color: var(--functional-primary);
77
+ border-color: var(--functional-primary);
78
+ }
79
+
80
+ .menu-item:active:not(.menu-item-selected) {
81
+ color: var(--functional-primary);
82
+ }
83
+
84
+ .menu-item [aria-checked="true"]::before {
85
+ /* TODO make this more flexible eventually */
86
+ content: "\2713\0020";
87
+ }
88
+
89
+ /* Sizes */
90
+ .menu-item-large {
91
+ font-size: calc(var(--functional-btn-font-size, 1rem) + 0.25rem);
92
+ height: 3rem;
93
+ line-height: 2rem;
94
+ }
95
+
96
+ .menu-item-small {
97
+ font-size: calc(var(--functional-btn-font-size, 1rem) - 0.25rem);
98
+ height: 2rem;
99
+ line-height: 1rem;
100
+ }
101
+
102
+ .menu-item-rounded:first-of-type {
103
+ border-top-left-radius: var(--functional-radius);
104
+ border-top-right-radius: var(--functional-radius);
105
+ }
106
+
107
+ .menu-item-rounded:last-of-type {
108
+ border-bottom-left-radius: var(--functional-radius);
109
+ border-bottom-right-radius: var(--functional-radius);
110
+ }
111
+
112
+ .menu-item:hover:not([disabled]):not(.menu-item-selected) {
113
+ background-color: var(--functional-gray-extra-light);
114
+ cursor: pointer;
115
+ }
116
+
117
+ </style>
@@ -0,0 +1,29 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ disabled?: boolean;
5
+ isSelected?: boolean;
6
+ classes: any;
7
+ focus?: () => any;
8
+ isDisabled?: () => any;
9
+ };
10
+ events: {
11
+ click: MouseEvent;
12
+ keydown: KeyboardEvent;
13
+ } & {
14
+ [evt: string]: CustomEvent<any>;
15
+ };
16
+ slots: {
17
+ default: {};
18
+ };
19
+ exports?: {} | undefined;
20
+ bindings?: string | undefined;
21
+ };
22
+ export type MenuItemProps = typeof __propDef.props;
23
+ export type MenuItemEvents = typeof __propDef.events;
24
+ export type MenuItemSlots = typeof __propDef.slots;
25
+ export default class MenuItem extends SvelteComponent<MenuItemProps, MenuItemEvents, MenuItemSlots> {
26
+ get focus(): () => any;
27
+ get isDisabled(): () => any;
28
+ }
29
+ export {};
@@ -0,0 +1,50 @@
1
+ <style>
2
+ /* https://stackoverflow.com/questions/45507970/how-can-i-change-the-color-of-a-progress-bar-value-in-html */
3
+
4
+ /**
5
+ * Most examples show styling directly to the <progress> element itself. However,
6
+ * my tests (chrome, ff, safari on mac mini 2020), showed it's perfectly possibly
7
+ * to use a class selector instead. The reason I'd prefer that here, is that I can
8
+ * then use CSS Modules composes against .progress (e.g. for React/Vue components)
9
+ */
10
+ .progress {
11
+ appearance: none;
12
+ height: var(--functional-progress-height, var(--fluid-10, 0.625rem));
13
+ width: 100%;
14
+ border: none;
15
+
16
+ /* Next couple of rules are required to be here for FF (but not chrome) */
17
+ background-color: var(--functional-progress-background, var(--functional-gray-light, #ededed));
18
+ border-radius: var(--functional-progress-radius, var(--fluid-10, 0.625rem));
19
+ }
20
+
21
+ .progress[value]::-webkit-progress-bar {
22
+ /* In my tests chrome requires this whereas FF wants it on the progress {} rule */
23
+ background-color: var(--functional-progress-background, var(--functional-gray-light, #ededed));
24
+ border-radius: var(--functional-progress-radius, var(--fluid-10, 0.625rem));
25
+ }
26
+
27
+ .progress[value]::-webkit-progress-value {
28
+ background-color: var(--functional-progress-fill-color, var(--functional-primary, #077acb));
29
+ border-radius: var(--functional-progress-radius, var(--fluid-10, 0.625rem));
30
+ }
31
+
32
+ .progress[value]::-moz-progress-bar {
33
+ background-color: var(--functional-progress-fill-color, var(--functional-primary, #077acb));
34
+ border-radius: var(--functional-progress-radius, var(--fluid-10, 0.625rem));
35
+ }
36
+
37
+ .progress[value]::-ms-fill {
38
+ background-color: var(--functional-progress-fill-color, var(--functional-primary, #077acb));
39
+ border-radius: var(--functional-progress-radius, var(--fluid-10, 0.625rem));
40
+ }
41
+
42
+ </style>
43
+
44
+ <script>export let value = 0;
45
+ export let max;
46
+ export let css = "";
47
+ let klasses = ["progress", css ? `${css}` : ""].filter((cl) => cl && cl.length).join(" ");
48
+ </script>
49
+
50
+ <progress class={klasses} value={value} max={max}></progress>
@@ -0,0 +1,20 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ value?: number;
5
+ max: any;
6
+ css?: string;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ exports?: {} | undefined;
13
+ bindings?: string | undefined;
14
+ };
15
+ export type ProgressProps = typeof __propDef.props;
16
+ export type ProgressEvents = typeof __propDef.events;
17
+ export type ProgressSlots = typeof __propDef.slots;
18
+ export default class Progress extends SvelteComponent<ProgressProps, ProgressEvents, ProgressSlots> {
19
+ }
20
+ export {};