@porsche-design-system/components-react 4.5.0-rc.0 → 4.5.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,18 @@ 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] - 2026-07-21
18
+
19
+ ## [4.5.0-rc.1] - 2026-07-20
20
+
21
+ ### Fixed
22
+
23
+ - `Flyout`, `Modal`, `Sheet` ([#4602](https://github.com/porsche-design-system/porsche-design-system/pull/4602)):
24
+ - focus ring color of dismiss button
25
+ - hover color visibility of dismiss button
26
+ - `Popover`: Trigger icon no longer gets squished when placed inside a constrained flex/grid parent
27
+ ([#4602](https://github.com/porsche-design-system/porsche-design-system/pull/4602))
28
+
17
29
  ## [4.5.0-rc.0] - 2026-07-17
18
30
 
19
31
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@porsche-design-system/components-react",
3
- "version": "4.5.0-rc.0",
3
+ "version": "4.5.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,7 +21,7 @@
21
21
  "url": "https://github.com/porsche-design-system/porsche-design-system"
22
22
  },
23
23
  "dependencies": {
24
- "@porsche-design-system/components-js": "4.5.0-rc.0"
24
+ "@porsche-design-system/components-js": "4.5.0"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "ag-grid-community": ">= 36.0.0 <37.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.5.0-rc.0"}]` // this part isn't covered by unit tests
3852
+ const prefix = `[Porsche Design System v${"4.5.0"}]` // this part isn't covered by unit tests
3853
3853
  ;
3854
3854
  const consoleError = (...messages) => {
3855
3855
  console.error(prefix, ...messages);
@@ -4289,17 +4289,19 @@ const weightMap = {
4289
4289
  // Inlined `close` icon (mirrors packages/assets/projects/icons/src/close.svg) rendered as a CSS mask, so the dismiss
4290
4290
  // button needs neither a nested `p-button` nor a `p-icon` (which would fetch the SVG from the CDN asynchronously).
4291
4291
  const iconClose = getInlineSVGBackgroundImage('<path d="m18 6.706-5.294 5.294 5.294 5.294-.706.706-5.294-5.294-5.294 5.294-.706-.706 5.294-5.294-5.294-5.294.706-.706 5.294 5.294 5.294-5.294z"/>');
4292
- // NOTE: Values copied (and reduced to the fixed `compact` + `hideLabel` case the dismiss button always uses) from
4293
- // `getVariantColors` in `packages/components/src/styles/link-button-styles.ts` to keep the visual identical to the
4294
- // previously nested `p-button`. If the shared button styling changes, mirror it here (or extract a shared helper).
4295
4292
  const getVariantColors$1 = (variant) => {
4296
4293
  const colors = {
4297
- primary: {
4298
- textColor: ref(colorCanvas),
4299
- backgroundColor: ref(colorPrimary),
4300
- backgroundColorHover: ref(colorContrastHigh),
4294
+ canvas: {
4295
+ textColor: ref(colorPrimary),
4296
+ backgroundColor: ref(colorCanvas),
4297
+ backgroundColorHover: ref(colorSurface),
4301
4298
  },
4302
- secondary: {
4299
+ surface: {
4300
+ textColor: ref(colorPrimary),
4301
+ backgroundColor: ref(colorSurface),
4302
+ backgroundColorHover: ref(colorCanvas),
4303
+ },
4304
+ frosted: {
4303
4305
  textColor: ref(colorPrimary),
4304
4306
  backgroundColor: ref(colorFrostedStrong),
4305
4307
  backgroundColorHover: ref(colorFrosted),
@@ -4333,7 +4335,7 @@ const getFCDismissButtonStyles = (variant) => {
4333
4335
  // opaque `primary` background it is invisible AND — because the dialog consumer additionally applies
4334
4336
  // `filter: invert(1)` on the same element (see `getDialogDismissButtonJssStyle`) — the blurred backdrop bleeds past
4335
4337
  // the circular edge and the invert amplifies it into a visible glow/halo. So it is applied for `secondary` only.
4336
- ...(variant === 'secondary' && {
4338
+ ...(variant === 'frosted' && {
4337
4339
  WebkitBackdropFilter: ref(blurFrosted),
4338
4340
  backdropFilter: ref(blurFrosted),
4339
4341
  }),
@@ -4417,7 +4419,7 @@ const getFunctionalComponentNotificationBaseStyles = (state, hasAction, hasDismi
4417
4419
  ...(hasDismissButton && {
4418
4420
  dismiss: {
4419
4421
  // native dismiss button visual (secondary variant); grid positioning is applied on top
4420
- ...getFCDismissButtonStyles('secondary'),
4422
+ ...getFCDismissButtonStyles('frosted'),
4421
4423
  gridArea: `1/4/-1`,
4422
4424
  alignSelf: 'flex-start',
4423
4425
  marginBlock: `calc(-6 * ${ref(spacingStatic2Xs)})`,
@@ -6040,11 +6042,11 @@ const getDialogTransitionJssStyle = (isVisible, slideIn) => {
6040
6042
  transition: `${getTransition('opacity', duration, easing)}, ${getTransition('transform', duration, easing)}`,
6041
6043
  };
6042
6044
  };
6043
- const getDialogDismissButtonJssStyle = () => {
6045
+ const getDialogDismissButtonJssStyle = (variant) => {
6044
6046
  return {
6045
6047
  // native dismiss button visual (primary variant); positioning + the `invert` filter (renders it light on the
6046
6048
  // dialog) are applied on top below
6047
- ...getFCDismissButtonStyles('primary'),
6049
+ ...getFCDismissButtonStyles(variant),
6048
6050
  gridArea: '1/3',
6049
6051
  zIndex: 5, // controls layering + creates new stacking context (prevents content within to be above other dialog areas)
6050
6052
  position: 'sticky',
@@ -6052,7 +6054,6 @@ const getDialogDismissButtonJssStyle = () => {
6052
6054
  marginTop: `calc(-1 * ${dialogPaddingTop} + ${ref(spacingFluidSm)})`,
6053
6055
  marginInlineEnd: ref(spacingFluidSm),
6054
6056
  placeSelf: 'flex-start flex-end',
6055
- filter: 'invert(1) brightness(1.02)',
6056
6057
  };
6057
6058
  };
6058
6059
  const getSlotJssStyle = () => {
@@ -7252,7 +7253,7 @@ const getComponentCss$V = (isOpen, background, backdrop, position, hasHeader, ha
7252
7253
  gridTemplateRows: hasHeader ? 'auto 1fr auto' : '1fr',
7253
7254
  }),
7254
7255
  },
7255
- dismiss: getDialogDismissButtonJssStyle(),
7256
+ dismiss: getDialogDismissButtonJssStyle(background),
7256
7257
  });
7257
7258
  };
7258
7259
 
@@ -8066,7 +8067,7 @@ const getComponentCss$C = (isOpen, background, backdrop, fullscreen, hasDismissB
8066
8067
  }),
8067
8068
  },
8068
8069
  ...(hasDismissButton && {
8069
- dismiss: getDialogDismissButtonJssStyle(),
8070
+ dismiss: getDialogDismissButtonJssStyle(background),
8070
8071
  }),
8071
8072
  });
8072
8073
  };
@@ -8538,6 +8539,12 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8538
8539
  font: `${ref(typescaleSm$1)} ${ref(fontPorscheNext$1)}`, // needed for correct width/height definition based on ex-unit
8539
8540
  width: ref(leadingNormal$1),
8540
8541
  height: ref(leadingNormal$1),
8542
+ // The :host uses `display: contents`, so this fixed-size trigger button becomes the flex/grid item in the
8543
+ // consumer's layout (e.g. p-accordion's `summary-after` slot, which is `display: flex`). Its visible box is drawn
8544
+ // purely by the `::before`/`::after` pseudo-elements (icon `mask`), so it has no intrinsic content width and its
8545
+ // automatic minimum size collapses towards 0 — a competing sibling (e.g. long summary text) would otherwise
8546
+ // squeeze the info icon flat. `flex: none` keeps the icon at its intended size instead of shrinking.
8547
+ flex: 'none',
8541
8548
  cursor: 'pointer',
8542
8549
  ...hoverMediaQuery({
8543
8550
  '&:hover::before': {
@@ -9277,7 +9284,7 @@ const getComponentCss$n = (isOpen, background, hasDismissButton) => {
9277
9284
  }),
9278
9285
  },
9279
9286
  ...(hasDismissButton && {
9280
- dismiss: getDialogDismissButtonJssStyle(),
9287
+ dismiss: getDialogDismissButtonJssStyle(background),
9281
9288
  }),
9282
9289
  });
9283
9290
  };
@@ -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.5.0-rc.0"}]` // this part isn't covered by unit tests
3485
+ const prefix = `[Porsche Design System v${"4.5.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.5.0-rc.0"}]` // this part isn't covered by unit tests
3850
+ const prefix = `[Porsche Design System v${"4.5.0"}]` // this part isn't covered by unit tests
3851
3851
  ;
3852
3852
  const consoleError = (...messages) => {
3853
3853
  console.error(prefix, ...messages);
@@ -4287,17 +4287,19 @@ const weightMap = {
4287
4287
  // Inlined `close` icon (mirrors packages/assets/projects/icons/src/close.svg) rendered as a CSS mask, so the dismiss
4288
4288
  // button needs neither a nested `p-button` nor a `p-icon` (which would fetch the SVG from the CDN asynchronously).
4289
4289
  const iconClose = getInlineSVGBackgroundImage('<path d="m18 6.706-5.294 5.294 5.294 5.294-.706.706-5.294-5.294-5.294 5.294-.706-.706 5.294-5.294-5.294-5.294.706-.706 5.294 5.294 5.294-5.294z"/>');
4290
- // NOTE: Values copied (and reduced to the fixed `compact` + `hideLabel` case the dismiss button always uses) from
4291
- // `getVariantColors` in `packages/components/src/styles/link-button-styles.ts` to keep the visual identical to the
4292
- // previously nested `p-button`. If the shared button styling changes, mirror it here (or extract a shared helper).
4293
4290
  const getVariantColors$1 = (variant) => {
4294
4291
  const colors = {
4295
- primary: {
4296
- textColor: ref(colorCanvas),
4297
- backgroundColor: ref(colorPrimary),
4298
- backgroundColorHover: ref(colorContrastHigh),
4292
+ canvas: {
4293
+ textColor: ref(colorPrimary),
4294
+ backgroundColor: ref(colorCanvas),
4295
+ backgroundColorHover: ref(colorSurface),
4299
4296
  },
4300
- secondary: {
4297
+ surface: {
4298
+ textColor: ref(colorPrimary),
4299
+ backgroundColor: ref(colorSurface),
4300
+ backgroundColorHover: ref(colorCanvas),
4301
+ },
4302
+ frosted: {
4301
4303
  textColor: ref(colorPrimary),
4302
4304
  backgroundColor: ref(colorFrostedStrong),
4303
4305
  backgroundColorHover: ref(colorFrosted),
@@ -4331,7 +4333,7 @@ const getFCDismissButtonStyles = (variant) => {
4331
4333
  // opaque `primary` background it is invisible AND — because the dialog consumer additionally applies
4332
4334
  // `filter: invert(1)` on the same element (see `getDialogDismissButtonJssStyle`) — the blurred backdrop bleeds past
4333
4335
  // the circular edge and the invert amplifies it into a visible glow/halo. So it is applied for `secondary` only.
4334
- ...(variant === 'secondary' && {
4336
+ ...(variant === 'frosted' && {
4335
4337
  WebkitBackdropFilter: ref(blurFrosted),
4336
4338
  backdropFilter: ref(blurFrosted),
4337
4339
  }),
@@ -4415,7 +4417,7 @@ const getFunctionalComponentNotificationBaseStyles = (state, hasAction, hasDismi
4415
4417
  ...(hasDismissButton && {
4416
4418
  dismiss: {
4417
4419
  // native dismiss button visual (secondary variant); grid positioning is applied on top
4418
- ...getFCDismissButtonStyles('secondary'),
4420
+ ...getFCDismissButtonStyles('frosted'),
4419
4421
  gridArea: `1/4/-1`,
4420
4422
  alignSelf: 'flex-start',
4421
4423
  marginBlock: `calc(-6 * ${ref(spacingStatic2Xs)})`,
@@ -6038,11 +6040,11 @@ const getDialogTransitionJssStyle = (isVisible, slideIn) => {
6038
6040
  transition: `${getTransition('opacity', duration, easing)}, ${getTransition('transform', duration, easing)}`,
6039
6041
  };
6040
6042
  };
6041
- const getDialogDismissButtonJssStyle = () => {
6043
+ const getDialogDismissButtonJssStyle = (variant) => {
6042
6044
  return {
6043
6045
  // native dismiss button visual (primary variant); positioning + the `invert` filter (renders it light on the
6044
6046
  // dialog) are applied on top below
6045
- ...getFCDismissButtonStyles('primary'),
6047
+ ...getFCDismissButtonStyles(variant),
6046
6048
  gridArea: '1/3',
6047
6049
  zIndex: 5, // controls layering + creates new stacking context (prevents content within to be above other dialog areas)
6048
6050
  position: 'sticky',
@@ -6050,7 +6052,6 @@ const getDialogDismissButtonJssStyle = () => {
6050
6052
  marginTop: `calc(-1 * ${dialogPaddingTop} + ${ref(spacingFluidSm)})`,
6051
6053
  marginInlineEnd: ref(spacingFluidSm),
6052
6054
  placeSelf: 'flex-start flex-end',
6053
- filter: 'invert(1) brightness(1.02)',
6054
6055
  };
6055
6056
  };
6056
6057
  const getSlotJssStyle = () => {
@@ -7250,7 +7251,7 @@ const getComponentCss$V = (isOpen, background, backdrop, position, hasHeader, ha
7250
7251
  gridTemplateRows: hasHeader ? 'auto 1fr auto' : '1fr',
7251
7252
  }),
7252
7253
  },
7253
- dismiss: getDialogDismissButtonJssStyle(),
7254
+ dismiss: getDialogDismissButtonJssStyle(background),
7254
7255
  });
7255
7256
  };
7256
7257
 
@@ -8064,7 +8065,7 @@ const getComponentCss$C = (isOpen, background, backdrop, fullscreen, hasDismissB
8064
8065
  }),
8065
8066
  },
8066
8067
  ...(hasDismissButton && {
8067
- dismiss: getDialogDismissButtonJssStyle(),
8068
+ dismiss: getDialogDismissButtonJssStyle(background),
8068
8069
  }),
8069
8070
  });
8070
8071
  };
@@ -8536,6 +8537,12 @@ const getComponentCss$v = (isOpen, isCompact, skipEntryTransition) => {
8536
8537
  font: `${ref(typescaleSm$1)} ${ref(fontPorscheNext$1)}`, // needed for correct width/height definition based on ex-unit
8537
8538
  width: ref(leadingNormal$1),
8538
8539
  height: ref(leadingNormal$1),
8540
+ // The :host uses `display: contents`, so this fixed-size trigger button becomes the flex/grid item in the
8541
+ // consumer's layout (e.g. p-accordion's `summary-after` slot, which is `display: flex`). Its visible box is drawn
8542
+ // purely by the `::before`/`::after` pseudo-elements (icon `mask`), so it has no intrinsic content width and its
8543
+ // automatic minimum size collapses towards 0 — a competing sibling (e.g. long summary text) would otherwise
8544
+ // squeeze the info icon flat. `flex: none` keeps the icon at its intended size instead of shrinking.
8545
+ flex: 'none',
8539
8546
  cursor: 'pointer',
8540
8547
  ...hoverMediaQuery({
8541
8548
  '&:hover::before': {
@@ -9275,7 +9282,7 @@ const getComponentCss$n = (isOpen, background, hasDismissButton) => {
9275
9282
  }),
9276
9283
  },
9277
9284
  ...(hasDismissButton && {
9278
- dismiss: getDialogDismissButtonJssStyle(),
9285
+ dismiss: getDialogDismissButtonJssStyle(background),
9279
9286
  }),
9280
9287
  });
9281
9288
  };
@@ -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.5.0-rc.0"}]` // this part isn't covered by unit tests
3483
+ const prefix = `[Porsche Design System v${"4.5.0"}]` // this part isn't covered by unit tests
3484
3484
  ;
3485
3485
  const consoleError$1 = (...messages) => {
3486
3486
  console.error(prefix, ...messages);