@umamichi-ui/common-components 0.3.1 → 0.3.3

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 (45) hide show
  1. package/README.md +112 -112
  2. package/dist/dialog/AboutDialog.d.ts +1 -1
  3. package/dist/dialog/AboutDialog.d.ts.map +1 -1
  4. package/dist/dialog/AboutDialog.js.map +1 -1
  5. package/dist/dialog/ConfirmDialog.d.ts +1 -1
  6. package/dist/dialog/ConfirmDialog.d.ts.map +1 -1
  7. package/dist/dialog/ConfirmDialog.js.map +1 -1
  8. package/dist/dialog/ConfirmDialogOverlay.d.ts +1 -1
  9. package/dist/dialog/ConfirmDialogOverlay.d.ts.map +1 -1
  10. package/dist/icons/ChevronIcons.d.ts +2 -2
  11. package/dist/icons/ChevronIcons.d.ts.map +1 -1
  12. package/dist/icons/ChevronIcons.js.map +1 -1
  13. package/dist/icons/DropdownMenuChevron.d.ts +1 -1
  14. package/dist/icons/DropdownMenuChevron.d.ts.map +1 -1
  15. package/dist/icons/DropdownMenuChevron.js.map +1 -1
  16. package/dist/icons/InfoCircleIcon.d.ts +1 -1
  17. package/dist/icons/InfoCircleIcon.d.ts.map +1 -1
  18. package/dist/icons/InfoCircleIcon.js.map +1 -1
  19. package/dist/menu/FloatingMenu.d.ts +1 -1
  20. package/dist/menu/FloatingMenu.d.ts.map +1 -1
  21. package/dist/menu/FloatingMenu.js +3 -1
  22. package/dist/menu/FloatingMenu.js.map +1 -1
  23. package/dist/menu/MobileActionSheet.d.ts +1 -1
  24. package/dist/menu/MobileActionSheet.d.ts.map +1 -1
  25. package/dist/menu/MobileActionSheet.js.map +1 -1
  26. package/dist/menu/MobileActionSheetContent.d.ts +1 -1
  27. package/dist/menu/MobileActionSheetContent.d.ts.map +1 -1
  28. package/dist/menu/MobileActionSheetContent.js.map +1 -1
  29. package/dist/menu/computeFloatingMenuGeometry.d.ts.map +1 -1
  30. package/dist/menu/computeFloatingMenuGeometry.js +40 -11
  31. package/dist/menu/computeFloatingMenuGeometry.js.map +1 -1
  32. package/dist/menu/useFloatingMenuGeometry.d.ts.map +1 -1
  33. package/dist/menu/useFloatingMenuGeometry.js +12 -4
  34. package/dist/menu/useFloatingMenuGeometry.js.map +1 -1
  35. package/dist/overlay/OverlayStackProvider.d.ts +1 -1
  36. package/dist/overlay/OverlayStackProvider.d.ts.map +1 -1
  37. package/dist/overlay/OverlayStackProvider.js.map +1 -1
  38. package/dist/overlay/overlayHistory.js.map +1 -1
  39. package/dist/overlay/overlayStackTypes.js.map +1 -1
  40. package/dist/overlay/useOverlayStackEntry.js.map +1 -1
  41. package/package.json +2 -2
  42. package/src/styles/about-dialog.css +122 -122
  43. package/src/styles/index.css +3 -3
  44. package/src/styles/mobile-action-sheet.css +167 -167
  45. package/src/styles/overlay.css +61 -61
@@ -1,3 +1,21 @@
1
+ function readUnconstrainedMenuHeight(menu) {
2
+ const previousMaxHeight = menu.style.maxHeight;
3
+ const previousOverflowY = menu.style.overflowY;
4
+ menu.style.maxHeight = "none";
5
+ menu.style.overflowY = "visible";
6
+ const height = menu.offsetHeight;
7
+ menu.style.maxHeight = previousMaxHeight;
8
+ menu.style.overflowY = previousOverflowY;
9
+ return height;
10
+ }
11
+ function resolveMaxHeight(available, minScrollHeight, vh, pad) {
12
+ const viewportCap = Math.max(0, vh - 2 * pad);
13
+ const usable = Math.max(0, Math.min(available, viewportCap));
14
+ if (usable > 0) {
15
+ return usable;
16
+ }
17
+ return Math.min(minScrollHeight, viewportCap);
18
+ }
1
19
  function computeFloatingMenuGeometry(trigger, menu, options = {}) {
2
20
  const pad = options.pad ?? 8;
3
21
  const gap = options.gap ?? 4;
@@ -6,23 +24,34 @@ function computeFloatingMenuGeometry(trigger, menu, options = {}) {
6
24
  const vw = window.innerWidth;
7
25
  const vh = window.innerHeight;
8
26
  const menuWidth = menu.offsetWidth;
9
- const menuHeight = menu.offsetHeight;
27
+ const contentHeight = readUnconstrainedMenuHeight(menu);
10
28
  let left = rect.right - menuWidth;
11
29
  if (left < pad) {
12
30
  left = rect.left;
13
31
  }
14
32
  left = Math.max(pad, Math.min(left, vw - menuWidth - pad));
15
- let top = rect.bottom + gap;
16
- let maxHeight;
17
- if (top + menuHeight > vh - pad) {
18
- const topIfAbove = rect.top - gap - menuHeight;
19
- if (topIfAbove >= pad) {
20
- top = topIfAbove;
21
- } else {
22
- maxHeight = Math.max(minScrollHeight, vh - pad - top);
23
- }
33
+ const topBelow = rect.bottom + gap;
34
+ const spaceBelow = vh - pad - topBelow;
35
+ const spaceAbove = rect.top - gap - pad;
36
+ if (contentHeight <= spaceBelow) {
37
+ return { top: topBelow, left };
38
+ }
39
+ if (contentHeight <= spaceAbove) {
40
+ return { top: rect.top - gap - contentHeight, left };
41
+ }
42
+ if (spaceBelow >= spaceAbove) {
43
+ return {
44
+ top: topBelow,
45
+ left,
46
+ maxHeight: resolveMaxHeight(spaceBelow, minScrollHeight, vh, pad)
47
+ };
24
48
  }
25
- return { top, left, maxHeight };
49
+ const maxHeight = resolveMaxHeight(spaceAbove, minScrollHeight, vh, pad);
50
+ return {
51
+ top: Math.max(pad, rect.top - gap - maxHeight),
52
+ left,
53
+ maxHeight
54
+ };
26
55
  }
27
56
  export {
28
57
  computeFloatingMenuGeometry
@@ -1 +1 @@
1
- {"version":3,"file":"computeFloatingMenuGeometry.js","sources":["../../src/menu/computeFloatingMenuGeometry.ts"],"sourcesContent":["export type FloatingMenuGeometry = {\n top: number;\n left: number;\n maxHeight?: number;\n};\n\nexport type ComputeFloatingMenuGeometryOptions = {\n pad?: number;\n gap?: number;\n minScrollHeight?: number;\n};\n\nexport function computeFloatingMenuGeometry(\n trigger: HTMLElement,\n menu: HTMLElement,\n options: ComputeFloatingMenuGeometryOptions = {},\n): FloatingMenuGeometry {\n const pad = options.pad ?? 8;\n const gap = options.gap ?? 4;\n const minScrollHeight = options.minScrollHeight ?? 120;\n const rect = trigger.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const menuWidth = menu.offsetWidth;\n const menuHeight = menu.offsetHeight;\n\n let left = rect.right - menuWidth;\n if (left < pad) {\n left = rect.left;\n }\n left = Math.max(pad, Math.min(left, vw - menuWidth - pad));\n\n let top = rect.bottom + gap;\n let maxHeight: number | undefined;\n if (top + menuHeight > vh - pad) {\n const topIfAbove = rect.top - gap - menuHeight;\n if (topIfAbove >= pad) {\n top = topIfAbove;\n } else {\n maxHeight = Math.max(minScrollHeight, vh - pad - top);\n }\n }\n return { top, left, maxHeight };\n}\n"],"names":[],"mappings":"AAYO,SAAS,4BACd,SACA,MACA,UAA8C,CAAA,GACxB;AACtB,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,kBAAkB,QAAQ,mBAAmB;AACnD,QAAM,OAAO,QAAQ,sBAAA;AACrB,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,OAAO;AAClB,QAAM,YAAY,KAAK;AACvB,QAAM,aAAa,KAAK;AAExB,MAAI,OAAO,KAAK,QAAQ;AACxB,MAAI,OAAO,KAAK;AACd,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,KAAK,YAAY,GAAG,CAAC;AAEzD,MAAI,MAAM,KAAK,SAAS;AACxB,MAAI;AACJ,MAAI,MAAM,aAAa,KAAK,KAAK;AAC/B,UAAM,aAAa,KAAK,MAAM,MAAM;AACpC,QAAI,cAAc,KAAK;AACrB,YAAM;AAAA,IACR,OAAO;AACL,kBAAY,KAAK,IAAI,iBAAiB,KAAK,MAAM,GAAG;AAAA,IACtD;AAAA,EACF;AACA,SAAO,EAAE,KAAK,MAAM,UAAA;AACtB;"}
1
+ {"version":3,"file":"computeFloatingMenuGeometry.js","sources":["../../src/menu/computeFloatingMenuGeometry.ts"],"sourcesContent":["export type FloatingMenuGeometry = {\r\n top: number;\r\n left: number;\r\n maxHeight?: number;\r\n};\r\n\r\nexport type ComputeFloatingMenuGeometryOptions = {\r\n pad?: number;\r\n gap?: number;\r\n minScrollHeight?: number;\r\n};\r\n\r\n/** Read full content height even if the panel is currently height-constrained. */\r\nfunction readUnconstrainedMenuHeight(menu: HTMLElement): number {\r\n const previousMaxHeight = menu.style.maxHeight;\r\n const previousOverflowY = menu.style.overflowY;\r\n menu.style.maxHeight = 'none';\r\n menu.style.overflowY = 'visible';\r\n const height = menu.offsetHeight;\r\n menu.style.maxHeight = previousMaxHeight;\r\n menu.style.overflowY = previousOverflowY;\r\n return height;\r\n}\r\n\r\n/**\r\n * Cap scrollable panel height to the chosen side's available space (never past the viewport pad).\r\n * `minScrollHeight` is only used when available space collapses to ~0.\r\n */\r\nfunction resolveMaxHeight(available: number, minScrollHeight: number, vh: number, pad: number): number {\r\n const viewportCap = Math.max(0, vh - 2 * pad);\r\n const usable = Math.max(0, Math.min(available, viewportCap));\r\n if (usable > 0) {\r\n return usable;\r\n }\r\n return Math.min(minScrollHeight, viewportCap);\r\n}\r\n\r\nexport function computeFloatingMenuGeometry(\r\n trigger: HTMLElement,\r\n menu: HTMLElement,\r\n options: ComputeFloatingMenuGeometryOptions = {},\r\n): FloatingMenuGeometry {\r\n const pad = options.pad ?? 8;\r\n const gap = options.gap ?? 4;\r\n const minScrollHeight = options.minScrollHeight ?? 120;\r\n const rect = trigger.getBoundingClientRect();\r\n const vw = window.innerWidth;\r\n const vh = window.innerHeight;\r\n const menuWidth = menu.offsetWidth;\r\n const contentHeight = readUnconstrainedMenuHeight(menu);\r\n\r\n let left = rect.right - menuWidth;\r\n if (left < pad) {\r\n left = rect.left;\r\n }\r\n left = Math.max(pad, Math.min(left, vw - menuWidth - pad));\r\n\r\n const topBelow = rect.bottom + gap;\r\n const spaceBelow = vh - pad - topBelow;\r\n const spaceAbove = rect.top - gap - pad;\r\n\r\n if (contentHeight <= spaceBelow) {\r\n return { top: topBelow, left };\r\n }\r\n\r\n if (contentHeight <= spaceAbove) {\r\n return { top: rect.top - gap - contentHeight, left };\r\n }\r\n\r\n // Content taller than both sides — open toward the larger side and scroll inside.\r\n if (spaceBelow >= spaceAbove) {\r\n return {\r\n top: topBelow,\r\n left,\r\n maxHeight: resolveMaxHeight(spaceBelow, minScrollHeight, vh, pad),\r\n };\r\n }\r\n\r\n const maxHeight = resolveMaxHeight(spaceAbove, minScrollHeight, vh, pad);\r\n return {\r\n top: Math.max(pad, rect.top - gap - maxHeight),\r\n left,\r\n maxHeight,\r\n };\r\n}\r\n"],"names":[],"mappings":"AAaA,SAAS,4BAA4B,MAA2B;AAC9D,QAAM,oBAAoB,KAAK,MAAM;AACrC,QAAM,oBAAoB,KAAK,MAAM;AACrC,OAAK,MAAM,YAAY;AACvB,OAAK,MAAM,YAAY;AACvB,QAAM,SAAS,KAAK;AACpB,OAAK,MAAM,YAAY;AACvB,OAAK,MAAM,YAAY;AACvB,SAAO;AACT;AAMA,SAAS,iBAAiB,WAAmB,iBAAyB,IAAY,KAAqB;AACrG,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG;AAC5C,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,WAAW,CAAC;AAC3D,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,iBAAiB,WAAW;AAC9C;AAEO,SAAS,4BACd,SACA,MACA,UAA8C,CAAA,GACxB;AACtB,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,kBAAkB,QAAQ,mBAAmB;AACnD,QAAM,OAAO,QAAQ,sBAAA;AACrB,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,OAAO;AAClB,QAAM,YAAY,KAAK;AACvB,QAAM,gBAAgB,4BAA4B,IAAI;AAEtD,MAAI,OAAO,KAAK,QAAQ;AACxB,MAAI,OAAO,KAAK;AACd,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,KAAK,YAAY,GAAG,CAAC;AAEzD,QAAM,WAAW,KAAK,SAAS;AAC/B,QAAM,aAAa,KAAK,MAAM;AAC9B,QAAM,aAAa,KAAK,MAAM,MAAM;AAEpC,MAAI,iBAAiB,YAAY;AAC/B,WAAO,EAAE,KAAK,UAAU,KAAA;AAAA,EAC1B;AAEA,MAAI,iBAAiB,YAAY;AAC/B,WAAO,EAAE,KAAK,KAAK,MAAM,MAAM,eAAe,KAAA;AAAA,EAChD;AAGA,MAAI,cAAc,YAAY;AAC5B,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,WAAW,iBAAiB,YAAY,iBAAiB,IAAI,GAAG;AAAA,IAAA;AAAA,EAEpE;AAEA,QAAM,YAAY,iBAAiB,YAAY,iBAAiB,IAAI,GAAG;AACvE,SAAO;AAAA,IACL,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,MAAM,SAAS;AAAA,IAC7C;AAAA,IACA;AAAA,EAAA;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFloatingMenuGeometry.d.ts","sourceRoot":"","sources":["../../src/menu/useFloatingMenuGeometry.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAEvG,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,WAAW,EACX,kBAAkB,GACnB,EAAE,8BAA8B;;;;EA8ChC"}
1
+ {"version":3,"file":"useFloatingMenuGeometry.d.ts","sourceRoot":"","sources":["../../src/menu/useFloatingMenuGeometry.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAEvG,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,WAAW,EACX,kBAAkB,GACnB,EAAE,8BAA8B;;;;EAwDhC"}
@@ -21,6 +21,14 @@ function useFloatingMenuGeometry({
21
21
  }
22
22
  setMenuGeometry(computeFloatingMenuGeometry(trigger, menu));
23
23
  };
24
+ const onScroll = (event) => {
25
+ const menu = menuPanelRef.current;
26
+ const target = event.target;
27
+ if (menu && target instanceof Node && menu.contains(target)) {
28
+ return;
29
+ }
30
+ update();
31
+ };
24
32
  update();
25
33
  const scrollRoots = [];
26
34
  if (scrollRootSelector) {
@@ -30,15 +38,15 @@ function useFloatingMenuGeometry({
30
38
  }
31
39
  }
32
40
  window.addEventListener("resize", update);
33
- window.addEventListener("scroll", update, true);
41
+ window.addEventListener("scroll", onScroll, true);
34
42
  for (const root of scrollRoots) {
35
- root.addEventListener("scroll", update, { passive: true });
43
+ root.addEventListener("scroll", onScroll, { passive: true });
36
44
  }
37
45
  return () => {
38
46
  window.removeEventListener("resize", update);
39
- window.removeEventListener("scroll", update, true);
47
+ window.removeEventListener("scroll", onScroll, true);
40
48
  for (const root of scrollRoots) {
41
- root.removeEventListener("scroll", update);
49
+ root.removeEventListener("scroll", onScroll);
42
50
  }
43
51
  };
44
52
  }, [menuOpen, menuMounted, scrollRootSelector]);
@@ -1 +1 @@
1
- {"version":3,"file":"useFloatingMenuGeometry.js","sources":["../../src/menu/useFloatingMenuGeometry.ts"],"sourcesContent":["import { useLayoutEffect, useRef, useState } from 'react';\nimport { computeFloatingMenuGeometry, type FloatingMenuGeometry } from './computeFloatingMenuGeometry';\n\nexport type UseFloatingMenuGeometryOptions = {\n menuOpen: boolean;\n menuMounted: boolean;\n /** 额外监听 scroll 的容器选择器(如 `.app-main`) */\n scrollRootSelector?: string;\n};\n\nexport function useFloatingMenuGeometry({\n menuOpen,\n menuMounted,\n scrollRootSelector,\n}: UseFloatingMenuGeometryOptions) {\n const menuPanelRef = useRef<HTMLUListElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const [menuGeometry, setMenuGeometry] = useState<FloatingMenuGeometry | null>(null);\n\n useLayoutEffect(() => {\n if (!menuOpen || !menuMounted) {\n setMenuGeometry(null);\n return;\n }\n\n const update = () => {\n const trigger = triggerRef.current;\n const menu = menuPanelRef.current;\n if (!trigger || !menu) {\n return;\n }\n setMenuGeometry(computeFloatingMenuGeometry(trigger, menu));\n };\n\n update();\n\n const scrollRoots: HTMLElement[] = [];\n if (scrollRootSelector) {\n const root = document.querySelector<HTMLElement>(scrollRootSelector);\n if (root) {\n scrollRoots.push(root);\n }\n }\n\n window.addEventListener('resize', update);\n window.addEventListener('scroll', update, true);\n for (const root of scrollRoots) {\n root.addEventListener('scroll', update, { passive: true });\n }\n\n return () => {\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n for (const root of scrollRoots) {\n root.removeEventListener('scroll', update);\n }\n };\n }, [menuOpen, menuMounted, scrollRootSelector]);\n\n return { menuPanelRef, triggerRef, menuGeometry };\n}\n"],"names":[],"mappings":";;AAUO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,eAAe,OAAgC,IAAI;AACzD,QAAM,aAAa,OAAiC,IAAI;AACxD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAsC,IAAI;AAElF,kBAAgB,MAAM;AACpB,QAAI,CAAC,YAAY,CAAC,aAAa;AAC7B,sBAAgB,IAAI;AACpB;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AACnB,YAAM,UAAU,WAAW;AAC3B,YAAM,OAAO,aAAa;AAC1B,UAAI,CAAC,WAAW,CAAC,MAAM;AACrB;AAAA,MACF;AACA,sBAAgB,4BAA4B,SAAS,IAAI,CAAC;AAAA,IAC5D;AAEA,WAAA;AAEA,UAAM,cAA6B,CAAA;AACnC,QAAI,oBAAoB;AACtB,YAAM,OAAO,SAAS,cAA2B,kBAAkB;AACnE,UAAI,MAAM;AACR,oBAAY,KAAK,IAAI;AAAA,MACvB;AAAA,IACF;AAEA,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,iBAAiB,UAAU,QAAQ,IAAI;AAC9C,eAAW,QAAQ,aAAa;AAC9B,WAAK,iBAAiB,UAAU,QAAQ,EAAE,SAAS,MAAM;AAAA,IAC3D;AAEA,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,MAAM;AAC3C,aAAO,oBAAoB,UAAU,QAAQ,IAAI;AACjD,iBAAW,QAAQ,aAAa;AAC9B,aAAK,oBAAoB,UAAU,MAAM;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,aAAa,kBAAkB,CAAC;AAE9C,SAAO,EAAE,cAAc,YAAY,aAAA;AACrC;"}
1
+ {"version":3,"file":"useFloatingMenuGeometry.js","sources":["../../src/menu/useFloatingMenuGeometry.ts"],"sourcesContent":["import { useLayoutEffect, useRef, useState } from 'react';\r\nimport { computeFloatingMenuGeometry, type FloatingMenuGeometry } from './computeFloatingMenuGeometry';\r\n\r\nexport type UseFloatingMenuGeometryOptions = {\r\n menuOpen: boolean;\r\n menuMounted: boolean;\r\n /** 额外监听 scroll 的容器选择器(如 `.app-main`) */\r\n scrollRootSelector?: string;\r\n};\r\n\r\nexport function useFloatingMenuGeometry({\r\n menuOpen,\r\n menuMounted,\r\n scrollRootSelector,\r\n}: UseFloatingMenuGeometryOptions) {\r\n const menuPanelRef = useRef<HTMLUListElement | null>(null);\r\n const triggerRef = useRef<HTMLButtonElement | null>(null);\r\n const [menuGeometry, setMenuGeometry] = useState<FloatingMenuGeometry | null>(null);\r\n\r\n useLayoutEffect(() => {\r\n if (!menuOpen || !menuMounted) {\r\n setMenuGeometry(null);\r\n return;\r\n }\r\n\r\n const update = () => {\r\n const trigger = triggerRef.current;\r\n const menu = menuPanelRef.current;\r\n if (!trigger || !menu) {\r\n return;\r\n }\r\n setMenuGeometry(computeFloatingMenuGeometry(trigger, menu));\r\n };\r\n\r\n const onScroll = (event: Event) => {\r\n const menu = menuPanelRef.current;\r\n const target = event.target;\r\n // Ignore the panel's own scrolling so geometry does not thrash / reset maxHeight.\r\n if (menu && target instanceof Node && menu.contains(target)) {\r\n return;\r\n }\r\n update();\r\n };\r\n\r\n update();\r\n\r\n const scrollRoots: HTMLElement[] = [];\r\n if (scrollRootSelector) {\r\n const root = document.querySelector<HTMLElement>(scrollRootSelector);\r\n if (root) {\r\n scrollRoots.push(root);\r\n }\r\n }\r\n\r\n window.addEventListener('resize', update);\r\n window.addEventListener('scroll', onScroll, true);\r\n for (const root of scrollRoots) {\r\n root.addEventListener('scroll', onScroll, { passive: true });\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n window.removeEventListener('scroll', onScroll, true);\r\n for (const root of scrollRoots) {\r\n root.removeEventListener('scroll', onScroll);\r\n }\r\n };\r\n }, [menuOpen, menuMounted, scrollRootSelector]);\r\n\r\n return { menuPanelRef, triggerRef, menuGeometry };\r\n}\r\n"],"names":[],"mappings":";;AAUO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,eAAe,OAAgC,IAAI;AACzD,QAAM,aAAa,OAAiC,IAAI;AACxD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAsC,IAAI;AAElF,kBAAgB,MAAM;AACpB,QAAI,CAAC,YAAY,CAAC,aAAa;AAC7B,sBAAgB,IAAI;AACpB;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AACnB,YAAM,UAAU,WAAW;AAC3B,YAAM,OAAO,aAAa;AAC1B,UAAI,CAAC,WAAW,CAAC,MAAM;AACrB;AAAA,MACF;AACA,sBAAgB,4BAA4B,SAAS,IAAI,CAAC;AAAA,IAC5D;AAEA,UAAM,WAAW,CAAC,UAAiB;AACjC,YAAM,OAAO,aAAa;AAC1B,YAAM,SAAS,MAAM;AAErB,UAAI,QAAQ,kBAAkB,QAAQ,KAAK,SAAS,MAAM,GAAG;AAC3D;AAAA,MACF;AACA,aAAA;AAAA,IACF;AAEA,WAAA;AAEA,UAAM,cAA6B,CAAA;AACnC,QAAI,oBAAoB;AACtB,YAAM,OAAO,SAAS,cAA2B,kBAAkB;AACnE,UAAI,MAAM;AACR,oBAAY,KAAK,IAAI;AAAA,MACvB;AAAA,IACF;AAEA,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,iBAAiB,UAAU,UAAU,IAAI;AAChD,eAAW,QAAQ,aAAa;AAC9B,WAAK,iBAAiB,UAAU,UAAU,EAAE,SAAS,MAAM;AAAA,IAC7D;AAEA,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,MAAM;AAC3C,aAAO,oBAAoB,UAAU,UAAU,IAAI;AACnD,iBAAW,QAAQ,aAAa;AAC9B,aAAK,oBAAoB,UAAU,QAAQ;AAAA,MAC7C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,aAAa,kBAAkB,CAAC;AAE9C,SAAO,EAAE,cAAc,YAAY,aAAA;AACrC;"}
@@ -11,7 +11,7 @@ type OverlayStackContextValue = {
11
11
  };
12
12
  export declare function OverlayStackProvider({ children }: {
13
13
  children: ReactNode;
14
- }): import("react/jsx-runtime").JSX.Element;
14
+ }): import("react").JSX.Element;
15
15
  export declare function useOverlayStack(): OverlayStackContextValue;
16
16
  export {};
17
17
  //# sourceMappingURL=OverlayStackProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayStackProvider.d.ts","sourceRoot":"","sources":["../../src/overlay/OverlayStackProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEnF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/B,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,2BAA2B,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,4BAA4B,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD,CAAC;AAiBF,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAuHzE;AAED,wBAAgB,eAAe,6BAQ9B"}
1
+ {"version":3,"file":"OverlayStackProvider.d.ts","sourceRoot":"","sources":["../../src/overlay/OverlayStackProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEnF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/B,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,2BAA2B,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,4BAA4B,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD,CAAC;AAiBF,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAuHzE;AAED,wBAAgB,eAAe,6BAQ9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayStackProvider.js","sources":["../../src/overlay/OverlayStackProvider.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { pushOverlayHistoryState } from './overlayHistory';\nimport { computeOverlayZIndex, type OverlayStackEntry } from './overlayStackTypes';\n\ntype OverlayStackContextValue = {\n register: (entry: OverlayStackEntry) => void;\n unregister: (id: string) => void;\n isTop: (id: string) => boolean;\n getZIndex: (id: string) => number;\n pushOverlayHistory: (id: string) => void;\n syncOverlayHistoryOnUiClose: (id: string) => void;\n acknowledgeOverlayHistoryPop: (id: string) => void;\n};\n\nconst OverlayStackContext = createContext<OverlayStackContextValue | null>(null);\n\nconst isEditableTarget = (target: EventTarget | null) => {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n return (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n target.isContentEditable\n );\n};\n\nexport function OverlayStackProvider({ children }: { children: ReactNode }) {\n const entriesRef = useRef(new Map<string, OverlayStackEntry>());\n const orderRef = useRef<string[]>([]);\n const historyActiveIdsRef = useRef(new Set<string>());\n const ignoreNextPopstateRef = useRef(false);\n const [order, setOrder] = useState<string[]>([]);\n\n orderRef.current = order;\n\n const register = useCallback((entry: OverlayStackEntry) => {\n entriesRef.current.set(entry.id, entry);\n setOrder((prev) => {\n const without = prev.filter((entryId) => entryId !== entry.id);\n return [...without, entry.id];\n });\n }, []);\n\n const unregister = useCallback((id: string) => {\n entriesRef.current.delete(id);\n setOrder((prev) => prev.filter((entryId) => entryId !== id));\n }, []);\n\n const pushOverlayHistory = useCallback((id: string) => {\n if (historyActiveIdsRef.current.has(id)) {\n return;\n }\n\n historyActiveIdsRef.current.add(id);\n pushOverlayHistoryState(id);\n }, []);\n\n const syncOverlayHistoryOnUiClose = useCallback((id: string) => {\n if (!historyActiveIdsRef.current.has(id)) {\n return;\n }\n\n historyActiveIdsRef.current.delete(id);\n ignoreNextPopstateRef.current = true;\n history.back();\n }, []);\n\n const acknowledgeOverlayHistoryPop = useCallback((id: string) => {\n historyActiveIdsRef.current.delete(id);\n }, []);\n\n const topId = order[order.length - 1] ?? null;\n\n const value = useMemo<OverlayStackContextValue>(\n () => ({\n register,\n unregister,\n isTop: (id) => topId === id,\n getZIndex: (id) => {\n const index = order.indexOf(id);\n return computeOverlayZIndex(index < 0 ? 0 : index);\n },\n pushOverlayHistory,\n syncOverlayHistoryOnUiClose,\n acknowledgeOverlayHistoryPop,\n }),\n [\n acknowledgeOverlayHistoryPop,\n order,\n pushOverlayHistory,\n register,\n syncOverlayHistoryOnUiClose,\n topId,\n unregister,\n ],\n );\n\n useEffect(() => {\n const onPopState = () => {\n if (ignoreNextPopstateRef.current) {\n ignoreNextPopstateRef.current = false;\n return;\n }\n\n const top = orderRef.current[orderRef.current.length - 1];\n\n if (!top) {\n return;\n }\n\n const entry = entriesRef.current.get(top);\n\n if (!entry) {\n return;\n }\n\n acknowledgeOverlayHistoryPop(top);\n entry.onDismiss();\n };\n\n window.addEventListener('popstate', onPopState);\n return () => window.removeEventListener('popstate', onPopState);\n }, [acknowledgeOverlayHistoryPop]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || isEditableTarget(event.target)) {\n return;\n }\n\n const top = topId ? entriesRef.current.get(topId) : undefined;\n\n if (!top || top.dismissOnEscape === false) {\n return;\n }\n\n event.preventDefault();\n top.onDismiss();\n };\n\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [topId]);\n\n return <OverlayStackContext.Provider value={value}>{children}</OverlayStackContext.Provider>;\n}\n\nexport function useOverlayStack() {\n const context = useContext(OverlayStackContext);\n\n if (!context) {\n throw new Error('useOverlayStack must be used within OverlayStackProvider');\n }\n\n return context;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OverlayStackProvider.js","sources":["../../src/overlay/OverlayStackProvider.tsx"],"sourcesContent":["import {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type ReactNode,\r\n} from 'react';\r\nimport { pushOverlayHistoryState } from './overlayHistory';\r\nimport { computeOverlayZIndex, type OverlayStackEntry } from './overlayStackTypes';\r\n\r\ntype OverlayStackContextValue = {\r\n register: (entry: OverlayStackEntry) => void;\r\n unregister: (id: string) => void;\r\n isTop: (id: string) => boolean;\r\n getZIndex: (id: string) => number;\r\n pushOverlayHistory: (id: string) => void;\r\n syncOverlayHistoryOnUiClose: (id: string) => void;\r\n acknowledgeOverlayHistoryPop: (id: string) => void;\r\n};\r\n\r\nconst OverlayStackContext = createContext<OverlayStackContextValue | null>(null);\r\n\r\nconst isEditableTarget = (target: EventTarget | null) => {\r\n if (!(target instanceof HTMLElement)) {\r\n return false;\r\n }\r\n\r\n return (\r\n target instanceof HTMLInputElement ||\r\n target instanceof HTMLTextAreaElement ||\r\n target instanceof HTMLSelectElement ||\r\n target.isContentEditable\r\n );\r\n};\r\n\r\nexport function OverlayStackProvider({ children }: { children: ReactNode }) {\r\n const entriesRef = useRef(new Map<string, OverlayStackEntry>());\r\n const orderRef = useRef<string[]>([]);\r\n const historyActiveIdsRef = useRef(new Set<string>());\r\n const ignoreNextPopstateRef = useRef(false);\r\n const [order, setOrder] = useState<string[]>([]);\r\n\r\n orderRef.current = order;\r\n\r\n const register = useCallback((entry: OverlayStackEntry) => {\r\n entriesRef.current.set(entry.id, entry);\r\n setOrder((prev) => {\r\n const without = prev.filter((entryId) => entryId !== entry.id);\r\n return [...without, entry.id];\r\n });\r\n }, []);\r\n\r\n const unregister = useCallback((id: string) => {\r\n entriesRef.current.delete(id);\r\n setOrder((prev) => prev.filter((entryId) => entryId !== id));\r\n }, []);\r\n\r\n const pushOverlayHistory = useCallback((id: string) => {\r\n if (historyActiveIdsRef.current.has(id)) {\r\n return;\r\n }\r\n\r\n historyActiveIdsRef.current.add(id);\r\n pushOverlayHistoryState(id);\r\n }, []);\r\n\r\n const syncOverlayHistoryOnUiClose = useCallback((id: string) => {\r\n if (!historyActiveIdsRef.current.has(id)) {\r\n return;\r\n }\r\n\r\n historyActiveIdsRef.current.delete(id);\r\n ignoreNextPopstateRef.current = true;\r\n history.back();\r\n }, []);\r\n\r\n const acknowledgeOverlayHistoryPop = useCallback((id: string) => {\r\n historyActiveIdsRef.current.delete(id);\r\n }, []);\r\n\r\n const topId = order[order.length - 1] ?? null;\r\n\r\n const value = useMemo<OverlayStackContextValue>(\r\n () => ({\r\n register,\r\n unregister,\r\n isTop: (id) => topId === id,\r\n getZIndex: (id) => {\r\n const index = order.indexOf(id);\r\n return computeOverlayZIndex(index < 0 ? 0 : index);\r\n },\r\n pushOverlayHistory,\r\n syncOverlayHistoryOnUiClose,\r\n acknowledgeOverlayHistoryPop,\r\n }),\r\n [\r\n acknowledgeOverlayHistoryPop,\r\n order,\r\n pushOverlayHistory,\r\n register,\r\n syncOverlayHistoryOnUiClose,\r\n topId,\r\n unregister,\r\n ],\r\n );\r\n\r\n useEffect(() => {\r\n const onPopState = () => {\r\n if (ignoreNextPopstateRef.current) {\r\n ignoreNextPopstateRef.current = false;\r\n return;\r\n }\r\n\r\n const top = orderRef.current[orderRef.current.length - 1];\r\n\r\n if (!top) {\r\n return;\r\n }\r\n\r\n const entry = entriesRef.current.get(top);\r\n\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n acknowledgeOverlayHistoryPop(top);\r\n entry.onDismiss();\r\n };\r\n\r\n window.addEventListener('popstate', onPopState);\r\n return () => window.removeEventListener('popstate', onPopState);\r\n }, [acknowledgeOverlayHistoryPop]);\r\n\r\n useEffect(() => {\r\n const onKeyDown = (event: KeyboardEvent) => {\r\n if (event.key !== 'Escape' || isEditableTarget(event.target)) {\r\n return;\r\n }\r\n\r\n const top = topId ? entriesRef.current.get(topId) : undefined;\r\n\r\n if (!top || top.dismissOnEscape === false) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n top.onDismiss();\r\n };\r\n\r\n window.addEventListener('keydown', onKeyDown);\r\n return () => window.removeEventListener('keydown', onKeyDown);\r\n }, [topId]);\r\n\r\n return <OverlayStackContext.Provider value={value}>{children}</OverlayStackContext.Provider>;\r\n}\r\n\r\nexport function useOverlayStack() {\r\n const context = useContext(OverlayStackContext);\r\n\r\n if (!context) {\r\n throw new Error('useOverlayStack must be used within OverlayStackProvider');\r\n }\r\n\r\n return context;\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"overlayHistory.js","sources":["../../src/overlay/overlayHistory.ts"],"sourcesContent":["/** `history.state` 上标记叠层条目的键,用于区分站内叠层与正常导航。 */\nexport const OVERLAY_HISTORY_STATE_KEY = 'overlayStack' as const;\n\nexport type OverlayHistoryState = {\n [OVERLAY_HISTORY_STATE_KEY]: string;\n};\n\nexport function isOverlayHistoryState(state: unknown): state is OverlayHistoryState {\n return (\n typeof state === 'object' &&\n state !== null &&\n OVERLAY_HISTORY_STATE_KEY in state &&\n typeof (state as OverlayHistoryState)[OVERLAY_HISTORY_STATE_KEY] === 'string'\n );\n}\n\nexport function pushOverlayHistoryState(overlayId: string) {\n const next: OverlayHistoryState = { [OVERLAY_HISTORY_STATE_KEY]: overlayId };\n history.pushState(next, '', window.location.href);\n}\n"],"names":[],"mappings":"AACO,MAAM,4BAA4B;AAMlC,SAAS,sBAAsB,OAA8C;AAClF,SACE,OAAO,UAAU,YACjB,UAAU,QACV,6BAA6B,SAC7B,OAAQ,MAA8B,yBAAyB,MAAM;AAEzE;AAEO,SAAS,wBAAwB,WAAmB;AACzD,QAAM,OAA4B,EAAE,CAAC,yBAAyB,GAAG,UAAA;AACjE,UAAQ,UAAU,MAAM,IAAI,OAAO,SAAS,IAAI;AAClD;"}
1
+ {"version":3,"file":"overlayHistory.js","sources":["../../src/overlay/overlayHistory.ts"],"sourcesContent":["/** `history.state` 上标记叠层条目的键,用于区分站内叠层与正常导航。 */\r\nexport const OVERLAY_HISTORY_STATE_KEY = 'overlayStack' as const;\r\n\r\nexport type OverlayHistoryState = {\r\n [OVERLAY_HISTORY_STATE_KEY]: string;\r\n};\r\n\r\nexport function isOverlayHistoryState(state: unknown): state is OverlayHistoryState {\r\n return (\r\n typeof state === 'object' &&\r\n state !== null &&\r\n OVERLAY_HISTORY_STATE_KEY in state &&\r\n typeof (state as OverlayHistoryState)[OVERLAY_HISTORY_STATE_KEY] === 'string'\r\n );\r\n}\r\n\r\nexport function pushOverlayHistoryState(overlayId: string) {\r\n const next: OverlayHistoryState = { [OVERLAY_HISTORY_STATE_KEY]: overlayId };\r\n history.pushState(next, '', window.location.href);\r\n}\r\n"],"names":[],"mappings":"AACO,MAAM,4BAA4B;AAMlC,SAAS,sBAAsB,OAA8C;AAClF,SACE,OAAO,UAAU,YACjB,UAAU,QACV,6BAA6B,SAC7B,OAAQ,MAA8B,yBAAyB,MAAM;AAEzE;AAEO,SAAS,wBAAwB,WAAmB;AACzD,QAAM,OAA4B,EAAE,CAAC,yBAAyB,GAAG,UAAA;AACjE,UAAQ,UAAU,MAAM,IAAI,OAAO,SAAS,IAAI;AAClD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"overlayStackTypes.js","sources":["../../src/overlay/overlayStackTypes.ts"],"sourcesContent":["/** 叠层 z-index:1010 + 栈内序号 × 10(序号从 0 起) */\nexport const OVERLAY_Z_BASE = 1010;\nexport const OVERLAY_Z_STEP = 10;\n\nexport type OverlayStackEntry = {\n id: string;\n onDismiss: () => void;\n dismissOnEscape: boolean;\n};\n\nexport const computeOverlayZIndex = (stackIndex: number) => OVERLAY_Z_BASE + stackIndex * OVERLAY_Z_STEP;\n"],"names":[],"mappings":"AACO,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AAQvB,MAAM,uBAAuB,CAAC,eAAuB,iBAAiB,aAAa;"}
1
+ {"version":3,"file":"overlayStackTypes.js","sources":["../../src/overlay/overlayStackTypes.ts"],"sourcesContent":["/** 叠层 z-index:1010 + 栈内序号 × 10(序号从 0 起) */\r\nexport const OVERLAY_Z_BASE = 1010;\r\nexport const OVERLAY_Z_STEP = 10;\r\n\r\nexport type OverlayStackEntry = {\r\n id: string;\r\n onDismiss: () => void;\r\n dismissOnEscape: boolean;\r\n};\r\n\r\nexport const computeOverlayZIndex = (stackIndex: number) => OVERLAY_Z_BASE + stackIndex * OVERLAY_Z_STEP;\r\n"],"names":[],"mappings":"AACO,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AAQvB,MAAM,uBAAuB,CAAC,eAAuB,iBAAiB,aAAa;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useOverlayStackEntry.js","sources":["../../src/overlay/useOverlayStackEntry.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useOverlayStack } from './OverlayStackProvider';\n\nexport type UseOverlayStackEntryOptions = {\n id: string;\n open: boolean;\n onDismiss: () => void;\n dismissOnEscape?: boolean;\n};\n\nexport function useOverlayStackEntry({\n id,\n open,\n onDismiss,\n dismissOnEscape = true,\n}: UseOverlayStackEntryOptions) {\n const {\n register,\n unregister,\n isTop,\n getZIndex,\n pushOverlayHistory,\n syncOverlayHistoryOnUiClose,\n } = useOverlayStack();\n const onDismissRef = useRef(onDismiss);\n const openRef = useRef(open);\n onDismissRef.current = onDismiss;\n openRef.current = open;\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n register({\n id,\n onDismiss: () => onDismissRef.current(),\n dismissOnEscape,\n });\n\n return () => {\n unregister(id);\n };\n }, [dismissOnEscape, id, open, register, unregister]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n pushOverlayHistory(id);\n\n return () => {\n queueMicrotask(() => {\n if (!openRef.current) {\n syncOverlayHistoryOnUiClose(id);\n }\n });\n };\n }, [id, open, pushOverlayHistory, syncOverlayHistoryOnUiClose]);\n\n return {\n isBackdropActive: open && isTop(id),\n zIndex: getZIndex(id),\n };\n}\n"],"names":[],"mappings":";;AAUO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAAgC;AAC9B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE,gBAAA;AACJ,QAAM,eAAe,OAAO,SAAS;AACrC,QAAM,UAAU,OAAO,IAAI;AAC3B,eAAa,UAAU;AACvB,UAAQ,UAAU;AAElB,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,aAAS;AAAA,MACP;AAAA,MACA,WAAW,MAAM,aAAa,QAAA;AAAA,MAC9B;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,iBAAW,EAAE;AAAA,IACf;AAAA,EACF,GAAG,CAAC,iBAAiB,IAAI,MAAM,UAAU,UAAU,CAAC;AAEpD,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,uBAAmB,EAAE;AAErB,WAAO,MAAM;AACX,qBAAe,MAAM;AACnB,YAAI,CAAC,QAAQ,SAAS;AACpB,sCAA4B,EAAE;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,IAAI,MAAM,oBAAoB,2BAA2B,CAAC;AAE9D,SAAO;AAAA,IACL,kBAAkB,QAAQ,MAAM,EAAE;AAAA,IAClC,QAAQ,UAAU,EAAE;AAAA,EAAA;AAExB;"}
1
+ {"version":3,"file":"useOverlayStackEntry.js","sources":["../../src/overlay/useOverlayStackEntry.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\r\nimport { useOverlayStack } from './OverlayStackProvider';\r\n\r\nexport type UseOverlayStackEntryOptions = {\r\n id: string;\r\n open: boolean;\r\n onDismiss: () => void;\r\n dismissOnEscape?: boolean;\r\n};\r\n\r\nexport function useOverlayStackEntry({\r\n id,\r\n open,\r\n onDismiss,\r\n dismissOnEscape = true,\r\n}: UseOverlayStackEntryOptions) {\r\n const {\r\n register,\r\n unregister,\r\n isTop,\r\n getZIndex,\r\n pushOverlayHistory,\r\n syncOverlayHistoryOnUiClose,\r\n } = useOverlayStack();\r\n const onDismissRef = useRef(onDismiss);\r\n const openRef = useRef(open);\r\n onDismissRef.current = onDismiss;\r\n openRef.current = open;\r\n\r\n useEffect(() => {\r\n if (!open) {\r\n return;\r\n }\r\n\r\n register({\r\n id,\r\n onDismiss: () => onDismissRef.current(),\r\n dismissOnEscape,\r\n });\r\n\r\n return () => {\r\n unregister(id);\r\n };\r\n }, [dismissOnEscape, id, open, register, unregister]);\r\n\r\n useEffect(() => {\r\n if (!open) {\r\n return;\r\n }\r\n\r\n pushOverlayHistory(id);\r\n\r\n return () => {\r\n queueMicrotask(() => {\r\n if (!openRef.current) {\r\n syncOverlayHistoryOnUiClose(id);\r\n }\r\n });\r\n };\r\n }, [id, open, pushOverlayHistory, syncOverlayHistoryOnUiClose]);\r\n\r\n return {\r\n isBackdropActive: open && isTop(id),\r\n zIndex: getZIndex(id),\r\n };\r\n}\r\n"],"names":[],"mappings":";;AAUO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAAgC;AAC9B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE,gBAAA;AACJ,QAAM,eAAe,OAAO,SAAS;AACrC,QAAM,UAAU,OAAO,IAAI;AAC3B,eAAa,UAAU;AACvB,UAAQ,UAAU;AAElB,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,aAAS;AAAA,MACP;AAAA,MACA,WAAW,MAAM,aAAa,QAAA;AAAA,MAC9B;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,iBAAW,EAAE;AAAA,IACf;AAAA,EACF,GAAG,CAAC,iBAAiB,IAAI,MAAM,UAAU,UAAU,CAAC;AAEpD,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,uBAAmB,EAAE;AAErB,WAAO,MAAM;AACX,qBAAe,MAAM;AACnB,YAAI,CAAC,QAAQ,SAAS;AACpB,sCAA4B,EAAE;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,IAAI,MAAM,oBAAoB,2BAA2B,CAAC;AAE9D,SAAO;AAAA,IACL,kBAAkB,QAAQ,MAAM,EAAE;AAAA,IAClC,QAAQ,UAAU,EAAE;AAAA,EAAA;AAExB;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umamichi-ui/common-components",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Reusable React UI components for Umamichi sites (overlay stack, dialogs, menus)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -70,7 +70,7 @@
70
70
  "devDependencies": {
71
71
  "@types/react": "^19.2.2",
72
72
  "@types/react-dom": "^19.2.2",
73
- "@umamichi-ui/common-css": "^0.16.0",
73
+ "@umamichi-ui/common-css": "^0.18.0",
74
74
  "@vitejs/plugin-react": "^5.1.0",
75
75
  "react": "^19.2.0",
76
76
  "react-dom": "^19.2.0",
@@ -1,122 +1,122 @@
1
- .about-dialog {
2
- width: min(calc(100vw - 48px), 36rem);
3
- max-width: min(calc(100vw - 48px), 36rem);
4
- }
5
-
6
- .about-dialog-body {
7
- display: flex;
8
- flex-direction: column;
9
- gap: 0;
10
- }
11
-
12
- .about-dialog-product {
13
- text-align: center;
14
- }
15
-
16
- .about-dialog-app-name {
17
- margin: 0 0 6px;
18
- font-size: 1.05rem;
19
- font-weight: var(--site-weight-regular);
20
- line-height: 1.35;
21
- }
22
-
23
- .about-dialog-version {
24
- margin: 0 0 10px;
25
- color: var(--site-muted-fg);
26
- font-size: 0.875rem;
27
- font-weight: var(--site-weight-regular);
28
- line-height: 1.4;
29
- }
30
-
31
- .about-dialog-channel {
32
- color: var(--site-subtle-fg);
33
- }
34
-
35
- .about-dialog-tagline {
36
- margin: 0;
37
- color: var(--site-content-fg);
38
- font-size: 0.9rem;
39
- font-weight: var(--site-weight-regular);
40
- line-height: 1.55;
41
- }
42
-
43
- .about-dialog-copyright {
44
- margin: 14px 0 0;
45
- text-align: center;
46
- color: var(--site-muted-fg);
47
- font-size: 0.86rem;
48
- font-weight: var(--site-weight-regular);
49
- }
50
-
51
- .about-dialog-divider {
52
- margin: 16px 0;
53
- border: 0;
54
- border-top: 1px solid var(--site-border);
55
- }
56
-
57
- .about-dialog-section + .about-dialog-section {
58
- margin-top: 14px;
59
- }
60
-
61
- .about-dialog-section-title {
62
- margin: 0 0 6px;
63
- font-size: 0.82rem;
64
- font-weight: var(--site-weight-semibold);
65
- letter-spacing: 0.04em;
66
- color: var(--site-subtle-fg);
67
- text-transform: uppercase;
68
- }
69
-
70
- .about-dialog-section-text {
71
- margin: 0;
72
- font-size: 0.9rem;
73
- font-weight: var(--site-weight-regular);
74
- line-height: 1.55;
75
- color: var(--site-content-fg);
76
- }
77
-
78
- .about-dialog-meta {
79
- margin: 14px 0 0;
80
- }
81
-
82
- .about-dialog-meta-row {
83
- display: grid;
84
- grid-template-columns: 5.5rem minmax(0, 1fr);
85
- gap: 8px 12px;
86
- align-items: baseline;
87
- font-size: 0.875rem;
88
- font-weight: var(--site-weight-regular);
89
- line-height: 1.45;
90
- }
91
-
92
- .about-dialog-meta-row + .about-dialog-meta-row {
93
- margin-top: 8px;
94
- }
95
-
96
- .about-dialog-meta dt {
97
- margin: 0;
98
- color: var(--site-muted-fg);
99
- }
100
-
101
- .about-dialog-meta dd {
102
- margin: 0;
103
- overflow-wrap: anywhere;
104
- }
105
-
106
- .about-dialog-meta-row:first-child dd a {
107
- white-space: nowrap;
108
- }
109
-
110
- @media (max-width: 560px) {
111
- .about-dialog-meta-row:first-child dd a {
112
- white-space: normal;
113
- }
114
- }
115
-
116
- .about-dialog-actions {
117
- justify-content: center;
118
- }
119
-
120
- .about-dialog-actions .primary-button {
121
- min-width: 6.5rem;
122
- }
1
+ .about-dialog {
2
+ width: min(calc(100vw - 48px), 36rem);
3
+ max-width: min(calc(100vw - 48px), 36rem);
4
+ }
5
+
6
+ .about-dialog-body {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: 0;
10
+ }
11
+
12
+ .about-dialog-product {
13
+ text-align: center;
14
+ }
15
+
16
+ .about-dialog-app-name {
17
+ margin: 0 0 6px;
18
+ font-size: 1.05rem;
19
+ font-weight: var(--site-weight-regular);
20
+ line-height: 1.35;
21
+ }
22
+
23
+ .about-dialog-version {
24
+ margin: 0 0 10px;
25
+ color: var(--site-muted-fg);
26
+ font-size: 0.875rem;
27
+ font-weight: var(--site-weight-regular);
28
+ line-height: 1.4;
29
+ }
30
+
31
+ .about-dialog-channel {
32
+ color: var(--site-subtle-fg);
33
+ }
34
+
35
+ .about-dialog-tagline {
36
+ margin: 0;
37
+ color: var(--site-content-fg);
38
+ font-size: 0.9rem;
39
+ font-weight: var(--site-weight-regular);
40
+ line-height: 1.55;
41
+ }
42
+
43
+ .about-dialog-copyright {
44
+ margin: 14px 0 0;
45
+ text-align: center;
46
+ color: var(--site-muted-fg);
47
+ font-size: 0.86rem;
48
+ font-weight: var(--site-weight-regular);
49
+ }
50
+
51
+ .about-dialog-divider {
52
+ margin: 16px 0;
53
+ border: 0;
54
+ border-top: 1px solid var(--site-border);
55
+ }
56
+
57
+ .about-dialog-section + .about-dialog-section {
58
+ margin-top: 14px;
59
+ }
60
+
61
+ .about-dialog-section-title {
62
+ margin: 0 0 6px;
63
+ font-size: 0.82rem;
64
+ font-weight: var(--site-weight-semibold);
65
+ letter-spacing: 0.04em;
66
+ color: var(--site-subtle-fg);
67
+ text-transform: uppercase;
68
+ }
69
+
70
+ .about-dialog-section-text {
71
+ margin: 0;
72
+ font-size: 0.9rem;
73
+ font-weight: var(--site-weight-regular);
74
+ line-height: 1.55;
75
+ color: var(--site-content-fg);
76
+ }
77
+
78
+ .about-dialog-meta {
79
+ margin: 14px 0 0;
80
+ }
81
+
82
+ .about-dialog-meta-row {
83
+ display: grid;
84
+ grid-template-columns: 5.5rem minmax(0, 1fr);
85
+ gap: 8px 12px;
86
+ align-items: baseline;
87
+ font-size: 0.875rem;
88
+ font-weight: var(--site-weight-regular);
89
+ line-height: 1.45;
90
+ }
91
+
92
+ .about-dialog-meta-row + .about-dialog-meta-row {
93
+ margin-top: 8px;
94
+ }
95
+
96
+ .about-dialog-meta dt {
97
+ margin: 0;
98
+ color: var(--site-muted-fg);
99
+ }
100
+
101
+ .about-dialog-meta dd {
102
+ margin: 0;
103
+ overflow-wrap: anywhere;
104
+ }
105
+
106
+ .about-dialog-meta-row:first-child dd a {
107
+ white-space: nowrap;
108
+ }
109
+
110
+ @media (max-width: 560px) {
111
+ .about-dialog-meta-row:first-child dd a {
112
+ white-space: normal;
113
+ }
114
+ }
115
+
116
+ .about-dialog-actions {
117
+ justify-content: center;
118
+ }
119
+
120
+ .about-dialog-actions .primary-button {
121
+ min-width: 6.5rem;
122
+ }
@@ -1,3 +1,3 @@
1
- @import './overlay.css';
2
- @import './mobile-action-sheet.css';
3
- @import './about-dialog.css';
1
+ @import './overlay.css';
2
+ @import './mobile-action-sheet.css';
3
+ @import './about-dialog.css';