@sveltia/ui 0.7.4 → 0.8.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/package/components/alert/alert.svelte +4 -4
- package/package/components/alert/alert.svelte.d.ts +2 -2
- package/package/components/button/button.svelte +13 -3
- package/package/components/button/button.svelte.d.ts +11 -4
- package/package/components/button/select-button-group.svelte +12 -8
- package/package/components/button/select-button.svelte +5 -4
- package/package/components/button/select-button.svelte.d.ts +2 -0
- package/package/components/calendar/calendar.svelte +20 -14
- package/package/components/checkbox/checkbox-group.svelte +6 -5
- package/package/components/checkbox/checkbox.svelte +16 -9
- package/package/components/checkbox/checkbox.svelte.d.ts +2 -2
- package/package/components/dialog/alert-dialog.svelte +50 -0
- package/package/components/dialog/alert-dialog.svelte.d.ts +55 -0
- package/package/components/dialog/confirmation-dialog.svelte +55 -0
- package/package/components/dialog/confirmation-dialog.svelte.d.ts +57 -0
- package/package/components/dialog/dialog.svelte +164 -220
- package/package/components/dialog/dialog.svelte.d.ts +20 -12
- package/package/components/dialog/prompt-dialog.svelte +78 -0
- package/package/components/dialog/prompt-dialog.svelte.d.ts +72 -0
- package/package/components/disclosure/disclosure.svelte +3 -3
- package/package/components/divider/divider.svelte +1 -1
- package/package/components/divider/spacer.svelte +1 -12
- package/package/components/divider/spacer.svelte.d.ts +0 -2
- package/package/components/drawer/drawer.svelte +118 -208
- package/package/components/drawer/drawer.svelte.d.ts +12 -8
- package/package/components/grid/grid-body.svelte +51 -0
- package/package/components/grid/grid-body.svelte.d.ts +36 -0
- package/package/components/grid/grid-cell.svelte +22 -0
- package/package/components/grid/grid-cell.svelte.d.ts +34 -0
- package/package/components/grid/grid-col-header.svelte +22 -0
- package/package/components/grid/grid-col-header.svelte.d.ts +34 -0
- package/package/components/grid/grid-foot.svelte +27 -0
- package/package/components/grid/grid-foot.svelte.d.ts +34 -0
- package/package/components/grid/grid-head.svelte +27 -0
- package/package/components/grid/grid-head.svelte.d.ts +34 -0
- package/package/components/grid/grid-row-header.svelte +23 -0
- package/package/components/grid/grid-row-header.svelte.d.ts +34 -0
- package/package/components/grid/grid-row.svelte +37 -0
- package/package/components/grid/grid-row.svelte.d.ts +44 -0
- package/package/components/grid/grid.svelte +52 -0
- package/package/components/grid/grid.svelte.d.ts +42 -0
- package/package/components/icon/icon.svelte +6 -7
- package/package/components/icon/icon.svelte.d.ts +0 -2
- package/package/components/listbox/listbox.svelte +6 -6
- package/package/components/listbox/option-group.svelte +6 -5
- package/package/components/listbox/option.svelte +7 -28
- package/package/components/listbox/option.svelte.d.ts +2 -0
- package/package/components/menu/menu-button.svelte +26 -16
- package/package/components/menu/menu-button.svelte.d.ts +2 -2
- package/package/components/menu/menu-item-checkbox.svelte +5 -4
- package/package/components/menu/menu-item-checkbox.svelte.d.ts +2 -0
- package/package/components/menu/menu-item-group.svelte +4 -3
- package/package/components/menu/menu-item-radio.svelte +5 -4
- package/package/components/menu/menu-item-radio.svelte.d.ts +2 -0
- package/package/components/menu/menu-item.svelte +7 -5
- package/package/components/menu/menu-item.svelte.d.ts +4 -2
- package/package/components/menu/menu.svelte +1 -1
- package/package/components/radio/radio-group.svelte +8 -8
- package/package/components/radio/radio-group.svelte.d.ts +2 -2
- package/package/components/radio/radio.svelte +5 -2
- package/package/components/radio/radio.svelte.d.ts +2 -0
- package/package/components/select/combobox.svelte +55 -35
- package/package/components/select/combobox.svelte.d.ts +3 -2
- package/package/components/select/select.svelte +10 -9
- package/package/components/select/select.svelte.d.ts +4 -3
- package/package/components/slider/slider.svelte +15 -7
- package/package/components/switch/switch.svelte +9 -6
- package/package/components/switch/switch.svelte.d.ts +2 -2
- package/package/components/table/table-body.svelte +31 -3
- package/package/components/table/table-body.svelte.d.ts +2 -0
- package/package/components/table/table-cell.svelte +3 -4
- package/package/components/table/table-cell.svelte.d.ts +1 -1
- package/package/components/table/table-col-header.svelte +1 -2
- package/package/components/table/table-foot.svelte +7 -3
- package/package/components/table/table-head.svelte +7 -3
- package/package/components/table/table-row-header.svelte +1 -2
- package/package/components/table/table-row.svelte +1 -14
- package/package/components/table/table-row.svelte.d.ts +0 -8
- package/package/components/table/table.svelte +5 -17
- package/package/components/table/table.svelte.d.ts +1 -7
- package/package/components/tabs/tab-list.svelte +7 -5
- package/package/components/tabs/tab-panel.svelte +1 -1
- package/package/components/tabs/tab.svelte +2 -1
- package/package/components/tabs/tab.svelte.d.ts +2 -0
- package/package/components/text-field/markdown-editor.svelte +36 -9
- package/package/components/text-field/markdown-editor.svelte.d.ts +2 -0
- package/package/components/text-field/number-input.svelte +107 -43
- package/package/components/text-field/number-input.svelte.d.ts +2 -0
- package/package/components/text-field/password-input.svelte +43 -12
- package/package/components/text-field/password-input.svelte.d.ts +2 -0
- package/package/components/text-field/search-bar.svelte +43 -13
- package/package/components/text-field/search-bar.svelte.d.ts +5 -0
- package/package/components/text-field/text-area.svelte +26 -6
- package/package/components/text-field/text-area.svelte.d.ts +2 -0
- package/package/components/text-field/text-input.svelte +37 -7
- package/package/components/text-field/text-input.svelte.d.ts +14 -4
- package/package/components/toast/toast.svelte +6 -16
- package/package/components/toast/toast.svelte.d.ts +2 -2
- package/package/components/toolbar/toolbar.svelte +3 -4
- package/package/components/util/app-shell.svelte +34 -29
- package/package/components/util/group.svelte +2 -2
- package/package/components/util/modal.svelte +220 -0
- package/package/components/util/modal.svelte.d.ts +83 -0
- package/package/components/util/popup.svelte +80 -121
- package/package/components/util/popup.svelte.d.ts +22 -13
- package/package/components/util/portal.svelte +1 -1
- package/package/index.d.ts +12 -0
- package/package/index.js +12 -0
- package/package/locales/en.d.ts +1 -0
- package/package/locales/en.js +1 -0
- package/package/locales/ja.d.ts +1 -0
- package/package/locales/ja.js +1 -0
- package/package/services/group.js +67 -13
- package/package/services/popup.d.ts +5 -1
- package/package/services/popup.js +22 -19
- package/package/styles/core.scss +13 -26
- package/package/styles/variables.scss +14 -2
- package/package.json +107 -11
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
A modal prompt dialog. It shows the OK and Cancel buttons as well as a textbox, just like
|
|
4
|
+
`window.prompt()`.
|
|
5
|
+
@see https://w3c.github.io/aria/#alertdialog
|
|
6
|
+
@see https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/
|
|
7
|
+
@see https://developer.mozilla.org/en-US/docs/Web/API/Window/prompt
|
|
8
|
+
-->
|
|
9
|
+
<script>
|
|
10
|
+
import TextInput from '../text-field/text-input.svelte';
|
|
11
|
+
import Dialog from './dialog.svelte';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The `class` attribute on the `<dialog>` element.
|
|
15
|
+
* @type {string}
|
|
16
|
+
*/
|
|
17
|
+
let className = '';
|
|
18
|
+
export { className as class };
|
|
19
|
+
/**
|
|
20
|
+
* Whether to open the dialog.
|
|
21
|
+
* @type {boolean}
|
|
22
|
+
*/
|
|
23
|
+
export let open = false;
|
|
24
|
+
/**
|
|
25
|
+
* Text label displayed on the header. Required.
|
|
26
|
+
* @type {string}
|
|
27
|
+
*/
|
|
28
|
+
export let title;
|
|
29
|
+
/**
|
|
30
|
+
* Text label displayed on the OK button.
|
|
31
|
+
* @type {string}
|
|
32
|
+
*/
|
|
33
|
+
export let okLabel = '';
|
|
34
|
+
/**
|
|
35
|
+
* Text label displayed on the Cancel button.
|
|
36
|
+
* @type {string}
|
|
37
|
+
*/
|
|
38
|
+
export let cancelLabel = '';
|
|
39
|
+
/**
|
|
40
|
+
* Value entered on the textbox.
|
|
41
|
+
* @type {string}
|
|
42
|
+
*/
|
|
43
|
+
export let value = '';
|
|
44
|
+
/**
|
|
45
|
+
* Extra attributes for the `<TextInput>`
|
|
46
|
+
* @type {object}
|
|
47
|
+
*/
|
|
48
|
+
export let textboxAttrs = {};
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<Dialog
|
|
52
|
+
role="alertdialog"
|
|
53
|
+
class={className}
|
|
54
|
+
bind:open
|
|
55
|
+
{title}
|
|
56
|
+
{okLabel}
|
|
57
|
+
{cancelLabel}
|
|
58
|
+
{...$$restProps}
|
|
59
|
+
on:opening
|
|
60
|
+
on:open
|
|
61
|
+
on:ok
|
|
62
|
+
on:cancel
|
|
63
|
+
on:closing
|
|
64
|
+
on:close
|
|
65
|
+
>
|
|
66
|
+
<slot />
|
|
67
|
+
<div class="input-outer">
|
|
68
|
+
{#if $$slots.input}
|
|
69
|
+
<slot name="input" />
|
|
70
|
+
{:else}
|
|
71
|
+
<TextInput bind:value autofocus {...textboxAttrs} on:input on:keydown on:keyup on:keypress />
|
|
72
|
+
{/if}
|
|
73
|
+
</div>
|
|
74
|
+
</Dialog>
|
|
75
|
+
|
|
76
|
+
<style>.input-outer {
|
|
77
|
+
margin: 12px 0 0;
|
|
78
|
+
}</style>
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} PromptDialogProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} PromptDialogEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} PromptDialogSlots */
|
|
4
|
+
/**
|
|
5
|
+
* A modal prompt dialog. It shows the OK and Cancel buttons as well as a textbox, just like
|
|
6
|
+
* `window.prompt()`.
|
|
7
|
+
* @see https://w3c.github.io/aria/#alertdialog
|
|
8
|
+
* @see https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/
|
|
9
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/Window/prompt
|
|
10
|
+
*/
|
|
11
|
+
export default class PromptDialog extends SvelteComponent<{
|
|
12
|
+
[x: string]: any;
|
|
13
|
+
title: string;
|
|
14
|
+
class?: string;
|
|
15
|
+
value?: string;
|
|
16
|
+
open?: boolean;
|
|
17
|
+
okLabel?: string;
|
|
18
|
+
cancelLabel?: string;
|
|
19
|
+
textboxAttrs?: object;
|
|
20
|
+
}, {
|
|
21
|
+
opening: CustomEvent<any>;
|
|
22
|
+
open: CustomEvent<any>;
|
|
23
|
+
ok: CustomEvent<any>;
|
|
24
|
+
cancel: CustomEvent<any>;
|
|
25
|
+
closing: CustomEvent<any>;
|
|
26
|
+
close: CustomEvent<any>;
|
|
27
|
+
input: Event;
|
|
28
|
+
keydown: KeyboardEvent;
|
|
29
|
+
keyup: KeyboardEvent;
|
|
30
|
+
keypress: KeyboardEvent;
|
|
31
|
+
} & {
|
|
32
|
+
[evt: string]: CustomEvent<any>;
|
|
33
|
+
}, {
|
|
34
|
+
default: {};
|
|
35
|
+
input: {};
|
|
36
|
+
}> {
|
|
37
|
+
}
|
|
38
|
+
export type PromptDialogProps = typeof __propDef.props;
|
|
39
|
+
export type PromptDialogEvents = typeof __propDef.events;
|
|
40
|
+
export type PromptDialogSlots = typeof __propDef.slots;
|
|
41
|
+
import { SvelteComponent } from "svelte";
|
|
42
|
+
declare const __propDef: {
|
|
43
|
+
props: {
|
|
44
|
+
[x: string]: any;
|
|
45
|
+
title: string;
|
|
46
|
+
class?: string;
|
|
47
|
+
value?: string;
|
|
48
|
+
open?: boolean;
|
|
49
|
+
okLabel?: string;
|
|
50
|
+
cancelLabel?: string;
|
|
51
|
+
textboxAttrs?: object;
|
|
52
|
+
};
|
|
53
|
+
events: {
|
|
54
|
+
opening: CustomEvent<any>;
|
|
55
|
+
open: CustomEvent<any>;
|
|
56
|
+
ok: CustomEvent<any>;
|
|
57
|
+
cancel: CustomEvent<any>;
|
|
58
|
+
closing: CustomEvent<any>;
|
|
59
|
+
close: CustomEvent<any>;
|
|
60
|
+
input: Event;
|
|
61
|
+
keydown: KeyboardEvent;
|
|
62
|
+
keyup: KeyboardEvent;
|
|
63
|
+
keypress: KeyboardEvent;
|
|
64
|
+
} & {
|
|
65
|
+
[evt: string]: CustomEvent<any>;
|
|
66
|
+
};
|
|
67
|
+
slots: {
|
|
68
|
+
default: {};
|
|
69
|
+
input: {};
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
export {};
|
|
@@ -42,16 +42,17 @@
|
|
|
42
42
|
</script>
|
|
43
43
|
|
|
44
44
|
<div
|
|
45
|
+
role="group"
|
|
45
46
|
{id}
|
|
46
47
|
class="sui disclosure {className}"
|
|
47
|
-
role="group"
|
|
48
48
|
hidden={hidden || undefined}
|
|
49
49
|
aria-hidden={hidden}
|
|
50
50
|
aria-disabled={disabled}
|
|
51
51
|
aria-labelledby="{id}-header"
|
|
52
|
+
aria-roledescription="disclosure"
|
|
52
53
|
{...$$restProps}
|
|
53
54
|
>
|
|
54
|
-
<div class="inner" inert={disabled}>
|
|
55
|
+
<div role="none" class="inner" inert={disabled}>
|
|
55
56
|
<Button
|
|
56
57
|
class="header"
|
|
57
58
|
id="{id}-header"
|
|
@@ -74,7 +75,6 @@
|
|
|
74
75
|
<style>.disclosure :global(button) {
|
|
75
76
|
display: flex;
|
|
76
77
|
width: 100%;
|
|
77
|
-
justify-content: space-between;
|
|
78
78
|
}
|
|
79
79
|
.disclosure :global(button .icon) {
|
|
80
80
|
transition: all 200ms;
|
|
@@ -9,11 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
let className = '';
|
|
11
11
|
export { className as class };
|
|
12
|
-
/**
|
|
13
|
-
* Whether to hide the widget. An alias of the `aria-hidden` attribute.
|
|
14
|
-
* @type {boolean | undefined}
|
|
15
|
-
*/
|
|
16
|
-
export let hidden = undefined;
|
|
17
12
|
/**
|
|
18
13
|
* Whether to make the spacer flexible.
|
|
19
14
|
* @type {boolean}
|
|
@@ -21,13 +16,7 @@
|
|
|
21
16
|
export let flex = false;
|
|
22
17
|
</script>
|
|
23
18
|
|
|
24
|
-
<div
|
|
25
|
-
class="sui spacer {className}"
|
|
26
|
-
class:flex
|
|
27
|
-
hidden={hidden || undefined}
|
|
28
|
-
aria-hidden={hidden}
|
|
29
|
-
{...$$restProps}
|
|
30
|
-
/>
|
|
19
|
+
<div role="none" class="sui spacer {className}" class:flex {...$$restProps} />
|
|
31
20
|
|
|
32
21
|
<style>.spacer.flex {
|
|
33
22
|
flex: auto;
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
export default class Spacer extends SvelteComponent<{
|
|
6
6
|
[x: string]: any;
|
|
7
7
|
class?: string;
|
|
8
|
-
hidden?: boolean;
|
|
9
8
|
flex?: boolean;
|
|
10
9
|
}, {
|
|
11
10
|
[evt: string]: CustomEvent<any>;
|
|
@@ -19,7 +18,6 @@ declare const __propDef: {
|
|
|
19
18
|
props: {
|
|
20
19
|
[x: string]: any;
|
|
21
20
|
class?: string;
|
|
22
|
-
hidden?: boolean | undefined;
|
|
23
21
|
flex?: boolean;
|
|
24
22
|
};
|
|
25
23
|
events: {
|
|
@@ -5,332 +5,242 @@
|
|
|
5
5
|
@see https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/
|
|
6
6
|
-->
|
|
7
7
|
<script>
|
|
8
|
-
import { createEventDispatcher, onMount } from 'svelte';
|
|
9
8
|
import { _ } from 'svelte-i18n';
|
|
9
|
+
import { getRandomId } from '../../services/util';
|
|
10
10
|
import Button from '../button/button.svelte';
|
|
11
11
|
import Spacer from '../divider/spacer.svelte';
|
|
12
12
|
import Icon from '../icon/icon.svelte';
|
|
13
|
+
import Modal from '../util/modal.svelte';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
+
* The `class` attribute on the content element.
|
|
16
17
|
* @type {string}
|
|
17
18
|
*/
|
|
18
19
|
let className = '';
|
|
19
|
-
|
|
20
20
|
export { className as class };
|
|
21
|
-
|
|
22
21
|
/**
|
|
23
22
|
* Whether to open the drawer.
|
|
23
|
+
* @type {boolean}
|
|
24
24
|
*/
|
|
25
25
|
export let open = false;
|
|
26
|
-
|
|
27
26
|
/**
|
|
28
27
|
* Title text displayed on the header.
|
|
28
|
+
* @type {string}
|
|
29
29
|
*/
|
|
30
30
|
export let title = '';
|
|
31
|
-
|
|
32
31
|
/**
|
|
33
32
|
* Position of the drawer.
|
|
34
|
-
* @type {
|
|
33
|
+
* @type {'top' | 'right' | 'bottom' | 'left'}
|
|
35
34
|
*/
|
|
36
35
|
export let position = 'right';
|
|
37
|
-
|
|
38
36
|
/**
|
|
39
37
|
* Width or height of the drawer.
|
|
40
|
-
* @type {
|
|
38
|
+
* @type {'small' | 'medium' | 'large' | 'x-large'}
|
|
41
39
|
*/
|
|
42
40
|
export let size = 'small';
|
|
43
|
-
|
|
44
41
|
/**
|
|
45
42
|
* Whether to show the Close button.
|
|
46
|
-
* @type {
|
|
43
|
+
* @type {'inside' | 'outside' | false}
|
|
47
44
|
*/
|
|
48
45
|
export let showClose = 'outside';
|
|
49
|
-
|
|
50
46
|
/**
|
|
51
|
-
* Whether to close the
|
|
47
|
+
* Whether to close the modal when the backdrop (outside of the modal) is clicked.
|
|
48
|
+
* @type {boolean}
|
|
52
49
|
*/
|
|
53
|
-
export let
|
|
54
|
-
|
|
50
|
+
export let lightDismiss = false;
|
|
55
51
|
/**
|
|
56
|
-
* Whether to keep the content when the
|
|
52
|
+
* Whether to keep the content in the DOM tree when the modal is not displayed.
|
|
53
|
+
* @type {boolean}
|
|
57
54
|
*/
|
|
58
55
|
export let keepContent = false;
|
|
59
56
|
|
|
60
|
-
const dispatch = createEventDispatcher();
|
|
61
|
-
/** @type {?HTMLDialogElement} */
|
|
62
|
-
let dialog;
|
|
63
|
-
/** @type {?HTMLFormElement} */
|
|
64
|
-
let form;
|
|
65
|
-
let showDialog = false;
|
|
66
|
-
let showContent = false;
|
|
67
|
-
|
|
68
|
-
$: orientation = position === 'right' || position === 'left' ? 'vertical' : 'horizontal';
|
|
69
|
-
|
|
70
57
|
/**
|
|
71
|
-
*
|
|
72
|
-
|
|
73
|
-
const openDialog = async () => {
|
|
74
|
-
(document.querySelector('.sui.app-shell') ?? document.body).appendChild(dialog);
|
|
75
|
-
showContent = true;
|
|
76
|
-
dialog.showModal();
|
|
77
|
-
|
|
78
|
-
window.requestAnimationFrame(() => {
|
|
79
|
-
showDialog = true;
|
|
80
|
-
});
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
*
|
|
58
|
+
* The ID of the drawer.
|
|
59
|
+
* @type {string}
|
|
85
60
|
*/
|
|
86
|
-
const
|
|
87
|
-
showDialog = false;
|
|
88
|
-
|
|
89
|
-
if (dialog.returnValue === 'ok') {
|
|
90
|
-
dispatch('ok');
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (dialog.returnValue === 'cancel') {
|
|
94
|
-
dispatch('cancel');
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
dispatch('close', dialog.returnValue);
|
|
98
|
-
|
|
99
|
-
await new Promise((resolve) => {
|
|
100
|
-
form.addEventListener('transitionend', () => resolve(), { once: true });
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
showContent = false;
|
|
104
|
-
dialog?.close();
|
|
105
|
-
dialog?.remove();
|
|
106
|
-
};
|
|
107
|
-
|
|
61
|
+
const id = getRandomId('drawer');
|
|
108
62
|
/**
|
|
109
|
-
*
|
|
63
|
+
* A reference to the modal component.
|
|
64
|
+
* @type {Modal}
|
|
110
65
|
*/
|
|
111
|
-
|
|
112
|
-
if (dialog) {
|
|
113
|
-
if (open) {
|
|
114
|
-
openDialog();
|
|
115
|
-
} else {
|
|
116
|
-
closeDialog();
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
};
|
|
66
|
+
let modal;
|
|
120
67
|
|
|
121
|
-
$:
|
|
122
|
-
void open;
|
|
123
|
-
toggleDialog();
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
onMount(() => {
|
|
127
|
-
dialog.remove();
|
|
128
|
-
|
|
129
|
-
// onUnmount
|
|
130
|
-
return () => {
|
|
131
|
-
dialog?.close();
|
|
132
|
-
dialog?.remove();
|
|
133
|
-
};
|
|
134
|
-
});
|
|
68
|
+
$: orientation = position === 'right' || position === 'left' ? 'vertical' : 'horizontal';
|
|
135
69
|
</script>
|
|
136
70
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
71
|
+
<Modal
|
|
72
|
+
{id}
|
|
73
|
+
class="drawer"
|
|
74
|
+
bind:open
|
|
75
|
+
showBackdrop
|
|
76
|
+
{lightDismiss}
|
|
77
|
+
{keepContent}
|
|
142
78
|
{...$$restProps}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
on:
|
|
150
|
-
// Cancelled with the Escape key
|
|
151
|
-
open = false;
|
|
152
|
-
}}
|
|
79
|
+
bind:this={modal}
|
|
80
|
+
on:opening
|
|
81
|
+
on:open
|
|
82
|
+
on:ok
|
|
83
|
+
on:cancel
|
|
84
|
+
on:closing
|
|
85
|
+
on:close
|
|
153
86
|
>
|
|
154
|
-
<
|
|
155
|
-
<div class="extra-control">
|
|
87
|
+
<div role="none" class="content {className} {size} {position} {orientation}">
|
|
88
|
+
<div role="none" class="extra-control">
|
|
156
89
|
{#if showClose === 'outside'}
|
|
157
90
|
<Button
|
|
158
91
|
variant="ghost"
|
|
159
92
|
iconic
|
|
160
93
|
class="close"
|
|
94
|
+
aria-label={$_('_sui.close')}
|
|
95
|
+
aria-controls={id}
|
|
161
96
|
on:click={() => {
|
|
162
|
-
|
|
163
|
-
open = false;
|
|
97
|
+
modal.close('close');
|
|
164
98
|
}}
|
|
165
99
|
>
|
|
166
|
-
<Icon slot="start-icon" name="close"
|
|
100
|
+
<Icon slot="start-icon" name="close" />
|
|
167
101
|
</Button>
|
|
168
102
|
{/if}
|
|
169
103
|
</div>
|
|
170
|
-
{#if
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
<slot name="header-extra" />
|
|
182
|
-
{/if}
|
|
183
|
-
{#if showClose === 'inside'}
|
|
184
|
-
<Button
|
|
185
|
-
variant="ghost"
|
|
186
|
-
iconic
|
|
187
|
-
class="close"
|
|
188
|
-
on:click={() => {
|
|
189
|
-
dialog.returnValue = 'close';
|
|
190
|
-
open = false;
|
|
191
|
-
}}
|
|
192
|
-
>
|
|
193
|
-
<Icon slot="start-icon" name="close" label={$_('_sui.close')} />
|
|
194
|
-
</Button>
|
|
195
|
-
{/if}
|
|
104
|
+
{#if title || showClose === 'inside' || $$slots.header || $$slots['header-extra']}
|
|
105
|
+
<div role="none" class="header">
|
|
106
|
+
{#if $$slots.header}
|
|
107
|
+
<slot name="header" />
|
|
108
|
+
{:else}
|
|
109
|
+
<div role="none" class="title">
|
|
110
|
+
{title}
|
|
111
|
+
</div>
|
|
112
|
+
<Spacer flex={true} />
|
|
113
|
+
{#if $$slots['header-extra']}
|
|
114
|
+
<slot name="header-extra" />
|
|
196
115
|
{/if}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
116
|
+
{#if showClose === 'inside'}
|
|
117
|
+
<Button
|
|
118
|
+
variant="ghost"
|
|
119
|
+
iconic
|
|
120
|
+
class="close"
|
|
121
|
+
aria-label={$_('_sui.close')}
|
|
122
|
+
aria-controls={id}
|
|
123
|
+
on:click={() => {
|
|
124
|
+
modal.close('close');
|
|
125
|
+
}}
|
|
126
|
+
>
|
|
127
|
+
<Icon slot="start-icon" name="close" />
|
|
128
|
+
</Button>
|
|
129
|
+
{/if}
|
|
130
|
+
{/if}
|
|
201
131
|
</div>
|
|
202
|
-
{#if $$slots.footer}
|
|
203
|
-
<div class="footer">
|
|
204
|
-
<slot name="footer" />
|
|
205
|
-
</div>
|
|
206
|
-
{/if}
|
|
207
132
|
{/if}
|
|
208
|
-
|
|
209
|
-
|
|
133
|
+
<div role="none" class="main">
|
|
134
|
+
<slot />
|
|
135
|
+
</div>
|
|
136
|
+
{#if $$slots.footer}
|
|
137
|
+
<div role="none" class="footer">
|
|
138
|
+
<slot name="footer" />
|
|
139
|
+
</div>
|
|
140
|
+
{/if}
|
|
141
|
+
</div>
|
|
142
|
+
</Modal>
|
|
210
143
|
|
|
211
|
-
<style
|
|
212
|
-
overflow: hidden;
|
|
213
|
-
outline: 0;
|
|
214
|
-
background-color: var(--sui-popup-backdrop-color);
|
|
215
|
-
}
|
|
216
|
-
dialog.open form {
|
|
217
|
-
opacity: 1;
|
|
218
|
-
transform: translateX(0%);
|
|
219
|
-
transition-duration: 100ms;
|
|
220
|
-
}
|
|
221
|
-
dialog:not(.open) {
|
|
222
|
-
pointer-events: none !important;
|
|
223
|
-
}
|
|
224
|
-
dialog:not(.open) form {
|
|
225
|
-
opacity: 0;
|
|
226
|
-
transform: translateX(105%);
|
|
227
|
-
pointer-events: none;
|
|
228
|
-
transition-duration: 200ms;
|
|
229
|
-
}
|
|
230
|
-
dialog:not(.open) :global(*) {
|
|
231
|
-
pointer-events: none !important;
|
|
232
|
-
}
|
|
233
|
-
dialog :global(a),
|
|
234
|
-
dialog :global(input),
|
|
235
|
-
dialog :global(textarea),
|
|
236
|
-
dialog :global(button),
|
|
237
|
-
dialog :global([tabindex="0"]) {
|
|
238
|
-
pointer-events: all;
|
|
239
|
-
}
|
|
240
|
-
dialog form {
|
|
144
|
+
<style>.content {
|
|
241
145
|
position: absolute;
|
|
242
146
|
display: flex;
|
|
243
147
|
flex-direction: column;
|
|
244
148
|
border-radius: 4px;
|
|
245
|
-
max-width:
|
|
246
|
-
max-height:
|
|
149
|
+
max-width: 100dvw;
|
|
150
|
+
max-height: 100dvh;
|
|
247
151
|
background-color: var(--sui-secondary-background-color-translucent);
|
|
152
|
+
box-shadow: 0 8px 16px var(--sui-popup-shadow-color);
|
|
248
153
|
-webkit-backdrop-filter: blur(16px);
|
|
249
154
|
backdrop-filter: blur(16px);
|
|
250
|
-
|
|
251
|
-
will-change: opacity, transform;
|
|
252
|
-
transition-property: opacity, transform;
|
|
155
|
+
transition-property: transform;
|
|
253
156
|
}
|
|
254
|
-
|
|
157
|
+
.content .extra-control {
|
|
255
158
|
position: absolute;
|
|
256
159
|
}
|
|
257
|
-
|
|
160
|
+
.content .extra-control :global(button.close) {
|
|
258
161
|
margin: 8px;
|
|
259
162
|
}
|
|
260
|
-
dialog.
|
|
163
|
+
:global(dialog.open) .content {
|
|
164
|
+
transition-duration: 150ms;
|
|
165
|
+
transform: translateX(0%);
|
|
166
|
+
}
|
|
167
|
+
:global(dialog:not(.open)) .content {
|
|
168
|
+
transition-duration: 300ms;
|
|
169
|
+
}
|
|
170
|
+
.content.right {
|
|
261
171
|
inset: 0 0 0 auto;
|
|
262
172
|
}
|
|
263
|
-
|
|
173
|
+
.content.right .extra-control {
|
|
264
174
|
inset: 0 100% auto auto;
|
|
265
175
|
}
|
|
266
|
-
dialog
|
|
176
|
+
:global(dialog:not(.open)) .content.right {
|
|
267
177
|
transform: translateX(105%);
|
|
268
178
|
}
|
|
269
|
-
|
|
179
|
+
.content.left {
|
|
270
180
|
inset: 0 auto 0 0;
|
|
271
181
|
}
|
|
272
|
-
|
|
182
|
+
.content.left .extra-control {
|
|
273
183
|
inset: 0 auto auto 100%;
|
|
274
184
|
}
|
|
275
|
-
dialog
|
|
185
|
+
:global(dialog:not(.open)) .content.left {
|
|
276
186
|
transform: translateX(-105%);
|
|
277
187
|
}
|
|
278
|
-
|
|
188
|
+
.content.vertical {
|
|
279
189
|
height: 100%;
|
|
280
|
-
max-width:
|
|
190
|
+
max-width: 100dvw;
|
|
281
191
|
}
|
|
282
|
-
dialog.
|
|
283
|
-
max-width: calc(
|
|
192
|
+
:global(dialog.open) .content.vertical {
|
|
193
|
+
max-width: calc(100dvw - 56px);
|
|
284
194
|
transform: translateX(0%);
|
|
285
195
|
}
|
|
286
|
-
|
|
196
|
+
.content.vertical.small {
|
|
287
197
|
width: 400px;
|
|
288
198
|
}
|
|
289
|
-
|
|
199
|
+
.content.vertical.medium {
|
|
290
200
|
width: 600px;
|
|
291
201
|
}
|
|
292
|
-
|
|
202
|
+
.content.vertical.large {
|
|
293
203
|
width: 800px;
|
|
294
204
|
}
|
|
295
|
-
|
|
205
|
+
.content.vertical.x-large {
|
|
296
206
|
width: 1000px;
|
|
297
207
|
}
|
|
298
|
-
|
|
208
|
+
.content.top {
|
|
299
209
|
inset: 0 0 auto 0;
|
|
300
210
|
}
|
|
301
|
-
|
|
211
|
+
.content.top .extra-control {
|
|
302
212
|
inset: 100% 0 auto auto;
|
|
303
213
|
}
|
|
304
|
-
dialog
|
|
214
|
+
:global(dialog:not(.open)) .content.top {
|
|
305
215
|
transform: translateY(-105%);
|
|
306
216
|
}
|
|
307
|
-
|
|
217
|
+
.content.bottom {
|
|
308
218
|
inset: auto 0 0 0;
|
|
309
219
|
}
|
|
310
|
-
|
|
220
|
+
.content.bottom .extra-control {
|
|
311
221
|
inset: auto 0 100% auto;
|
|
312
222
|
}
|
|
313
|
-
dialog
|
|
223
|
+
:global(dialog:not(.open)) .content.bottom {
|
|
314
224
|
transform: translateY(105%);
|
|
315
225
|
}
|
|
316
|
-
|
|
226
|
+
.content.horizontal {
|
|
317
227
|
width: 100%;
|
|
318
|
-
max-height:
|
|
228
|
+
max-height: 100dvh;
|
|
319
229
|
}
|
|
320
|
-
dialog.
|
|
321
|
-
max-height: calc(
|
|
230
|
+
:global(dialog.open) .content.horizontal {
|
|
231
|
+
max-height: calc(100dvh - 56px);
|
|
322
232
|
transform: translateY(0%);
|
|
323
233
|
}
|
|
324
|
-
|
|
234
|
+
.content.horizontal.small {
|
|
325
235
|
height: 400px;
|
|
326
236
|
}
|
|
327
|
-
|
|
237
|
+
.content.horizontal.medium {
|
|
328
238
|
height: 600px;
|
|
329
239
|
}
|
|
330
|
-
|
|
240
|
+
.content.horizontal.large {
|
|
331
241
|
height: 800px;
|
|
332
242
|
}
|
|
333
|
-
|
|
243
|
+
.content.horizontal.x-large {
|
|
334
244
|
height: 1000px;
|
|
335
245
|
}
|
|
336
246
|
|