@porsche-design-system/components-react 3.26.0-rc.0 → 3.27.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -14,6 +14,27 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0),
14
14
 
15
15
  ### [Unreleased]
16
16
 
17
+ ### [3.27.0-rc.0] - 2025-02-13
18
+
19
+ #### Added
20
+
21
+ - `@font-face` supports Thai language
22
+ ([#3750](https://github.com/porsche-design-system/porsche-design-system/pull/3750))
23
+ - Partials: `getFontLinks` supports preloading `thai` subset
24
+ ([#3750](https://github.com/porsche-design-system/porsche-design-system/pull/3750))
25
+
26
+ #### Changed
27
+
28
+ - `Popover`: gets rendered on `#top-layer` which enables it to be shown correctly even when used e.g. within a scroll
29
+ container ([#3732](https://github.com/porsche-design-system/porsche-design-system/pull/3732))
30
+
31
+ #### Removed
32
+
33
+ - `Popover`: default styling for slotted anchors
34
+ ([#3732](https://github.com/porsche-design-system/porsche-design-system/pull/3732))
35
+
36
+ ### [3.26.0] - 2025-02-07
37
+
17
38
  ### [3.26.0-rc.0] - 2025-02-06
18
39
 
19
40
  #### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@porsche-design-system/components-react",
3
- "version": "3.26.0-rc.0",
3
+ "version": "3.27.0-rc.0",
4
4
  "description": "Porsche Design System is a component library designed to help developers create the best experience for software or services distributed by Dr. Ing. h.c. F. Porsche AG.",
5
5
  "keywords": [
6
6
  "porsche",
@@ -17,7 +17,7 @@
17
17
  "license": "SEE LICENSE IN LICENSE",
18
18
  "homepage": "https://designsystem.porsche.com",
19
19
  "dependencies": {
20
- "@porsche-design-system/components-js": "3.26.0-rc.0"
20
+ "@porsche-design-system/components-js": "3.27.0-rc.0"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "ag-grid-community": ">= 32.0.0 <33.0.0",
@@ -129,7 +129,7 @@ function createRule(name, decl, options) {
129
129
  return null;
130
130
  }
131
131
 
132
- var join$1 = function join(value, by) {
132
+ var join = function join(value, by) {
133
133
  var result = '';
134
134
 
135
135
  for (var i = 0; i < value.length; i++) {
@@ -159,9 +159,9 @@ var toCssValue = function toCssValue(value) {
159
159
  for (var i = 0; i < value.length; i++) {
160
160
  if (value[i] === '!important') break;
161
161
  if (cssValue) cssValue += ', ';
162
- cssValue += join$1(value[i], ' ');
162
+ cssValue += join(value[i], ' ');
163
163
  }
164
- } else cssValue = join$1(value, ', '); // Add !important, because it was ignored.
164
+ } else cssValue = join(value, ', '); // Add !important, because it was ignored.
165
165
 
166
166
 
167
167
  if (value[value.length - 1] === '!important') {
@@ -4087,7 +4087,6 @@ const getComponentCss$1a = (size, compact, open, theme, sticky) => {
4087
4087
  };
4088
4088
 
4089
4089
  const TOAST_Z_INDEX = 999999;
4090
- const POPOVER_Z_INDEX = 9999;
4091
4090
  const BANNER_Z_INDEX = 99;
4092
4091
 
4093
4092
  const getBannerPopoverResetStyles = () => {
@@ -8858,116 +8857,20 @@ const getComponentCss$y = (hideLabel, state, isDisabled, isLoading, length, them
8858
8857
  });
8859
8858
  };
8860
8859
 
8861
- const safeZonePx = 16;
8860
+ const POPOVER_SAFE_ZONE = 8;
8862
8861
 
8863
- const { canvasColor, canvasTextColor } = getHighContrastColors();
8864
- const directionPositionMap = {
8865
- top: {
8866
- bottom: '100%',
8867
- left: '50%',
8868
- transform: 'translate3d(-50%, 0, 0)', // translate3d used to fix Safari shadow bug
8869
- },
8870
- right: {
8871
- top: '50%',
8872
- left: '100%',
8873
- transform: 'translate3d(0, -50%, 0)',
8874
- },
8875
- bottom: {
8876
- top: '100%',
8877
- left: '50%',
8878
- transform: 'translate3d(-50%, 0, 0)',
8879
- },
8880
- left: {
8881
- top: '50%',
8882
- right: '100%',
8883
- transform: 'translate3d(0, -50%, 0)',
8884
- },
8885
- };
8886
- const borderWidth = '12px';
8887
- const transparentColor = 'transparent';
8888
- const join = (...arr) => arr.join(' ');
8889
- const getDirectionArrowMap = (theme) => {
8890
- const { backgroundColor, backgroundSurfaceColor } = getThemedColors(theme);
8891
- const { backgroundSurfaceColor: backgroundSurfaceColorDark } = getThemedColors('dark');
8892
- const isDark = isThemeDark(theme);
8893
- return {
8894
- top: {
8895
- top: 0,
8896
- left: '50%',
8897
- transform: 'translateX(-50%)',
8898
- borderWidth: join(borderWidth, borderWidth, 0),
8899
- ...(isHighContrastMode
8900
- ? {
8901
- borderColor: join(canvasTextColor, canvasColor, canvasColor),
8902
- }
8903
- : {
8904
- borderColor: join(isDark ? backgroundSurfaceColor : backgroundColor, transparentColor, transparentColor),
8905
- ...prefersColorSchemeDarkMediaQuery(theme, {
8906
- borderColor: join(backgroundSurfaceColorDark, transparentColor, transparentColor),
8907
- }),
8908
- }),
8909
- },
8910
- right: {
8911
- top: '50%',
8912
- right: 0,
8913
- transform: 'translateY(-50%)',
8914
- borderWidth: join(borderWidth, borderWidth, borderWidth, 0),
8915
- ...(isHighContrastMode
8916
- ? {
8917
- borderColor: join(canvasColor, canvasTextColor, canvasColor, canvasColor),
8918
- }
8919
- : {
8920
- borderColor: join(transparentColor, isDark ? backgroundSurfaceColor : backgroundColor, transparentColor, transparentColor),
8921
- ...prefersColorSchemeDarkMediaQuery(theme, {
8922
- borderColor: join(transparentColor, backgroundSurfaceColorDark, transparentColor, transparentColor),
8923
- }),
8924
- }),
8925
- },
8926
- bottom: {
8927
- bottom: 0,
8928
- left: '50%',
8929
- transform: 'translateX(-50%)',
8930
- borderWidth: join(0, borderWidth, borderWidth),
8931
- ...(isHighContrastMode
8932
- ? {
8933
- borderColor: join(canvasColor, canvasColor, canvasTextColor),
8934
- }
8935
- : {
8936
- borderColor: join(transparentColor, transparentColor, isDark ? backgroundSurfaceColor : backgroundColor),
8937
- ...prefersColorSchemeDarkMediaQuery(theme, {
8938
- borderColor: join(transparentColor, transparentColor, backgroundSurfaceColorDark),
8939
- }),
8940
- }),
8941
- },
8942
- left: {
8943
- top: '50%',
8944
- left: 0,
8945
- transform: 'translateY(-50%)',
8946
- borderWidth: join(borderWidth, 0, borderWidth, borderWidth),
8947
- ...(isHighContrastMode
8948
- ? {
8949
- borderColor: join(canvasColor, canvasColor, canvasColor, canvasTextColor),
8950
- }
8951
- : {
8952
- borderColor: join(transparentColor, transparentColor, transparentColor, isDark ? backgroundSurfaceColor : backgroundColor),
8953
- ...prefersColorSchemeDarkMediaQuery(theme, {
8954
- borderColor: join(transparentColor, transparentColor, transparentColor, backgroundSurfaceColorDark),
8955
- }),
8956
- }),
8957
- },
8958
- };
8959
- };
8960
- const getComponentCss$x = (direction, isNativePopoverCase, theme) => {
8862
+ const { canvasTextColor } = getHighContrastColors();
8863
+ const getComponentCss$x = (theme) => {
8961
8864
  const { hoverColor, backgroundColor, primaryColor, backgroundSurfaceColor } = getThemedColors(theme);
8962
8865
  const { hoverColor: hoverColorDark, primaryColor: primaryColorDark, backgroundSurfaceColor: backgroundSurfaceColorDark, } = getThemedColors('dark');
8963
8866
  const shadowColor = 'rgba(0,0,0,0.3)';
8964
8867
  return getCss({
8965
8868
  '@global': {
8966
8869
  ':host': {
8870
+ position: 'relative', // ensures correct reference for floating ui fallback positioning in older browsers
8967
8871
  display: 'inline-block',
8968
8872
  verticalAlign: 'top',
8969
8873
  ...addImportantToEachRule({
8970
- position: 'relative',
8971
8874
  ...colorSchemeStyles,
8972
8875
  ...hostHiddenStyles,
8973
8876
  }),
@@ -8978,18 +8881,13 @@ const getComponentCss$x = (direction, isNativePopoverCase, theme) => {
8978
8881
  margin: 0,
8979
8882
  },
8980
8883
  button: {
8884
+ all: 'unset',
8981
8885
  display: 'block',
8982
- WebkitAppearance: 'none', // iOS safari
8983
- appearance: 'none',
8984
- background: 'transparent',
8985
- border: 0,
8986
- padding: 0,
8987
- cursor: 'pointer',
8988
- ...textSmallStyle,
8886
+ font: `${fontSizeTextSmall} ${fontFamily}`, // needed for correct width/height definition based on ex-unit
8989
8887
  width: fontLineHeight, // width needed to improve ssr support
8990
8888
  height: fontLineHeight, // height needed to improve ssr support
8991
8889
  borderRadius: '50%',
8992
- // TODO: we should try to use getHoverStyle()
8890
+ cursor: 'pointer',
8993
8891
  ...hoverMediaQuery({
8994
8892
  transition: getTransition('background-color'),
8995
8893
  '&:hover': {
@@ -9007,47 +8905,49 @@ const getComponentCss$x = (direction, isNativePopoverCase, theme) => {
9007
8905
  icon: {
9008
8906
  transform: 'translate3d(0,0,0)', // Fixes movement on hover in Safari
9009
8907
  },
9010
- spacer: {
9011
- ...(isNativePopoverCase
9012
- ? {
9013
- ...getPopoverResetJssStyle(),
9014
- }
9015
- : {
9016
- inset: `${-safeZonePx}px`,
9017
- }),
8908
+ popover: {
8909
+ all: 'unset',
9018
8910
  position: 'absolute',
9019
- zIndex: POPOVER_Z_INDEX,
9020
- filter: `drop-shadow(0 0 16px ${shadowColor})`,
9021
8911
  pointerEvents: 'none',
8912
+ filter: `drop-shadow(0 0 16px ${shadowColor})`,
9022
8913
  animation: `${motionDurationShort} $fadeIn ${motionEasingBase} forwards`
9023
8914
  ,
9024
- '&::before': {
9025
- content: '""',
9026
- position: 'absolute',
9027
- borderStyle: 'solid',
9028
- ...getDirectionArrowMap(theme)[direction],
8915
+ '&:not(:popover-open)': {
8916
+ display: 'none', // ensures popover is not flickering when closed in some situations
8917
+ },
8918
+ '&:-internal-popover-in-top-layer::backdrop': {
8919
+ display: 'none',
9029
8920
  },
9030
- ...prefersColorSchemeDarkMediaQuery(theme, {
9031
- filter: `drop-shadow(0 0 16px ${shadowColor})`,
9032
- }),
9033
8921
  },
9034
- popover: {
8922
+ arrow: {
9035
8923
  position: 'absolute',
9036
- maxWidth: 'min(90vw, 27rem)',
9037
- width: 'max-content',
8924
+ width: '24px',
8925
+ height: '12px',
8926
+ clipPath: 'polygon(50% 0, 100% 110%, 0 110%)',
8927
+ ...(isHighContrastMode
8928
+ ? {
8929
+ background: canvasTextColor,
8930
+ }
8931
+ : {
8932
+ background: isThemeDark(theme) ? backgroundSurfaceColor : backgroundColor,
8933
+ ...prefersColorSchemeDarkMediaQuery(theme, {
8934
+ background: backgroundSurfaceColorDark,
8935
+ }),
8936
+ }),
8937
+ },
8938
+ content: {
8939
+ maxWidth: `min(calc(100dvw - ${POPOVER_SAFE_ZONE * 2}px), 48ch)`,
8940
+ width: 'max-content', // ensures in older browsers correct width
9038
8941
  boxSizing: 'border-box',
9039
- background: isThemeDark(theme) ? backgroundSurfaceColor : backgroundColor,
9040
- padding: '8px 16px',
8942
+ padding: `${spacingStaticSmall} ${spacingStaticMedium}`,
9041
8943
  pointerEvents: 'auto',
9042
- ...directionPositionMap[direction],
9043
- ...textSmallStyle,
9044
- listStyleType: 'none',
9045
- color: primaryColor,
9046
- whiteSpace: 'inherit',
9047
8944
  borderRadius: borderRadiusSmall,
9048
8945
  ...(isHighContrastMode && {
9049
8946
  outline: `1px solid ${canvasTextColor}`,
9050
8947
  }),
8948
+ ...textSmallStyle,
8949
+ background: isThemeDark(theme) ? backgroundSurfaceColor : backgroundColor,
8950
+ color: primaryColor,
9051
8951
  ...prefersColorSchemeDarkMediaQuery(theme, {
9052
8952
  background: backgroundSurfaceColorDark,
9053
8953
  color: primaryColorDark,
@@ -129,7 +129,7 @@ function createRule(name, decl, options) {
129
129
  return null;
130
130
  }
131
131
 
132
- var join$1 = function join(value, by) {
132
+ var join = function join(value, by) {
133
133
  var result = '';
134
134
 
135
135
  for (var i = 0; i < value.length; i++) {
@@ -159,9 +159,9 @@ var toCssValue = function toCssValue(value) {
159
159
  for (var i = 0; i < value.length; i++) {
160
160
  if (value[i] === '!important') break;
161
161
  if (cssValue) cssValue += ', ';
162
- cssValue += join$1(value[i], ' ');
162
+ cssValue += join(value[i], ' ');
163
163
  }
164
- } else cssValue = join$1(value, ', '); // Add !important, because it was ignored.
164
+ } else cssValue = join(value, ', '); // Add !important, because it was ignored.
165
165
 
166
166
 
167
167
  if (value[value.length - 1] === '!important') {
@@ -3541,7 +3541,9 @@ const supportsNativePopover = () => {
3541
3541
  return Object.prototype.hasOwnProperty.call(HTMLElement.prototype, 'popover');
3542
3542
  };
3543
3543
  // determine it once
3544
- supportsNativePopover();
3544
+ const hasNativePopoverSupport = supportsNativePopover();
3545
+ // getter for easy mocking
3546
+ const getHasNativePopoverSupport = () => hasNativePopoverSupport;
3545
3547
 
3546
3548
  const hasDocument = typeof document !== 'undefined';
3547
3549
 
@@ -3936,6 +3938,7 @@ exports.getCurrentActivePage = getCurrentActivePage;
3936
3938
  exports.getDirectChildHTMLElement = getDirectChildHTMLElement;
3937
3939
  exports.getDisplayTagType = getDisplayTagType;
3938
3940
  exports.getHTMLElement = getHTMLElement;
3941
+ exports.getHasNativePopoverSupport = getHasNativePopoverSupport;
3939
3942
  exports.getHeadingTagType = getHeadingTagType;
3940
3943
  exports.getHeadlineTagType = getHeadlineTagType;
3941
3944
  exports.getIconColor = getIconColor;
@@ -7,6 +7,7 @@ var splitChildren = require('../../splitChildren.cjs');
7
7
  var minifyCss = require('../../minifyCss.cjs');
8
8
  var stripFocusAndHoverStyles = require('../../stripFocusAndHoverStyles.cjs');
9
9
  var stylesEntry = require('../../../../../../components/dist/styles/esm/styles-entry.cjs');
10
+ var utilsEntry = require('../../../../../../components/dist/utils/esm/utils-entry.cjs');
10
11
  var icon_wrapper = require('../components/icon.wrapper.cjs');
11
12
 
12
13
  /**
@@ -15,16 +16,18 @@ var icon_wrapper = require('../components/icon.wrapper.cjs');
15
16
  class DSRPopover extends react.Component {
16
17
  host;
17
18
  open = false;
18
- spacer;
19
19
  popover;
20
20
  button;
21
- isNativePopoverCase = false;
22
- parentTableElement;
21
+ arrow;
22
+ cleanUp;
23
+ hasNativePopoverSupport = utilsEntry.getHasNativePopoverSupport();
23
24
  render() {
24
25
  splitChildren.splitChildren(this.props.children);
25
- const style = minifyCss.minifyCss(stripFocusAndHoverStyles.stripFocusAndHoverStyles(stylesEntry.getPopoverCss(this.props.direction, this.props.isNativePopoverCase, this.props.theme).replace(/(:host {[\S\s]+?})[\S\s]+(button {[\S\s]+?})[\S\s]+(.icon {[\S\s]+?})[\S\s]+(.label {[\S\s]+?})[\S\s]+/, '$1\n$2\n$3\n$4')));
26
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("template", { shadowroot: "open", shadowrootmode: "open", shadowrootdelegatesfocus: "true", children: [jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: style } }), jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("button", { type: "button", ...(this.props.isNativePopoverCase ? { popoverTarget: 'spacer' } : { ...(!this.props.isNativePopoverCase && { 'aria-expanded': this.props.open }),
27
- }), children: [jsxRuntime.jsx(icon_wrapper.PIcon, { className: "icon", name: "information", theme: this.props.theme }), jsxRuntime.jsx("span", { className: "label", children: "More information" })] }), (this.props.open || this.props.isNativePopoverCase) && (jsxRuntime.jsx("div", { className: "spacer", ...(this.props.isNativePopoverCase && { popover: 'auto', id: 'spacer', onToggle: this.props.onToggle }), children: jsxRuntime.jsx("div", { className: "popover", children: this.props.description ? jsxRuntime.jsx("p", { children: this.props.description }) : jsxRuntime.jsx("slot", {}) }) }))] })] }), this.props.children] }));
26
+ const style = minifyCss.minifyCss(stripFocusAndHoverStyles.stripFocusAndHoverStyles(stylesEntry.getPopoverCss(this.props.theme).replace(/(:host {[\S\s]+?})[\S\s]+(button {[\S\s]+?})[\S\s]+(.icon {[\S\s]+?})[\S\s]+(.label {[\S\s]+?})[\S\s]+/, '$1\n$2\n$3\n$4')));
27
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("template", { shadowroot: "open", shadowrootmode: "open", children: [jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: style } }), jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("button", { type: "button", ...utilsEntry.parseAndGetAriaAttributes({
28
+ ...utilsEntry.parseAndGetAriaAttributes(this.props.aria),
29
+ ...{ 'aria-expanded': this.props.open },
30
+ }), children: [jsxRuntime.jsx(icon_wrapper.PIcon, { className: "icon", name: "information", theme: this.props.theme }), jsxRuntime.jsx("span", { className: "label", children: "More information" })] }), this.props.open && (jsxRuntime.jsxs("div", { className: "popover", popover: "auto", children: [jsxRuntime.jsx("div", { className: "arrow" }), jsxRuntime.jsx("div", { className: "content", children: this.props.description ? jsxRuntime.jsx("p", { children: this.props.description }) : jsxRuntime.jsx("slot", {}) })] }))] })] }), this.props.children] }));
28
31
  }
29
32
  }
30
33
 
@@ -127,7 +127,7 @@ function createRule(name, decl, options) {
127
127
  return null;
128
128
  }
129
129
 
130
- var join$1 = function join(value, by) {
130
+ var join = function join(value, by) {
131
131
  var result = '';
132
132
 
133
133
  for (var i = 0; i < value.length; i++) {
@@ -157,9 +157,9 @@ var toCssValue = function toCssValue(value) {
157
157
  for (var i = 0; i < value.length; i++) {
158
158
  if (value[i] === '!important') break;
159
159
  if (cssValue) cssValue += ', ';
160
- cssValue += join$1(value[i], ' ');
160
+ cssValue += join(value[i], ' ');
161
161
  }
162
- } else cssValue = join$1(value, ', '); // Add !important, because it was ignored.
162
+ } else cssValue = join(value, ', '); // Add !important, because it was ignored.
163
163
 
164
164
 
165
165
  if (value[value.length - 1] === '!important') {
@@ -4085,7 +4085,6 @@ const getComponentCss$1a = (size, compact, open, theme, sticky) => {
4085
4085
  };
4086
4086
 
4087
4087
  const TOAST_Z_INDEX = 999999;
4088
- const POPOVER_Z_INDEX = 9999;
4089
4088
  const BANNER_Z_INDEX = 99;
4090
4089
 
4091
4090
  const getBannerPopoverResetStyles = () => {
@@ -8856,116 +8855,20 @@ const getComponentCss$y = (hideLabel, state, isDisabled, isLoading, length, them
8856
8855
  });
8857
8856
  };
8858
8857
 
8859
- const safeZonePx = 16;
8858
+ const POPOVER_SAFE_ZONE = 8;
8860
8859
 
8861
- const { canvasColor, canvasTextColor } = getHighContrastColors();
8862
- const directionPositionMap = {
8863
- top: {
8864
- bottom: '100%',
8865
- left: '50%',
8866
- transform: 'translate3d(-50%, 0, 0)', // translate3d used to fix Safari shadow bug
8867
- },
8868
- right: {
8869
- top: '50%',
8870
- left: '100%',
8871
- transform: 'translate3d(0, -50%, 0)',
8872
- },
8873
- bottom: {
8874
- top: '100%',
8875
- left: '50%',
8876
- transform: 'translate3d(-50%, 0, 0)',
8877
- },
8878
- left: {
8879
- top: '50%',
8880
- right: '100%',
8881
- transform: 'translate3d(0, -50%, 0)',
8882
- },
8883
- };
8884
- const borderWidth = '12px';
8885
- const transparentColor = 'transparent';
8886
- const join = (...arr) => arr.join(' ');
8887
- const getDirectionArrowMap = (theme) => {
8888
- const { backgroundColor, backgroundSurfaceColor } = getThemedColors(theme);
8889
- const { backgroundSurfaceColor: backgroundSurfaceColorDark } = getThemedColors('dark');
8890
- const isDark = isThemeDark(theme);
8891
- return {
8892
- top: {
8893
- top: 0,
8894
- left: '50%',
8895
- transform: 'translateX(-50%)',
8896
- borderWidth: join(borderWidth, borderWidth, 0),
8897
- ...(isHighContrastMode
8898
- ? {
8899
- borderColor: join(canvasTextColor, canvasColor, canvasColor),
8900
- }
8901
- : {
8902
- borderColor: join(isDark ? backgroundSurfaceColor : backgroundColor, transparentColor, transparentColor),
8903
- ...prefersColorSchemeDarkMediaQuery(theme, {
8904
- borderColor: join(backgroundSurfaceColorDark, transparentColor, transparentColor),
8905
- }),
8906
- }),
8907
- },
8908
- right: {
8909
- top: '50%',
8910
- right: 0,
8911
- transform: 'translateY(-50%)',
8912
- borderWidth: join(borderWidth, borderWidth, borderWidth, 0),
8913
- ...(isHighContrastMode
8914
- ? {
8915
- borderColor: join(canvasColor, canvasTextColor, canvasColor, canvasColor),
8916
- }
8917
- : {
8918
- borderColor: join(transparentColor, isDark ? backgroundSurfaceColor : backgroundColor, transparentColor, transparentColor),
8919
- ...prefersColorSchemeDarkMediaQuery(theme, {
8920
- borderColor: join(transparentColor, backgroundSurfaceColorDark, transparentColor, transparentColor),
8921
- }),
8922
- }),
8923
- },
8924
- bottom: {
8925
- bottom: 0,
8926
- left: '50%',
8927
- transform: 'translateX(-50%)',
8928
- borderWidth: join(0, borderWidth, borderWidth),
8929
- ...(isHighContrastMode
8930
- ? {
8931
- borderColor: join(canvasColor, canvasColor, canvasTextColor),
8932
- }
8933
- : {
8934
- borderColor: join(transparentColor, transparentColor, isDark ? backgroundSurfaceColor : backgroundColor),
8935
- ...prefersColorSchemeDarkMediaQuery(theme, {
8936
- borderColor: join(transparentColor, transparentColor, backgroundSurfaceColorDark),
8937
- }),
8938
- }),
8939
- },
8940
- left: {
8941
- top: '50%',
8942
- left: 0,
8943
- transform: 'translateY(-50%)',
8944
- borderWidth: join(borderWidth, 0, borderWidth, borderWidth),
8945
- ...(isHighContrastMode
8946
- ? {
8947
- borderColor: join(canvasColor, canvasColor, canvasColor, canvasTextColor),
8948
- }
8949
- : {
8950
- borderColor: join(transparentColor, transparentColor, transparentColor, isDark ? backgroundSurfaceColor : backgroundColor),
8951
- ...prefersColorSchemeDarkMediaQuery(theme, {
8952
- borderColor: join(transparentColor, transparentColor, transparentColor, backgroundSurfaceColorDark),
8953
- }),
8954
- }),
8955
- },
8956
- };
8957
- };
8958
- const getComponentCss$x = (direction, isNativePopoverCase, theme) => {
8860
+ const { canvasTextColor } = getHighContrastColors();
8861
+ const getComponentCss$x = (theme) => {
8959
8862
  const { hoverColor, backgroundColor, primaryColor, backgroundSurfaceColor } = getThemedColors(theme);
8960
8863
  const { hoverColor: hoverColorDark, primaryColor: primaryColorDark, backgroundSurfaceColor: backgroundSurfaceColorDark, } = getThemedColors('dark');
8961
8864
  const shadowColor = 'rgba(0,0,0,0.3)';
8962
8865
  return getCss({
8963
8866
  '@global': {
8964
8867
  ':host': {
8868
+ position: 'relative', // ensures correct reference for floating ui fallback positioning in older browsers
8965
8869
  display: 'inline-block',
8966
8870
  verticalAlign: 'top',
8967
8871
  ...addImportantToEachRule({
8968
- position: 'relative',
8969
8872
  ...colorSchemeStyles,
8970
8873
  ...hostHiddenStyles,
8971
8874
  }),
@@ -8976,18 +8879,13 @@ const getComponentCss$x = (direction, isNativePopoverCase, theme) => {
8976
8879
  margin: 0,
8977
8880
  },
8978
8881
  button: {
8882
+ all: 'unset',
8979
8883
  display: 'block',
8980
- WebkitAppearance: 'none', // iOS safari
8981
- appearance: 'none',
8982
- background: 'transparent',
8983
- border: 0,
8984
- padding: 0,
8985
- cursor: 'pointer',
8986
- ...textSmallStyle,
8884
+ font: `${fontSizeTextSmall} ${fontFamily}`, // needed for correct width/height definition based on ex-unit
8987
8885
  width: fontLineHeight, // width needed to improve ssr support
8988
8886
  height: fontLineHeight, // height needed to improve ssr support
8989
8887
  borderRadius: '50%',
8990
- // TODO: we should try to use getHoverStyle()
8888
+ cursor: 'pointer',
8991
8889
  ...hoverMediaQuery({
8992
8890
  transition: getTransition('background-color'),
8993
8891
  '&:hover': {
@@ -9005,47 +8903,49 @@ const getComponentCss$x = (direction, isNativePopoverCase, theme) => {
9005
8903
  icon: {
9006
8904
  transform: 'translate3d(0,0,0)', // Fixes movement on hover in Safari
9007
8905
  },
9008
- spacer: {
9009
- ...(isNativePopoverCase
9010
- ? {
9011
- ...getPopoverResetJssStyle(),
9012
- }
9013
- : {
9014
- inset: `${-safeZonePx}px`,
9015
- }),
8906
+ popover: {
8907
+ all: 'unset',
9016
8908
  position: 'absolute',
9017
- zIndex: POPOVER_Z_INDEX,
9018
- filter: `drop-shadow(0 0 16px ${shadowColor})`,
9019
8909
  pointerEvents: 'none',
8910
+ filter: `drop-shadow(0 0 16px ${shadowColor})`,
9020
8911
  animation: `${motionDurationShort} $fadeIn ${motionEasingBase} forwards`
9021
8912
  ,
9022
- '&::before': {
9023
- content: '""',
9024
- position: 'absolute',
9025
- borderStyle: 'solid',
9026
- ...getDirectionArrowMap(theme)[direction],
8913
+ '&:not(:popover-open)': {
8914
+ display: 'none', // ensures popover is not flickering when closed in some situations
8915
+ },
8916
+ '&:-internal-popover-in-top-layer::backdrop': {
8917
+ display: 'none',
9027
8918
  },
9028
- ...prefersColorSchemeDarkMediaQuery(theme, {
9029
- filter: `drop-shadow(0 0 16px ${shadowColor})`,
9030
- }),
9031
8919
  },
9032
- popover: {
8920
+ arrow: {
9033
8921
  position: 'absolute',
9034
- maxWidth: 'min(90vw, 27rem)',
9035
- width: 'max-content',
8922
+ width: '24px',
8923
+ height: '12px',
8924
+ clipPath: 'polygon(50% 0, 100% 110%, 0 110%)',
8925
+ ...(isHighContrastMode
8926
+ ? {
8927
+ background: canvasTextColor,
8928
+ }
8929
+ : {
8930
+ background: isThemeDark(theme) ? backgroundSurfaceColor : backgroundColor,
8931
+ ...prefersColorSchemeDarkMediaQuery(theme, {
8932
+ background: backgroundSurfaceColorDark,
8933
+ }),
8934
+ }),
8935
+ },
8936
+ content: {
8937
+ maxWidth: `min(calc(100dvw - ${POPOVER_SAFE_ZONE * 2}px), 48ch)`,
8938
+ width: 'max-content', // ensures in older browsers correct width
9036
8939
  boxSizing: 'border-box',
9037
- background: isThemeDark(theme) ? backgroundSurfaceColor : backgroundColor,
9038
- padding: '8px 16px',
8940
+ padding: `${spacingStaticSmall} ${spacingStaticMedium}`,
9039
8941
  pointerEvents: 'auto',
9040
- ...directionPositionMap[direction],
9041
- ...textSmallStyle,
9042
- listStyleType: 'none',
9043
- color: primaryColor,
9044
- whiteSpace: 'inherit',
9045
8942
  borderRadius: borderRadiusSmall,
9046
8943
  ...(isHighContrastMode && {
9047
8944
  outline: `1px solid ${canvasTextColor}`,
9048
8945
  }),
8946
+ ...textSmallStyle,
8947
+ background: isThemeDark(theme) ? backgroundSurfaceColor : backgroundColor,
8948
+ color: primaryColor,
9049
8949
  ...prefersColorSchemeDarkMediaQuery(theme, {
9050
8950
  background: backgroundSurfaceColorDark,
9051
8951
  color: primaryColorDark,
@@ -127,7 +127,7 @@ function createRule(name, decl, options) {
127
127
  return null;
128
128
  }
129
129
 
130
- var join$1 = function join(value, by) {
130
+ var join = function join(value, by) {
131
131
  var result = '';
132
132
 
133
133
  for (var i = 0; i < value.length; i++) {
@@ -157,9 +157,9 @@ var toCssValue = function toCssValue(value) {
157
157
  for (var i = 0; i < value.length; i++) {
158
158
  if (value[i] === '!important') break;
159
159
  if (cssValue) cssValue += ', ';
160
- cssValue += join$1(value[i], ' ');
160
+ cssValue += join(value[i], ' ');
161
161
  }
162
- } else cssValue = join$1(value, ', '); // Add !important, because it was ignored.
162
+ } else cssValue = join(value, ', '); // Add !important, because it was ignored.
163
163
 
164
164
 
165
165
  if (value[value.length - 1] === '!important') {
@@ -3539,7 +3539,9 @@ const supportsNativePopover = () => {
3539
3539
  return Object.prototype.hasOwnProperty.call(HTMLElement.prototype, 'popover');
3540
3540
  };
3541
3541
  // determine it once
3542
- supportsNativePopover();
3542
+ const hasNativePopoverSupport = supportsNativePopover();
3543
+ // getter for easy mocking
3544
+ const getHasNativePopoverSupport = () => hasNativePopoverSupport;
3543
3545
 
3544
3546
  const hasDocument = typeof document !== 'undefined';
3545
3547
 
@@ -3906,4 +3908,4 @@ const getTextTagType = (host, tag) => {
3906
3908
  return tag;
3907
3909
  };
3908
3910
 
3909
- export { DISPLAY_TAGS, HEADING_TAGS, HEADLINE_TAGS, ItemType, TEXT_TAGS, _hasShowPickerSupport, anchorSlot, attributeMutationMap, buildCrestImgSrc, buildCrestSrcSet, buildIconUrl, buildImgSrc, buildSrcSet, createPaginationItems, createRange, crestSize, debounce, displaySizeToTagMap, getButtonAriaAttributes, getButtonBaseAriaAttributes, getButtonPureAriaAttributes, getCDNBaseURL, getClosestHTMLElement, getComboboxAriaAttributes, getContentAriaAttributes, getCurrentActivePage, getDirectChildHTMLElement, getDisplayTagType, getHTMLElement, getHeadingTagType, getHeadlineTagType, getIconColor, getInlineNotificationIconName, getInnerManifest, getListAriaAttributes, getOptionAriaAttributes, getRole, getSegmentedControlItemAriaAttributes, getSelectedOptionMap, getSelectedOptionString, getSelectedOptionValues, getSelectedOptions, getStepperHorizontalIconName, getSvgUrl, getSwitchButtonAriaAttributes, getTagName, getTagNameWithoutPrefix, getTextTagType, getTotalPages, hasDocument, hasLocateAction, hasSpecificDirectChildTag, hasVisibleIcon, hasWindow, headerSlot, isCurrentInput, isCustomDropdown, isDisabledOrLoading, isElementOfKind, isInfinitePagination, isListTypeOrdered, isScrollable, isSortable, isStateCompleteOrWarning, isTouchDevice, isType, isUrl, isWithinForm, observedNodesMap, parseAndGetAriaAttributes, parseJSONAttribute, scrollAreaClass, showCustomCalendarOrTimeIndicator, supportsConstructableStylesheets, supportsNativePopover, tempDiv, tempIcon, tempLabel, traverseTreeAndUpdateState, updateFlyoutMultiLevelItemState };
3911
+ export { DISPLAY_TAGS, HEADING_TAGS, HEADLINE_TAGS, ItemType, TEXT_TAGS, _hasShowPickerSupport, anchorSlot, attributeMutationMap, buildCrestImgSrc, buildCrestSrcSet, buildIconUrl, buildImgSrc, buildSrcSet, createPaginationItems, createRange, crestSize, debounce, displaySizeToTagMap, getButtonAriaAttributes, getButtonBaseAriaAttributes, getButtonPureAriaAttributes, getCDNBaseURL, getClosestHTMLElement, getComboboxAriaAttributes, getContentAriaAttributes, getCurrentActivePage, getDirectChildHTMLElement, getDisplayTagType, getHTMLElement, getHasNativePopoverSupport, getHeadingTagType, getHeadlineTagType, getIconColor, getInlineNotificationIconName, getInnerManifest, getListAriaAttributes, getOptionAriaAttributes, getRole, getSegmentedControlItemAriaAttributes, getSelectedOptionMap, getSelectedOptionString, getSelectedOptionValues, getSelectedOptions, getStepperHorizontalIconName, getSvgUrl, getSwitchButtonAriaAttributes, getTagName, getTagNameWithoutPrefix, getTextTagType, getTotalPages, hasDocument, hasLocateAction, hasSpecificDirectChildTag, hasVisibleIcon, hasWindow, headerSlot, isCurrentInput, isCustomDropdown, isDisabledOrLoading, isElementOfKind, isInfinitePagination, isListTypeOrdered, isScrollable, isSortable, isStateCompleteOrWarning, isTouchDevice, isType, isUrl, isWithinForm, observedNodesMap, parseAndGetAriaAttributes, parseJSONAttribute, scrollAreaClass, showCustomCalendarOrTimeIndicator, supportsConstructableStylesheets, supportsNativePopover, tempDiv, tempIcon, tempLabel, traverseTreeAndUpdateState, updateFlyoutMultiLevelItemState };
@@ -5,6 +5,7 @@ import { splitChildren } from '../../splitChildren.mjs';
5
5
  import { minifyCss } from '../../minifyCss.mjs';
6
6
  import { stripFocusAndHoverStyles } from '../../stripFocusAndHoverStyles.mjs';
7
7
  import { getPopoverCss as getComponentCss$x } from '../../../../../../components/dist/styles/esm/styles-entry.mjs';
8
+ import { getHasNativePopoverSupport, parseAndGetAriaAttributes } from '../../../../../../components/dist/utils/esm/utils-entry.mjs';
8
9
  import { PIcon } from '../components/icon.wrapper.mjs';
9
10
 
10
11
  /**
@@ -13,16 +14,18 @@ import { PIcon } from '../components/icon.wrapper.mjs';
13
14
  class DSRPopover extends Component {
14
15
  host;
15
16
  open = false;
16
- spacer;
17
17
  popover;
18
18
  button;
19
- isNativePopoverCase = false;
20
- parentTableElement;
19
+ arrow;
20
+ cleanUp;
21
+ hasNativePopoverSupport = getHasNativePopoverSupport();
21
22
  render() {
22
23
  splitChildren(this.props.children);
23
- const style = minifyCss(stripFocusAndHoverStyles(getComponentCss$x(this.props.direction, this.props.isNativePopoverCase, this.props.theme).replace(/(:host {[\S\s]+?})[\S\s]+(button {[\S\s]+?})[\S\s]+(.icon {[\S\s]+?})[\S\s]+(.label {[\S\s]+?})[\S\s]+/, '$1\n$2\n$3\n$4')));
24
- return (jsxs(Fragment, { children: [jsxs("template", { shadowroot: "open", shadowrootmode: "open", shadowrootdelegatesfocus: "true", children: [jsx("style", { dangerouslySetInnerHTML: { __html: style } }), jsxs(Fragment, { children: [jsxs("button", { type: "button", ...(this.props.isNativePopoverCase ? { popoverTarget: 'spacer' } : { ...(!this.props.isNativePopoverCase && { 'aria-expanded': this.props.open }),
25
- }), children: [jsx(PIcon, { className: "icon", name: "information", theme: this.props.theme }), jsx("span", { className: "label", children: "More information" })] }), (this.props.open || this.props.isNativePopoverCase) && (jsx("div", { className: "spacer", ...(this.props.isNativePopoverCase && { popover: 'auto', id: 'spacer', onToggle: this.props.onToggle }), children: jsx("div", { className: "popover", children: this.props.description ? jsx("p", { children: this.props.description }) : jsx("slot", {}) }) }))] })] }), this.props.children] }));
24
+ const style = minifyCss(stripFocusAndHoverStyles(getComponentCss$x(this.props.theme).replace(/(:host {[\S\s]+?})[\S\s]+(button {[\S\s]+?})[\S\s]+(.icon {[\S\s]+?})[\S\s]+(.label {[\S\s]+?})[\S\s]+/, '$1\n$2\n$3\n$4')));
25
+ return (jsxs(Fragment, { children: [jsxs("template", { shadowroot: "open", shadowrootmode: "open", children: [jsx("style", { dangerouslySetInnerHTML: { __html: style } }), jsxs(Fragment, { children: [jsxs("button", { type: "button", ...parseAndGetAriaAttributes({
26
+ ...parseAndGetAriaAttributes(this.props.aria),
27
+ ...{ 'aria-expanded': this.props.open },
28
+ }), children: [jsx(PIcon, { className: "icon", name: "information", theme: this.props.theme }), jsx("span", { className: "label", children: "More information" })] }), this.props.open && (jsxs("div", { className: "popover", popover: "auto", children: [jsx("div", { className: "arrow" }), jsx("div", { className: "content", children: this.props.description ? jsx("p", { children: this.props.description }) : jsx("slot", {}) })] }))] })] }), this.props.children] }));
26
29
  }
27
30
  }
28
31
 
@@ -5,10 +5,10 @@ import { Component } from 'react';
5
5
  export declare class DSRPopover extends Component<any> {
6
6
  host: HTMLElement;
7
7
  private open;
8
- private spacer;
9
8
  private popover;
10
9
  private button;
11
- private isNativePopoverCase;
12
- private parentTableElement;
10
+ private arrow;
11
+ private cleanUp;
12
+ private hasNativePopoverSupport;
13
13
  render(): JSX.Element;
14
14
  }