@bi-digital/react 0.7.0 → 0.8.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 (144) hide show
  1. package/dist/{alert-footer-BpkOdCCs.d.mts → alert-footer-BFTlBQCl.d.mts} +72 -72
  2. package/dist/components/alert/alert-footer.d.mts +9 -9
  3. package/dist/components/alert/alert.d.mts +9 -9
  4. package/dist/components/alert/index.d.mts +9 -9
  5. package/dist/components/avatar/avatar.d.mts +9 -9
  6. package/dist/components/avatar/index.d.mts +9 -9
  7. package/dist/components/badge/badge.d.mts +9 -9
  8. package/dist/components/badge/index.d.mts +9 -9
  9. package/dist/components/button/button.d.mts +9 -9
  10. package/dist/components/button/index.d.mts +9 -9
  11. package/dist/components/card/card-action.d.mts +9 -9
  12. package/dist/components/card/card-actions.d.mts +9 -9
  13. package/dist/components/card/card-content.d.mts +9 -9
  14. package/dist/components/card/card-date.d.mts +9 -9
  15. package/dist/components/card/card-header.d.mts +9 -9
  16. package/dist/components/card/card-media.d.mts +9 -9
  17. package/dist/components/card/card.d.mts +9 -9
  18. package/dist/components/card/index.d.mts +9 -9
  19. package/dist/components/checkbox/checkbox-subsection.d.mts +9 -9
  20. package/dist/components/checkbox/checkbox.d.mts +9 -9
  21. package/dist/components/checkbox/index.d.mts +9 -9
  22. package/dist/components/chip/chip.d.mts +9 -9
  23. package/dist/components/chip/index.d.mts +9 -9
  24. package/dist/components/details/details-content.d.mts +9 -9
  25. package/dist/components/details/details-summary.d.mts +9 -9
  26. package/dist/components/details/details.d.mts +9 -9
  27. package/dist/components/details/index.d.mts +9 -9
  28. package/dist/components/dialog/dialog-close-button.d.mts +9 -9
  29. package/dist/components/dialog/dialog-content.d.mts +9 -9
  30. package/dist/components/dialog/dialog-footer.d.mts +9 -9
  31. package/dist/components/dialog/dialog-header.d.mts +9 -9
  32. package/dist/components/dialog/dialog-trigger-context.d.mts +1 -1
  33. package/dist/components/dialog/dialog-trigger.d.mts +9 -9
  34. package/dist/components/dialog/dialog.d.mts +9 -9
  35. package/dist/components/dialog/index.d.mts +9 -9
  36. package/dist/components/drawer/drawer-close-button.d.mts +9 -9
  37. package/dist/components/drawer/drawer-content.d.mts +9 -9
  38. package/dist/components/drawer/drawer-footer.d.mts +9 -9
  39. package/dist/components/drawer/drawer-header.d.mts +9 -9
  40. package/dist/components/drawer/drawer-trigger-context.d.mts +1 -1
  41. package/dist/components/drawer/drawer-trigger.d.mts +9 -9
  42. package/dist/components/drawer/drawer.d.mts +9 -9
  43. package/dist/components/drawer/index.d.mts +9 -9
  44. package/dist/components/dropdown/dropdown-button.d.mts +9 -9
  45. package/dist/components/dropdown/dropdown-item.d.mts +1 -1
  46. package/dist/components/dropdown/dropdown-list.d.mts +1 -1
  47. package/dist/components/dropdown/dropdown-trigger-context.d.mts +9 -9
  48. package/dist/components/dropdown/dropdown-trigger-context.mjs +2 -2
  49. package/dist/components/dropdown/dropdown-trigger.d.mts +9 -9
  50. package/dist/components/dropdown/dropdown-trigger.mjs +2 -2
  51. package/dist/components/dropdown/dropdown.d.mts +9 -9
  52. package/dist/components/dropdown/dropdown.mjs +3 -3
  53. package/dist/components/dropdown/index.d.mts +9 -9
  54. package/dist/components/dropdown/index.mjs +3 -3
  55. package/dist/components/field/field-affix.d.mts +9 -9
  56. package/dist/components/field/field-description.d.mts +9 -9
  57. package/dist/components/field/field.d.mts +9 -9
  58. package/dist/components/field/index.d.mts +9 -9
  59. package/dist/components/fieldset/fieldset-description.d.mts +9 -9
  60. package/dist/components/fieldset/fieldset-legend.d.mts +9 -9
  61. package/dist/components/fieldset/fieldset.d.mts +9 -9
  62. package/dist/components/fieldset/index.d.mts +9 -9
  63. package/dist/components/filter-group/filter-group.d.mts +9 -9
  64. package/dist/components/filter-group/index.d.mts +9 -9
  65. package/dist/components/footer/footer-links.d.mts +1 -1
  66. package/dist/components/footer/footer.d.mts +9 -9
  67. package/dist/components/footer/index.d.mts +9 -9
  68. package/dist/components/index.d.mts +9 -9
  69. package/dist/components/index.mjs +3 -3
  70. package/dist/components/input/index.d.mts +9 -9
  71. package/dist/components/input/input.d.mts +9 -9
  72. package/dist/components/label/index.d.mts +9 -9
  73. package/dist/components/label/label.d.mts +9 -9
  74. package/dist/components/link/index.d.mts +9 -9
  75. package/dist/components/link/link.d.mts +9 -9
  76. package/dist/components/logo/index.d.mts +9 -9
  77. package/dist/components/logo/logo.d.mts +9 -9
  78. package/dist/components/navbar/index.d.mts +9 -9
  79. package/dist/components/navbar/navbar.d.mts +9 -9
  80. package/dist/components/navbar/sub-navbar.d.mts +9 -9
  81. package/dist/components/pagination/index.d.mts +9 -9
  82. package/dist/components/pagination/pagination-button.d.mts +9 -9
  83. package/dist/components/pagination/pagination-item.d.mts +1 -1
  84. package/dist/components/pagination/pagination.d.mts +9 -9
  85. package/dist/components/popover/index.d.mts +9 -9
  86. package/dist/components/popover/index.mjs +2 -2
  87. package/dist/components/popover/popover-trigger-context.d.mts +1 -1
  88. package/dist/components/popover/popover-trigger.d.mts +9 -9
  89. package/dist/components/popover/popover.d.mts +9 -9
  90. package/dist/components/popover/popover.mjs +2 -2
  91. package/dist/components/radio/index.d.mts +9 -9
  92. package/dist/components/radio/radio.d.mts +9 -9
  93. package/dist/components/search/index.d.mts +9 -9
  94. package/dist/components/search/search.d.mts +9 -9
  95. package/dist/components/select/index.d.mts +9 -9
  96. package/dist/components/select/select-optgroup.d.mts +9 -9
  97. package/dist/components/select/select-option.d.mts +9 -9
  98. package/dist/components/select/select.d.mts +9 -9
  99. package/dist/components/selectfield/index.d.mts +9 -9
  100. package/dist/components/selectfield/selectfield.d.mts +9 -9
  101. package/dist/components/skip-link/index.d.mts +9 -9
  102. package/dist/components/skip-link/skip-link.d.mts +9 -9
  103. package/dist/components/spinner/index.d.mts +9 -9
  104. package/dist/components/spinner/spinner.d.mts +9 -9
  105. package/dist/components/sticky-header/index.d.mts +1 -1
  106. package/dist/components/sticky-header/sticky-header.d.mts +1 -1
  107. package/dist/components/switch/index.d.mts +9 -9
  108. package/dist/components/switch/switch.d.mts +9 -9
  109. package/dist/components/tabs/index.d.mts +9 -9
  110. package/dist/components/tabs/tab.d.mts +9 -9
  111. package/dist/components/tabs/tabs-list.d.mts +9 -9
  112. package/dist/components/tabs/tabs-panel.d.mts +9 -9
  113. package/dist/components/tabs/tabs.d.mts +9 -9
  114. package/dist/components/textarea/index.d.mts +9 -9
  115. package/dist/components/textarea/textarea.d.mts +9 -9
  116. package/dist/components/textfield/index.d.mts +9 -9
  117. package/dist/components/textfield/textfield.d.mts +9 -9
  118. package/dist/components/validation-message/index.d.mts +9 -9
  119. package/dist/components/validation-message/validation-message.d.mts +9 -9
  120. package/dist/{dialog-trigger-context-DTtpry85.d.mts → dialog-trigger-context-BP2Q3KEA.d.mts} +3 -3
  121. package/dist/{drawer-trigger-context-B9FQbPQM.d.mts → drawer-trigger-context-BuP2a1-8.d.mts} +3 -3
  122. package/dist/{dropdown-Cpj49-R5.mjs → dropdown-BZZfp-oa.mjs} +2 -2
  123. package/dist/{dropdown-Cpj49-R5.mjs.map → dropdown-BZZfp-oa.mjs.map} +1 -1
  124. package/dist/{dropdown-item-DXKNHOz3.d.mts → dropdown-item-B9Toa4yI.d.mts} +3 -3
  125. package/dist/{dropdown-list-C0ayMUa0.d.mts → dropdown-list-Ce8CUTGr.d.mts} +3 -3
  126. package/dist/{footer-links-DHz69lVl.d.mts → footer-links-B8XVWRnL.d.mts} +3 -3
  127. package/dist/main.d.mts +9 -9
  128. package/dist/main.mjs +3 -3
  129. package/dist/{pagination-item-Cvl83z9g.d.mts → pagination-item-DBpTl8iP.d.mts} +3 -3
  130. package/dist/{popover-BJuqdEHo.mjs → popover-B8P0dE2-.mjs} +6 -3
  131. package/dist/popover-B8P0dE2-.mjs.map +1 -0
  132. package/dist/{popover-Dqhgmd9j.mjs → popover-CGqBsAam.mjs} +7 -4
  133. package/dist/popover-CGqBsAam.mjs.map +1 -0
  134. package/dist/{popover-trigger-context-BfMeXz8y.d.mts → popover-trigger-context-HGF38PbW.d.mts} +3 -3
  135. package/dist/{sticky-header-BRlM-wit.d.mts → sticky-header-CQ10VPji.d.mts} +3 -3
  136. package/dist/utilities/hooks/index.d.mts +9 -9
  137. package/dist/utilities/hooks/usePagination/usePagination.d.mts +9 -9
  138. package/dist/utilities/index.d.mts +9 -9
  139. package/dist/vanilla/dropdown/index.mjs +1 -1
  140. package/dist/vanilla/index.mjs +1 -1
  141. package/dist/vanilla/popover/index.mjs +1 -1
  142. package/package.json +4 -4
  143. package/dist/popover-BJuqdEHo.mjs.map +0 -1
  144. package/dist/popover-Dqhgmd9j.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime70 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime47 from "react/jsx-runtime";
2
2
  import { HTMLAttributes, Ref } from "react";
3
3
 
4
4
  //#region src/components/pagination/pagination-item.d.ts
@@ -15,7 +15,7 @@ declare const PaginationItem: ({
15
15
  asChild,
16
16
  children,
17
17
  ...rest
18
- }: PaginationItemProps) => react_jsx_runtime70.JSX.Element;
18
+ }: PaginationItemProps) => react_jsx_runtime47.JSX.Element;
19
19
  //#endregion
20
20
  export { PaginationItemProps as n, PaginationItem as t };
21
- //# sourceMappingURL=pagination-item-Cvl83z9g.d.mts.map
21
+ //# sourceMappingURL=pagination-item-DBpTl8iP.d.mts.map
@@ -1,4 +1,4 @@
1
- import { autoUpdate, computePosition, flip, hide, offset, shift } from "@floating-ui/dom";
1
+ import { autoUpdate, computePosition, flip, hide, offset, shift, size } from "@floating-ui/dom";
2
2
 
3
3
  //#region src/vanilla/popover/index.ts
4
4
  /**
@@ -21,7 +21,10 @@ const initPopover = ({ id, disableAutoPlacement = false, placement = "top", posi
21
21
  ...disableAutoPlacement ? [] : [flip({ padding }), shift({ padding })],
22
22
  ...positionMiddleware,
23
23
  hide({ padding }),
24
- ...popover.dataset.arrow === "true" ? [arrowPseudoElement] : []
24
+ ...popover.dataset.arrow === "true" ? [arrowPseudoElement] : [],
25
+ size({ apply({ rects, elements }) {
26
+ elements.floating.style.setProperty("--bic-popover-trigger-width", `${rects.reference.width}px`);
27
+ } })
25
28
  ],
26
29
  strategy: "fixed",
27
30
  placement
@@ -79,4 +82,4 @@ const arrowPseudoElement = {
79
82
 
80
83
  //#endregion
81
84
  export { initPopover as n, arrowPseudoElement as t };
82
- //# sourceMappingURL=popover-BJuqdEHo.mjs.map
85
+ //# sourceMappingURL=popover-B8P0dE2-.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover-B8P0dE2-.mjs","names":[],"sources":["../src/vanilla/popover/index.ts"],"sourcesContent":["import { autoUpdate, computePosition, flip, offset, shift, hide, size } from '@floating-ui/dom';\nimport type { Middleware, Placement } from '@floating-ui/dom';\n\nexport type InitPopoverOptions = {\n /** The id of the popover to initialize. The trigger element should have a `aria-controls` attribute with the same id. */\n id: string;\n /**\n * Placement of the popover relative to the trigger.\n * @default 'top'\n */\n placement?: Placement;\n /**\n * Additional middleware to use for positioning the popover.\n *\n * @example\n * Prevent the popover from overflowing the navbar by using the `size` middleware:\n * ```ts\n * positionMiddleware: [\n * size({\n * apply: ({ availableHeight, elements, ...state }) => {\n * const available = `${Math.max(0, availableHeight)}px`;\n * const maxHeight = state.placement.includes('top')\n * ? `calc(${available} - var(--bi-layout-navbar-height, 0))`\n * : available;\n * elements.floating.style.maxHeight = maxHeight;\n * },\n * padding,\n * })\n * ]}\n * ```\n */\n positionMiddleware?: Middleware[];\n /**\n * Whether to disable auto placement.\n * @default false\n */\n disableAutoPlacement?: boolean;\n /**\n * The padding used by the `offset` middleware.\n * @default '20'\n */\n padding?: number;\n};\n\n/**\n * Initializes the popover.\n * @param options - InitPopoverOptions\n * @returns A function to programmatically toggle the popover.\n */\nexport const initPopover = ({\n id,\n disableAutoPlacement = false,\n placement = 'top',\n positionMiddleware = [],\n padding = 20,\n}: InitPopoverOptions) => {\n let cleanup: (() => void) | undefined;\n const popover = document.getElementById(id);\n const triggerSelector = `[aria-controls=\"${id}\"]`;\n const trigger = document.querySelector(triggerSelector);\n\n if (!popover || !trigger) return;\n\n const togglePopover = (open: boolean) => {\n if (open) {\n cleanup = autoUpdate(trigger, popover, () => {\n computePosition(trigger, popover, {\n middleware: [\n offset(padding),\n ...(disableAutoPlacement ? [] : [flip({ padding }), shift({ padding })]),\n ...positionMiddleware,\n hide({ padding }),\n ...(popover.dataset.arrow === 'true' ? [arrowPseudoElement] : []),\n size({\n apply({ rects, elements }) {\n elements.floating.style.setProperty('--bic-popover-trigger-width', `${rects.reference.width}px`);\n },\n }),\n ],\n strategy: 'fixed',\n placement,\n }).then(({ x, y, middlewareData }) => {\n popover.style.translate = `${x}px ${y}px`;\n popover.style.visibility = middlewareData.hide?.referenceHidden ? 'hidden' : 'visible';\n });\n });\n popover.setAttribute('aria-hidden', 'false');\n trigger.setAttribute('aria-expanded', 'true');\n } else {\n cleanup?.();\n popover.setAttribute('aria-hidden', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n }\n };\n\n document.addEventListener(\n 'click',\n (event) => {\n const el = event.target as Element | null;\n const isTrigger = el?.closest?.(triggerSelector);\n const isOutside = !isTrigger && !popover.contains(el as Node);\n const isOpen = popover.getAttribute('aria-hidden') === 'false';\n\n if (isTrigger) {\n togglePopover(!isOpen);\n }\n if (isOutside && isOpen) {\n togglePopover(false);\n }\n },\n true,\n );\n\n return togglePopover;\n};\n\nexport const arrowPseudoElement: Middleware = {\n name: 'ArrowPseudoElement',\n fn(data) {\n const { elements, rects, placement } = data;\n\n let arrowX = `${Math.round(rects.reference.width / 2 + rects.reference.x - data.x)}px`;\n let arrowY = `${Math.round(rects.reference.height / 2 + rects.reference.y - data.y)}px`;\n\n if (rects.reference.width > rects.floating.width) {\n arrowX = `${Math.round(rects.floating.width / 2)}px`;\n }\n\n if (rects.reference.height > rects.floating.height) {\n arrowY = `${Math.round(rects.floating.height / 2)}px`;\n }\n\n switch (placement.split('-')[0]) {\n case 'top':\n arrowY = '100%';\n break;\n case 'right':\n arrowX = '0';\n break;\n case 'bottom':\n arrowY = '0';\n break;\n case 'left':\n arrowX = '100%';\n break;\n }\n\n elements.floating.setAttribute('data-placement', placement.split('-')[0]); // We only need top/left/right/bottom\n elements.floating.style.setProperty('--bic-popover-arrow-x', arrowX);\n elements.floating.style.setProperty('--bic-popover-arrow-y', arrowY);\n return data;\n },\n};\n"],"mappings":";;;;;;;;AAiDA,MAAa,eAAe,EAC1B,IACA,uBAAuB,OACvB,YAAY,OACZ,qBAAqB,EAAE,EACvB,UAAU,SACc;CACxB,IAAI;CACJ,MAAM,UAAU,SAAS,eAAe,GAAG;CAC3C,MAAM,kBAAkB,mBAAmB,GAAG;CAC9C,MAAM,UAAU,SAAS,cAAc,gBAAgB;AAEvD,KAAI,CAAC,WAAW,CAAC,QAAS;CAE1B,MAAM,iBAAiB,SAAkB;AACvC,MAAI,MAAM;AACR,aAAU,WAAW,SAAS,eAAe;AAC3C,oBAAgB,SAAS,SAAS;KAChC,YAAY;MACV,OAAO,QAAQ;MACf,GAAI,uBAAuB,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;MACvE,GAAG;MACH,KAAK,EAAE,SAAS,CAAC;MACjB,GAAI,QAAQ,QAAQ,UAAU,SAAS,CAAC,mBAAmB,GAAG,EAAE;MAChE,KAAK,EACH,MAAM,EAAE,OAAO,YAAY;AACzB,gBAAS,SAAS,MAAM,YAAY,+BAA+B,GAAG,MAAM,UAAU,MAAM,IAAI;SAEnG,CAAC;MACH;KACD,UAAU;KACV;KACD,CAAC,CAAC,MAAM,EAAE,GAAG,GAAG,qBAAqB;AACpC,aAAQ,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE;AACtC,aAAQ,MAAM,aAAa,eAAe,MAAM,kBAAkB,WAAW;MAC7E;KACF;AACF,WAAQ,aAAa,eAAe,QAAQ;AAC5C,WAAQ,aAAa,iBAAiB,OAAO;SACxC;AACL,cAAW;AACX,WAAQ,aAAa,eAAe,OAAO;AAC3C,WAAQ,aAAa,iBAAiB,QAAQ;;;AAIlD,UAAS,iBACP,UACC,UAAU;EACT,MAAM,KAAK,MAAM;EACjB,MAAM,YAAY,IAAI,UAAU,gBAAgB;EAChD,MAAM,YAAY,CAAC,aAAa,CAAC,QAAQ,SAAS,GAAW;EAC7D,MAAM,SAAS,QAAQ,aAAa,cAAc,KAAK;AAEvD,MAAI,UACF,eAAc,CAAC,OAAO;AAExB,MAAI,aAAa,OACf,eAAc,MAAM;IAGxB,KACD;AAED,QAAO;;AAGT,MAAa,qBAAiC;CAC5C,MAAM;CACN,GAAG,MAAM;EACP,MAAM,EAAE,UAAU,OAAO,cAAc;EAEvC,IAAI,SAAS,GAAG,KAAK,MAAM,MAAM,UAAU,QAAQ,IAAI,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;EACnF,IAAI,SAAS,GAAG,KAAK,MAAM,MAAM,UAAU,SAAS,IAAI,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;AAEpF,MAAI,MAAM,UAAU,QAAQ,MAAM,SAAS,MACzC,UAAS,GAAG,KAAK,MAAM,MAAM,SAAS,QAAQ,EAAE,CAAC;AAGnD,MAAI,MAAM,UAAU,SAAS,MAAM,SAAS,OAC1C,UAAS,GAAG,KAAK,MAAM,MAAM,SAAS,SAAS,EAAE,CAAC;AAGpD,UAAQ,UAAU,MAAM,IAAI,CAAC,IAA7B;GACE,KAAK;AACH,aAAS;AACT;GACF,KAAK;AACH,aAAS;AACT;GACF,KAAK;AACH,aAAS;AACT;GACF,KAAK;AACH,aAAS;AACT;;AAGJ,WAAS,SAAS,aAAa,kBAAkB,UAAU,MAAM,IAAI,CAAC,GAAG;AACzE,WAAS,SAAS,MAAM,YAAY,yBAAyB,OAAO;AACpE,WAAS,SAAS,MAAM,YAAY,yBAAyB,OAAO;AACpE,SAAO;;CAEV"}
@@ -1,12 +1,12 @@
1
1
  import { t as useMergeRefs } from "./useMergeRefs-DeEL5hK6.mjs";
2
2
  import { t as Context } from "./popover-trigger-context-DZFORTLq.mjs";
3
- import { t as arrowPseudoElement } from "./popover-BJuqdEHo.mjs";
3
+ import { t as arrowPseudoElement } from "./popover-B8P0dE2-.mjs";
4
4
  import clsx from "clsx/lite";
5
5
  import { Slot } from "@radix-ui/react-slot";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  import { use, useEffect, useRef } from "react";
8
8
  import { useControllableState } from "@radix-ui/react-use-controllable-state";
9
- import { autoUpdate, computePosition, flip, hide, offset, shift } from "@floating-ui/dom";
9
+ import { autoUpdate, computePosition, flip, hide, offset, shift, size } from "@floating-ui/dom";
10
10
 
11
11
  //#region src/components/popover/popover.tsx
12
12
  /**
@@ -72,7 +72,10 @@ const Popover = ({ id, className, onOpenChange, open, placement = "top", disable
72
72
  padding,
73
73
  strategy: "escaped"
74
74
  }),
75
- ...arrow ? [arrowPseudoElement] : []
75
+ ...arrow ? [arrowPseudoElement] : [],
76
+ size({ apply({ rects, elements }) {
77
+ elements.floating.style.setProperty("--bic-popover-trigger-width", `${rects.reference.width}px`);
78
+ } })
76
79
  ],
77
80
  strategy: "fixed",
78
81
  placement
@@ -106,4 +109,4 @@ const Popover = ({ id, className, onOpenChange, open, placement = "top", disable
106
109
 
107
110
  //#endregion
108
111
  export { Popover as t };
109
- //# sourceMappingURL=popover-Dqhgmd9j.mjs.map
112
+ //# sourceMappingURL=popover-CGqBsAam.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover-CGqBsAam.mjs","names":["cl"],"sources":["../src/components/popover/popover.tsx"],"sourcesContent":["// Thanks to Designsystemet:\n// https://github.com/digdir/designsystemet/blob/8aa6dc274e5b0338d15572f44b5dd3fab6fa4eb1/packages/react/src/components/Popover/Popover.tsx\n\nimport { autoUpdate, computePosition, flip, offset, shift, hide, size } from '@floating-ui/dom';\nimport type { Middleware, Placement } from '@floating-ui/dom';\nimport { Slot } from '@radix-ui/react-slot';\nimport cl from 'clsx/lite';\nimport { use, useRef } from 'react';\nimport type { HTMLAttributes, Ref } from 'react';\nimport { useEffect } from 'react';\nimport type { DefaultProps } from '../../types';\nimport type { MergeRight } from '../../utilities';\nimport { useMergeRefs } from '../../utilities/hooks/useMergeRefs/useMergeRefs';\nimport { Context } from './popover-trigger-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport { arrowPseudoElement } from '../../vanilla/popover';\n\nexport type PopoverProps = MergeRight<\n DefaultProps & HTMLAttributes<HTMLDivElement>,\n {\n /**\n * `id` to connect the trigger with the popover - required when not using PopoverContext.\n */\n id?: string;\n /**\n * Placement of the popover on the trigger.\n * @default 'top'\n */\n placement?: Placement;\n /**\n * When a boolean is provided, the popover will be controlled.\n * @default undefined\n */\n open?: boolean;\n /**\n * Callback when the open state changes.\n * @param open - The new open state of the popover.\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Whether to disable auto placement.\n * @default false\n */\n disableAutoPlacement?: boolean;\n /**\n * Additional middleware to use for positioning the popover.\n *\n * @example\n * Prevent the popover from overflowing the navbar by using the `size` middleware:\n * ```ts\n * positionMiddleware={[\n * size({\n * apply: ({ availableHeight, elements, ...state }) => {\n * const available = `${Math.max(0, availableHeight)}px`;\n * const maxHeight = state.placement.includes('top')\n * ? `calc(${available} - var(--bi-layout-navbar-height, 0))`\n * : available;\n * elements.floating.style.maxHeight = maxHeight;\n * },\n * padding,\n * })\n * ]}\n * ```\n */\n positionMiddleware?: Middleware[];\n /**\n * The padding used by the `offset` middleware.\n * @default '20'\n */\n padding?: number;\n /**\n * Show an arrow on the popover, pointing toward the center of the reference element.\n * @default false\n */\n arrow?: boolean;\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n * @default false\n */\n asChild?: boolean;\n ref?: Ref<HTMLDivElement>;\n }\n>;\n\n/**\n * Popover component, used to display content in a popover over an element.\n *\n * @example with TriggerContext\n * <PopoverTriggerContext>\n * <PopoverTrigger>Open Popover</PopoverTrigger>\n * <Popover>\n * Content\n * </Popover>\n * </PopoverTriggerContext>\n *\n * @example without TriggerContext\n * <Button aria-controls=\"my-popover\" aria-expanded={open}>Open Popover</Button>\n * <Popover open={open} onOpenChange={onOpenChange} id=\"my-popover\">\n * Content\n * </Popover>\n */\nexport const Popover = ({\n id,\n className,\n onOpenChange,\n open,\n placement = 'top',\n disableAutoPlacement = false,\n positionMiddleware = [],\n padding = 20,\n dark = false,\n arrow = false,\n asChild = false,\n ref,\n ...rest\n}: PopoverProps) => {\n const Component = asChild ? Slot : 'div';\n\n const popoverRef = useRef<HTMLDivElement>(null);\n const isControlled = useRef(open !== undefined);\n const mergedRefs = useMergeRefs([popoverRef, ref]);\n const { popoverId, setPopoverId, popoverOpen, setPopoverOpen } = use(Context);\n\n const [isOpen, setIsOpen] = useControllableState({\n // False positive: isControlled will never change, but is just used to store the initial controlled state\n prop: isControlled.current ? open : popoverOpen,\n onChange: (val) => {\n onOpenChange?.(val);\n setPopoverOpen?.(val);\n },\n defaultProp: false,\n caller: 'Popover',\n });\n\n useEffect(() => {\n const popover = popoverRef.current;\n const handleClick = (event: MouseEvent) => {\n const el = event.target as Element | null;\n const isTrigger = el?.closest?.(`[aria-controls=\"${popover?.id}\"]`);\n const isOutside = !isTrigger && !popover?.contains(el as Node);\n\n if (isOutside) {\n setIsOpen(false);\n }\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !isOpen) return;\n event.preventDefault(); // Prevent closing fullscreen in Safari\n setIsOpen(false);\n };\n\n document.addEventListener('click', handleClick, true); // Use capture to execute before React event API\n document.addEventListener('keydown', handleKeydown);\n return () => {\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeydown);\n };\n }, [isOpen, setIsOpen]);\n\n useEffect(() => {\n const popover = popoverRef.current;\n const trigger = document.querySelector(`[aria-controls=\"${popover?.id}\"]`);\n\n if (popover && trigger && isOpen)\n return autoUpdate(trigger, popover, () => {\n computePosition(trigger, popover, {\n middleware: [\n offset(padding),\n ...(disableAutoPlacement ? [] : [flip({ padding }), shift({ padding })]),\n ...positionMiddleware,\n hide({ padding, strategy: 'escaped' }),\n ...(arrow ? [arrowPseudoElement] : []),\n size({\n apply({ rects, elements }) {\n elements.floating.style.setProperty('--bic-popover-trigger-width', `${rects.reference.width}px`);\n },\n }),\n ],\n strategy: 'fixed',\n placement,\n }).then(({ x, y, middlewareData }) => {\n popover.style.translate = `${x}px ${y}px`;\n popover.style.visibility = middlewareData.hide?.referenceHidden ? 'hidden' : 'visible';\n });\n });\n }, [isOpen, placement, id, disableAutoPlacement, positionMiddleware, padding, arrow]);\n\n // Update context with id\n useEffect(() => {\n if (id) setPopoverId?.(id);\n }, [id, setPopoverId]);\n\n return (\n <Component\n className={cl('bi-popover', className)}\n id={id || popoverId}\n aria-hidden={!isOpen}\n data-arrow={arrow || undefined}\n data-dark={dark}\n ref={mergedRefs}\n {...rest}\n />\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqGA,MAAa,WAAW,EACtB,IACA,WACA,cACA,MACA,YAAY,OACZ,uBAAuB,OACvB,qBAAqB,EAAE,EACvB,UAAU,IACV,OAAO,OACP,QAAQ,OACR,UAAU,OACV,KACA,GAAG,WACe;CAClB,MAAM,YAAY,UAAU,OAAO;CAEnC,MAAM,aAAa,OAAuB,KAAK;CAC/C,MAAM,eAAe,OAAO,SAAS,OAAU;CAC/C,MAAM,aAAa,aAAa,CAAC,YAAY,IAAI,CAAC;CAClD,MAAM,EAAE,WAAW,cAAc,aAAa,mBAAmB,IAAI,QAAQ;CAE7E,MAAM,CAAC,QAAQ,aAAa,qBAAqB;EAE/C,MAAM,aAAa,UAAU,OAAO;EACpC,WAAW,QAAQ;AACjB,kBAAe,IAAI;AACnB,oBAAiB,IAAI;;EAEvB,aAAa;EACb,QAAQ;EACT,CAAC;AAEF,iBAAgB;EACd,MAAM,UAAU,WAAW;EAC3B,MAAM,eAAe,UAAsB;GACzC,MAAM,KAAK,MAAM;AAIjB,OAFkB,CADA,IAAI,UAAU,mBAAmB,SAAS,GAAG,IAAI,IACnC,CAAC,SAAS,SAAS,GAAW,CAG5D,WAAU,MAAM;;EAIpB,MAAM,iBAAiB,UAAyB;AAC9C,OAAI,MAAM,QAAQ,YAAY,CAAC,OAAQ;AACvC,SAAM,gBAAgB;AACtB,aAAU,MAAM;;AAGlB,WAAS,iBAAiB,SAAS,aAAa,KAAK;AACrD,WAAS,iBAAiB,WAAW,cAAc;AACnD,eAAa;AACX,YAAS,oBAAoB,SAAS,aAAa,KAAK;AACxD,YAAS,oBAAoB,WAAW,cAAc;;IAEvD,CAAC,QAAQ,UAAU,CAAC;AAEvB,iBAAgB;EACd,MAAM,UAAU,WAAW;EAC3B,MAAM,UAAU,SAAS,cAAc,mBAAmB,SAAS,GAAG,IAAI;AAE1E,MAAI,WAAW,WAAW,OACxB,QAAO,WAAW,SAAS,eAAe;AACxC,mBAAgB,SAAS,SAAS;IAChC,YAAY;KACV,OAAO,QAAQ;KACf,GAAI,uBAAuB,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;KACvE,GAAG;KACH,KAAK;MAAE;MAAS,UAAU;MAAW,CAAC;KACtC,GAAI,QAAQ,CAAC,mBAAmB,GAAG,EAAE;KACrC,KAAK,EACH,MAAM,EAAE,OAAO,YAAY;AACzB,eAAS,SAAS,MAAM,YAAY,+BAA+B,GAAG,MAAM,UAAU,MAAM,IAAI;QAEnG,CAAC;KACH;IACD,UAAU;IACV;IACD,CAAC,CAAC,MAAM,EAAE,GAAG,GAAG,qBAAqB;AACpC,YAAQ,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE;AACtC,YAAQ,MAAM,aAAa,eAAe,MAAM,kBAAkB,WAAW;KAC7E;IACF;IACH;EAAC;EAAQ;EAAW;EAAI;EAAsB;EAAoB;EAAS;EAAM,CAAC;AAGrF,iBAAgB;AACd,MAAI,GAAI,gBAAe,GAAG;IACzB,CAAC,IAAI,aAAa,CAAC;AAEtB,QACE,oBAAC;EACC,WAAWA,KAAG,cAAc,UAAU;EACtC,IAAI,MAAM;EACV,eAAa,CAAC;EACd,cAAY,SAAS;EACrB,aAAW;EACX,KAAK;EACL,GAAI;GACJ"}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime37 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime51 from "react/jsx-runtime";
2
2
  import * as react0 from "react";
3
3
  import { ReactNode } from "react";
4
4
 
@@ -37,7 +37,7 @@ declare const PopoverTriggerContext: ({
37
37
  children,
38
38
  open,
39
39
  onOpenChange
40
- }: PopoverTriggerContextProps) => react_jsx_runtime37.JSX.Element;
40
+ }: PopoverTriggerContextProps) => react_jsx_runtime51.JSX.Element;
41
41
  //#endregion
42
42
  export { PopoverTriggerContext as n, PopoverTriggerContextProps as r, Context as t };
43
- //# sourceMappingURL=popover-trigger-context-BfMeXz8y.d.mts.map
43
+ //# sourceMappingURL=popover-trigger-context-HGF38PbW.d.mts.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime66 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime67 from "react/jsx-runtime";
2
2
  import { ReactNode } from "react";
3
3
 
4
4
  //#region src/components/sticky-header/sticky-header.d.ts
@@ -13,7 +13,7 @@ type StickyHeaderProps = {
13
13
  */
14
14
  declare const StickyHeader: ({
15
15
  children
16
- }: StickyHeaderProps) => react_jsx_runtime66.JSX.Element;
16
+ }: StickyHeaderProps) => react_jsx_runtime67.JSX.Element;
17
17
  //#endregion
18
18
  export { StickyHeaderProps as n, StickyHeader as t };
19
- //# sourceMappingURL=sticky-header-BRlM-wit.d.mts.map
19
+ //# sourceMappingURL=sticky-header-CQ10VPji.d.mts.map
@@ -1,15 +1,15 @@
1
1
  import { r as useCheckboxGroup, t as UseCheckboxGroupOptions } from "../../useCheckboxGroup-BUpI46_M.mjs";
2
2
  import { t as useIsomorphicLayoutEffect } from "../../useIsomorphicLayoutEffect-gxToSQn7.mjs";
3
3
  import "../../types-Bgj7p8nD.mjs";
4
- import { i as usePagination, r as UsePaginationProps } from "../../alert-footer-BpkOdCCs.mjs";
5
- import "../../dialog-trigger-context-DTtpry85.mjs";
6
- import "../../drawer-trigger-context-B9FQbPQM.mjs";
7
- import "../../popover-trigger-context-BfMeXz8y.mjs";
8
- import "../../dropdown-item-DXKNHOz3.mjs";
9
- import "../../dropdown-list-C0ayMUa0.mjs";
10
- import "../../footer-links-DHz69lVl.mjs";
11
- import "../../pagination-item-Cvl83z9g.mjs";
12
- import "../../sticky-header-BRlM-wit.mjs";
4
+ import { i as usePagination, r as UsePaginationProps } from "../../alert-footer-BFTlBQCl.mjs";
5
+ import "../../dialog-trigger-context-BP2Q3KEA.mjs";
6
+ import "../../drawer-trigger-context-BuP2a1-8.mjs";
7
+ import "../../popover-trigger-context-HGF38PbW.mjs";
8
+ import "../../dropdown-item-B9Toa4yI.mjs";
9
+ import "../../dropdown-list-Ce8CUTGr.mjs";
10
+ import "../../footer-links-B8XVWRnL.mjs";
11
+ import "../../pagination-item-DBpTl8iP.mjs";
12
+ import "../../sticky-header-CQ10VPji.mjs";
13
13
  import "../../index-C3reD4RP.mjs";
14
14
  import { t as useIsElementAboveViewport } from "../../useIsElementAboveViewport-BcIGWQqn.mjs";
15
15
  import { t as useScrollDirection } from "../../useScrollDirection-Cm7w2CbB.mjs";
@@ -1,15 +1,15 @@
1
1
  import "../../../useCheckboxGroup-BUpI46_M.mjs";
2
2
  import "../../../useIsomorphicLayoutEffect-gxToSQn7.mjs";
3
3
  import "../../../types-Bgj7p8nD.mjs";
4
- import { i as usePagination, r as UsePaginationProps } from "../../../alert-footer-BpkOdCCs.mjs";
5
- import "../../../dialog-trigger-context-DTtpry85.mjs";
6
- import "../../../drawer-trigger-context-B9FQbPQM.mjs";
7
- import "../../../popover-trigger-context-BfMeXz8y.mjs";
8
- import "../../../dropdown-item-DXKNHOz3.mjs";
9
- import "../../../dropdown-list-C0ayMUa0.mjs";
10
- import "../../../footer-links-DHz69lVl.mjs";
11
- import "../../../pagination-item-Cvl83z9g.mjs";
12
- import "../../../sticky-header-BRlM-wit.mjs";
4
+ import { i as usePagination, r as UsePaginationProps } from "../../../alert-footer-BFTlBQCl.mjs";
5
+ import "../../../dialog-trigger-context-BP2Q3KEA.mjs";
6
+ import "../../../drawer-trigger-context-BuP2a1-8.mjs";
7
+ import "../../../popover-trigger-context-HGF38PbW.mjs";
8
+ import "../../../dropdown-item-B9Toa4yI.mjs";
9
+ import "../../../dropdown-list-Ce8CUTGr.mjs";
10
+ import "../../../footer-links-B8XVWRnL.mjs";
11
+ import "../../../pagination-item-DBpTl8iP.mjs";
12
+ import "../../../sticky-header-CQ10VPji.mjs";
13
13
  import "../../../index-C3reD4RP.mjs";
14
14
  import "../../../useIsElementAboveViewport-BcIGWQqn.mjs";
15
15
  export { UsePaginationProps, usePagination };
@@ -1,15 +1,15 @@
1
1
  import { r as useCheckboxGroup, t as UseCheckboxGroupOptions } from "../useCheckboxGroup-BUpI46_M.mjs";
2
2
  import { t as useIsomorphicLayoutEffect } from "../useIsomorphicLayoutEffect-gxToSQn7.mjs";
3
3
  import "../types-Bgj7p8nD.mjs";
4
- import { i as usePagination, r as UsePaginationProps } from "../alert-footer-BpkOdCCs.mjs";
5
- import "../dialog-trigger-context-DTtpry85.mjs";
6
- import "../drawer-trigger-context-B9FQbPQM.mjs";
7
- import "../popover-trigger-context-BfMeXz8y.mjs";
8
- import "../dropdown-item-DXKNHOz3.mjs";
9
- import "../dropdown-list-C0ayMUa0.mjs";
10
- import "../footer-links-DHz69lVl.mjs";
11
- import "../pagination-item-Cvl83z9g.mjs";
12
- import "../sticky-header-BRlM-wit.mjs";
4
+ import { i as usePagination, r as UsePaginationProps } from "../alert-footer-BFTlBQCl.mjs";
5
+ import "../dialog-trigger-context-BP2Q3KEA.mjs";
6
+ import "../drawer-trigger-context-BuP2a1-8.mjs";
7
+ import "../popover-trigger-context-HGF38PbW.mjs";
8
+ import "../dropdown-item-B9Toa4yI.mjs";
9
+ import "../dropdown-list-Ce8CUTGr.mjs";
10
+ import "../footer-links-B8XVWRnL.mjs";
11
+ import "../pagination-item-DBpTl8iP.mjs";
12
+ import "../sticky-header-CQ10VPji.mjs";
13
13
  import "../index-C3reD4RP.mjs";
14
14
  import { t as useIsElementAboveViewport } from "../useIsElementAboveViewport-BcIGWQqn.mjs";
15
15
  import { t as useScrollDirection } from "../useScrollDirection-Cm7w2CbB.mjs";
@@ -1,4 +1,4 @@
1
- import { n as initPopover } from "../../popover-BJuqdEHo.mjs";
1
+ import { n as initPopover } from "../../popover-B8P0dE2-.mjs";
2
2
 
3
3
  //#region src/vanilla/dropdown/index.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { n as initPopover, t as arrowPseudoElement } from "../popover-BJuqdEHo.mjs";
1
+ import { n as initPopover, t as arrowPseudoElement } from "../popover-B8P0dE2-.mjs";
2
2
  import { initDropdown } from "./dropdown/index.mjs";
3
3
  import { initSubNavbar } from "./sub-navbar/index.mjs";
4
4
 
@@ -1,3 +1,3 @@
1
- import { n as initPopover, t as arrowPseudoElement } from "../../popover-BJuqdEHo.mjs";
1
+ import { n as initPopover, t as arrowPseudoElement } from "../../popover-B8P0dE2-.mjs";
2
2
 
3
3
  export { arrowPseudoElement, initPopover };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bi-digital/react",
3
3
  "type": "module",
4
- "version": "0.7.0",
4
+ "version": "0.8.0",
5
5
  "engines": {
6
6
  "node": "^20.19.0 || >=22.12.0"
7
7
  },
@@ -41,7 +41,7 @@
41
41
  "@radix-ui/react-tabs": "^1.1.13",
42
42
  "@radix-ui/react-use-controllable-state": "^1.2.2",
43
43
  "clsx": "^2.1.1",
44
- "@bi-digital/icons": "0.7.0"
44
+ "@bi-digital/icons": "0.8.0"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@testing-library/dom": "^10.4.1",
@@ -52,7 +52,7 @@
52
52
  "@types/react-dom": "^19.2.3",
53
53
  "@vitest/coverage-v8": "^4.0.8",
54
54
  "@vitest/expect": "^4.0.18",
55
- "jsdom": "^28.0.0",
55
+ "jsdom": "^28.1.0",
56
56
  "react": "^19.2.0",
57
57
  "react-dom": "^19.2.0",
58
58
  "tsconfck": "^3.1.6",
@@ -62,7 +62,7 @@
62
62
  "peerDependencies": {
63
63
  "react": "^19",
64
64
  "react-dom": "^19",
65
- "@bi-digital/css": "0.7.0"
65
+ "@bi-digital/css": "0.8.0"
66
66
  },
67
67
  "scripts": {
68
68
  "build": "tsdown",
@@ -1 +0,0 @@
1
- {"version":3,"file":"popover-BJuqdEHo.mjs","names":[],"sources":["../src/vanilla/popover/index.ts"],"sourcesContent":["import { autoUpdate, computePosition, flip, offset, shift, hide } from '@floating-ui/dom';\nimport type { Middleware, Placement } from '@floating-ui/dom';\n\nexport type InitPopoverOptions = {\n /** The id of the popover to initialize. The trigger element should have a `aria-controls` attribute with the same id. */\n id: string;\n /**\n * Placement of the popover relative to the trigger.\n * @default 'top'\n */\n placement?: Placement;\n /**\n * Additional middleware to use for positioning the popover.\n *\n * @example\n * Prevent the popover from overflowing the navbar by using the `size` middleware:\n * ```ts\n * positionMiddleware: [\n * size({\n * apply: ({ availableHeight, elements, ...state }) => {\n * const available = `${Math.max(0, availableHeight)}px`;\n * const maxHeight = state.placement.includes('top')\n * ? `calc(${available} - var(--bi-layout-navbar-height, 0))`\n * : available;\n * elements.floating.style.maxHeight = maxHeight;\n * },\n * padding,\n * })\n * ]}\n * ```\n */\n positionMiddleware?: Middleware[];\n /**\n * Whether to disable auto placement.\n * @default false\n */\n disableAutoPlacement?: boolean;\n /**\n * The padding used by the `offset` middleware.\n * @default '20'\n */\n padding?: number;\n};\n\n/**\n * Initializes the popover.\n * @param options - InitPopoverOptions\n * @returns A function to programmatically toggle the popover.\n */\nexport const initPopover = ({\n id,\n disableAutoPlacement = false,\n placement = 'top',\n positionMiddleware = [],\n padding = 20,\n}: InitPopoverOptions) => {\n let cleanup: (() => void) | undefined;\n const popover = document.getElementById(id);\n const triggerSelector = `[aria-controls=\"${id}\"]`;\n const trigger = document.querySelector(triggerSelector);\n\n if (!popover || !trigger) return;\n\n const togglePopover = (open: boolean) => {\n if (open) {\n cleanup = autoUpdate(trigger, popover, () => {\n computePosition(trigger, popover, {\n middleware: [\n offset(padding),\n ...(disableAutoPlacement ? [] : [flip({ padding }), shift({ padding })]),\n ...positionMiddleware,\n hide({ padding }),\n ...(popover.dataset.arrow === 'true' ? [arrowPseudoElement] : []),\n ],\n strategy: 'fixed',\n placement,\n }).then(({ x, y, middlewareData }) => {\n popover.style.translate = `${x}px ${y}px`;\n popover.style.visibility = middlewareData.hide?.referenceHidden ? 'hidden' : 'visible';\n });\n });\n popover.setAttribute('aria-hidden', 'false');\n trigger.setAttribute('aria-expanded', 'true');\n } else {\n cleanup?.();\n popover.setAttribute('aria-hidden', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n }\n };\n\n document.addEventListener(\n 'click',\n (event) => {\n const el = event.target as Element | null;\n const isTrigger = el?.closest?.(triggerSelector);\n const isOutside = !isTrigger && !popover.contains(el as Node);\n const isOpen = popover.getAttribute('aria-hidden') === 'false';\n\n if (isTrigger) {\n togglePopover(!isOpen);\n }\n if (isOutside && isOpen) {\n togglePopover(false);\n }\n },\n true,\n );\n\n return togglePopover;\n};\n\nexport const arrowPseudoElement: Middleware = {\n name: 'ArrowPseudoElement',\n fn(data) {\n const { elements, rects, placement } = data;\n\n let arrowX = `${Math.round(rects.reference.width / 2 + rects.reference.x - data.x)}px`;\n let arrowY = `${Math.round(rects.reference.height / 2 + rects.reference.y - data.y)}px`;\n\n if (rects.reference.width > rects.floating.width) {\n arrowX = `${Math.round(rects.floating.width / 2)}px`;\n }\n\n if (rects.reference.height > rects.floating.height) {\n arrowY = `${Math.round(rects.floating.height / 2)}px`;\n }\n\n switch (placement.split('-')[0]) {\n case 'top':\n arrowY = '100%';\n break;\n case 'right':\n arrowX = '0';\n break;\n case 'bottom':\n arrowY = '0';\n break;\n case 'left':\n arrowX = '100%';\n break;\n }\n\n elements.floating.setAttribute('data-placement', placement.split('-')[0]); // We only need top/left/right/bottom\n elements.floating.style.setProperty('--bic-popover-arrow-x', arrowX);\n elements.floating.style.setProperty('--bic-popover-arrow-y', arrowY);\n return data;\n },\n};\n"],"mappings":";;;;;;;;AAiDA,MAAa,eAAe,EAC1B,IACA,uBAAuB,OACvB,YAAY,OACZ,qBAAqB,EAAE,EACvB,UAAU,SACc;CACxB,IAAI;CACJ,MAAM,UAAU,SAAS,eAAe,GAAG;CAC3C,MAAM,kBAAkB,mBAAmB,GAAG;CAC9C,MAAM,UAAU,SAAS,cAAc,gBAAgB;AAEvD,KAAI,CAAC,WAAW,CAAC,QAAS;CAE1B,MAAM,iBAAiB,SAAkB;AACvC,MAAI,MAAM;AACR,aAAU,WAAW,SAAS,eAAe;AAC3C,oBAAgB,SAAS,SAAS;KAChC,YAAY;MACV,OAAO,QAAQ;MACf,GAAI,uBAAuB,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;MACvE,GAAG;MACH,KAAK,EAAE,SAAS,CAAC;MACjB,GAAI,QAAQ,QAAQ,UAAU,SAAS,CAAC,mBAAmB,GAAG,EAAE;MACjE;KACD,UAAU;KACV;KACD,CAAC,CAAC,MAAM,EAAE,GAAG,GAAG,qBAAqB;AACpC,aAAQ,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE;AACtC,aAAQ,MAAM,aAAa,eAAe,MAAM,kBAAkB,WAAW;MAC7E;KACF;AACF,WAAQ,aAAa,eAAe,QAAQ;AAC5C,WAAQ,aAAa,iBAAiB,OAAO;SACxC;AACL,cAAW;AACX,WAAQ,aAAa,eAAe,OAAO;AAC3C,WAAQ,aAAa,iBAAiB,QAAQ;;;AAIlD,UAAS,iBACP,UACC,UAAU;EACT,MAAM,KAAK,MAAM;EACjB,MAAM,YAAY,IAAI,UAAU,gBAAgB;EAChD,MAAM,YAAY,CAAC,aAAa,CAAC,QAAQ,SAAS,GAAW;EAC7D,MAAM,SAAS,QAAQ,aAAa,cAAc,KAAK;AAEvD,MAAI,UACF,eAAc,CAAC,OAAO;AAExB,MAAI,aAAa,OACf,eAAc,MAAM;IAGxB,KACD;AAED,QAAO;;AAGT,MAAa,qBAAiC;CAC5C,MAAM;CACN,GAAG,MAAM;EACP,MAAM,EAAE,UAAU,OAAO,cAAc;EAEvC,IAAI,SAAS,GAAG,KAAK,MAAM,MAAM,UAAU,QAAQ,IAAI,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;EACnF,IAAI,SAAS,GAAG,KAAK,MAAM,MAAM,UAAU,SAAS,IAAI,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;AAEpF,MAAI,MAAM,UAAU,QAAQ,MAAM,SAAS,MACzC,UAAS,GAAG,KAAK,MAAM,MAAM,SAAS,QAAQ,EAAE,CAAC;AAGnD,MAAI,MAAM,UAAU,SAAS,MAAM,SAAS,OAC1C,UAAS,GAAG,KAAK,MAAM,MAAM,SAAS,SAAS,EAAE,CAAC;AAGpD,UAAQ,UAAU,MAAM,IAAI,CAAC,IAA7B;GACE,KAAK;AACH,aAAS;AACT;GACF,KAAK;AACH,aAAS;AACT;GACF,KAAK;AACH,aAAS;AACT;GACF,KAAK;AACH,aAAS;AACT;;AAGJ,WAAS,SAAS,aAAa,kBAAkB,UAAU,MAAM,IAAI,CAAC,GAAG;AACzE,WAAS,SAAS,MAAM,YAAY,yBAAyB,OAAO;AACpE,WAAS,SAAS,MAAM,YAAY,yBAAyB,OAAO;AACpE,SAAO;;CAEV"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"popover-Dqhgmd9j.mjs","names":["cl"],"sources":["../src/components/popover/popover.tsx"],"sourcesContent":["// Thanks to Designsystemet:\n// https://github.com/digdir/designsystemet/blob/8aa6dc274e5b0338d15572f44b5dd3fab6fa4eb1/packages/react/src/components/Popover/Popover.tsx\n\nimport { autoUpdate, computePosition, flip, offset, shift, hide } from '@floating-ui/dom';\nimport type { Middleware, Placement } from '@floating-ui/dom';\nimport { Slot } from '@radix-ui/react-slot';\nimport cl from 'clsx/lite';\nimport { use, useRef } from 'react';\nimport type { HTMLAttributes, Ref } from 'react';\nimport { useEffect } from 'react';\nimport type { DefaultProps } from '../../types';\nimport type { MergeRight } from '../../utilities';\nimport { useMergeRefs } from '../../utilities/hooks/useMergeRefs/useMergeRefs';\nimport { Context } from './popover-trigger-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport { arrowPseudoElement } from '../../vanilla/popover';\n\nexport type PopoverProps = MergeRight<\n DefaultProps & HTMLAttributes<HTMLDivElement>,\n {\n /**\n * `id` to connect the trigger with the popover - required when not using PopoverContext.\n */\n id?: string;\n /**\n * Placement of the popover on the trigger.\n * @default 'top'\n */\n placement?: Placement;\n /**\n * When a boolean is provided, the popover will be controlled.\n * @default undefined\n */\n open?: boolean;\n /**\n * Callback when the open state changes.\n * @param open - The new open state of the popover.\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Whether to disable auto placement.\n * @default false\n */\n disableAutoPlacement?: boolean;\n /**\n * Additional middleware to use for positioning the popover.\n *\n * @example\n * Prevent the popover from overflowing the navbar by using the `size` middleware:\n * ```ts\n * positionMiddleware={[\n * size({\n * apply: ({ availableHeight, elements, ...state }) => {\n * const available = `${Math.max(0, availableHeight)}px`;\n * const maxHeight = state.placement.includes('top')\n * ? `calc(${available} - var(--bi-layout-navbar-height, 0))`\n * : available;\n * elements.floating.style.maxHeight = maxHeight;\n * },\n * padding,\n * })\n * ]}\n * ```\n */\n positionMiddleware?: Middleware[];\n /**\n * The padding used by the `offset` middleware.\n * @default '20'\n */\n padding?: number;\n /**\n * Show an arrow on the popover, pointing toward the center of the reference element.\n * @default false\n */\n arrow?: boolean;\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n * @default false\n */\n asChild?: boolean;\n ref?: Ref<HTMLDivElement>;\n }\n>;\n\n/**\n * Popover component, used to display content in a popover over an element.\n *\n * @example with TriggerContext\n * <PopoverTriggerContext>\n * <PopoverTrigger>Open Popover</PopoverTrigger>\n * <Popover>\n * Content\n * </Popover>\n * </PopoverTriggerContext>\n *\n * @example without TriggerContext\n * <Button aria-controls=\"my-popover\" aria-expanded={open}>Open Popover</Button>\n * <Popover open={open} onOpenChange={onOpenChange} id=\"my-popover\">\n * Content\n * </Popover>\n */\nexport const Popover = ({\n id,\n className,\n onOpenChange,\n open,\n placement = 'top',\n disableAutoPlacement = false,\n positionMiddleware = [],\n padding = 20,\n dark = false,\n arrow = false,\n asChild = false,\n ref,\n ...rest\n}: PopoverProps) => {\n const Component = asChild ? Slot : 'div';\n\n const popoverRef = useRef<HTMLDivElement>(null);\n const isControlled = useRef(open !== undefined);\n const mergedRefs = useMergeRefs([popoverRef, ref]);\n const { popoverId, setPopoverId, popoverOpen, setPopoverOpen } = use(Context);\n\n const [isOpen, setIsOpen] = useControllableState({\n // False positive: isControlled will never change, but is just used to store the initial controlled state\n prop: isControlled.current ? open : popoverOpen,\n onChange: (val) => {\n onOpenChange?.(val);\n setPopoverOpen?.(val);\n },\n defaultProp: false,\n caller: 'Popover',\n });\n\n useEffect(() => {\n const popover = popoverRef.current;\n const handleClick = (event: MouseEvent) => {\n const el = event.target as Element | null;\n const isTrigger = el?.closest?.(`[aria-controls=\"${popover?.id}\"]`);\n const isOutside = !isTrigger && !popover?.contains(el as Node);\n\n if (isOutside) {\n setIsOpen(false);\n }\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !isOpen) return;\n event.preventDefault(); // Prevent closing fullscreen in Safari\n setIsOpen(false);\n };\n\n document.addEventListener('click', handleClick, true); // Use capture to execute before React event API\n document.addEventListener('keydown', handleKeydown);\n return () => {\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeydown);\n };\n }, [isOpen, setIsOpen]);\n\n useEffect(() => {\n const popover = popoverRef.current;\n const trigger = document.querySelector(`[aria-controls=\"${popover?.id}\"]`);\n\n if (popover && trigger && isOpen)\n return autoUpdate(trigger, popover, () => {\n computePosition(trigger, popover, {\n middleware: [\n offset(padding),\n ...(disableAutoPlacement ? [] : [flip({ padding }), shift({ padding })]),\n ...positionMiddleware,\n hide({ padding, strategy: 'escaped' }),\n ...(arrow ? [arrowPseudoElement] : []),\n ],\n strategy: 'fixed',\n placement,\n }).then(({ x, y, middlewareData }) => {\n popover.style.translate = `${x}px ${y}px`;\n popover.style.visibility = middlewareData.hide?.referenceHidden ? 'hidden' : 'visible';\n });\n });\n }, [isOpen, placement, id, disableAutoPlacement, positionMiddleware, padding, arrow]);\n\n // Update context with id\n useEffect(() => {\n if (id) setPopoverId?.(id);\n }, [id, setPopoverId]);\n\n return (\n <Component\n className={cl('bi-popover', className)}\n id={id || popoverId}\n aria-hidden={!isOpen}\n data-arrow={arrow || undefined}\n data-dark={dark}\n ref={mergedRefs}\n {...rest}\n />\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqGA,MAAa,WAAW,EACtB,IACA,WACA,cACA,MACA,YAAY,OACZ,uBAAuB,OACvB,qBAAqB,EAAE,EACvB,UAAU,IACV,OAAO,OACP,QAAQ,OACR,UAAU,OACV,KACA,GAAG,WACe;CAClB,MAAM,YAAY,UAAU,OAAO;CAEnC,MAAM,aAAa,OAAuB,KAAK;CAC/C,MAAM,eAAe,OAAO,SAAS,OAAU;CAC/C,MAAM,aAAa,aAAa,CAAC,YAAY,IAAI,CAAC;CAClD,MAAM,EAAE,WAAW,cAAc,aAAa,mBAAmB,IAAI,QAAQ;CAE7E,MAAM,CAAC,QAAQ,aAAa,qBAAqB;EAE/C,MAAM,aAAa,UAAU,OAAO;EACpC,WAAW,QAAQ;AACjB,kBAAe,IAAI;AACnB,oBAAiB,IAAI;;EAEvB,aAAa;EACb,QAAQ;EACT,CAAC;AAEF,iBAAgB;EACd,MAAM,UAAU,WAAW;EAC3B,MAAM,eAAe,UAAsB;GACzC,MAAM,KAAK,MAAM;AAIjB,OAFkB,CADA,IAAI,UAAU,mBAAmB,SAAS,GAAG,IAAI,IACnC,CAAC,SAAS,SAAS,GAAW,CAG5D,WAAU,MAAM;;EAIpB,MAAM,iBAAiB,UAAyB;AAC9C,OAAI,MAAM,QAAQ,YAAY,CAAC,OAAQ;AACvC,SAAM,gBAAgB;AACtB,aAAU,MAAM;;AAGlB,WAAS,iBAAiB,SAAS,aAAa,KAAK;AACrD,WAAS,iBAAiB,WAAW,cAAc;AACnD,eAAa;AACX,YAAS,oBAAoB,SAAS,aAAa,KAAK;AACxD,YAAS,oBAAoB,WAAW,cAAc;;IAEvD,CAAC,QAAQ,UAAU,CAAC;AAEvB,iBAAgB;EACd,MAAM,UAAU,WAAW;EAC3B,MAAM,UAAU,SAAS,cAAc,mBAAmB,SAAS,GAAG,IAAI;AAE1E,MAAI,WAAW,WAAW,OACxB,QAAO,WAAW,SAAS,eAAe;AACxC,mBAAgB,SAAS,SAAS;IAChC,YAAY;KACV,OAAO,QAAQ;KACf,GAAI,uBAAuB,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;KACvE,GAAG;KACH,KAAK;MAAE;MAAS,UAAU;MAAW,CAAC;KACtC,GAAI,QAAQ,CAAC,mBAAmB,GAAG,EAAE;KACtC;IACD,UAAU;IACV;IACD,CAAC,CAAC,MAAM,EAAE,GAAG,GAAG,qBAAqB;AACpC,YAAQ,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE;AACtC,YAAQ,MAAM,aAAa,eAAe,MAAM,kBAAkB,WAAW;KAC7E;IACF;IACH;EAAC;EAAQ;EAAW;EAAI;EAAsB;EAAoB;EAAS;EAAM,CAAC;AAGrF,iBAAgB;AACd,MAAI,GAAI,gBAAe,GAAG;IACzB,CAAC,IAAI,aAAa,CAAC;AAEtB,QACE,oBAAC;EACC,WAAWA,KAAG,cAAc,UAAU;EACtC,IAAI,MAAM;EACV,eAAa,CAAC;EACd,cAAY,SAAS;EACrB,aAAW;EACX,KAAK;EACL,GAAI;GACJ"}