@nativetail/ui 0.1.0 → 0.1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nativetail/ui",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "",
5
5
  "main": "src/index.ts",
6
6
  "scripts": {},
@@ -1,5 +1,3 @@
1
- import { BlurView } from "expo-blur";
2
- import { AnimatePresence } from "moti";
3
1
  import {
4
2
  mergeClasses,
5
3
  Pressable,
@@ -7,6 +5,7 @@ import {
7
5
  useTw,
8
6
  View,
9
7
  } from "@nativetail/core";
8
+ import { AnimatePresence } from "moti";
10
9
  import React, {
11
10
  ReactNode,
12
11
  useCallback,
@@ -20,6 +19,8 @@ import {
20
19
  Modal,
21
20
  View as NativeView,
22
21
  StatusBar,
22
+ useWindowDimensions,
23
+ ViewStyle,
23
24
  } from "react-native";
24
25
  import { Blur } from "../blur";
25
26
 
@@ -28,6 +29,7 @@ type PositionType = {
28
29
  height: number;
29
30
  top: number;
30
31
  left: number;
32
+ right: number;
31
33
  bottom: number;
32
34
  };
33
35
  type DropdownState = {
@@ -97,12 +99,14 @@ const DropdownTrigger = ({
97
99
  const top = isFull ? 20 : height + pageY + 2;
98
100
  const bottom = H - top + height;
99
101
  const left = I18nManager.isRTL ? W - width - pageX : pageX;
102
+ const right = W - left - width;
100
103
 
101
104
  setPosition({
102
105
  width: Math.floor(width),
103
106
  top: Math.floor(top + statusBarHeight),
104
107
  bottom: Math.floor(bottom - statusBarHeight),
105
108
  left: Math.floor(left),
109
+ right: Math.floor(right),
106
110
  height: Math.floor(height),
107
111
  });
108
112
  });
@@ -142,7 +146,24 @@ const DropdownMenu = ({
142
146
  const top = position?.top || 0;
143
147
  const menuX = left;
144
148
  const menuY = top;
149
+ const width = position?.width || 0;
150
+ const screen = useWindowDimensions();
151
+ const tw = useTw();
152
+ const style = tw`${className}`;
153
+ const styleWidth = !isNaN(Number(style?.width)) ? Number(style?.width) : 0;
154
+ const menuWidth = styleWidth || width || 0;
155
+ const isEndOfScreen = screen.width - menuX < menuWidth;
156
+ const menuStyle: ViewStyle = {
157
+ top: menuY,
158
+ left: menuX,
159
+ transformOrigin: "top left",
160
+ };
161
+ if (isEndOfScreen) {
162
+ menuStyle.left = menuX - menuWidth + width;
163
+ menuStyle.transformOrigin = "top right";
164
+ }
145
165
  const [modalOpen, setModalOpen] = useState(isOpen);
166
+
146
167
  useEffect(() => {
147
168
  if (isOpen) {
148
169
  setModalOpen(true);
@@ -164,7 +185,6 @@ const DropdownMenu = ({
164
185
  setModalOpen(false);
165
186
  }
166
187
  }, [isOpen]);
167
- const tw = useTw();
168
188
  const renderChildren = useCallback(() => {
169
189
  return React.Children.map(children, (child, index) => {
170
190
  return React.cloneElement(child as any, {
@@ -186,18 +206,14 @@ const DropdownMenu = ({
186
206
  {isOpen && (
187
207
  <View
188
208
  className={mergeClasses(
189
- "absolute in:scale-0 scale-100 out:scale-0 overflow-hidden z-10 bg-card/95 rounded-xl max-w-xs w-full border border-muted/15",
209
+ "absolute in:scale-0 scale-100 out:scale-0 overflow-hidden z-10 bg-card/95 rounded-xl border border-muted/15",
210
+ width ? `w-[${width}px]` : "",
190
211
  className
191
212
  )}
192
213
  onDidAnimate={onDidAnimate}
193
- style={{
194
- top: menuY,
195
- left: menuX,
196
- transformOrigin: "top left",
197
- }}
214
+ style={menuStyle}
198
215
  animated
199
216
  print
200
- id={"1"}
201
217
  >
202
218
  {useBlur && (
203
219
  <Blur style={tw`absolute top-0 left-0 rounded-xl flex-1 `} />