@sveltia/ui 0.16.0 → 0.17.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 (156) hide show
  1. package/package/components/alert/alert.svelte +22 -7
  2. package/package/components/alert/alert.svelte.d.ts +32 -28
  3. package/package/components/button/button-group.svelte +16 -6
  4. package/package/components/button/button-group.svelte.d.ts +23 -23
  5. package/package/components/button/button.svelte +41 -136
  6. package/package/components/button/button.svelte.d.ts +5 -146
  7. package/package/components/button/select-button-group.svelte +31 -37
  8. package/package/components/button/select-button-group.svelte.d.ts +76 -34
  9. package/package/components/button/select-button.svelte +19 -62
  10. package/package/components/button/select-button.svelte.d.ts +17 -73
  11. package/package/components/button/split-button.svelte +37 -47
  12. package/package/components/button/split-button.svelte.d.ts +40 -47
  13. package/package/components/calendar/calendar.svelte +80 -55
  14. package/package/components/calendar/calendar.svelte.d.ts +13 -10
  15. package/package/components/checkbox/checkbox-group.svelte +23 -20
  16. package/package/components/checkbox/checkbox-group.svelte.d.ts +49 -27
  17. package/package/components/checkbox/checkbox.svelte +57 -67
  18. package/package/components/checkbox/checkbox.svelte.d.ts +67 -55
  19. package/package/components/dialog/alert-dialog.svelte +9 -36
  20. package/package/components/dialog/alert-dialog.svelte.d.ts +5 -44
  21. package/package/components/dialog/confirmation-dialog.svelte +9 -41
  22. package/package/components/dialog/confirmation-dialog.svelte.d.ts +5 -46
  23. package/package/components/dialog/dialog.svelte +60 -105
  24. package/package/components/dialog/dialog.svelte.d.ts +5 -102
  25. package/package/components/dialog/prompt-dialog.svelte +32 -61
  26. package/package/components/dialog/prompt-dialog.svelte.d.ts +38 -62
  27. package/package/components/disclosure/disclosure.svelte +39 -34
  28. package/package/components/disclosure/disclosure.svelte.d.ts +74 -56
  29. package/package/components/divider/divider.svelte +18 -14
  30. package/package/components/divider/divider.svelte.d.ts +31 -10
  31. package/package/components/divider/spacer.svelte +13 -8
  32. package/package/components/divider/spacer.svelte.d.ts +20 -9
  33. package/package/components/drawer/drawer.svelte +63 -76
  34. package/package/components/drawer/drawer.svelte.d.ts +102 -84
  35. package/package/components/grid/grid-body.svelte +15 -10
  36. package/package/components/grid/grid-body.svelte.d.ts +30 -24
  37. package/package/components/grid/grid-cell.svelte +16 -6
  38. package/package/components/grid/grid-cell.svelte.d.ts +23 -23
  39. package/package/components/grid/grid-col-header.svelte +16 -6
  40. package/package/components/grid/grid-col-header.svelte.d.ts +23 -23
  41. package/package/components/grid/grid-foot.svelte +16 -6
  42. package/package/components/grid/grid-foot.svelte.d.ts +23 -23
  43. package/package/components/grid/grid-head.svelte +16 -6
  44. package/package/components/grid/grid-head.svelte.d.ts +23 -23
  45. package/package/components/grid/grid-row-header.svelte +16 -6
  46. package/package/components/grid/grid-row-header.svelte.d.ts +23 -23
  47. package/package/components/grid/grid-row.svelte +19 -23
  48. package/package/components/grid/grid-row.svelte.d.ts +48 -38
  49. package/package/components/grid/grid.svelte +28 -25
  50. package/package/components/grid/grid.svelte.d.ts +56 -32
  51. package/package/components/icon/icon.svelte +14 -9
  52. package/package/components/icon/icon.svelte.d.ts +20 -9
  53. package/package/components/listbox/listbox.svelte +46 -52
  54. package/package/components/listbox/listbox.svelte.d.ts +102 -40
  55. package/package/components/listbox/option-group.svelte +23 -19
  56. package/package/components/listbox/option-group.svelte.d.ts +49 -27
  57. package/package/components/listbox/option.svelte +44 -57
  58. package/package/components/listbox/option.svelte.d.ts +54 -84
  59. package/package/components/menu/menu-button.svelte +42 -63
  60. package/package/components/menu/menu-button.svelte.d.ts +18 -72
  61. package/package/components/menu/menu-item-checkbox.svelte +29 -41
  62. package/package/components/menu/menu-item-checkbox.svelte.d.ts +5 -44
  63. package/package/components/menu/menu-item-group.svelte +22 -19
  64. package/package/components/menu/menu-item-group.svelte.d.ts +41 -27
  65. package/package/components/menu/menu-item-radio.svelte +29 -41
  66. package/package/components/menu/menu-item-radio.svelte.d.ts +5 -44
  67. package/package/components/menu/menu-item.svelte +66 -75
  68. package/package/components/menu/menu-item.svelte.d.ts +5 -80
  69. package/package/components/menu/menu.svelte +27 -22
  70. package/package/components/menu/menu.svelte.d.ts +50 -30
  71. package/package/components/radio/radio-group.svelte +38 -42
  72. package/package/components/radio/radio-group.svelte.d.ts +85 -35
  73. package/package/components/radio/radio.svelte +45 -48
  74. package/package/components/radio/radio.svelte.d.ts +96 -42
  75. package/package/components/select/combobox.svelte +76 -101
  76. package/package/components/select/combobox.svelte.d.ts +5 -56
  77. package/package/components/select/select-tags.svelte +48 -59
  78. package/package/components/select/select-tags.svelte.d.ts +109 -28
  79. package/package/components/select/select.svelte +18 -37
  80. package/package/components/select/select.svelte.d.ts +5 -40
  81. package/package/components/slider/slider.svelte +71 -68
  82. package/package/components/slider/slider.svelte.d.ts +142 -31
  83. package/package/components/switch/switch.svelte +36 -46
  84. package/package/components/switch/switch.svelte.d.ts +83 -37
  85. package/package/components/table/table-body.svelte +15 -11
  86. package/package/components/table/table-body.svelte.d.ts +30 -24
  87. package/package/components/table/table-cell.svelte +16 -6
  88. package/package/components/table/table-cell.svelte.d.ts +23 -23
  89. package/package/components/table/table-col-header.svelte +16 -6
  90. package/package/components/table/table-col-header.svelte.d.ts +23 -23
  91. package/package/components/table/table-foot.svelte +16 -6
  92. package/package/components/table/table-foot.svelte.d.ts +23 -23
  93. package/package/components/table/table-head.svelte +16 -6
  94. package/package/components/table/table-head.svelte.d.ts +23 -23
  95. package/package/components/table/table-row-header.svelte +16 -6
  96. package/package/components/table/table-row-header.svelte.d.ts +23 -23
  97. package/package/components/table/table-row.svelte +16 -6
  98. package/package/components/table/table-row.svelte.d.ts +23 -23
  99. package/package/components/table/table.svelte +16 -6
  100. package/package/components/table/table.svelte.d.ts +23 -23
  101. package/package/components/tabs/tab-box.svelte +16 -9
  102. package/package/components/tabs/tab-box.svelte.d.ts +32 -22
  103. package/package/components/tabs/tab-list.svelte +36 -35
  104. package/package/components/tabs/tab-list.svelte.d.ts +65 -33
  105. package/package/components/tabs/tab-panel.svelte +16 -6
  106. package/package/components/tabs/tab-panel.svelte.d.ts +23 -23
  107. package/package/components/tabs/tab-panels.svelte +16 -6
  108. package/package/components/tabs/tab-panels.svelte.d.ts +23 -21
  109. package/package/components/tabs/tab.svelte +28 -25
  110. package/package/components/tabs/tab.svelte.d.ts +17 -63
  111. package/package/components/text-editor/lexical-root.svelte +38 -32
  112. package/package/components/text-editor/lexical-root.svelte.d.ts +74 -13
  113. package/package/components/text-editor/text-editor.svelte +63 -79
  114. package/package/components/text-editor/text-editor.svelte.d.ts +97 -20
  115. package/package/components/text-editor/toolbar/editor-toolbar.svelte +41 -24
  116. package/package/components/text-editor/toolbar/editor-toolbar.svelte.d.ts +32 -7
  117. package/package/components/text-editor/toolbar/format-text-button.svelte +15 -5
  118. package/package/components/text-editor/toolbar/format-text-button.svelte.d.ts +13 -6
  119. package/package/components/text-editor/toolbar/insert-link-button.svelte +18 -16
  120. package/package/components/text-editor/toolbar/insert-link-button.svelte.d.ts +4 -8
  121. package/package/components/text-editor/toolbar/toggle-block-menu-item.svelte +19 -7
  122. package/package/components/text-editor/toolbar/toggle-block-menu-item.svelte.d.ts +13 -6
  123. package/package/components/text-field/number-input.svelte +63 -81
  124. package/package/components/text-field/number-input.svelte.d.ts +48 -55
  125. package/package/components/text-field/password-input.svelte +38 -57
  126. package/package/components/text-field/password-input.svelte.d.ts +16 -45
  127. package/package/components/text-field/search-bar.svelte +45 -62
  128. package/package/components/text-field/search-bar.svelte.d.ts +25 -66
  129. package/package/components/text-field/text-area.svelte +38 -54
  130. package/package/components/text-field/text-area.svelte.d.ts +100 -35
  131. package/package/components/text-field/text-input.svelte +28 -86
  132. package/package/components/text-field/text-input.svelte.d.ts +4 -78
  133. package/package/components/toast/toast.svelte +36 -30
  134. package/package/components/toast/toast.svelte.d.ts +50 -28
  135. package/package/components/toolbar/toolbar.svelte +25 -25
  136. package/package/components/toolbar/toolbar.svelte.d.ts +57 -29
  137. package/package/components/util/app-shell.svelte +22 -10
  138. package/package/components/util/app-shell.svelte.d.ts +25 -29
  139. package/package/components/util/group.svelte +20 -15
  140. package/package/components/util/group.svelte.d.ts +40 -26
  141. package/package/components/util/modal.svelte +89 -105
  142. package/package/components/util/modal.svelte.d.ts +6 -71
  143. package/package/components/util/placeholder.svelte +21 -0
  144. package/package/components/util/{portal.svelte.d.ts → placeholder.svelte.d.ts} +17 -25
  145. package/package/components/util/popup.svelte +65 -62
  146. package/package/components/util/popup.svelte.d.ts +89 -77
  147. package/package/services/{group.js → group.svelte.js} +11 -12
  148. package/package/services/{popup.js → popup.svelte.js} +6 -5
  149. package/package/typedefs.d.ts +545 -0
  150. package/package/typedefs.js +202 -0
  151. package/package.json +12 -19
  152. package/package/components/util/portal.svelte +0 -36
  153. /package/package/services/{events.d.ts → events.svelte.d.ts} +0 -0
  154. /package/package/services/{events.js → events.svelte.js} +0 -0
  155. /package/package/services/{group.d.ts → group.svelte.d.ts} +0 -0
  156. /package/package/services/{popup.d.ts → popup.svelte.d.ts} +0 -0
@@ -2,75 +2,70 @@
2
2
  @component
3
3
  Generic popup helper.
4
4
  -->
5
- <svelte:options accessors={true} />
6
-
7
5
  <script>
8
6
  import { sleep } from '@sveltia/utils/misc';
9
7
  import { onMount } from 'svelte';
10
8
  import { writable } from 'svelte/store';
11
- import { activatePopup } from '../../services/popup';
9
+ import { activatePopup } from '../../services/popup.svelte.js';
12
10
  import Modal from './modal.svelte';
13
11
 
14
12
  /**
15
- * The `class` attribute on the content element.
16
- * @type {string}
17
- */
18
- let className = '';
19
- export { className as class };
20
- /**
21
- * Whether to open the popup.
22
- * @type {import('svelte/store').Writable<boolean>}
23
- */
24
- export let open = writable(false);
25
- /**
26
- * Whether to show the backdrop.
27
- * @type {boolean}
28
- */
29
- export let showBackdrop = false;
30
- /**
31
- * A reference to the anchor element that opens the popup. Typically a `<button>`.
32
- * @type {HTMLElement | undefined}
33
- */
34
- export let anchor;
35
- /**
36
- * A reference to the content element.
37
- * @type {HTMLElement | undefined}
38
- */
39
- export let content = undefined;
40
- /**
41
- * Where to show the popup.
42
- * @type {import('../../typedefs').PopupPosition}
13
+ * @typedef {object} Props
14
+ * @property {string} [class] - The `class` attribute on the content element.
15
+ * @property {boolean} [open] - Whether to open the popup.
16
+ * @property {HTMLElement} anchor - A reference to the anchor element that opens the popup.
17
+ * Typically a `<button>`.
18
+ * @property {HTMLElement | undefined} [content] - A reference to the content element.
19
+ * @property {import('../../typedefs').PopupPosition} [position] - Where to show the popup.
20
+ * @property {HTMLElement | undefined} [positionBaseElement] - The base element of
21
+ * {@link position}. If omitted, this will be {@link anchor}.
22
+ * @property {boolean} [touchOptimized] - Whether to show the popup at the center of the screen on
23
+ * mobile/tablet and ignore the defined dropdown `position`.
24
+ * @property {import('svelte').Snippet} [children] - Primary slot content.
25
+ * @property {import('svelte').Snippet} [extraContent] - Extra slot content.
26
+ * @property {(event: CustomEvent) => void} [onOpen] - Custom `Open` event handler.
43
27
  */
44
- export let position = 'bottom-left';
28
+
45
29
  /**
46
- * The base element of {@link position}. If omitted, this will be {@link anchor}.
47
- * @type {HTMLElement | undefined}
30
+ * @type {import('../../typedefs').ModalProps & Props & Record<string, any>}
48
31
  */
49
- export let positionBaseElement = undefined;
32
+ let {
33
+ /* eslint-disable prefer-const */
34
+ open = $bindable(false),
35
+ content = $bindable(undefined),
36
+ class: className,
37
+ showBackdrop = false,
38
+ anchor,
39
+ position = 'bottom-left',
40
+ positionBaseElement = undefined,
41
+ touchOptimized = false,
42
+ children,
43
+ onOpen,
44
+ ...restProps
45
+ /* eslint-enable prefer-const */
46
+ } = $props();
47
+
50
48
  /**
51
- * Whether to show the popup at the center of the screen on mobile/tablet and ignore the defined
52
- * dropdown `position`.
53
49
  * @type {boolean}
54
50
  */
55
- export let touchOptimized = false;
56
-
51
+ let initialized = $state(false);
57
52
  /**
58
- * A reference to the modal component.
59
- * @type {Modal}
53
+ * A reference to the `<dialog>` element.
54
+ * @type {HTMLDialogElement | undefined}
60
55
  */
61
- let modal;
56
+ let dialogElement = $state();
62
57
  /**
63
58
  * Whether the touch is enabled on the user device.
64
59
  * @type {boolean}
65
60
  */
66
- let touchEnabled = false;
61
+ let touchEnabled = $state(false);
67
62
  /**
68
63
  * The type of the content displayed in the popup, defined with the `aria-haspopup` attribute on
69
64
  * the anchor element.
70
65
  * @type {string | undefined}
71
66
  * @see https://w3c.github.io/aria/#aria-haspopup
72
67
  */
73
- let contentType;
68
+ let contentType = $state();
74
69
  /**
75
70
  * Style to be applied to the content.
76
71
  * @type {import('svelte/store').Writable<any>}
@@ -86,17 +81,30 @@
86
81
  * Initialize the popup.
87
82
  */
88
83
  const init = () => {
89
- ({ open, style } = activatePopup(anchor, modal.dialog, position, positionBaseElement));
84
+ let openStore = writable(false);
85
+
86
+ ({ style, open: openStore } = activatePopup(
87
+ anchor,
88
+ dialogElement,
89
+ position,
90
+ positionBaseElement,
91
+ ));
92
+
93
+ openStore.subscribe((_open) => {
94
+ open = _open;
95
+ });
96
+
90
97
  contentType = anchor?.getAttribute('aria-haspopup') ?? undefined;
98
+ initialized = true;
91
99
  };
92
100
 
93
- $: {
94
- if (anchor && modal?.dialog) {
101
+ $effect(() => {
102
+ if (anchor && dialogElement && !initialized) {
95
103
  init();
96
104
  }
97
- }
105
+ });
98
106
 
99
- $: touch = touchOptimized && touchEnabled;
107
+ const touch = $derived(touchOptimized && touchEnabled);
100
108
 
101
109
  onMount(() => {
102
110
  touchEnabled = globalThis.matchMedia('(pointer: coarse)').matches;
@@ -104,21 +112,17 @@
104
112
  </script>
105
113
 
106
114
  <Modal
115
+ {...restProps}
116
+ bind:dialog={dialogElement}
107
117
  role="none"
108
118
  class="popup"
109
- bind:open={$open}
119
+ bind:open
110
120
  showBackdrop={showBackdrop ?? touch}
111
121
  lightDismiss={true}
112
122
  keepContent={true}
113
- bind:this={modal}
114
- {...$$restProps}
115
- on:opening
116
- on:open
117
- on:ok
118
- on:cancel
119
- on:closing
120
- on:close
121
- on:open={async () => {
123
+ onOpen={async (event) => {
124
+ onOpen?.(event);
125
+
122
126
  await sleep(100);
123
127
 
124
128
  if (!content) {
@@ -137,8 +141,8 @@
137
141
  }
138
142
  }}
139
143
  >
140
- <slot name="extra-content" slot="extra-content" />
141
144
  <div
145
+ bind:this={content}
142
146
  role="none"
143
147
  class="content {className} {contentType}"
144
148
  class:touch
@@ -148,9 +152,8 @@
148
152
  style:max-width={$style.maxWidth}
149
153
  style:max-height={$style.height}
150
154
  style:visibility={$style.inset ? undefined : 'hidden'}
151
- bind:this={content}
152
155
  >
153
- <slot />
156
+ {@render children?.()}
154
157
  </div>
155
158
  </Modal>
156
159
 
@@ -1,90 +1,102 @@
1
1
  export default Popup;
2
- type Popup = SvelteComponent<$$__sveltets_2_PropsWithChildren<{
3
- [x: string]: any;
4
- anchor: HTMLElement | undefined;
2
+ type Popup = SvelteComponent<ModalProps & Props & Record<string, any>, {
3
+ [evt: string]: CustomEvent<any>;
4
+ }, {}> & {
5
+ $$bindings?: "open" | "content" | undefined;
6
+ };
7
+ /** Generic popup helper. */
8
+ declare const Popup: $$__sveltets_2_IsomorphicComponent<import("../../typedefs").ModalProps & {
9
+ /**
10
+ * - The `class` attribute on the content element.
11
+ */
5
12
  class?: string | undefined;
6
- position?: PopupPosition | undefined;
7
- open?: Writable<boolean> | undefined;
8
- showBackdrop?: boolean | undefined;
13
+ /**
14
+ * - Whether to open the popup.
15
+ */
16
+ open?: boolean | undefined;
17
+ /**
18
+ * - A reference to the anchor element that opens the popup.
19
+ * Typically a `<button>`.
20
+ */
21
+ anchor: HTMLElement;
22
+ /**
23
+ * - A reference to the content element.
24
+ */
9
25
  content?: HTMLElement | undefined;
26
+ /**
27
+ * - Where to show the popup.
28
+ */
29
+ position?: import("../../typedefs").PopupPosition | undefined;
30
+ /**
31
+ * - The base element of
32
+ * {@link position}. If omitted, this will be {@link anchor}.
33
+ */
10
34
  positionBaseElement?: HTMLElement | undefined;
35
+ /**
36
+ * - Whether to show the popup at the center of the screen on
37
+ * mobile/tablet and ignore the defined dropdown `position`.
38
+ */
11
39
  touchOptimized?: boolean | undefined;
12
- }, {
13
- 'extra-content': {
14
- slot: string;
15
- };
16
- default: {};
17
- }>, {
18
- opening: CustomEvent<any>;
19
- open: CustomEvent<any>;
20
- ok: CustomEvent<any>;
21
- cancel: CustomEvent<any>;
22
- closing: CustomEvent<any>;
23
- close: CustomEvent<any>;
24
- } & {
40
+ /**
41
+ * - Primary slot content.
42
+ */
43
+ children?: import("svelte").Snippet<[]> | undefined;
44
+ /**
45
+ * - Extra slot content.
46
+ */
47
+ extraContent?: import("svelte").Snippet<[]> | undefined;
48
+ /**
49
+ * - Custom `Open` event handler.
50
+ */
51
+ onOpen?: ((event: CustomEvent) => void) | undefined;
52
+ } & Record<string, any>, {
25
53
  [evt: string]: CustomEvent<any>;
26
- }, {
27
- 'extra-content': {
28
- slot: string;
29
- };
30
- default: {};
31
- }> & {
32
- $$bindings?: string | undefined;
33
- } & {
34
- class: string;
35
- open: Writable<boolean>;
36
- showBackdrop: boolean;
37
- anchor: HTMLElement | undefined;
38
- content: HTMLElement | undefined;
39
- position: PopupPosition;
40
- positionBaseElement: HTMLElement | undefined;
41
- touchOptimized: boolean;
42
- };
43
- /** Generic popup helper. */
44
- declare const Popup: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
45
- [x: string]: any;
46
- anchor: HTMLElement | undefined;
54
+ }, {}, {}, "open" | "content">;
55
+ type Props = {
56
+ /**
57
+ * - The `class` attribute on the content element.
58
+ */
47
59
  class?: string | undefined;
48
- position?: import("../../typedefs").PopupPosition | undefined;
49
- open?: import("svelte/store").Writable<boolean> | undefined;
50
- showBackdrop?: boolean | undefined;
60
+ /**
61
+ * - Whether to open the popup.
62
+ */
63
+ open?: boolean | undefined;
64
+ /**
65
+ * - A reference to the anchor element that opens the popup.
66
+ * Typically a `<button>`.
67
+ */
68
+ anchor: HTMLElement;
69
+ /**
70
+ * - A reference to the content element.
71
+ */
51
72
  content?: HTMLElement | undefined;
73
+ /**
74
+ * - Where to show the popup.
75
+ */
76
+ position?: import("../../typedefs").PopupPosition | undefined;
77
+ /**
78
+ * - The base element of
79
+ * {@link position}. If omitted, this will be {@link anchor}.
80
+ */
52
81
  positionBaseElement?: HTMLElement | undefined;
82
+ /**
83
+ * - Whether to show the popup at the center of the screen on
84
+ * mobile/tablet and ignore the defined dropdown `position`.
85
+ */
53
86
  touchOptimized?: boolean | undefined;
54
- }, {
55
- 'extra-content': {
56
- slot: string;
57
- };
58
- default: {};
59
- }>, {
60
- opening: CustomEvent<any>;
61
- open: CustomEvent<any>;
62
- ok: CustomEvent<any>;
63
- cancel: CustomEvent<any>;
64
- closing: CustomEvent<any>;
65
- close: CustomEvent<any>;
66
- } & {
67
- [evt: string]: CustomEvent<any>;
68
- }, {
69
- 'extra-content': {
70
- slot: string;
71
- };
72
- default: {};
73
- }, {
74
- class: string;
75
- open: import("svelte/store").Writable<boolean>;
76
- showBackdrop: boolean;
77
- anchor: HTMLElement | undefined;
78
- content: HTMLElement | undefined;
79
- position: import("../../typedefs").PopupPosition;
80
- positionBaseElement: HTMLElement | undefined;
81
- touchOptimized: boolean;
82
- }, string>;
83
- type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
84
- default: any;
85
- } ? Props extends Record<string, never> ? any : {
86
- children?: any;
87
- } : {});
87
+ /**
88
+ * - Primary slot content.
89
+ */
90
+ children?: import("svelte").Snippet<[]> | undefined;
91
+ /**
92
+ * - Extra slot content.
93
+ */
94
+ extraContent?: import("svelte").Snippet<[]> | undefined;
95
+ /**
96
+ * - Custom `Open` event handler.
97
+ */
98
+ onOpen?: ((event: CustomEvent) => void) | undefined;
99
+ };
88
100
  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> {
89
101
  new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
90
102
  $$bindings?: Bindings;
@@ -67,7 +67,7 @@ class Group {
67
67
  * @todo Check for added elements probably with `MutationObserver`.
68
68
  */
69
69
  constructor(parent, { clickToSelect = true } = {}) {
70
- parent.dispatchEvent(new CustomEvent('initializing'));
70
+ parent.dispatchEvent(new CustomEvent('Initializing'));
71
71
 
72
72
  this.parent = parent;
73
73
  this.role = /** @type {string} */ (parent.getAttribute('role'));
@@ -148,7 +148,7 @@ class Group {
148
148
  this.onKeyDown(event);
149
149
  });
150
150
 
151
- parent.dispatchEvent(new CustomEvent('initialized'));
151
+ parent.dispatchEvent(new CustomEvent('Initialized'));
152
152
  }
153
153
 
154
154
  /**
@@ -252,11 +252,11 @@ class Group {
252
252
  if (multiSelect && isTarget && (selectByClick || selectByKeydown)) {
253
253
  element.setAttribute(this.childSelectedAttr, String(!isSelected));
254
254
  element.dispatchEvent(
255
- new CustomEvent('change', { detail: { [this.childSelectedProp]: !isSelected } }),
255
+ new CustomEvent('Change', { detail: { [this.childSelectedProp]: !isSelected } }),
256
256
  );
257
257
 
258
258
  if (!isSelected) {
259
- element.dispatchEvent(new CustomEvent('select'));
259
+ element.dispatchEvent(new CustomEvent('Select'));
260
260
  }
261
261
  }
262
262
 
@@ -267,11 +267,11 @@ class Group {
267
267
  ) {
268
268
  element.setAttribute(this.childSelectedAttr, String(isTarget));
269
269
  element.dispatchEvent(
270
- new CustomEvent('change', { detail: { [this.childSelectedProp]: isTarget } }),
270
+ new CustomEvent('Change', { detail: { [this.childSelectedProp]: isTarget } }),
271
271
  );
272
272
 
273
273
  if (isTarget) {
274
- element.dispatchEvent(new CustomEvent('select'));
274
+ element.dispatchEvent(new CustomEvent('Select'));
275
275
  }
276
276
  }
277
277
 
@@ -282,14 +282,14 @@ class Group {
282
282
 
283
283
  if (isTarget) {
284
284
  element.focus();
285
- element.dispatchEvent(new CustomEvent('focus'));
285
+ element.dispatchEvent(new CustomEvent('Focus'));
286
286
  }
287
287
  });
288
288
  } else {
289
289
  element.classList.toggle('focused', isTarget);
290
290
 
291
291
  if (isTarget) {
292
- element.dispatchEvent(new CustomEvent('focus'));
292
+ element.dispatchEvent(new CustomEvent('Focus'));
293
293
  }
294
294
  }
295
295
 
@@ -326,7 +326,7 @@ class Group {
326
326
  });
327
327
 
328
328
  this.parent.dispatchEvent(
329
- new CustomEvent('change', {
329
+ new CustomEvent('Change', {
330
330
  detail: {
331
331
  value: /** @type {any} */ (newTarget).value,
332
332
  name: /** @type {any} */ (newTarget).name,
@@ -481,14 +481,14 @@ class Group {
481
481
 
482
482
  const hidden = !_terms.every((term) => searchValue.includes(term));
483
483
 
484
- member.dispatchEvent(new CustomEvent('toggle', { detail: { hidden } }));
484
+ member.dispatchEvent(new CustomEvent('Toggle', { detail: { hidden } }));
485
485
 
486
486
  return hidden;
487
487
  })
488
488
  .filter((hidden) => !hidden).length;
489
489
 
490
490
  this.parent.dispatchEvent(
491
- new CustomEvent('filter', { detail: { matched, total: this.allMembers.length } }),
491
+ new CustomEvent('Filter', { detail: { matched, total: this.allMembers.length } }),
492
492
  );
493
493
  }
494
494
  }
@@ -499,7 +499,6 @@ class Group {
499
499
  * @param {object} [params] - Action params.
500
500
  * @returns {import('svelte/action').ActionReturn} Action.
501
501
  */
502
- // eslint-disable-next-line no-unused-vars
503
502
  export const activateGroup = (parent, params) => {
504
503
  const group = new Group(parent, params);
505
504
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { generateElementId } from '@sveltia/utils/element';
4
4
  import { sleep } from '@sveltia/utils/misc';
5
+ import { on } from 'svelte/events';
5
6
  import { get, writable } from 'svelte/store';
6
7
 
7
8
  /**
@@ -124,13 +125,13 @@ class Popup {
124
125
  this.anchorElement.setAttribute('aria-controls', this.id);
125
126
  this.popupElement.setAttribute('id', this.id);
126
127
 
127
- this.anchorElement.addEventListener('click', () => {
128
+ on(anchorElement, 'click', () => {
128
129
  if (!this.isDisabled && !this.isReadOnly) {
129
130
  this.open.set(!get(this.open));
130
131
  }
131
132
  });
132
133
 
133
- this.anchorElement.addEventListener('keydown', (event) => {
134
+ on(anchorElement, 'keydown', (event) => {
134
135
  const { key, ctrlKey, metaKey, shiftKey, altKey } = event;
135
136
  const hasModifier = shiftKey || altKey || ctrlKey || metaKey;
136
137
 
@@ -141,7 +142,7 @@ class Popup {
141
142
  }
142
143
  });
143
144
 
144
- this.anchorElement.addEventListener('transitionstart', () => {
145
+ on(anchorElement, 'transitionstart', () => {
145
146
  if (this.anchorElement.closest('.hiding, .hidden, [hidden]')) {
146
147
  this.hideImmediately();
147
148
  }
@@ -154,7 +155,7 @@ class Popup {
154
155
  }).observe(this.anchorElement);
155
156
 
156
157
  // Close the popup when the backdrop, a menu item or an option is clicked
157
- this.popupElement.addEventListener('click', (event) => {
158
+ on(this.popupElement, 'click', (event) => {
158
159
  event.stopPropagation();
159
160
 
160
161
  // eslint-disable-next-line prefer-destructuring
@@ -168,7 +169,7 @@ class Popup {
168
169
  }
169
170
  });
170
171
 
171
- this.popupElement.addEventListener('keydown', (event) => {
172
+ on(this.popupElement, 'keydown', (event) => {
172
173
  const { key, ctrlKey, metaKey, shiftKey, altKey } = event;
173
174
  const hasModifier = shiftKey || altKey || ctrlKey || metaKey;
174
175