@neovici/cosmoz-dropdown 7.4.2 → 7.5.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.
@@ -85,27 +85,31 @@ const style = css `
85
85
  }
86
86
  `;
87
87
  const CosmozDropdownNext = (host) => {
88
- const { placement = 'bottom span-right', openOnHover, openOnFocus } = host;
88
+ const { placement = 'bottom span-right', disabled, openOnHover, openOnFocus, } = host;
89
89
  const popoverRef = useRef();
90
90
  const [opened, setOpened] = useProperty('opened', false);
91
91
  // Call showPopover/hidePopover synchronously so the browser associates
92
92
  // the popover with the current user-gesture. Deferring to a microtask
93
93
  // (useEffect) causes light-dismiss to immediately close the popover.
94
94
  const open = useCallback(() => {
95
+ if (disabled)
96
+ return;
95
97
  setOpened(true);
96
98
  popoverRef.current?.showPopover();
97
- }, []);
99
+ }, [disabled]);
98
100
  const close = useCallback(() => {
99
101
  setOpened(false);
100
102
  popoverRef.current?.hidePopover();
101
103
  }, []);
102
104
  const toggle = useCallback(() => {
105
+ if (disabled)
106
+ return;
103
107
  const popover = popoverRef.current;
104
108
  if (popover?.matches(':popover-open'))
105
109
  close();
106
110
  else
107
111
  open();
108
- }, []);
112
+ }, [disabled]);
109
113
  // Sync native popover when `opened` is set externally via property binding
110
114
  useEffect(() => {
111
115
  const popover = popoverRef.current;
@@ -122,6 +126,7 @@ const CosmozDropdownNext = (host) => {
122
126
  const { scheduleClose, cancelClose } = useAutoOpen({
123
127
  host,
124
128
  popoverRef,
129
+ disabled,
125
130
  openOnHover,
126
131
  openOnFocus,
127
132
  open,
@@ -156,6 +161,11 @@ const CosmozDropdownNext = (host) => {
156
161
  };
157
162
  customElements.define('cosmoz-dropdown-next', component(CosmozDropdownNext, {
158
163
  styleSheets: [style],
159
- observedAttributes: ['placement', 'open-on-hover', 'open-on-focus'],
164
+ observedAttributes: [
165
+ 'placement',
166
+ 'disabled',
167
+ 'open-on-hover',
168
+ 'open-on-focus',
169
+ ],
160
170
  shadowRootInit: { mode: 'open', delegatesFocus: true },
161
171
  }));
@@ -3,12 +3,13 @@ interface UseAutoOpenOptions {
3
3
  popoverRef: {
4
4
  current?: HTMLElement;
5
5
  };
6
+ disabled?: boolean;
6
7
  openOnHover?: boolean;
7
8
  openOnFocus?: boolean;
8
9
  open: () => void;
9
10
  close: () => void;
10
11
  }
11
- export declare const useAutoOpen: ({ host, popoverRef, openOnHover, openOnFocus, open, close, }: UseAutoOpenOptions) => {
12
+ export declare const useAutoOpen: ({ host, popoverRef, disabled, openOnHover, openOnFocus, open, close, }: UseAutoOpenOptions) => {
12
13
  scheduleClose: () => void;
13
14
  cancelClose: () => void;
14
15
  };
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useRef } from '@pionjs/pion';
2
- export const useAutoOpen = ({ host, popoverRef, openOnHover, openOnFocus, open, close, }) => {
2
+ export const useAutoOpen = ({ host, popoverRef, disabled, openOnHover, openOnFocus, open, close, }) => {
3
3
  const closeTimeout = useRef();
4
4
  const cancelClose = () => clearTimeout(closeTimeout.current);
5
5
  const scheduleClose = () => {
@@ -17,12 +17,14 @@ export const useAutoOpen = ({ host, popoverRef, openOnHover, openOnFocus, open,
17
17
  }, 100);
18
18
  };
19
19
  const handleEnter = () => {
20
+ if (disabled)
21
+ return;
20
22
  cancelClose();
21
23
  open();
22
24
  };
23
25
  // Auto-open on hover
24
26
  useEffect(() => {
25
- if (!openOnHover)
27
+ if (!openOnHover || disabled)
26
28
  return;
27
29
  host.addEventListener('pointerenter', handleEnter);
28
30
  host.addEventListener('pointerleave', scheduleClose);
@@ -31,10 +33,10 @@ export const useAutoOpen = ({ host, popoverRef, openOnHover, openOnFocus, open,
31
33
  host.removeEventListener('pointerenter', handleEnter);
32
34
  host.removeEventListener('pointerleave', scheduleClose);
33
35
  };
34
- }, [openOnHover, host]);
36
+ }, [openOnHover, disabled, host]);
35
37
  // Auto-open on focus
36
38
  useEffect(() => {
37
- if (!openOnFocus)
39
+ if (!openOnFocus || disabled)
38
40
  return;
39
41
  host.addEventListener('focusin', handleEnter);
40
42
  host.addEventListener('focusout', scheduleClose);
@@ -43,6 +45,6 @@ export const useAutoOpen = ({ host, popoverRef, openOnHover, openOnFocus, open,
43
45
  host.removeEventListener('focusin', handleEnter);
44
46
  host.removeEventListener('focusout', scheduleClose);
45
47
  };
46
- }, [openOnFocus, host]);
48
+ }, [openOnFocus, disabled, host]);
47
49
  return { scheduleClose, cancelClose };
48
50
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neovici/cosmoz-dropdown",
3
- "version": "7.4.2",
3
+ "version": "7.5.0",
4
4
  "description": "A simple dropdown web component",
5
5
  "keywords": [
6
6
  "lit-html",