@pantheon-systems/pds-toolkit-react 2.0.0-alpha.76 → 2.0.0-alpha.78

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.
Files changed (30) hide show
  1. package/dist/components/Dropdown/Dropdown.d.ts +67 -2
  2. package/dist/components/RowActionsMenu/RowActionsMenu.d.ts +46 -0
  3. package/dist/components/buttons/MenuButton/MenuButton.d.ts +16 -2
  4. package/dist/components/cards/Card/Card.d.ts +2 -2
  5. package/dist/components/empty-states/VerticalEmptyState/VerticalEmptyState.d.ts +3 -2
  6. package/dist/components/icons/Icon/generated-icon-data.d.ts +1 -1
  7. package/dist/components/links/CTALink/CTALink.d.ts +2 -2
  8. package/dist/components/links/LinkNewWindow/LinkNewWindow.d.ts +1 -1
  9. package/dist/components/panels/FeaturePanel/FeaturePanel.d.ts +72 -0
  10. package/dist/components/panels/WidgetPanel/WidgetPanel.d.ts +39 -0
  11. package/dist/css/component-css/pds-cta-link.css +1 -1
  12. package/dist/css/component-css/pds-dropdown.css +2 -1
  13. package/dist/css/component-css/pds-feature-panel.css +15 -0
  14. package/dist/css/component-css/pds-index.css +21 -5
  15. package/dist/css/component-css/pds-link-new-window.css +1 -1
  16. package/dist/css/component-css/pds-row-actions-menu.css +2 -0
  17. package/dist/css/component-css/pds-widget-panel.css +1 -0
  18. package/dist/css/layout-css/pds-sidebar-layout.css +11 -3
  19. package/dist/css/pds-components.css +21 -5
  20. package/dist/css/pds-core.css +1 -1
  21. package/dist/index.css +1 -1
  22. package/dist/index.d.ts +4 -0
  23. package/dist/index.js +1954 -1804
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.source.d.ts +4 -0
  26. package/dist/layouts/SidebarLayout/SidebarLayout.d.ts +22 -3
  27. package/dist/libs/types/layout-types.d.ts +1 -0
  28. package/dist/utilities/auto-grid/AutoGrid.d.ts +48 -0
  29. package/dist/utilities/hooks/useDropdown/useDropdown.d.ts +11 -1
  30. package/package.json +1 -1
@@ -1,5 +1,6 @@
1
- import { ComponentPropsWithoutRef, ReactNode } from 'react';
1
+ import React, { ComponentPropsWithoutRef, ReactNode } from 'react';
2
2
  import { UseDropdownOptions } from '../../utilities/hooks/useDropdown';
3
+ import { MenuButtonProps } from '../buttons/MenuButton/MenuButton';
3
4
  import './dropdown.css';
4
5
  export interface DropdownProps extends UseDropdownOptions {
5
6
  /**
@@ -19,12 +20,19 @@ export interface DropdownProps extends UseDropdownOptions {
19
20
  }
20
21
  /**
21
22
  * Root Dropdown component. Provides dropdown context to sub-components.
23
+ *
24
+ * Wraps the actual implementation in a Floating UI tree boundary: when
25
+ * nested inside another floating panel, it joins that panel's tree so
26
+ * outside-clicks and Escape inside this dropdown resolve to this (innermost)
27
+ * dropdown without wrongly dismissing the parent. When not nested, it
28
+ * provides its own single-node tree — no consumer opt-in needed.
22
29
  */
23
30
  export declare const Dropdown: {
24
- ({ children, className, inline, ...options }: DropdownProps): import("react/jsx-runtime").JSX.Element;
31
+ (props: DropdownProps): import("react/jsx-runtime").JSX.Element;
25
32
  Trigger: ({ children, className, showTriggerIcon, ...props }: DropdownTriggerProps) => import("react/jsx-runtime").JSX.Element;
26
33
  Panel: ({ children, className, ...props }: DropdownPanelProps) => import("react/jsx-runtime").JSX.Element;
27
34
  Item: ({ children, className, closeOnSelect, description, disabled, icon, index, isActive, isCritical, onClick, onKeyDown, trailingIcon, ...props }: DropdownItemProps) => import("react/jsx-runtime").JSX.Element;
35
+ ActionItem: ({ children, className, closeOnSelect, description, disabled, icon, index, isActive, linkContent, menuAriaLabel, menuItems, onClick, onKeyDown, ...props }: DropdownActionItemProps) => import("react/jsx-runtime").JSX.Element;
28
36
  CheckboxItem: ({ checked, children, className, description, disabled, indeterminate, index, onCheckedChange, onClick, onKeyDown, ...props }: DropdownCheckboxItemProps) => import("react/jsx-runtime").JSX.Element;
29
37
  Heading: ({ children, className, ...props }: DropdownHeadingProps) => import("react/jsx-runtime").JSX.Element;
30
38
  Separator: ({ className, ...props }: DropdownSeparatorProps) => import("react/jsx-runtime").JSX.Element;
@@ -99,6 +107,63 @@ export interface DropdownItemProps extends ComponentPropsWithoutRef<'li'> {
99
107
  */
100
108
  trailingIcon?: ReactNode;
101
109
  }
110
+ export interface DropdownActionItemProps extends Omit<ComponentPropsWithoutRef<'li'>, 'onClick'> {
111
+ /**
112
+ * Item content — label text. Rendered inside `linkContent` when provided.
113
+ */
114
+ children?: ReactNode;
115
+ /**
116
+ * Additional class names.
117
+ */
118
+ className?: string;
119
+ /**
120
+ * Close the dropdown when the row is selected (default: true).
121
+ */
122
+ closeOnSelect?: boolean;
123
+ /**
124
+ * Secondary text displayed below the label.
125
+ */
126
+ description?: ReactNode;
127
+ /**
128
+ * Disabled state. Disables row selection only — the trailing kebab menu
129
+ * stays available.
130
+ */
131
+ disabled?: boolean;
132
+ /**
133
+ * Leading content — PDSIcon name, or custom ReactNode (Avatar, etc.).
134
+ */
135
+ icon?: ReactNode;
136
+ /**
137
+ * Index of this item in the list (required for keyboard navigation).
138
+ */
139
+ index: number;
140
+ /**
141
+ * Selected or current state.
142
+ */
143
+ isActive?: boolean;
144
+ /**
145
+ * Link element to navigate to on selection (e.g. `<a href='...'>` or a
146
+ * router `Link`). Takes precedence over `onClick` when both are given —
147
+ * pass whichever matches how selecting this row should behave.
148
+ */
149
+ linkContent?: ReactNode;
150
+ /**
151
+ * Contextual label for the row's kebab menu, e.g. `Actions for ${item.title}`.
152
+ * Supplied per-row by the consumer — required, since a plain "Actions"
153
+ * label isn't distinguishable between rows for screen reader users.
154
+ */
155
+ menuAriaLabel: string;
156
+ /**
157
+ * Menu items for the kebab's menu — passed straight through to the
158
+ * underlying `MenuButton`.
159
+ */
160
+ menuItems: MenuButtonProps['menuItems'];
161
+ /**
162
+ * Callback fired when the row is selected. Ignored when `linkContent` is
163
+ * given — the link's own navigation is the selection behavior.
164
+ */
165
+ onClick?: (event: React.SyntheticEvent<HTMLElement>) => void;
166
+ }
102
167
  export interface DropdownCheckboxItemProps extends Omit<ComponentPropsWithoutRef<'li'>, 'onChange'> {
103
168
  /**
104
169
  * Checked state of the item.
@@ -0,0 +1,46 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ import { MenuButton } from '../buttons/MenuButton/MenuButton';
3
+ import './row-actions-menu.css';
4
+ /**
5
+ * Prop types for RowActionsMenu
6
+ */
7
+ export interface RowActionsMenuProps extends ComponentPropsWithoutRef<'div'> {
8
+ /**
9
+ * Arbitrary leading row content.
10
+ */
11
+ children: ReactNode;
12
+ /**
13
+ * Additional class names
14
+ */
15
+ className?: string;
16
+ /**
17
+ * Contextual label for the row's kebab menu, e.g. `Actions for ${item.title}`.
18
+ * Supplied per-row by the consumer — required, since a plain "Actions"
19
+ * label isn't distinguishable between rows for screen reader users.
20
+ */
21
+ menuAriaLabel: string;
22
+ /**
23
+ * Menu items for the kebab's menu — passed straight through to the
24
+ * underlying `MenuButton`. Use `isCritical`/`criticalLabel` on an item
25
+ * for a destructive action (e.g. "Remove").
26
+ */
27
+ menuItems: ComponentPropsWithoutRef<typeof MenuButton>['menuItems'];
28
+ /**
29
+ * Where this row is being used, for the hover/active fill style. `dropdown`
30
+ * (default) is an inset rounded pill, matching a floating menu's own items
31
+ * (e.g. nested inside `Dropdown`). `panel` fills edge-to-edge with square
32
+ * corners, matching a flush list inside a panel/widget (e.g. `WidgetPanel`).
33
+ */
34
+ variant?: 'dropdown' | 'panel';
35
+ }
36
+ /**
37
+ * RowActionsMenu UI component.
38
+ *
39
+ * A generic row primitive: arbitrary leading content plus a trailing kebab
40
+ * button that's visually revealed on hover and keyboard focus, opening a
41
+ * `MenuButton` actions menu. Not specific to any one consumer — meant to be
42
+ * reused anywhere a list needs a per-row actions menu (e.g. bookmarks,
43
+ * recent sites). Safe to nest inside another floating panel (e.g. a
44
+ * `Dropdown`) — see `MenuButton`/`Dropdown`'s Floating UI tree handling.
45
+ */
46
+ export declare const RowActionsMenu: ({ children, className, menuAriaLabel, menuItems, variant, ...props }: RowActionsMenuProps) => import("react/jsx-runtime").JSX.Element;
@@ -57,6 +57,14 @@ export interface MenuButtonProps extends ComponentPropsWithRef<'span'> {
57
57
  * Optional callback function for when the button is clicked or activated by the keyboard.
58
58
  */
59
59
  onClick?: () => void;
60
+ /**
61
+ * Optional callback fired whenever the menu's open state changes. Use
62
+ * this to manage focus deliberately when this MenuButton is nested
63
+ * inside another floating panel — e.g. return focus to the row that
64
+ * owns this menu when it closes, rather than leaving it to Floating UI's
65
+ * default (which can otherwise leave focus on an ancestor panel).
66
+ */
67
+ onOpenChange?: (isOpen: boolean) => void;
60
68
  /**
61
69
  * Which size of button to render.
62
70
  */
@@ -91,7 +99,13 @@ export interface MenuButtonProps extends ComponentPropsWithRef<'span'> {
91
99
  variant?: Extract<ButtonVariant, 'primary' | 'secondary' | 'subtle' | 'reverse-secondary'> | 'navbar';
92
100
  }
93
101
  /**
94
- * MenuButton UI component
102
+ * MenuButton UI component.
103
+ *
104
+ * Wraps the actual implementation in a Floating UI tree boundary: when
105
+ * nested inside another floating panel (e.g. a `Dropdown`'s panel), it joins
106
+ * that panel's tree so outside-clicks and Escape inside this menu resolve to
107
+ * this (innermost) menu without wrongly dismissing the parent. When not
108
+ * nested, it provides its own single-node tree — no consumer opt-in needed.
95
109
  */
96
- export declare const MenuButton: ({ className, disabled, iconName, iconOnly, id, isMobileAccordion, isSplitButton, label, menuItems, onClick, size, statusDot, tally, testId, undefinedLabel, variant, ...props }: MenuButtonProps) => import("react/jsx-runtime").JSX.Element;
110
+ export declare const MenuButton: (props: MenuButtonProps) => import("react/jsx-runtime").JSX.Element;
97
111
  export {};
@@ -1,7 +1,7 @@
1
1
  import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
- import { CardBackground, CardPaddingScale } from '../../../libs/types/layout-types';
2
+ import { CardBackground, CardPaddingScale, ImageDisplayVariant } from '../../../libs/types/layout-types';
3
3
  import './card.css';
4
- export type CardImageVariant = 'bleed' | 'inset';
4
+ export type CardImageVariant = ImageDisplayVariant;
5
5
  /**
6
6
  * Prop types for Card
7
7
  */
@@ -24,10 +24,11 @@ export interface VerticalEmptyStateProps extends ComponentPropsWithoutRef<'div'>
24
24
  headingLevel?: HeadingLevel;
25
25
  /**
26
26
  * PDS illustration image to display above the heading.
27
- * Should be a link to an SVG file, either from Brandfolder or local.
27
+ * Can be a string (a link to an SVG file, either from Brandfolder or
28
+ * local) or a React node (e.g. a Spinner, for in-progress empty states).
28
29
  * See full documentation for details.
29
30
  */
30
- image?: string;
31
+ image?: string | ReactNode;
31
32
  /**
32
33
  * Height of the image (CSS value like '200px', '50%', etc.)
33
34
  */
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Generated by: npm run generate:icon-data
5
5
  * Source: icon-registry.ts + Font Awesome packages + custom-icons.tsx
6
- * Generated: 2026-08-26T17:15:13.189Z
6
+ * Generated: 2026-08-31T17:35:35.642Z
7
7
  */
8
8
  import { customIcons } from './custom-icons';
9
9
  export { customIcons };
@@ -10,9 +10,9 @@ export interface CTALinkProps extends ComponentPropsWithoutRef<'div'> {
10
10
  */
11
11
  linkContent?: ReactNode;
12
12
  /**
13
- * Size of link
13
+ * Size of link. `s` (default) is 14px text; `m` is 16px text.
14
14
  */
15
- size?: 'xs' | 's' | 'm';
15
+ size?: 's' | 'm';
16
16
  }
17
17
  /**
18
18
  * CTA Link UI component
@@ -15,7 +15,7 @@ export interface LinkNewWindowProps extends ComponentPropsWithoutRef<'a'> {
15
15
  /**
16
16
  * Optional font size for the LinkNewWindow. If not provided, the font size will be inherited from the parent element.
17
17
  */
18
- fontSize?: 's' | 'm' | 'l';
18
+ fontSize?: 's' | 'm';
19
19
  /**
20
20
  * Is the link in the process of loading?
21
21
  */
@@ -0,0 +1,72 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ import { ImageDisplayVariant } from '../../../libs/types/layout-types';
3
+ import { Button } from '../../buttons/Button/Button';
4
+ import { ButtonLink } from '../../buttons/ButtonLink/ButtonLink';
5
+ import './feature-panel.css';
6
+ /**
7
+ * Prop types for FeaturePanel
8
+ */
9
+ export interface FeaturePanelProps extends Omit<ComponentPropsWithoutRef<'div'>, 'children'> {
10
+ /**
11
+ * Additional class names
12
+ */
13
+ className?: string;
14
+ /**
15
+ * Body content.
16
+ */
17
+ content: string;
18
+ /**
19
+ * Props for an optional call to action. Pass `ButtonLink` props (must
20
+ * include `linkContent`) to render a link, or `Button` props to render a
21
+ * button. Always renders at `variant="brand"` `size="sm"` regardless of
22
+ * what's passed in.
23
+ */
24
+ cta?: ComponentPropsWithoutRef<typeof Button> | ComponentPropsWithoutRef<typeof ButtonLink>;
25
+ /**
26
+ * Label for the close button. Provide a translation string if needed.
27
+ */
28
+ dismissLabel?: string;
29
+ /**
30
+ * Heading text. Rendered as an `h2`.
31
+ */
32
+ heading: string;
33
+ /**
34
+ * An optional image. Pass the full element, e.g.
35
+ * `<img alt="..." src="..." />`. Aspect ratio isn't enforced, but
36
+ * `1:1`–`3:2` works best in `vertical` layout, and `1:1` is a reasonable
37
+ * starting point for `horizontal` (see the MDX docs for why — that one
38
+ * shifts with panel width and copy length, so preview it for real).
39
+ */
40
+ image?: ReactNode;
41
+ /**
42
+ * Controls how the image fills its side of the panel. Only relevant when
43
+ * an image is provided.
44
+ * - `bleed` (default): image extends to the panel edges, corners rounded
45
+ * only where it meets the panel's own edge.
46
+ * - `inset`: image has padding on all sides, all corners rounded.
47
+ */
48
+ imageVariant?: ImageDisplayVariant;
49
+ /**
50
+ * Shows a close button in the upper-right corner that calls `onDismiss`
51
+ * when clicked. The panel does not remove or hide itself — that's up to
52
+ * the consumer.
53
+ */
54
+ isDismissible?: boolean;
55
+ /**
56
+ * Which way the panel lays out its image and content.
57
+ * - `vertical` (default): image on top, content below.
58
+ * - `horizontal`: image on the left, content on the right. Only takes
59
+ * effect at the `bp-m` breakpoint and up — below that it collapses to
60
+ * the same stacked layout as `vertical`.
61
+ */
62
+ layout?: 'horizontal' | 'vertical';
63
+ /**
64
+ * Called when the close button is clicked. Required in practice when
65
+ * `isDismissible` is true.
66
+ */
67
+ onDismiss?: () => void;
68
+ }
69
+ /**
70
+ * FeaturePanel UI component
71
+ */
72
+ export declare const FeaturePanel: ({ className, content, cta, dismissLabel, heading, image, imageVariant, isDismissible, layout, onDismiss, ...props }: FeaturePanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,39 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ import { PDSIcon } from '../../icons/Icon/Icon';
3
+ import './widget-panel.css';
4
+ /**
5
+ * Prop types for WidgetPanel
6
+ */
7
+ export interface WidgetPanelProps extends ComponentPropsWithoutRef<'div'> {
8
+ /**
9
+ * Main content. Unslotted -- fully composable (list rows, a search
10
+ * input, inline CTAs, dividers, etc). Pass a child with `slot="footer"`
11
+ * to render it in the footer instead.
12
+ */
13
+ children: ReactNode;
14
+ /**
15
+ * Additional class names
16
+ */
17
+ className?: string;
18
+ /**
19
+ * Caps the height of the content region only -- the header and footer
20
+ * stay fixed-size. Set in `vh`, `rem`, or `px`. Without it, the content
21
+ * region fills and scrolls within whatever height a parent container
22
+ * constrains the panel to.
23
+ */
24
+ contentMaxHeight?: string;
25
+ /**
26
+ * Heading text. Always rendered as an `h2`, but sized smaller than an
27
+ * `h2` default -- semantic level and visual size are decoupled here.
28
+ */
29
+ heading: string;
30
+ /**
31
+ * An optional icon shown before the heading. Encouraged, but not
32
+ * required.
33
+ */
34
+ icon?: PDSIcon;
35
+ }
36
+ /**
37
+ * WidgetPanel UI component
38
+ */
39
+ export declare const WidgetPanel: ({ children, className, contentMaxHeight, heading, icon, ...props }: WidgetPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- @layer pds-v1, pds-v2;@layer pds-v2{.pds-cta-link{--cta-link-size:var(--pds-typography-size-m);--cta-link-color:var(--pds-color-interactive-link-default);--cta-link-gap:var(--pds-spacing-3xs);align-items:center;display:inline-flex;gap:var(--cta-link-gap);padding:.25rem 0}.pds-cta-link a,.pds-cta-link button{color:var(--cta-link-color);font-family:var(--pds-typography-ff-default);font-size:var(--cta-link-size);font-weight:var(--pds-typography-fw-bold);letter-spacing:var(--pds-typography-ls-s);line-height:var(--pds-typography-lh-s);text-decoration:none;transition:var(--pds-animation-transition-link)}.pds-cta-link a:hover,.pds-cta-link button:hover{color:var(--cta-link-color)}.pds-cta-link a:focus-visible,.pds-cta-link button:focus-visible{border-radius:var(--pds-border-radius-default);outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:.25rem;text-decoration:none}.pds-cta-link button{background:none;border:none;cursor:pointer;padding:0}.pds-cta-link .pds-cta-link__icon{color:var(--cta-link-color);transition:var(--pds-animation-transition-link)}.pds-cta-link:hover{--cta-link-color:var(--pds-color-interactive-link-hover)}.pds-cta-link:active{--cta-link-color:var(--pds-color-interactive-link-active);outline:none;text-decoration:none}.pds-cta-link--xs{--cta-link-gap:var(--pds-spacing-3xs);--cta-link-size:var(--pds-typography-size-s)}.pds-cta-link--m{--cta-link-gap:var(--pds-spacing-2xs);--cta-link-size:var(--pds-typography-size-l)}.pds-link-group{display:flex;flex-direction:column;row-gap:var(--pds-spacing-m)}}
1
+ @layer pds-v1, pds-v2;@layer pds-v2{.pds-cta-link{--cta-link-size:var(--pds-typography-size-s);--cta-link-color:var(--pds-color-interactive-link-default);--cta-link-gap:var(--pds-spacing-3xs);align-items:center;display:inline-flex;gap:var(--cta-link-gap);padding:.25rem 0}.pds-cta-link a,.pds-cta-link button{color:var(--cta-link-color);font-family:var(--pds-typography-ff-default);font-size:var(--cta-link-size);font-weight:var(--pds-typography-fw-medium);letter-spacing:var(--pds-typography-ls-s);line-height:var(--pds-typography-lh-s);text-decoration:none;transition:var(--pds-animation-transition-link)}.pds-cta-link a:hover,.pds-cta-link button:hover{color:var(--cta-link-color)}.pds-cta-link a:focus-visible,.pds-cta-link button:focus-visible{border-radius:var(--pds-border-radius-default);outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:.25rem;text-decoration:none}.pds-cta-link button{background:none;border:none;cursor:pointer;padding:0}.pds-cta-link .pds-cta-link__icon{color:var(--cta-link-color);transition:var(--pds-animation-transition-link)}.pds-cta-link:hover{--cta-link-color:var(--pds-color-interactive-link-hover)}.pds-cta-link:active{--cta-link-color:var(--pds-color-interactive-link-active);outline:none;text-decoration:none}.pds-cta-link--m{--cta-link-gap:var(--pds-spacing-2xs);--cta-link-size:var(--pds-typography-size-m)}.pds-link-group{display:flex;flex-direction:column;row-gap:var(--pds-spacing-m)}}
@@ -1,2 +1,3 @@
1
- @layer pds-v1, pds-v2;@layer pds-v2{.pds-dropdown{position:relative}.pds-dropdown--inline{display:inline-block}.pds-dropdown__trigger{align-items:center;background:transparent;border:none;border-radius:var(--pds-border-radius-container);color:inherit;cursor:pointer;display:inline-flex;font-family:inherit;gap:var(--pds-spacing-3xs);padding:var(--pds-spacing-3xs) var(--pds-spacing-2xs);transition:background-color .15s ease}.pds-dropdown__trigger:hover{background-color:var(--pds-color-interactive-background-hover)}.pds-dropdown__trigger:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:1px}.pds-dropdown__trigger-icon{color:var(--pds-color-foreground-default-secondary);transition:var(--pds-animation-transition-rotation)}.pds-dropdown__trigger[aria-expanded=true] .pds-dropdown__trigger-icon{transform:rotate(180deg)}.pds-dropdown__panel{background-color:var(--pds-color-dropdown-background);box-shadow:var(--pds-elevation-overlay);flex-direction:column;gap:var(--pds-spacing-4xs);margin:0;min-width:10rem;overflow-y:auto;padding-inline:var(--pds-spacing-2xs);z-index:var(--pds-z-index-dropdown)}.pds-dropdown__item,.pds-dropdown__panel{border-radius:var(--pds-border-radius-container);display:flex;list-style:none;outline:none;padding-block:var(--pds-spacing-2xs)}.pds-dropdown__item{align-items:center;color:var(--pds-color-dropdown-foreground);cursor:pointer;font-size:var(--pds-typography-size-s);gap:var(--pds-spacing-s);justify-content:space-between;min-height:var(--pds-spacing-2xl);padding-inline:var(--pds-spacing-xs)}.pds-dropdown__item:focus-visible:not(:hover){outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:-1px}.pds-dropdown__item--focused,.pds-dropdown__item:hover{background-color:var(--pds-color-dropdown-item-background-hover)}.pds-dropdown__item:active{background-color:var(--pds-color-dropdown-item-background-active)}.pds-dropdown__selected-icon{align-self:center;color:var(--pds-color-foreground-default);display:flex;flex-shrink:0;height:.875em;width:.875em}.pds-dropdown__item--critical{color:var(--pds-color-status-critical-foreground)}.pds-dropdown__item--critical.pds-dropdown__item--focused,.pds-dropdown__item--critical:hover{background-color:var(--pds-color-status-critical-background)}.pds-dropdown__item--disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.pds-dropdown__item-content{align-items:center;display:flex;gap:var(--pds-spacing-2xs)}.pds-dropdown__item-icon{display:flex;flex-shrink:0}.pds-dropdown__item-label{display:flex;flex-direction:column}.pds-dropdown__item-description{color:var(--pds-color-foreground-default-secondary);font-size:var(--pds-typography-size-xs);line-height:var(--pds-typography-lh-s);margin-block-start:var(--pds-spacing-4xs)}.pds-dropdown__item-trailing{display:flex;flex-shrink:0}.pds-dropdown__checkbox-box{align-items:center;background-color:transparent;border:var(--pds-border-width-default) solid var(--pds-color-foreground-default);border-radius:var(--pds-border-radius-default);color:var(--pds-color-input-selected-foreground);display:flex;flex-shrink:0;height:1rem;justify-content:center;padding:.0625rem;transition:var(--pds-animation-transition-default);width:1rem}.pds-dropdown__checkbox-box--checked,.pds-dropdown__checkbox-box--indeterminate{background-color:var(--pds-color-input-selected-background);border-color:var(--pds-color-input-selected-background)}.pds-dropdown__checkbox-icon{height:100%;width:100%}.pds-dropdown__heading{color:var(--pds-color-dropdown-heading);font-family:var(--pds-typography-ff-compact);font-size:var(--pds-typography-size-xs);font-weight:var(--pds-typography-fw-regular);line-height:var(--pds-typography-lh-s);list-style:none;padding:var(--pds-spacing-xs) var(--pds-spacing-xs) var(--pds-spacing-3xs)}.pds-dropdown__separator{border-block-end:var(--pds-border-width-default) solid var(--pds-color-dropdown-separator);list-style:none;margin-block-end:2px;margin-inline:calc(var(--pds-spacing-2xs)*-1);padding-block:2px}.pds-dropdown__filter{list-style:none;margin-block-start:calc(var(--pds-spacing-2xs)*-1);margin-inline:calc(var(--pds-spacing-2xs)*-1);padding:0}.pds-dropdown__filter-wrapper{align-items:center;display:flex;position:relative}.pds-dropdown__filter-icon{block-size:.875rem;color:var(--pds-color-foreground-default-secondary);inline-size:.875rem;left:var(--pds-spacing-s);pointer-events:none;position:absolute}.pds-dropdown__filter-wrapper:has(.pds-dropdown__filter-icon)
1
+ @layer pds-v1, pds-v2;@layer pds-v2{.pds-dropdown{position:relative}.pds-dropdown--inline{display:inline-block}.pds-dropdown__trigger{align-items:center;background:transparent;border:none;border-radius:var(--pds-border-radius-container);color:inherit;cursor:pointer;display:inline-flex;font-family:inherit;gap:var(--pds-spacing-3xs);padding:var(--pds-spacing-3xs) var(--pds-spacing-2xs);transition:background-color .15s ease}.pds-dropdown__trigger:hover{background-color:var(--pds-color-interactive-background-hover)}.pds-dropdown__trigger:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:1px}.pds-dropdown__trigger-icon{color:var(--pds-color-foreground-default-secondary);transition:var(--pds-animation-transition-rotation)}.pds-dropdown__trigger[aria-expanded=true] .pds-dropdown__trigger-icon{transform:rotate(180deg)}.pds-dropdown__panel{background-color:var(--pds-color-dropdown-background);box-shadow:var(--pds-elevation-overlay);flex-direction:column;gap:var(--pds-spacing-4xs);margin:0;min-width:10rem;overflow-y:auto;padding-inline:var(--pds-spacing-2xs);z-index:var(--pds-z-index-dropdown)}.pds-dropdown__item,.pds-dropdown__panel{border-radius:var(--pds-border-radius-container);display:flex;list-style:none;outline:none;padding-block:var(--pds-spacing-2xs)}.pds-dropdown__item{align-items:center;color:var(--pds-color-dropdown-foreground);cursor:pointer;font-size:var(--pds-typography-size-s);gap:var(--pds-spacing-s);justify-content:space-between;min-height:var(--pds-spacing-2xl);padding-inline:var(--pds-spacing-xs)}.pds-dropdown__item:focus-visible:not(:hover){outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:-1px}.pds-dropdown__item--focused,.pds-dropdown__item:hover{background-color:var(--pds-color-dropdown-item-background-hover)}.pds-dropdown__item:active{background-color:var(--pds-color-dropdown-item-background-active)}.pds-dropdown__selected-icon{align-self:center;color:var(--pds-color-foreground-default);display:flex;flex-shrink:0;height:.875em;width:.875em}.pds-dropdown__item--critical{color:var(--pds-color-status-critical-foreground)}.pds-dropdown__item--critical.pds-dropdown__item--focused,.pds-dropdown__item--critical:hover{background-color:var(--pds-color-status-critical-background)}.pds-dropdown__item--disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.pds-dropdown__item-content{align-items:center;display:flex;gap:var(--pds-spacing-2xs)}.pds-dropdown__item-icon{display:flex;flex-shrink:0}.pds-dropdown__item-label{display:flex;flex-direction:column}.pds-dropdown__item-description{color:var(--pds-color-foreground-default-secondary);font-size:var(--pds-typography-size-xs);line-height:var(--pds-typography-lh-s);margin-block-start:var(--pds-spacing-4xs)}.pds-dropdown__item-trailing{display:flex;flex-shrink:0}.pds-dropdown__action-item .pds-dropdown__item-label a{color:inherit;text-decoration:none}.pds-dropdown__action-item{padding-block:var(--pds-spacing-4xs)}.pds-dropdown__action-item-trigger{display:flex;flex-shrink:0;opacity:0;pointer-events:none;transition:opacity .15s ease}.pds-dropdown__action-item:focus-within .pds-dropdown__action-item-trigger,.pds-dropdown__action-item:has(.pds-menu-button--expanded)
2
+ .pds-dropdown__action-item-trigger,.pds-dropdown__action-item:hover .pds-dropdown__action-item-trigger{opacity:1;pointer-events:auto}.pds-dropdown__checkbox-box{align-items:center;background-color:transparent;border:var(--pds-border-width-default) solid var(--pds-color-foreground-default);border-radius:var(--pds-border-radius-default);color:var(--pds-color-input-selected-foreground);display:flex;flex-shrink:0;height:1rem;justify-content:center;padding:.0625rem;transition:var(--pds-animation-transition-default);width:1rem}.pds-dropdown__checkbox-box--checked,.pds-dropdown__checkbox-box--indeterminate{background-color:var(--pds-color-input-selected-background);border-color:var(--pds-color-input-selected-background)}.pds-dropdown__checkbox-icon{height:100%;width:100%}.pds-dropdown__heading{color:var(--pds-color-dropdown-heading);font-family:var(--pds-typography-ff-compact);font-size:var(--pds-typography-size-xs);font-weight:var(--pds-typography-fw-regular);line-height:var(--pds-typography-lh-s);list-style:none;padding:var(--pds-spacing-xs) var(--pds-spacing-xs) var(--pds-spacing-3xs)}.pds-dropdown__separator{border-block-end:var(--pds-border-width-default) solid var(--pds-color-dropdown-separator);list-style:none;margin-block-end:2px;margin-inline:calc(var(--pds-spacing-2xs)*-1);padding-block:2px}.pds-dropdown__filter{list-style:none;margin-block-start:calc(var(--pds-spacing-2xs)*-1);margin-inline:calc(var(--pds-spacing-2xs)*-1);padding:0}.pds-dropdown__filter-wrapper{align-items:center;display:flex;position:relative}.pds-dropdown__filter-icon{block-size:.875rem;color:var(--pds-color-foreground-default-secondary);inline-size:.875rem;left:var(--pds-spacing-s);pointer-events:none;position:absolute}.pds-dropdown__filter-wrapper:has(.pds-dropdown__filter-icon)
2
3
  .pds-dropdown__filter-input{padding-inline-start:calc(var(--pds-spacing-s) + var(--pds-spacing-xl))}.pds-dropdown__filter-input{background-color:transparent;border:none;border-block-end:var(--pds-border-width-default) solid var(--pds-color-dropdown-separator);border-radius:0;box-sizing:border-box;color:var(--pds-color-foreground-default);font-family:inherit;font-size:var(--pds-typography-size-s);padding:var(--pds-spacing-s);width:100%}.pds-dropdown__filter-input::placeholder{color:var(--pds-color-input-placeholder);font-size:var(--pds-typography-size-s)}.pds-dropdown__filter-input:focus-visible{border-radius:var(--pds-border-radius-container) var(--pds-border-radius-container) 0 0;outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:-3px}.pds-dropdown__no-results{color:var(--pds-color-foreground-default-secondary);font-size:var(--pds-typography-size-s);padding-block-end:var(--pds-spacing-s);padding-block-start:var(--pds-spacing-xs);padding-inline:var(--pds-spacing-s)}.pds-dropdown__footer{background-color:var(--pds-color-dropdown-background);border-block-start:var(--pds-border-width-default) solid var(--pds-color-dropdown-separator);bottom:calc(var(--pds-spacing-2xs)*-1);list-style:none;margin-block-end:calc(var(--pds-spacing-2xs)*-1);margin-block-start:var(--pds-spacing-3xs);margin-inline:calc(var(--pds-spacing-2xs)*-1);padding:var(--pds-spacing-s);position:sticky}.pds-dropdown__footer a,.pds-dropdown__footer button{align-items:center;background:none;border:none;color:var(--pds-color-interactive-link-default);cursor:pointer;display:flex;font:inherit;gap:var(--pds-spacing-3xs);padding:0;text-decoration:none;width:100%}.pds-dropdown__footer a:hover,.pds-dropdown__footer button:hover{color:var(--pds-color-interactive-link-hover);text-decoration:underline}.pds-dropdown__footer a:focus-visible,.pds-dropdown__footer button:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:2px}}
@@ -0,0 +1,15 @@
1
+ @layer pds-v1, pds-v2;@layer pds-v2{.pds-feature-panel{--bg-color:var(--pds-color-surface-default);--body-padding:var(--pds-spacing-m);background:linear-gradient(var(--bg-color),var(--bg-color)) padding-box,var(--pds-gradient-avatar-12) border-box;border:var(--pds-border-width-default) solid transparent;border-radius:var(--pds-border-radius-panel);display:flex;flex-direction:column;position:relative}.pds-feature-panel__dismiss{inset-block-start:var(--pds-spacing-s);inset-inline-end:var(--pds-spacing-s);position:absolute;z-index:1}.pds-feature-panel__image{border-radius:var(--pds-border-radius-panel) var(--pds-border-radius-panel) 0 0;display:block;overflow:hidden}.pds-feature-panel__image img{display:block;height:100%;object-fit:cover;object-position:top;width:100%}.pds-feature-panel__body{display:flex;flex-direction:column;padding:var(--body-padding);width:100%}.pds-feature-panel__heading{font-size:var(--pds-typography-size-l)}.pds-feature-panel__content{font-size:var(--pds-typography-size-s);margin:0;margin-block-start:var(--pds-spacing-2xs)}.pds-feature-panel__cta{align-self:flex-start;margin-block-start:var(--pds-spacing-l)}.pds-feature-panel--hasDismiss .pds-feature-panel__heading{padding-inline-end:var(--pds-spacing-xl)}.pds-feature-panel--image-inset .pds-feature-panel__image{border-radius:var(--pds-border-radius-panel);margin:var(--body-padding) var(--body-padding) 0;width:auto}.pds-feature-panel--image-inset .pds-feature-panel__dismiss{inset-block-start:var(--pds-spacing-xl);inset-inline-end:var(--pds-spacing-xl)}.pds-feature-panel--has-image{--dismiss-scrim:rgba(0,0,0,.35);--dismiss-scrim-hover:rgba(0,0,0,.5);--dismiss-scrim-active:rgba(0,0,0,.6)}.pds-feature-panel--has-image:not(.pds-feature-panel--horizontal)
2
+ .pds-feature-panel__dismiss
3
+ .pds-close-button{background-color:var(--dismiss-scrim);color:#fff}.pds-feature-panel--has-image:not(.pds-feature-panel--horizontal)
4
+ .pds-feature-panel__dismiss
5
+ .pds-close-button:hover{background-color:var(--dismiss-scrim-hover)}.pds-feature-panel--has-image:not(.pds-feature-panel--horizontal)
6
+ .pds-feature-panel__dismiss
7
+ .pds-close-button:active:enabled{background-color:var(--dismiss-scrim-active);box-shadow:none}@media (max-width:767px){.pds-feature-panel--has-image.pds-feature-panel--horizontal
8
+ .pds-feature-panel__dismiss
9
+ .pds-close-button{background-color:var(--dismiss-scrim);color:#fff}.pds-feature-panel--has-image.pds-feature-panel--horizontal
10
+ .pds-feature-panel__dismiss
11
+ .pds-close-button:hover{background-color:var(--dismiss-scrim-hover)}.pds-feature-panel--has-image.pds-feature-panel--horizontal
12
+ .pds-feature-panel__dismiss
13
+ .pds-close-button:active:enabled{background-color:var(--dismiss-scrim-active);box-shadow:none}}@media (min-width:768px){.pds-feature-panel--horizontal{flex-direction:row;gap:var(--pds-spacing-3xs)}.pds-feature-panel--horizontal .pds-feature-panel__image{border-radius:var(--pds-border-radius-panel) 0 0 var(--pds-border-radius-panel);flex:0 1 40%;max-width:50%;min-width:30%;position:relative}.pds-feature-panel--horizontal .pds-feature-panel__image img{height:100%;inset:0;position:absolute;width:100%}.pds-feature-panel--horizontal.pds-feature-panel--image-inset
14
+ .pds-feature-panel__image{border-radius:var(--pds-border-radius-panel);margin:var(--body-padding) 0 var(--body-padding) var(--body-padding)}.pds-feature-panel--horizontal .pds-feature-panel__body{flex:1}.pds-feature-panel--horizontal.pds-feature-panel--image-inset
15
+ .pds-feature-panel__dismiss{inset-block-start:var(--pds-spacing-s);inset-inline-end:var(--pds-spacing-s)}}}