milk-lib 0.0.50 → 0.0.52

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.
@@ -5,7 +5,7 @@
5
5
  import { clickOutsideObject } from "../..";
6
6
  import type { IMenuProps } from "./Menu.types";
7
7
 
8
- let {
8
+ let {
9
9
  hideMenu,
10
10
  parentElement,
11
11
  menuGap = 6,
@@ -16,6 +16,7 @@
16
16
  width = 0,
17
17
  fullWidth,
18
18
  minWidth = 320,
19
+ animate = false,
19
20
  id,
20
21
  children
21
22
  }: IMenuProps = $props();
@@ -31,7 +32,15 @@
31
32
  };
32
33
 
33
34
  const mouseLeaveHandler = (e: MouseEvent) => {
34
- if ((e.relatedTarget !== parentElement) && appearanceOnHover) {
35
+ if (!appearanceOnHover) return;
36
+
37
+ const nextTarget = e.relatedTarget as Node | null;
38
+ if (!nextTarget) {
39
+ hideMenu();
40
+ return;
41
+ }
42
+
43
+ if (!parentElement?.contains(nextTarget) && !menuElement?.contains(nextTarget)) {
35
44
  hideMenu();
36
45
  }
37
46
  };
@@ -70,26 +79,25 @@
70
79
 
71
80
  <svelte:window bind:innerWidth bind:innerHeight bind:scrollY />
72
81
 
73
- {#if isVisible}
74
- <div
75
- {id}
76
- role="menu"
77
- tabindex="0"
78
- onmouseleave={mouseLeaveHandler}
79
- bind:this={menuElement}
80
- class="Menu"
81
- style={`
82
- top: ${y}px;
83
- width: ${fullWidth ? '100%' : width ? width + "px" : "auto"};
84
- min-width: ${minWidth ? minWidth + "px" : "auto"};
85
- max-height: ${maxHeight}px;
86
- `}
87
- >
88
- <div style={`padding-top: ${menuGap}px`}>
89
- {@render children()}
90
- </div>
82
+ <div
83
+ {id}
84
+ role="menu"
85
+ tabindex={isVisible ? 0 : -1}
86
+ aria-hidden={!isVisible}
87
+ onmouseleave={mouseLeaveHandler}
88
+ bind:this={menuElement}
89
+ class={`Menu ${isVisible ? "Menu-open" : "Menu-closed"} ${animate ? "Menu-animate" : ""}`}
90
+ style={`
91
+ top: ${y}px;
92
+ width: ${fullWidth ? '100%' : width ? width + "px" : "auto"};
93
+ min-width: ${minWidth ? minWidth + "px" : "auto"};
94
+ max-height: ${maxHeight}px;
95
+ `}
96
+ >
97
+ <div style={`padding-top: ${menuGap}px`}>
98
+ {@render children()}
91
99
  </div>
92
- {/if}
100
+ </div>
93
101
 
94
102
  <style>
95
103
  .Menu {
@@ -105,10 +113,37 @@
105
113
  gap: 0;
106
114
  justify-content: space-between;
107
115
  cursor: default;
116
+ transform-origin: top;
117
+ opacity: 0;
118
+ visibility: hidden;
119
+ pointer-events: none;
120
+ transform: translateY(-8px) scale(0.98);
108
121
 
109
122
  &:focus-visible {
110
123
  outline: none;
111
124
  }
112
125
  }
113
126
 
114
- </style>
127
+ .Menu.Menu-animate {
128
+ transition: opacity .22s ease-out, transform .22s ease-out, visibility 0s linear .22s;
129
+ }
130
+
131
+ .Menu.Menu-animate.Menu-open {
132
+ transition-delay: 0s;
133
+ }
134
+
135
+ .Menu.Menu-open {
136
+ opacity: 1;
137
+ visibility: visible;
138
+ pointer-events: auto;
139
+ transform: translateY(0);
140
+ }
141
+
142
+ .Menu.Menu-closed {
143
+ opacity: 0;
144
+ visibility: hidden;
145
+ pointer-events: none;
146
+ transform: translateY(-8px);
147
+ }
148
+
149
+ </style>
@@ -10,6 +10,7 @@ export interface IMenuProps {
10
10
  width?: number;
11
11
  minWidth?: number;
12
12
  fullWidth?: boolean;
13
+ animate?: boolean;
13
14
  id?: string;
14
15
  children: Snippet;
15
16
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "milk-lib",
3
3
  "license": "MIT",
4
- "version": "0.0.50",
4
+ "version": "0.0.52",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
7
7
  "build": "vite build && npm run prepack",