@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.
Files changed (118) hide show
  1. package/package/components/alert/alert.svelte +4 -4
  2. package/package/components/alert/alert.svelte.d.ts +2 -2
  3. package/package/components/button/button.svelte +13 -3
  4. package/package/components/button/button.svelte.d.ts +11 -4
  5. package/package/components/button/select-button-group.svelte +12 -8
  6. package/package/components/button/select-button.svelte +5 -4
  7. package/package/components/button/select-button.svelte.d.ts +2 -0
  8. package/package/components/calendar/calendar.svelte +20 -14
  9. package/package/components/checkbox/checkbox-group.svelte +6 -5
  10. package/package/components/checkbox/checkbox.svelte +16 -9
  11. package/package/components/checkbox/checkbox.svelte.d.ts +2 -2
  12. package/package/components/dialog/alert-dialog.svelte +50 -0
  13. package/package/components/dialog/alert-dialog.svelte.d.ts +55 -0
  14. package/package/components/dialog/confirmation-dialog.svelte +55 -0
  15. package/package/components/dialog/confirmation-dialog.svelte.d.ts +57 -0
  16. package/package/components/dialog/dialog.svelte +164 -220
  17. package/package/components/dialog/dialog.svelte.d.ts +20 -12
  18. package/package/components/dialog/prompt-dialog.svelte +78 -0
  19. package/package/components/dialog/prompt-dialog.svelte.d.ts +72 -0
  20. package/package/components/disclosure/disclosure.svelte +3 -3
  21. package/package/components/divider/divider.svelte +1 -1
  22. package/package/components/divider/spacer.svelte +1 -12
  23. package/package/components/divider/spacer.svelte.d.ts +0 -2
  24. package/package/components/drawer/drawer.svelte +118 -208
  25. package/package/components/drawer/drawer.svelte.d.ts +12 -8
  26. package/package/components/grid/grid-body.svelte +51 -0
  27. package/package/components/grid/grid-body.svelte.d.ts +36 -0
  28. package/package/components/grid/grid-cell.svelte +22 -0
  29. package/package/components/grid/grid-cell.svelte.d.ts +34 -0
  30. package/package/components/grid/grid-col-header.svelte +22 -0
  31. package/package/components/grid/grid-col-header.svelte.d.ts +34 -0
  32. package/package/components/grid/grid-foot.svelte +27 -0
  33. package/package/components/grid/grid-foot.svelte.d.ts +34 -0
  34. package/package/components/grid/grid-head.svelte +27 -0
  35. package/package/components/grid/grid-head.svelte.d.ts +34 -0
  36. package/package/components/grid/grid-row-header.svelte +23 -0
  37. package/package/components/grid/grid-row-header.svelte.d.ts +34 -0
  38. package/package/components/grid/grid-row.svelte +37 -0
  39. package/package/components/grid/grid-row.svelte.d.ts +44 -0
  40. package/package/components/grid/grid.svelte +52 -0
  41. package/package/components/grid/grid.svelte.d.ts +42 -0
  42. package/package/components/icon/icon.svelte +6 -7
  43. package/package/components/icon/icon.svelte.d.ts +0 -2
  44. package/package/components/listbox/listbox.svelte +6 -6
  45. package/package/components/listbox/option-group.svelte +6 -5
  46. package/package/components/listbox/option.svelte +7 -28
  47. package/package/components/listbox/option.svelte.d.ts +2 -0
  48. package/package/components/menu/menu-button.svelte +26 -16
  49. package/package/components/menu/menu-button.svelte.d.ts +2 -2
  50. package/package/components/menu/menu-item-checkbox.svelte +5 -4
  51. package/package/components/menu/menu-item-checkbox.svelte.d.ts +2 -0
  52. package/package/components/menu/menu-item-group.svelte +4 -3
  53. package/package/components/menu/menu-item-radio.svelte +5 -4
  54. package/package/components/menu/menu-item-radio.svelte.d.ts +2 -0
  55. package/package/components/menu/menu-item.svelte +7 -5
  56. package/package/components/menu/menu-item.svelte.d.ts +4 -2
  57. package/package/components/menu/menu.svelte +1 -1
  58. package/package/components/radio/radio-group.svelte +8 -8
  59. package/package/components/radio/radio-group.svelte.d.ts +2 -2
  60. package/package/components/radio/radio.svelte +5 -2
  61. package/package/components/radio/radio.svelte.d.ts +2 -0
  62. package/package/components/select/combobox.svelte +55 -35
  63. package/package/components/select/combobox.svelte.d.ts +3 -2
  64. package/package/components/select/select.svelte +10 -9
  65. package/package/components/select/select.svelte.d.ts +4 -3
  66. package/package/components/slider/slider.svelte +15 -7
  67. package/package/components/switch/switch.svelte +9 -6
  68. package/package/components/switch/switch.svelte.d.ts +2 -2
  69. package/package/components/table/table-body.svelte +31 -3
  70. package/package/components/table/table-body.svelte.d.ts +2 -0
  71. package/package/components/table/table-cell.svelte +3 -4
  72. package/package/components/table/table-cell.svelte.d.ts +1 -1
  73. package/package/components/table/table-col-header.svelte +1 -2
  74. package/package/components/table/table-foot.svelte +7 -3
  75. package/package/components/table/table-head.svelte +7 -3
  76. package/package/components/table/table-row-header.svelte +1 -2
  77. package/package/components/table/table-row.svelte +1 -14
  78. package/package/components/table/table-row.svelte.d.ts +0 -8
  79. package/package/components/table/table.svelte +5 -17
  80. package/package/components/table/table.svelte.d.ts +1 -7
  81. package/package/components/tabs/tab-list.svelte +7 -5
  82. package/package/components/tabs/tab-panel.svelte +1 -1
  83. package/package/components/tabs/tab.svelte +2 -1
  84. package/package/components/tabs/tab.svelte.d.ts +2 -0
  85. package/package/components/text-field/markdown-editor.svelte +36 -9
  86. package/package/components/text-field/markdown-editor.svelte.d.ts +2 -0
  87. package/package/components/text-field/number-input.svelte +107 -43
  88. package/package/components/text-field/number-input.svelte.d.ts +2 -0
  89. package/package/components/text-field/password-input.svelte +43 -12
  90. package/package/components/text-field/password-input.svelte.d.ts +2 -0
  91. package/package/components/text-field/search-bar.svelte +43 -13
  92. package/package/components/text-field/search-bar.svelte.d.ts +5 -0
  93. package/package/components/text-field/text-area.svelte +26 -6
  94. package/package/components/text-field/text-area.svelte.d.ts +2 -0
  95. package/package/components/text-field/text-input.svelte +37 -7
  96. package/package/components/text-field/text-input.svelte.d.ts +14 -4
  97. package/package/components/toast/toast.svelte +6 -16
  98. package/package/components/toast/toast.svelte.d.ts +2 -2
  99. package/package/components/toolbar/toolbar.svelte +3 -4
  100. package/package/components/util/app-shell.svelte +34 -29
  101. package/package/components/util/group.svelte +2 -2
  102. package/package/components/util/modal.svelte +220 -0
  103. package/package/components/util/modal.svelte.d.ts +83 -0
  104. package/package/components/util/popup.svelte +80 -121
  105. package/package/components/util/popup.svelte.d.ts +22 -13
  106. package/package/components/util/portal.svelte +1 -1
  107. package/package/index.d.ts +12 -0
  108. package/package/index.js +12 -0
  109. package/package/locales/en.d.ts +1 -0
  110. package/package/locales/en.js +1 -0
  111. package/package/locales/ja.d.ts +1 -0
  112. package/package/locales/ja.js +1 -0
  113. package/package/services/group.js +67 -13
  114. package/package/services/popup.d.ts +5 -1
  115. package/package/services/popup.js +22 -19
  116. package/package/styles/core.scss +13 -26
  117. package/package/styles/variables.scss +14 -2
  118. 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;
@@ -23,8 +23,8 @@
23
23
  </script>
24
24
 
25
25
  <div
26
- class="sui divider {className}"
27
26
  role="separator"
27
+ class="sui divider {className}"
28
28
  hidden={hidden || undefined}
29
29
  aria-hidden={hidden}
30
30
  aria-orientation={orientation}
@@ -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
- * CSS class name on the button.
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 {('top'|'right'|'bottom'|'left')}
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 {('small'|'medium'|'large'|'x-large')}
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 {('inside'|'outside'|false)}
43
+ * @type {'inside' | 'outside' | false}
47
44
  */
48
45
  export let showClose = 'outside';
49
-
50
46
  /**
51
- * Whether to close the drawer when the backdrop (outside of the drawer) is clicked.
47
+ * Whether to close the modal when the backdrop (outside of the modal) is clicked.
48
+ * @type {boolean}
52
49
  */
53
- export let closeOnBackdropClick = false;
54
-
50
+ export let lightDismiss = false;
55
51
  /**
56
- * Whether to keep the content when the dialog is not displayed.
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 closeDialog = async () => {
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
- const toggleDialog = () => {
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
- <!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
138
- <dialog
139
- bind:this={dialog}
140
- class="sui dialog {className} {size} {position} {orientation}"
141
- class:open={showDialog}
71
+ <Modal
72
+ {id}
73
+ class="drawer"
74
+ bind:open
75
+ showBackdrop
76
+ {lightDismiss}
77
+ {keepContent}
142
78
  {...$$restProps}
143
- on:click={({ target }) => {
144
- if (closeOnBackdropClick && /** @type {HTMLElement?} */ (target)?.matches('dialog')) {
145
- dialog.returnValue = 'cancel';
146
- open = false;
147
- }
148
- }}
149
- on:cancel|preventDefault={() => {
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
- <form method="dialog" bind:this={form} on:submit|preventDefault>
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
- dialog.returnValue = 'close';
163
- open = false;
97
+ modal.close('close');
164
98
  }}
165
99
  >
166
- <Icon slot="start-icon" name="close" label={$_('_sui.close')} />
100
+ <Icon slot="start-icon" name="close" />
167
101
  </Button>
168
102
  {/if}
169
103
  </div>
170
- {#if keepContent || showContent}
171
- {#if title || showClose === 'inside' || $$slots.header || $$slots['header-extra']}
172
- <div class="header">
173
- {#if $$slots.header}
174
- <slot name="header" />
175
- {:else}
176
- <div class="title">
177
- {title}
178
- </div>
179
- <Spacer flex={true} />
180
- {#if $$slots['header-extra']}
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
- </div>
198
- {/if}
199
- <div class="main">
200
- <slot />
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
- </form>
209
- </dialog>
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>dialog {
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: 100vw;
246
- max-height: 100vh;
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
- box-shadow: 0 8px 16px var(--sui-popup-shadow-color);
251
- will-change: opacity, transform;
252
- transition-property: opacity, transform;
155
+ transition-property: transform;
253
156
  }
254
- dialog form .extra-control {
157
+ .content .extra-control {
255
158
  position: absolute;
256
159
  }
257
- dialog form .extra-control :global(button.close) {
160
+ .content .extra-control :global(button.close) {
258
161
  margin: 8px;
259
162
  }
260
- dialog.right form {
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
- dialog.right form .extra-control {
173
+ .content.right .extra-control {
264
174
  inset: 0 100% auto auto;
265
175
  }
266
- dialog.right:not(.open) form {
176
+ :global(dialog:not(.open)) .content.right {
267
177
  transform: translateX(105%);
268
178
  }
269
- dialog.left form {
179
+ .content.left {
270
180
  inset: 0 auto 0 0;
271
181
  }
272
- dialog.left form .extra-control {
182
+ .content.left .extra-control {
273
183
  inset: 0 auto auto 100%;
274
184
  }
275
- dialog.left:not(.open) form {
185
+ :global(dialog:not(.open)) .content.left {
276
186
  transform: translateX(-105%);
277
187
  }
278
- dialog.vertical {
188
+ .content.vertical {
279
189
  height: 100%;
280
- max-width: 100vw;
190
+ max-width: 100dvw;
281
191
  }
282
- dialog.vertical.open form {
283
- max-width: calc(100vw - 56px);
192
+ :global(dialog.open) .content.vertical {
193
+ max-width: calc(100dvw - 56px);
284
194
  transform: translateX(0%);
285
195
  }
286
- dialog.vertical.small form {
196
+ .content.vertical.small {
287
197
  width: 400px;
288
198
  }
289
- dialog.vertical.medium form {
199
+ .content.vertical.medium {
290
200
  width: 600px;
291
201
  }
292
- dialog.vertical.large form {
202
+ .content.vertical.large {
293
203
  width: 800px;
294
204
  }
295
- dialog.vertical.x-large form {
205
+ .content.vertical.x-large {
296
206
  width: 1000px;
297
207
  }
298
- dialog.top form {
208
+ .content.top {
299
209
  inset: 0 0 auto 0;
300
210
  }
301
- dialog.top form .extra-control {
211
+ .content.top .extra-control {
302
212
  inset: 100% 0 auto auto;
303
213
  }
304
- dialog.top:not(.open) form {
214
+ :global(dialog:not(.open)) .content.top {
305
215
  transform: translateY(-105%);
306
216
  }
307
- dialog.bottom form {
217
+ .content.bottom {
308
218
  inset: auto 0 0 0;
309
219
  }
310
- dialog.bottom form .extra-control {
220
+ .content.bottom .extra-control {
311
221
  inset: auto 0 100% auto;
312
222
  }
313
- dialog.bottom:not(.open) form {
223
+ :global(dialog:not(.open)) .content.bottom {
314
224
  transform: translateY(105%);
315
225
  }
316
- dialog.horizontal {
226
+ .content.horizontal {
317
227
  width: 100%;
318
- max-height: 100vh;
228
+ max-height: 100dvh;
319
229
  }
320
- dialog.horizontal.open form {
321
- max-height: calc(100vh - 56px);
230
+ :global(dialog.open) .content.horizontal {
231
+ max-height: calc(100dvh - 56px);
322
232
  transform: translateY(0%);
323
233
  }
324
- dialog.horizontal.small form {
234
+ .content.horizontal.small {
325
235
  height: 400px;
326
236
  }
327
- dialog.horizontal.medium form {
237
+ .content.horizontal.medium {
328
238
  height: 600px;
329
239
  }
330
- dialog.horizontal.large form {
240
+ .content.horizontal.large {
331
241
  height: 800px;
332
242
  }
333
- dialog.horizontal.x-large form {
243
+ .content.horizontal.x-large {
334
244
  height: 1000px;
335
245
  }
336
246