@admin-layout/tailwind-design-pro 12.2.5-alpha.10 → 12.2.5-alpha.16

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.
@@ -1 +1 @@
1
- {"version":3,"file":"BottomMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/Layout/Sidebar/BottomMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA2BhD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAwRhD,CAAC"}
1
+ {"version":3,"file":"BottomMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/Layout/Sidebar/BottomMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAQpE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAkChD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAsThD,CAAC"}
@@ -1,4 +1,4 @@
1
- import React__default,{useState,useRef,useEffect}from'react';import {Link}from'@remix-run/react';import {useAppSelector}from'@admin-layout/client';import {generateMenuPath}from'../util.js';import {renderDynamicIcon}from'../../../helpers/DynamicIcon.js';import {MenuDynamicDialog}from'./MenuDynamicDialog.js';// Smooth entrance for the account/user dropdown — matches the rail's motion language.
1
+ import React__default,{useState,useRef,useEffect,useMemo}from'react';import {createPortal}from'react-dom';import {Link}from'@remix-run/react';import {useAppSelector}from'@admin-layout/client';import {generateMenuPath}from'../util.js';import {isSignedInProfile,accountMenuSections}from'../../../utils/accountMenu.js';import {renderDynamicIcon}from'../../../helpers/DynamicIcon.js';import {MenuDynamicDialog}from'./MenuDynamicDialog.js';// Smooth entrance for the account/user dropdown — matches the rail's motion language.
2
2
  // transform/opacity/filter only; honors prefers-reduced-motion.
3
3
  const BOTTOM_MENU_MOTION_CSS = `
4
4
  @keyframes qlBottomDropdownIn {
@@ -22,6 +22,10 @@ const BOTTOM_MENU_MOTION_CSS = `
22
22
  .ql-bm-item { animation: none; opacity: 1; }
23
23
  }
24
24
  `;
25
+ /** Width of the dropdown (Tailwind `w-72`), used to keep it inside the viewport. */
26
+ const DROPDOWN_WIDTH = 288;
27
+ /** Gap between the avatar and the dropdown, and between the dropdown and the viewport edge. */
28
+ const DROPDOWN_GAP = 8;
25
29
  const BottomMenu = ({
26
30
  menuData,
27
31
  routeParams,
@@ -32,10 +36,11 @@ const BottomMenu = ({
32
36
  isMobile,
33
37
  picture
34
38
  }) => {
35
- const [MenusList, setMenusList] = useState();
36
39
  const [isOpen, setIsOpen] = useState(false);
40
+ const [anchor, setAnchor] = useState(null);
37
41
  const [openedModalKey, setOpenedModalKey] = React__default.useState(null);
38
42
  const menuRef = useRef(null);
43
+ const dropdownRef = useRef(null);
39
44
  const {
40
45
  t
41
46
  } = {
@@ -49,17 +54,33 @@ const BottomMenu = ({
49
54
  nickname,
50
55
  picture: profilePicture
51
56
  } = profile;
52
- const onOpen = () => setIsOpen(true);
57
+ // Not `!!profile`: the fallback above is `{}`, truthy for a signed-out visitor too.
58
+ const isSignedIn = isSignedInProfile(userState?.profile);
59
+ // The dropdown is portaled to <body> (see below), so it is placed against the avatar here:
60
+ // opening upward from it, never past the viewport's top or right edge.
61
+ const measureAnchor = () => {
62
+ const rect = menuRef.current?.getBoundingClientRect();
63
+ if (!rect) return;
64
+ setAnchor({
65
+ left: Math.max(DROPDOWN_GAP, Math.min(rect.left, window.innerWidth - DROPDOWN_WIDTH - DROPDOWN_GAP)),
66
+ bottom: window.innerHeight - rect.top + DROPDOWN_GAP,
67
+ maxHeight: rect.top - DROPDOWN_GAP * 2
68
+ });
69
+ };
70
+ const onOpen = () => {
71
+ measureAnchor();
72
+ setIsOpen(true);
73
+ };
53
74
  const onClose = () => setIsOpen(false);
54
- const toggleMenu = () => setIsOpen(!isOpen);
75
+ const toggleMenu = () => isOpen ? onClose() : onOpen();
55
76
  const accountMenuItems = menuData?.find(menu => menu.key === 'account');
56
77
  const logoutMenuItems = menuData?.filter(menu => menu.key === 'logout.modal');
57
78
  // Handle outside clicks to close the menu
58
79
  useEffect(() => {
59
80
  const handleClickOutside = event => {
60
- if (menuRef.current && !menuRef.current.contains(event.target)) {
61
- setIsOpen(false);
62
- }
81
+ const target = event.target;
82
+ if (menuRef.current?.contains(target) || dropdownRef.current?.contains(target)) return;
83
+ setIsOpen(false);
63
84
  };
64
85
  // Handle escape key to close the menu
65
86
  const handleEscKey = event => {
@@ -70,24 +91,24 @@ const BottomMenu = ({
70
91
  if (isOpen) {
71
92
  document.addEventListener('mousedown', handleClickOutside);
72
93
  document.addEventListener('keydown', handleEscKey);
94
+ window.addEventListener('resize', measureAnchor);
95
+ // Capture phase: the avatar moves with any scrolling ancestor, not only the window.
96
+ window.addEventListener('scroll', measureAnchor, true);
73
97
  }
74
98
  return () => {
75
99
  document.removeEventListener('mousedown', handleClickOutside);
76
100
  document.removeEventListener('keydown', handleEscKey);
101
+ window.removeEventListener('resize', measureAnchor);
102
+ window.removeEventListener('scroll', measureAnchor, true);
77
103
  };
78
104
  }, [isOpen]);
79
- const newMenuData = menuData?.filter(m => !m.hideInMenu)?.map(m => {
80
- if (!m.hideInMenu) {
81
- const path = generateMenuPath(m.path, routeParams);
82
- return {
83
- ...m,
84
- path
85
- };
86
- }
87
- });
88
- useEffect(() => {
89
- setMenusList(getMenuSeparation(newMenuData));
90
- }, [authorities]);
105
+ const MenusList = useMemo(() => {
106
+ const newMenuData = menuData?.filter(m => !m.hideInMenu)?.map(m => ({
107
+ ...m,
108
+ path: generateMenuPath(m.path, routeParams)
109
+ }));
110
+ return accountMenuSections(getMenuSeparation(newMenuData), isSignedIn);
111
+ }, [menuData, routeParams, getMenuSeparation, isSignedIn]);
91
112
  const conversionPath = path => {
92
113
  if (path && path.indexOf('http') === 0) {
93
114
  return path;
@@ -191,7 +212,8 @@ const BottomMenu = ({
191
212
  className: `
192
213
  inline-flex items-center justify-center bg-muted hover:bg-muted-foreground text-foreground rounded-full h-12 w-12 min-w-[48px] outline-none transform transition-colors duration-200
193
214
  `,
194
- "aria-expanded": "false"
215
+ "aria-haspopup": "menu",
216
+ "aria-expanded": isOpen
195
217
  }, picture ? React__default.createElement("img", {
196
218
  src: picture,
197
219
  className: "rounded-full",
@@ -209,12 +231,16 @@ const BottomMenu = ({
209
231
  d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
210
232
  }))), isMobile && React__default.createElement("span", {
211
233
  className: "text-lg font-medium"
212
- }, t(nickname))), isOpen && React__default.createElement("div", {
213
- className: "ql-bottom-dropdown bg-background absolute bottom-full mb-2 w-72 rounded-themed shadow-themed-lg py-1 themed-dropdown ring-1 ring-border focus:outline-none z-40",
234
+ }, t(nickname))), isOpen && anchor && createPortal(React__default.createElement("div", {
235
+ ref: dropdownRef,
236
+ className: "ql-bottom-dropdown bg-background fixed w-72 overflow-y-auto rounded-themed shadow-themed-lg py-1 themed-dropdown ring-1 ring-border focus:outline-none z-[999]",
214
237
  role: "menu",
215
238
  "aria-orientation": "vertical",
216
239
  "aria-labelledby": "user-menu",
217
240
  style: {
241
+ left: anchor.left,
242
+ bottom: anchor.bottom,
243
+ maxHeight: anchor.maxHeight,
218
244
  transformOrigin: 'bottom left'
219
245
  }
220
246
  }, React__default.createElement("style", {
@@ -229,7 +255,7 @@ const BottomMenu = ({
229
255
  }), MenusList?.middleMenus?.map((item, k) => React__default.createElement("div", {
230
256
  key: k,
231
257
  className: "px-1 py-1"
232
- }, item.modal ? getMenuItemModal(item) : getMenuItemPath(item))), profile && accountMenuItems?.children && React__default.createElement("div", {
258
+ }, item.modal ? getMenuItemModal(item) : getMenuItemPath(item))), isSignedIn && accountMenuItems?.children && React__default.createElement("div", {
233
259
  className: "py-2"
234
260
  }, accountMenuItems.children.map((item, idx) => React__default.createElement(Link, {
235
261
  key: item.key,
@@ -244,14 +270,14 @@ const BottomMenu = ({
244
270
  className: "mr-3 text-base"
245
271
  }, item.icon), React__default.createElement("span", null, item.name)), item.hasNotification && React__default.createElement("div", {
246
272
  className: "w-2 h-2 bg-blue-500 rounded-full"
247
- })))), profile && accountMenuItems?.children && React__default.createElement("hr", {
273
+ })))), isSignedIn && accountMenuItems?.children && React__default.createElement("hr", {
248
274
  className: "border-border my-1"
249
- }), logoutMenuItems?.map((item, k) => React__default.createElement("div", {
275
+ }), isSignedIn && logoutMenuItems?.map((item, k) => React__default.createElement("div", {
250
276
  key: k,
251
277
  className: "px-1 py-1"
252
- }, item.modal ? getMenuItemModal(item) : getMenuItemPath(item))), profile && logoutMenuItems?.length > 0 && React__default.createElement("hr", {
278
+ }, item.modal ? getMenuItemModal(item) : getMenuItemPath(item))), isSignedIn && logoutMenuItems?.length > 0 && React__default.createElement("hr", {
253
279
  className: "border-border my-1"
254
- }), profile && React__default.createElement("div", {
280
+ }), isSignedIn && React__default.createElement("div", {
255
281
  className: "flex items-center px-4 py-2"
256
282
  }, React__default.createElement("div", {
257
283
  className: "w-8 h-8 rounded-full bg-red-500 flex items-center justify-center overflow-hidden mr-3"
@@ -263,5 +289,5 @@ const BottomMenu = ({
263
289
  className: "text-white text-sm font-medium"
264
290
  }, (nickname || 'Guest').charAt(0).toUpperCase())), React__default.createElement("span", {
265
291
  className: "text-sm font-medium"
266
- }, nickname || 'Guest')))), getMenuModals());
292
+ }, nickname || 'Guest'))), document.body)), getMenuModals());
267
293
  };export{BottomMenu};//# sourceMappingURL=BottomMenu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BottomMenu.js","sources":["../../../../src/components/Layout/Sidebar/BottomMenu.tsx"],"sourcesContent":[null],"names":["React","RouterLink"],"mappings":"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"}
1
+ {"version":3,"file":"BottomMenu.js","sources":["../../../../src/components/Layout/Sidebar/BottomMenu.tsx"],"sourcesContent":[null],"names":["React"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=accountMenu.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountMenu.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/accountMenu.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { SeparateMenusTypes } from '@admin-layout/client';
2
+ /** The permission a signed-out visitor holds; the sign-up and log-in entries are scoped to it. */
3
+ export declare const GUEST_AUTHORITY = "account.user.guest";
4
+ /** A signed-out visitor has no user profile: the store holds none, or an empty object. */
5
+ export declare const isSignedInProfile: (profile: unknown) => boolean;
6
+ /**
7
+ * The entries the account menu lists. Signed in, every section as given. Signed out, only the
8
+ * entries made for signed-out visitors (sign up, log in): everything else needs an account, so
9
+ * offering it to a guest only sent them to the login page by a longer road.
10
+ */
11
+ export declare function accountMenuSections(sections: SeparateMenusTypes, signedIn: boolean): SeparateMenusTypes;
12
+ //# sourceMappingURL=accountMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountMenu.d.ts","sourceRoot":"","sources":["../../src/utils/accountMenu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,kGAAkG;AAClG,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,GAAI,SAAS,OAAO,KAAG,OAC0B,CAAC;AAKhF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,GAAG,kBAAkB,CAQvG"}
@@ -0,0 +1,19 @@
1
+ /** The permission a signed-out visitor holds; the sign-up and log-in entries are scoped to it. */
2
+ const GUEST_AUTHORITY = 'account.user.guest';
3
+ /** A signed-out visitor has no user profile: the store holds none, or an empty object. */
4
+ const isSignedInProfile = profile => !!profile && typeof profile === 'object' && Object.keys(profile).length > 0;
5
+ const isGuestEntry = item => Array.isArray(item?.authority) && item.authority.includes(GUEST_AUTHORITY);
6
+ /**
7
+ * The entries the account menu lists. Signed in, every section as given. Signed out, only the
8
+ * entries made for signed-out visitors (sign up, log in): everything else needs an account, so
9
+ * offering it to a guest only sent them to the login page by a longer road.
10
+ */
11
+ function accountMenuSections(sections, signedIn) {
12
+ if (signedIn) return sections;
13
+ return {
14
+ upperMenus: sections?.upperMenus?.filter(isGuestEntry) ?? [],
15
+ middleMenus: sections?.middleMenus?.filter(isGuestEntry) ?? [],
16
+ lowerMenus: sections?.lowerMenus?.filter(isGuestEntry) ?? [],
17
+ bottomMenus: sections?.bottomMenus?.filter(isGuestEntry) ?? []
18
+ };
19
+ }export{GUEST_AUTHORITY,accountMenuSections,isSignedInProfile};//# sourceMappingURL=accountMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountMenu.js","sources":["../../src/utils/accountMenu.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA;AACO,MAAM,eAAe,GAAG;AAE/B;AACO,MAAM,iBAAiB,GAAG,OAAC,IAA2B,CAAE,CAC3D,OAAE,IAAO,OAAI,OAAO,KAAO,QAAK,IAAQ,MAAI,CAAA,IAAO,CAAA,OAAK,CAAA,CAAO,MAAE,GAAM;AAE3E,MAAM,YAAY,GAAG,IAAC,SAClB,CAAA,OAAM,CAAA,IAAQ,EAAI,SAAE,CAAA,IAAU,IAAI,CAAA,SAAK,CAAA,QAAU,CAAA,eAAS,CAAA;AAE9D;;;;AAIG;AACG,SAAU,mBAAmB,CAAC,QAA4B,EAAE,QAAiB,EAAA;AAC/E,EAAA,IAAA,QAAI,EAAQ,OAAA,QAAA;AAAE,EAAA,OAAA;IACd,UAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,CAAA,YAAA,CAAA,IAAA,EAAA;eACH,EAAA,QAAY,EAAA,WAAU,EAAU,mBAAS,CAAA,IAAa,EAAI;cAC1D,EAAA,QAAa,EAAA,UAAU,EAAA,MAAa,aAAO,CAAA,IAAA,EAAa;eACxD,EAAA,QAAY,EAAA,WAAU,EAAU,mBAAS,CAAA,IAAa;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@admin-layout/tailwind-design-pro",
3
- "version": "12.2.5-alpha.10",
3
+ "version": "12.2.5-alpha.16",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "CDMBase LLC",
@@ -21,8 +21,8 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@admin-layout/assets": "12.2.5-alpha.2",
24
- "@admin-layout/client": "12.2.5-alpha.7",
25
- "@admin-layout/tailwind-ui": "12.2.5-alpha.10",
24
+ "@admin-layout/client": "12.2.5-alpha.15",
25
+ "@admin-layout/tailwind-ui": "12.2.5-alpha.15",
26
26
  "path-to-regexp": "^8.0.0",
27
27
  "react-favicon": "^0.0.23",
28
28
  "react-intl": "^6.1.1",
@@ -54,5 +54,5 @@
54
54
  "typescript": {
55
55
  "definition": "lib/index.d.ts"
56
56
  },
57
- "gitHead": "eec9a8016709b8bf20453637a9ad64f883e32ca4"
57
+ "gitHead": "6fd3c58cef337a7f83d2673a0f52542c5ff81241"
58
58
  }