@primer/behaviors 0.0.0-20250711042215 → 0.0.0-20250801034520

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.
@@ -6,6 +6,7 @@ export interface PositionSettings {
6
6
  anchorOffset: number;
7
7
  alignmentOffset: number;
8
8
  allowOutOfBounds: boolean;
9
+ enableAnchoredPositionViewportFix?: boolean;
9
10
  }
10
11
  export interface AnchorPosition {
11
12
  top: number;
@@ -75,9 +75,7 @@ function getClippingRect(element) {
75
75
  top: elemRect.top + borderTop,
76
76
  left: elemRect.left + borderLeft,
77
77
  width: elemRect.width - borderRight - borderLeft,
78
- height: clippingNode === document.body
79
- ? window.innerHeight
80
- : Math.max(elemRect.height - borderTop - borderBottom, -Infinity),
78
+ height: Math.max(elemRect.height - borderTop - borderBottom, clippingNode === document.body ? window.innerHeight : -Infinity),
81
79
  };
82
80
  }
83
81
  const positionDefaults = {
@@ -86,9 +84,10 @@ const positionDefaults = {
86
84
  anchorOffset: 4,
87
85
  alignmentOffset: 4,
88
86
  allowOutOfBounds: false,
87
+ enableAnchoredPositionViewportFix: false,
89
88
  };
90
89
  function getDefaultSettings(settings = {}) {
91
- var _a, _b, _c, _d, _e;
90
+ var _a, _b, _c, _d, _e, _f;
92
91
  const side = (_a = settings.side) !== null && _a !== void 0 ? _a : positionDefaults.side;
93
92
  const align = (_b = settings.align) !== null && _b !== void 0 ? _b : positionDefaults.align;
94
93
  return {
@@ -97,15 +96,26 @@ function getDefaultSettings(settings = {}) {
97
96
  anchorOffset: (_c = settings.anchorOffset) !== null && _c !== void 0 ? _c : (side === 'inside-center' ? 0 : positionDefaults.anchorOffset),
98
97
  alignmentOffset: (_d = settings.alignmentOffset) !== null && _d !== void 0 ? _d : (align !== 'center' && side.startsWith('inside') ? positionDefaults.alignmentOffset : 0),
99
98
  allowOutOfBounds: (_e = settings.allowOutOfBounds) !== null && _e !== void 0 ? _e : positionDefaults.allowOutOfBounds,
99
+ enableAnchoredPositionViewportFix: (_f = settings.enableAnchoredPositionViewportFix) !== null && _f !== void 0 ? _f : positionDefaults.enableAnchoredPositionViewportFix,
100
100
  };
101
101
  }
102
- function pureCalculateAnchoredPosition(viewportRect, relativePosition, floatingRect, anchorRect, { side, align, allowOutOfBounds, anchorOffset, alignmentOffset }) {
103
- const relativeViewportRect = {
102
+ function pureCalculateAnchoredPosition(viewportRect, relativePosition, floatingRect, anchorRect, { side, align, allowOutOfBounds, anchorOffset, alignmentOffset, enableAnchoredPositionViewportFix }) {
103
+ let relativeViewportRect = {
104
104
  top: viewportRect.top - relativePosition.top,
105
105
  left: viewportRect.left - relativePosition.left,
106
106
  width: viewportRect.width,
107
107
  height: viewportRect.height,
108
108
  };
109
+ if (enableAnchoredPositionViewportFix) {
110
+ const scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
111
+ const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0;
112
+ relativeViewportRect = {
113
+ top: scrollTop - relativePosition.top,
114
+ left: scrollLeft - relativePosition.left,
115
+ width: window.innerWidth || document.documentElement.clientWidth,
116
+ height: window.innerHeight || document.documentElement.clientHeight,
117
+ };
118
+ }
109
119
  let pos = calculatePosition(floatingRect, anchorRect, side, align, anchorOffset, alignmentOffset);
110
120
  let anchorSide = side;
111
121
  let anchorAlign = align;
@@ -6,6 +6,7 @@ export interface PositionSettings {
6
6
  anchorOffset: number;
7
7
  alignmentOffset: number;
8
8
  allowOutOfBounds: boolean;
9
+ enableAnchoredPositionViewportFix?: boolean;
9
10
  }
10
11
  export interface AnchorPosition {
11
12
  top: number;
@@ -73,9 +73,7 @@ function getClippingRect(element) {
73
73
  top: elemRect.top + borderTop,
74
74
  left: elemRect.left + borderLeft,
75
75
  width: elemRect.width - borderRight - borderLeft,
76
- height: clippingNode === document.body
77
- ? window.innerHeight
78
- : Math.max(elemRect.height - borderTop - borderBottom, -Infinity),
76
+ height: Math.max(elemRect.height - borderTop - borderBottom, clippingNode === document.body ? window.innerHeight : -Infinity),
79
77
  };
80
78
  }
81
79
  const positionDefaults = {
@@ -84,9 +82,10 @@ const positionDefaults = {
84
82
  anchorOffset: 4,
85
83
  alignmentOffset: 4,
86
84
  allowOutOfBounds: false,
85
+ enableAnchoredPositionViewportFix: false,
87
86
  };
88
87
  function getDefaultSettings(settings = {}) {
89
- var _a, _b, _c, _d, _e;
88
+ var _a, _b, _c, _d, _e, _f;
90
89
  const side = (_a = settings.side) !== null && _a !== void 0 ? _a : positionDefaults.side;
91
90
  const align = (_b = settings.align) !== null && _b !== void 0 ? _b : positionDefaults.align;
92
91
  return {
@@ -95,15 +94,26 @@ function getDefaultSettings(settings = {}) {
95
94
  anchorOffset: (_c = settings.anchorOffset) !== null && _c !== void 0 ? _c : (side === 'inside-center' ? 0 : positionDefaults.anchorOffset),
96
95
  alignmentOffset: (_d = settings.alignmentOffset) !== null && _d !== void 0 ? _d : (align !== 'center' && side.startsWith('inside') ? positionDefaults.alignmentOffset : 0),
97
96
  allowOutOfBounds: (_e = settings.allowOutOfBounds) !== null && _e !== void 0 ? _e : positionDefaults.allowOutOfBounds,
97
+ enableAnchoredPositionViewportFix: (_f = settings.enableAnchoredPositionViewportFix) !== null && _f !== void 0 ? _f : positionDefaults.enableAnchoredPositionViewportFix,
98
98
  };
99
99
  }
100
- function pureCalculateAnchoredPosition(viewportRect, relativePosition, floatingRect, anchorRect, { side, align, allowOutOfBounds, anchorOffset, alignmentOffset }) {
101
- const relativeViewportRect = {
100
+ function pureCalculateAnchoredPosition(viewportRect, relativePosition, floatingRect, anchorRect, { side, align, allowOutOfBounds, anchorOffset, alignmentOffset, enableAnchoredPositionViewportFix }) {
101
+ let relativeViewportRect = {
102
102
  top: viewportRect.top - relativePosition.top,
103
103
  left: viewportRect.left - relativePosition.left,
104
104
  width: viewportRect.width,
105
105
  height: viewportRect.height,
106
106
  };
107
+ if (enableAnchoredPositionViewportFix) {
108
+ const scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
109
+ const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0;
110
+ relativeViewportRect = {
111
+ top: scrollTop - relativePosition.top,
112
+ left: scrollLeft - relativePosition.left,
113
+ width: window.innerWidth || document.documentElement.clientWidth,
114
+ height: window.innerHeight || document.documentElement.clientHeight,
115
+ };
116
+ }
107
117
  let pos = calculatePosition(floatingRect, anchorRect, side, align, anchorOffset, alignmentOffset);
108
118
  let anchorSide = side;
109
119
  let anchorAlign = align;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primer/behaviors",
3
- "version": "0.0.0-20250711042215",
3
+ "version": "0.0.0-20250801034520",
4
4
  "description": "Shared behaviors for JavaScript components",
5
5
  "type": "commonjs",
6
6
  "main": "dist/cjs/index.js",