@porsche-design-system/components-react 3.28.0-rc.2 → 3.28.0-rc.3

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,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0),
14
14
 
15
15
  ## [Unreleased]
16
16
 
17
+ ## [3.28.0-rc.3] - 2025-05-19
18
+
19
+ ### Added
20
+
21
+ - `Styles`: theme for `tailwindcss` including utilities available under
22
+ `import { … } from '@porsche-design-system/components-{js|angular|react|vue}/tailwindcss';`
23
+ ([#3849](https://github.com/porsche-design-system/porsche-design-system/pull/3849))
24
+
25
+ ### Changed
26
+
27
+ - Partials: `getInitialStyles` removed default styles for `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `p`, `b` and `strong`
28
+ ([#3849](https://github.com/porsche-design-system/porsche-design-system/pull/3849))
29
+
30
+ #### Fixed
31
+
32
+ - `Multi Select`: enable full a11y compliance
33
+ ([#3819](https://github.com/porsche-design-system/porsche-design-system/pull/3819))
34
+ - Accessibility: fix ARIA live announcements of form components status messages
35
+ ([#3796](https://github.com/porsche-design-system/porsche-design-system/pull/3796))
36
+
17
37
  ## [3.28.0-rc.2] - 2025-04-23
18
38
 
19
39
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@porsche-design-system/components-react",
3
- "version": "3.28.0-rc.2",
3
+ "version": "3.28.0-rc.3",
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.28.0-rc.2"
20
+ "@porsche-design-system/components-js": "3.28.0-rc.3"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "ag-grid-community": ">= 33.0.0 <34.0.0",
@@ -75,6 +75,9 @@
75
75
  "import": "./styles/vanilla-extract/esm/vanilla-extract/index.mjs",
76
76
  "default": "./styles/vanilla-extract/cjs/vanilla-extract/index.cjs"
77
77
  },
78
+ "./tailwindcss": {
79
+ "style": "./tailwind/index.css"
80
+ },
78
81
  "./ag-grid": {
79
82
  "types": "./ag-grid/esm/index.d.ts",
80
83
  "import": "./ag-grid/esm/index.mjs",
@@ -5536,8 +5536,12 @@ const getFunctionalComponentStateMessageStyles = (theme, state, additionalDefaul
5536
5536
  ...prefersColorSchemeDarkMediaQuery(theme, {
5537
5537
  color: getThemedFormStateColors('dark', state).formStateColor,
5538
5538
  }),
5539
- transition: getTransition('color'),
5539
+ transition: `${getTransition('color')}, ${getTransition('opacity')}`,
5540
5540
  ...additionalDefaultJssStyle,
5541
+ '&:empty': {
5542
+ opacity: '0',
5543
+ position: 'absolute',
5544
+ },
5541
5545
  },
5542
5546
  };
5543
5547
  };
@@ -5644,13 +5648,112 @@ const getComponentCss$14 = (hideLabel, state, isDisabled, isLoading, theme) => {
5644
5648
  });
5645
5649
  };
5646
5650
 
5651
+ const cssVarInternalCheckboxScaling = '--p-internal-checkbox-scaling';
5652
+ const getCheckboxBaseStyles = (theme, isDisabled, isLoading, state, compact) => {
5653
+ const { contrastMediumColor, disabledColor } = getThemedColors(theme);
5654
+ const { contrastMediumColor: contrastMediumColorDark, disabledColor: disabledColorDark } = getThemedColors('dark');
5655
+ const { formStateColor } = getThemedFormStateColors(theme, state);
5656
+ const { formStateColor: formStateColorDark } = getThemedFormStateColors('dark', state);
5657
+ const disabledOrLoading = isDisabledOrLoading(isDisabled, isLoading);
5658
+ // TODO: needs to be extracted into a color function
5659
+ const uncheckedColor = disabledOrLoading ? disabledColor : formStateColor || contrastMediumColor;
5660
+ const uncheckedColorDark = disabledOrLoading ? disabledColorDark : formStateColorDark || contrastMediumColorDark;
5661
+ const background = `transparent 0% 0% / ${fontLineHeight}`;
5662
+ const minimumTouchTargetSize = '24px'; // Minimum touch target size to comply with accessibility guidelines.
5663
+ const scalingVar = `var(${cssVarInternalCheckboxScaling}, ${compact ? 0.6668 : 1})`;
5664
+ // Determines the scaling factor for the checkbox size. In "compact" mode, it uses 0.6668 to achieve a 20px checkbox (compact size).
5665
+ // Defaults to 1 for the standard size and can be overridden by the CSS variable `cssVarInternalCheckboxScaling`.
5666
+ const dimension = `calc(max(${SCALING_BASE_VALUE} * 0.75, ${scalingVar} * ${fontLineHeight}))`;
5667
+ // Calculates the checkbox size and ensures a minimum size of 12px (0.75 * SCALING_BASE_VALUE).
5668
+ // Scales proportionally with the line height and the scaling factor.
5669
+ const dimensionFull = `calc(${dimension} + ${borderWidthBase} * 2)`; // Calculates the total size of the checkbox including its borders.
5670
+ const touchTargetSizeDiff = `calc(${minimumTouchTargetSize} - ${dimensionFull})`; // Difference between the minimum touch target size and the checkbox full size.
5671
+ const inset = `calc(-${borderWidthBase} - max(0px, ${touchTargetSizeDiff} / 2))`; // Positions the checkbox ::before pseudo-element with a negative offset to align it with the touch target.
5672
+ return {
5673
+ position: 'relative',
5674
+ '&::before': {
5675
+ // Ensures the touch target is at least 24px, even if the checkbox is smaller than the minimum touch target size.
5676
+ // This pseudo-element expands the clickable area without affecting the visual size of the checkbox itself.
5677
+ content: '""',
5678
+ position: 'absolute',
5679
+ inset,
5680
+ },
5681
+ width: dimension,
5682
+ height: dimension,
5683
+ font: `${fontSizeTextSmall} ${fontFamily}`, // needed for correct width and height definition based on ex-unit
5684
+ display: 'block',
5685
+ margin: 0,
5686
+ padding: 0,
5687
+ WebkitAppearance: 'none', // iOS safari
5688
+ appearance: 'none',
5689
+ boxSizing: 'content-box',
5690
+ background,
5691
+ transition: `${getTransition('background-color')}, ${getTransition('border-color')}`,
5692
+ border: `${borderWidthBase} solid ${uncheckedColor}`,
5693
+ outline: 0, // TODO: only relevant for VRT testing with forced states - prevents :focus style (in case getFocusJssStyle() condition is not matching)
5694
+ ...(disabledOrLoading
5695
+ ? {
5696
+ pointerEvents: 'none', // to prevent form element becomes clickable/toggleable
5697
+ }
5698
+ : {
5699
+ cursor: 'pointer',
5700
+ }),
5701
+ ...prefersColorSchemeDarkMediaQuery(theme, {
5702
+ borderColor: uncheckedColorDark,
5703
+ }),
5704
+ gridArea: '1/1',
5705
+ borderRadius: borderRadiusSmall,
5706
+ ...addImportantToEachRule({
5707
+ backgroundSize: 'cover',
5708
+ }),
5709
+ };
5710
+ };
5711
+
5647
5712
  const getCheckedSVGBackgroundImage$1 = (fill) => {
5648
5713
  return getInlineSVGBackgroundImage(`<path fill="${fill}" d="m20.22,7.47l-1.47-1.42-9.26,9.02-4.24-4.15-1.47,1.42,5.71,5.6,10.73-10.47Z"/>`);
5649
5714
  };
5715
+ const getCheckboxCheckedBaseStyles = (theme, isDisabled, isLoading, state) => {
5716
+ const { primaryColor, disabledColor } = getThemedColors(theme);
5717
+ const { primaryColor: primaryColorDark, disabledColor: disabledColorDark } = getThemedColors('dark');
5718
+ const { formStateColor } = getThemedFormStateColors(theme, state);
5719
+ const { formStateColor: formStateColorDark } = getThemedFormStateColors('dark', state);
5720
+ const { canvasTextColor } = getHighContrastColors();
5721
+ const disabledOrLoading = isDisabledOrLoading(isDisabled, isLoading);
5722
+ // TODO: needs to be extracted into a color function
5723
+ const checkedColor = isHighContrastMode
5724
+ ? canvasTextColor
5725
+ : disabledOrLoading
5726
+ ? disabledColor
5727
+ : formStateColor || primaryColor;
5728
+ const checkedColorDark = isHighContrastMode
5729
+ ? canvasTextColor
5730
+ : disabledOrLoading
5731
+ ? disabledColorDark
5732
+ : formStateColorDark || primaryColorDark;
5733
+ const checkedIconColor = escapeHashCharacter(getInvertedThemedColors(theme).primaryColor);
5734
+ const checkedIconColorDark = escapeHashCharacter(getInvertedThemedColors('dark').primaryColor);
5735
+ return {
5736
+ borderColor: checkedColor,
5737
+ backgroundColor: checkedColor,
5738
+ backgroundImage: getCheckedSVGBackgroundImage$1(checkedIconColor),
5739
+ ...prefersColorSchemeDarkMediaQuery(theme, {
5740
+ backgroundImage: getCheckedSVGBackgroundImage$1(checkedIconColorDark),
5741
+ borderColor: checkedColorDark,
5742
+ backgroundColor: checkedColorDark,
5743
+ }),
5744
+ // This is a workaround for Blink based browsers, which do not reflect the high contrast system colors (e.g.: "Canvas" and "CanvasText") when added to background SVG's.
5745
+ ...(isHighContrastMode &&
5746
+ getSchemedHighContrastMediaQuery({
5747
+ backgroundImage: getCheckedSVGBackgroundImage$1('white'),
5748
+ }, {
5749
+ backgroundImage: getCheckedSVGBackgroundImage$1('black'),
5750
+ })),
5751
+ };
5752
+ };
5753
+
5650
5754
  const getIndeterminateSVGBackgroundImage = (fill) => {
5651
5755
  return getInlineSVGBackgroundImage(`<path fill="${fill}" d="m20,11v2H4v-2h16Z"/>`);
5652
5756
  };
5653
- const cssVarInternalCheckboxScaling = '--p-internal-checkbox-scaling';
5654
5757
  const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, theme) => {
5655
5758
  const { primaryColor, contrastMediumColor, contrastHighColor, disabledColor, focusColor } = getThemedColors(theme);
5656
5759
  const { primaryColor: primaryColorDark, contrastMediumColor: contrastMediumColorDark, contrastHighColor: contrastHighColorDark, disabledColor: disabledColorDark, focusColor: focusColorDark, } = getThemedColors('dark');
@@ -5675,8 +5778,6 @@ const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, th
5675
5778
  : formStateColorDark || primaryColorDark;
5676
5779
  const checkedHoverColor = formStateHoverColor || contrastHighColor;
5677
5780
  const checkedHoverColorDark = formStateHoverColorDark || contrastHighColorDark;
5678
- const checkedIconColor = escapeHashCharacter(getInvertedThemedColors(theme).primaryColor);
5679
- const checkedIconColorDark = escapeHashCharacter(getInvertedThemedColors('dark').primaryColor);
5680
5781
  const indeterminateIconColor = escapeHashCharacter(disabledOrLoading ? disabledColorDark : formStateColor || primaryColor);
5681
5782
  const indeterminateIconColorDark = escapeHashCharacter(formStateColorDark || primaryColorDark);
5682
5783
  const indeterminateIconHoverColor = escapeHashCharacter(formStateHoverColor || primaryColor);
@@ -5684,18 +5785,11 @@ const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, th
5684
5785
  const background = `transparent 0% 0% / ${fontLineHeight}`;
5685
5786
  const minimumTouchTargetSize = '24px'; // Minimum touch target size to comply with accessibility guidelines.
5686
5787
  const scalingVar = `var(${cssVarInternalCheckboxScaling}, ${compact ? 0.6668 : 1})`;
5687
- // Determines the scaling factor for the checkbox size. In "compact" mode, it uses 0.6668 to achieve a 20px checkbox (compact size).
5688
- // Defaults to 1 for the standard size and can be overridden by the CSS variable `cssVarInternalCheckboxScaling`.
5689
5788
  const dimension = `calc(max(${SCALING_BASE_VALUE} * 0.75, ${scalingVar} * ${fontLineHeight}))`;
5690
- // Calculates the checkbox size and ensures a minimum size of 12px (0.75 * SCALING_BASE_VALUE).
5691
- // Scales proportionally with the line height and the scaling factor.
5692
5789
  const dimensionFull = `calc(${dimension} + ${borderWidthBase} * 2)`; // Calculates the total size of the checkbox including its borders.
5693
5790
  const touchTargetSizeDiff = `calc(${minimumTouchTargetSize} - ${dimensionFull})`; // Difference between the minimum touch target size and the checkbox full size.
5694
5791
  const paddingInlineStart = `calc(${spacingStaticSmall} - (max(0px, ${touchTargetSizeDiff})))`;
5695
- // Adjusts padding to maintain consistent spacing when the checkbox is smaller than the minimum touch target size.
5696
- // Uses asymmetric padding instead of `gap` to ensure there is no non-clickable area between the label and the input.
5697
5792
  const paddingTop = `calc((${dimensionFull} - ${fontLineHeight}) / 2)`; // Vertically centers the checkbox label relative to the checkbox size.
5698
- const inset = `calc(-${borderWidthBase} - max(0px, ${touchTargetSizeDiff} / 2))`; // Positions the checkbox ::before pseudo-element with a negative offset to align it with the touch target.
5699
5793
  const height = `calc(max(${fontLineHeight}, ${dimensionFull}))`; // Ensures the wrapper height matches either the font's line height or the full size of the checkbox, whichever is larger.
5700
5794
  return getCss({
5701
5795
  '@global': {
@@ -5707,44 +5801,7 @@ const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, th
5707
5801
  }),
5708
5802
  },
5709
5803
  ...preventFoucOfNestedElementsStyles,
5710
- input: {
5711
- position: 'relative',
5712
- '&::before': {
5713
- // Ensures the touch target is at least 24px, even if the checkbox is smaller than the minimum touch target size.
5714
- // This pseudo-element expands the clickable area without affecting the visual size of the checkbox itself.
5715
- content: '""',
5716
- position: 'absolute',
5717
- inset,
5718
- },
5719
- width: dimension,
5720
- height: dimension,
5721
- font: `${fontSizeTextSmall} ${fontFamily}`, // needed for correct width and height definition based on ex-unit
5722
- display: 'block',
5723
- margin: 0,
5724
- padding: 0,
5725
- WebkitAppearance: 'none', // iOS safari
5726
- appearance: 'none',
5727
- boxSizing: 'content-box',
5728
- background,
5729
- transition: `${getTransition('background-color')}, ${getTransition('border-color')}`,
5730
- border: `${borderWidthBase} solid ${uncheckedColor}`,
5731
- outline: 0, // TODO: only relevant for VRT testing with forced states - prevents :focus style (in case getFocusJssStyle() condition is not matching)
5732
- ...(disabledOrLoading
5733
- ? {
5734
- pointerEvents: 'none', // to prevent form element becomes clickable/toggleable
5735
- }
5736
- : {
5737
- cursor: 'pointer',
5738
- }),
5739
- ...prefersColorSchemeDarkMediaQuery(theme, {
5740
- borderColor: uncheckedColorDark,
5741
- }),
5742
- gridArea: '1/1',
5743
- borderRadius: borderRadiusSmall,
5744
- ...addImportantToEachRule({
5745
- backgroundSize: 'cover',
5746
- }),
5747
- },
5804
+ input: getCheckboxBaseStyles(theme, isDisabled, isLoading, state, compact),
5748
5805
  ...(isLoading
5749
5806
  ? {
5750
5807
  'input:checked': {
@@ -5758,23 +5815,7 @@ const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, th
5758
5815
  },
5759
5816
  }
5760
5817
  : {
5761
- 'input:checked': {
5762
- borderColor: checkedColor,
5763
- backgroundColor: checkedColor,
5764
- backgroundImage: getCheckedSVGBackgroundImage$1(checkedIconColor),
5765
- ...prefersColorSchemeDarkMediaQuery(theme, {
5766
- backgroundImage: getCheckedSVGBackgroundImage$1(checkedIconColorDark),
5767
- borderColor: checkedColorDark,
5768
- backgroundColor: checkedColorDark,
5769
- }),
5770
- // This is a workaround for Blink based browsers, which do not reflect the high contrast system colors (e.g.: "Canvas" and "CanvasText") when added to background SVG's.
5771
- ...(isHighContrastMode &&
5772
- getSchemedHighContrastMediaQuery({
5773
- backgroundImage: getCheckedSVGBackgroundImage$1('white'),
5774
- }, {
5775
- backgroundImage: getCheckedSVGBackgroundImage$1('black'),
5776
- })),
5777
- },
5818
+ 'input:checked': getCheckboxCheckedBaseStyles(theme, isDisabled, isLoading, state),
5778
5819
  'input:indeterminate': {
5779
5820
  background, // Safari fix: ensures proper rendering of 'indeterminate' mode with 'checked' state.
5780
5821
  borderColor: uncheckedColor, // Safari fix: ensures proper rendering of 'indeterminate' mode with 'checked' state.
@@ -7609,12 +7650,11 @@ const getComponentCss$M = (disabled, hideLabel, state, toggle, compact, readOnly
7609
7650
  borderColor: primaryColorDark,
7610
7651
  }),
7611
7652
  },
7612
- ...hoverMediaQuery({
7613
- ...(!disabled &&
7614
- !readOnly && {
7653
+ ...(!disabled &&
7654
+ !readOnly &&
7655
+ hoverMediaQuery({
7615
7656
  '&:hover:not(:has(.button:hover, input:focus ))': hoverStyles,
7616
- }),
7617
- }),
7657
+ })),
7618
7658
  ...(disabled && {
7619
7659
  cursor: 'not-allowed',
7620
7660
  color: disabledColor,
@@ -7643,14 +7683,11 @@ const getComponentCss$M = (disabled, hideLabel, state, toggle, compact, readOnly
7643
7683
  },
7644
7684
  }),
7645
7685
  // .label / .required
7646
- ...getFunctionalComponentLabelStyles(disabled, hideLabel, theme, {
7647
- ...hoverMediaQuery({
7648
- ...(!disabled &&
7649
- !readOnly && {
7650
- '&:hover~.wrapper': hoverStyles,
7651
- }),
7652
- }),
7653
- }),
7686
+ ...getFunctionalComponentLabelStyles(disabled, hideLabel, theme, !disabled &&
7687
+ !readOnly &&
7688
+ hoverMediaQuery({
7689
+ '&:hover~.wrapper': hoverStyles,
7690
+ })),
7654
7691
  // .message
7655
7692
  ...getFunctionalComponentStateMessageStyles(theme, state),
7656
7693
  });
@@ -7692,12 +7729,12 @@ const getComponentCss$K = (icon, iconSource, variant, hideLabel, hasSlottedAncho
7692
7729
  label: {
7693
7730
  clip: addImportantToRule('unset'), // to overrule breakpoint customizable hide-label style
7694
7731
  },
7695
- icon: {
7696
- ...(isPrimary &&
7697
- !isHighContrastMode && {
7732
+ ...(isPrimary &&
7733
+ !isHighContrastMode && {
7734
+ icon: {
7698
7735
  filter: 'invert(1)',
7699
- }),
7700
- },
7736
+ },
7737
+ }),
7701
7738
  }, hasSlottedAnchor && {
7702
7739
  ...(isHighContrastMode && {
7703
7740
  root: {
@@ -8580,7 +8617,10 @@ optionHeight, theme) => {
8580
8617
  };
8581
8618
  };
8582
8619
 
8583
- const getComponentCss$D = (theme) => {
8620
+ const getComponentCss$D = (theme, isDisabled, selected) => {
8621
+ const dimension = `calc(max(${SCALING_BASE_VALUE} * 0.75, ${fontLineHeight}))`;
8622
+ const dimensionFull = `calc(${dimension} + ${borderWidthBase} * 2)`; // Calculates the total size of the checkbox including its borders.
8623
+ const paddingTop = `calc((${dimensionFull} - ${fontLineHeight}) / 2)`; // Vertically centers the checkbox label relative to the checkbox size.
8584
8624
  return getCss({
8585
8625
  '@global': {
8586
8626
  ':host': {
@@ -8590,11 +8630,19 @@ const getComponentCss$D = (theme) => {
8590
8630
  ...hostHiddenStyles,
8591
8631
  }),
8592
8632
  },
8593
- ...preventFoucOfNestedElementsStyles,
8633
+ slot: {
8634
+ display: 'block',
8635
+ paddingTop,
8636
+ },
8637
+ },
8638
+ option: {
8639
+ ...getOptionJssStyle('multi-select-option', 1, theme),
8640
+ columnGap: '8px',
8594
8641
  },
8595
- option: getOptionJssStyle('multi-select-option', 1, theme),
8596
8642
  checkbox: {
8597
- pointerEvents: 'none', // Avoid checkbox label click which updates input within p-checkbox-wrapper
8643
+ flexShrink: 0,
8644
+ ...getCheckboxBaseStyles(theme, isDisabled),
8645
+ ...(selected && getCheckboxCheckedBaseStyles(theme, isDisabled)),
8598
8646
  },
8599
8647
  });
8600
8648
  };
@@ -3449,10 +3449,6 @@ function debounce(fn, ms = 800) {
3449
3449
  };
3450
3450
  }
3451
3451
 
3452
- const getRole = (state) => {
3453
- return state === 'error' ? 'alert' : state === 'success' ? 'status' : null;
3454
- };
3455
-
3456
3452
  const isWithinForm = (host) => !!getClosestHTMLElement(host, 'form');
3457
3453
 
3458
3454
  const getCDNBaseURL = () => global.PORSCHE_DESIGN_SYSTEM_CDN_URL + "/porsche-design-system";
@@ -3955,7 +3951,6 @@ exports.getInlineNotificationIconName = getInlineNotificationIconName;
3955
3951
  exports.getInnerManifest = getInnerManifest;
3956
3952
  exports.getListAriaAttributes = getListAriaAttributes;
3957
3953
  exports.getOptionAriaAttributes = getOptionAriaAttributes;
3958
- exports.getRole = getRole;
3959
3954
  exports.getSegmentedControlItemAriaAttributes = getSegmentedControlItemAriaAttributes;
3960
3955
  exports.getSelectedOptionMap = getSelectedOptionMap;
3961
3956
  exports.getSelectedOptionString = getSelectedOptionString;
@@ -1,9 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var react = require('react');
5
- require('../../provider.cjs');
6
4
  var splitChildren = require('../../splitChildren.cjs');
5
+ var react = require('react');
7
6
  var minifyCss = require('../../minifyCss.cjs');
8
7
  var stylesEntry = require('../../../../../../components/dist/styles/esm/styles-entry.cjs');
9
8
 
@@ -14,9 +13,9 @@ class DSRMultiSelectOption extends react.Component {
14
13
  host;
15
14
  render() {
16
15
  splitChildren.splitChildren(this.props.children);
17
- const { theme = 'light', selected, highlighted } = this.props;
18
- this.props.disabled || this.props.disabledParent;
19
- minifyCss.minifyCss(stylesEntry.getMultiSelectOptionCss(theme));
16
+ const { theme = 'light', selected: isSelected, highlighted } = this.props;
17
+ const isDisabled = this.props.disabled || this.props.disabledParent;
18
+ minifyCss.minifyCss(stylesEntry.getMultiSelectOptionCss(theme, isDisabled, isSelected));
20
19
  return (jsxRuntime.jsx(jsxRuntime.Fragment, {}));
21
20
  }
22
21
  }
@@ -3,13 +3,17 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  require('react');
5
5
  require('../../provider.cjs');
6
- var utilsEntry = require('../../../../../../components/dist/utils/esm/utils-entry.cjs');
7
6
  var icon_wrapper = require('../components/icon.wrapper.cjs');
8
7
 
9
8
  const messageId = 'message';
10
9
  const StateMessage = ({ hasMessage, state, message, theme }) => {
11
10
  const isErrorState = state === 'error';
12
- return (hasMessage && (jsxRuntime.jsxs("span", { id: messageId, className: "message", role: utilsEntry.getRole(state), children: [jsxRuntime.jsx(icon_wrapper.PIcon, { name: isErrorState ? 'exclamation' : 'check', color: isErrorState ? 'notification-error' : 'notification-success', theme: theme, "aria-hidden": "true" }), message || jsxRuntime.jsx("slot", { name: "message" })] })));
11
+ return (
12
+ // needs to be rendered always to have correct behaviour for screen readers
13
+ jsxRuntime.jsx("span", { id: messageId, className: "message", role: state === 'success' ? 'status' : 'alert', children: hasMessage && [
14
+ jsxRuntime.jsx(icon_wrapper.PIcon, { name: isErrorState ? 'exclamation' : 'check', color: isErrorState ? 'notification-error' : 'notification-success', theme: theme, "aria-hidden": "true" }),
15
+ message || jsxRuntime.jsx("slot", { name: "message" }),
16
+ ] }));
13
17
  };
14
18
 
15
19
  exports.StateMessage = StateMessage;
@@ -5534,8 +5534,12 @@ const getFunctionalComponentStateMessageStyles = (theme, state, additionalDefaul
5534
5534
  ...prefersColorSchemeDarkMediaQuery(theme, {
5535
5535
  color: getThemedFormStateColors('dark', state).formStateColor,
5536
5536
  }),
5537
- transition: getTransition('color'),
5537
+ transition: `${getTransition('color')}, ${getTransition('opacity')}`,
5538
5538
  ...additionalDefaultJssStyle,
5539
+ '&:empty': {
5540
+ opacity: '0',
5541
+ position: 'absolute',
5542
+ },
5539
5543
  },
5540
5544
  };
5541
5545
  };
@@ -5642,13 +5646,112 @@ const getComponentCss$14 = (hideLabel, state, isDisabled, isLoading, theme) => {
5642
5646
  });
5643
5647
  };
5644
5648
 
5649
+ const cssVarInternalCheckboxScaling = '--p-internal-checkbox-scaling';
5650
+ const getCheckboxBaseStyles = (theme, isDisabled, isLoading, state, compact) => {
5651
+ const { contrastMediumColor, disabledColor } = getThemedColors(theme);
5652
+ const { contrastMediumColor: contrastMediumColorDark, disabledColor: disabledColorDark } = getThemedColors('dark');
5653
+ const { formStateColor } = getThemedFormStateColors(theme, state);
5654
+ const { formStateColor: formStateColorDark } = getThemedFormStateColors('dark', state);
5655
+ const disabledOrLoading = isDisabledOrLoading(isDisabled, isLoading);
5656
+ // TODO: needs to be extracted into a color function
5657
+ const uncheckedColor = disabledOrLoading ? disabledColor : formStateColor || contrastMediumColor;
5658
+ const uncheckedColorDark = disabledOrLoading ? disabledColorDark : formStateColorDark || contrastMediumColorDark;
5659
+ const background = `transparent 0% 0% / ${fontLineHeight}`;
5660
+ const minimumTouchTargetSize = '24px'; // Minimum touch target size to comply with accessibility guidelines.
5661
+ const scalingVar = `var(${cssVarInternalCheckboxScaling}, ${compact ? 0.6668 : 1})`;
5662
+ // Determines the scaling factor for the checkbox size. In "compact" mode, it uses 0.6668 to achieve a 20px checkbox (compact size).
5663
+ // Defaults to 1 for the standard size and can be overridden by the CSS variable `cssVarInternalCheckboxScaling`.
5664
+ const dimension = `calc(max(${SCALING_BASE_VALUE} * 0.75, ${scalingVar} * ${fontLineHeight}))`;
5665
+ // Calculates the checkbox size and ensures a minimum size of 12px (0.75 * SCALING_BASE_VALUE).
5666
+ // Scales proportionally with the line height and the scaling factor.
5667
+ const dimensionFull = `calc(${dimension} + ${borderWidthBase} * 2)`; // Calculates the total size of the checkbox including its borders.
5668
+ const touchTargetSizeDiff = `calc(${minimumTouchTargetSize} - ${dimensionFull})`; // Difference between the minimum touch target size and the checkbox full size.
5669
+ const inset = `calc(-${borderWidthBase} - max(0px, ${touchTargetSizeDiff} / 2))`; // Positions the checkbox ::before pseudo-element with a negative offset to align it with the touch target.
5670
+ return {
5671
+ position: 'relative',
5672
+ '&::before': {
5673
+ // Ensures the touch target is at least 24px, even if the checkbox is smaller than the minimum touch target size.
5674
+ // This pseudo-element expands the clickable area without affecting the visual size of the checkbox itself.
5675
+ content: '""',
5676
+ position: 'absolute',
5677
+ inset,
5678
+ },
5679
+ width: dimension,
5680
+ height: dimension,
5681
+ font: `${fontSizeTextSmall} ${fontFamily}`, // needed for correct width and height definition based on ex-unit
5682
+ display: 'block',
5683
+ margin: 0,
5684
+ padding: 0,
5685
+ WebkitAppearance: 'none', // iOS safari
5686
+ appearance: 'none',
5687
+ boxSizing: 'content-box',
5688
+ background,
5689
+ transition: `${getTransition('background-color')}, ${getTransition('border-color')}`,
5690
+ border: `${borderWidthBase} solid ${uncheckedColor}`,
5691
+ outline: 0, // TODO: only relevant for VRT testing with forced states - prevents :focus style (in case getFocusJssStyle() condition is not matching)
5692
+ ...(disabledOrLoading
5693
+ ? {
5694
+ pointerEvents: 'none', // to prevent form element becomes clickable/toggleable
5695
+ }
5696
+ : {
5697
+ cursor: 'pointer',
5698
+ }),
5699
+ ...prefersColorSchemeDarkMediaQuery(theme, {
5700
+ borderColor: uncheckedColorDark,
5701
+ }),
5702
+ gridArea: '1/1',
5703
+ borderRadius: borderRadiusSmall,
5704
+ ...addImportantToEachRule({
5705
+ backgroundSize: 'cover',
5706
+ }),
5707
+ };
5708
+ };
5709
+
5645
5710
  const getCheckedSVGBackgroundImage$1 = (fill) => {
5646
5711
  return getInlineSVGBackgroundImage(`<path fill="${fill}" d="m20.22,7.47l-1.47-1.42-9.26,9.02-4.24-4.15-1.47,1.42,5.71,5.6,10.73-10.47Z"/>`);
5647
5712
  };
5713
+ const getCheckboxCheckedBaseStyles = (theme, isDisabled, isLoading, state) => {
5714
+ const { primaryColor, disabledColor } = getThemedColors(theme);
5715
+ const { primaryColor: primaryColorDark, disabledColor: disabledColorDark } = getThemedColors('dark');
5716
+ const { formStateColor } = getThemedFormStateColors(theme, state);
5717
+ const { formStateColor: formStateColorDark } = getThemedFormStateColors('dark', state);
5718
+ const { canvasTextColor } = getHighContrastColors();
5719
+ const disabledOrLoading = isDisabledOrLoading(isDisabled, isLoading);
5720
+ // TODO: needs to be extracted into a color function
5721
+ const checkedColor = isHighContrastMode
5722
+ ? canvasTextColor
5723
+ : disabledOrLoading
5724
+ ? disabledColor
5725
+ : formStateColor || primaryColor;
5726
+ const checkedColorDark = isHighContrastMode
5727
+ ? canvasTextColor
5728
+ : disabledOrLoading
5729
+ ? disabledColorDark
5730
+ : formStateColorDark || primaryColorDark;
5731
+ const checkedIconColor = escapeHashCharacter(getInvertedThemedColors(theme).primaryColor);
5732
+ const checkedIconColorDark = escapeHashCharacter(getInvertedThemedColors('dark').primaryColor);
5733
+ return {
5734
+ borderColor: checkedColor,
5735
+ backgroundColor: checkedColor,
5736
+ backgroundImage: getCheckedSVGBackgroundImage$1(checkedIconColor),
5737
+ ...prefersColorSchemeDarkMediaQuery(theme, {
5738
+ backgroundImage: getCheckedSVGBackgroundImage$1(checkedIconColorDark),
5739
+ borderColor: checkedColorDark,
5740
+ backgroundColor: checkedColorDark,
5741
+ }),
5742
+ // This is a workaround for Blink based browsers, which do not reflect the high contrast system colors (e.g.: "Canvas" and "CanvasText") when added to background SVG's.
5743
+ ...(isHighContrastMode &&
5744
+ getSchemedHighContrastMediaQuery({
5745
+ backgroundImage: getCheckedSVGBackgroundImage$1('white'),
5746
+ }, {
5747
+ backgroundImage: getCheckedSVGBackgroundImage$1('black'),
5748
+ })),
5749
+ };
5750
+ };
5751
+
5648
5752
  const getIndeterminateSVGBackgroundImage = (fill) => {
5649
5753
  return getInlineSVGBackgroundImage(`<path fill="${fill}" d="m20,11v2H4v-2h16Z"/>`);
5650
5754
  };
5651
- const cssVarInternalCheckboxScaling = '--p-internal-checkbox-scaling';
5652
5755
  const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, theme) => {
5653
5756
  const { primaryColor, contrastMediumColor, contrastHighColor, disabledColor, focusColor } = getThemedColors(theme);
5654
5757
  const { primaryColor: primaryColorDark, contrastMediumColor: contrastMediumColorDark, contrastHighColor: contrastHighColorDark, disabledColor: disabledColorDark, focusColor: focusColorDark, } = getThemedColors('dark');
@@ -5673,8 +5776,6 @@ const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, th
5673
5776
  : formStateColorDark || primaryColorDark;
5674
5777
  const checkedHoverColor = formStateHoverColor || contrastHighColor;
5675
5778
  const checkedHoverColorDark = formStateHoverColorDark || contrastHighColorDark;
5676
- const checkedIconColor = escapeHashCharacter(getInvertedThemedColors(theme).primaryColor);
5677
- const checkedIconColorDark = escapeHashCharacter(getInvertedThemedColors('dark').primaryColor);
5678
5779
  const indeterminateIconColor = escapeHashCharacter(disabledOrLoading ? disabledColorDark : formStateColor || primaryColor);
5679
5780
  const indeterminateIconColorDark = escapeHashCharacter(formStateColorDark || primaryColorDark);
5680
5781
  const indeterminateIconHoverColor = escapeHashCharacter(formStateHoverColor || primaryColor);
@@ -5682,18 +5783,11 @@ const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, th
5682
5783
  const background = `transparent 0% 0% / ${fontLineHeight}`;
5683
5784
  const minimumTouchTargetSize = '24px'; // Minimum touch target size to comply with accessibility guidelines.
5684
5785
  const scalingVar = `var(${cssVarInternalCheckboxScaling}, ${compact ? 0.6668 : 1})`;
5685
- // Determines the scaling factor for the checkbox size. In "compact" mode, it uses 0.6668 to achieve a 20px checkbox (compact size).
5686
- // Defaults to 1 for the standard size and can be overridden by the CSS variable `cssVarInternalCheckboxScaling`.
5687
5786
  const dimension = `calc(max(${SCALING_BASE_VALUE} * 0.75, ${scalingVar} * ${fontLineHeight}))`;
5688
- // Calculates the checkbox size and ensures a minimum size of 12px (0.75 * SCALING_BASE_VALUE).
5689
- // Scales proportionally with the line height and the scaling factor.
5690
5787
  const dimensionFull = `calc(${dimension} + ${borderWidthBase} * 2)`; // Calculates the total size of the checkbox including its borders.
5691
5788
  const touchTargetSizeDiff = `calc(${minimumTouchTargetSize} - ${dimensionFull})`; // Difference between the minimum touch target size and the checkbox full size.
5692
5789
  const paddingInlineStart = `calc(${spacingStaticSmall} - (max(0px, ${touchTargetSizeDiff})))`;
5693
- // Adjusts padding to maintain consistent spacing when the checkbox is smaller than the minimum touch target size.
5694
- // Uses asymmetric padding instead of `gap` to ensure there is no non-clickable area between the label and the input.
5695
5790
  const paddingTop = `calc((${dimensionFull} - ${fontLineHeight}) / 2)`; // Vertically centers the checkbox label relative to the checkbox size.
5696
- const inset = `calc(-${borderWidthBase} - max(0px, ${touchTargetSizeDiff} / 2))`; // Positions the checkbox ::before pseudo-element with a negative offset to align it with the touch target.
5697
5791
  const height = `calc(max(${fontLineHeight}, ${dimensionFull}))`; // Ensures the wrapper height matches either the font's line height or the full size of the checkbox, whichever is larger.
5698
5792
  return getCss({
5699
5793
  '@global': {
@@ -5705,44 +5799,7 @@ const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, th
5705
5799
  }),
5706
5800
  },
5707
5801
  ...preventFoucOfNestedElementsStyles,
5708
- input: {
5709
- position: 'relative',
5710
- '&::before': {
5711
- // Ensures the touch target is at least 24px, even if the checkbox is smaller than the minimum touch target size.
5712
- // This pseudo-element expands the clickable area without affecting the visual size of the checkbox itself.
5713
- content: '""',
5714
- position: 'absolute',
5715
- inset,
5716
- },
5717
- width: dimension,
5718
- height: dimension,
5719
- font: `${fontSizeTextSmall} ${fontFamily}`, // needed for correct width and height definition based on ex-unit
5720
- display: 'block',
5721
- margin: 0,
5722
- padding: 0,
5723
- WebkitAppearance: 'none', // iOS safari
5724
- appearance: 'none',
5725
- boxSizing: 'content-box',
5726
- background,
5727
- transition: `${getTransition('background-color')}, ${getTransition('border-color')}`,
5728
- border: `${borderWidthBase} solid ${uncheckedColor}`,
5729
- outline: 0, // TODO: only relevant for VRT testing with forced states - prevents :focus style (in case getFocusJssStyle() condition is not matching)
5730
- ...(disabledOrLoading
5731
- ? {
5732
- pointerEvents: 'none', // to prevent form element becomes clickable/toggleable
5733
- }
5734
- : {
5735
- cursor: 'pointer',
5736
- }),
5737
- ...prefersColorSchemeDarkMediaQuery(theme, {
5738
- borderColor: uncheckedColorDark,
5739
- }),
5740
- gridArea: '1/1',
5741
- borderRadius: borderRadiusSmall,
5742
- ...addImportantToEachRule({
5743
- backgroundSize: 'cover',
5744
- }),
5745
- },
5802
+ input: getCheckboxBaseStyles(theme, isDisabled, isLoading, state, compact),
5746
5803
  ...(isLoading
5747
5804
  ? {
5748
5805
  'input:checked': {
@@ -5756,23 +5813,7 @@ const getComponentCss$13 = (hideLabel, state, isDisabled, isLoading, compact, th
5756
5813
  },
5757
5814
  }
5758
5815
  : {
5759
- 'input:checked': {
5760
- borderColor: checkedColor,
5761
- backgroundColor: checkedColor,
5762
- backgroundImage: getCheckedSVGBackgroundImage$1(checkedIconColor),
5763
- ...prefersColorSchemeDarkMediaQuery(theme, {
5764
- backgroundImage: getCheckedSVGBackgroundImage$1(checkedIconColorDark),
5765
- borderColor: checkedColorDark,
5766
- backgroundColor: checkedColorDark,
5767
- }),
5768
- // This is a workaround for Blink based browsers, which do not reflect the high contrast system colors (e.g.: "Canvas" and "CanvasText") when added to background SVG's.
5769
- ...(isHighContrastMode &&
5770
- getSchemedHighContrastMediaQuery({
5771
- backgroundImage: getCheckedSVGBackgroundImage$1('white'),
5772
- }, {
5773
- backgroundImage: getCheckedSVGBackgroundImage$1('black'),
5774
- })),
5775
- },
5816
+ 'input:checked': getCheckboxCheckedBaseStyles(theme, isDisabled, isLoading, state),
5776
5817
  'input:indeterminate': {
5777
5818
  background, // Safari fix: ensures proper rendering of 'indeterminate' mode with 'checked' state.
5778
5819
  borderColor: uncheckedColor, // Safari fix: ensures proper rendering of 'indeterminate' mode with 'checked' state.
@@ -7607,12 +7648,11 @@ const getComponentCss$M = (disabled, hideLabel, state, toggle, compact, readOnly
7607
7648
  borderColor: primaryColorDark,
7608
7649
  }),
7609
7650
  },
7610
- ...hoverMediaQuery({
7611
- ...(!disabled &&
7612
- !readOnly && {
7651
+ ...(!disabled &&
7652
+ !readOnly &&
7653
+ hoverMediaQuery({
7613
7654
  '&:hover:not(:has(.button:hover, input:focus ))': hoverStyles,
7614
- }),
7615
- }),
7655
+ })),
7616
7656
  ...(disabled && {
7617
7657
  cursor: 'not-allowed',
7618
7658
  color: disabledColor,
@@ -7641,14 +7681,11 @@ const getComponentCss$M = (disabled, hideLabel, state, toggle, compact, readOnly
7641
7681
  },
7642
7682
  }),
7643
7683
  // .label / .required
7644
- ...getFunctionalComponentLabelStyles(disabled, hideLabel, theme, {
7645
- ...hoverMediaQuery({
7646
- ...(!disabled &&
7647
- !readOnly && {
7648
- '&:hover~.wrapper': hoverStyles,
7649
- }),
7650
- }),
7651
- }),
7684
+ ...getFunctionalComponentLabelStyles(disabled, hideLabel, theme, !disabled &&
7685
+ !readOnly &&
7686
+ hoverMediaQuery({
7687
+ '&:hover~.wrapper': hoverStyles,
7688
+ })),
7652
7689
  // .message
7653
7690
  ...getFunctionalComponentStateMessageStyles(theme, state),
7654
7691
  });
@@ -7690,12 +7727,12 @@ const getComponentCss$K = (icon, iconSource, variant, hideLabel, hasSlottedAncho
7690
7727
  label: {
7691
7728
  clip: addImportantToRule('unset'), // to overrule breakpoint customizable hide-label style
7692
7729
  },
7693
- icon: {
7694
- ...(isPrimary &&
7695
- !isHighContrastMode && {
7730
+ ...(isPrimary &&
7731
+ !isHighContrastMode && {
7732
+ icon: {
7696
7733
  filter: 'invert(1)',
7697
- }),
7698
- },
7734
+ },
7735
+ }),
7699
7736
  }, hasSlottedAnchor && {
7700
7737
  ...(isHighContrastMode && {
7701
7738
  root: {
@@ -8578,7 +8615,10 @@ optionHeight, theme) => {
8578
8615
  };
8579
8616
  };
8580
8617
 
8581
- const getComponentCss$D = (theme) => {
8618
+ const getComponentCss$D = (theme, isDisabled, selected) => {
8619
+ const dimension = `calc(max(${SCALING_BASE_VALUE} * 0.75, ${fontLineHeight}))`;
8620
+ const dimensionFull = `calc(${dimension} + ${borderWidthBase} * 2)`; // Calculates the total size of the checkbox including its borders.
8621
+ const paddingTop = `calc((${dimensionFull} - ${fontLineHeight}) / 2)`; // Vertically centers the checkbox label relative to the checkbox size.
8582
8622
  return getCss({
8583
8623
  '@global': {
8584
8624
  ':host': {
@@ -8588,11 +8628,19 @@ const getComponentCss$D = (theme) => {
8588
8628
  ...hostHiddenStyles,
8589
8629
  }),
8590
8630
  },
8591
- ...preventFoucOfNestedElementsStyles,
8631
+ slot: {
8632
+ display: 'block',
8633
+ paddingTop,
8634
+ },
8635
+ },
8636
+ option: {
8637
+ ...getOptionJssStyle('multi-select-option', 1, theme),
8638
+ columnGap: '8px',
8592
8639
  },
8593
- option: getOptionJssStyle('multi-select-option', 1, theme),
8594
8640
  checkbox: {
8595
- pointerEvents: 'none', // Avoid checkbox label click which updates input within p-checkbox-wrapper
8641
+ flexShrink: 0,
8642
+ ...getCheckboxBaseStyles(theme, isDisabled),
8643
+ ...(selected && getCheckboxCheckedBaseStyles(theme, isDisabled)),
8596
8644
  },
8597
8645
  });
8598
8646
  };
@@ -3447,10 +3447,6 @@ function debounce(fn, ms = 800) {
3447
3447
  };
3448
3448
  }
3449
3449
 
3450
- const getRole = (state) => {
3451
- return state === 'error' ? 'alert' : state === 'success' ? 'status' : null;
3452
- };
3453
-
3454
3450
  const isWithinForm = (host) => !!getClosestHTMLElement(host, 'form');
3455
3451
 
3456
3452
  const getCDNBaseURL = () => global.PORSCHE_DESIGN_SYSTEM_CDN_URL + "/porsche-design-system";
@@ -3916,4 +3912,4 @@ const getTextTagType = (host, tag) => {
3916
3912
  return tag;
3917
3913
  };
3918
3914
 
3919
- export { DISPLAY_TAGS, HEADING_TAGS, HEADLINE_TAGS, ItemType, TEXT_TAGS, _hasShowPickerSupport, anchorSlot, attributeMutationMap, buildCrestImgSrc, buildCrestSrcSet, buildIconUrl, buildImgSrc, buildSrcSet, createPaginationItems, createRange, crestSize, debounce, descriptionId, 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$1 as hasWindow, headerSlot, isCurrentInput, isCustomDropdown, isDisabledOrLoading, isElementOfKind, isInfinitePagination, isListTypeOrdered, isScrollable, isSortable, isStateCompleteOrWarning, isTouchDevice, isType, isUrl, isWithinForm, labelId, observedNodesMap, parseAndGetAriaAttributes, parseJSONAttribute, scrollAreaClass, showCustomCalendarOrTimeIndicator, supportsConstructableStylesheets, supportsNativePopover, tempDiv, tempIcon, tempLabel, traverseTreeAndUpdateState, updateDrilldownItemState };
3915
+ export { DISPLAY_TAGS, HEADING_TAGS, HEADLINE_TAGS, ItemType, TEXT_TAGS, _hasShowPickerSupport, anchorSlot, attributeMutationMap, buildCrestImgSrc, buildCrestSrcSet, buildIconUrl, buildImgSrc, buildSrcSet, createPaginationItems, createRange, crestSize, debounce, descriptionId, displaySizeToTagMap, getButtonAriaAttributes, getButtonBaseAriaAttributes, getButtonPureAriaAttributes, getCDNBaseURL, getClosestHTMLElement, getComboboxAriaAttributes, getContentAriaAttributes, getCurrentActivePage, getDirectChildHTMLElement, getDisplayTagType, getHTMLElement, getHasNativePopoverSupport, getHeadingTagType, getHeadlineTagType, getIconColor, getInlineNotificationIconName, getInnerManifest, getListAriaAttributes, getOptionAriaAttributes, getSegmentedControlItemAriaAttributes, getSelectedOptionMap, getSelectedOptionString, getSelectedOptionValues, getSelectedOptions, getStepperHorizontalIconName, getSvgUrl, getSwitchButtonAriaAttributes, getTagName, getTagNameWithoutPrefix, getTextTagType, getTotalPages, hasDocument, hasLocateAction, hasSpecificDirectChildTag, hasVisibleIcon, hasWindow$1 as hasWindow, headerSlot, isCurrentInput, isCustomDropdown, isDisabledOrLoading, isElementOfKind, isInfinitePagination, isListTypeOrdered, isScrollable, isSortable, isStateCompleteOrWarning, isTouchDevice, isType, isUrl, isWithinForm, labelId, observedNodesMap, parseAndGetAriaAttributes, parseJSONAttribute, scrollAreaClass, showCustomCalendarOrTimeIndicator, supportsConstructableStylesheets, supportsNativePopover, tempDiv, tempIcon, tempLabel, traverseTreeAndUpdateState, updateDrilldownItemState };
@@ -1,7 +1,6 @@
1
1
  import { jsx, Fragment } from 'react/jsx-runtime';
2
- import { Component } from 'react';
3
- import '../../provider.mjs';
4
2
  import { splitChildren } from '../../splitChildren.mjs';
3
+ import { Component } from 'react';
5
4
  import { minifyCss } from '../../minifyCss.mjs';
6
5
  import { getMultiSelectOptionCss as getComponentCss$D } from '../../../../../../components/dist/styles/esm/styles-entry.mjs';
7
6
 
@@ -12,9 +11,9 @@ class DSRMultiSelectOption extends Component {
12
11
  host;
13
12
  render() {
14
13
  splitChildren(this.props.children);
15
- const { theme = 'light', selected, highlighted } = this.props;
16
- this.props.disabled || this.props.disabledParent;
17
- minifyCss(getComponentCss$D(theme));
14
+ const { theme = 'light', selected: isSelected, highlighted } = this.props;
15
+ const isDisabled = this.props.disabled || this.props.disabledParent;
16
+ minifyCss(getComponentCss$D(theme, isDisabled, isSelected));
18
17
  return (jsx(Fragment, {}));
19
18
  }
20
19
  }
@@ -1,13 +1,17 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import 'react';
3
3
  import '../../provider.mjs';
4
- import { getRole } from '../../../../../../components/dist/utils/esm/utils-entry.mjs';
5
4
  import { PIcon } from '../components/icon.wrapper.mjs';
6
5
 
7
6
  const messageId = 'message';
8
7
  const StateMessage = ({ hasMessage, state, message, theme }) => {
9
8
  const isErrorState = state === 'error';
10
- return (hasMessage && (jsxs("span", { id: messageId, className: "message", role: getRole(state), children: [jsx(PIcon, { name: isErrorState ? 'exclamation' : 'check', color: isErrorState ? 'notification-error' : 'notification-success', theme: theme, "aria-hidden": "true" }), message || jsx("slot", { name: "message" })] })));
9
+ return (
10
+ // needs to be rendered always to have correct behaviour for screen readers
11
+ jsx("span", { id: messageId, className: "message", role: state === 'success' ? 'status' : 'alert', children: hasMessage && [
12
+ jsx(PIcon, { name: isErrorState ? 'exclamation' : 'check', color: isErrorState ? 'notification-error' : 'notification-success', theme: theme, "aria-hidden": "true" }),
13
+ message || jsx("slot", { name: "message" }),
14
+ ] }));
11
15
  };
12
16
 
13
17
  export { StateMessage, messageId };
@@ -0,0 +1,348 @@
1
+ @custom-variant dark (&:where(.dark, .dark *));
2
+ @theme {
3
+ --color-primary: #010205;
4
+ --color-base: #fff;
5
+ --color-surface: #eeeff2;
6
+ --color-shading: rgba(1, 2, 5, 0.67);
7
+ --color-frosted: hsla(240, 4%, 85%, 0.35);
8
+ --color-contrast-low: #d8d8db;
9
+ --color-contrast-medium: #6b6d70;
10
+ --color-contrast-high: #535457;
11
+ --color-success: #197e10;
12
+ --color-success-soft: #e4ffec;
13
+ --color-warning: #f3be00;
14
+ --color-warning-soft: #fff4d2;
15
+ --color-error: #cc1922;
16
+ --color-error-soft: #ffe2e4;
17
+ --color-info: #2762ec;
18
+ --color-info-soft: #d3e1ff;
19
+ --color-hover: rgba(148, 149, 152, 0.18);
20
+ --color-active: rgba(148, 149, 152, 0.2);
21
+ --color-focus: #1a44ea;
22
+ --color-disabled: #949598;
23
+ --color-skeleton: #f7f7f7;
24
+ --color-primary-light: #010205;
25
+ --color-base-light: #fff;
26
+ --color-surface-light: #eeeff2;
27
+ --color-shading-light: rgba(1, 2, 5, 0.67);
28
+ --color-frosted-light: hsla(240, 4%, 85%, 0.35);
29
+ --color-contrast-low-light: #d8d8db;
30
+ --color-contrast-medium-light: #6b6d70;
31
+ --color-contrast-high-light: #535457;
32
+ --color-success-light: #197e10;
33
+ --color-success-soft-light: #e4ffec;
34
+ --color-warning-light: #f3be00;
35
+ --color-warning-soft-light: #fff4d2;
36
+ --color-error-light: #cc1922;
37
+ --color-error-soft-light: #ffe2e4;
38
+ --color-info-light: #2762ec;
39
+ --color-info-soft-light: #d3e1ff;
40
+ --color-hover-light: rgba(148, 149, 152, 0.18);
41
+ --color-active-light: rgba(148, 149, 152, 0.2);
42
+ --color-focus-light: #1a44ea;
43
+ --color-disabled-light: #949598;
44
+ --color-skeleton-light: #f7f7f7;
45
+ --color-primary-dark: #fbfcff;
46
+ --color-base-dark: #0e0e12;
47
+ --color-surface-dark: #212225;
48
+ --color-shading-dark: rgba(38, 38, 41, 0.67);
49
+ --color-frosted-dark: hsla(240, 3%, 26%, 0.35);
50
+ --color-contrast-low-dark: #404044;
51
+ --color-contrast-medium-dark: #88898c;
52
+ --color-contrast-high-dark: #afb0b3;
53
+ --color-success-dark: #09d087;
54
+ --color-success-soft-dark: #003320;
55
+ --color-warning-dark: #f7cb47;
56
+ --color-warning-soft-dark: #362b0a;
57
+ --color-error-dark: #fc4040;
58
+ --color-error-soft-dark: #3a0f0f;
59
+ --color-info-dark: #178bff;
60
+ --color-info-soft-dark: #04294e;
61
+ --color-hover-dark: rgba(148, 149, 152, 0.18);
62
+ --color-active-dark: rgba(126, 127, 130, 0.2);
63
+ --color-focus-dark: #1a44ea;
64
+ --color-disabled-dark: #7e7f82;
65
+ --color-skeleton-dark: #1a1b1e;
66
+ --font-porsche-next: Porsche Next, Arial Narrow, Arial, Heiti SC, SimHei, sans-serif;
67
+ --font-weight-normal: 400;
68
+ --font-weight-semibold: 600;
69
+ --font-weight-bold: 700;
70
+ --leading-normal: calc(6px + 2.125ex);
71
+ --text-2xs: 0.75rem;
72
+ --text-2xs--line-height: calc(6px + 2.125ex);
73
+ --text-xs: clamp(0.81rem, 0.23vw + 0.77rem, 0.88rem);
74
+ --text-xs--line-height: calc(6px + 2.125ex);
75
+ --text-base: 1rem;
76
+ --text-base--line-height: calc(6px + 2.125ex);
77
+ --text-sm: 1rem;
78
+ --text-sm--line-height: calc(6px + 2.125ex);
79
+ --text-md: clamp(1.13rem, 0.21vw + 1.08rem, 1.33rem);
80
+ --text-md--line-height: calc(6px + 2.125ex);
81
+ --text-lg: clamp(1.27rem, 0.51vw + 1.16rem, 1.78rem);
82
+ --text-lg--line-height: calc(6px + 2.125ex);
83
+ --text-xl: clamp(1.42rem, 0.94vw + 1.23rem, 2.37rem);
84
+ --text-xl--line-height: calc(6px + 2.125ex);
85
+ --text-2xl: clamp(1.6rem, 1.56vw + 1.29rem, 3.16rem);
86
+ --text-2xl--line-height: calc(6px + 2.125ex);
87
+ --breakpoint-xs: 480px;
88
+ --breakpoint-sm: 760px;
89
+ --breakpoint-md: 1000px;
90
+ --breakpoint-lg: 1300px;
91
+ --breakpoint-xl: 1760px;
92
+ --breakpoint-2xl: 1920px;
93
+ --spacing: 0.25rem;
94
+ --spacing-fluid-xs: clamp(4px, 0.25vw + 3px, 8px);
95
+ --spacing-fluid-sm: clamp(8px, 0.5vw + 6px, 16px);
96
+ --spacing-fluid-md: clamp(16px, 1.25vw + 12px, 36px);
97
+ --spacing-fluid-lg: clamp(32px, 2.75vw + 23px, 76px);
98
+ --spacing-fluid-xl: clamp(48px, 3vw + 38px, 96px);
99
+ --spacing-fluid-2xl: clamp(80px, 7.5vw + 56px, 200px);
100
+ --spacing-static-xs: 4px;
101
+ --spacing-static-sm: 8px;
102
+ --spacing-static-md: 16px;
103
+ --spacing-static-lg: 32px;
104
+ --spacing-static-xl: 48px;
105
+ --spacing-static-2xl: 80px;
106
+ --radius-sm: 4px;
107
+ --radius-md: 8px;
108
+ --radius-lg: 12px;
109
+ --default-border-width: 2px;
110
+ --border-width-thin: 1px;
111
+ --blur-frosted: 32px;
112
+ --shadow-low: 0px 3px 8px rgba(0,0,0,.16);
113
+ --shadow-medium: 0px 4px 16px rgba(0,0,0,.16);
114
+ --shadow-high: 0px 8px 40px rgba(0,0,0,.16);
115
+ --default-outline-width: 2px;
116
+ --default-transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
117
+ --ease-in-out: cubic-bezier(0.25, 0.1, 0.25, 1);
118
+ --ease-in: cubic-bezier(0, 0, 0.2, 1);
119
+ --ease-out: cubic-bezier(0.4, 0, 0.5, 1);
120
+ --default-transition-duration: 0.25s;
121
+ --transition-duration-short: 0.25s;
122
+ --transition-duration-moderate: 0.4s;
123
+ --transition-duration-long: 0.6s;
124
+ --transition-duration-very-long: 1.2s;
125
+ --animate-skeleton: skeleton var(--transition-duration-long) var(--ease-in-out) infinite;
126
+ @keyframes skeleton {
127
+ from {
128
+ background-position-x: 100%;
129
+ }
130
+ to {
131
+ background-position-x: -100%;
132
+ }
133
+ }
134
+ }
135
+ @layer theme {
136
+ .light {
137
+ --color-primary: #010205;
138
+ --color-base: #fff;
139
+ --color-surface: #eeeff2;
140
+ --color-shading: rgba(1, 2, 5, 0.67);
141
+ --color-frosted: hsla(240, 4%, 85%, 0.35);
142
+ --color-contrast-low: #d8d8db;
143
+ --color-contrast-medium: #6b6d70;
144
+ --color-contrast-high: #535457;
145
+ --color-success: #197e10;
146
+ --color-success-soft: #e4ffec;
147
+ --color-warning: #f3be00;
148
+ --color-warning-soft: #fff4d2;
149
+ --color-error: #cc1922;
150
+ --color-error-soft: #ffe2e4;
151
+ --color-info: #2762ec;
152
+ --color-info-soft: #d3e1ff;
153
+ --color-hover: rgba(148, 149, 152, 0.18);
154
+ --color-active: rgba(148, 149, 152, 0.2);
155
+ --color-focus: #1a44ea;
156
+ --color-disabled: #949598;
157
+ --color-skeleton: #f7f7f7;
158
+ }
159
+ .dark {
160
+ --color-primary: #fbfcff;
161
+ --color-base: #0e0e12;
162
+ --color-surface: #212225;
163
+ --color-shading: rgba(38, 38, 41, 0.67);
164
+ --color-frosted: hsla(240, 3%, 26%, 0.35);
165
+ --color-contrast-low: #404044;
166
+ --color-contrast-medium: #88898c;
167
+ --color-contrast-high: #afb0b3;
168
+ --color-success: #09d087;
169
+ --color-success-soft: #003320;
170
+ --color-warning: #f7cb47;
171
+ --color-warning-soft: #362b0a;
172
+ --color-error: #fc4040;
173
+ --color-error-soft: #3a0f0f;
174
+ --color-info: #178bff;
175
+ --color-info-soft: #04294e;
176
+ --color-hover: rgba(148, 149, 152, 0.18);
177
+ --color-active: rgba(126, 127, 130, 0.2);
178
+ --color-focus: #1a44ea;
179
+ --color-disabled: #7e7f82;
180
+ --color-skeleton: #1a1b1e;
181
+ }
182
+ @media (prefers-color-scheme: dark) {
183
+ .auto {
184
+ --color-primary: #fbfcff;
185
+ --color-base: #0e0e12;
186
+ --color-surface: #212225;
187
+ --color-shading: rgba(38, 38, 41, 0.67);
188
+ --color-frosted: hsla(240, 3%, 26%, 0.35);
189
+ --color-contrast-low: #404044;
190
+ --color-contrast-medium: #88898c;
191
+ --color-contrast-high: #afb0b3;
192
+ --color-success: #09d087;
193
+ --color-success-soft: #003320;
194
+ --color-warning: #f7cb47;
195
+ --color-warning-soft: #362b0a;
196
+ --color-error: #fc4040;
197
+ --color-error-soft: #3a0f0f;
198
+ --color-info: #178bff;
199
+ --color-info-soft: #04294e;
200
+ --color-hover: rgba(148, 149, 152, 0.18);
201
+ --color-active: rgba(126, 127, 130, 0.2);
202
+ --color-focus: #1a44ea;
203
+ --color-disabled: #7e7f82;
204
+ --color-skeleton: #1a1b1e;
205
+ }
206
+ }
207
+ }
208
+ @utility bg-fade-to-t {
209
+ @apply bg-linear-[to_top,hsla(0,0%,0%,.8)_0%,hsla(0,0%,0%,.8)_8.1%,hsla(0,0%,0%,.8)_15.5%,hsla(0,0%,0%,.8)_22.5%,hsla(0,0%,0%,.78)_29%,hsla(0,0%,0%,.73)_35.3%,hsla(0,0%,0%,.67)_41.2%,hsla(0,0%,0%,.6)_47.1%,hsla(0,0%,0%,.52)_52.9%,hsla(0,0%,0%,.44)_58.8%,hsla(0,0%,0%,.33)_64.7%,hsla(0,0%,0%,.22)_71%,hsla(0,0%,0%,.12)_77.5%,hsla(0,0%,0%,.05)_84.5%,hsla(0,0%,0%,.011)_91.9%,hsla(0,0%,0%,0)_100%];
210
+ }
211
+ @utility bg-fade-to-r {
212
+ @apply bg-linear-[to_right,hsla(0,0%,0%,.8)_0%,hsla(0,0%,0%,.8)_8.1%,hsla(0,0%,0%,.8)_15.5%,hsla(0,0%,0%,.8)_22.5%,hsla(0,0%,0%,.78)_29%,hsla(0,0%,0%,.73)_35.3%,hsla(0,0%,0%,.67)_41.2%,hsla(0,0%,0%,.6)_47.1%,hsla(0,0%,0%,.52)_52.9%,hsla(0,0%,0%,.44)_58.8%,hsla(0,0%,0%,.33)_64.7%,hsla(0,0%,0%,.22)_71%,hsla(0,0%,0%,.12)_77.5%,hsla(0,0%,0%,.05)_84.5%,hsla(0,0%,0%,.011)_91.9%,hsla(0,0%,0%,0)_100%];
213
+ }
214
+ @utility bg-fade-to-b {
215
+ @apply bg-linear-[to_bottom,hsla(0,0%,0%,.8)_0%,hsla(0,0%,0%,.8)_8.1%,hsla(0,0%,0%,.8)_15.5%,hsla(0,0%,0%,.8)_22.5%,hsla(0,0%,0%,.78)_29%,hsla(0,0%,0%,.73)_35.3%,hsla(0,0%,0%,.67)_41.2%,hsla(0,0%,0%,.6)_47.1%,hsla(0,0%,0%,.52)_52.9%,hsla(0,0%,0%,.44)_58.8%,hsla(0,0%,0%,.33)_64.7%,hsla(0,0%,0%,.22)_71%,hsla(0,0%,0%,.12)_77.5%,hsla(0,0%,0%,.05)_84.5%,hsla(0,0%,0%,.011)_91.9%,hsla(0,0%,0%,0)_100%];
216
+ }
217
+ @utility bg-fade-to-l {
218
+ @apply bg-linear-[to_left,hsla(0,0%,0%,.8)_0%,hsla(0,0%,0%,.8)_8.1%,hsla(0,0%,0%,.8)_15.5%,hsla(0,0%,0%,.8)_22.5%,hsla(0,0%,0%,.78)_29%,hsla(0,0%,0%,.73)_35.3%,hsla(0,0%,0%,.67)_41.2%,hsla(0,0%,0%,.6)_47.1%,hsla(0,0%,0%,.52)_52.9%,hsla(0,0%,0%,.44)_58.8%,hsla(0,0%,0%,.33)_64.7%,hsla(0,0%,0%,.22)_71%,hsla(0,0%,0%,.12)_77.5%,hsla(0,0%,0%,.05)_84.5%,hsla(0,0%,0%,.011)_91.9%,hsla(0,0%,0%,0)_100%];
219
+ }
220
+ @utility grid-template {
221
+ @apply [--pds-internal-grid-safe-zone:max(22px,10.625vw-12px)]
222
+ [--_pds-grid-col:minmax(0,var(--pds-internal-grid-outer-column,calc(var(--pds-internal-grid-safe-zone)-var(--spacing-fluid-md))))]
223
+ grid
224
+ grid-cols-[[full-start]_var(--_pds-grid-col)_[wide-start_extended-start_basic-start_narrow-start]_repeat(6,minmax(0,1fr))_[narrow-end_basic-end_extended-end_wide-end]_var(--_pds-grid-col)_[full-end]]
225
+ gap-(--spacing-fluid-md)
226
+ min-w-[var(--pds-internal-grid-width-min,320px)]
227
+ max-w-[var(--pds-internal-grid-width-max,2560px)]
228
+ box-content
229
+ mx-(--pds-internal-grid-margin,0)
230
+ px-[calc(50%-var(--pds-internal-grid-margin,0px)-2560px/2)]
231
+ sm:[--pds-internal-grid-safe-zone:calc(5vw-16px)]
232
+ sm:grid-cols-[[full-start]_var(--_pds-grid-col)_[wide-start]_minmax(0,1fr)_[extended-start]_minmax(0,1fr)_[basic-start]_repeat(2,minmax(0,1fr))_[narrow-start]_repeat(8,minmax(0,1fr))_[narrow-end]_repeat(2,minmax(0,1fr))_[basic-end]_minmax(0,1fr)_[extended-end]_minmax(0,1fr)_[wide-end]_var(--_pds-grid-col)[full-end]]
233
+ 2xl:[--pds-internal-grid-safe-zone:min(50vw-880px,400px)];
234
+ }
235
+ @utility col-narrow {
236
+ @apply [--_pds-grid-one-half:3] sm:[--_pds-grid-one-half:4] col-[narrow];
237
+ }
238
+ @utility col-start-narrow {
239
+ @apply [--_pds-grid-one-half:3] sm:[--_pds-grid-one-half:4] col-start-[narrow-start];
240
+ }
241
+ @utility col-end-narrow {
242
+ @apply [--_pds-grid-one-half:3] sm:[--_pds-grid-one-half:4] col-end-[narrow-end];
243
+ }
244
+ @utility col-basic {
245
+ @apply [--_pds-grid-one-half:3] [--_pds-grid-one-third:2] [--_pds-grid-two-thirds:4] sm:[--_pds-grid-one-half:6] sm:[--_pds-grid-one-third:4] sm:[--_pds-grid-two-thirds:8] col-[basic];
246
+ }
247
+ @utility col-start-basic {
248
+ @apply [--_pds-grid-one-half:3] [--_pds-grid-one-third:2] [--_pds-grid-two-thirds:4] sm:[--_pds-grid-one-half:6] sm:[--_pds-grid-one-third:4] sm:[--_pds-grid-two-thirds:8] col-start-[basic-start];
249
+ }
250
+ @utility col-end-basic {
251
+ @apply [--_pds-grid-one-half:3] [--_pds-grid-one-third:2] [--_pds-grid-two-thirds:4] sm:[--_pds-grid-one-half:6] sm:[--_pds-grid-one-third:4] sm:[--_pds-grid-two-thirds:8] col-end-[basic-end];
252
+ }
253
+ @utility col-extended {
254
+ @apply [--_pds-grid-one-half:3] sm:[--_pds-grid-one-half:7] col-[extended];
255
+ }
256
+ @utility col-start-extended {
257
+ @apply [--_pds-grid-one-half:3] sm:[--_pds-grid-one-half:7] col-start-[extended-start];
258
+ }
259
+ @utility col-end-extended {
260
+ @apply [--_pds-grid-one-half:3] sm:[--_pds-grid-one-half:7] col-end-[extended-end];
261
+ }
262
+ @utility col-wide {
263
+ @apply [--_pds-grid-one-half:3] sm:[--_pds-grid-one-half:8] col-[wide];
264
+ }
265
+ @utility col-start-wide {
266
+ @apply [--_pds-grid-one-half:3] sm:[--_pds-grid-one-half:8] col-start-[wide-start];
267
+ }
268
+ @utility col-end-wide {
269
+ @apply [--_pds-grid-one-half:3] sm:[--_pds-grid-one-half:8] col-end-[wide-end];
270
+ }
271
+ @utility col-full {
272
+ @apply col-[full];
273
+ }
274
+ @utility col-start-full {
275
+ @apply col-start-[full-start];
276
+ }
277
+ @utility col-end-full {
278
+ @apply col-end-[full-end];
279
+ }
280
+ @utility col-span-one-half {
281
+ @apply col-span-(--_pds-grid-one-half,1);
282
+ }
283
+ @utility col-span-one-third {
284
+ @apply col-span-(--_pds-grid-one-third,1);
285
+ }
286
+ @utility col-span-two-thirds {
287
+ @apply col-span-(--_pds-grid-two-thirds,1);
288
+ }
289
+ @utility skeleton {
290
+ @apply animate-skeleton;
291
+ @apply block rounded-sm;
292
+ @apply bg-surface bg-[linear-gradient(to_right,transparent_0%,var(--color-skeleton)_20%,transparent_50%)] bg-position-[0_0] bg-size-[200%_100%];
293
+ }
294
+ @utility skeleton-light {
295
+ @apply animate-skeleton;
296
+ @apply block rounded-sm;
297
+ @apply bg-surface-light bg-[linear-gradient(to_right,transparent_0%,var(--color-skeleton-light)_20%,transparent_50%)] bg-position-[0_0] bg-size-[200%_100%];
298
+ }
299
+ @utility skeleton-dark {
300
+ @apply animate-skeleton;
301
+ @apply block rounded-sm;
302
+ @apply bg-surface-dark bg-[linear-gradient(to_right,transparent_0%,var(--color-skeleton-dark)_20%,transparent_50%)] bg-position-[0_0] bg-size-[200%_100%];
303
+ }
304
+ @utility prose-text-2xs {
305
+ @apply font-porsche-next not-italic font-normal text-2xs text-primary;
306
+ }
307
+ @utility prose-text-xs {
308
+ @apply font-porsche-next not-italic font-normal text-xs text-primary;
309
+ }
310
+ @utility prose-text-sm {
311
+ @apply font-porsche-next not-italic font-normal text-sm text-primary;
312
+ }
313
+ @utility prose-text-md {
314
+ @apply font-porsche-next not-italic font-normal text-md text-primary;
315
+ }
316
+ @utility prose-text-lg {
317
+ @apply font-porsche-next not-italic font-normal text-lg text-primary;
318
+ }
319
+ @utility prose-text-xl {
320
+ @apply font-porsche-next not-italic font-normal text-xl text-primary;
321
+ }
322
+ @utility prose-heading-sm {
323
+ @apply font-porsche-next not-italic font-semibold text-sm text-primary;
324
+ }
325
+ @utility prose-heading-md {
326
+ @apply font-porsche-next not-italic font-semibold text-md text-primary;
327
+ }
328
+ @utility prose-heading-lg {
329
+ @apply font-porsche-next not-italic font-semibold text-lg text-primary;
330
+ }
331
+ @utility prose-heading-xl {
332
+ @apply font-porsche-next not-italic font-semibold text-xl text-primary;
333
+ }
334
+ @utility prose-heading-2xl {
335
+ @apply font-porsche-next not-italic font-semibold text-2xl text-primary;
336
+ }
337
+ @utility prose-display-sm {
338
+ @apply font-porsche-next not-italic font-normal leading-normal text-primary;
339
+ font-size: clamp(1.8rem, 2.41vw + 1.32rem, 4.21rem);
340
+ }
341
+ @utility prose-display-md {
342
+ @apply font-porsche-next not-italic font-normal leading-normal text-primary;
343
+ font-size: clamp(2.03rem, 3.58vw + 1.31rem, 5.61rem);
344
+ }
345
+ @utility prose-display-lg {
346
+ @apply font-porsche-next not-italic font-normal leading-normal text-primary;
347
+ font-size: clamp(2.28rem, 5.2vw + 1.24rem, 7.48rem);
348
+ }