@porsche-design-system/components-react 4.4.0 → 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,20 @@ 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
+
17
31
  ## [4.4.0] - 2026-07-15
18
32
 
19
33
  ## [4.4.0-rc.1] - 2026-07-10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@porsche-design-system/components-react",
3
- "version": "4.4.0",
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"
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"}]` // 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"}
@@ -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': {
@@ -8522,30 +8530,43 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8522
8530
  },
8523
8531
  button: {
8524
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',
8525
8536
  display: 'inline-grid',
8526
8537
  verticalAlign: 'top',
8527
8538
  font: `${ref(typescaleSm$1)} ${ref(fontPorscheNext$1)}`, // needed for correct width/height definition based on ex-unit
8528
8539
  width: ref(leadingNormal$1),
8529
8540
  height: ref(leadingNormal$1),
8530
- borderRadius: ref(radiusFull),
8531
8541
  cursor: 'pointer',
8532
- background: ref(colorFrosted),
8533
- transition: getTransition('background-color'),
8534
- WebkitBackdropFilter: ref(blurFrosted),
8535
- backdropFilter: ref(blurFrosted),
8536
8542
  ...hoverMediaQuery({
8537
- '&:hover': {
8538
- background: ref(colorFrostedSoft),
8543
+ '&:hover::before': {
8544
+ background: ref(colorFrostedStrong),
8545
+ WebkitBackdropFilter: ref(blurFrosted),
8546
+ backdropFilter: ref(blurFrosted),
8539
8547
  },
8540
8548
  }),
8541
- '&: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
+ },
8542
8562
  '&::after': {
8563
+ gridArea: '1/1',
8543
8564
  content: '""',
8544
8565
  WebkitMask: `${iconInfo} center/contain no-repeat`, // necessary for Sogou browser support :-)
8545
8566
  mask: `${iconInfo} center/contain no-repeat`,
8546
8567
  background: ref(colorPrimary),
8547
8568
  ...forcedColorsMediaQuery({
8548
- background: 'CanvasText',
8569
+ background: 'ButtonText',
8549
8570
  }),
8550
8571
  },
8551
8572
  },
@@ -8606,8 +8627,9 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8606
8627
  },
8607
8628
  arrow: {
8608
8629
  position: 'absolute',
8609
- width: '24px',
8610
- 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`,
8611
8633
  clipPath: 'polygon(50% 0, 100% 110%, 0 110%)',
8612
8634
  background: 'inherit',
8613
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"}]` // 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"}]` // 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"}
@@ -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': {
@@ -8520,30 +8528,43 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8520
8528
  },
8521
8529
  button: {
8522
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',
8523
8534
  display: 'inline-grid',
8524
8535
  verticalAlign: 'top',
8525
8536
  font: `${ref(typescaleSm$1)} ${ref(fontPorscheNext$1)}`, // needed for correct width/height definition based on ex-unit
8526
8537
  width: ref(leadingNormal$1),
8527
8538
  height: ref(leadingNormal$1),
8528
- borderRadius: ref(radiusFull),
8529
8539
  cursor: 'pointer',
8530
- background: ref(colorFrosted),
8531
- transition: getTransition('background-color'),
8532
- WebkitBackdropFilter: ref(blurFrosted),
8533
- backdropFilter: ref(blurFrosted),
8534
8540
  ...hoverMediaQuery({
8535
- '&:hover': {
8536
- background: ref(colorFrostedSoft),
8541
+ '&:hover::before': {
8542
+ background: ref(colorFrostedStrong),
8543
+ WebkitBackdropFilter: ref(blurFrosted),
8544
+ backdropFilter: ref(blurFrosted),
8537
8545
  },
8538
8546
  }),
8539
- '&: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
+ },
8540
8560
  '&::after': {
8561
+ gridArea: '1/1',
8541
8562
  content: '""',
8542
8563
  WebkitMask: `${iconInfo} center/contain no-repeat`, // necessary for Sogou browser support :-)
8543
8564
  mask: `${iconInfo} center/contain no-repeat`,
8544
8565
  background: ref(colorPrimary),
8545
8566
  ...forcedColorsMediaQuery({
8546
- background: 'CanvasText',
8567
+ background: 'ButtonText',
8547
8568
  }),
8548
8569
  },
8549
8570
  },
@@ -8604,8 +8625,9 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8604
8625
  },
8605
8626
  arrow: {
8606
8627
  position: 'absolute',
8607
- width: '24px',
8608
- 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`,
8609
8631
  clipPath: 'polygon(50% 0, 100% 110%, 0 110%)',
8610
8632
  background: 'inherit',
8611
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"}]` // 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);