@fpkit/acss 6.2.0 → 6.3.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 (105) hide show
  1. package/libs/chunk-25KCUE3R.cjs +17 -0
  2. package/libs/chunk-25KCUE3R.cjs.map +1 -0
  3. package/libs/chunk-34NWHFHP.js +10 -0
  4. package/libs/chunk-34NWHFHP.js.map +1 -0
  5. package/libs/{chunk-SQ44OCJ2.js → chunk-6NMLU5FA.js} +2 -2
  6. package/libs/{chunk-GVVCXXKI.cjs → chunk-6YVR4TDM.cjs} +3 -3
  7. package/libs/chunk-DSQ2TUCR.js +7 -0
  8. package/libs/chunk-DSQ2TUCR.js.map +1 -0
  9. package/libs/{chunk-H6A2CUWA.js → chunk-VQTCTLFN.js} +2 -2
  10. package/libs/chunk-ZJ4RUKI2.cjs +14 -0
  11. package/libs/chunk-ZJ4RUKI2.cjs.map +1 -0
  12. package/libs/{chunk-H4JRUNKU.cjs → chunk-ZOPHCNFD.cjs} +3 -3
  13. package/libs/components/button.cjs +3 -3
  14. package/libs/components/button.d.cts +34 -1
  15. package/libs/components/button.d.ts +34 -1
  16. package/libs/components/button.js +1 -1
  17. package/libs/components/buttons/button.css +1 -1
  18. package/libs/components/buttons/button.css.map +1 -1
  19. package/libs/components/buttons/button.min.css +2 -2
  20. package/libs/components/buttons/icon-button.css +1 -0
  21. package/libs/components/buttons/icon-button.css.map +1 -0
  22. package/libs/components/buttons/icon-button.min.css +3 -0
  23. package/libs/components/dialog/dialog.cjs +4 -4
  24. package/libs/components/dialog/dialog.js +2 -2
  25. package/libs/components/icons/icon.d.cts +1 -1
  26. package/libs/components/icons/icon.d.ts +1 -1
  27. package/libs/components/link/link.css +1 -1
  28. package/libs/components/link/link.min.css +1 -1
  29. package/libs/components/modal.cjs +3 -3
  30. package/libs/components/modal.js +2 -2
  31. package/libs/components/popover/popover.cjs +3 -8
  32. package/libs/components/popover/popover.css +1 -0
  33. package/libs/components/popover/popover.css.map +1 -0
  34. package/libs/components/popover/popover.d.cts +54 -26
  35. package/libs/components/popover/popover.d.ts +54 -26
  36. package/libs/components/popover/popover.js +1 -2
  37. package/libs/components/popover/popover.min.css +3 -0
  38. package/libs/hooks.cjs +3 -6
  39. package/libs/hooks.cjs.map +1 -1
  40. package/libs/hooks.d.cts +30 -10
  41. package/libs/hooks.d.ts +30 -10
  42. package/libs/hooks.js +5 -1
  43. package/libs/hooks.js.map +1 -1
  44. package/libs/{icons-48788561.d.ts → icons-2c09535c.d.ts} +32 -32
  45. package/libs/icons.d.cts +1 -1
  46. package/libs/icons.d.ts +1 -1
  47. package/libs/index.cjs +35 -35
  48. package/libs/index.cjs.map +1 -1
  49. package/libs/index.css +1 -1
  50. package/libs/index.css.map +1 -1
  51. package/libs/index.d.cts +64 -5
  52. package/libs/index.d.ts +64 -5
  53. package/libs/index.js +9 -10
  54. package/libs/index.js.map +1 -1
  55. package/package.json +2 -2
  56. package/src/components/buttons/README.mdx +107 -11
  57. package/src/components/buttons/STYLES.mdx +182 -47
  58. package/src/components/buttons/button.scss +93 -16
  59. package/src/components/buttons/button.stories.tsx +149 -0
  60. package/src/components/buttons/button.test.tsx +12 -0
  61. package/src/components/buttons/button.tsx +50 -6
  62. package/src/components/buttons/icon-button.scss +45 -0
  63. package/src/components/buttons/icon-button.stories.tsx +200 -0
  64. package/src/components/buttons/icon-button.test.tsx +132 -0
  65. package/src/components/buttons/icon-button.tsx +72 -0
  66. package/src/components/form/select.tsx +55 -51
  67. package/src/components/link/link.scss +2 -2
  68. package/src/components/popover/README.mdx +478 -0
  69. package/src/components/popover/STYLES.mdx +389 -0
  70. package/src/components/popover/index.ts +3 -0
  71. package/src/components/popover/popover.scss +249 -0
  72. package/src/components/popover/popover.stories.tsx +315 -15
  73. package/src/components/popover/popover.test.tsx +249 -37
  74. package/src/components/popover/popover.tsx +165 -62
  75. package/src/hooks/popover/popover.tsx +26 -10
  76. package/src/hooks/popover/use-popover.tsx +30 -10
  77. package/src/hooks.ts +5 -0
  78. package/src/index.scss +1 -0
  79. package/src/index.ts +1 -0
  80. package/src/styles/buttons/button.css +78 -16
  81. package/src/styles/buttons/button.css.map +1 -1
  82. package/src/styles/buttons/icon-button.css +32 -0
  83. package/src/styles/buttons/icon-button.css.map +1 -0
  84. package/src/styles/index.css +268 -18
  85. package/src/styles/index.css.map +1 -1
  86. package/src/styles/link/link.css +2 -2
  87. package/src/styles/popover/popover.css +190 -0
  88. package/src/styles/popover/popover.css.map +1 -0
  89. package/src/types/popover.d.ts +64 -0
  90. package/libs/chunk-4I5MF54P.js +0 -8
  91. package/libs/chunk-4I5MF54P.js.map +0 -1
  92. package/libs/chunk-GCGKYLDG.js +0 -7
  93. package/libs/chunk-GCGKYLDG.js.map +0 -1
  94. package/libs/chunk-NZVSXRTB.cjs +0 -16
  95. package/libs/chunk-NZVSXRTB.cjs.map +0 -1
  96. package/libs/chunk-PDD4N5P5.cjs +0 -10
  97. package/libs/chunk-PDD4N5P5.cjs.map +0 -1
  98. package/libs/chunk-S7NIA6PI.cjs +0 -17
  99. package/libs/chunk-S7NIA6PI.cjs.map +0 -1
  100. package/libs/chunk-X2RDXWH5.js +0 -10
  101. package/libs/chunk-X2RDXWH5.js.map +0 -1
  102. /package/libs/{chunk-SQ44OCJ2.js.map → chunk-6NMLU5FA.js.map} +0 -0
  103. /package/libs/{chunk-GVVCXXKI.cjs.map → chunk-6YVR4TDM.cjs.map} +0 -0
  104. /package/libs/{chunk-H6A2CUWA.js.map → chunk-VQTCTLFN.js.map} +0 -0
  105. /package/libs/{chunk-H4JRUNKU.cjs.map → chunk-ZOPHCNFD.cjs.map} +0 -0
@@ -1,40 +1,68 @@
1
1
  import React from 'react';
2
2
 
3
3
  /**
4
- * Interface for props accepted by the Popover component
5
- *
6
- * @property {ReactNode} children - The content to show in the popover
7
- * @property {ReactNode} [content] - Optional alternative content for popover
4
+ * Props for the Popover component using native HTML popover API
8
5
  */
9
- type PopoverProps = {
6
+ interface PopoverProps {
7
+ /** Unique ID for popover (required for popovertarget attribute) */
8
+ id?: string;
9
+ /** Content to display inside the popover */
10
10
  children: React.ReactNode;
11
- popoverTrigger: React.ReactNode;
11
+ /** Custom trigger element (default: button with triggerLabel) */
12
+ trigger?: React.ReactNode;
13
+ /** Aria-label for default trigger button */
14
+ triggerLabel?: string;
15
+ /** Popover mode: "auto" (light dismiss) or "manual" (explicit close) */
16
+ mode?: 'auto' | 'manual';
17
+ /** Preferred placement position relative to trigger */
18
+ placement?: 'top' | 'bottom' | 'left' | 'right';
19
+ /** Controlled open state (optional) */
20
+ isOpen?: boolean;
21
+ /** Callback when popover toggles open/closed */
22
+ onToggle?: (open: boolean) => void;
23
+ /** Show close button (default: true for manual mode, false for auto) */
24
+ showCloseButton?: boolean;
25
+ /** Aria-label for close button */
26
+ closeButtonLabel?: string;
27
+ /** Show positioning arrow */
28
+ showArrow?: boolean;
29
+ /** Custom CSS class for popover element */
30
+ className?: string;
31
+ /** Inline CSS variables for theming */
12
32
  styles?: React.CSSProperties;
13
- };
14
- declare const defaultStyles: React.CSSProperties;
33
+ }
15
34
  /**
16
- * Popover component to display popover content.
17
- *
18
- * @param props - The props for the component
19
- * @param props.children - The content to show in the popover
20
- * @param props.popoverTrigger - The element that triggers the popover on hover
35
+ * Popover component using native HTML popover API
21
36
  *
22
- * @returns JSX.Element - The rendered JSX element for the Popover
23
- * @example - <Popover popoverTrigger={<button>Hover here</button>}>Popover content</Popover>
37
+ * Provides automatic top-layer rendering, light dismiss behavior,
38
+ * and accessibility features built into the platform.
24
39
  *
25
- * The component uses the usePopover hook to handle popover visibility and positioning.
40
+ * **Browser Requirements:**
41
+ * - Chrome 125+, Edge 125+, Safari 17.4+
42
+ * - Requires CSS anchor positioning support for optimal placement
26
43
  *
27
- * It renders the triggerElement, and conditionally renders the popover content
28
- * positioned absolutely when visible.
44
+ * @example
45
+ * ```tsx
46
+ * <Popover id="my-popover" triggerLabel="Open Menu">
47
+ * <p>Popover content here</p>
48
+ * </Popover>
49
+ * ```
29
50
  *
30
- * Inline styles handle visuals like background, border, padding, etc.
51
+ * @example
52
+ * ```tsx
53
+ * <Popover
54
+ * id="custom-popover"
55
+ * mode="manual"
56
+ * placement="top"
57
+ * trigger={<button>Custom Trigger</button>}
58
+ * >
59
+ * <h3>Popover Title</h3>
60
+ * <p>This requires explicit close action.</p>
61
+ * </Popover>
62
+ * ```
31
63
  *
32
- * Transforms and opacity animate the enter/exit transition of the popover.
64
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/popover
33
65
  */
34
- declare const Popover: {
35
- ({ children, popoverTrigger, styles, ...props }: PopoverProps): JSX.Element;
36
- displayName: string;
37
- styles: React.CSSProperties;
38
- };
66
+ declare const Popover: React.FC<PopoverProps>;
39
67
 
40
- export { Popover, PopoverProps, Popover as default, defaultStyles };
68
+ export { Popover, PopoverProps, Popover as default };
@@ -1,40 +1,68 @@
1
1
  import React from 'react';
2
2
 
3
3
  /**
4
- * Interface for props accepted by the Popover component
5
- *
6
- * @property {ReactNode} children - The content to show in the popover
7
- * @property {ReactNode} [content] - Optional alternative content for popover
4
+ * Props for the Popover component using native HTML popover API
8
5
  */
9
- type PopoverProps = {
6
+ interface PopoverProps {
7
+ /** Unique ID for popover (required for popovertarget attribute) */
8
+ id?: string;
9
+ /** Content to display inside the popover */
10
10
  children: React.ReactNode;
11
- popoverTrigger: React.ReactNode;
11
+ /** Custom trigger element (default: button with triggerLabel) */
12
+ trigger?: React.ReactNode;
13
+ /** Aria-label for default trigger button */
14
+ triggerLabel?: string;
15
+ /** Popover mode: "auto" (light dismiss) or "manual" (explicit close) */
16
+ mode?: 'auto' | 'manual';
17
+ /** Preferred placement position relative to trigger */
18
+ placement?: 'top' | 'bottom' | 'left' | 'right';
19
+ /** Controlled open state (optional) */
20
+ isOpen?: boolean;
21
+ /** Callback when popover toggles open/closed */
22
+ onToggle?: (open: boolean) => void;
23
+ /** Show close button (default: true for manual mode, false for auto) */
24
+ showCloseButton?: boolean;
25
+ /** Aria-label for close button */
26
+ closeButtonLabel?: string;
27
+ /** Show positioning arrow */
28
+ showArrow?: boolean;
29
+ /** Custom CSS class for popover element */
30
+ className?: string;
31
+ /** Inline CSS variables for theming */
12
32
  styles?: React.CSSProperties;
13
- };
14
- declare const defaultStyles: React.CSSProperties;
33
+ }
15
34
  /**
16
- * Popover component to display popover content.
17
- *
18
- * @param props - The props for the component
19
- * @param props.children - The content to show in the popover
20
- * @param props.popoverTrigger - The element that triggers the popover on hover
35
+ * Popover component using native HTML popover API
21
36
  *
22
- * @returns JSX.Element - The rendered JSX element for the Popover
23
- * @example - <Popover popoverTrigger={<button>Hover here</button>}>Popover content</Popover>
37
+ * Provides automatic top-layer rendering, light dismiss behavior,
38
+ * and accessibility features built into the platform.
24
39
  *
25
- * The component uses the usePopover hook to handle popover visibility and positioning.
40
+ * **Browser Requirements:**
41
+ * - Chrome 125+, Edge 125+, Safari 17.4+
42
+ * - Requires CSS anchor positioning support for optimal placement
26
43
  *
27
- * It renders the triggerElement, and conditionally renders the popover content
28
- * positioned absolutely when visible.
44
+ * @example
45
+ * ```tsx
46
+ * <Popover id="my-popover" triggerLabel="Open Menu">
47
+ * <p>Popover content here</p>
48
+ * </Popover>
49
+ * ```
29
50
  *
30
- * Inline styles handle visuals like background, border, padding, etc.
51
+ * @example
52
+ * ```tsx
53
+ * <Popover
54
+ * id="custom-popover"
55
+ * mode="manual"
56
+ * placement="top"
57
+ * trigger={<button>Custom Trigger</button>}
58
+ * >
59
+ * <h3>Popover Title</h3>
60
+ * <p>This requires explicit close action.</p>
61
+ * </Popover>
62
+ * ```
31
63
  *
32
- * Transforms and opacity animate the enter/exit transition of the popover.
64
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/popover
33
65
  */
34
- declare const Popover: {
35
- ({ children, popoverTrigger, styles, ...props }: PopoverProps): JSX.Element;
36
- displayName: string;
37
- styles: React.CSSProperties;
38
- };
66
+ declare const Popover: React.FC<PopoverProps>;
39
67
 
40
- export { Popover, PopoverProps, Popover as default, defaultStyles };
68
+ export { Popover, PopoverProps, Popover as default };
@@ -1,4 +1,3 @@
1
- export { b as Popover, c as default, a as defaultStyles } from '../../chunk-4I5MF54P.js';
2
- import '../../chunk-GCGKYLDG.js';
1
+ export { a as Popover, b as default } from '../../chunk-DSQ2TUCR.js';
3
2
  //# sourceMappingURL=out.js.map
4
3
  //# sourceMappingURL=popover.js.map
@@ -0,0 +1,3 @@
1
+ .fpkit-popover{--popover-bg: #ffffff;--popover-border: 0.0625rem solid #ccc;--popover-border-radius: 0.5rem;--popover-padding: 1rem;--popover-margin: 0.5rem;--popover-max-width: 20rem;--popover-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.1), 0 0.125rem 0.25rem rgba(0, 0, 0, 0.06);--popover-arrow-size: 0.5rem;--popover-arrow-color: var(--popover-bg);--popover-close-size: 1.5rem;--popover-close-color: #666;--popover-close-hover-color: #000;--popover-close-hover-bg: rgba(0, 0, 0, 0.05);background:var(--popover-bg);border:var(--popover-border);border-radius:var(--popover-border-radius);padding:var(--popover-padding);max-width:var(--popover-max-width);box-shadow:var(--popover-shadow);margin:0}.fpkit-popover[data-placement=top]{margin-bottom:var(--popover-margin)}.fpkit-popover[data-placement=bottom]{margin-top:var(--popover-margin)}.fpkit-popover[data-placement=left]{margin-right:var(--popover-margin)}.fpkit-popover[data-placement=right]{margin-left:var(--popover-margin)}.fpkit-popover:popover-open{opacity:1;transform:scale(1);transition:opacity .2s ease-out,transform .2s ease-out,overlay .2s ease-out allow-discrete,display .2s ease-out allow-discrete}@starting-style{.fpkit-popover:popover-open{opacity:0;transform:scale(0.95)}}.fpkit-popover:not(:popover-open){opacity:0;transform:scale(0.95);transition:opacity .2s ease-in,transform .2s ease-in,overlay .2s ease-in allow-discrete,display .2s ease-in allow-discrete}.fpkit-popover::backdrop{background:rgba(0,0,0,.3);-webkit-backdrop-filter:blur(0.125rem);backdrop-filter:blur(0.125rem);transition:background .2s ease-out,overlay .2s ease-out allow-discrete,display .2s ease-out allow-discrete,-webkit-backdrop-filter .2s ease-out;transition:background .2s ease-out,backdrop-filter .2s ease-out,overlay .2s ease-out allow-discrete,display .2s ease-out allow-discrete;transition:background .2s ease-out,backdrop-filter .2s ease-out,overlay .2s ease-out allow-discrete,display .2s ease-out allow-discrete,-webkit-backdrop-filter .2s ease-out}@starting-style{.fpkit-popover::backdrop{background:rgba(0,0,0,0);-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0)}}.fpkit-popover-content{position:relative;display:block}.fpkit-popover-close{position:absolute;top:.5rem;right:.5rem;width:var(--popover-close-size);height:var(--popover-close-size);display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0);border:none;border-radius:.25rem;color:var(--popover-close-color);font-size:1rem;line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease}.fpkit-popover-close:hover{background:var(--popover-close-hover-bg);color:var(--popover-close-hover-color)}.fpkit-popover-close:focus-visible{outline:.125rem solid currentColor;outline-offset:.125rem}.fpkit-popover-arrow{position:absolute;width:var(--popover-arrow-size);height:var(--popover-arrow-size);background:var(--popover-arrow-color);transform:rotate(45deg);border:inherit}.fpkit-popover-arrow[data-placement=top]{bottom:calc(var(--popover-arrow-size)/-2);left:50%;margin-left:calc(var(--popover-arrow-size)/-2);border-top:none;border-left:none}.fpkit-popover-arrow[data-placement=bottom]{top:calc(var(--popover-arrow-size)/-2);left:50%;margin-left:calc(var(--popover-arrow-size)/-2);border-bottom:none;border-right:none}.fpkit-popover-arrow[data-placement=left]{right:calc(var(--popover-arrow-size)/-2);top:50%;margin-top:calc(var(--popover-arrow-size)/-2);border-left:none;border-bottom:none}.fpkit-popover-arrow[data-placement=right]{left:calc(var(--popover-arrow-size)/-2);top:50%;margin-top:calc(var(--popover-arrow-size)/-2);border-right:none;border-top:none}.fpkit-popover-trigger{padding:.5rem 1rem;background:#06c;color:#fff;border:none;border-radius:.25rem;font-size:1rem;cursor:pointer;transition:background-color .15s ease,transform .1s ease}.fpkit-popover-trigger:hover{background:#0052a3}.fpkit-popover-trigger:active{transform:scale(0.98)}.fpkit-popover-trigger:focus-visible{outline:.125rem solid currentColor;outline-offset:.125rem}@supports(anchor-name: --trigger){.fpkit-popover-trigger{anchor-name:--trigger}.fpkit-popover{position-anchor:--trigger}.fpkit-popover[data-placement=top]{bottom:anchor(top);left:anchor(center);translate:-50% 0}.fpkit-popover[data-placement=bottom]{top:anchor(bottom);left:anchor(center);translate:-50% 0}.fpkit-popover[data-placement=left]{right:anchor(left);top:anchor(center);translate:0 -50%}.fpkit-popover[data-placement=right]{left:anchor(right);top:anchor(center);translate:0 -50%}}
2
+
3
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BvcG92ZXIvcG9wb3Zlci5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLGVBRUUscUJBQUEsQ0FDQSxzQ0FBQSxDQUNBLCtCQUFBLENBR0EsdUJBQUEsQ0FDQSx3QkFBQSxDQUNBLDBCQUFBLENBR0EsNkZBQUEsQ0FJQSw0QkFBQSxDQUNBLHdDQUFBLENBR0EsNEJBQUEsQ0FDQSwyQkFBQSxDQUNBLGlDQUFBLENBQ0EsNkNBQUEsQ0FHQSw0QkFBQSxDQUNBLDRCQUFBLENBQ0EsMENBQUEsQ0FDQSw4QkFBQSxDQUNBLGtDQUFBLENBQ0EsZ0NBQUEsQ0FHQSxRQUFBLENBR0EsbUNBQ0UsbUNBQUEsQ0FHRixzQ0FDRSxnQ0FBQSxDQUdGLG9DQUNFLGtDQUFBLENBR0YscUNBQ0UsaUNBQUEsQ0FLSiw0QkFDRSxTQUFBLENBQ0Esa0JBQUEsQ0FDQSw4SEFDRSxDQUtGLGdCQVRGLDRCQVVJLFNBQUEsQ0FDQSxxQkFBQSxDQUFBLENBS0osa0NBQ0UsU0FBQSxDQUNBLHFCQUFBLENBQ0EsMEhBQ0UsQ0FPSix5QkFDRSx5QkFBQSxDQUNBLHNDQUFBLENBQUEsOEJBQUEsQ0FDQSwrSUFDRSxDQURGLHVJQUNFLENBREYsNEtBQ0UsQ0FLRixnQkFURix5QkFVSSx3QkFBQSxDQUNBLCtCQUFBLENBQUEsdUJBQUEsQ0FBQSxDQUtKLHVCQUNFLGlCQUFBLENBQ0EsYUFBQSxDQUlGLHFCQUNFLGlCQUFBLENBQ0EsU0FBQSxDQUNBLFdBQUEsQ0FDQSwrQkFBQSxDQUNBLGdDQUFBLENBQ0EsWUFBQSxDQUNBLGtCQUFBLENBQ0Esc0JBQUEsQ0FDQSx3QkFBQSxDQUNBLFdBQUEsQ0FDQSxvQkFBQSxDQUNBLGdDQUFBLENBQ0EsY0FBQSxDQUNBLGFBQUEsQ0FDQSxjQUFBLENBQ0EscURBQ0UsQ0FHRiwyQkFDRSx3Q0FBQSxDQUNBLHNDQUFBLENBR0YsbUNBQ0Usa0NBQUEsQ0FDQSxzQkFBQSxDQUtKLHFCQUNFLGlCQUFBLENBQ0EsK0JBQUEsQ0FDQSxnQ0FBQSxDQUNBLHFDQUFBLENBQ0EsdUJBQUEsQ0FDQSxjQUFBLENBR0EseUNBQ0UseUNBQUEsQ0FDQSxRQUFBLENBQ0EsOENBQUEsQ0FDQSxlQUFBLENBQ0EsZ0JBQUEsQ0FJRiw0Q0FDRSxzQ0FBQSxDQUNBLFFBQUEsQ0FDQSw4Q0FBQSxDQUNBLGtCQUFBLENBQ0EsaUJBQUEsQ0FJRiwwQ0FDRSx3Q0FBQSxDQUNBLE9BQUEsQ0FDQSw2Q0FBQSxDQUNBLGdCQUFBLENBQ0Esa0JBQUEsQ0FJRiwyQ0FDRSx1Q0FBQSxDQUNBLE9BQUEsQ0FDQSw2Q0FBQSxDQUNBLGlCQUFBLENBQ0EsZUFBQSxDQUtKLHVCQUNFLGtCQUFBLENBQ0EsZUFBQSxDQUNBLFVBQUEsQ0FDQSxXQUFBLENBQ0Esb0JBQUEsQ0FDQSxjQUFBLENBQ0EsY0FBQSxDQUNBLHdEQUNFLENBR0YsNkJBQ0Usa0JBQUEsQ0FHRiw4QkFDRSxxQkFBQSxDQUdGLHFDQUNFLGtDQUFBLENBQ0Esc0JBQUEsQ0FNSixrQ0FDRSx1QkFDRSxxQkFBQSxDQUdGLGVBQ0UseUJBQUEsQ0FFQSxtQ0FDRSxrQkFBQSxDQUNBLG1CQUFBLENBQ0EsZ0JBQUEsQ0FHRixzQ0FDRSxrQkFBQSxDQUNBLG1CQUFBLENBQ0EsZ0JBQUEsQ0FHRixvQ0FDRSxrQkFBQSxDQUNBLGtCQUFBLENBQ0EsZ0JBQUEsQ0FHRixxQ0FDRSxrQkFBQSxDQUNBLGtCQUFBLENBQ0EsZ0JBQUEsQ0FBQSIsImZpbGUiOiJwb3BvdmVyLm1pbi5jc3MifQ== */
package/libs/hooks.cjs CHANGED
@@ -1,24 +1,21 @@
1
1
  'use strict';
2
2
 
3
3
  var chunk3D6WUYSL_cjs = require('./chunk-3D6WUYSL.cjs');
4
- var chunkPDD4N5P5_cjs = require('./chunk-PDD4N5P5.cjs');
5
4
  var chunkTON2YGMD_cjs = require('./chunk-TON2YGMD.cjs');
6
5
  require('./chunk-LQPWXSCK.cjs');
7
6
  require('./chunk-66C2J4IX.cjs');
7
+ var react = require('react');
8
8
 
9
-
9
+ var L=(o,a,n=1)=>{let[c,r]=react.useState(!1),[u,f]=react.useState({top:0,left:0});return {isVisible:c,popoverPosition:u,handlePointerEvent:d=>{d?.stopPropagation();let e=o.current?.offsetHeight||40;if(o.current){let s=o.current.getBoundingClientRect(),{scrollY:t,scrollX:m,innerHeight:i}=window,l=s.bottom+t+n,v=s.left+m,b=l+e,P=a.current?.offsetHeight??e,h=b>t+i?Math.max(t+i-P-e-n,t)-e-n:l;f({top:h,left:v}),r(!0);}},handlePointerLeave:()=>{r(!1);}}};
10
10
 
11
11
  Object.defineProperty(exports, 'useBreadcrumbSegments', {
12
12
  enumerable: true,
13
13
  get: function () { return chunk3D6WUYSL_cjs.a; }
14
14
  });
15
- Object.defineProperty(exports, 'usePopover', {
16
- enumerable: true,
17
- get: function () { return chunkPDD4N5P5_cjs.a; }
18
- });
19
15
  Object.defineProperty(exports, 'useDisabledState', {
20
16
  enumerable: true,
21
17
  get: function () { return chunkTON2YGMD_cjs.a; }
22
18
  });
19
+ exports.usePopover = L;
23
20
  //# sourceMappingURL=out.js.map
24
21
  //# sourceMappingURL=hooks.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":""}
1
+ {"version":3,"sources":["../src/hooks/popover/use-popover.tsx"],"names":["useState","usePopover","elementRef","hoverRef","spacing","isVisible","setIsVisible","popoverPosition","setPopoverPosition","event","height","rect","scrollY","scrollX","innerHeight","popoverTop","popoverLeft","popoverBottom","popoverHeight","adjustedTop"],"mappings":"4IAAA,OAAS,YAAAA,MAAgB,QA+ClB,IAAMC,EAAa,CACxBC,EACAC,EACAC,EAAU,IACP,CACH,GAAM,CAACC,EAAWC,CAAY,EAAIN,EAAS,EAAK,EAC1C,CAACO,EAAiBC,CAAkB,EAAIR,EAAmB,CAC/D,IAAK,EACL,KAAM,CACR,CAAC,EAsCD,MAAO,CACL,UAAAK,EACA,gBAAAE,EACA,mBAtCAE,GACG,CACHA,GAAO,gBAAgB,EACvB,IAAMC,EAASR,EAAW,SAAS,cAAgB,GACnD,GAAIA,EAAW,QAAS,CACtB,IAAMS,EAAOT,EAAW,QAAQ,sBAAsB,EAChD,CAAE,QAAAU,EAAS,QAAAC,EAAS,YAAAC,CAAY,EAAI,OAEpCC,EAAaJ,EAAK,OAASC,EAAUR,EACrCY,EAAcL,EAAK,KAAOE,EAC1BI,EAAgBF,EAAaL,EAC7BQ,EAAgBf,EAAS,SAAS,cAAgBO,EAElDS,EACJF,EAAgBL,EAAUE,EACtB,KAAK,IACHF,EAAUE,EAAcI,EAAgBR,EAASN,EACjDQ,CACF,EACAF,EACAN,EACAW,EAENP,EAAmB,CACjB,IAAKW,EACL,KAAMH,CACR,CAAC,EACDV,EAAa,EAAI,CACnB,CACF,EAUE,mBARyB,IAAM,CAC/BA,EAAa,EAAK,CACpB,CAOA,CACF","sourcesContent":["import { useState } from 'react'\n\ntype Position = {\n /**\n * @description This is the top position of the popover.\n * @default 0\n */\n top: number\n /**\n * @description This is the left position of the popover.\n * @default 0\n */\n left: number\n}\n\n/**\n * @deprecated This hook is deprecated and will be removed in v3.0.0.\n * Use the native Popover component instead, which provides better accessibility,\n * automatic layer management, and platform-native behavior.\n *\n * @see {@link ../components/popover/popover.tsx} New Popover Component\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/popover} HTML Popover API\n *\n * @description Legacy hook for custom popover positioning with pointer events.\n * Manually calculates popover position and handles show/hide logic.\n *\n * @param elementRef - Ref of the trigger element\n * @param hoverRef - Ref of the popover element\n * @param spacing - Spacing between trigger and popover (in pixels)\n *\n * @example\n * ```tsx\n * // ❌ Old approach (deprecated)\n * const { isVisible, popoverPosition, handlePointerEvent, handlePointerLeave } =\n * usePopover(hoverRef, popOverRef, 1);\n *\n * // ✅ New approach (recommended)\n * import { Popover } from '@fpkit/acss';\n * <Popover id=\"my-popover\" triggerLabel=\"Open\">Content</Popover>\n * ```\n *\n * @returns Hook state and handlers\n * @returns isVisible - Boolean indicating popover visibility\n * @returns popoverPosition - Position object with top/left coordinates\n * @returns handlePointerEvent - Function to show popover on pointer enter\n * @returns handlePointerLeave - Function to hide popover on pointer leave\n */\nexport const usePopover = (\n elementRef: React.RefObject<HTMLElement | HTMLDivElement>,\n hoverRef: React.RefObject<HTMLElement | HTMLDivElement>,\n spacing = 1,\n) => {\n const [isVisible, setIsVisible] = useState(false)\n const [popoverPosition, setPopoverPosition] = useState<Position>({\n top: 0,\n left: 0,\n })\n\n const handlePointerEvent = (\n event: React.MouseEvent<HTMLButtonElement | HTMLElement>,\n ) => {\n event?.stopPropagation()\n const height = elementRef.current?.offsetHeight || 40\n if (elementRef.current) {\n const rect = elementRef.current.getBoundingClientRect()\n const { scrollY, scrollX, innerHeight } = window\n\n const popoverTop = rect.bottom + scrollY + spacing\n const popoverLeft = rect.left + scrollX\n const popoverBottom = popoverTop + height // Adjust the popover height as needed\n const popoverHeight = hoverRef.current?.offsetHeight ?? height // Adjust the popover height as needed\n\n const adjustedTop =\n popoverBottom > scrollY + innerHeight\n ? Math.max(\n scrollY + innerHeight - popoverHeight - height - spacing,\n scrollY,\n ) -\n height -\n spacing\n : popoverTop\n\n setPopoverPosition({\n top: adjustedTop,\n left: popoverLeft,\n })\n setIsVisible(true)\n }\n }\n\n const handlePointerLeave = () => {\n setIsVisible(false)\n }\n\n return {\n isVisible,\n popoverPosition,\n handlePointerEvent,\n handlePointerLeave,\n }\n}\n\nexport default usePopover\n"]}
package/libs/hooks.d.cts CHANGED
@@ -16,16 +16,36 @@ type Position = {
16
16
  left: number;
17
17
  };
18
18
  /**
19
- * @description This is the hook to show/hide the popover.
20
- * @param elementRef - This is the ref of the element on which the popover should be shown.
21
- * @param hoverRef - This is the ref of the element on which the popover should be shown.
22
- * @param spacing - This is the spacing between the element and the popover.
23
- * @example - const { isVisible, popoverPosition, handlePointerEvent, handlePointerLeave } = usePopover(hoverRef, popOverRef, 1)
24
- * @returns - This is the object of the following properties.
25
- * @returns - isVisible - This is the boolean value to show/hide the popover.
26
- * @returns - popoverPosition - This is the position of the popover.
27
- * @returns - handlePointerEvent - This is the function to handle the pointer event.
28
- * @returns - handlePointerLeave - This is the function to handle the pointer leave event.
19
+ * @deprecated This hook is deprecated and will be removed in v3.0.0.
20
+ * Use the native Popover component instead, which provides better accessibility,
21
+ * automatic layer management, and platform-native behavior.
22
+ *
23
+ * @see {@link ../components/popover/popover.tsx} New Popover Component
24
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/popover} HTML Popover API
25
+ *
26
+ * @description Legacy hook for custom popover positioning with pointer events.
27
+ * Manually calculates popover position and handles show/hide logic.
28
+ *
29
+ * @param elementRef - Ref of the trigger element
30
+ * @param hoverRef - Ref of the popover element
31
+ * @param spacing - Spacing between trigger and popover (in pixels)
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * // ❌ Old approach (deprecated)
36
+ * const { isVisible, popoverPosition, handlePointerEvent, handlePointerLeave } =
37
+ * usePopover(hoverRef, popOverRef, 1);
38
+ *
39
+ * // ✅ New approach (recommended)
40
+ * import { Popover } from '@fpkit/acss';
41
+ * <Popover id="my-popover" triggerLabel="Open">Content</Popover>
42
+ * ```
43
+ *
44
+ * @returns Hook state and handlers
45
+ * @returns isVisible - Boolean indicating popover visibility
46
+ * @returns popoverPosition - Position object with top/left coordinates
47
+ * @returns handlePointerEvent - Function to show popover on pointer enter
48
+ * @returns handlePointerLeave - Function to hide popover on pointer leave
29
49
  */
30
50
  declare const usePopover: (elementRef: React.RefObject<HTMLElement | HTMLDivElement>, hoverRef: React.RefObject<HTMLElement | HTMLDivElement>, spacing?: number) => {
31
51
  isVisible: boolean;
package/libs/hooks.d.ts CHANGED
@@ -16,16 +16,36 @@ type Position = {
16
16
  left: number;
17
17
  };
18
18
  /**
19
- * @description This is the hook to show/hide the popover.
20
- * @param elementRef - This is the ref of the element on which the popover should be shown.
21
- * @param hoverRef - This is the ref of the element on which the popover should be shown.
22
- * @param spacing - This is the spacing between the element and the popover.
23
- * @example - const { isVisible, popoverPosition, handlePointerEvent, handlePointerLeave } = usePopover(hoverRef, popOverRef, 1)
24
- * @returns - This is the object of the following properties.
25
- * @returns - isVisible - This is the boolean value to show/hide the popover.
26
- * @returns - popoverPosition - This is the position of the popover.
27
- * @returns - handlePointerEvent - This is the function to handle the pointer event.
28
- * @returns - handlePointerLeave - This is the function to handle the pointer leave event.
19
+ * @deprecated This hook is deprecated and will be removed in v3.0.0.
20
+ * Use the native Popover component instead, which provides better accessibility,
21
+ * automatic layer management, and platform-native behavior.
22
+ *
23
+ * @see {@link ../components/popover/popover.tsx} New Popover Component
24
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/popover} HTML Popover API
25
+ *
26
+ * @description Legacy hook for custom popover positioning with pointer events.
27
+ * Manually calculates popover position and handles show/hide logic.
28
+ *
29
+ * @param elementRef - Ref of the trigger element
30
+ * @param hoverRef - Ref of the popover element
31
+ * @param spacing - Spacing between trigger and popover (in pixels)
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * // ❌ Old approach (deprecated)
36
+ * const { isVisible, popoverPosition, handlePointerEvent, handlePointerLeave } =
37
+ * usePopover(hoverRef, popOverRef, 1);
38
+ *
39
+ * // ✅ New approach (recommended)
40
+ * import { Popover } from '@fpkit/acss';
41
+ * <Popover id="my-popover" triggerLabel="Open">Content</Popover>
42
+ * ```
43
+ *
44
+ * @returns Hook state and handlers
45
+ * @returns isVisible - Boolean indicating popover visibility
46
+ * @returns popoverPosition - Position object with top/left coordinates
47
+ * @returns handlePointerEvent - Function to show popover on pointer enter
48
+ * @returns handlePointerLeave - Function to hide popover on pointer leave
29
49
  */
30
50
  declare const usePopover: (elementRef: React.RefObject<HTMLElement | HTMLDivElement>, hoverRef: React.RefObject<HTMLElement | HTMLDivElement>, spacing?: number) => {
31
51
  isVisible: boolean;
package/libs/hooks.js CHANGED
@@ -1,7 +1,11 @@
1
1
  export { a as useBreadcrumbSegments } from './chunk-2ZJV6KQ3.js';
2
- export { a as usePopover } from './chunk-GCGKYLDG.js';
3
2
  export { a as useDisabledState } from './chunk-75QHTLFO.js';
4
3
  import './chunk-M5ES7OWP.js';
5
4
  import './chunk-4KJP3L35.js';
5
+ import { useState } from 'react';
6
+
7
+ var L=(o,a,n=1)=>{let[c,r]=useState(!1),[u,f]=useState({top:0,left:0});return {isVisible:c,popoverPosition:u,handlePointerEvent:d=>{d?.stopPropagation();let e=o.current?.offsetHeight||40;if(o.current){let s=o.current.getBoundingClientRect(),{scrollY:t,scrollX:m,innerHeight:i}=window,l=s.bottom+t+n,v=s.left+m,b=l+e,P=a.current?.offsetHeight??e,h=b>t+i?Math.max(t+i-P-e-n,t)-e-n:l;f({top:h,left:v}),r(!0);}},handlePointerLeave:()=>{r(!1);}}};
8
+
9
+ export { L as usePopover };
6
10
  //# sourceMappingURL=out.js.map
7
11
  //# sourceMappingURL=hooks.js.map
package/libs/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":""}
1
+ {"version":3,"sources":["../src/hooks/popover/use-popover.tsx"],"names":["useState","usePopover","elementRef","hoverRef","spacing","isVisible","setIsVisible","popoverPosition","setPopoverPosition","event","height","rect","scrollY","scrollX","innerHeight","popoverTop","popoverLeft","popoverBottom","popoverHeight","adjustedTop"],"mappings":"wIAAA,OAAS,YAAAA,MAAgB,QA+ClB,IAAMC,EAAa,CACxBC,EACAC,EACAC,EAAU,IACP,CACH,GAAM,CAACC,EAAWC,CAAY,EAAIN,EAAS,EAAK,EAC1C,CAACO,EAAiBC,CAAkB,EAAIR,EAAmB,CAC/D,IAAK,EACL,KAAM,CACR,CAAC,EAsCD,MAAO,CACL,UAAAK,EACA,gBAAAE,EACA,mBAtCAE,GACG,CACHA,GAAO,gBAAgB,EACvB,IAAMC,EAASR,EAAW,SAAS,cAAgB,GACnD,GAAIA,EAAW,QAAS,CACtB,IAAMS,EAAOT,EAAW,QAAQ,sBAAsB,EAChD,CAAE,QAAAU,EAAS,QAAAC,EAAS,YAAAC,CAAY,EAAI,OAEpCC,EAAaJ,EAAK,OAASC,EAAUR,EACrCY,EAAcL,EAAK,KAAOE,EAC1BI,EAAgBF,EAAaL,EAC7BQ,EAAgBf,EAAS,SAAS,cAAgBO,EAElDS,EACJF,EAAgBL,EAAUE,EACtB,KAAK,IACHF,EAAUE,EAAcI,EAAgBR,EAASN,EACjDQ,CACF,EACAF,EACAN,EACAW,EAENP,EAAmB,CACjB,IAAKW,EACL,KAAMH,CACR,CAAC,EACDV,EAAa,EAAI,CACnB,CACF,EAUE,mBARyB,IAAM,CAC/BA,EAAa,EAAK,CACpB,CAOA,CACF","sourcesContent":["import { useState } from 'react'\n\ntype Position = {\n /**\n * @description This is the top position of the popover.\n * @default 0\n */\n top: number\n /**\n * @description This is the left position of the popover.\n * @default 0\n */\n left: number\n}\n\n/**\n * @deprecated This hook is deprecated and will be removed in v3.0.0.\n * Use the native Popover component instead, which provides better accessibility,\n * automatic layer management, and platform-native behavior.\n *\n * @see {@link ../components/popover/popover.tsx} New Popover Component\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/popover} HTML Popover API\n *\n * @description Legacy hook for custom popover positioning with pointer events.\n * Manually calculates popover position and handles show/hide logic.\n *\n * @param elementRef - Ref of the trigger element\n * @param hoverRef - Ref of the popover element\n * @param spacing - Spacing between trigger and popover (in pixels)\n *\n * @example\n * ```tsx\n * // ❌ Old approach (deprecated)\n * const { isVisible, popoverPosition, handlePointerEvent, handlePointerLeave } =\n * usePopover(hoverRef, popOverRef, 1);\n *\n * // ✅ New approach (recommended)\n * import { Popover } from '@fpkit/acss';\n * <Popover id=\"my-popover\" triggerLabel=\"Open\">Content</Popover>\n * ```\n *\n * @returns Hook state and handlers\n * @returns isVisible - Boolean indicating popover visibility\n * @returns popoverPosition - Position object with top/left coordinates\n * @returns handlePointerEvent - Function to show popover on pointer enter\n * @returns handlePointerLeave - Function to hide popover on pointer leave\n */\nexport const usePopover = (\n elementRef: React.RefObject<HTMLElement | HTMLDivElement>,\n hoverRef: React.RefObject<HTMLElement | HTMLDivElement>,\n spacing = 1,\n) => {\n const [isVisible, setIsVisible] = useState(false)\n const [popoverPosition, setPopoverPosition] = useState<Position>({\n top: 0,\n left: 0,\n })\n\n const handlePointerEvent = (\n event: React.MouseEvent<HTMLButtonElement | HTMLElement>,\n ) => {\n event?.stopPropagation()\n const height = elementRef.current?.offsetHeight || 40\n if (elementRef.current) {\n const rect = elementRef.current.getBoundingClientRect()\n const { scrollY, scrollX, innerHeight } = window\n\n const popoverTop = rect.bottom + scrollY + spacing\n const popoverLeft = rect.left + scrollX\n const popoverBottom = popoverTop + height // Adjust the popover height as needed\n const popoverHeight = hoverRef.current?.offsetHeight ?? height // Adjust the popover height as needed\n\n const adjustedTop =\n popoverBottom > scrollY + innerHeight\n ? Math.max(\n scrollY + innerHeight - popoverHeight - height - spacing,\n scrollY,\n ) -\n height -\n spacing\n : popoverTop\n\n setPopoverPosition({\n top: adjustedTop,\n left: popoverLeft,\n })\n setIsVisible(true)\n }\n }\n\n const handlePointerLeave = () => {\n setIsVisible(false)\n }\n\n return {\n isVisible,\n popoverPosition,\n handlePointerEvent,\n handlePointerLeave,\n }\n}\n\nexport default usePopover\n"]}