@payloadcms/ui 4.0.0-beta.4 → 4.0.0-beta.6

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 (147) hide show
  1. package/dist/css/utilities.css +1 -0
  2. package/dist/elements/AddNewRelation/index.d.ts.map +1 -1
  3. package/dist/elements/AddNewRelation/index.js +4 -0
  4. package/dist/elements/AddNewRelation/index.js.map +1 -1
  5. package/dist/elements/AppHeader/index.d.ts.map +1 -1
  6. package/dist/elements/AppHeader/index.js +2 -0
  7. package/dist/elements/AppHeader/index.js.map +1 -1
  8. package/dist/elements/Collapsible/index.css +1 -1
  9. package/dist/elements/ColumnSelection/Popup.css +2 -2
  10. package/dist/elements/DocumentDrawer/DrawerContent.d.ts.map +1 -1
  11. package/dist/elements/DocumentDrawer/DrawerContent.js +15 -9
  12. package/dist/elements/DocumentDrawer/DrawerContent.js.map +1 -1
  13. package/dist/elements/DocumentHeader/Tabs/index.d.ts.map +1 -1
  14. package/dist/elements/DocumentHeader/Tabs/index.js +10 -8
  15. package/dist/elements/DocumentHeader/Tabs/index.js.map +1 -1
  16. package/dist/elements/FileDetails/DraggableFileDetails/index.d.ts.map +1 -1
  17. package/dist/elements/FileDetails/DraggableFileDetails/index.js +19 -12
  18. package/dist/elements/FileDetails/DraggableFileDetails/index.js.map +1 -1
  19. package/dist/elements/FileDetails/StaticFileDetails/index.d.ts.map +1 -1
  20. package/dist/elements/FileDetails/StaticFileDetails/index.js +63 -33
  21. package/dist/elements/FileDetails/StaticFileDetails/index.js.map +1 -1
  22. package/dist/elements/FileManager/index.d.ts.map +1 -1
  23. package/dist/elements/FileManager/index.js +18 -11
  24. package/dist/elements/FileManager/index.js.map +1 -1
  25. package/dist/elements/FilterTrigger/index.d.ts.map +1 -1
  26. package/dist/elements/FilterTrigger/index.js +80 -44
  27. package/dist/elements/FilterTrigger/index.js.map +1 -1
  28. package/dist/elements/ListControls/index.css +1 -0
  29. package/dist/elements/ListControls/index.d.ts.map +1 -1
  30. package/dist/elements/ListControls/index.js +7 -4
  31. package/dist/elements/ListControls/index.js.map +1 -1
  32. package/dist/elements/ListControls/types.d.ts +1 -0
  33. package/dist/elements/ListControls/types.d.ts.map +1 -1
  34. package/dist/elements/ListControls/types.js.map +1 -1
  35. package/dist/elements/ListDrawer/DrawerContent.d.ts.map +1 -1
  36. package/dist/elements/ListDrawer/DrawerContent.js +18 -12
  37. package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
  38. package/dist/elements/LivePreview/Toolbar/index.d.ts.map +1 -1
  39. package/dist/elements/LivePreview/Toolbar/index.js +13 -7
  40. package/dist/elements/LivePreview/Toolbar/index.js.map +1 -1
  41. package/dist/elements/Nav/NavSidebarToggle/index.d.ts.map +1 -1
  42. package/dist/elements/Nav/NavSidebarToggle/index.js +26 -37
  43. package/dist/elements/Nav/NavSidebarToggle/index.js.map +1 -1
  44. package/dist/elements/Nav/SidebarTabs/index.client.d.ts.map +1 -1
  45. package/dist/elements/Nav/SidebarTabs/index.client.js +9 -2
  46. package/dist/elements/Nav/SidebarTabs/index.client.js.map +1 -1
  47. package/dist/elements/Nav/SidebarTabs/index.css +1 -1
  48. package/dist/elements/Nav/context.d.ts +1 -0
  49. package/dist/elements/Nav/context.d.ts.map +1 -1
  50. package/dist/elements/Nav/context.js +2 -0
  51. package/dist/elements/Nav/context.js.map +1 -1
  52. package/dist/elements/Nav/getNavPrefs.d.ts.map +1 -1
  53. package/dist/elements/Nav/getNavPrefs.js +7 -2
  54. package/dist/elements/Nav/getNavPrefs.js.map +1 -1
  55. package/dist/elements/Nav/index.css +11 -0
  56. package/dist/elements/Popup/PopupButtonList/index.css +1 -1
  57. package/dist/elements/Popup/SubmenuScope.d.ts +3 -5
  58. package/dist/elements/Popup/SubmenuScope.d.ts.map +1 -1
  59. package/dist/elements/Popup/SubmenuScope.js +10 -54
  60. package/dist/elements/Popup/SubmenuScope.js.map +1 -1
  61. package/dist/elements/Popup/index.css +15 -0
  62. package/dist/elements/Popup/index.d.ts.map +1 -1
  63. package/dist/elements/Popup/index.js +69 -30
  64. package/dist/elements/Popup/index.js.map +1 -1
  65. package/dist/elements/Popup/useSubmenuPointerIntent.d.ts +16 -4
  66. package/dist/elements/Popup/useSubmenuPointerIntent.d.ts.map +1 -1
  67. package/dist/elements/Popup/useSubmenuPointerIntent.js +68 -27
  68. package/dist/elements/Popup/useSubmenuPointerIntent.js.map +1 -1
  69. package/dist/elements/PreviewButton/index.d.ts.map +1 -1
  70. package/dist/elements/PreviewButton/index.js +4 -0
  71. package/dist/elements/PreviewButton/index.js.map +1 -1
  72. package/dist/elements/PublishButton/ScheduleDrawer/buildUpcomingColumns.d.ts.map +1 -1
  73. package/dist/elements/PublishButton/ScheduleDrawer/buildUpcomingColumns.js +1 -0
  74. package/dist/elements/PublishButton/ScheduleDrawer/buildUpcomingColumns.js.map +1 -1
  75. package/dist/elements/ReactSelect/MultiValue/index.css +1 -1
  76. package/dist/elements/ReactSelect/index.css +4 -2
  77. package/dist/elements/ReactSelect/index.d.ts.map +1 -1
  78. package/dist/elements/ReactSelect/index.js +8 -3
  79. package/dist/elements/ReactSelect/index.js.map +1 -1
  80. package/dist/elements/SchedulePublishButton/index.d.ts.map +1 -1
  81. package/dist/elements/SchedulePublishButton/index.js +4 -0
  82. package/dist/elements/SchedulePublishButton/index.js.map +1 -1
  83. package/dist/elements/Search/SearchInput/index.css +32 -3
  84. package/dist/elements/SegmentedControl/index.css +1 -1
  85. package/dist/elements/SidebarToggle/index.css +1 -1
  86. package/dist/elements/SortColumn/index.css +49 -5
  87. package/dist/elements/SortRow/index.css +1 -3
  88. package/dist/elements/SortRow/index.d.ts.map +1 -1
  89. package/dist/elements/SortRow/index.js +16 -10
  90. package/dist/elements/SortRow/index.js.map +1 -1
  91. package/dist/elements/StepNav/index.d.ts.map +1 -1
  92. package/dist/elements/StepNav/index.js +4 -1
  93. package/dist/elements/StepNav/index.js.map +1 -1
  94. package/dist/elements/Tabs/index.css +1 -1
  95. package/dist/elements/TimezonePicker/index.css +6 -5
  96. package/dist/elements/TimezonePicker/index.d.ts.map +1 -1
  97. package/dist/elements/TimezonePicker/index.js +80 -43
  98. package/dist/elements/TimezonePicker/index.js.map +1 -1
  99. package/dist/elements/Upload/index.js +2 -0
  100. package/dist/elements/Upload/index.js.map +1 -1
  101. package/dist/elements/UploadDropzoneContent/index.d.ts.map +1 -1
  102. package/dist/elements/UploadDropzoneContent/index.js +1 -0
  103. package/dist/elements/UploadDropzoneContent/index.js.map +1 -1
  104. package/dist/elements/UserMenu/index.css +1 -1
  105. package/dist/exports/client/{DatePicker-AZBZPMY6.js → DatePicker-DJN2NVQC.js} +2 -2
  106. package/dist/exports/client/chunk-GQEFXRCN.js +29 -0
  107. package/dist/exports/client/{chunk-ZP2PB6M4.js.map → chunk-GQEFXRCN.js.map} +4 -4
  108. package/dist/exports/client/index.js +27 -27
  109. package/dist/exports/client/index.js.map +4 -4
  110. package/dist/fields/Blocks/SectionTitle/index.css +21 -2
  111. package/dist/fields/DateTime/index.js +1 -1
  112. package/dist/fields/DateTime/index.js.map +1 -1
  113. package/dist/fields/Upload/Input.d.ts.map +1 -1
  114. package/dist/fields/Upload/Input.js +1 -0
  115. package/dist/fields/Upload/Input.js.map +1 -1
  116. package/dist/fields/Upload/RelationshipContent/index.css +1 -1
  117. package/dist/forms/Form/index.d.ts.map +1 -1
  118. package/dist/forms/Form/index.js +9 -7
  119. package/dist/forms/Form/index.js.map +1 -1
  120. package/dist/hooks/usePointerSafeArea.d.ts +29 -0
  121. package/dist/hooks/usePointerSafeArea.d.ts.map +1 -0
  122. package/dist/hooks/usePointerSafeArea.js +232 -0
  123. package/dist/hooks/usePointerSafeArea.js.map +1 -0
  124. package/dist/providers/ListQuery/index.d.ts.map +1 -1
  125. package/dist/providers/ListQuery/index.js +17 -1
  126. package/dist/providers/ListQuery/index.js.map +1 -1
  127. package/dist/styles.css +2 -1
  128. package/dist/views/List/index.client.d.ts.map +1 -1
  129. package/dist/views/List/index.client.js +15 -9
  130. package/dist/views/List/index.client.js.map +1 -1
  131. package/dist/views/Version/Default/index.d.ts.map +1 -1
  132. package/dist/views/Version/Default/index.js +6 -9
  133. package/dist/views/Version/Default/index.js.map +1 -1
  134. package/dist/views/Version/Default/types.d.ts +0 -1
  135. package/dist/views/Version/Default/types.d.ts.map +1 -1
  136. package/dist/views/Version/Default/types.js.map +1 -1
  137. package/dist/views/Version/Restore/index.css +0 -11
  138. package/dist/views/Version/Restore/index.d.ts +0 -1
  139. package/dist/views/Version/Restore/index.d.ts.map +1 -1
  140. package/dist/views/Version/Restore/index.js +87 -115
  141. package/dist/views/Version/Restore/index.js.map +1 -1
  142. package/dist/views/Version/index.d.ts.map +1 -1
  143. package/dist/views/Version/index.js +1 -2
  144. package/dist/views/Version/index.js.map +1 -1
  145. package/package.json +4 -4
  146. package/dist/exports/client/chunk-ZP2PB6M4.js +0 -29
  147. /package/dist/exports/client/{DatePicker-AZBZPMY6.js.map → DatePicker-DJN2NVQC.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/elements/Nav/context.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA4B,MAAM,OAAO,CAAA;AAKhD,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC9C,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CACxD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,+BAKrB,CAAA;AAEF,eAAO,MAAM,MAAM,sBAA8B,CAAA;AAYjD;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAmGA,CAAA"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/elements/Nav/context.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA4B,MAAM,OAAO,CAAA;AAKhD,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC9C,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,GAAG,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAC5E,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CACxD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,+BAKrB,CAAA;AAEF,eAAO,MAAM,MAAM,sBAA8B,CAAA;AAYjD;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAwGA,CAAA"}
@@ -45,6 +45,7 @@ export const NavProvider = ({
45
45
  setPreference
46
46
  } = usePreferences();
47
47
  const navRef = useRef(null);
48
+ const navToggleRef = useRef(null);
48
49
  const previousBreakpoints = useRef({
49
50
  large: largeBreak,
50
51
  mid: midBreak,
@@ -121,6 +122,7 @@ export const NavProvider = ({
121
122
  hydrated,
122
123
  navOpen,
123
124
  navRef,
125
+ navToggleRef,
124
126
  setNavOpen
125
127
  },
126
128
  children: children
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":["useWindowInfo","PREFERENCE_KEYS","React","useEffect","useRef","usePreferences","usePathname","NavContext","createContext","hydrated","navOpen","navRef","setNavOpen","useNav","use","getNavPreference","getPreference","navPrefs","NAV","preferredState","open","NavProvider","children","initialIsOpen","breakpoints","l","largeBreak","m","midBreak","s","smallBreak","pathname","setPreference","previousBreakpoints","large","mid","small","previousPathname","setNavOpenState","useState","useCallback","value","persist","setHydrated","setNavFromPreferences","current","style","overscrollBehavior","previous","_jsx"],"sources":["../../../src/elements/Nav/context.tsx"],"sourcesContent":["'use client'\nimport { useWindowInfo } from '@faceless-ui/window-info'\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport React, { useEffect, useRef } from 'react'\n\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { usePathname } from '../../providers/RouterAdapter/index.js'\n\ntype NavContextType = {\n hydrated: boolean\n navOpen: boolean\n navRef: React.RefObject<HTMLDivElement | null>\n setNavOpen: (value: boolean, persist?: boolean) => void\n}\n\n/**\n * @internal\n */\nexport const NavContext = React.createContext<NavContextType>({\n hydrated: false,\n navOpen: true,\n navRef: null,\n setNavOpen: () => {},\n})\n\nexport const useNav = () => React.use(NavContext)\n\nconst getNavPreference = async (getPreference): Promise<boolean> => {\n const navPrefs = await getPreference(PREFERENCE_KEYS.NAV)\n const preferredState = navPrefs?.open\n if (typeof preferredState === 'boolean') {\n return preferredState\n } else {\n return true\n }\n}\n\n/**\n * @internal\n */\nexport const NavProvider: React.FC<{\n children: React.ReactNode\n initialIsOpen?: boolean\n}> = ({ children, initialIsOpen }) => {\n const {\n breakpoints: { l: largeBreak, m: midBreak, s: smallBreak },\n } = useWindowInfo()\n\n const pathname = usePathname()\n\n const { getPreference, setPreference } = usePreferences()\n const navRef = useRef(null)\n const previousBreakpoints = useRef({\n large: largeBreak,\n mid: midBreak,\n small: smallBreak,\n })\n const previousPathname = useRef(pathname)\n\n // The server supplies the saved open state for the initial render.\n const [navOpen, setNavOpenState] = React.useState(initialIsOpen)\n\n const setNavOpen = React.useCallback(\n (value: boolean, persist = false) => {\n setNavOpenState(value)\n\n if (persist) {\n void setPreference(PREFERENCE_KEYS.NAV, { open: value }, true)\n }\n },\n [setPreference],\n )\n\n const [hydrated, setHydrated] = React.useState(false)\n\n // on load check the user's preference and set \"initial\" state\n useEffect(() => {\n if (largeBreak === false) {\n const setNavFromPreferences = async () => {\n const preferredState = await getNavPreference(getPreference)\n setNavOpen(preferredState)\n }\n\n void setNavFromPreferences()\n }\n }, [largeBreak, getPreference, setNavOpen])\n\n // on smaller screens where the nav is a modal\n // close the nav when the user navigates away\n useEffect(() => {\n if (previousPathname.current !== pathname && smallBreak === true) {\n setNavOpen(false)\n }\n previousPathname.current = pathname\n }, [pathname, setNavOpen, smallBreak])\n\n // on open and close, lock the body scroll\n // do not do this on desktop, the sidebar is not a modal\n useEffect(() => {\n if (navRef.current) {\n if (navOpen && midBreak) {\n navRef.current.style.overscrollBehavior = 'contain'\n } else {\n navRef.current.style.overscrollBehavior = 'auto'\n }\n }\n }, [navOpen, midBreak])\n\n // on smaller screens where the nav is a modal\n // close the nav when the user resizes down to mobile\n // the sidebar is a modal on mobile\n useEffect(() => {\n const previous = previousBreakpoints.current\n\n if (\n (largeBreak === true && previous.large === false) ||\n (midBreak === true && previous.mid === false) ||\n (smallBreak === true && previous.small !== true)\n ) {\n setNavOpen(false)\n }\n\n previousBreakpoints.current = {\n large: largeBreak,\n mid: midBreak,\n small: smallBreak,\n }\n if (typeof smallBreak === 'boolean') {\n setHydrated(true)\n }\n }, [largeBreak, midBreak, setNavOpen, smallBreak])\n\n // when the component unmounts, clear all body scroll locks\n useEffect(() => {\n return () => {\n if (navRef.current) {\n navRef.current.style.overscrollBehavior = 'auto'\n }\n }\n }, [])\n\n return <NavContext value={{ hydrated, navOpen, navRef, setNavOpen }}>{children}</NavContext>\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"context.js","names":["useWindowInfo","PREFERENCE_KEYS","React","useEffect","useRef","usePreferences","usePathname","NavContext","createContext","hydrated","navOpen","navRef","setNavOpen","useNav","use","getNavPreference","getPreference","navPrefs","NAV","preferredState","open","NavProvider","children","initialIsOpen","breakpoints","l","largeBreak","m","midBreak","s","smallBreak","pathname","setPreference","navToggleRef","previousBreakpoints","large","mid","small","previousPathname","setNavOpenState","useState","useCallback","value","persist","setHydrated","setNavFromPreferences","current","style","overscrollBehavior","previous","_jsx"],"sources":["../../../src/elements/Nav/context.tsx"],"sourcesContent":["'use client'\nimport { useWindowInfo } from '@faceless-ui/window-info'\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport React, { useEffect, useRef } from 'react'\n\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { usePathname } from '../../providers/RouterAdapter/index.js'\n\ntype NavContextType = {\n hydrated: boolean\n navOpen: boolean\n navRef: React.RefObject<HTMLDivElement | null>\n navToggleRef?: React.RefObject<HTMLAnchorElement | HTMLButtonElement | null>\n setNavOpen: (value: boolean, persist?: boolean) => void\n}\n\n/**\n * @internal\n */\nexport const NavContext = React.createContext<NavContextType>({\n hydrated: false,\n navOpen: true,\n navRef: null,\n setNavOpen: () => {},\n})\n\nexport const useNav = () => React.use(NavContext)\n\nconst getNavPreference = async (getPreference): Promise<boolean> => {\n const navPrefs = await getPreference(PREFERENCE_KEYS.NAV)\n const preferredState = navPrefs?.open\n if (typeof preferredState === 'boolean') {\n return preferredState\n } else {\n return true\n }\n}\n\n/**\n * @internal\n */\nexport const NavProvider: React.FC<{\n children: React.ReactNode\n initialIsOpen?: boolean\n}> = ({ children, initialIsOpen }) => {\n const {\n breakpoints: { l: largeBreak, m: midBreak, s: smallBreak },\n } = useWindowInfo()\n\n const pathname = usePathname()\n\n const { getPreference, setPreference } = usePreferences()\n const navRef = useRef(null)\n const navToggleRef = useRef<HTMLAnchorElement | HTMLButtonElement>(null)\n const previousBreakpoints = useRef({\n large: largeBreak,\n mid: midBreak,\n small: smallBreak,\n })\n const previousPathname = useRef(pathname)\n\n // The server supplies the saved open state for the initial render.\n const [navOpen, setNavOpenState] = React.useState(initialIsOpen)\n\n const setNavOpen = React.useCallback(\n (value: boolean, persist = false) => {\n setNavOpenState(value)\n\n if (persist) {\n void setPreference(PREFERENCE_KEYS.NAV, { open: value }, true)\n }\n },\n [setPreference],\n )\n\n const [hydrated, setHydrated] = React.useState(false)\n\n // on load check the user's preference and set \"initial\" state\n useEffect(() => {\n if (largeBreak === false) {\n const setNavFromPreferences = async () => {\n const preferredState = await getNavPreference(getPreference)\n setNavOpen(preferredState)\n }\n\n void setNavFromPreferences()\n }\n }, [largeBreak, getPreference, setNavOpen])\n\n // on smaller screens where the nav is a modal\n // close the nav when the user navigates away\n useEffect(() => {\n if (previousPathname.current !== pathname && smallBreak === true) {\n setNavOpen(false)\n }\n previousPathname.current = pathname\n }, [pathname, setNavOpen, smallBreak])\n\n // on open and close, lock the body scroll\n // do not do this on desktop, the sidebar is not a modal\n useEffect(() => {\n if (navRef.current) {\n if (navOpen && midBreak) {\n navRef.current.style.overscrollBehavior = 'contain'\n } else {\n navRef.current.style.overscrollBehavior = 'auto'\n }\n }\n }, [navOpen, midBreak])\n\n // on smaller screens where the nav is a modal\n // close the nav when the user resizes down to mobile\n // the sidebar is a modal on mobile\n useEffect(() => {\n const previous = previousBreakpoints.current\n\n if (\n (largeBreak === true && previous.large === false) ||\n (midBreak === true && previous.mid === false) ||\n (smallBreak === true && previous.small !== true)\n ) {\n setNavOpen(false)\n }\n\n previousBreakpoints.current = {\n large: largeBreak,\n mid: midBreak,\n small: smallBreak,\n }\n if (typeof smallBreak === 'boolean') {\n setHydrated(true)\n }\n }, [largeBreak, midBreak, setNavOpen, smallBreak])\n\n // when the component unmounts, clear all body scroll locks\n useEffect(() => {\n return () => {\n if (navRef.current) {\n navRef.current.style.overscrollBehavior = 'auto'\n }\n }\n }, [])\n\n return (\n <NavContext value={{ hydrated, navOpen, navRef, navToggleRef, setNavOpen }}>\n {children}\n </NavContext>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"getNavPrefs.d.ts","sourceRoot":"","sources":["../../../src/elements/Nav/getNavPrefs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7D,eAAO,MAAM,WAAW,QAAqB,cAAc,KAAG,OAAO,CAAC,cAAc,CAsElF,CAAA"}
1
+ {"version":3,"file":"getNavPrefs.d.ts","sourceRoot":"","sources":["../../../src/elements/Nav/getNavPrefs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7D,eAAO,MAAM,WAAW,QAAqB,cAAc,KAAG,OAAO,CAAC,cAAc,CAyElF,CAAA"}
@@ -8,13 +8,18 @@ export const getNavPrefs = cache(async req => {
8
8
  open: true
9
9
  };
10
10
  }
11
+ // Navigation renders alongside document creation and must not join its transaction.
12
+ const preferencesReq = {
13
+ ...req,
14
+ transactionID: undefined
15
+ };
11
16
  const navPrefs = await req.payload.find({
12
17
  collection: 'payload-preferences',
13
18
  depth: 0,
14
19
  limit: 1,
15
20
  overrideAccess: true,
16
21
  pagination: false,
17
- req,
22
+ req: preferencesReq,
18
23
  where: {
19
24
  and: [{
20
25
  key: {
@@ -37,7 +42,7 @@ export const getNavPrefs = cache(async req => {
37
42
  limit: 1,
38
43
  overrideAccess: true,
39
44
  pagination: false,
40
- req,
45
+ req: preferencesReq,
41
46
  where: {
42
47
  and: [{
43
48
  key: {
@@ -1 +1 @@
1
- {"version":3,"file":"getNavPrefs.js","names":["PREFERENCE_KEYS","cache","getNavPrefs","req","user","collection","activeTab","undefined","groups","open","navPrefs","payload","find","depth","limit","overrideAccess","pagination","where","and","key","equals","NAV","id","then","res","docs","value","sidebarPrefs","NAV_SIDEBAR_ACTIVE_TAB"],"sources":["../../../src/elements/Nav/getNavPrefs.ts"],"sourcesContent":["import type { NavPreferences, PayloadRequest } from 'payload'\n\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport { cache } from 'react'\n\nexport const getNavPrefs = cache(async (req: PayloadRequest): Promise<NavPreferences> => {\n if (!req?.user?.collection) {\n return { activeTab: undefined, groups: {}, open: true }\n }\n\n const navPrefs = await req.payload\n .find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n req,\n where: {\n and: [\n {\n key: {\n equals: PREFERENCE_KEYS.NAV,\n },\n },\n {\n 'user.relationTo': {\n equals: req.user.collection,\n },\n },\n {\n 'user.value': {\n equals: req?.user?.id,\n },\n },\n ],\n },\n })\n ?.then((res) => res?.docs?.[0]?.value)\n\n const sidebarPrefs = await req.payload\n .find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n req,\n where: {\n and: [\n {\n key: {\n equals: PREFERENCE_KEYS.NAV_SIDEBAR_ACTIVE_TAB,\n },\n },\n {\n 'user.relationTo': {\n equals: req.user.collection,\n },\n },\n {\n 'user.value': {\n equals: req?.user?.id,\n },\n },\n ],\n },\n })\n ?.then((res) => res?.docs?.[0]?.value)\n\n return {\n activeTab: sidebarPrefs?.activeTab,\n groups: navPrefs?.groups ?? {},\n open: navPrefs?.open ?? true,\n }\n})\n"],"mappings":"AAEA,SAASA,eAAe,QAAQ;AAChC,SAASC,KAAK,QAAQ;AAEtB,OAAO,MAAMC,WAAA,GAAcD,KAAA,CAAM,MAAOE,GAAA;EACtC,IAAI,CAACA,GAAA,EAAKC,IAAA,EAAMC,UAAA,EAAY;IAC1B,OAAO;MAAEC,SAAA,EAAWC,SAAA;MAAWC,MAAA,EAAQ,CAAC;MAAGC,IAAA,EAAM;IAAK;EACxD;EAEA,MAAMC,QAAA,GAAW,MAAMP,GAAA,CAAIQ,OAAO,CAC/BC,IAAI,CAAC;IACJP,UAAA,EAAY;IACZQ,KAAA,EAAO;IACPC,KAAA,EAAO;IACPC,cAAA,EAAgB;IAChBC,UAAA,EAAY;IACZb,GAAA;IACAc,KAAA,EAAO;MACLC,GAAA,EAAK,CACH;QACEC,GAAA,EAAK;UACHC,MAAA,EAAQpB,eAAA,CAAgBqB;QAC1B;MACF,GACA;QACE,mBAAmB;UACjBD,MAAA,EAAQjB,GAAA,CAAIC,IAAI,CAACC;QACnB;MACF,GACA;QACE,cAAc;UACZe,MAAA,EAAQjB,GAAA,EAAKC,IAAA,EAAMkB;QACrB;MACF;IAEJ;EACF,IACEC,IAAA,CAAMC,GAAA,IAAQA,GAAA,EAAKC,IAAA,GAAO,EAAE,EAAEC,KAAA;EAElC,MAAMC,YAAA,GAAe,MAAMxB,GAAA,CAAIQ,OAAO,CACnCC,IAAI,CAAC;IACJP,UAAA,EAAY;IACZQ,KAAA,EAAO;IACPC,KAAA,EAAO;IACPC,cAAA,EAAgB;IAChBC,UAAA,EAAY;IACZb,GAAA;IACAc,KAAA,EAAO;MACLC,GAAA,EAAK,CACH;QACEC,GAAA,EAAK;UACHC,MAAA,EAAQpB,eAAA,CAAgB4B;QAC1B;MACF,GACA;QACE,mBAAmB;UACjBR,MAAA,EAAQjB,GAAA,CAAIC,IAAI,CAACC;QACnB;MACF,GACA;QACE,cAAc;UACZe,MAAA,EAAQjB,GAAA,EAAKC,IAAA,EAAMkB;QACrB;MACF;IAEJ;EACF,IACEC,IAAA,CAAMC,GAAA,IAAQA,GAAA,EAAKC,IAAA,GAAO,EAAE,EAAEC,KAAA;EAElC,OAAO;IACLpB,SAAA,EAAWqB,YAAA,EAAcrB,SAAA;IACzBE,MAAA,EAAQE,QAAA,EAAUF,MAAA,IAAU,CAAC;IAC7BC,IAAA,EAAMC,QAAA,EAAUD,IAAA,IAAQ;EAC1B;AACF","ignoreList":[]}
1
+ {"version":3,"file":"getNavPrefs.js","names":["PREFERENCE_KEYS","cache","getNavPrefs","req","user","collection","activeTab","undefined","groups","open","preferencesReq","transactionID","navPrefs","payload","find","depth","limit","overrideAccess","pagination","where","and","key","equals","NAV","id","then","res","docs","value","sidebarPrefs","NAV_SIDEBAR_ACTIVE_TAB"],"sources":["../../../src/elements/Nav/getNavPrefs.ts"],"sourcesContent":["import type { NavPreferences, PayloadRequest } from 'payload'\n\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport { cache } from 'react'\n\nexport const getNavPrefs = cache(async (req: PayloadRequest): Promise<NavPreferences> => {\n if (!req?.user?.collection) {\n return { activeTab: undefined, groups: {}, open: true }\n }\n\n // Navigation renders alongside document creation and must not join its transaction.\n const preferencesReq = { ...req, transactionID: undefined }\n\n const navPrefs = await req.payload\n .find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n req: preferencesReq,\n where: {\n and: [\n {\n key: {\n equals: PREFERENCE_KEYS.NAV,\n },\n },\n {\n 'user.relationTo': {\n equals: req.user.collection,\n },\n },\n {\n 'user.value': {\n equals: req?.user?.id,\n },\n },\n ],\n },\n })\n ?.then((res) => res?.docs?.[0]?.value)\n\n const sidebarPrefs = await req.payload\n .find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n req: preferencesReq,\n where: {\n and: [\n {\n key: {\n equals: PREFERENCE_KEYS.NAV_SIDEBAR_ACTIVE_TAB,\n },\n },\n {\n 'user.relationTo': {\n equals: req.user.collection,\n },\n },\n {\n 'user.value': {\n equals: req?.user?.id,\n },\n },\n ],\n },\n })\n ?.then((res) => res?.docs?.[0]?.value)\n\n return {\n activeTab: sidebarPrefs?.activeTab,\n groups: navPrefs?.groups ?? {},\n open: navPrefs?.open ?? true,\n }\n})\n"],"mappings":"AAEA,SAASA,eAAe,QAAQ;AAChC,SAASC,KAAK,QAAQ;AAEtB,OAAO,MAAMC,WAAA,GAAcD,KAAA,CAAM,MAAOE,GAAA;EACtC,IAAI,CAACA,GAAA,EAAKC,IAAA,EAAMC,UAAA,EAAY;IAC1B,OAAO;MAAEC,SAAA,EAAWC,SAAA;MAAWC,MAAA,EAAQ,CAAC;MAAGC,IAAA,EAAM;IAAK;EACxD;EAEA;EACA,MAAMC,cAAA,GAAiB;IAAE,GAAGP,GAAG;IAAEQ,aAAA,EAAeJ;EAAU;EAE1D,MAAMK,QAAA,GAAW,MAAMT,GAAA,CAAIU,OAAO,CAC/BC,IAAI,CAAC;IACJT,UAAA,EAAY;IACZU,KAAA,EAAO;IACPC,KAAA,EAAO;IACPC,cAAA,EAAgB;IAChBC,UAAA,EAAY;IACZf,GAAA,EAAKO,cAAA;IACLS,KAAA,EAAO;MACLC,GAAA,EAAK,CACH;QACEC,GAAA,EAAK;UACHC,MAAA,EAAQtB,eAAA,CAAgBuB;QAC1B;MACF,GACA;QACE,mBAAmB;UACjBD,MAAA,EAAQnB,GAAA,CAAIC,IAAI,CAACC;QACnB;MACF,GACA;QACE,cAAc;UACZiB,MAAA,EAAQnB,GAAA,EAAKC,IAAA,EAAMoB;QACrB;MACF;IAEJ;EACF,IACEC,IAAA,CAAMC,GAAA,IAAQA,GAAA,EAAKC,IAAA,GAAO,EAAE,EAAEC,KAAA;EAElC,MAAMC,YAAA,GAAe,MAAM1B,GAAA,CAAIU,OAAO,CACnCC,IAAI,CAAC;IACJT,UAAA,EAAY;IACZU,KAAA,EAAO;IACPC,KAAA,EAAO;IACPC,cAAA,EAAgB;IAChBC,UAAA,EAAY;IACZf,GAAA,EAAKO,cAAA;IACLS,KAAA,EAAO;MACLC,GAAA,EAAK,CACH;QACEC,GAAA,EAAK;UACHC,MAAA,EAAQtB,eAAA,CAAgB8B;QAC1B;MACF,GACA;QACE,mBAAmB;UACjBR,MAAA,EAAQnB,GAAA,CAAIC,IAAI,CAACC;QACnB;MACF,GACA;QACE,cAAc;UACZiB,MAAA,EAAQnB,GAAA,EAAKC,IAAA,EAAMoB;QACrB;MACF;IAEJ;EACF,IACEC,IAAA,CAAMC,GAAA,IAAQA,GAAA,EAAKC,IAAA,GAAO,EAAE,EAAEC,KAAA;EAElC,OAAO;IACLtB,SAAA,EAAWuB,YAAA,EAAcvB,SAAA;IACzBE,MAAA,EAAQI,QAAA,EAAUJ,MAAA,IAAU,CAAC;IAC7BC,IAAA,EAAMG,QAAA,EAAUH,IAAA,IAAQ;EAC1B;AACF","ignoreList":[]}
@@ -22,11 +22,22 @@
22
22
  }
23
23
 
24
24
  .nav__close {
25
+ position: relative;
25
26
  display: flex;
26
27
  align-items: center;
27
28
  background: none;
28
29
  border: 0;
30
+ border-radius: var(--button-radius);
29
31
  outline: 0;
32
+
33
+ &:focus-visible::after {
34
+ content: '';
35
+ position: absolute;
36
+ inset: var(--spacer-1);
37
+ border: var(--stroke-width-small) solid var(--color-border-selected);
38
+ border-radius: var(--button-radius);
39
+ pointer-events: none;
40
+ }
30
41
  }
31
42
 
32
43
  .nav__scroll {
@@ -63,7 +63,7 @@
63
63
 
64
64
  .popup-button-list__button:focus-visible {
65
65
  outline: var(--accessibility-outline);
66
- outline-offset: -1px;
66
+ outline-offset: var(--accessibility-outline-inset);
67
67
  border-radius: var(--popup-item-radius);
68
68
  }
69
69
  .popup-button-list__button:hover {
@@ -1,21 +1,19 @@
1
1
  export type SubmenuNode = {
2
2
  closeBranch: () => void;
3
3
  id: string;
4
+ isPointerProtected?: () => boolean;
4
5
  open: (viaKeyboard: boolean) => void;
5
6
  };
6
7
  export type SubmenuScope = {
7
8
  activeChildId: null | string;
8
- cancelPending: (id?: string) => void;
9
9
  closeActiveBranch: () => void;
10
10
  register: (node: SubmenuNode) => () => void;
11
11
  release: (id: string) => void;
12
12
  requestOpen: (args: {
13
- delay: boolean;
14
13
  id: string;
15
14
  viaKeyboard?: boolean;
15
+ viaPointer?: boolean;
16
16
  }) => void;
17
17
  };
18
- export declare const createSubmenuScope: ({ hoverDelay, }?: {
19
- hoverDelay?: number;
20
- }) => SubmenuScope;
18
+ export declare const createSubmenuScope: () => SubmenuScope;
21
19
  //# sourceMappingURL=SubmenuScope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubmenuScope.d.ts","sourceRoot":"","sources":["../../../src/elements/Popup/SubmenuScope.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,aAAa,EAAE,IAAI,GAAG,MAAM,CAAA;IAC5B,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,iBAAiB,EAAE,MAAM,IAAI,CAAA;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,IAAI,CAAA;IAC3C,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;CACnF,CAAA;AAID,eAAO,MAAM,kBAAkB,qBAE5B;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KAAQ,YA8EjC,CAAA"}
1
+ {"version":3,"file":"SubmenuScope.d.ts","sourceRoot":"","sources":["../../../src/elements/Popup/SubmenuScope.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,aAAa,EAAE,IAAI,GAAG,MAAM,CAAA;IAC5B,iBAAiB,EAAE,MAAM,IAAI,CAAA;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,IAAI,CAAA;IAC3C,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;CACzF,CAAA;AAED,eAAO,MAAM,kBAAkB,QAAO,YAyCrC,CAAA"}
@@ -1,50 +1,17 @@
1
- const DEFAULT_HOVER_DELAY = 150;
2
- export const createSubmenuScope = ({
3
- hoverDelay = DEFAULT_HOVER_DELAY
4
- } = {}) => {
1
+ export const createSubmenuScope = () => {
5
2
  const nodes = new Map();
6
3
  let activeChildId = null;
7
- let pendingChildId = null;
8
- let pendingTimer;
9
- const cancelPending = id => {
10
- if (id && pendingChildId !== id) {
11
- return;
12
- }
13
- if (pendingTimer) {
14
- clearTimeout(pendingTimer);
15
- }
16
- pendingTimer = undefined;
17
- pendingChildId = null;
18
- };
19
- const activate = ({
20
- id,
21
- viaKeyboard = false
22
- }) => {
23
- cancelPending();
24
- const node = nodes.get(id);
25
- if (!node) {
26
- return;
27
- }
28
- if (activeChildId !== id) {
29
- nodes.get(activeChildId ?? '')?.closeBranch();
30
- activeChildId = id;
31
- }
32
- node.open(viaKeyboard);
33
- };
34
4
  return {
35
5
  get activeChildId() {
36
6
  return activeChildId;
37
7
  },
38
- cancelPending,
39
8
  closeActiveBranch: () => {
40
- cancelPending();
41
9
  nodes.get(activeChildId ?? '')?.closeBranch();
42
10
  activeChildId = null;
43
11
  },
44
12
  register: node => {
45
13
  nodes.set(node.id, node);
46
14
  return () => {
47
- cancelPending(node.id);
48
15
  if (activeChildId === node.id) {
49
16
  activeChildId = null;
50
17
  }
@@ -52,37 +19,26 @@ export const createSubmenuScope = ({
52
19
  };
53
20
  },
54
21
  release: id => {
55
- cancelPending(id);
56
22
  if (activeChildId === id) {
57
23
  activeChildId = null;
58
24
  }
59
25
  },
60
26
  requestOpen: ({
61
27
  id,
62
- delay,
63
- viaKeyboard = false
28
+ viaKeyboard = false,
29
+ viaPointer = false
64
30
  }) => {
65
- if (!delay) {
66
- activate({
67
- id,
68
- viaKeyboard
69
- });
31
+ if (activeChildId === id) {
70
32
  return;
71
33
  }
72
- if (activeChildId === id) {
73
- cancelPending();
34
+ const node = nodes.get(id);
35
+ const activeNode = nodes.get(activeChildId ?? '');
36
+ if (!node || viaPointer && activeNode?.isPointerProtected?.()) {
74
37
  return;
75
38
  }
76
- cancelPending();
77
- pendingChildId = id;
78
- pendingTimer = setTimeout(() => {
79
- pendingTimer = undefined;
80
- pendingChildId = null;
81
- activate({
82
- id,
83
- viaKeyboard
84
- });
85
- }, hoverDelay);
39
+ activeNode?.closeBranch();
40
+ activeChildId = id;
41
+ node.open(viaKeyboard);
86
42
  }
87
43
  };
88
44
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SubmenuScope.js","names":["DEFAULT_HOVER_DELAY","createSubmenuScope","hoverDelay","nodes","Map","activeChildId","pendingChildId","pendingTimer","cancelPending","id","clearTimeout","undefined","activate","viaKeyboard","node","get","closeBranch","open","closeActiveBranch","register","set","delete","release","requestOpen","delay","setTimeout"],"sources":["../../../src/elements/Popup/SubmenuScope.ts"],"sourcesContent":["export type SubmenuNode = {\n closeBranch: () => void\n id: string\n open: (viaKeyboard: boolean) => void\n}\n\nexport type SubmenuScope = {\n activeChildId: null | string\n cancelPending: (id?: string) => void\n closeActiveBranch: () => void\n register: (node: SubmenuNode) => () => void\n release: (id: string) => void\n requestOpen: (args: { delay: boolean; id: string; viaKeyboard?: boolean }) => void\n}\n\nconst DEFAULT_HOVER_DELAY = 150\n\nexport const createSubmenuScope = ({\n hoverDelay = DEFAULT_HOVER_DELAY,\n}: { hoverDelay?: number } = {}): SubmenuScope => {\n const nodes = new Map<string, SubmenuNode>()\n let activeChildId: null | string = null\n let pendingChildId: null | string = null\n let pendingTimer: ReturnType<typeof setTimeout> | undefined\n\n const cancelPending = (id?: string) => {\n if (id && pendingChildId !== id) {\n return\n }\n\n if (pendingTimer) {\n clearTimeout(pendingTimer)\n }\n pendingTimer = undefined\n pendingChildId = null\n }\n\n const activate = ({ id, viaKeyboard = false }: { id: string; viaKeyboard?: boolean }) => {\n cancelPending()\n const node = nodes.get(id)\n if (!node) {\n return\n }\n\n if (activeChildId !== id) {\n nodes.get(activeChildId ?? '')?.closeBranch()\n activeChildId = id\n }\n node.open(viaKeyboard)\n }\n\n return {\n get activeChildId() {\n return activeChildId\n },\n cancelPending,\n closeActiveBranch: () => {\n cancelPending()\n nodes.get(activeChildId ?? '')?.closeBranch()\n activeChildId = null\n },\n register: (node) => {\n nodes.set(node.id, node)\n return () => {\n cancelPending(node.id)\n if (activeChildId === node.id) {\n activeChildId = null\n }\n nodes.delete(node.id)\n }\n },\n release: (id) => {\n cancelPending(id)\n if (activeChildId === id) {\n activeChildId = null\n }\n },\n requestOpen: ({ id, delay, viaKeyboard = false }) => {\n if (!delay) {\n activate({ id, viaKeyboard })\n return\n }\n\n if (activeChildId === id) {\n cancelPending()\n return\n }\n\n cancelPending()\n pendingChildId = id\n pendingTimer = setTimeout(() => {\n pendingTimer = undefined\n pendingChildId = null\n activate({ id, viaKeyboard })\n }, hoverDelay)\n },\n }\n}\n"],"mappings":"AAeA,MAAMA,mBAAA,GAAsB;AAE5B,OAAO,MAAMC,kBAAA,GAAqBA,CAAC;EACjCC,UAAA,GAAaF;AAAmB,CACR,GAAG,CAAC,CAAC;EAC7B,MAAMG,KAAA,GAAQ,IAAIC,GAAA;EAClB,IAAIC,aAAA,GAA+B;EACnC,IAAIC,cAAA,GAAgC;EACpC,IAAIC,YAAA;EAEJ,MAAMC,aAAA,GAAiBC,EAAA;IACrB,IAAIA,EAAA,IAAMH,cAAA,KAAmBG,EAAA,EAAI;MAC/B;IACF;IAEA,IAAIF,YAAA,EAAc;MAChBG,YAAA,CAAaH,YAAA;IACf;IACAA,YAAA,GAAeI,SAAA;IACfL,cAAA,GAAiB;EACnB;EAEA,MAAMM,QAAA,GAAWA,CAAC;IAAEH,EAAE;IAAEI,WAAA,GAAc;EAAK,CAAyC;IAClFL,aAAA;IACA,MAAMM,IAAA,GAAOX,KAAA,CAAMY,GAAG,CAACN,EAAA;IACvB,IAAI,CAACK,IAAA,EAAM;MACT;IACF;IAEA,IAAIT,aAAA,KAAkBI,EAAA,EAAI;MACxBN,KAAA,CAAMY,GAAG,CAACV,aAAA,IAAiB,KAAKW,WAAA;MAChCX,aAAA,GAAgBI,EAAA;IAClB;IACAK,IAAA,CAAKG,IAAI,CAACJ,WAAA;EACZ;EAEA,OAAO;IACL,IAAIR,cAAA,EAAgB;MAClB,OAAOA,aAAA;IACT;IACAG,aAAA;IACAU,iBAAA,EAAmBA,CAAA;MACjBV,aAAA;MACAL,KAAA,CAAMY,GAAG,CAACV,aAAA,IAAiB,KAAKW,WAAA;MAChCX,aAAA,GAAgB;IAClB;IACAc,QAAA,EAAWL,IAAA;MACTX,KAAA,CAAMiB,GAAG,CAACN,IAAA,CAAKL,EAAE,EAAEK,IAAA;MACnB,OAAO;QACLN,aAAA,CAAcM,IAAA,CAAKL,EAAE;QACrB,IAAIJ,aAAA,KAAkBS,IAAA,CAAKL,EAAE,EAAE;UAC7BJ,aAAA,GAAgB;QAClB;QACAF,KAAA,CAAMkB,MAAM,CAACP,IAAA,CAAKL,EAAE;MACtB;IACF;IACAa,OAAA,EAAUb,EAAA;MACRD,aAAA,CAAcC,EAAA;MACd,IAAIJ,aAAA,KAAkBI,EAAA,EAAI;QACxBJ,aAAA,GAAgB;MAClB;IACF;IACAkB,WAAA,EAAaA,CAAC;MAAEd,EAAE;MAAEe,KAAK;MAAEX,WAAA,GAAc;IAAK,CAAE;MAC9C,IAAI,CAACW,KAAA,EAAO;QACVZ,QAAA,CAAS;UAAEH,EAAA;UAAII;QAAY;QAC3B;MACF;MAEA,IAAIR,aAAA,KAAkBI,EAAA,EAAI;QACxBD,aAAA;QACA;MACF;MAEAA,aAAA;MACAF,cAAA,GAAiBG,EAAA;MACjBF,YAAA,GAAekB,UAAA,CAAW;QACxBlB,YAAA,GAAeI,SAAA;QACfL,cAAA,GAAiB;QACjBM,QAAA,CAAS;UAAEH,EAAA;UAAII;QAAY;MAC7B,GAAGX,UAAA;IACL;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"SubmenuScope.js","names":["createSubmenuScope","nodes","Map","activeChildId","closeActiveBranch","get","closeBranch","register","node","set","id","delete","release","requestOpen","viaKeyboard","viaPointer","activeNode","isPointerProtected","open"],"sources":["../../../src/elements/Popup/SubmenuScope.ts"],"sourcesContent":["export type SubmenuNode = {\n closeBranch: () => void\n id: string\n isPointerProtected?: () => boolean\n open: (viaKeyboard: boolean) => void\n}\n\nexport type SubmenuScope = {\n activeChildId: null | string\n closeActiveBranch: () => void\n register: (node: SubmenuNode) => () => void\n release: (id: string) => void\n requestOpen: (args: { id: string; viaKeyboard?: boolean; viaPointer?: boolean }) => void\n}\n\nexport const createSubmenuScope = (): SubmenuScope => {\n const nodes = new Map<string, SubmenuNode>()\n let activeChildId: null | string = null\n\n return {\n get activeChildId() {\n return activeChildId\n },\n closeActiveBranch: () => {\n nodes.get(activeChildId ?? '')?.closeBranch()\n activeChildId = null\n },\n register: (node) => {\n nodes.set(node.id, node)\n return () => {\n if (activeChildId === node.id) {\n activeChildId = null\n }\n nodes.delete(node.id)\n }\n },\n release: (id) => {\n if (activeChildId === id) {\n activeChildId = null\n }\n },\n requestOpen: ({ id, viaKeyboard = false, viaPointer = false }) => {\n if (activeChildId === id) {\n return\n }\n const node = nodes.get(id)\n const activeNode = nodes.get(activeChildId ?? '')\n\n if (!node || (viaPointer && activeNode?.isPointerProtected?.())) {\n return\n }\n activeNode?.closeBranch()\n activeChildId = id\n node.open(viaKeyboard)\n },\n }\n}\n"],"mappings":"AAeA,OAAO,MAAMA,kBAAA,GAAqBA,CAAA;EAChC,MAAMC,KAAA,GAAQ,IAAIC,GAAA;EAClB,IAAIC,aAAA,GAA+B;EAEnC,OAAO;IACL,IAAIA,cAAA,EAAgB;MAClB,OAAOA,aAAA;IACT;IACAC,iBAAA,EAAmBA,CAAA;MACjBH,KAAA,CAAMI,GAAG,CAACF,aAAA,IAAiB,KAAKG,WAAA;MAChCH,aAAA,GAAgB;IAClB;IACAI,QAAA,EAAWC,IAAA;MACTP,KAAA,CAAMQ,GAAG,CAACD,IAAA,CAAKE,EAAE,EAAEF,IAAA;MACnB,OAAO;QACL,IAAIL,aAAA,KAAkBK,IAAA,CAAKE,EAAE,EAAE;UAC7BP,aAAA,GAAgB;QAClB;QACAF,KAAA,CAAMU,MAAM,CAACH,IAAA,CAAKE,EAAE;MACtB;IACF;IACAE,OAAA,EAAUF,EAAA;MACR,IAAIP,aAAA,KAAkBO,EAAA,EAAI;QACxBP,aAAA,GAAgB;MAClB;IACF;IACAU,WAAA,EAAaA,CAAC;MAAEH,EAAE;MAAEI,WAAA,GAAc,KAAK;MAAEC,UAAA,GAAa;IAAK,CAAE;MAC3D,IAAIZ,aAAA,KAAkBO,EAAA,EAAI;QACxB;MACF;MACA,MAAMF,IAAA,GAAOP,KAAA,CAAMI,GAAG,CAACK,EAAA;MACvB,MAAMM,UAAA,GAAaf,KAAA,CAAMI,GAAG,CAACF,aAAA,IAAiB;MAE9C,IAAI,CAACK,IAAA,IAASO,UAAA,IAAcC,UAAA,EAAYC,kBAAA,MAAyB;QAC/D;MACF;MACAD,UAAA,EAAYV,WAAA;MACZH,aAAA,GAAgBO,EAAA;MAChBF,IAAA,CAAKU,IAAI,CAACJ,WAAA;IACZ;EACF;AACF","ignoreList":[]}
@@ -49,6 +49,21 @@
49
49
  color: var(--popup-text, var(--color-text-ontooltip));
50
50
  }
51
51
 
52
+ .popup__content[data-submenu-safe-area] {
53
+ overflow: visible;
54
+ }
55
+
56
+ .popup__content[data-submenu-safe-area]::before {
57
+ /* Debug safe area: uncomment to show the protected path.
58
+ background-color: color-mix(in srgb, var(--color-bg-assistive) 35%, transparent);
59
+ */
60
+ content: '';
61
+ position: fixed;
62
+ inset: 0;
63
+ clip-path: var(--popup-safe-area);
64
+ pointer-events: none;
65
+ }
66
+
52
67
  .popup__content.popup--size-small {
53
68
  min-width: 80px;
54
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Popup/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAY,aAAa,EAAE,MAAM,OAAO,CAAA;AAEpE,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAA;AAEvD,OAAO,KASN,MAAM,OAAO,CAAA;AAKd,OAAO,aAAa,CAAA;AACpB,OAAO,EAAE,KAAK,sBAAsB,EAAgB,MAAM,yBAAyB,CAAA;AAyCnF,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAA;IAClD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC/B,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IACxC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAA;IACzD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,KAAK,CAAC,SAAS,CAAA;IACjE,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,GAAG,OAAO,CAAA;IACxC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IACjC;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CACjC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAupBtC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Popup/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAY,aAAa,EAAE,MAAM,OAAO,CAAA;AAEpE,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAA;AAEvD,OAAO,KASN,MAAM,OAAO,CAAA;AAKd,OAAO,aAAa,CAAA;AACpB,OAAO,EAAE,KAAK,sBAAsB,EAAgB,MAAM,yBAAyB,CAAA;AAyCnF,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAA;IAClD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC/B,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IACxC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAA;IACzD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,KAAK,CAAC,SAAS,CAAA;IACjE,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,GAAG,OAAO,CAAA;IACxC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IACjC;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CACjC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CA0rBtC,CAAA"}
@@ -94,7 +94,6 @@ export const Popup = props => {
94
94
  if (coordinateParent && isSubmenu) {
95
95
  parentPopup.submenuScope.requestOpen({
96
96
  id: contentId,
97
- delay: false,
98
97
  viaKeyboard
99
98
  });
100
99
  return;
@@ -128,27 +127,67 @@ export const Popup = props => {
128
127
  closePopup(options);
129
128
  }, [closePopup, parentPopup]);
130
129
  const openFromParent = useCallback(viaKeyboard_0 => setActive(true, viaKeyboard_0, false), [setActive]);
131
- useEffect(() => {
132
- if (!isSubmenu) {
133
- return;
134
- }
135
- return parentPopup.submenuScope.register({
136
- id: contentId,
137
- closeBranch: () => closePopup({
138
- restoreFocus: false
139
- }),
140
- open: openFromParent
130
+ const closeFromPointer = useCallback(() => {
131
+ const hasFocus = popupRef.current?.contains(document.activeElement);
132
+ const trigger_0 = triggerRef.current?.querySelector('[aria-haspopup="menu"]');
133
+ closePopup({
134
+ restoreFocus: false
141
135
  });
142
- }, [closePopup, contentId, isSubmenu, openFromParent, parentPopup]);
136
+ if (hasFocus) {
137
+ trigger_0?.focus();
138
+ }
139
+ }, [closePopup]);
143
140
  const pointerIntent = useSubmenuPointerIntent({
141
+ active,
144
142
  contentRef: popupRef,
145
143
  enabled: isSubmenu && hoverSubmenu,
146
- onClose: () => setActive(false),
144
+ onClose: closeFromPointer,
147
145
  onOpen: () => parentPopup?.submenuScope.requestOpen({
148
146
  id: contentId,
149
- delay: Boolean(parentPopup.submenuScope.activeChildId)
150
- })
147
+ viaPointer: true
148
+ }),
149
+ onSafeAreaExpire: ({
150
+ x,
151
+ y
152
+ }) => {
153
+ const target = document.elementFromPoint(x, y);
154
+ const parentContent = parentPopup?.popupRef.current;
155
+ if (parentContent && target?.closest(POPUP_CONTENT_SELECTOR) === parentContent) {
156
+ const trigger_1 = target.closest('.popup__submenu-hover-watch')?.querySelector('[aria-haspopup="menu"][aria-controls]');
157
+ const siblingId = trigger_1?.getAttribute('aria-controls');
158
+ if (siblingId && trigger_1?.getAttribute('aria-disabled') !== 'true') {
159
+ parentPopup?.submenuScope.requestOpen({
160
+ id: siblingId
161
+ });
162
+ return;
163
+ }
164
+ }
165
+ closeFromPointer();
166
+ },
167
+ triggerRef
151
168
  });
169
+ const submenuCallbacks = useRef({
170
+ closeFromPointer,
171
+ openFromParent
172
+ });
173
+ const parentSubmenuScope = parentPopup?.submenuScope;
174
+ useEffect(() => {
175
+ submenuCallbacks.current = {
176
+ closeFromPointer,
177
+ openFromParent
178
+ };
179
+ }, [closeFromPointer, openFromParent]);
180
+ useEffect(() => {
181
+ if (!isSubmenu || !parentSubmenuScope) {
182
+ return;
183
+ }
184
+ return parentSubmenuScope.register({
185
+ id: contentId,
186
+ closeBranch: () => submenuCallbacks.current.closeFromPointer(),
187
+ isPointerProtected: pointerIntent.isProtected,
188
+ open: viaKeyboard_1 => submenuCallbacks.current.openFromParent(viaKeyboard_1)
189
+ });
190
+ }, [contentId, isSubmenu, parentSubmenuScope, pointerIntent.isProtected]);
152
191
  // /////////////////////////////////////
153
192
  // Position Calculation
154
193
  //
@@ -157,12 +196,12 @@ export const Popup = props => {
157
196
  // styles if the calculated position differs from current position.
158
197
  // /////////////////////////////////////
159
198
  const updatePosition = useEffectEvent(() => {
160
- const trigger_0 = triggerRef.current;
199
+ const trigger_2 = triggerRef.current;
161
200
  const popup = popupRef.current;
162
- if (!trigger_0 || !popup) {
201
+ if (!trigger_2 || !popup) {
163
202
  return;
164
203
  }
165
- const triggerRect = trigger_0.getBoundingClientRect();
204
+ const triggerRect = trigger_2.getBoundingClientRect();
166
205
  const popupRect = popup.getBoundingClientRect();
167
206
  // Gap between the popup and the trigger/viewport edges (in pixels)
168
207
  const offset = 8;
@@ -275,6 +314,7 @@ export const Popup = props => {
275
314
  if (popup.style.getPropertyValue('--caret-left') !== newCaretLeft) {
276
315
  popup.style.setProperty('--caret-left', newCaretLeft);
277
316
  }
317
+ pointerIntent.updateSafeArea();
278
318
  });
279
319
  // /////////////////////////////////////
280
320
  // Click Outside Handler
@@ -284,11 +324,11 @@ export const Popup = props => {
284
324
  // - Click in parent popup: child closes
285
325
  // /////////////////////////////////////
286
326
  const handleClickOutside = useEffectEvent(e => {
287
- const target = e.target;
288
- const isOutsidePopup = !popupRef.current?.contains(target);
289
- const isOutsideTrigger = !triggerRef.current?.contains(target);
327
+ const target_0 = e.target;
328
+ const isOutsidePopup = !popupRef.current?.contains(target_0);
329
+ const isOutsideTrigger = !triggerRef.current?.contains(target_0);
290
330
  // Check if click is inside a popup portal
291
- const clickedPopupContent = target.closest?.('.popup__content');
331
+ const clickedPopupContent = target_0.closest?.('.popup__content');
292
332
  // If the clicked popup contains this popup's trigger, it's a parent popup
293
333
  // and we should close. If it doesn't contain our trigger, it's a child popup
294
334
  // and we should stay open to avoid closing parent when interacting with child.
@@ -321,8 +361,8 @@ export const Popup = props => {
321
361
  return;
322
362
  }
323
363
  if (e_0.key === 'ArrowRight' && popupRole === 'menu') {
324
- const trigger_1 = document.activeElement?.closest(`.${baseClass}__trigger-wrap`);
325
- const nestedTrigger = trigger_1?.querySelector('button, [role="menuitem"]');
364
+ const trigger_3 = document.activeElement?.closest(`.${baseClass}__trigger-wrap`);
365
+ const nestedTrigger = trigger_3?.querySelector('button, [role="menuitem"]');
326
366
  if (nestedTrigger) {
327
367
  e_0.preventDefault();
328
368
  nestedTrigger.dispatchEvent(new KeyboardEvent('keydown', {
@@ -383,13 +423,13 @@ export const Popup = props => {
383
423
  // Closes popup when buttons/links inside are clicked (includes Enter/Space activation).
384
424
  // /////////////////////////////////////
385
425
  const handleActionableClick = useEffectEvent(e_1 => {
386
- const target_0 = e_1.target;
426
+ const target_1 = e_1.target;
387
427
  // Allow opting out with data-popup-prevent-close attribute on element or ancestor
388
- if (target_0.closest('[data-popup-prevent-close]')) {
428
+ if (target_1.closest('[data-popup-prevent-close]')) {
389
429
  return;
390
430
  }
391
431
  // Check if the clicked element or any ancestor is an actionable element
392
- const actionable = target_0.closest('button, a[href], [role="button"], [role="menuitem"]');
432
+ const actionable = target_1.closest('button, a[href], [role="button"], [role="menuitem"]');
393
433
  if (actionable && popupRef.current?.contains(actionable)) {
394
434
  if (actionable.closest(`.${baseClass}__content`) !== popupRef.current) {
395
435
  return;
@@ -520,7 +560,7 @@ export const Popup = props => {
520
560
  tabIndex: 0,
521
561
  children: Trigger
522
562
  }) : hoverSubmenu && isSubmenu ? /*#__PURE__*/_jsx("div", {
523
- ...pointerIntent,
563
+ ...pointerIntent.triggerProps,
524
564
  className: `${baseClass}__submenu-hover-watch`,
525
565
  children: Trigger
526
566
  }) : Trigger
@@ -532,6 +572,7 @@ export const Popup = props => {
532
572
  submenuScope
533
573
  },
534
574
  children: /*#__PURE__*/_jsxs("div", {
575
+ ...pointerIntent.contentProps,
535
576
  "aria-label": popupAriaLabel,
536
577
  className: active ? [`${baseClass}__content`, `${baseClass}--size-${size}`, resolvedSide ? `${baseClass}--side-${resolvedSide}` : isOnTop ? `${baseClass}--v-top` : `${baseClass}--v-bottom`, portalClassName].filter(Boolean).join(' ') :
537
578
  // tests do not accidentally target inactive popups.
@@ -539,8 +580,6 @@ export const Popup = props => {
539
580
  "data-popup-id": id || undefined,
540
581
  "data-theme": theme === 'auto' ? undefined : theme,
541
582
  id: contentId,
542
- onMouseEnter: pointerIntent.onMouseEnter,
543
- onMouseLeave: pointerIntent.onMouseLeave,
544
583
  popover: "manual",
545
584
  ref: popupRef,
546
585
  role: popupRole,