@geomak/ui 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,8 +1,80 @@
1
1
  export { C as COLORS, S as SemanticColorKey, a as SemanticSharedKey, V as VarColorKey, b as VarDensityKey, c as VarMotionKey, d as VarRadiusKey, e as VarShadowKey, f as VarTypoKey, g as VarZIndexKey, P as palette, s as semanticTokens, v as vars } from './index-CvyV3YPI.cjs';
2
- import * as react_jsx_runtime from 'react/jsx-runtime';
3
2
  import React$1 from 'react';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
5
 
6
+ interface PortalProps {
7
+ /** Content to render at the target node. */
8
+ children: React$1.ReactNode;
9
+ /**
10
+ * Where to mount the portal.
11
+ * - omitted / undefined → `document.body` (the safe default for viewport-anchored UI)
12
+ * - HTMLElement → that exact node
13
+ * - () => HTMLElement → resolved at mount time (lets you query the DOM after layout)
14
+ * - null → portal is disabled and renders nothing
15
+ */
16
+ target?: HTMLElement | (() => HTMLElement | null) | null;
17
+ }
18
+ /**
19
+ * SSR-safe portal helper. Renders `children` at a detached DOM node — by
20
+ * default `document.body` — so that any `position: fixed` descendant resolves
21
+ * against the real viewport, never against a transformed, filtered, or
22
+ * contained ancestor.
23
+ *
24
+ * ## Why this exists
25
+ *
26
+ * Per CSS spec, **any ancestor with `transform`, `filter`, `perspective`,
27
+ * `will-change`, or `contain: layout|paint|strict` creates a new containing
28
+ * block for `position: fixed` descendants**. The fixed element then resolves
29
+ * its coordinates against that ancestor, not the viewport — silently breaking
30
+ * full-screen overlays, toast viewports, mobile drawers, and loading screens
31
+ * whenever the consumer wraps the component in:
32
+ * - a page-transition library (Framer Motion, view transitions)
33
+ * - a modal/drawer (Storybook's centered-layout wrapper hits this too)
34
+ * - a card with `contain: layout` or `will-change: transform`
35
+ * - a CSS filter (backdrop-blur, drop-shadow on a card)
36
+ *
37
+ * Portaling to `document.body` makes the component **immune** to any
38
+ * styling its consumer applies to ancestor elements. This is the same
39
+ * pattern Radix UI uses internally for every overlay primitive
40
+ * (`Dialog.Portal`, `Tooltip.Portal`, `Popover.Portal`, etc.).
41
+ *
42
+ * ## When to use it
43
+ *
44
+ * Wrap any element that uses `position: fixed` to anchor itself to the
45
+ * viewport — full-screen overlays, toast viewports, drawers, loading
46
+ * screens, command palettes. If you're using a Radix primitive, prefer
47
+ * its built-in `*.Portal` component (they're equivalent but match the
48
+ * primitive's lifecycle).
49
+ *
50
+ * ## SSR / hydration
51
+ *
52
+ * `document.body` isn't available during SSR or the very first client
53
+ * render. The component renders `null` until `useEffect` resolves the
54
+ * target post-mount, then re-renders with the portal in place. Content
55
+ * that needs to appear immediately on mount will paint one frame later
56
+ * — acceptable for overlays (the trigger interaction is what kicks them
57
+ * off anyway).
58
+ *
59
+ * @example Full-screen loading overlay
60
+ * <Portal>
61
+ * <div className="fixed inset-0 bg-black/40 z-overlay">
62
+ * <Spinner />
63
+ * </div>
64
+ * </Portal>
65
+ *
66
+ * @example Mount to a specific element
67
+ * <Portal target={() => document.getElementById('app-root')}>
68
+ * <Drawer />
69
+ * </Portal>
70
+ *
71
+ * @example Conditionally disable (e.g. SSR-only render)
72
+ * <Portal target={shouldPortal ? undefined : null}>
73
+ * <Banner />
74
+ * </Portal>
75
+ */
76
+ declare function Portal({ children, target }: PortalProps): React$1.ReactPortal;
77
+
6
78
  declare const Icon: {
7
79
  (): react_jsx_runtime.JSX.Element;
8
80
  Moon: ({ color }: {
@@ -1596,4 +1668,4 @@ declare const Temporal: {
1596
1668
  TemporalPicker: typeof TemporalPickerBase;
1597
1669
  };
1598
1670
 
1599
- export { AppShell, type AppShellProps, AutoComplete, type AutoCompleteProps, Button, type ButtonProps, Catalog, CatalogCarousel, type CatalogCarouselProps, CatalogGrid, type CatalogGridProps, type CatalogProps, Checkbox, type CheckboxProps, ContextMenu, type ContextMenuActionItem, type ContextMenuPosition, type ContextMenuProps, type DatePickerProps, Drawer, type DrawerProps, Dropdown, type DropdownItem, DropdownPill, type DropdownPillProps, type DropdownProps, type ExpandRowOptions, FadingBase, type FadingBaseProps, FileInput, type FileInputProps, GridCard, type GridCardItem, type GridCardProps, Icon, IconButton, type IconButtonProps, List, type ListItem, type ListProps, LoadingSpinner, type LoadingSpinnerProps, MenuBar, MenuBarItem, type MenuBarItemConfig, type MenuBarItemProps, type MenuBarProps, Modal, type ModalProps, type NotificationPayload, NotificationProvider, NumberInput, type NumberInputProps, OpaqueGridCard, type OpaqueGridCardProps, type PaginationOptions, Password, type PasswordProps, ScalableContainer, type ScalableContainerProps, SearchInput, type SearchInputProps, Sidebar, type SidebarItem, type SidebarProps, type SidebarSection, SkeletonBox, type SkeletonBoxProps, SkeletonCard, type SkeletonCardProps, SkeletonCircle, type SkeletonCircleProps, SkeletonText, type SkeletonTextProps, Switch, type SwitchInputProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Temporal, type TemporalPickerProps, TextInput, type TextInputProps, type ThemeColors, type ThemeConfig, type ThemeDensity, type ThemeMotion, ThemeProvider, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, ThemeSwitch, type ThemeSwitchProps, type ThemeTypography, ToggleButton, type ToggleButtonProps, type ToggleItem, Tooltip, type TooltipProps, TooltipProvider, TopBar, type TopBarProps, Tree, type TreeItemClickPayload, type TreeNode, type TreeProps, TreeSelect, type TreeSelectProps, Wizard, type WizardProps, type WizardStep, useNotification };
1671
+ export { AppShell, type AppShellProps, AutoComplete, type AutoCompleteProps, Button, type ButtonProps, Catalog, CatalogCarousel, type CatalogCarouselProps, CatalogGrid, type CatalogGridProps, type CatalogProps, Checkbox, type CheckboxProps, ContextMenu, type ContextMenuActionItem, type ContextMenuPosition, type ContextMenuProps, type DatePickerProps, Drawer, type DrawerProps, Dropdown, type DropdownItem, DropdownPill, type DropdownPillProps, type DropdownProps, type ExpandRowOptions, FadingBase, type FadingBaseProps, FileInput, type FileInputProps, GridCard, type GridCardItem, type GridCardProps, Icon, IconButton, type IconButtonProps, List, type ListItem, type ListProps, LoadingSpinner, type LoadingSpinnerProps, MenuBar, MenuBarItem, type MenuBarItemConfig, type MenuBarItemProps, type MenuBarProps, Modal, type ModalProps, type NotificationPayload, NotificationProvider, NumberInput, type NumberInputProps, OpaqueGridCard, type OpaqueGridCardProps, type PaginationOptions, Password, type PasswordProps, Portal, type PortalProps, ScalableContainer, type ScalableContainerProps, SearchInput, type SearchInputProps, Sidebar, type SidebarItem, type SidebarProps, type SidebarSection, SkeletonBox, type SkeletonBoxProps, SkeletonCard, type SkeletonCardProps, SkeletonCircle, type SkeletonCircleProps, SkeletonText, type SkeletonTextProps, Switch, type SwitchInputProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Temporal, type TemporalPickerProps, TextInput, type TextInputProps, type ThemeColors, type ThemeConfig, type ThemeDensity, type ThemeMotion, ThemeProvider, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, ThemeSwitch, type ThemeSwitchProps, type ThemeTypography, ToggleButton, type ToggleButtonProps, type ToggleItem, Tooltip, type TooltipProps, TooltipProvider, TopBar, type TopBarProps, Tree, type TreeItemClickPayload, type TreeNode, type TreeProps, TreeSelect, type TreeSelectProps, Wizard, type WizardProps, type WizardStep, useNotification };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,80 @@
1
1
  export { C as COLORS, S as SemanticColorKey, a as SemanticSharedKey, V as VarColorKey, b as VarDensityKey, c as VarMotionKey, d as VarRadiusKey, e as VarShadowKey, f as VarTypoKey, g as VarZIndexKey, P as palette, s as semanticTokens, v as vars } from './index-CvyV3YPI.js';
2
- import * as react_jsx_runtime from 'react/jsx-runtime';
3
2
  import React$1 from 'react';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
5
 
6
+ interface PortalProps {
7
+ /** Content to render at the target node. */
8
+ children: React$1.ReactNode;
9
+ /**
10
+ * Where to mount the portal.
11
+ * - omitted / undefined → `document.body` (the safe default for viewport-anchored UI)
12
+ * - HTMLElement → that exact node
13
+ * - () => HTMLElement → resolved at mount time (lets you query the DOM after layout)
14
+ * - null → portal is disabled and renders nothing
15
+ */
16
+ target?: HTMLElement | (() => HTMLElement | null) | null;
17
+ }
18
+ /**
19
+ * SSR-safe portal helper. Renders `children` at a detached DOM node — by
20
+ * default `document.body` — so that any `position: fixed` descendant resolves
21
+ * against the real viewport, never against a transformed, filtered, or
22
+ * contained ancestor.
23
+ *
24
+ * ## Why this exists
25
+ *
26
+ * Per CSS spec, **any ancestor with `transform`, `filter`, `perspective`,
27
+ * `will-change`, or `contain: layout|paint|strict` creates a new containing
28
+ * block for `position: fixed` descendants**. The fixed element then resolves
29
+ * its coordinates against that ancestor, not the viewport — silently breaking
30
+ * full-screen overlays, toast viewports, mobile drawers, and loading screens
31
+ * whenever the consumer wraps the component in:
32
+ * - a page-transition library (Framer Motion, view transitions)
33
+ * - a modal/drawer (Storybook's centered-layout wrapper hits this too)
34
+ * - a card with `contain: layout` or `will-change: transform`
35
+ * - a CSS filter (backdrop-blur, drop-shadow on a card)
36
+ *
37
+ * Portaling to `document.body` makes the component **immune** to any
38
+ * styling its consumer applies to ancestor elements. This is the same
39
+ * pattern Radix UI uses internally for every overlay primitive
40
+ * (`Dialog.Portal`, `Tooltip.Portal`, `Popover.Portal`, etc.).
41
+ *
42
+ * ## When to use it
43
+ *
44
+ * Wrap any element that uses `position: fixed` to anchor itself to the
45
+ * viewport — full-screen overlays, toast viewports, drawers, loading
46
+ * screens, command palettes. If you're using a Radix primitive, prefer
47
+ * its built-in `*.Portal` component (they're equivalent but match the
48
+ * primitive's lifecycle).
49
+ *
50
+ * ## SSR / hydration
51
+ *
52
+ * `document.body` isn't available during SSR or the very first client
53
+ * render. The component renders `null` until `useEffect` resolves the
54
+ * target post-mount, then re-renders with the portal in place. Content
55
+ * that needs to appear immediately on mount will paint one frame later
56
+ * — acceptable for overlays (the trigger interaction is what kicks them
57
+ * off anyway).
58
+ *
59
+ * @example Full-screen loading overlay
60
+ * <Portal>
61
+ * <div className="fixed inset-0 bg-black/40 z-overlay">
62
+ * <Spinner />
63
+ * </div>
64
+ * </Portal>
65
+ *
66
+ * @example Mount to a specific element
67
+ * <Portal target={() => document.getElementById('app-root')}>
68
+ * <Drawer />
69
+ * </Portal>
70
+ *
71
+ * @example Conditionally disable (e.g. SSR-only render)
72
+ * <Portal target={shouldPortal ? undefined : null}>
73
+ * <Banner />
74
+ * </Portal>
75
+ */
76
+ declare function Portal({ children, target }: PortalProps): React$1.ReactPortal;
77
+
6
78
  declare const Icon: {
7
79
  (): react_jsx_runtime.JSX.Element;
8
80
  Moon: ({ color }: {
@@ -1596,4 +1668,4 @@ declare const Temporal: {
1596
1668
  TemporalPicker: typeof TemporalPickerBase;
1597
1669
  };
1598
1670
 
1599
- export { AppShell, type AppShellProps, AutoComplete, type AutoCompleteProps, Button, type ButtonProps, Catalog, CatalogCarousel, type CatalogCarouselProps, CatalogGrid, type CatalogGridProps, type CatalogProps, Checkbox, type CheckboxProps, ContextMenu, type ContextMenuActionItem, type ContextMenuPosition, type ContextMenuProps, type DatePickerProps, Drawer, type DrawerProps, Dropdown, type DropdownItem, DropdownPill, type DropdownPillProps, type DropdownProps, type ExpandRowOptions, FadingBase, type FadingBaseProps, FileInput, type FileInputProps, GridCard, type GridCardItem, type GridCardProps, Icon, IconButton, type IconButtonProps, List, type ListItem, type ListProps, LoadingSpinner, type LoadingSpinnerProps, MenuBar, MenuBarItem, type MenuBarItemConfig, type MenuBarItemProps, type MenuBarProps, Modal, type ModalProps, type NotificationPayload, NotificationProvider, NumberInput, type NumberInputProps, OpaqueGridCard, type OpaqueGridCardProps, type PaginationOptions, Password, type PasswordProps, ScalableContainer, type ScalableContainerProps, SearchInput, type SearchInputProps, Sidebar, type SidebarItem, type SidebarProps, type SidebarSection, SkeletonBox, type SkeletonBoxProps, SkeletonCard, type SkeletonCardProps, SkeletonCircle, type SkeletonCircleProps, SkeletonText, type SkeletonTextProps, Switch, type SwitchInputProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Temporal, type TemporalPickerProps, TextInput, type TextInputProps, type ThemeColors, type ThemeConfig, type ThemeDensity, type ThemeMotion, ThemeProvider, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, ThemeSwitch, type ThemeSwitchProps, type ThemeTypography, ToggleButton, type ToggleButtonProps, type ToggleItem, Tooltip, type TooltipProps, TooltipProvider, TopBar, type TopBarProps, Tree, type TreeItemClickPayload, type TreeNode, type TreeProps, TreeSelect, type TreeSelectProps, Wizard, type WizardProps, type WizardStep, useNotification };
1671
+ export { AppShell, type AppShellProps, AutoComplete, type AutoCompleteProps, Button, type ButtonProps, Catalog, CatalogCarousel, type CatalogCarouselProps, CatalogGrid, type CatalogGridProps, type CatalogProps, Checkbox, type CheckboxProps, ContextMenu, type ContextMenuActionItem, type ContextMenuPosition, type ContextMenuProps, type DatePickerProps, Drawer, type DrawerProps, Dropdown, type DropdownItem, DropdownPill, type DropdownPillProps, type DropdownProps, type ExpandRowOptions, FadingBase, type FadingBaseProps, FileInput, type FileInputProps, GridCard, type GridCardItem, type GridCardProps, Icon, IconButton, type IconButtonProps, List, type ListItem, type ListProps, LoadingSpinner, type LoadingSpinnerProps, MenuBar, MenuBarItem, type MenuBarItemConfig, type MenuBarItemProps, type MenuBarProps, Modal, type ModalProps, type NotificationPayload, NotificationProvider, NumberInput, type NumberInputProps, OpaqueGridCard, type OpaqueGridCardProps, type PaginationOptions, Password, type PasswordProps, Portal, type PortalProps, ScalableContainer, type ScalableContainerProps, SearchInput, type SearchInputProps, Sidebar, type SidebarItem, type SidebarProps, type SidebarSection, SkeletonBox, type SkeletonBoxProps, SkeletonCard, type SkeletonCardProps, SkeletonCircle, type SkeletonCircleProps, SkeletonText, type SkeletonTextProps, Switch, type SwitchInputProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Temporal, type TemporalPickerProps, TextInput, type TextInputProps, type ThemeColors, type ThemeConfig, type ThemeDensity, type ThemeMotion, ThemeProvider, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, ThemeSwitch, type ThemeSwitchProps, type ThemeTypography, ToggleButton, type ToggleButtonProps, type ToggleItem, Tooltip, type TooltipProps, TooltipProvider, TopBar, type TopBarProps, Tree, type TreeItemClickPayload, type TreeNode, type TreeProps, TreeSelect, type TreeSelectProps, Wizard, type WizardProps, type WizardStep, useNotification };
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { colors_default } from './chunk-GKXP6OJJ.js';
2
2
  export { colors_default as COLORS, PALETTE as palette, semanticTokens, vars } from './chunk-GKXP6OJJ.js';
3
+ import React10, { createContext, useState, useEffect, useMemo, useContext, useRef, useCallback, useId } from 'react';
4
+ import { createPortal } from 'react-dom';
3
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
- import React9, { createContext, useMemo, useState, useEffect, useContext, useRef, useCallback, useId } from 'react';
5
6
  import * as Dialog from '@radix-ui/react-dialog';
6
7
  import { useReducedMotion, AnimatePresence, motion } from 'framer-motion';
7
8
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
@@ -13,6 +14,18 @@ import * as Popover from '@radix-ui/react-popover';
13
14
  import * as SwitchPrimitive from '@radix-ui/react-switch';
14
15
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
15
16
 
17
+ function Portal({ children, target }) {
18
+ const [resolved, setResolved] = useState(null);
19
+ useEffect(() => {
20
+ if (target === null) {
21
+ setResolved(null);
22
+ return;
23
+ }
24
+ const node = typeof target === "function" ? target() : target ?? document.body;
25
+ setResolved(node ?? null);
26
+ }, [target]);
27
+ return resolved ? createPortal(children, resolved) : null;
28
+ }
16
29
  var Moon = ({ color = "gray" }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: color, viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: color, className: "w-8 h-8", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z" }) });
17
30
  var Sun = ({ color = "yellow" }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: color, viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: color, className: "w-8 h-8", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z" }) });
18
31
  var CheckCircle = ({ color = "#fff", size = 28 }) => /* @__PURE__ */ jsx("svg", { width: size, height: size, viewBox: "0 0 28 28", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M14 0.25C6.40625 0.25 0.25 6.40625 0.25 14C0.25 21.5937 6.40625 27.75 14 27.75C21.5937 27.75 27.75 21.5937 27.75 14C27.75 6.40625 21.5937 0.25 14 0.25ZM19.96 11.675C20.0697 11.5496 20.1533 11.4034 20.2057 11.2452C20.2582 11.087 20.2784 10.9199 20.2653 10.7537C20.2522 10.5876 20.206 10.4257 20.1295 10.2777C20.0529 10.1296 19.9475 9.99838 19.8194 9.89168C19.6914 9.78497 19.5433 9.70495 19.3839 9.65633C19.2244 9.6077 19.0569 9.59145 18.8911 9.60853C18.7253 9.62562 18.5646 9.67568 18.4184 9.75579C18.2723 9.8359 18.1436 9.94443 18.04 10.075L12.665 16.5237L9.88375 13.7412C9.648 13.5136 9.33224 13.3876 9.0045 13.3904C8.67675 13.3933 8.36324 13.5247 8.13148 13.7565C7.89972 13.9882 7.76825 14.3018 7.76541 14.6295C7.76256 14.9572 7.88855 15.273 8.11625 15.5087L11.8662 19.2587C11.9891 19.3815 12.1361 19.4773 12.298 19.5401C12.4599 19.6028 12.6331 19.6312 12.8066 19.6233C12.98 19.6154 13.15 19.5715 13.3055 19.4943C13.4611 19.4171 13.5988 19.3084 13.71 19.175L19.96 11.675Z", fill: color }) });
@@ -735,9 +748,9 @@ var TYPE_BG = {
735
748
  danger: "bg-status-error"
736
749
  };
737
750
  var VIEWPORT_CLASSES = {
738
- "top-right": "fixed top-14 right-4 flex flex-col items-end",
739
- "top-left": "fixed top-14 left-4 flex flex-col items-start",
740
- "top-center": "fixed top-14 left-1/2 flex flex-col items-center -translate-x-1/2",
751
+ "top-right": "fixed top-4 right-4 flex flex-col items-end",
752
+ "top-left": "fixed top-4 left-4 flex flex-col items-start",
753
+ "top-center": "fixed top-4 left-1/2 flex flex-col items-center -translate-x-1/2",
741
754
  "bottom-right": "fixed bottom-4 right-4 flex flex-col-reverse items-end",
742
755
  "bottom-left": "fixed bottom-4 left-4 flex flex-col-reverse items-start",
743
756
  "bottom-center": "fixed bottom-4 left-1/2 flex flex-col-reverse items-center -translate-x-1/2"
@@ -790,6 +803,7 @@ function NotificationItem({
790
803
  return /* @__PURE__ */ jsx(
791
804
  motion.div,
792
805
  {
806
+ className: "pointer-events-auto",
793
807
  initial,
794
808
  animate: { opacity: 1, y: 0, scale: 1 },
795
809
  exit: {
@@ -875,13 +889,13 @@ function NotificationProvider({
875
889
  };
876
890
  return /* @__PURE__ */ jsx(NotificationContext.Provider, { value: { open, close }, children: /* @__PURE__ */ jsxs(Toast.Provider, { swipeDirection: position.endsWith("right") ? "right" : position.endsWith("left") ? "left" : "up", children: [
877
891
  children,
878
- /* @__PURE__ */ jsx(
892
+ /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(
879
893
  Toast.Viewport,
880
894
  {
881
895
  asChild: true,
882
896
  className: [
883
897
  VIEWPORT_CLASSES[position],
884
- "z-[500000] gap-2 w-[340px] p-4 outline-none overflow-hidden"
898
+ "z-[500000] gap-2 w-[332px] outline-none pointer-events-none"
885
899
  ].join(" "),
886
900
  children: /* @__PURE__ */ jsx("ul", { children: /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: notifications.map((n) => /* @__PURE__ */ jsx(
887
901
  NotificationItem,
@@ -894,7 +908,7 @@ function NotificationProvider({
894
908
  n.id
895
909
  )) }) })
896
910
  }
897
- )
911
+ ) })
898
912
  ] }) });
899
913
  }
900
914
  function useNotification() {
@@ -921,20 +935,24 @@ function LoadingSpinner({ prompt }) {
921
935
  }
922
936
  return () => timeouts.forEach(clearTimeout);
923
937
  }, [letterRefs, letters.length]);
924
- return /* @__PURE__ */ jsxs("div", { className: "fixed top-0 bottom-0 right-0 left-0 bg-oxford-blue-700-opaque z-[8000000] flex flex-col gap-5 items-center justify-start pt-80", children: [
925
- /* @__PURE__ */ jsx("div", { className: "border-r-prussian-blue border-l-prussian-blue border-t-white border-b-white border-[10px] w-[80px] h-[80px] rounded-xl shapeshift" }),
926
- /* @__PURE__ */ jsx("div", { className: "text-prussian-blue dark:text-white text-3xl font-bold", children: letters.map((letter, index) => /* @__PURE__ */ jsx(
927
- "span",
928
- {
929
- className: "select-none",
930
- ref: (ref) => {
931
- letterRefs[index] = ref;
938
+ return (
939
+ // Portaled so the full-screen overlay always covers the real viewport,
940
+ // not whatever container the consumer renders LoadingSpinner inside.
941
+ /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsxs("div", { className: "fixed top-0 bottom-0 right-0 left-0 bg-oxford-blue-700-opaque z-[8000000] flex flex-col gap-5 items-center justify-start pt-80", children: [
942
+ /* @__PURE__ */ jsx("div", { className: "border-r-prussian-blue border-l-prussian-blue border-t-white border-b-white border-[10px] w-[80px] h-[80px] rounded-xl shapeshift" }),
943
+ /* @__PURE__ */ jsx("div", { className: "text-prussian-blue dark:text-white text-3xl font-bold", children: letters.map((letter, index) => /* @__PURE__ */ jsx(
944
+ "span",
945
+ {
946
+ className: "select-none",
947
+ ref: (ref) => {
948
+ letterRefs[index] = ref;
949
+ },
950
+ children: letter
932
951
  },
933
- children: letter
934
- },
935
- index
936
- )) })
937
- ] });
952
+ index
953
+ )) })
954
+ ] }) })
955
+ );
938
956
  }
939
957
  function FadingBase({
940
958
  className = "",
@@ -1404,7 +1422,7 @@ function Wizard({ children, steps, storageKey = "po_wizard" }) {
1404
1422
  children
1405
1423
  ] });
1406
1424
  }
1407
- var SearchInput = React9.forwardRef(function SearchInput2({
1425
+ var SearchInput = React10.forwardRef(function SearchInput2({
1408
1426
  value,
1409
1427
  onChange,
1410
1428
  disabled,
@@ -1668,7 +1686,7 @@ function TableBody({
1668
1686
  setVisibleRows(initial);
1669
1687
  }
1670
1688
  }, [rows]);
1671
- return /* @__PURE__ */ jsx("tbody", { className: "w-full", children: rows.map((row, i) => /* @__PURE__ */ jsxs(React9.Fragment, { children: [
1689
+ return /* @__PURE__ */ jsx("tbody", { className: "w-full", children: rows.map((row, i) => /* @__PURE__ */ jsxs(React10.Fragment, { children: [
1672
1690
  /* @__PURE__ */ jsxs(
1673
1691
  "tr",
1674
1692
  {
@@ -2118,7 +2136,7 @@ function AppShell({
2118
2136
  footer: sidebarFooter
2119
2137
  }
2120
2138
  ),
2121
- hasSidebar && isMobile && /* @__PURE__ */ jsxs(Fragment, { children: [
2139
+ hasSidebar && isMobile && /* @__PURE__ */ jsxs(Portal, { children: [
2122
2140
  /* @__PURE__ */ jsx(AnimatePresence, { children: mobileOpen && /* @__PURE__ */ jsx(
2123
2141
  motion.div,
2124
2142
  {
@@ -2249,7 +2267,7 @@ function ThemeProvider({
2249
2267
  className = "",
2250
2268
  style
2251
2269
  }) {
2252
- const id = React9.useId().replace(/:/g, "");
2270
+ const id = React10.useId().replace(/:/g, "");
2253
2271
  const scopeClass = `geo-th-${id}`;
2254
2272
  const divRef = useRef(null);
2255
2273
  useEffect(() => {
@@ -3281,6 +3299,6 @@ Temporal.DatePicker = DatePickerBase;
3281
3299
  Temporal.TemporalPicker = TemporalPickerBase;
3282
3300
  var DatePicker_default = Temporal;
3283
3301
 
3284
- export { AppShell, AutoComplete, Button, Catalog, CatalogCarousel, CatalogGrid, Checkbox, ContextMenu, Drawer, Dropdown, DropdownPill, FadingBase, FileInput, GridCard, icons_default as Icon, IconButton, List2 as List, LoadingSpinner, MenuBar, MenuBarItem, Modal, NotificationProvider, NumberInput, OpaqueGridCard, Password, ScalableContainer, SearchInput_default as SearchInput, Sidebar, SkeletonBox, SkeletonCard, SkeletonCircle, SkeletonText, Switch, Table, Tabs, DatePicker_default as Temporal, TextInput, ThemeProvider, ThemeSwitch, ToggleButton, Tooltip, TooltipProvider, TopBar, Tree, TreeSelect, Wizard, useNotification };
3302
+ export { AppShell, AutoComplete, Button, Catalog, CatalogCarousel, CatalogGrid, Checkbox, ContextMenu, Drawer, Dropdown, DropdownPill, FadingBase, FileInput, GridCard, icons_default as Icon, IconButton, List2 as List, LoadingSpinner, MenuBar, MenuBarItem, Modal, NotificationProvider, NumberInput, OpaqueGridCard, Password, Portal, ScalableContainer, SearchInput_default as SearchInput, Sidebar, SkeletonBox, SkeletonCard, SkeletonCircle, SkeletonText, Switch, Table, Tabs, DatePicker_default as Temporal, TextInput, ThemeProvider, ThemeSwitch, ToggleButton, Tooltip, TooltipProvider, TopBar, Tree, TreeSelect, Wizard, useNotification };
3285
3303
  //# sourceMappingURL=index.js.map
3286
3304
  //# sourceMappingURL=index.js.map