@porsche-design-system/components-react 4.4.0-rc.1 → 4.5.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,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0),
14
14
 
15
15
  ## [Unreleased]
16
16
 
17
+ ## [4.5.0-rc.0] - 2026-07-17
18
+
19
+ ### Changed
20
+
21
+ - `AG Grid`: Bumped peer dependency to support AG Grid new major version 36
22
+ ([#4553](https://github.com/porsche-design-system/porsche-design-system/pull/4553))
23
+ - `Popover`: Aligned shadowed popover trigger button style with button-pure
24
+ ([#4596](https://github.com/porsche-design-system/porsche-design-system/pull/4596))
25
+
26
+ ### Fixed
27
+
28
+ - `Popover`: A `margin` set on the host is now applied to the shadowed trigger button
29
+ ([#4596](https://github.com/porsche-design-system/porsche-design-system/pull/4596))
30
+
31
+ ## [4.4.0] - 2026-07-15
32
+
17
33
  ## [4.4.0-rc.1] - 2026-07-10
18
34
 
19
35
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@porsche-design-system/components-react",
3
- "version": "4.4.0-rc.1",
3
+ "version": "4.5.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",
@@ -21,12 +21,12 @@
21
21
  "url": "https://github.com/porsche-design-system/porsche-design-system"
22
22
  },
23
23
  "dependencies": {
24
- "@porsche-design-system/components-js": "4.4.0-rc.1"
24
+ "@porsche-design-system/components-js": "4.5.0-rc.0"
25
25
  },
26
26
  "peerDependencies": {
27
- "ag-grid-community": ">= 35.0.0 <36.0.0",
28
- "ag-grid-enterprise": ">= 35.0.0 <36.0.0",
29
- "ag-grid-react": ">= 35.0.0 <36.0.0",
27
+ "ag-grid-community": ">= 36.0.0 <37.0.0",
28
+ "ag-grid-enterprise": ">= 36.0.0 <37.0.0",
29
+ "ag-grid-react": ">= 36.0.0 <37.0.0",
30
30
  "react": ">=19.0.0 <20.0.0",
31
31
  "react-dom": ">=19.0.0 <20.0.0",
32
32
  "tailwindcss": ">= 4.0.0 <5.0.0"
@@ -3849,7 +3849,7 @@ const OPTION_LIST_SAFE_ZONE = 6;
3849
3849
 
3850
3850
  const getCDNBaseURL = () => global.PORSCHE_DESIGN_SYSTEM_CDN_URL + "/porsche-design-system";
3851
3851
 
3852
- const prefix = `[Porsche Design System v${"4.4.0-rc.1"}]` // this part isn't covered by unit tests
3852
+ const prefix = `[Porsche Design System v${"4.5.0-rc.0"}]` // this part isn't covered by unit tests
3853
3853
  ;
3854
3854
  const consoleError = (...messages) => {
3855
3855
  console.error(prefix, ...messages);
@@ -5751,8 +5751,6 @@ const getFunctionalComponentLabelAfterStyles = () => {
5751
5751
  // last line. `:host(:has([slot="label-after"]))` would be an alternative but lacks reliable Chrome support for now.
5752
5752
  '&::slotted(*)': {
5753
5753
  ...addImportantToEachRule({
5754
- display: 'inline-block',
5755
- verticalAlign: 'top',
5756
5754
  marginInlineStart: ref(spacingStaticXs$1),
5757
5755
  }),
5758
5756
  },
@@ -8442,6 +8440,13 @@ const getComponentCss$w = (hideLabel, state, isDisabled, isLoading, length, isCo
8442
8440
  // Minimum gap (in px) kept between the panel and the viewport edges. Used both as Floating UI `shift`/`flip` padding
8443
8441
  // and to inset the panel's default max-width/height (`100dvw/dvh - 2 * POPOVER_SAFE_ZONE`) so it never touches the edge.
8444
8442
  const POPOVER_SAFE_ZONE = 8;
8443
+ // Arrow geometry (in px), single source of truth shared by the JSS `.arrow` rule (`popover-styles.ts`) and the
8444
+ // runtime positioning/orientation logic (`popover.tsx`). Named by geometry rather than `width`/`height` because the
8445
+ // arrow is rotated per placement, so its rendered CSS `width`/`height` swap depending on the panel edge it attaches to.
8446
+ // - `POPOVER_ARROW_BASE`: length of the triangle's base along the panel edge.
8447
+ // - `POPOVER_ARROW_THICKNESS`: depth of the triangle perpendicular to the panel edge (how far it protrudes).
8448
+ const POPOVER_ARROW_BASE = 24;
8449
+ const POPOVER_ARROW_THICKNESS = 12;
8445
8450
 
8446
8451
  /**
8447
8452
  * @css-variable {"name": "--p-popover-w", "description": "Width of the popover.", "defaultValue": "max-content"}
@@ -8472,7 +8477,7 @@ const cssVariableMaxHeight = '--p-popover-max-h';
8472
8477
  */
8473
8478
  const cssVarPaddingInline = '--p-popover-px';
8474
8479
  /**
8475
- * @css-variable {"name": "--p-popover-py", "description": "Vertical padding of the popover. It is recommended to apply an existing Porsche Design System spacing token, e.g. the CSS declaration `--p-popover-py: var(--p-spacing-static-sm)`, the Tailwind CSS arbitrary property `[--p-popover-py:var(--spacing-static-sm)]` or the equivalent SCSS/JS token.", "defaultValue": "12px"}
8480
+ * @css-variable {"name": "--p-popover-py", "description": "Vertical padding of the popover. It is recommended to apply an existing Porsche Design System spacing token, e.g. the CSS declaration `--p-popover-py: var(--p-spacing-static-sm)`, the Tailwind CSS arbitrary property `[--p-popover-py:var(--spacing-static-sm)]` or the equivalent SCSS/JS token.", "defaultValue": "16px"}
8476
8481
  */
8477
8482
  const cssVarPaddingBlock = '--p-popover-py';
8478
8483
  /**
@@ -8505,6 +8510,9 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8505
8510
  // flow. Enabled by anchoring Floating UI to the assigned trigger element (see `triggerElement` in popover.tsx)
8506
8511
  // instead of the `<slot>` box, so the slot no longer needs a layout box of its own.
8507
8512
  display: 'contents',
8513
+ // Explicit baseline (matches the `margin` initial value) that the trigger button inherits via `margin: inherit`.
8514
+ // A consumer margin on the host (`p-popover { margin: … }`) overrides this and thus flows through to the button.
8515
+ margin: '0',
8508
8516
  ...addImportantToEachRule(hostHiddenStyles),
8509
8517
  },
8510
8518
  'slot:not([name]), p': {
@@ -8515,36 +8523,50 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8515
8523
  maxWidth: 'inherit',
8516
8524
  maxHeight: 'inherit',
8517
8525
  boxSizing: 'border-box',
8518
- padding: `${ref(cssVarPaddingBlock, isCompact ? ref(spacingStaticXs$1) : `calc(12 * ${ref(spacingStatic2Xs)})`)} ${ref(cssVarPaddingInline, isCompact ? ref(spacingStaticSm$1) : ref(spacingStaticMd))}`,
8526
+ paddingBlock: `${ref(cssVarPaddingBlock, isCompact ? ref(spacingStaticSm$1) : ref(spacingStaticMd))}`,
8527
+ paddingInline: `${ref(cssVarPaddingInline, isCompact ? ref(spacingStaticSm$1) : ref(spacingStaticMd))}`,
8519
8528
  overflow: 'hidden auto',
8520
8529
  overscrollBehaviorY: 'none',
8521
8530
  },
8522
8531
  button: {
8523
8532
  all: 'unset',
8533
+ // The :host uses `display: contents` and thus has no box of its own, so a consumer-defined margin on the host
8534
+ // (e.g. `p-popover { margin: … }`) would be dropped. `inherit` forwards that margin onto the actual trigger button.
8535
+ margin: 'inherit',
8524
8536
  display: 'inline-grid',
8525
8537
  verticalAlign: 'top',
8526
8538
  font: `${ref(typescaleSm$1)} ${ref(fontPorscheNext$1)}`, // needed for correct width/height definition based on ex-unit
8527
8539
  width: ref(leadingNormal$1),
8528
8540
  height: ref(leadingNormal$1),
8529
- borderRadius: ref(radiusFull),
8530
8541
  cursor: 'pointer',
8531
- background: ref(colorFrosted),
8532
- transition: getTransition('background-color'),
8533
- WebkitBackdropFilter: ref(blurFrosted),
8534
- backdropFilter: ref(blurFrosted),
8535
8542
  ...hoverMediaQuery({
8536
- '&:hover': {
8537
- background: ref(colorFrostedSoft),
8543
+ '&:hover::before': {
8544
+ background: ref(colorFrostedStrong),
8545
+ WebkitBackdropFilter: ref(blurFrosted),
8546
+ backdropFilter: ref(blurFrosted),
8538
8547
  },
8539
8548
  }),
8540
- '&:focus-visible': getFocusBaseStyles(),
8549
+ '&:focus-visible::before': getFocusBaseStyles(),
8550
+ '&::before': {
8551
+ gridArea: '1/1',
8552
+ content: '""',
8553
+ margin: '-2px',
8554
+ transition: getTransition('background-color'),
8555
+ borderRadius: ref(radiusFull),
8556
+ ...(isOpen && {
8557
+ background: ref(colorFrosted),
8558
+ WebkitBackdropFilter: ref(blurFrosted),
8559
+ backdropFilter: ref(blurFrosted),
8560
+ }),
8561
+ },
8541
8562
  '&::after': {
8563
+ gridArea: '1/1',
8542
8564
  content: '""',
8543
8565
  WebkitMask: `${iconInfo} center/contain no-repeat`, // necessary for Sogou browser support :-)
8544
8566
  mask: `${iconInfo} center/contain no-repeat`,
8545
8567
  background: ref(colorPrimary),
8546
8568
  ...forcedColorsMediaQuery({
8547
- background: 'CanvasText',
8569
+ background: 'ButtonText',
8548
8570
  }),
8549
8571
  },
8550
8572
  },
@@ -8605,8 +8627,9 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8605
8627
  },
8606
8628
  arrow: {
8607
8629
  position: 'absolute',
8608
- width: '24px',
8609
- height: '12px',
8630
+ // Resting orientation (bottom placement): base spans the panel edge, thickness protrudes towards the trigger.
8631
+ width: `${POPOVER_ARROW_BASE}px`,
8632
+ height: `${POPOVER_ARROW_THICKNESS}px`,
8610
8633
  clipPath: 'polygon(50% 0, 100% 110%, 0 110%)',
8611
8634
  background: 'inherit',
8612
8635
  ...forcedColorsMediaQuery({
@@ -3482,7 +3482,7 @@ const hasShowPickerSupport = () => (hasDocument &&
3482
3482
  'showPicker' in HTMLInputElement.prototype &&
3483
3483
  CSS.supports('selector(::-webkit-calendar-picker-indicator)'));
3484
3484
 
3485
- const prefix = `[Porsche Design System v${"4.4.0-rc.1"}]` // this part isn't covered by unit tests
3485
+ const prefix = `[Porsche Design System v${"4.5.0-rc.0"}]` // this part isn't covered by unit tests
3486
3486
  ;
3487
3487
  const consoleError$1 = (...messages) => {
3488
3488
  console.error(prefix, ...messages);
@@ -3847,7 +3847,7 @@ const OPTION_LIST_SAFE_ZONE = 6;
3847
3847
 
3848
3848
  const getCDNBaseURL = () => global.PORSCHE_DESIGN_SYSTEM_CDN_URL + "/porsche-design-system";
3849
3849
 
3850
- const prefix = `[Porsche Design System v${"4.4.0-rc.1"}]` // this part isn't covered by unit tests
3850
+ const prefix = `[Porsche Design System v${"4.5.0-rc.0"}]` // this part isn't covered by unit tests
3851
3851
  ;
3852
3852
  const consoleError = (...messages) => {
3853
3853
  console.error(prefix, ...messages);
@@ -5749,8 +5749,6 @@ const getFunctionalComponentLabelAfterStyles = () => {
5749
5749
  // last line. `:host(:has([slot="label-after"]))` would be an alternative but lacks reliable Chrome support for now.
5750
5750
  '&::slotted(*)': {
5751
5751
  ...addImportantToEachRule({
5752
- display: 'inline-block',
5753
- verticalAlign: 'top',
5754
5752
  marginInlineStart: ref(spacingStaticXs$1),
5755
5753
  }),
5756
5754
  },
@@ -8440,6 +8438,13 @@ const getComponentCss$w = (hideLabel, state, isDisabled, isLoading, length, isCo
8440
8438
  // Minimum gap (in px) kept between the panel and the viewport edges. Used both as Floating UI `shift`/`flip` padding
8441
8439
  // and to inset the panel's default max-width/height (`100dvw/dvh - 2 * POPOVER_SAFE_ZONE`) so it never touches the edge.
8442
8440
  const POPOVER_SAFE_ZONE = 8;
8441
+ // Arrow geometry (in px), single source of truth shared by the JSS `.arrow` rule (`popover-styles.ts`) and the
8442
+ // runtime positioning/orientation logic (`popover.tsx`). Named by geometry rather than `width`/`height` because the
8443
+ // arrow is rotated per placement, so its rendered CSS `width`/`height` swap depending on the panel edge it attaches to.
8444
+ // - `POPOVER_ARROW_BASE`: length of the triangle's base along the panel edge.
8445
+ // - `POPOVER_ARROW_THICKNESS`: depth of the triangle perpendicular to the panel edge (how far it protrudes).
8446
+ const POPOVER_ARROW_BASE = 24;
8447
+ const POPOVER_ARROW_THICKNESS = 12;
8443
8448
 
8444
8449
  /**
8445
8450
  * @css-variable {"name": "--p-popover-w", "description": "Width of the popover.", "defaultValue": "max-content"}
@@ -8470,7 +8475,7 @@ const cssVariableMaxHeight = '--p-popover-max-h';
8470
8475
  */
8471
8476
  const cssVarPaddingInline = '--p-popover-px';
8472
8477
  /**
8473
- * @css-variable {"name": "--p-popover-py", "description": "Vertical padding of the popover. It is recommended to apply an existing Porsche Design System spacing token, e.g. the CSS declaration `--p-popover-py: var(--p-spacing-static-sm)`, the Tailwind CSS arbitrary property `[--p-popover-py:var(--spacing-static-sm)]` or the equivalent SCSS/JS token.", "defaultValue": "12px"}
8478
+ * @css-variable {"name": "--p-popover-py", "description": "Vertical padding of the popover. It is recommended to apply an existing Porsche Design System spacing token, e.g. the CSS declaration `--p-popover-py: var(--p-spacing-static-sm)`, the Tailwind CSS arbitrary property `[--p-popover-py:var(--spacing-static-sm)]` or the equivalent SCSS/JS token.", "defaultValue": "16px"}
8474
8479
  */
8475
8480
  const cssVarPaddingBlock = '--p-popover-py';
8476
8481
  /**
@@ -8503,6 +8508,9 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8503
8508
  // flow. Enabled by anchoring Floating UI to the assigned trigger element (see `triggerElement` in popover.tsx)
8504
8509
  // instead of the `<slot>` box, so the slot no longer needs a layout box of its own.
8505
8510
  display: 'contents',
8511
+ // Explicit baseline (matches the `margin` initial value) that the trigger button inherits via `margin: inherit`.
8512
+ // A consumer margin on the host (`p-popover { margin: … }`) overrides this and thus flows through to the button.
8513
+ margin: '0',
8506
8514
  ...addImportantToEachRule(hostHiddenStyles),
8507
8515
  },
8508
8516
  'slot:not([name]), p': {
@@ -8513,36 +8521,50 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8513
8521
  maxWidth: 'inherit',
8514
8522
  maxHeight: 'inherit',
8515
8523
  boxSizing: 'border-box',
8516
- padding: `${ref(cssVarPaddingBlock, isCompact ? ref(spacingStaticXs$1) : `calc(12 * ${ref(spacingStatic2Xs)})`)} ${ref(cssVarPaddingInline, isCompact ? ref(spacingStaticSm$1) : ref(spacingStaticMd))}`,
8524
+ paddingBlock: `${ref(cssVarPaddingBlock, isCompact ? ref(spacingStaticSm$1) : ref(spacingStaticMd))}`,
8525
+ paddingInline: `${ref(cssVarPaddingInline, isCompact ? ref(spacingStaticSm$1) : ref(spacingStaticMd))}`,
8517
8526
  overflow: 'hidden auto',
8518
8527
  overscrollBehaviorY: 'none',
8519
8528
  },
8520
8529
  button: {
8521
8530
  all: 'unset',
8531
+ // The :host uses `display: contents` and thus has no box of its own, so a consumer-defined margin on the host
8532
+ // (e.g. `p-popover { margin: … }`) would be dropped. `inherit` forwards that margin onto the actual trigger button.
8533
+ margin: 'inherit',
8522
8534
  display: 'inline-grid',
8523
8535
  verticalAlign: 'top',
8524
8536
  font: `${ref(typescaleSm$1)} ${ref(fontPorscheNext$1)}`, // needed for correct width/height definition based on ex-unit
8525
8537
  width: ref(leadingNormal$1),
8526
8538
  height: ref(leadingNormal$1),
8527
- borderRadius: ref(radiusFull),
8528
8539
  cursor: 'pointer',
8529
- background: ref(colorFrosted),
8530
- transition: getTransition('background-color'),
8531
- WebkitBackdropFilter: ref(blurFrosted),
8532
- backdropFilter: ref(blurFrosted),
8533
8540
  ...hoverMediaQuery({
8534
- '&:hover': {
8535
- background: ref(colorFrostedSoft),
8541
+ '&:hover::before': {
8542
+ background: ref(colorFrostedStrong),
8543
+ WebkitBackdropFilter: ref(blurFrosted),
8544
+ backdropFilter: ref(blurFrosted),
8536
8545
  },
8537
8546
  }),
8538
- '&:focus-visible': getFocusBaseStyles(),
8547
+ '&:focus-visible::before': getFocusBaseStyles(),
8548
+ '&::before': {
8549
+ gridArea: '1/1',
8550
+ content: '""',
8551
+ margin: '-2px',
8552
+ transition: getTransition('background-color'),
8553
+ borderRadius: ref(radiusFull),
8554
+ ...(isOpen && {
8555
+ background: ref(colorFrosted),
8556
+ WebkitBackdropFilter: ref(blurFrosted),
8557
+ backdropFilter: ref(blurFrosted),
8558
+ }),
8559
+ },
8539
8560
  '&::after': {
8561
+ gridArea: '1/1',
8540
8562
  content: '""',
8541
8563
  WebkitMask: `${iconInfo} center/contain no-repeat`, // necessary for Sogou browser support :-)
8542
8564
  mask: `${iconInfo} center/contain no-repeat`,
8543
8565
  background: ref(colorPrimary),
8544
8566
  ...forcedColorsMediaQuery({
8545
- background: 'CanvasText',
8567
+ background: 'ButtonText',
8546
8568
  }),
8547
8569
  },
8548
8570
  },
@@ -8603,8 +8625,9 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8603
8625
  },
8604
8626
  arrow: {
8605
8627
  position: 'absolute',
8606
- width: '24px',
8607
- height: '12px',
8628
+ // Resting orientation (bottom placement): base spans the panel edge, thickness protrudes towards the trigger.
8629
+ width: `${POPOVER_ARROW_BASE}px`,
8630
+ height: `${POPOVER_ARROW_THICKNESS}px`,
8608
8631
  clipPath: 'polygon(50% 0, 100% 110%, 0 110%)',
8609
8632
  background: 'inherit',
8610
8633
  ...forcedColorsMediaQuery({
@@ -3480,7 +3480,7 @@ const hasShowPickerSupport = () => (hasDocument &&
3480
3480
  'showPicker' in HTMLInputElement.prototype &&
3481
3481
  CSS.supports('selector(::-webkit-calendar-picker-indicator)'));
3482
3482
 
3483
- const prefix = `[Porsche Design System v${"4.4.0-rc.1"}]` // this part isn't covered by unit tests
3483
+ const prefix = `[Porsche Design System v${"4.5.0-rc.0"}]` // this part isn't covered by unit tests
3484
3484
  ;
3485
3485
  const consoleError$1 = (...messages) => {
3486
3486
  console.error(prefix, ...messages);