@impulse-ui-native/popover 6.3.0 → 7.0.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.
Files changed (33) hide show
  1. package/README.md +21 -8
  2. package/dist/components/index.d.mts +5 -3
  3. package/dist/components/index.js +4 -0
  4. package/dist/components/index.js.map +1 -1
  5. package/dist/components/popover-description.js +1 -3
  6. package/dist/components/popover-description.js.map +1 -1
  7. package/dist/components/popover-footer.d.mts +9 -0
  8. package/dist/components/popover-footer.js +32 -0
  9. package/dist/components/popover-footer.js.map +1 -0
  10. package/dist/components/popover-header.d.mts +9 -0
  11. package/dist/components/popover-header.js +31 -0
  12. package/dist/components/popover-header.js.map +1 -0
  13. package/dist/components/popover-root.d.mts +1 -1
  14. package/dist/components/popover-root.js +1 -3
  15. package/dist/components/popover-root.js.map +1 -1
  16. package/dist/components/popover-surface.js +10 -26
  17. package/dist/components/popover-surface.js.map +1 -1
  18. package/dist/components/popover-title.js +2 -3
  19. package/dist/components/popover-title.js.map +1 -1
  20. package/dist/components/popover.d.mts +1 -1
  21. package/dist/components/popover.js +21 -1
  22. package/dist/components/popover.js.map +1 -1
  23. package/dist/components/tooltip.js +21 -2
  24. package/dist/components/tooltip.js.map +1 -1
  25. package/dist/hooks/use-popover-surface.hook.js +5 -6
  26. package/dist/hooks/use-popover-surface.hook.js.map +1 -1
  27. package/dist/index.d.mts +1 -1
  28. package/dist/types/index.d.mts +1 -1
  29. package/dist/types/popover.types.d.mts +8 -9
  30. package/dist/utils/popover-position.utils.d.mts +4 -5
  31. package/dist/utils/popover-position.utils.js +2 -57
  32. package/dist/utils/popover-position.utils.js.map +1 -1
  33. package/package.json +8 -7
package/README.md CHANGED
@@ -35,17 +35,21 @@ import { Typography } from "@impulse-ui-native/primitives";
35
35
  </Tooltip>;
36
36
  ```
37
37
 
38
- All compound parts render supplied children. `Popover.Content` owns Portal rendering and carries popover context to the host, so `Title`, `Description`, and `Close` work there. Other app-local React providers around an anchor do not automatically move with it; put those providers above the host or inside Content.
38
+ All compound parts render supplied children. `Popover.Content` owns Portal rendering and carries popover context to the host, so `Close` can dismiss there. Header, Footer, Title, and Description use independent theme styling. Other app-local React providers around an anchor do not automatically move with it; put those providers above the host or inside Content.
39
39
 
40
- The convenience form assembles Trigger and Content:
40
+ The convenience form composes Trigger, Content, Header, Title, Close, and Footer:
41
41
 
42
42
  ```tsx
43
- <Popover trigger={<Typography.Label>Details</Typography.Label>}>
44
- <Popover.Title>Project details</Popover.Title>
43
+ <Popover
44
+ trigger={<Typography.Label>Details</Typography.Label>}
45
+ title="Project details"
46
+ >
45
47
  <Popover.Description>Updated just now.</Popover.Description>
46
48
  </Popover>
47
49
  ```
48
50
 
51
+ A truthy header replaces the generated title. The header includes a neutral X close icon by default; hideClose omits it. A truthy footer renders Popover.Footer with trailing, wrapping actions. Header and Footer are child-only View parts available for compound composition. Pass body content as children; triggerProps and contentProps continue to customize the trigger and positioned panel. Titles can wrap beside the close control instead of pushing it outside the header.
52
+
49
53
  ## Contract
50
54
 
51
55
  - `open`, `defaultOpen` (false), and `onOpenChange` support controlled and uncontrolled state. Controlled consumers must apply requested changes.
@@ -54,11 +58,20 @@ The convenience form assembles Trigger and Content:
54
58
  - Root `disabled` suppresses the overlay and blocks trigger changes. Trigger/Close `disabled` or `loading` blocks that part's interaction. Supply a single Trigger and Content per Root; use non-interactive visual children inside Trigger rather than nesting another pressable.
55
59
  - Outside taps and Android Back request dismissal. Outside taps are consumed; there is no dim scrim. Content sizes naturally without internal scrolling. Keep popovers compact; use a sheet, dialog, or screen for larger content. Keyboard avoidance and nested overlay coordination are outside this initial API.
56
60
  - Tooltip `duration` defaults to 3000ms from opening; zero persists until dismissal. Timers clean up on close/unmount. Supply strings/numbers for token-styled text or a React node for custom content.
57
- - `surface` selects elevated (default) or inverse appearance for Popover. Tooltip uses inverse. Override `components.popover` on ThemeProvider for shared geometry, typography, and surface styling.
58
- - Elevated content defaults to 320dp wide; inverse hints size to their content. Both are constrained to the available host width. Content spacing and width can be customized with primitive style props or `style`.
61
+ - Popover uses one flat secondary surface with a subtle border and no default shadow. Override `components.popover` on ThemeProvider for geometry, typography, and panel styling. Tooltip owns its compact inverse styling through `components.popover.tooltip`, without a surface variant in Root or context.
62
+ - Popover content defaults to 320dp wide; Tooltip sizes to its content. Both are constrained to the available host width. Content spacing and width can be customized with primitive style props or `style`.
59
63
  - Anchors and host bounds are measured on opening and polled every 100ms while open, following scrolling and layout changes. Only one measurement is in flight; slow native callbacks are allowed to finish. Closed overlays have no measurement timer. Content stays hidden until measured and when its anchor is outside the usable host bounds.
60
- - Collision handling flips to the opposite side when it has more space, then shifts into safe-area bounds. The arrow tracks the anchor and hides if a constrained panel cannot point accurately. Extremely large content can overlap the anchor after clamping.
64
+ - Popover and Tooltip use rounded panels without arrows. Collision handling flips to the opposite side when it has more space, then shifts into safe-area bounds. Extremely large content can overlap the anchor after clamping.
61
65
 
62
66
  ## Exports and verification
63
67
 
64
- `Popover`, `Tooltip`, and their prop/placement/surface types are available directly or through `@impulse-ui-native/toolkit`. Storybook covers composition, controlled state, disabled triggers, long-press, and edge placements. Use the on-device Storybook host to verify rendering and interaction on iOS and Android.
68
+ `Popover`, `Tooltip`, and their prop and placement types are available directly or through `@impulse-ui-native/toolkit`. Storybook covers composition, controlled state, disabled triggers, long-press, and edge placements. Use the on-device Storybook host to verify rendering and interaction on iOS and Android.
69
+
70
+ ## Surface migration
71
+
72
+ The surface prop and PopoverSurface type have been removed. Move former
73
+ components.popover.surfaces.elevated customizations to the flat panel tokens
74
+ (backgroundColor, borderColor, borderWidth, borderRadius, paddingHorizontal,
75
+ and paddingVertical). Move inverse hint styling to components.popover.tooltip;
76
+ its text color is named color. Customize Popover.Content directly for custom
77
+ panel styling.
@@ -1,16 +1,18 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { PopoverProps, PopoverRootProps, PopoverTriggerProps, PopoverContentProps, PopoverTitleProps, PopoverDescriptionProps, PopoverCloseProps } from '../types/popover.types.mjs';
3
+ import { PopoverProps, PopoverRootProps, PopoverTriggerProps, PopoverContentProps, PopoverHeaderProps, PopoverFooterProps, PopoverTitleProps, PopoverDescriptionProps, PopoverCloseProps } from '../types/popover.types.mjs';
4
4
  export { Tooltip } from './tooltip.mjs';
5
5
  import 'react-native';
6
6
  import '@impulse-ui-native/primitives';
7
7
 
8
8
  declare const Popover: react.NamedExoticComponent<PopoverProps> & {
9
- readonly type: ({ trigger, triggerProps, contentProps, children, ...props }: PopoverProps) => react_jsx_runtime.JSX.Element;
9
+ readonly type: ({ trigger, triggerProps, contentProps, header, title, footer, hideClose, children, ...props }: PopoverProps) => react_jsx_runtime.JSX.Element;
10
10
  } & {
11
- Root: react.MemoExoticComponent<({ children, open: openProp, defaultOpen, onOpenChange, disabled, placement, surface, portalName, }: PopoverRootProps) => react_jsx_runtime.JSX.Element>;
11
+ Root: react.MemoExoticComponent<({ children, open: openProp, defaultOpen, onOpenChange, disabled, placement, portalName, }: PopoverRootProps) => react_jsx_runtime.JSX.Element>;
12
12
  Trigger: react.MemoExoticComponent<({ trigger, disabled, loading, onPress, onLongPress, ...props }: PopoverTriggerProps) => react_jsx_runtime.JSX.Element>;
13
13
  Content: react.MemoExoticComponent<(props: PopoverContentProps) => react_jsx_runtime.JSX.Element | null>;
14
+ Header: react.MemoExoticComponent<({ style, ...props }: PopoverHeaderProps) => react_jsx_runtime.JSX.Element>;
15
+ Footer: react.MemoExoticComponent<({ style, ...props }: PopoverFooterProps) => react_jsx_runtime.JSX.Element>;
14
16
  Title: react.MemoExoticComponent<(props: PopoverTitleProps) => react_jsx_runtime.JSX.Element>;
15
17
  Description: react.MemoExoticComponent<(props: PopoverDescriptionProps) => react_jsx_runtime.JSX.Element>;
16
18
  Close: react.MemoExoticComponent<({ disabled, loading, onPress, ...props }: PopoverCloseProps) => react_jsx_runtime.JSX.Element>;
@@ -2,6 +2,8 @@ import { PopoverComponent } from "./popover";
2
2
  import { PopoverClose } from "./popover-close";
3
3
  import { PopoverContent } from "./popover-content";
4
4
  import { PopoverDescription } from "./popover-description";
5
+ import { PopoverFooter } from "./popover-footer";
6
+ import { PopoverHeader } from "./popover-header";
5
7
  import { PopoverRoot } from "./popover-root";
6
8
  import { PopoverTitle } from "./popover-title";
7
9
  import { PopoverTrigger } from "./popover-trigger";
@@ -9,6 +11,8 @@ const Popover = Object.assign(PopoverComponent, {
9
11
  Root: PopoverRoot,
10
12
  Trigger: PopoverTrigger,
11
13
  Content: PopoverContent,
14
+ Header: PopoverHeader,
15
+ Footer: PopoverFooter,
12
16
  Title: PopoverTitle,
13
17
  Description: PopoverDescription,
14
18
  Close: PopoverClose
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/index.ts"],"sourcesContent":["import { PopoverComponent } from \"./popover\";\nimport { PopoverClose } from \"./popover-close\";\nimport { PopoverContent } from \"./popover-content\";\nimport { PopoverDescription } from \"./popover-description\";\nimport { PopoverRoot } from \"./popover-root\";\nimport { PopoverTitle } from \"./popover-title\";\nimport { PopoverTrigger } from \"./popover-trigger\";\n\nexport const Popover = Object.assign(PopoverComponent, {\n Root: PopoverRoot,\n Trigger: PopoverTrigger,\n Content: PopoverContent,\n Title: PopoverTitle,\n Description: PopoverDescription,\n Close: PopoverClose,\n});\n\nexport { Tooltip } from \"./tooltip\";\n"],"mappings":"AAAA,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAExB,MAAM,UAAU,OAAO,OAAO,kBAAkB;AAAA,EACrD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aAAa;AAAA,EACb,OAAO;AACT,CAAC;AAED,SAAS,eAAe;","names":[]}
1
+ {"version":3,"sources":["../../src/components/index.ts"],"sourcesContent":["import { PopoverComponent } from \"./popover\";\nimport { PopoverClose } from \"./popover-close\";\nimport { PopoverContent } from \"./popover-content\";\nimport { PopoverDescription } from \"./popover-description\";\nimport { PopoverFooter } from \"./popover-footer\";\nimport { PopoverHeader } from \"./popover-header\";\nimport { PopoverRoot } from \"./popover-root\";\nimport { PopoverTitle } from \"./popover-title\";\nimport { PopoverTrigger } from \"./popover-trigger\";\n\nexport const Popover = Object.assign(PopoverComponent, {\n Root: PopoverRoot,\n Trigger: PopoverTrigger,\n Content: PopoverContent,\n Header: PopoverHeader,\n Footer: PopoverFooter,\n Title: PopoverTitle,\n Description: PopoverDescription,\n Close: PopoverClose,\n});\n\nexport { Tooltip } from \"./tooltip\";\n"],"mappings":"AAAA,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AACnC,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAExB,MAAM,UAAU,OAAO,OAAO,kBAAkB;AAAA,EACrD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,aAAa;AAAA,EACb,OAAO;AACT,CAAC;AAED,SAAS,eAAe;","names":[]}
@@ -2,14 +2,12 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { memo } from "react";
3
3
  import { Typography } from "@impulse-ui-native/primitives";
4
4
  import { useComponentsTokens } from "@impulse-ui-native/theme";
5
- import { usePopoverContext } from "../hooks/use-popover-context.hook";
6
5
  const PopoverDescription = memo(function PopoverDescription2(props) {
7
- const { surface } = usePopoverContext();
8
6
  const tokens = useComponentsTokens().popover;
9
7
  return /* @__PURE__ */ jsx(
10
8
  Typography.BodySmall,
11
9
  {
12
- color: surface === "inverse" ? tokens.surfaces.inverse.contrast : tokens.descriptionColor,
10
+ color: tokens.descriptionColor,
13
11
  fontSize: tokens.descriptionFontSize,
14
12
  lineHeight: tokens.descriptionLineHeight,
15
13
  ...props
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/popover-description.tsx"],"sourcesContent":["import { memo } from \"react\";\n\nimport { Typography } from \"@impulse-ui-native/primitives\";\nimport { useComponentsTokens } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverDescriptionProps } from \"../types\";\nimport { usePopoverContext } from \"../hooks/use-popover-context.hook\";\n\nexport const PopoverDescription = memo(function PopoverDescription(\n props: PopoverDescriptionProps,\n) {\n const { surface } = usePopoverContext();\n const tokens = useComponentsTokens().popover;\n\n return (\n <Typography.BodySmall\n color={\n surface === \"inverse\"\n ? tokens.surfaces.inverse.contrast\n : tokens.descriptionColor\n }\n fontSize={tokens.descriptionFontSize}\n lineHeight={tokens.descriptionLineHeight}\n {...props}\n />\n );\n});\n"],"mappings":"AAeI;AAfJ,SAAS,YAAY;AAErB,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AAGpC,SAAS,yBAAyB;AAE3B,MAAM,qBAAqB,KAAK,SAASA,oBAC9C,OACA;AACA,QAAM,EAAE,QAAQ,IAAI,kBAAkB;AACtC,QAAM,SAAS,oBAAoB,EAAE;AAErC,SACE;AAAA,IAAC,WAAW;AAAA,IAAX;AAAA,MACC,OACE,YAAY,YACR,OAAO,SAAS,QAAQ,WACxB,OAAO;AAAA,MAEb,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO;AAAA,MAClB,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;","names":["PopoverDescription"]}
1
+ {"version":3,"sources":["../../src/components/popover-description.tsx"],"sourcesContent":["import { memo } from \"react\";\n\nimport { Typography } from \"@impulse-ui-native/primitives\";\nimport { useComponentsTokens } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverDescriptionProps } from \"../types\";\n\nexport const PopoverDescription = memo(function PopoverDescription(\n props: PopoverDescriptionProps,\n) {\n const tokens = useComponentsTokens().popover;\n\n return (\n <Typography.BodySmall\n color={tokens.descriptionColor}\n fontSize={tokens.descriptionFontSize}\n lineHeight={tokens.descriptionLineHeight}\n {...props}\n />\n );\n});\n"],"mappings":"AAaI;AAbJ,SAAS,YAAY;AAErB,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AAI7B,MAAM,qBAAqB,KAAK,SAASA,oBAC9C,OACA;AACA,QAAM,SAAS,oBAAoB,EAAE;AAErC,SACE;AAAA,IAAC,WAAW;AAAA,IAAX;AAAA,MACC,OAAO,OAAO;AAAA,MACd,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO;AAAA,MAClB,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;","names":["PopoverDescription"]}
@@ -0,0 +1,9 @@
1
+ import * as react from 'react';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { PopoverFooterProps } from '../types/popover.types.mjs';
4
+ import 'react-native';
5
+ import '@impulse-ui-native/primitives';
6
+
7
+ declare const PopoverFooter: react.MemoExoticComponent<({ style, ...props }: PopoverFooterProps) => react_jsx_runtime.JSX.Element>;
8
+
9
+ export { PopoverFooter };
@@ -0,0 +1,32 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { memo, useMemo } from "react";
3
+ import { StyleSheet } from "react-native";
4
+ import { View } from "@impulse-ui-native/primitives";
5
+ import { useStyleProps, useThemedStyles } from "@impulse-ui-native/theme";
6
+ const PopoverFooter = memo(function PopoverFooter2({
7
+ style,
8
+ ...props
9
+ }) {
10
+ const extractedStyleProps = useStyleProps(props);
11
+ const styles = useThemedStyles(themedStyles);
12
+ const partStyle = useMemo(
13
+ () => [styles.part, extractedStyleProps, style],
14
+ [styles.part, extractedStyleProps, style]
15
+ );
16
+ return /* @__PURE__ */ jsx(View, { ...props, style: partStyle });
17
+ });
18
+ function themedStyles(theme) {
19
+ return StyleSheet.create({
20
+ part: {
21
+ flexDirection: "row",
22
+ alignItems: "center",
23
+ justifyContent: "flex-end",
24
+ flexWrap: "wrap",
25
+ gap: theme.components.popover.gap
26
+ }
27
+ });
28
+ }
29
+ export {
30
+ PopoverFooter
31
+ };
32
+ //# sourceMappingURL=popover-footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/popover-footer.tsx"],"sourcesContent":["import { memo, useMemo } from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nimport type { AppTheme } from \"@impulse-ui-native/theme\";\nimport { View } from \"@impulse-ui-native/primitives\";\nimport { useStyleProps, useThemedStyles } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverFooterProps } from \"../types\";\n\nexport const PopoverFooter = memo(function PopoverFooter({\n style,\n ...props\n}: PopoverFooterProps) {\n const extractedStyleProps = useStyleProps(props);\n const styles = useThemedStyles(themedStyles);\n\n const partStyle = useMemo(\n () => [styles.part, extractedStyleProps, style],\n [styles.part, extractedStyleProps, style],\n );\n\n return <View {...props} style={partStyle} />;\n});\n\nfunction themedStyles(theme: AppTheme) {\n return StyleSheet.create({\n part: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n flexWrap: \"wrap\",\n gap: theme.components.popover.gap,\n },\n });\n}\n"],"mappings":"AAqBS;AArBT,SAAS,MAAM,eAAe;AAC9B,SAAS,kBAAkB;AAG3B,SAAS,YAAY;AACrB,SAAS,eAAe,uBAAuB;AAIxC,MAAM,gBAAgB,KAAK,SAASA,eAAc;AAAA,EACvD;AAAA,EACA,GAAG;AACL,GAAuB;AACrB,QAAM,sBAAsB,cAAc,KAAK;AAC/C,QAAM,SAAS,gBAAgB,YAAY;AAE3C,QAAM,YAAY;AAAA,IAChB,MAAM,CAAC,OAAO,MAAM,qBAAqB,KAAK;AAAA,IAC9C,CAAC,OAAO,MAAM,qBAAqB,KAAK;AAAA,EAC1C;AAEA,SAAO,oBAAC,QAAM,GAAG,OAAO,OAAO,WAAW;AAC5C,CAAC;AAED,SAAS,aAAa,OAAiB;AACrC,SAAO,WAAW,OAAO;AAAA,IACvB,MAAM;AAAA,MACJ,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,KAAK,MAAM,WAAW,QAAQ;AAAA,IAChC;AAAA,EACF,CAAC;AACH;","names":["PopoverFooter"]}
@@ -0,0 +1,9 @@
1
+ import * as react from 'react';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { PopoverHeaderProps } from '../types/popover.types.mjs';
4
+ import 'react-native';
5
+ import '@impulse-ui-native/primitives';
6
+
7
+ declare const PopoverHeader: react.MemoExoticComponent<({ style, ...props }: PopoverHeaderProps) => react_jsx_runtime.JSX.Element>;
8
+
9
+ export { PopoverHeader };
@@ -0,0 +1,31 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { memo, useMemo } from "react";
3
+ import { StyleSheet } from "react-native";
4
+ import { View } from "@impulse-ui-native/primitives";
5
+ import { useStyleProps, useThemedStyles } from "@impulse-ui-native/theme";
6
+ const PopoverHeader = memo(function PopoverHeader2({
7
+ style,
8
+ ...props
9
+ }) {
10
+ const extractedStyleProps = useStyleProps(props);
11
+ const styles = useThemedStyles(themedStyles);
12
+ const partStyle = useMemo(
13
+ () => [styles.part, extractedStyleProps, style],
14
+ [styles.part, extractedStyleProps, style]
15
+ );
16
+ return /* @__PURE__ */ jsx(View, { ...props, style: partStyle });
17
+ });
18
+ function themedStyles(theme) {
19
+ return StyleSheet.create({
20
+ part: {
21
+ flexDirection: "row",
22
+ alignItems: "center",
23
+ justifyContent: "space-between",
24
+ gap: theme.components.popover.gap
25
+ }
26
+ });
27
+ }
28
+ export {
29
+ PopoverHeader
30
+ };
31
+ //# sourceMappingURL=popover-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/popover-header.tsx"],"sourcesContent":["import { memo, useMemo } from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nimport type { AppTheme } from \"@impulse-ui-native/theme\";\nimport { View } from \"@impulse-ui-native/primitives\";\nimport { useStyleProps, useThemedStyles } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverHeaderProps } from \"../types\";\n\nexport const PopoverHeader = memo(function PopoverHeader({\n style,\n ...props\n}: PopoverHeaderProps) {\n const extractedStyleProps = useStyleProps(props);\n const styles = useThemedStyles(themedStyles);\n\n const partStyle = useMemo(\n () => [styles.part, extractedStyleProps, style],\n [styles.part, extractedStyleProps, style],\n );\n\n return <View {...props} style={partStyle} />;\n});\n\nfunction themedStyles(theme: AppTheme) {\n return StyleSheet.create({\n part: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: theme.components.popover.gap,\n },\n });\n}\n"],"mappings":"AAqBS;AArBT,SAAS,MAAM,eAAe;AAC9B,SAAS,kBAAkB;AAG3B,SAAS,YAAY;AACrB,SAAS,eAAe,uBAAuB;AAIxC,MAAM,gBAAgB,KAAK,SAASA,eAAc;AAAA,EACvD;AAAA,EACA,GAAG;AACL,GAAuB;AACrB,QAAM,sBAAsB,cAAc,KAAK;AAC/C,QAAM,SAAS,gBAAgB,YAAY;AAE3C,QAAM,YAAY;AAAA,IAChB,MAAM,CAAC,OAAO,MAAM,qBAAqB,KAAK;AAAA,IAC9C,CAAC,OAAO,MAAM,qBAAqB,KAAK;AAAA,EAC1C;AAEA,SAAO,oBAAC,QAAM,GAAG,OAAO,OAAO,WAAW;AAC5C,CAAC;AAED,SAAS,aAAa,OAAiB;AACrC,SAAO,WAAW,OAAO;AAAA,IACvB,MAAM;AAAA,MACJ,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,KAAK,MAAM,WAAW,QAAQ;AAAA,IAChC;AAAA,EACF,CAAC;AACH;","names":["PopoverHeader"]}
@@ -4,6 +4,6 @@ import { PopoverRootProps } from '../types/popover.types.mjs';
4
4
  import 'react-native';
5
5
  import '@impulse-ui-native/primitives';
6
6
 
7
- declare const PopoverRoot: react.MemoExoticComponent<({ children, open: openProp, defaultOpen, onOpenChange, disabled, placement, surface, portalName, }: PopoverRootProps) => react_jsx_runtime.JSX.Element>;
7
+ declare const PopoverRoot: react.MemoExoticComponent<({ children, open: openProp, defaultOpen, onOpenChange, disabled, placement, portalName, }: PopoverRootProps) => react_jsx_runtime.JSX.Element>;
8
8
 
9
9
  export { PopoverRoot };
@@ -9,7 +9,6 @@ const PopoverRoot = memo(function PopoverRoot2({
9
9
  onOpenChange,
10
10
  disabled = false,
11
11
  placement = "bottom",
12
- surface = "elevated",
13
12
  portalName
14
13
  }) {
15
14
  const anchorRef = useRef(null);
@@ -25,10 +24,9 @@ const PopoverRoot = memo(function PopoverRoot2({
25
24
  setOpen,
26
25
  anchorRef,
27
26
  placement,
28
- surface,
29
27
  portalName
30
28
  }),
31
- [open, disabled, setOpen, placement, surface, portalName]
29
+ [open, disabled, setOpen, placement, portalName]
32
30
  );
33
31
  return /* @__PURE__ */ jsx(PopoverContext.Provider, { value: context, children });
34
32
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/popover-root.tsx"],"sourcesContent":["import type { View } from \"react-native\";\nimport { memo, useMemo, useRef } from \"react\";\n\nimport { useControllableState } from \"@impulse-ui-native/core\";\n\nimport type { PopoverRootProps } from \"../types\";\nimport { PopoverContext } from \"../contexts/popover.context\";\n\nexport const PopoverRoot = memo(function PopoverRoot({\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n disabled = false,\n placement = \"bottom\",\n surface = \"elevated\",\n portalName,\n}: PopoverRootProps) {\n const anchorRef = useRef<View>(null);\n\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n const context = useMemo(\n () => ({\n open: open && !disabled,\n disabled,\n setOpen,\n anchorRef,\n placement,\n surface,\n portalName,\n }),\n [open, disabled, setOpen, placement, surface, portalName],\n );\n\n return (\n <PopoverContext.Provider value={context}>\n {children}\n </PopoverContext.Provider>\n );\n});\n"],"mappings":"AAwCI;AAvCJ,SAAS,MAAM,SAAS,cAAc;AAEtC,SAAS,4BAA4B;AAGrC,SAAS,sBAAsB;AAExB,MAAM,cAAc,KAAK,SAASA,aAAY;AAAA,EACnD;AAAA,EACA,MAAM;AAAA,EACN,cAAc;AAAA,EACd;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV;AACF,GAAqB;AACnB,QAAM,YAAY,OAAa,IAAI;AAEnC,QAAM,CAAC,MAAM,OAAO,IAAI,qBAAqB;AAAA,IAC3C,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,UAAU;AAAA,IACd,OAAO;AAAA,MACL,MAAM,QAAQ,CAAC;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,MAAM,UAAU,SAAS,WAAW,SAAS,UAAU;AAAA,EAC1D;AAEA,SACE,oBAAC,eAAe,UAAf,EAAwB,OAAO,SAC7B,UACH;AAEJ,CAAC;","names":["PopoverRoot"]}
1
+ {"version":3,"sources":["../../src/components/popover-root.tsx"],"sourcesContent":["import type { View } from \"react-native\";\nimport { memo, useMemo, useRef } from \"react\";\n\nimport { useControllableState } from \"@impulse-ui-native/core\";\n\nimport type { PopoverRootProps } from \"../types\";\nimport { PopoverContext } from \"../contexts/popover.context\";\n\nexport const PopoverRoot = memo(function PopoverRoot({\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n disabled = false,\n placement = \"bottom\",\n portalName,\n}: PopoverRootProps) {\n const anchorRef = useRef<View>(null);\n\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n const context = useMemo(\n () => ({\n open: open && !disabled,\n disabled,\n setOpen,\n anchorRef,\n placement,\n portalName,\n }),\n [open, disabled, setOpen, placement, portalName],\n );\n\n return (\n <PopoverContext.Provider value={context}>\n {children}\n </PopoverContext.Provider>\n );\n});\n"],"mappings":"AAsCI;AArCJ,SAAS,MAAM,SAAS,cAAc;AAEtC,SAAS,4BAA4B;AAGrC,SAAS,sBAAsB;AAExB,MAAM,cAAc,KAAK,SAASA,aAAY;AAAA,EACnD;AAAA,EACA,MAAM;AAAA,EACN,cAAc;AAAA,EACd;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AACF,GAAqB;AACnB,QAAM,YAAY,OAAa,IAAI;AAEnC,QAAM,CAAC,MAAM,OAAO,IAAI,qBAAqB;AAAA,IAC3C,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,UAAU;AAAA,IACd,OAAO;AAAA,MACL,MAAM,QAAQ,CAAC;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,MAAM,UAAU,SAAS,WAAW,UAAU;AAAA,EACjD;AAEA,SACE,oBAAC,eAAe,UAAf,EAAwB,OAAO,SAC7B,UACH;AAEJ,CAAC;","names":["PopoverRoot"]}
@@ -4,7 +4,6 @@ import { StyleSheet } from "react-native";
4
4
  import { Pressable, View } from "@impulse-ui-native/primitives";
5
5
  import { useStyleProps, useThemedStyles } from "@impulse-ui-native/theme";
6
6
  import { usePopoverSurface } from "../hooks/use-popover-surface.hook";
7
- import { getArrowStyle } from "../utils/popover-position.utils";
8
7
  const PopoverSurfaceView = memo(function PopoverSurfaceView2({
9
8
  children,
10
9
  style,
@@ -27,27 +26,22 @@ const PopoverSurfaceView = memo(function PopoverSurfaceView2({
27
26
  style: styles.host,
28
27
  children: [
29
28
  /* @__PURE__ */ jsx(Pressable, { style: StyleSheet.absoluteFill, onPress: close }),
30
- /* @__PURE__ */ jsxs(
29
+ /* @__PURE__ */ jsx(
31
30
  View,
32
31
  {
33
- shadow: "sm",
34
32
  ...props,
35
33
  pointerEvents: styleProps.ready ? "auto" : "none",
36
34
  style: panelStyle,
37
35
  onLayout: handleLayout,
38
- children: [
39
- children,
40
- styleProps.ready && styleProps.position?.showArrow ? /* @__PURE__ */ jsx(View, { pointerEvents: "none", style: styles.arrow }) : null
41
- ]
36
+ children
42
37
  }
43
38
  )
44
39
  ]
45
40
  }
46
41
  );
47
42
  });
48
- function themedStyles(theme, { surface, bounds, host, position, ready }) {
43
+ function themedStyles(theme, { bounds, host, position, ready }) {
49
44
  const tokens = theme.components.popover;
50
- const appearance = tokens.surfaces[surface];
51
45
  return StyleSheet.create({
52
46
  host: { ...StyleSheet.absoluteFill, zIndex: tokens.zIndexBase },
53
47
  position: {
@@ -58,24 +52,14 @@ function themedStyles(theme, { surface, bounds, host, position, ready }) {
58
52
  opacity: ready ? 1 : 0
59
53
  },
60
54
  panel: {
61
- width: surface === "elevated" ? tokens.maxWidth : void 0,
62
- backgroundColor: appearance.value,
63
- borderColor: appearance.borderColor,
64
- borderWidth: appearance.borderWidth,
65
- borderRadius: appearance.borderRadius,
66
- paddingHorizontal: appearance.paddingHorizontal,
67
- paddingVertical: appearance.paddingVertical,
55
+ width: tokens.maxWidth,
56
+ backgroundColor: tokens.backgroundColor,
57
+ borderColor: tokens.borderColor,
58
+ borderWidth: tokens.borderWidth,
59
+ borderRadius: tokens.borderRadius,
60
+ paddingHorizontal: tokens.paddingHorizontal,
61
+ paddingVertical: tokens.paddingVertical,
68
62
  gap: tokens.gap
69
- },
70
- arrow: {
71
- position: "absolute",
72
- ...position ? getArrowStyle(
73
- position,
74
- tokens.arrowSize,
75
- appearance.value,
76
- appearance.borderWidth,
77
- appearance.borderColor
78
- ) : {}
79
63
  }
80
64
  });
81
65
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/popover-surface.tsx"],"sourcesContent":["import { memo, useMemo } from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nimport type { AppTheme } from \"@impulse-ui-native/theme\";\nimport { Pressable, View } from \"@impulse-ui-native/primitives\";\nimport { useStyleProps, useThemedStyles } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverContentProps } from \"../types\";\nimport type { PopoverSurfaceStyleProps } from \"../types/popover.types\";\nimport { usePopoverSurface } from \"../hooks/use-popover-surface.hook\";\nimport { getArrowStyle } from \"../utils/popover-position.utils\";\n\nexport const PopoverSurfaceView = memo(function PopoverSurfaceView({\n children,\n style,\n onLayout,\n ...props\n}: PopoverContentProps) {\n const { hostRef, styleProps, close, handleLayout } =\n usePopoverSurface(onLayout);\n\n const extractedStyleProps = useStyleProps(props);\n const styles = useThemedStyles(themedStyles, styleProps, [styleProps]);\n\n const panelStyle = useMemo(\n () => [styles.panel, extractedStyleProps, style, styles.position],\n [styles.panel, extractedStyleProps, style, styles.position],\n );\n\n return (\n <View\n ref={hostRef}\n collapsable={false}\n pointerEvents=\"box-none\"\n style={styles.host}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={close} />\n <View\n shadow=\"sm\"\n {...props}\n pointerEvents={styleProps.ready ? \"auto\" : \"none\"}\n style={panelStyle}\n onLayout={handleLayout}\n >\n {children}\n {styleProps.ready && styleProps.position?.showArrow ? (\n <View pointerEvents=\"none\" style={styles.arrow} />\n ) : null}\n </View>\n </View>\n );\n});\n\nfunction themedStyles(\n theme: AppTheme,\n { surface, bounds, host, position, ready }: PopoverSurfaceStyleProps,\n) {\n const tokens = theme.components.popover;\n const appearance = tokens.surfaces[surface];\n\n return StyleSheet.create({\n host: { ...StyleSheet.absoluteFill, zIndex: tokens.zIndexBase },\n\n position: {\n position: \"absolute\",\n left: (position?.x ?? bounds.x) - (host?.x ?? 0),\n top: (position?.y ?? bounds.y) - (host?.y ?? 0),\n maxWidth: Math.min(tokens.maxWidth, bounds.width),\n opacity: ready ? 1 : 0,\n },\n\n panel: {\n width: surface === \"elevated\" ? tokens.maxWidth : undefined,\n backgroundColor: appearance.value,\n borderColor: appearance.borderColor,\n borderWidth: appearance.borderWidth,\n borderRadius: appearance.borderRadius,\n paddingHorizontal: appearance.paddingHorizontal,\n paddingVertical: appearance.paddingVertical,\n gap: tokens.gap,\n },\n\n arrow: {\n position: \"absolute\",\n ...(position\n ? getArrowStyle(\n position,\n tokens.arrowSize,\n appearance.value,\n appearance.borderWidth,\n appearance.borderColor,\n )\n : {}),\n },\n });\n}\n"],"mappings":"AAoCM,cACA,YADA;AApCN,SAAS,MAAM,eAAe;AAC9B,SAAS,kBAAkB;AAG3B,SAAS,WAAW,YAAY;AAChC,SAAS,eAAe,uBAAuB;AAI/C,SAAS,yBAAyB;AAClC,SAAS,qBAAqB;AAEvB,MAAM,qBAAqB,KAAK,SAASA,oBAAmB;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,SAAS,YAAY,OAAO,aAAa,IAC/C,kBAAkB,QAAQ;AAE5B,QAAM,sBAAsB,cAAc,KAAK;AAC/C,QAAM,SAAS,gBAAgB,cAAc,YAAY,CAAC,UAAU,CAAC;AAErE,QAAM,aAAa;AAAA,IACjB,MAAM,CAAC,OAAO,OAAO,qBAAqB,OAAO,OAAO,QAAQ;AAAA,IAChE,CAAC,OAAO,OAAO,qBAAqB,OAAO,OAAO,QAAQ;AAAA,EAC5D;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,eAAc;AAAA,MACd,OAAO,OAAO;AAAA,MAEd;AAAA,4BAAC,aAAU,OAAO,WAAW,cAAc,SAAS,OAAO;AAAA,QAC3D;AAAA,UAAC;AAAA;AAAA,YACC,QAAO;AAAA,YACN,GAAG;AAAA,YACJ,eAAe,WAAW,QAAQ,SAAS;AAAA,YAC3C,OAAO;AAAA,YACP,UAAU;AAAA,YAET;AAAA;AAAA,cACA,WAAW,SAAS,WAAW,UAAU,YACxC,oBAAC,QAAK,eAAc,QAAO,OAAO,OAAO,OAAO,IAC9C;AAAA;AAAA;AAAA,QACN;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,SAAS,aACP,OACA,EAAE,SAAS,QAAQ,MAAM,UAAU,MAAM,GACzC;AACA,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,aAAa,OAAO,SAAS,OAAO;AAE1C,SAAO,WAAW,OAAO;AAAA,IACvB,MAAM,EAAE,GAAG,WAAW,cAAc,QAAQ,OAAO,WAAW;AAAA,IAE9D,UAAU;AAAA,MACR,UAAU;AAAA,MACV,OAAO,UAAU,KAAK,OAAO,MAAM,MAAM,KAAK;AAAA,MAC9C,MAAM,UAAU,KAAK,OAAO,MAAM,MAAM,KAAK;AAAA,MAC7C,UAAU,KAAK,IAAI,OAAO,UAAU,OAAO,KAAK;AAAA,MAChD,SAAS,QAAQ,IAAI;AAAA,IACvB;AAAA,IAEA,OAAO;AAAA,MACL,OAAO,YAAY,aAAa,OAAO,WAAW;AAAA,MAClD,iBAAiB,WAAW;AAAA,MAC5B,aAAa,WAAW;AAAA,MACxB,aAAa,WAAW;AAAA,MACxB,cAAc,WAAW;AAAA,MACzB,mBAAmB,WAAW;AAAA,MAC9B,iBAAiB,WAAW;AAAA,MAC5B,KAAK,OAAO;AAAA,IACd;AAAA,IAEA,OAAO;AAAA,MACL,UAAU;AAAA,MACV,GAAI,WACA;AAAA,QACE;AAAA,QACA,OAAO;AAAA,QACP,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MACb,IACA,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AACH;","names":["PopoverSurfaceView"]}
1
+ {"version":3,"sources":["../../src/components/popover-surface.tsx"],"sourcesContent":["import { memo, useMemo } from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nimport type { AppTheme } from \"@impulse-ui-native/theme\";\nimport { Pressable, View } from \"@impulse-ui-native/primitives\";\nimport { useStyleProps, useThemedStyles } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverContentProps } from \"../types\";\nimport type { PopoverSurfaceStyleProps } from \"../types/popover.types\";\nimport { usePopoverSurface } from \"../hooks/use-popover-surface.hook\";\n\nexport const PopoverSurfaceView = memo(function PopoverSurfaceView({\n children,\n style,\n onLayout,\n ...props\n}: PopoverContentProps) {\n const { hostRef, styleProps, close, handleLayout } =\n usePopoverSurface(onLayout);\n\n const extractedStyleProps = useStyleProps(props);\n const styles = useThemedStyles(themedStyles, styleProps, [styleProps]);\n\n const panelStyle = useMemo(\n () => [styles.panel, extractedStyleProps, style, styles.position],\n [styles.panel, extractedStyleProps, style, styles.position],\n );\n\n return (\n <View\n ref={hostRef}\n collapsable={false}\n pointerEvents=\"box-none\"\n style={styles.host}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={close} />\n <View\n {...props}\n pointerEvents={styleProps.ready ? \"auto\" : \"none\"}\n style={panelStyle}\n onLayout={handleLayout}\n >\n {children}\n </View>\n </View>\n );\n});\n\nfunction themedStyles(\n theme: AppTheme,\n { bounds, host, position, ready }: PopoverSurfaceStyleProps,\n) {\n const tokens = theme.components.popover;\n\n return StyleSheet.create({\n host: { ...StyleSheet.absoluteFill, zIndex: tokens.zIndexBase },\n\n position: {\n position: \"absolute\",\n left: (position?.x ?? bounds.x) - (host?.x ?? 0),\n top: (position?.y ?? bounds.y) - (host?.y ?? 0),\n maxWidth: Math.min(tokens.maxWidth, bounds.width),\n opacity: ready ? 1 : 0,\n },\n\n panel: {\n width: tokens.maxWidth,\n backgroundColor: tokens.backgroundColor,\n borderColor: tokens.borderColor,\n borderWidth: tokens.borderWidth,\n borderRadius: tokens.borderRadius,\n paddingHorizontal: tokens.paddingHorizontal,\n paddingVertical: tokens.paddingVertical,\n gap: tokens.gap,\n },\n });\n}\n"],"mappings":"AA6BI,SAME,KANF;AA7BJ,SAAS,MAAM,eAAe;AAC9B,SAAS,kBAAkB;AAG3B,SAAS,WAAW,YAAY;AAChC,SAAS,eAAe,uBAAuB;AAI/C,SAAS,yBAAyB;AAE3B,MAAM,qBAAqB,KAAK,SAASA,oBAAmB;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,SAAS,YAAY,OAAO,aAAa,IAC/C,kBAAkB,QAAQ;AAE5B,QAAM,sBAAsB,cAAc,KAAK;AAC/C,QAAM,SAAS,gBAAgB,cAAc,YAAY,CAAC,UAAU,CAAC;AAErE,QAAM,aAAa;AAAA,IACjB,MAAM,CAAC,OAAO,OAAO,qBAAqB,OAAO,OAAO,QAAQ;AAAA,IAChE,CAAC,OAAO,OAAO,qBAAqB,OAAO,OAAO,QAAQ;AAAA,EAC5D;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,eAAc;AAAA,MACd,OAAO,OAAO;AAAA,MAEd;AAAA,4BAAC,aAAU,OAAO,WAAW,cAAc,SAAS,OAAO;AAAA,QAC3D;AAAA,UAAC;AAAA;AAAA,YACE,GAAG;AAAA,YACJ,eAAe,WAAW,QAAQ,SAAS;AAAA,YAC3C,OAAO;AAAA,YACP,UAAU;AAAA,YAET;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,SAAS,aACP,OACA,EAAE,QAAQ,MAAM,UAAU,MAAM,GAChC;AACA,QAAM,SAAS,MAAM,WAAW;AAEhC,SAAO,WAAW,OAAO;AAAA,IACvB,MAAM,EAAE,GAAG,WAAW,cAAc,QAAQ,OAAO,WAAW;AAAA,IAE9D,UAAU;AAAA,MACR,UAAU;AAAA,MACV,OAAO,UAAU,KAAK,OAAO,MAAM,MAAM,KAAK;AAAA,MAC9C,MAAM,UAAU,KAAK,OAAO,MAAM,MAAM,KAAK;AAAA,MAC7C,UAAU,KAAK,IAAI,OAAO,UAAU,OAAO,KAAK;AAAA,MAChD,SAAS,QAAQ,IAAI;AAAA,IACvB;AAAA,IAEA,OAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,mBAAmB,OAAO;AAAA,MAC1B,iBAAiB,OAAO;AAAA,MACxB,KAAK,OAAO;AAAA,IACd;AAAA,EACF,CAAC;AACH;","names":["PopoverSurfaceView"]}
@@ -2,16 +2,15 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { memo } from "react";
3
3
  import { Typography } from "@impulse-ui-native/primitives";
4
4
  import { useComponentsTokens } from "@impulse-ui-native/theme";
5
- import { usePopoverContext } from "../hooks/use-popover-context.hook";
6
5
  const PopoverTitle = memo(function PopoverTitle2(props) {
7
- const { surface } = usePopoverContext();
8
6
  const tokens = useComponentsTokens().popover;
9
7
  return /* @__PURE__ */ jsx(
10
8
  Typography.Title6,
11
9
  {
12
- color: surface === "inverse" ? tokens.surfaces.inverse.contrast : tokens.titleColor,
10
+ color: tokens.titleColor,
13
11
  fontSize: tokens.titleFontSize,
14
12
  lineHeight: tokens.titleLineHeight,
13
+ flexShrink: 1,
15
14
  ...props
16
15
  }
17
16
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/popover-title.tsx"],"sourcesContent":["import { memo } from \"react\";\n\nimport { Typography } from \"@impulse-ui-native/primitives\";\nimport { useComponentsTokens } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverTitleProps } from \"../types\";\nimport { usePopoverContext } from \"../hooks/use-popover-context.hook\";\n\nexport const PopoverTitle = memo(function PopoverTitle(\n props: PopoverTitleProps,\n) {\n const { surface } = usePopoverContext();\n const tokens = useComponentsTokens().popover;\n\n return (\n <Typography.Title6\n color={\n surface === \"inverse\"\n ? tokens.surfaces.inverse.contrast\n : tokens.titleColor\n }\n fontSize={tokens.titleFontSize}\n lineHeight={tokens.titleLineHeight}\n {...props}\n />\n );\n});\n"],"mappings":"AAeI;AAfJ,SAAS,YAAY;AAErB,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AAGpC,SAAS,yBAAyB;AAE3B,MAAM,eAAe,KAAK,SAASA,cACxC,OACA;AACA,QAAM,EAAE,QAAQ,IAAI,kBAAkB;AACtC,QAAM,SAAS,oBAAoB,EAAE;AAErC,SACE;AAAA,IAAC,WAAW;AAAA,IAAX;AAAA,MACC,OACE,YAAY,YACR,OAAO,SAAS,QAAQ,WACxB,OAAO;AAAA,MAEb,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO;AAAA,MAClB,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;","names":["PopoverTitle"]}
1
+ {"version":3,"sources":["../../src/components/popover-title.tsx"],"sourcesContent":["import { memo } from \"react\";\n\nimport { Typography } from \"@impulse-ui-native/primitives\";\nimport { useComponentsTokens } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverTitleProps } from \"../types\";\n\nexport const PopoverTitle = memo(function PopoverTitle(\n props: PopoverTitleProps,\n) {\n const tokens = useComponentsTokens().popover;\n\n return (\n <Typography.Title6\n color={tokens.titleColor}\n fontSize={tokens.titleFontSize}\n lineHeight={tokens.titleLineHeight}\n flexShrink={1}\n {...props}\n />\n );\n});\n"],"mappings":"AAaI;AAbJ,SAAS,YAAY;AAErB,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AAI7B,MAAM,eAAe,KAAK,SAASA,cACxC,OACA;AACA,QAAM,SAAS,oBAAoB,EAAE;AAErC,SACE;AAAA,IAAC,WAAW;AAAA,IAAX;AAAA,MACC,OAAO,OAAO;AAAA,MACd,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO;AAAA,MACnB,YAAY;AAAA,MACX,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;","names":["PopoverTitle"]}
@@ -4,6 +4,6 @@ import { PopoverProps } from '../types/popover.types.mjs';
4
4
  import 'react-native';
5
5
  import '@impulse-ui-native/primitives';
6
6
 
7
- declare const PopoverComponent: react.MemoExoticComponent<({ trigger, triggerProps, contentProps, children, ...props }: PopoverProps) => react_jsx_runtime.JSX.Element>;
7
+ declare const PopoverComponent: react.MemoExoticComponent<({ trigger, triggerProps, contentProps, header, title, footer, hideClose, children, ...props }: PopoverProps) => react_jsx_runtime.JSX.Element>;
8
8
 
9
9
  export { PopoverComponent };
@@ -1,18 +1,38 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { memo } from "react";
3
+ import { Icon } from "@impulse-ui-native/icon";
4
+ import { XIcon } from "@impulse-ui-native/icon/icons/x";
5
+ import { useColors } from "@impulse-ui-native/theme";
6
+ import { PopoverClose } from "./popover-close";
3
7
  import { PopoverContent } from "./popover-content";
8
+ import { PopoverFooter } from "./popover-footer";
9
+ import { PopoverHeader } from "./popover-header";
4
10
  import { PopoverRoot } from "./popover-root";
11
+ import { PopoverTitle } from "./popover-title";
5
12
  import { PopoverTrigger } from "./popover-trigger";
6
13
  const PopoverComponent = memo(function Popover({
7
14
  trigger,
8
15
  triggerProps,
9
16
  contentProps,
17
+ header,
18
+ title,
19
+ footer,
20
+ hideClose = false,
10
21
  children,
11
22
  ...props
12
23
  }) {
24
+ const colors = useColors();
13
25
  return /* @__PURE__ */ jsxs(PopoverRoot, { ...props, children: [
14
26
  /* @__PURE__ */ jsx(PopoverTrigger, { ...triggerProps, children: trigger }),
15
- /* @__PURE__ */ jsx(PopoverContent, { ...contentProps, children })
27
+ /* @__PURE__ */ jsxs(PopoverContent, { ...contentProps, children: [
28
+ header || title || !hideClose ? /* @__PURE__ */ jsxs(PopoverHeader, { children: [
29
+ header,
30
+ !header && title ? /* @__PURE__ */ jsx(PopoverTitle, { children: title }) : null,
31
+ !hideClose ? /* @__PURE__ */ jsx(PopoverClose, { marginLeft: "auto", children: /* @__PURE__ */ jsx(Icon, { icon: XIcon, size: "small", color: colors.text.tertiary }) }) : null
32
+ ] }) : null,
33
+ children,
34
+ footer ? /* @__PURE__ */ jsx(PopoverFooter, { children: footer }) : null
35
+ ] })
16
36
  ] });
17
37
  });
18
38
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/popover.tsx"],"sourcesContent":["import { memo } from \"react\";\n\nimport type { PopoverProps } from \"../types\";\nimport { PopoverContent } from \"./popover-content\";\nimport { PopoverRoot } from \"./popover-root\";\nimport { PopoverTrigger } from \"./popover-trigger\";\n\nexport const PopoverComponent = memo(function Popover({\n trigger,\n triggerProps,\n contentProps,\n children,\n ...props\n}: PopoverProps) {\n return (\n <PopoverRoot {...props}>\n <PopoverTrigger {...triggerProps}>{trigger}</PopoverTrigger>\n <PopoverContent {...contentProps}>{children}</PopoverContent>\n </PopoverRoot>\n );\n});\n"],"mappings":"AAeI,SACE,KADF;AAfJ,SAAS,YAAY;AAGrB,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAExB,MAAM,mBAAmB,KAAK,SAAS,QAAQ;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAiB;AACf,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,kBAAgB,GAAG,cAAe,mBAAQ;AAAA,IAC3C,oBAAC,kBAAgB,GAAG,cAAe,UAAS;AAAA,KAC9C;AAEJ,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/components/popover.tsx"],"sourcesContent":["import { memo } from \"react\";\n\nimport { Icon } from \"@impulse-ui-native/icon\";\nimport { XIcon } from \"@impulse-ui-native/icon/icons/x\";\nimport { useColors } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverProps } from \"../types\";\nimport { PopoverClose } from \"./popover-close\";\nimport { PopoverContent } from \"./popover-content\";\nimport { PopoverFooter } from \"./popover-footer\";\nimport { PopoverHeader } from \"./popover-header\";\nimport { PopoverRoot } from \"./popover-root\";\nimport { PopoverTitle } from \"./popover-title\";\nimport { PopoverTrigger } from \"./popover-trigger\";\n\nexport const PopoverComponent = memo(function Popover({\n trigger,\n triggerProps,\n contentProps,\n header,\n title,\n footer,\n hideClose = false,\n children,\n ...props\n}: PopoverProps) {\n const colors = useColors();\n\n return (\n <PopoverRoot {...props}>\n <PopoverTrigger {...triggerProps}>{trigger}</PopoverTrigger>\n <PopoverContent {...contentProps}>\n {header || title || !hideClose ? (\n <PopoverHeader>\n {header}\n {!header && title ? <PopoverTitle>{title}</PopoverTitle> : null}\n {!hideClose ? (\n <PopoverClose marginLeft=\"auto\">\n <Icon icon={XIcon} size=\"small\" color={colors.text.tertiary} />\n </PopoverClose>\n ) : null}\n </PopoverHeader>\n ) : null}\n {children}\n {footer ? <PopoverFooter>{footer}</PopoverFooter> : null}\n </PopoverContent>\n </PopoverRoot>\n );\n});\n"],"mappings":"AA8BM,cAGI,YAHJ;AA9BN,SAAS,YAAY;AAErB,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAG1B,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAExB,MAAM,mBAAmB,KAAK,SAAS,QAAQ;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAiB;AACf,QAAM,SAAS,UAAU;AAEzB,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,kBAAgB,GAAG,cAAe,mBAAQ;AAAA,IAC3C,qBAAC,kBAAgB,GAAG,cACjB;AAAA,gBAAU,SAAS,CAAC,YACnB,qBAAC,iBACE;AAAA;AAAA,QACA,CAAC,UAAU,QAAQ,oBAAC,gBAAc,iBAAM,IAAkB;AAAA,QAC1D,CAAC,YACA,oBAAC,gBAAa,YAAW,QACvB,8BAAC,QAAK,MAAM,OAAO,MAAK,SAAQ,OAAO,OAAO,KAAK,UAAU,GAC/D,IACE;AAAA,SACN,IACE;AAAA,MACH;AAAA,MACA,SAAS,oBAAC,iBAAe,kBAAO,IAAmB;AAAA,OACtD;AAAA,KACF;AAEJ,CAAC;","names":[]}
@@ -1,10 +1,12 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { memo } from "react";
3
+ import { StyleSheet } from "react-native";
3
4
  import {
4
5
  useControllableState,
5
6
  useEventCallback,
6
7
  useTimer
7
8
  } from "@impulse-ui-native/core";
9
+ import { useThemedStyles } from "@impulse-ui-native/theme";
8
10
  import { TooltipDuration } from "../constants/popover.constants";
9
11
  import { PopoverContent } from "./popover-content";
10
12
  import { PopoverDescription } from "./popover-description";
@@ -27,6 +29,7 @@ const Tooltip = memo(function Tooltip2({
27
29
  defaultProp: defaultOpen,
28
30
  onChange: onOpenChange
29
31
  });
32
+ const styles = useThemedStyles(themedStyles);
30
33
  const dismiss = useEventCallback(() => setOpen(false));
31
34
  useTimer({ enabled: open && !disabled, duration, callback: dismiss });
32
35
  return /* @__PURE__ */ jsxs(
@@ -37,14 +40,30 @@ const Tooltip = memo(function Tooltip2({
37
40
  onOpenChange: setOpen,
38
41
  disabled,
39
42
  placement,
40
- surface: "inverse",
41
43
  children: [
42
44
  /* @__PURE__ */ jsx(PopoverTrigger, { trigger: "longPress", ...triggerProps, children }),
43
- /* @__PURE__ */ jsx(PopoverContent, { children: typeof content === "string" || typeof content === "number" ? /* @__PURE__ */ jsx(PopoverDescription, { children: content }) : content })
45
+ /* @__PURE__ */ jsx(PopoverContent, { shadow: "sm", style: styles.content, children: typeof content === "string" || typeof content === "number" ? /* @__PURE__ */ jsx(PopoverDescription, { style: styles.description, children: content }) : content })
44
46
  ]
45
47
  }
46
48
  );
47
49
  });
50
+ function themedStyles(theme) {
51
+ const tokens = theme.components.popover.tooltip;
52
+ return StyleSheet.create({
53
+ content: {
54
+ width: "auto",
55
+ backgroundColor: tokens.backgroundColor,
56
+ borderColor: tokens.backgroundColor,
57
+ borderWidth: 0,
58
+ borderRadius: tokens.borderRadius,
59
+ paddingHorizontal: tokens.paddingHorizontal,
60
+ paddingVertical: tokens.paddingVertical
61
+ },
62
+ description: {
63
+ color: tokens.color
64
+ }
65
+ });
66
+ }
48
67
  export {
49
68
  Tooltip
50
69
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/tooltip.tsx"],"sourcesContent":["import { memo } from \"react\";\n\nimport {\n useControllableState,\n useEventCallback,\n useTimer,\n} from \"@impulse-ui-native/core\";\n\nimport type { TooltipProps } from \"../types\";\nimport { TooltipDuration } from \"../constants/popover.constants\";\nimport { PopoverContent } from \"./popover-content\";\nimport { PopoverDescription } from \"./popover-description\";\nimport { PopoverRoot } from \"./popover-root\";\nimport { PopoverTrigger } from \"./popover-trigger\";\n\nexport const Tooltip = memo(function Tooltip({\n children,\n content,\n triggerProps,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n disabled,\n placement = \"top\",\n duration = TooltipDuration,\n ...props\n}: TooltipProps) {\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n const dismiss = useEventCallback(() => setOpen(false));\n\n useTimer({ enabled: open && !disabled, duration, callback: dismiss });\n\n return (\n <PopoverRoot\n {...props}\n open={open}\n onOpenChange={setOpen}\n disabled={disabled}\n placement={placement}\n surface=\"inverse\"\n >\n <PopoverTrigger trigger=\"longPress\" {...triggerProps}>\n {children}\n </PopoverTrigger>\n <PopoverContent>\n {typeof content === \"string\" || typeof content === \"number\" ? (\n <PopoverDescription>{content}</PopoverDescription>\n ) : (\n content\n )}\n </PopoverContent>\n </PopoverRoot>\n );\n});\n"],"mappings":"AAsCI,SAQE,KARF;AAtCJ,SAAS,YAAY;AAErB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAExB,MAAM,UAAU,KAAK,SAASA,SAAQ;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,GAAG;AACL,GAAiB;AACf,QAAM,CAAC,MAAM,OAAO,IAAI,qBAAqB;AAAA,IAC3C,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,UAAU,iBAAiB,MAAM,QAAQ,KAAK,CAAC;AAErD,WAAS,EAAE,SAAS,QAAQ,CAAC,UAAU,UAAU,UAAU,QAAQ,CAAC;AAEpE,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA,SAAQ;AAAA,MAER;AAAA,4BAAC,kBAAe,SAAQ,aAAa,GAAG,cACrC,UACH;AAAA,QACA,oBAAC,kBACE,iBAAO,YAAY,YAAY,OAAO,YAAY,WACjD,oBAAC,sBAAoB,mBAAQ,IAE7B,SAEJ;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;","names":["Tooltip"]}
1
+ {"version":3,"sources":["../../src/components/tooltip.tsx"],"sourcesContent":["import { memo } from \"react\";\nimport { StyleSheet } from \"react-native\";\n\nimport type { AppTheme } from \"@impulse-ui-native/theme\";\nimport {\n useControllableState,\n useEventCallback,\n useTimer,\n} from \"@impulse-ui-native/core\";\nimport { useThemedStyles } from \"@impulse-ui-native/theme\";\n\nimport type { TooltipProps } from \"../types\";\nimport { TooltipDuration } from \"../constants/popover.constants\";\nimport { PopoverContent } from \"./popover-content\";\nimport { PopoverDescription } from \"./popover-description\";\nimport { PopoverRoot } from \"./popover-root\";\nimport { PopoverTrigger } from \"./popover-trigger\";\n\nexport const Tooltip = memo(function Tooltip({\n children,\n content,\n triggerProps,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n disabled,\n placement = \"top\",\n duration = TooltipDuration,\n ...props\n}: TooltipProps) {\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n const styles = useThemedStyles(themedStyles);\n\n const dismiss = useEventCallback(() => setOpen(false));\n\n useTimer({ enabled: open && !disabled, duration, callback: dismiss });\n\n return (\n <PopoverRoot\n {...props}\n open={open}\n onOpenChange={setOpen}\n disabled={disabled}\n placement={placement}\n >\n <PopoverTrigger trigger=\"longPress\" {...triggerProps}>\n {children}\n </PopoverTrigger>\n <PopoverContent shadow=\"sm\" style={styles.content}>\n {typeof content === \"string\" || typeof content === \"number\" ? (\n <PopoverDescription style={styles.description}>\n {content}\n </PopoverDescription>\n ) : (\n content\n )}\n </PopoverContent>\n </PopoverRoot>\n );\n});\n\nfunction themedStyles(theme: AppTheme) {\n const tokens = theme.components.popover.tooltip;\n\n return StyleSheet.create({\n content: {\n width: \"auto\",\n backgroundColor: tokens.backgroundColor,\n borderColor: tokens.backgroundColor,\n borderWidth: 0,\n borderRadius: tokens.borderRadius,\n paddingHorizontal: tokens.paddingHorizontal,\n paddingVertical: tokens.paddingVertical,\n },\n description: {\n color: tokens.color,\n },\n });\n}\n"],"mappings":"AA2CI,SAOE,KAPF;AA3CJ,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAG3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAGhC,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAExB,MAAM,UAAU,KAAK,SAASA,SAAQ;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,GAAG;AACL,GAAiB;AACf,QAAM,CAAC,MAAM,OAAO,IAAI,qBAAqB;AAAA,IAC3C,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,SAAS,gBAAgB,YAAY;AAE3C,QAAM,UAAU,iBAAiB,MAAM,QAAQ,KAAK,CAAC;AAErD,WAAS,EAAE,SAAS,QAAQ,CAAC,UAAU,UAAU,UAAU,QAAQ,CAAC;AAEpE,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MAEA;AAAA,4BAAC,kBAAe,SAAQ,aAAa,GAAG,cACrC,UACH;AAAA,QACA,oBAAC,kBAAe,QAAO,MAAK,OAAO,OAAO,SACvC,iBAAO,YAAY,YAAY,OAAO,YAAY,WACjD,oBAAC,sBAAmB,OAAO,OAAO,aAC/B,mBACH,IAEA,SAEJ;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,SAAS,aAAa,OAAiB;AACrC,QAAM,SAAS,MAAM,WAAW,QAAQ;AAExC,SAAO,WAAW,OAAO;AAAA,IACvB,SAAS;AAAA,MACP,OAAO;AAAA,MACP,iBAAiB,OAAO;AAAA,MACxB,aAAa,OAAO;AAAA,MACpB,aAAa;AAAA,MACb,cAAc,OAAO;AAAA,MACrB,mBAAmB,OAAO;AAAA,MAC1B,iBAAiB,OAAO;AAAA,IAC1B;AAAA,IACA,aAAa;AAAA,MACX,OAAO,OAAO;AAAA,IAChB;AAAA,EACF,CAAC;AACH;","names":["Tooltip"]}
@@ -5,7 +5,7 @@ import { getPopoverPosition } from "../utils/popover-position.utils";
5
5
  import { usePopoverContext } from "./use-popover-context.hook";
6
6
  import { usePopoverPosition } from "./use-popover-position.hook";
7
7
  function usePopoverSurface(onLayout) {
8
- const { surface, placement, setOpen } = usePopoverContext();
8
+ const { placement, setOpen } = usePopoverContext();
9
9
  const [size, setSize] = useState({ width: 0, height: 0 });
10
10
  const hostRef = useRef(null);
11
11
  const tokens = useComponentsTokens().popover;
@@ -16,15 +16,14 @@ function usePopoverSurface(onLayout) {
16
16
  bounds,
17
17
  ...size,
18
18
  placement,
19
- gap: tokens.gap,
20
- arrowInset: tokens.surfaces[surface].borderRadius + tokens.arrowSize
19
+ gap: tokens.gap
21
20
  }) : null,
22
- [measurement, bounds, size, placement, surface, tokens]
21
+ [measurement, bounds, size, placement, tokens.gap]
23
22
  );
24
23
  const ready = visible && size.width > 0 && size.height > 0;
25
24
  const styleProps = useMemo(
26
- () => ({ surface, bounds, host: measurement?.host, position, ready }),
27
- [surface, bounds, measurement?.host, position, ready]
25
+ () => ({ bounds, host: measurement?.host, position, ready }),
26
+ [bounds, measurement?.host, position, ready]
28
27
  );
29
28
  const close = useEventCallback(() => setOpen(false));
30
29
  const handleLayout = useEventCallback((event) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/use-popover-surface.hook.ts"],"sourcesContent":["import type { LayoutChangeEvent, View } from \"react-native\";\nimport { useMemo, useRef, useState } from \"react\";\n\nimport { useBackHandler, useEventCallback } from \"@impulse-ui-native/core\";\nimport { useComponentsTokens } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverContentProps } from \"../types\";\nimport type { PopoverSurfaceStyleProps } from \"../types/popover.types\";\nimport { getPopoverPosition } from \"../utils/popover-position.utils\";\nimport { usePopoverContext } from \"./use-popover-context.hook\";\nimport { usePopoverPosition } from \"./use-popover-position.hook\";\n\nexport function usePopoverSurface(onLayout: PopoverContentProps[\"onLayout\"]) {\n const { surface, placement, setOpen } = usePopoverContext();\n\n const [size, setSize] = useState({ width: 0, height: 0 });\n const hostRef = useRef<View>(null);\n\n const tokens = useComponentsTokens().popover;\n const { measurement, bounds, visible } = usePopoverPosition(hostRef);\n\n const position = useMemo(\n () =>\n measurement\n ? getPopoverPosition({\n anchor: measurement.anchor,\n bounds,\n ...size,\n placement,\n gap: tokens.gap,\n arrowInset:\n tokens.surfaces[surface].borderRadius + tokens.arrowSize,\n })\n : null,\n [measurement, bounds, size, placement, surface, tokens],\n );\n\n const ready = visible && size.width > 0 && size.height > 0;\n const styleProps = useMemo<PopoverSurfaceStyleProps>(\n () => ({ surface, bounds, host: measurement?.host, position, ready }),\n [surface, bounds, measurement?.host, position, ready],\n );\n\n const close = useEventCallback(() => setOpen(false));\n\n const handleLayout = useEventCallback((event: LayoutChangeEvent) => {\n const { width, height } = event.nativeEvent.layout;\n\n setSize((previous) =>\n previous.width === width && previous.height === height\n ? previous\n : { width, height },\n );\n\n onLayout?.(event);\n });\n\n useBackHandler(() => {\n close();\n\n return true;\n });\n\n return { hostRef, styleProps, close, handleLayout };\n}\n"],"mappings":"AACA,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,SAAS,gBAAgB,wBAAwB;AACjD,SAAS,2BAA2B;AAIpC,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AAE5B,SAAS,kBAAkB,UAA2C;AAC3E,QAAM,EAAE,SAAS,WAAW,QAAQ,IAAI,kBAAkB;AAE1D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AACxD,QAAM,UAAU,OAAa,IAAI;AAEjC,QAAM,SAAS,oBAAoB,EAAE;AACrC,QAAM,EAAE,aAAa,QAAQ,QAAQ,IAAI,mBAAmB,OAAO;AAEnE,QAAM,WAAW;AAAA,IACf,MACE,cACI,mBAAmB;AAAA,MACjB,QAAQ,YAAY;AAAA,MACpB;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA,KAAK,OAAO;AAAA,MACZ,YACE,OAAO,SAAS,OAAO,EAAE,eAAe,OAAO;AAAA,IACnD,CAAC,IACD;AAAA,IACN,CAAC,aAAa,QAAQ,MAAM,WAAW,SAAS,MAAM;AAAA,EACxD;AAEA,QAAM,QAAQ,WAAW,KAAK,QAAQ,KAAK,KAAK,SAAS;AACzD,QAAM,aAAa;AAAA,IACjB,OAAO,EAAE,SAAS,QAAQ,MAAM,aAAa,MAAM,UAAU,MAAM;AAAA,IACnE,CAAC,SAAS,QAAQ,aAAa,MAAM,UAAU,KAAK;AAAA,EACtD;AAEA,QAAM,QAAQ,iBAAiB,MAAM,QAAQ,KAAK,CAAC;AAEnD,QAAM,eAAe,iBAAiB,CAAC,UAA6B;AAClE,UAAM,EAAE,OAAO,OAAO,IAAI,MAAM,YAAY;AAE5C;AAAA,MAAQ,CAAC,aACP,SAAS,UAAU,SAAS,SAAS,WAAW,SAC5C,WACA,EAAE,OAAO,OAAO;AAAA,IACtB;AAEA,eAAW,KAAK;AAAA,EAClB,CAAC;AAED,iBAAe,MAAM;AACnB,UAAM;AAEN,WAAO;AAAA,EACT,CAAC;AAED,SAAO,EAAE,SAAS,YAAY,OAAO,aAAa;AACpD;","names":[]}
1
+ {"version":3,"sources":["../../src/hooks/use-popover-surface.hook.ts"],"sourcesContent":["import type { LayoutChangeEvent, View } from \"react-native\";\nimport { useMemo, useRef, useState } from \"react\";\n\nimport { useBackHandler, useEventCallback } from \"@impulse-ui-native/core\";\nimport { useComponentsTokens } from \"@impulse-ui-native/theme\";\n\nimport type { PopoverContentProps } from \"../types\";\nimport type { PopoverSurfaceStyleProps } from \"../types/popover.types\";\nimport { getPopoverPosition } from \"../utils/popover-position.utils\";\nimport { usePopoverContext } from \"./use-popover-context.hook\";\nimport { usePopoverPosition } from \"./use-popover-position.hook\";\n\nexport function usePopoverSurface(onLayout: PopoverContentProps[\"onLayout\"]) {\n const { placement, setOpen } = usePopoverContext();\n\n const [size, setSize] = useState({ width: 0, height: 0 });\n const hostRef = useRef<View>(null);\n\n const tokens = useComponentsTokens().popover;\n const { measurement, bounds, visible } = usePopoverPosition(hostRef);\n\n const position = useMemo(\n () =>\n measurement\n ? getPopoverPosition({\n anchor: measurement.anchor,\n bounds,\n ...size,\n placement,\n gap: tokens.gap,\n })\n : null,\n [measurement, bounds, size, placement, tokens.gap],\n );\n\n const ready = visible && size.width > 0 && size.height > 0;\n const styleProps = useMemo<PopoverSurfaceStyleProps>(\n () => ({ bounds, host: measurement?.host, position, ready }),\n [bounds, measurement?.host, position, ready],\n );\n\n const close = useEventCallback(() => setOpen(false));\n\n const handleLayout = useEventCallback((event: LayoutChangeEvent) => {\n const { width, height } = event.nativeEvent.layout;\n\n setSize((previous) =>\n previous.width === width && previous.height === height\n ? previous\n : { width, height },\n );\n\n onLayout?.(event);\n });\n\n useBackHandler(() => {\n close();\n\n return true;\n });\n\n return { hostRef, styleProps, close, handleLayout };\n}\n"],"mappings":"AACA,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,SAAS,gBAAgB,wBAAwB;AACjD,SAAS,2BAA2B;AAIpC,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AAE5B,SAAS,kBAAkB,UAA2C;AAC3E,QAAM,EAAE,WAAW,QAAQ,IAAI,kBAAkB;AAEjD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AACxD,QAAM,UAAU,OAAa,IAAI;AAEjC,QAAM,SAAS,oBAAoB,EAAE;AACrC,QAAM,EAAE,aAAa,QAAQ,QAAQ,IAAI,mBAAmB,OAAO;AAEnE,QAAM,WAAW;AAAA,IACf,MACE,cACI,mBAAmB;AAAA,MACjB,QAAQ,YAAY;AAAA,MACpB;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA,KAAK,OAAO;AAAA,IACd,CAAC,IACD;AAAA,IACN,CAAC,aAAa,QAAQ,MAAM,WAAW,OAAO,GAAG;AAAA,EACnD;AAEA,QAAM,QAAQ,WAAW,KAAK,QAAQ,KAAK,KAAK,SAAS;AACzD,QAAM,aAAa;AAAA,IACjB,OAAO,EAAE,QAAQ,MAAM,aAAa,MAAM,UAAU,MAAM;AAAA,IAC1D,CAAC,QAAQ,aAAa,MAAM,UAAU,KAAK;AAAA,EAC7C;AAEA,QAAM,QAAQ,iBAAiB,MAAM,QAAQ,KAAK,CAAC;AAEnD,QAAM,eAAe,iBAAiB,CAAC,UAA6B;AAClE,UAAM,EAAE,OAAO,OAAO,IAAI,MAAM,YAAY;AAE5C;AAAA,MAAQ,CAAC,aACP,SAAS,UAAU,SAAS,SAAS,WAAW,SAC5C,WACA,EAAE,OAAO,OAAO;AAAA,IACtB;AAEA,eAAW,KAAK;AAAA,EAClB,CAAC;AAED,iBAAe,MAAM;AACnB,UAAM;AAEN,WAAO;AAAA,EACT,CAAC;AAED,SAAO,EAAE,SAAS,YAAY,OAAO,aAAa;AACpD;","names":[]}
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { Popover } from './components/index.mjs';
2
- export { PopoverCloseProps, PopoverContentProps, PopoverDescriptionProps, PopoverPlacement, PopoverProps, PopoverRootProps, PopoverSurface, PopoverTitleProps, PopoverTriggerProps, TooltipProps } from './types/popover.types.mjs';
2
+ export { PopoverCloseProps, PopoverContentProps, PopoverDescriptionProps, PopoverFooterProps, PopoverHeaderProps, PopoverPlacement, PopoverProps, PopoverRootProps, PopoverTitleProps, PopoverTriggerProps, TooltipProps } from './types/popover.types.mjs';
3
3
  export { Tooltip } from './components/tooltip.mjs';
4
4
  import 'react/jsx-runtime';
5
5
  import 'react';
@@ -1,4 +1,4 @@
1
- export { PopoverCloseProps, PopoverContentProps, PopoverDescriptionProps, PopoverPlacement, PopoverProps, PopoverRootProps, PopoverSurface, PopoverTitleProps, PopoverTriggerProps, TooltipProps } from './popover.types.mjs';
1
+ export { PopoverCloseProps, PopoverContentProps, PopoverDescriptionProps, PopoverFooterProps, PopoverHeaderProps, PopoverPlacement, PopoverProps, PopoverRootProps, PopoverTitleProps, PopoverTriggerProps, TooltipProps } from './popover.types.mjs';
2
2
  import 'react';
3
3
  import 'react-native';
4
4
  import '@impulse-ui-native/primitives';
@@ -3,29 +3,33 @@ import { View } from 'react-native';
3
3
  import { PressableCoreProps, ViewProps, TextProps } from '@impulse-ui-native/primitives';
4
4
 
5
5
  type PopoverPlacement = "top" | "bottom" | "left" | "right";
6
- type PopoverSurface = "elevated" | "inverse";
7
6
  interface PopoverRootProps extends PropsWithChildren {
8
7
  open?: boolean;
9
8
  defaultOpen?: boolean;
10
9
  onOpenChange?: (open: boolean) => void;
11
10
  disabled?: boolean;
12
11
  placement?: PopoverPlacement;
13
- surface?: PopoverSurface;
14
12
  portalName?: string;
15
13
  }
16
14
  interface PopoverTriggerProps extends Omit<PressableCoreProps, "children">, PropsWithChildren {
17
15
  trigger?: "press" | "longPress";
18
16
  }
19
17
  type PopoverContentProps = ViewProps;
18
+ type PopoverHeaderProps = ViewProps;
19
+ type PopoverFooterProps = ViewProps;
20
20
  type PopoverTitleProps = TextProps;
21
21
  type PopoverDescriptionProps = TextProps;
22
22
  type PopoverCloseProps = Omit<PressableCoreProps, "children"> & PropsWithChildren;
23
23
  interface PopoverProps extends PopoverRootProps {
24
+ title?: ReactNode;
25
+ header?: ReactNode;
26
+ footer?: ReactNode;
27
+ hideClose?: boolean;
24
28
  trigger: ReactNode;
25
29
  triggerProps?: PopoverTriggerProps;
26
30
  contentProps?: PopoverContentProps;
27
31
  }
28
- interface TooltipProps extends Omit<PopoverRootProps, "surface"> {
32
+ interface TooltipProps extends PopoverRootProps {
29
33
  content: ReactNode;
30
34
  triggerProps?: PopoverTriggerProps;
31
35
  /** Milliseconds before dismissal. Zero keeps the hint open. */
@@ -37,7 +41,6 @@ interface PopoverContextValue {
37
41
  setOpen: (open: boolean) => void;
38
42
  anchorRef: RefObject<View | null>;
39
43
  placement: PopoverPlacement;
40
- surface: PopoverSurface;
41
44
  portalName?: string;
42
45
  }
43
46
  interface PopoverRect {
@@ -50,8 +53,6 @@ interface PopoverPosition {
50
53
  x: number;
51
54
  y: number;
52
55
  placement: PopoverPlacement;
53
- arrowOffset: number;
54
- showArrow: boolean;
55
56
  }
56
57
  interface PopoverPositionOptions {
57
58
  anchor: PopoverRect;
@@ -60,14 +61,12 @@ interface PopoverPositionOptions {
60
61
  height: number;
61
62
  placement: PopoverPlacement;
62
63
  gap: number;
63
- arrowInset: number;
64
64
  }
65
65
  interface PopoverSurfaceStyleProps {
66
- surface: PopoverSurface;
67
66
  bounds: PopoverRect;
68
67
  host?: PopoverRect;
69
68
  position: PopoverPosition | null;
70
69
  ready: boolean;
71
70
  }
72
71
 
73
- export type { PopoverCloseProps, PopoverContentProps, PopoverContextValue, PopoverDescriptionProps, PopoverPlacement, PopoverPosition, PopoverPositionOptions, PopoverProps, PopoverRect, PopoverRootProps, PopoverSurface, PopoverSurfaceStyleProps, PopoverTitleProps, PopoverTriggerProps, TooltipProps };
72
+ export type { PopoverCloseProps, PopoverContentProps, PopoverContextValue, PopoverDescriptionProps, PopoverFooterProps, PopoverHeaderProps, PopoverPlacement, PopoverPosition, PopoverPositionOptions, PopoverProps, PopoverRect, PopoverRootProps, PopoverSurfaceStyleProps, PopoverTitleProps, PopoverTriggerProps, TooltipProps };
@@ -1,11 +1,10 @@
1
- import { ViewStyle } from 'react-native';
2
- import { PopoverRect, PopoverPosition, PopoverPositionOptions } from '../types/popover.types.mjs';
1
+ import { PopoverRect, PopoverPositionOptions, PopoverPosition } from '../types/popover.types.mjs';
3
2
  import 'react';
3
+ import 'react-native';
4
4
  import '@impulse-ui-native/primitives';
5
5
 
6
6
  declare function clamp(value: number, min: number, max: number): number;
7
7
  declare function equalRects(a: PopoverRect | null, b: PopoverRect): boolean;
8
- declare function getPopoverPosition({ anchor, bounds, width, height, placement: preferred, gap, arrowInset, }: PopoverPositionOptions): PopoverPosition;
9
- declare function getArrowStyle(position: PopoverPosition, size: number, color: string, borderWidth: number, borderColor: string): ViewStyle;
8
+ declare function getPopoverPosition({ anchor, bounds, width, height, placement: preferred, gap, }: PopoverPositionOptions): PopoverPosition;
10
9
 
11
- export { clamp, equalRects, getArrowStyle, getPopoverPosition };
10
+ export { clamp, equalRects, getPopoverPosition };
@@ -11,8 +11,7 @@ function getPopoverPosition({
11
11
  width,
12
12
  height,
13
13
  placement: preferred,
14
- gap,
15
- arrowInset
14
+ gap
16
15
  }) {
17
16
  const right = bounds.x + bounds.width;
18
17
  const bottom = bounds.y + bounds.height;
@@ -38,65 +37,11 @@ function getPopoverPosition({
38
37
  bounds.y,
39
38
  bottom - height
40
39
  );
41
- const edgeLength = vertical ? width : height;
42
- const inset = Math.min(arrowInset, edgeLength / 2);
43
- const offset = vertical ? centerX - x : centerY - y;
44
- const facing = placement === "top" ? y + height <= anchor.y : placement === "bottom" ? y >= anchor.y + anchor.height : placement === "left" ? x + width <= anchor.x : x >= anchor.x + anchor.width;
45
- return {
46
- x,
47
- y,
48
- placement,
49
- arrowOffset: clamp(offset, inset, edgeLength - inset),
50
- showArrow: facing && offset >= inset && offset <= edgeLength - inset
51
- };
52
- }
53
- function getArrowStyle(position, size, color, borderWidth, borderColor) {
54
- const side = size * Math.SQRT2;
55
- const offset = position.arrowOffset - borderWidth - side / 2;
56
- const edge = -(side + borderWidth) / 2;
57
- const shared = {
58
- width: side,
59
- height: side,
60
- backgroundColor: color,
61
- borderColor,
62
- transform: [{ rotate: "45deg" }],
63
- ...position.placement === "top" || position.placement === "bottom" ? { left: offset } : { top: offset }
64
- };
65
- switch (position.placement) {
66
- case "top":
67
- return {
68
- ...shared,
69
- bottom: edge,
70
- borderBottomWidth: borderWidth,
71
- borderRightWidth: borderWidth
72
- };
73
- case "bottom":
74
- return {
75
- ...shared,
76
- top: edge,
77
- borderTopWidth: borderWidth,
78
- borderLeftWidth: borderWidth
79
- };
80
- case "left":
81
- return {
82
- ...shared,
83
- right: edge,
84
- borderTopWidth: borderWidth,
85
- borderRightWidth: borderWidth
86
- };
87
- case "right":
88
- return {
89
- ...shared,
90
- left: edge,
91
- borderBottomWidth: borderWidth,
92
- borderLeftWidth: borderWidth
93
- };
94
- }
40
+ return { x, y, placement };
95
41
  }
96
42
  export {
97
43
  clamp,
98
44
  equalRects,
99
- getArrowStyle,
100
45
  getPopoverPosition
101
46
  };
102
47
  //# sourceMappingURL=popover-position.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/popover-position.utils.ts"],"sourcesContent":["import type { ViewStyle } from \"react-native\";\n\nimport type {\n PopoverPlacement,\n PopoverPosition,\n PopoverPositionOptions,\n PopoverRect,\n} from \"../types/popover.types\";\nimport { OppositePlacement } from \"../constants/popover.constants\";\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), Math.max(min, max));\n}\n\nexport function equalRects(a: PopoverRect | null, b: PopoverRect): boolean {\n return (\n a !== null &&\n a.x === b.x &&\n a.y === b.y &&\n a.width === b.width &&\n a.height === b.height\n );\n}\n\nexport function getPopoverPosition({\n anchor,\n bounds,\n width,\n height,\n placement: preferred,\n gap,\n arrowInset,\n}: PopoverPositionOptions): PopoverPosition {\n const right = bounds.x + bounds.width;\n const bottom = bounds.y + bounds.height;\n\n const available: Record<PopoverPlacement, number> = {\n top: anchor.y - bounds.y - gap,\n bottom: bottom - anchor.y - anchor.height - gap,\n left: anchor.x - bounds.x - gap,\n right: right - anchor.x - anchor.width - gap,\n };\n\n const vertical = preferred === \"top\" || preferred === \"bottom\";\n const extent = vertical ? height : width;\n const opposite = OppositePlacement[preferred];\n const placement =\n available[preferred] < extent && available[opposite] > available[preferred]\n ? opposite\n : preferred;\n\n const centerX = anchor.x + anchor.width / 2;\n const centerY = anchor.y + anchor.height / 2;\n const x = clamp(\n vertical\n ? centerX - width / 2\n : placement === \"left\"\n ? anchor.x - width - gap\n : anchor.x + anchor.width + gap,\n bounds.x,\n right - width,\n );\n const y = clamp(\n vertical\n ? placement === \"top\"\n ? anchor.y - height - gap\n : anchor.y + anchor.height + gap\n : centerY - height / 2,\n bounds.y,\n bottom - height,\n );\n\n const edgeLength = vertical ? width : height;\n const inset = Math.min(arrowInset, edgeLength / 2);\n const offset = vertical ? centerX - x : centerY - y;\n const facing =\n placement === \"top\"\n ? y + height <= anchor.y\n : placement === \"bottom\"\n ? y >= anchor.y + anchor.height\n : placement === \"left\"\n ? x + width <= anchor.x\n : x >= anchor.x + anchor.width;\n\n return {\n x,\n y,\n placement,\n arrowOffset: clamp(offset, inset, edgeLength - inset),\n showArrow: facing && offset >= inset && offset <= edgeLength - inset,\n };\n}\n\nexport function getArrowStyle(\n position: PopoverPosition,\n size: number,\n color: string,\n borderWidth: number,\n borderColor: string,\n): ViewStyle {\n const side = size * Math.SQRT2;\n const offset = position.arrowOffset - borderWidth - side / 2;\n const edge = -(side + borderWidth) / 2;\n\n // The inner half covers the panel's border; only the outward edges are outlined.\n const shared: ViewStyle = {\n width: side,\n height: side,\n backgroundColor: color,\n borderColor,\n transform: [{ rotate: \"45deg\" }],\n ...(position.placement === \"top\" || position.placement === \"bottom\"\n ? { left: offset }\n : { top: offset }),\n };\n\n switch (position.placement) {\n case \"top\":\n return {\n ...shared,\n bottom: edge,\n borderBottomWidth: borderWidth,\n borderRightWidth: borderWidth,\n };\n\n case \"bottom\":\n return {\n ...shared,\n top: edge,\n borderTopWidth: borderWidth,\n borderLeftWidth: borderWidth,\n };\n\n case \"left\":\n return {\n ...shared,\n right: edge,\n borderTopWidth: borderWidth,\n borderRightWidth: borderWidth,\n };\n\n case \"right\":\n return {\n ...shared,\n left: edge,\n borderBottomWidth: borderWidth,\n borderLeftWidth: borderWidth,\n };\n }\n}\n"],"mappings":"AAQA,SAAS,yBAAyB;AAE3B,SAAS,MAAM,OAAe,KAAa,KAAqB;AACrE,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAC1D;AAEO,SAAS,WAAW,GAAuB,GAAyB;AACzE,SACE,MAAM,QACN,EAAE,MAAM,EAAE,KACV,EAAE,MAAM,EAAE,KACV,EAAE,UAAU,EAAE,SACd,EAAE,WAAW,EAAE;AAEnB;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAA4C;AAC1C,QAAM,QAAQ,OAAO,IAAI,OAAO;AAChC,QAAM,SAAS,OAAO,IAAI,OAAO;AAEjC,QAAM,YAA8C;AAAA,IAClD,KAAK,OAAO,IAAI,OAAO,IAAI;AAAA,IAC3B,QAAQ,SAAS,OAAO,IAAI,OAAO,SAAS;AAAA,IAC5C,MAAM,OAAO,IAAI,OAAO,IAAI;AAAA,IAC5B,OAAO,QAAQ,OAAO,IAAI,OAAO,QAAQ;AAAA,EAC3C;AAEA,QAAM,WAAW,cAAc,SAAS,cAAc;AACtD,QAAM,SAAS,WAAW,SAAS;AACnC,QAAM,WAAW,kBAAkB,SAAS;AAC5C,QAAM,YACJ,UAAU,SAAS,IAAI,UAAU,UAAU,QAAQ,IAAI,UAAU,SAAS,IACtE,WACA;AAEN,QAAM,UAAU,OAAO,IAAI,OAAO,QAAQ;AAC1C,QAAM,UAAU,OAAO,IAAI,OAAO,SAAS;AAC3C,QAAM,IAAI;AAAA,IACR,WACI,UAAU,QAAQ,IAClB,cAAc,SACZ,OAAO,IAAI,QAAQ,MACnB,OAAO,IAAI,OAAO,QAAQ;AAAA,IAChC,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACA,QAAM,IAAI;AAAA,IACR,WACI,cAAc,QACZ,OAAO,IAAI,SAAS,MACpB,OAAO,IAAI,OAAO,SAAS,MAC7B,UAAU,SAAS;AAAA,IACvB,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAEA,QAAM,aAAa,WAAW,QAAQ;AACtC,QAAM,QAAQ,KAAK,IAAI,YAAY,aAAa,CAAC;AACjD,QAAM,SAAS,WAAW,UAAU,IAAI,UAAU;AAClD,QAAM,SACJ,cAAc,QACV,IAAI,UAAU,OAAO,IACrB,cAAc,WACZ,KAAK,OAAO,IAAI,OAAO,SACvB,cAAc,SACZ,IAAI,SAAS,OAAO,IACpB,KAAK,OAAO,IAAI,OAAO;AAEjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,MAAM,QAAQ,OAAO,aAAa,KAAK;AAAA,IACpD,WAAW,UAAU,UAAU,SAAS,UAAU,aAAa;AAAA,EACjE;AACF;AAEO,SAAS,cACd,UACA,MACA,OACA,aACA,aACW;AACX,QAAM,OAAO,OAAO,KAAK;AACzB,QAAM,SAAS,SAAS,cAAc,cAAc,OAAO;AAC3D,QAAM,OAAO,EAAE,OAAO,eAAe;AAGrC,QAAM,SAAoB;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB;AAAA,IACA,WAAW,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,IAC/B,GAAI,SAAS,cAAc,SAAS,SAAS,cAAc,WACvD,EAAE,MAAM,OAAO,IACf,EAAE,KAAK,OAAO;AAAA,EACpB;AAEA,UAAQ,SAAS,WAAW;AAAA,IAC1B,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,MACpB;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,KAAK;AAAA,QACL,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,MACpB;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM;AAAA,QACN,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,MACnB;AAAA,EACJ;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/popover-position.utils.ts"],"sourcesContent":["import type {\n PopoverPlacement,\n PopoverPosition,\n PopoverPositionOptions,\n PopoverRect,\n} from \"../types/popover.types\";\nimport { OppositePlacement } from \"../constants/popover.constants\";\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), Math.max(min, max));\n}\n\nexport function equalRects(a: PopoverRect | null, b: PopoverRect): boolean {\n return (\n a !== null &&\n a.x === b.x &&\n a.y === b.y &&\n a.width === b.width &&\n a.height === b.height\n );\n}\n\nexport function getPopoverPosition({\n anchor,\n bounds,\n width,\n height,\n placement: preferred,\n gap,\n}: PopoverPositionOptions): PopoverPosition {\n const right = bounds.x + bounds.width;\n const bottom = bounds.y + bounds.height;\n\n const available: Record<PopoverPlacement, number> = {\n top: anchor.y - bounds.y - gap,\n bottom: bottom - anchor.y - anchor.height - gap,\n left: anchor.x - bounds.x - gap,\n right: right - anchor.x - anchor.width - gap,\n };\n\n const vertical = preferred === \"top\" || preferred === \"bottom\";\n const extent = vertical ? height : width;\n const opposite = OppositePlacement[preferred];\n const placement =\n available[preferred] < extent && available[opposite] > available[preferred]\n ? opposite\n : preferred;\n\n const centerX = anchor.x + anchor.width / 2;\n const centerY = anchor.y + anchor.height / 2;\n const x = clamp(\n vertical\n ? centerX - width / 2\n : placement === \"left\"\n ? anchor.x - width - gap\n : anchor.x + anchor.width + gap,\n bounds.x,\n right - width,\n );\n const y = clamp(\n vertical\n ? placement === \"top\"\n ? anchor.y - height - gap\n : anchor.y + anchor.height + gap\n : centerY - height / 2,\n bounds.y,\n bottom - height,\n );\n\n return { x, y, placement };\n}\n"],"mappings":"AAMA,SAAS,yBAAyB;AAE3B,SAAS,MAAM,OAAe,KAAa,KAAqB;AACrE,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAC1D;AAEO,SAAS,WAAW,GAAuB,GAAyB;AACzE,SACE,MAAM,QACN,EAAE,MAAM,EAAE,KACV,EAAE,MAAM,EAAE,KACV,EAAE,UAAU,EAAE,SACd,EAAE,WAAW,EAAE;AAEnB;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAA4C;AAC1C,QAAM,QAAQ,OAAO,IAAI,OAAO;AAChC,QAAM,SAAS,OAAO,IAAI,OAAO;AAEjC,QAAM,YAA8C;AAAA,IAClD,KAAK,OAAO,IAAI,OAAO,IAAI;AAAA,IAC3B,QAAQ,SAAS,OAAO,IAAI,OAAO,SAAS;AAAA,IAC5C,MAAM,OAAO,IAAI,OAAO,IAAI;AAAA,IAC5B,OAAO,QAAQ,OAAO,IAAI,OAAO,QAAQ;AAAA,EAC3C;AAEA,QAAM,WAAW,cAAc,SAAS,cAAc;AACtD,QAAM,SAAS,WAAW,SAAS;AACnC,QAAM,WAAW,kBAAkB,SAAS;AAC5C,QAAM,YACJ,UAAU,SAAS,IAAI,UAAU,UAAU,QAAQ,IAAI,UAAU,SAAS,IACtE,WACA;AAEN,QAAM,UAAU,OAAO,IAAI,OAAO,QAAQ;AAC1C,QAAM,UAAU,OAAO,IAAI,OAAO,SAAS;AAC3C,QAAM,IAAI;AAAA,IACR,WACI,UAAU,QAAQ,IAClB,cAAc,SACZ,OAAO,IAAI,QAAQ,MACnB,OAAO,IAAI,OAAO,QAAQ;AAAA,IAChC,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACA,QAAM,IAAI;AAAA,IACR,WACI,cAAc,QACZ,OAAO,IAAI,SAAS,MACpB,OAAO,IAAI,OAAO,SAAS,MAC7B,UAAU,SAAS;AAAA,IACvB,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAEA,SAAO,EAAE,GAAG,GAAG,UAAU;AAC3B;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@impulse-ui-native/popover",
3
- "version": "6.3.0",
3
+ "version": "7.0.0",
4
4
  "description": "Portal-rendered tooltips and compound anchored popovers for ImpulseUI Native.",
5
5
  "keywords": [
6
6
  "react-native",
@@ -27,10 +27,11 @@
27
27
  ],
28
28
  "sideEffects": false,
29
29
  "dependencies": {
30
- "@impulse-ui-native/core": "6.3.0",
31
- "@impulse-ui-native/primitives": "6.3.0",
32
- "@impulse-ui-native/portal": "6.3.0",
33
- "@impulse-ui-native/theme": "6.3.0"
30
+ "@impulse-ui-native/icon": "7.0.0",
31
+ "@impulse-ui-native/primitives": "7.0.0",
32
+ "@impulse-ui-native/theme": "7.0.0",
33
+ "@impulse-ui-native/core": "7.0.0",
34
+ "@impulse-ui-native/portal": "7.0.0"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@types/react": "~19.2.14",
@@ -41,8 +42,8 @@
41
42
  "react-native-safe-area-context": "~5.7.0",
42
43
  "typescript": "~6.0.3",
43
44
  "@impulse-ui-native/eslint-config": "1.0.0",
44
- "@impulse-ui-native/prettier-config": "1.0.0",
45
- "@impulse-ui-native/tsconfig": "1.0.0"
45
+ "@impulse-ui-native/tsconfig": "1.0.0",
46
+ "@impulse-ui-native/prettier-config": "1.0.0"
46
47
  },
47
48
  "peerDependencies": {
48
49
  "react": ">=18",