@pantheon-systems/pds-toolkit-react 2.0.0-beta.1 → 2.0.0-beta.10

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 (49) hide show
  1. package/dist/components/StatusChecker/StatusChecker.d.ts +8 -1
  2. package/dist/components/Table/Table.d.ts +24 -7
  3. package/dist/components/buttons/Button/Button.d.ts +11 -1
  4. package/dist/components/buttons/ClipboardButton/ClipboardButton.d.ts +6 -1
  5. package/dist/components/buttons/IconButton/IconButton.d.ts +1 -1
  6. package/dist/components/buttons/SSOButton/SSOButton.d.ts +7 -1
  7. package/dist/components/buttons/UtilityButton/UtilityButton.d.ts +10 -2
  8. package/dist/components/empty-states/VerticalEmptyState/VerticalEmptyState.d.ts +45 -7
  9. package/dist/components/icons/Icon/generated-icon-data.d.ts +1 -1
  10. package/dist/components/inputs/Datepicker/Datepicker.d.ts +18 -18
  11. package/dist/components/inputs/Switch/Switch.d.ts +7 -0
  12. package/dist/components/inputs/WorkspacePicker/WorkspacePicker.d.ts +90 -0
  13. package/dist/components/media/Illustration/Illustration.d.ts +37 -0
  14. package/dist/components/media/Illustration/generated-illustration-data.d.ts +16 -0
  15. package/dist/components/media/Illustration/illustration-registry.d.ts +19 -0
  16. package/dist/components/panels/BookmarksPanel/BookmarksPanel.d.ts +13 -1
  17. package/dist/css/component-css/pds-bookmarks-panel.css +1 -1
  18. package/dist/css/component-css/pds-button.css +2 -2
  19. package/dist/css/component-css/pds-compact-empty-state.css +1 -1
  20. package/dist/css/component-css/pds-datepicker.css +1 -1
  21. package/dist/css/component-css/pds-horizontal-empty-state.css +1 -1
  22. package/dist/css/component-css/pds-illustration.css +1 -0
  23. package/dist/css/component-css/pds-index.css +14 -14
  24. package/dist/css/component-css/pds-segmented-button.css +2 -2
  25. package/dist/css/component-css/pds-status-checker.css +1 -1
  26. package/dist/css/component-css/pds-switch.css +1 -1
  27. package/dist/css/component-css/pds-table.css +3 -3
  28. package/dist/css/component-css/pds-tags-input.css +1 -1
  29. package/dist/css/component-css/pds-toaster.css +1 -1
  30. package/dist/css/component-css/pds-vertical-empty-state.css +1 -1
  31. package/dist/css/component-css/pds-workspace-picker.css +1 -0
  32. package/dist/css/component-css/pds-workspace-selector-panel.css +1 -1
  33. package/dist/css/component-css/pds-workspace-selector.css +1 -1
  34. package/dist/css/design-tokens/variables.dark.css +3 -0
  35. package/dist/css/design-tokens/variables.light.css +3 -0
  36. package/dist/css/layout-css/pds-app-layout.css +1 -1
  37. package/dist/css/layout-css/pds-index.css +1 -1
  38. package/dist/css/layout-css/pds-sidebar-layout.css +1 -1
  39. package/dist/css/pds-components.css +14 -14
  40. package/dist/css/pds-core.css +1 -1
  41. package/dist/css/pds-layouts.css +1 -1
  42. package/dist/index.css +1 -1
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.js +3418 -2286
  45. package/dist/index.js.map +1 -1
  46. package/dist/index.source.d.ts +2 -0
  47. package/dist/layouts/SidebarLayout/SidebarLayout.d.ts +9 -2
  48. package/dist/libs/components/WorkspaceListItem/WorkspaceListItem.d.ts +6 -5
  49. package/package.json +14 -4
@@ -13,8 +13,15 @@ export interface StatusCheckerProps extends ComponentPropsWithoutRef<'div'> {
13
13
  className?: string;
14
14
  /**
15
15
  * Custom width in rems for the component. This will override the default.
16
+ * Ignored when `displayType` is `'icon-button'`.
16
17
  */
17
18
  componentWidth?: number;
19
+ /**
20
+ * `'icon-button'` renders a bordered, icon-only square matching
21
+ * `IconButton`. The label stays in the DOM, visually hidden, for the
22
+ * live region.
23
+ */
24
+ displayType?: 'label' | 'icon-button';
18
25
  /**
19
26
  * Internationalization props for labels.
20
27
  */
@@ -38,4 +45,4 @@ export interface StatusCheckerProps extends ComponentPropsWithoutRef<'div'> {
38
45
  */
39
46
  state?: StatusCheckerState;
40
47
  }
41
- export declare const StatusChecker: ({ alignment, className, componentWidth, labelStrings, lastChecked, onCheck, state, ...props }: StatusCheckerProps) => import("react/jsx-runtime").JSX.Element;
48
+ export declare const StatusChecker: ({ alignment, className, componentWidth, displayType, labelStrings, lastChecked, onCheck, state, ...props }: StatusCheckerProps) => import("react/jsx-runtime").JSX.Element;
@@ -39,12 +39,14 @@ export type DetailPanelContext = {
39
39
  export interface TableColumn {
40
40
  /**
41
41
  * When true, this column's cell content is shown on the compact card
42
- * rendered at mobile widths, in addition to the full detail view. The
43
- * first card-visible column reads as the card's title; any further ones
44
- * render as a secondary line. Columns without this flag are omitted from
45
- * the card front but still appear in the full detail view (the row's
46
- * `renderDetailPanel` content, or the auto-generated one — see
47
- * `hasMobileDetailSheet`). Has no effect above the mobile breakpoint.
42
+ * rendered at mobile widths, in addition to the full detail view. With
43
+ * the default `cardLayout="stacked"`, the first card-visible column reads
44
+ * as the card's title and any further ones render as a secondary line
45
+ * below it; with `cardLayout="inline"` every card-visible column is a
46
+ * peer in one row instead (see `cardLayout`). Columns without this flag
47
+ * are omitted from the card front but still appear in the full detail
48
+ * view (the row's `renderDetailPanel` content, or the auto-generated one
49
+ * — see `hasMobileDetailSheet`). Has no effect above the mobile breakpoint.
48
50
  */
49
51
  cardVisible?: boolean;
50
52
  /**
@@ -76,6 +78,16 @@ export interface TableColumn {
76
78
  sortKey?: string;
77
79
  }
78
80
  export interface TableProps extends ComponentPropsWithoutRef<'table'> {
81
+ /**
82
+ * Layout of a mobile card's `cardVisible` columns (see `hasMobileCards`).
83
+ * `'stacked'` (default) gives the first one a bold title treatment with
84
+ * the rest in a smaller secondary line below it. `'inline'` drops that
85
+ * distinction and lays out every `cardVisible` column as an equal peer in
86
+ * one row — for a card whose "title" is really a visual chip (a card
87
+ * network logo, an avatar) rather than a name, where forcing a
88
+ * title/subtext hierarchy onto it doesn't make sense.
89
+ */
90
+ cardLayout?: 'stacked' | 'inline';
79
91
  /** Additional class names */
80
92
  className?: string;
81
93
  /**
@@ -130,6 +142,11 @@ export interface TableProps extends ComponentPropsWithoutRef<'table'> {
130
142
  * When provided, takes precedence over `emptyStateHeading` and `emptyStateMessage`.
131
143
  */
132
144
  emptyState?: ReactNode;
145
+ /**
146
+ * Optional action (e.g. a Button or link) rendered below the message in
147
+ * the default empty state. Ignored when `emptyState` is provided.
148
+ */
149
+ emptyStateAction?: ReactNode;
133
150
  /**
134
151
  * Heading text for the default empty state. Defaults to `"No results found."`
135
152
  * Override for translation or context-specific messaging.
@@ -393,4 +410,4 @@ export interface TableProps extends ComponentPropsWithoutRef<'table'> {
393
410
  */
394
411
  totalItemCount?: number;
395
412
  }
396
- export declare const Table: ({ className, closeDetailPanelLabel, columns, currentPage, defaultSortKey, defaultSortOrder, density, detailPanelNav, detailPanelTitle, detailPanelWidth, emptyState, emptyStateHeading, emptyStateMessage, footer, getDetailPanelPositionLabel, getPageSizeLabel, getRowClassName, getRowId, getRowSelectDisabledReason, getSelectRowLabel, getSortLabel, hasDesktopDetailPanel, hasMobileCards, hasMobileDetailSheet, hasPanel, inspectedRowId, isLoading, isRowSelectable, itemsPerPage, loadingRowCount, maxHeight, minHeight, nextDetailPanelRowLabel, onDetailPanelNext, onDetailPanelPrev, onPageChange, onPageSizeChange, onRowInspect, onRowSelectionChange, onSort, pageSizeOptions, pageSizeSelectLabel, paginationLabels, prevDetailPanelRowLabel, renderDetailPanel, renderDetailPanelFooter, rowData, selectAllLabel, selectedRows, sortKey, sortOrder, totalItemCount, ...props }: TableProps) => import("react/jsx-runtime").JSX.Element;
413
+ export declare const Table: ({ cardLayout, className, closeDetailPanelLabel, columns, currentPage, defaultSortKey, defaultSortOrder, density, detailPanelNav, detailPanelTitle, detailPanelWidth, emptyState, emptyStateAction, emptyStateHeading, emptyStateMessage, footer, getDetailPanelPositionLabel, getPageSizeLabel, getRowClassName, getRowId, getRowSelectDisabledReason, getSelectRowLabel, getSortLabel, hasDesktopDetailPanel, hasMobileCards, hasMobileDetailSheet, hasPanel, inspectedRowId, isLoading, isRowSelectable, itemsPerPage, loadingRowCount, maxHeight, minHeight, nextDetailPanelRowLabel, onDetailPanelNext, onDetailPanelPrev, onPageChange, onPageSizeChange, onRowInspect, onRowSelectionChange, onSort, pageSizeOptions, pageSizeSelectLabel, paginationLabels, prevDetailPanelRowLabel, renderDetailPanel, renderDetailPanelFooter, rowData, selectAllLabel, selectedRows, sortKey, sortOrder, totalItemCount, ...props }: TableProps) => import("react/jsx-runtime").JSX.Element;
@@ -21,6 +21,14 @@ interface ButtonProps extends ComponentPropsWithoutRef<'button'> {
21
21
  * Is the button disabled?
22
22
  */
23
23
  disabled?: boolean;
24
+ /**
25
+ * Whether `isWorking` disables the button. Defaults to `true`, matching the
26
+ * one-off "action in flight" use case (e.g. a submit button mid-request).
27
+ * Set to `false` for an ongoing, interactive working state — such as a
28
+ * toggle that starts/stops a live process and must stay clickable while
29
+ * it runs.
30
+ */
31
+ disableWhenWorking?: boolean;
24
32
  /**
25
33
  * How the button is displayed.
26
34
  */
@@ -42,7 +50,9 @@ interface ButtonProps extends ComponentPropsWithoutRef<'button'> {
42
50
  */
43
51
  isSplitButton?: boolean;
44
52
  /**
45
- * Is the button in a working state?
53
+ * Is the button in a working state? Renders a leading spinner (colored and
54
+ * sized to match the button) while keeping the label and icon visible.
55
+ * Disables the button unless `disableWhenWorking` is set to `false`.
46
56
  */
47
57
  isWorking?: boolean;
48
58
  /**
@@ -1,4 +1,5 @@
1
1
  import { ComponentPropsWithoutRef } from 'react';
2
+ import { IconButtonSize } from '../../buttons/IconButton/IconButton';
2
3
  /**
3
4
  * Prop types for ClipboardButton
4
5
  */
@@ -23,6 +24,10 @@ export interface ClipboardButtonProps extends ComponentPropsWithoutRef<'button'>
23
24
  * Show a visible border around the button.
24
25
  */
25
26
  hasBorder?: boolean;
27
+ /**
28
+ * Which size of button to render.
29
+ */
30
+ size?: IconButtonSize;
26
31
  /**
27
32
  * Which variant of button to render.
28
33
  */
@@ -31,4 +36,4 @@ export interface ClipboardButtonProps extends ComponentPropsWithoutRef<'button'>
31
36
  /**
32
37
  * ClipboardButton UI component
33
38
  */
34
- export declare const ClipboardButton: ({ ariaLabel, className, clipboardText, disabled, hasBorder, variant, ...props }: ClipboardButtonProps) => import("react/jsx-runtime").JSX.Element;
39
+ export declare const ClipboardButton: ({ ariaLabel, className, clipboardText, disabled, hasBorder, size, variant, ...props }: ClipboardButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -2,7 +2,7 @@ import React, { ComponentPropsWithoutRef, MouseEvent } from 'react';
2
2
  import { ButtonType } from '../../../libs/types/custom-types';
3
3
  import { PDSIcon } from '../../icons/Icon/Icon';
4
4
  import './icon-button.css';
5
- type IconButtonSize = 'xs' | 's' | 'm';
5
+ export type IconButtonSize = 'xs' | 's' | 'm';
6
6
  interface IconButtonProps extends ComponentPropsWithoutRef<'button'> {
7
7
  /**
8
8
  * Aria-label attribute.
@@ -16,6 +16,12 @@ interface SSOButtonProps extends ComponentPropsWithoutRef<'button'> {
16
16
  * Is the button disabled?
17
17
  */
18
18
  disabled?: boolean;
19
+ /**
20
+ * Whether `isWorking` disables the button. Defaults to `true`. Set to
21
+ * `false` for an ongoing, interactive working state that must stay
22
+ * clickable while it runs.
23
+ */
24
+ disableWhenWorking?: boolean;
19
25
  /**
20
26
  * Is the button in a working state?
21
27
  */
@@ -45,5 +51,5 @@ interface SSOButtonProps extends ComponentPropsWithoutRef<'button'> {
45
51
  /**
46
52
  * A Component used to render an SSO Button
47
53
  */
48
- export declare const SSOButton: ({ buttonType, className, disabled, isWorking, label, onClick, platform, size, tooltipText, ...props }: SSOButtonProps) => import("react/jsx-runtime").JSX.Element;
54
+ export declare const SSOButton: ({ buttonType, className, disabled, disableWhenWorking, isWorking, label, onClick, platform, size, tooltipText, ...props }: SSOButtonProps) => import("react/jsx-runtime").JSX.Element;
49
55
  export {};
@@ -17,6 +17,12 @@ export interface UtilityButtonProps extends ComponentPropsWithoutRef<'div'> {
17
17
  * Is the button disabled?
18
18
  */
19
19
  disabled?: boolean;
20
+ /**
21
+ * Whether `isWorking` disables the button. Defaults to `true`. Set to
22
+ * `false` for an ongoing, interactive working state that must stay
23
+ * clickable while it runs.
24
+ */
25
+ disableWhenWorking?: boolean;
20
26
  /**
21
27
  * Should the button have a border?
22
28
  */
@@ -42,7 +48,9 @@ export interface UtilityButtonProps extends ComponentPropsWithoutRef<'div'> {
42
48
  */
43
49
  isMonospace?: boolean;
44
50
  /**
45
- * Is the button in the process of performing a task and should be disabled?
51
+ * Is the button in the process of performing a task? Renders a spinner in
52
+ * place of the icon, and disables the button unless `disableWhenWorking`
53
+ * is set to `false`.
46
54
  */
47
55
  isWorking?: boolean;
48
56
  /**
@@ -67,4 +75,4 @@ export interface UtilityButtonProps extends ComponentPropsWithoutRef<'div'> {
67
75
  /**
68
76
  * UtilityButton UI component
69
77
  */
70
- export declare const UtilityButton: ({ buttonProps, className, disabled, hasBorder, iconName, iconPosition, isCritical, isLoading, isMonospace, isWorking, label, linkContent, onClick, tooltipText, ...props }: UtilityButtonProps) => import("react/jsx-runtime").JSX.Element;
78
+ export declare const UtilityButton: ({ buttonProps, className, disabled, disableWhenWorking, hasBorder, iconName, iconPosition, isCritical, isLoading, isMonospace, isWorking, label, linkContent, onClick, tooltipText, ...props }: UtilityButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,6 @@
1
1
  import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
2
  import { HeadingLevel } from '../../../libs/types/custom-types';
3
+ import { PDSIllustration } from '../../media/Illustration/Illustration';
3
4
  import './vertical-empty-state.css';
4
5
  /**
5
6
  * Prop types for VerticalEmptyState
@@ -14,6 +15,20 @@ export interface VerticalEmptyStateProps extends ComponentPropsWithoutRef<'div'>
14
15
  * This should be a Button, ButtonLink, or two items wrapped in a `pds-button-group` div.
15
16
  */
16
17
  ctaRegion?: ReactNode;
18
+ /**
19
+ * Grows this component to fill its parent's available height and
20
+ * vertically centers its content within it — for a full-page empty state
21
+ * (404, access denied, etc.) that should sit centered in the remaining
22
+ * viewport rather than top-aligned.
23
+ *
24
+ * Only takes effect when the immediate parent is itself a flex container
25
+ * with room to grow into (e.g. `AppLayout`'s `main-inner`) — otherwise
26
+ * `flex: 1` has nothing to act on and this is a no-op. Prefer this over
27
+ * hand-rolled centering CSS (a guessed `height`/`min-height` calc, or
28
+ * wrapping in `FlexContainer`), which breaks whenever real content grows
29
+ * taller than the guess.
30
+ */
31
+ fillHeight?: boolean;
17
32
  /**
18
33
  * heading to explain the empty state.
19
34
  */
@@ -23,20 +38,43 @@ export interface VerticalEmptyStateProps extends ComponentPropsWithoutRef<'div'>
23
38
  */
24
39
  headingLevel?: HeadingLevel;
25
40
  /**
26
- * PDS illustration image to display above the heading.
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).
29
- * See full documentation for details.
41
+ * Which illustration to show above the heading, using the toolkit's
42
+ * `Illustration` component — the preferred way to provide media here.
43
+ * Decorative (no accessible name). Takes precedence over `image` if both
44
+ * are set.
45
+ */
46
+ illustration?: PDSIllustration;
47
+ /**
48
+ * Width of `illustration` (CSS value). Height follows automatically from
49
+ * its aspect ratio.
50
+ */
51
+ illustrationWidth?: string;
52
+ /**
53
+ * Media to display above the heading. Can be a string (a link to an SVG
54
+ * file, either from Brandfolder or local) or a React node, such as
55
+ * `Picture` for a raster image. Prefer `illustration`/`isLoading` for a
56
+ * new illustration or loading state — `image` is a legacy fallback for
57
+ * anything else, slated for eventual deprecation.
58
+ *
59
+ * `imageWidth`/`imageHeight` size the container a string `image` renders
60
+ * into; it fills that container's height, scaling width proportionally.
61
+ * Any React node is responsible for its own sizing within it (pass
62
+ * matching `width`/`height` if you want it to fill the container).
30
63
  */
31
64
  image?: string | ReactNode;
32
65
  /**
33
- * Height of the image (CSS value like '200px', '50%', etc.)
66
+ * Height of the image container (CSS value like '120px', '50%', etc.)
34
67
  */
35
68
  imageHeight?: string;
36
69
  /**
37
- * Width of the image (CSS value like '200px', '50%', etc.)
70
+ * Width of the image container (CSS value like '200px', '50%', etc.)
38
71
  */
39
72
  imageWidth?: string;
73
+ /**
74
+ * Shows a loading spinner instead of `illustration`/`image`, for an
75
+ * in-progress empty state. Takes precedence over both.
76
+ */
77
+ isLoading?: boolean;
40
78
  /**
41
79
  * Message to display below the heading.
42
80
  */
@@ -45,4 +83,4 @@ export interface VerticalEmptyStateProps extends ComponentPropsWithoutRef<'div'>
45
83
  /**
46
84
  * VerticalEmptyState UI component
47
85
  */
48
- export declare const VerticalEmptyState: ({ className, ctaRegion, heading, headingLevel, image, imageHeight, imageWidth, message, ...props }: VerticalEmptyStateProps) => import("react/jsx-runtime").JSX.Element;
86
+ export declare const VerticalEmptyState: ({ className, ctaRegion, fillHeight, heading, headingLevel, illustration, illustrationWidth, image, imageHeight, imageWidth, isLoading, message, ...props }: VerticalEmptyStateProps) => import("react/jsx-runtime").JSX.Element;
@@ -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-09-28T21:46:31.338Z
6
+ * Generated: 2026-10-12T20:45:24.386Z
7
7
  */
8
8
  import { customIcons } from './custom-icons';
9
9
  export { customIcons };
@@ -204,10 +204,28 @@ interface DatepickerSharedProps extends DatepickerHTMLProps {
204
204
  * Maximum selectable date.
205
205
  */
206
206
  maxDate?: Date;
207
+ /**
208
+ * Helper text displayed below the input.
209
+ */
210
+ message?: string | ReactNode;
207
211
  /**
208
212
  * Minimum selectable date.
209
213
  */
210
214
  minDate?: Date;
215
+ /**
216
+ * Fired when the viewer toggles the `showTimeZoneSwitcher` control,
217
+ * reporting the newly selected zone. `timeZone` is the resolved IANA
218
+ * identifier to format your own UI in (`'UTC'`, or the viewer's own
219
+ * browser zone for the "Local" side); `mode` is which side was
220
+ * chosen. Called once per toggle, and only for a real viewer change — not
221
+ * when the `timeZone` prop changes underneath it. The switcher stays
222
+ * internally managed; mirror the zone into your own state from here (e.g.
223
+ * an Edge Logs table labelling its timestamp column to match the picker).
224
+ * `onChange` deliberately does *not* fire for a zone toggle, since the
225
+ * selected instant is unchanged. Has no effect unless
226
+ * `showTimeZoneSwitcher` (and therefore `showTime`) is set.
227
+ */
228
+ onTimeZoneChange?: (timeZone: string, mode: 'local' | 'utc') => void;
211
229
  /**
212
230
  * Placeholder text for the trigger button.
213
231
  */
@@ -268,24 +286,6 @@ interface DatepickerSharedProps extends DatepickerHTMLProps {
268
286
  * date. Has no effect unless `showTime` is also true.
269
287
  */
270
288
  showTimeZoneSwitcher?: boolean;
271
- /**
272
- * Fired when the viewer toggles the `showTimeZoneSwitcher` control,
273
- * reporting the newly selected zone. `timeZone` is the resolved IANA
274
- * identifier to format your own UI in (`'UTC'`, or the viewer's own
275
- * browser zone for the "Local" side); `mode` is which side was
276
- * chosen. Called once per toggle, and only for a real viewer change — not
277
- * when the `timeZone` prop changes underneath it. The switcher stays
278
- * internally managed; mirror the zone into your own state from here (e.g.
279
- * an Edge Logs table labelling its timestamp column to match the picker).
280
- * `onChange` deliberately does *not* fire for a zone toggle, since the
281
- * selected instant is unchanged. Has no effect unless
282
- * `showTimeZoneSwitcher` (and therefore `showTime`) is set.
283
- */
284
- onTimeZoneChange?: (timeZone: string, mode: 'local' | 'utc') => void;
285
- /**
286
- * Helper text displayed below the input.
287
- */
288
- message?: string | ReactNode;
289
289
  /**
290
290
  * Whether the calendar footer includes its "Today" button. Defaults to
291
291
  * `true`. Set to `false` to leave only the end-aligned buttons —
@@ -46,6 +46,13 @@ export interface SwitchProps extends ComponentPropsWithoutRef<'div'> {
46
46
  * Label of the switch field.
47
47
  */
48
48
  label: string;
49
+ /**
50
+ * Visual treatment of the label. `'default'` matches other form field
51
+ * labels. `'heading'` is semibold and a size up, for a switch that reads as
52
+ * its own setting among a list of settings rather than a form field. It
53
+ * stays a `<label>`, not a heading element.
54
+ */
55
+ labelVariant?: 'default' | 'heading';
49
56
  /**
50
57
  * Message or description used to help clarify the usage of the input.
51
58
  */
@@ -0,0 +1,90 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ import type { WorkspaceSelectorItem } from '../../navigation/WorkspaceSelector/WorkspaceSelector';
3
+ import './workspace-picker.css';
4
+ /**
5
+ * Prop types for WorkspacePicker
6
+ */
7
+ export interface WorkspacePickerProps extends ComponentPropsWithoutRef<'div'> {
8
+ /**
9
+ * Accessible label for the `<nav>` landmark, distinct from `label` (the
10
+ * visible field legend). Optional since the legend already names the
11
+ * picker as a whole -- set this only if the nav landmark itself needs a
12
+ * different name.
13
+ */
14
+ ariaLabel?: string;
15
+ /**
16
+ * Additional class names
17
+ */
18
+ className?: string;
19
+ /**
20
+ * Label for the filter input.
21
+ */
22
+ filterLabel?: string;
23
+ /**
24
+ * Placeholder text for the filter input.
25
+ */
26
+ filterPlaceholder?: string;
27
+ /**
28
+ * Unique ID for the picker.
29
+ */
30
+ id: string;
31
+ /**
32
+ * Maximum width of the input field in pixels. The input fills its
33
+ * container up to this cap, then shrinks below it rather than
34
+ * overflowing in a tight flex/grid layout. When omitted, the input
35
+ * fills its container with no cap.
36
+ */
37
+ inputWidth?: number;
38
+ /**
39
+ * Minimum width of the input field in pixels, in a tight flex/grid layout
40
+ * that wraps (e.g. flexWrap="wrap"). Has no effect without inputWidth,
41
+ * and no effect on its own without a wrapping layout.
42
+ */
43
+ inputWidthMin?: number;
44
+ /**
45
+ * Label for the picker. Will be rendered as the fieldset legend.
46
+ */
47
+ label: string;
48
+ /**
49
+ * Input message. Used to provide supplemental text. Will be displayed
50
+ * below the picker.
51
+ */
52
+ message?: string | ReactNode;
53
+ /**
54
+ * Minimum number of items before the filter input is shown.
55
+ * @default 8
56
+ */
57
+ minFilterItems?: number;
58
+ /**
59
+ * Text to display when no results are found.
60
+ */
61
+ noResultsText?: string;
62
+ /**
63
+ * Called when a workspace without its own `workspaceLink` is selected
64
+ * (e.g. picking a workspace as a value rather than navigating to it).
65
+ */
66
+ onSelectWorkspace?: (workspace: WorkspaceSelectorItem) => void;
67
+ /**
68
+ * Should the label (legend) be visible? If false, it will render for
69
+ * screen readers only.
70
+ * @default true
71
+ */
72
+ showLabel?: boolean;
73
+ /**
74
+ * Number of whole item rows visible before the list scrolls.
75
+ * @default 6
76
+ */
77
+ visibleItemCount?: number;
78
+ /**
79
+ * List of all workspaces for a user.
80
+ */
81
+ workspaceList?: WorkspaceSelectorItem[];
82
+ }
83
+ /**
84
+ * WorkspacePicker UI component. A standalone search + selectable list of
85
+ * workspaces, for use as an input (e.g. choosing a workspace before creating
86
+ * a site) rather than navigation -- unlike `WorkspaceSelector`'s dropdown
87
+ * menu or `WorkspaceSelectorPanel`'s embedded display, both of which select
88
+ * a workspace by linking to it.
89
+ */
90
+ export declare const WorkspacePicker: ({ ariaLabel, className, filterLabel, filterPlaceholder, id, inputWidth, inputWidthMin, label, message, minFilterItems, noResultsText, onSelectWorkspace, showLabel, visibleItemCount, workspaceList, ...props }: WorkspacePickerProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,37 @@
1
+ import { ComponentPropsWithoutRef } from 'react';
2
+ import { type PDSIllustrationName } from './generated-illustration-data';
3
+ import './illustration.css';
4
+ export type PDSIllustration = PDSIllustrationName;
5
+ /**
6
+ * Prop types for Illustration
7
+ */
8
+ export interface IllustrationProps extends ComponentPropsWithoutRef<'svg'> {
9
+ /**
10
+ * Accessible name for the illustration. Defaults to '' (decorative,
11
+ * hidden from assistive tech). When provided, renders an SVG <title>
12
+ * and exposes the illustration as role="img" with that accessible name.
13
+ */
14
+ alt?: string;
15
+ /**
16
+ * Additional class names
17
+ */
18
+ className?: string;
19
+ /**
20
+ * Optional height (CSS value). If not provided, the illustration is
21
+ * sized by its intrinsic viewBox, same as Picture.
22
+ */
23
+ height?: string | number;
24
+ /**
25
+ * Which illustration to render.
26
+ */
27
+ name: PDSIllustration;
28
+ /**
29
+ * Optional width (CSS value). If not provided, the illustration is
30
+ * sized by its intrinsic viewBox, same as Picture.
31
+ */
32
+ width?: string | number;
33
+ }
34
+ /**
35
+ * Illustration UI component
36
+ */
37
+ export declare const Illustration: ({ alt, className, height, name, width, ...props }: IllustrationProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Auto-generated illustration data - DO NOT EDIT MANUALLY
3
+ *
4
+ * Generated by: npm run generate:illustration-data
5
+ * Source: illustration-registry.ts + illustrations/*.svg
6
+ * Generated: 2026-10-12T20:45:25.027Z
7
+ */
8
+ import React from 'react';
9
+ export interface IllustrationData {
10
+ height: number;
11
+ render: () => React.ReactNode;
12
+ width: number;
13
+ }
14
+ export declare const illustrationData: Record<string, IllustrationData>;
15
+ export declare const illustrationList: readonly ["createEnvLive", "createEnvMultidev", "createEnvTest", "underConstruction"];
16
+ export type PDSIllustrationName = (typeof illustrationList)[number];
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Illustration Registry - Source of truth for PDS illustration mappings.
3
+ *
4
+ * Maps PDS camelCase illustration names to their raw SVG source file.
5
+ *
6
+ * To add an illustration:
7
+ * 1. Export the polished SVG from Figma into illustrations/<kebab-case-name>.svg
8
+ * 2. Run: npm run generate:illustration
9
+ * (prompts for a PDS name — suggests one from the filename — adds the
10
+ * entry below, and runs generate:illustration-data for you)
11
+ * 3. Commit the SVG, this file, and generated-illustration-data.tsx
12
+ *
13
+ * To add an entry manually instead: add it below, then run
14
+ * npm run generate:illustration-data yourself.
15
+ */
16
+ export interface IllustrationRegistryEntry {
17
+ file: string;
18
+ }
19
+ export declare const illustrationRegistry: Record<string, IllustrationRegistryEntry>;
@@ -38,6 +38,18 @@ export interface BookmarksPanelProps extends ComponentPropsWithoutRef<'div'> {
38
38
  * @default 'Bookmarks'
39
39
  */
40
40
  heading?: string;
41
+ /**
42
+ * Shows skeleton rows in place of the list. Keeps the same `WidgetPanel`
43
+ * heading/icon across a loading-to-loaded transition, rather than a
44
+ * consumer swapping this component out for a different loading
45
+ * placeholder (which unmounts and remounts the whole panel).
46
+ */
47
+ isLoading?: boolean;
48
+ /**
49
+ * Number of skeleton rows shown while `isLoading`.
50
+ * @default 5
51
+ */
52
+ loadingRowCount?: number;
41
53
  /**
42
54
  * Text shown in place of the list when there are no bookmarks.
43
55
  */
@@ -64,4 +76,4 @@ export interface BookmarksPanelProps extends ComponentPropsWithoutRef<'div'> {
64
76
  * the bookmark list for homepage/sidebar widget slots, built on
65
77
  * `WidgetPanel`.
66
78
  */
67
- export declare const BookmarksPanel: ({ bookmarks, className, contentMaxHeight, createLabel, getMenuAriaLabel, getRemoveCriticalLabel, heading, noResultsText, onCreateBookmark, removeLabel, renameLabel, ...props }: BookmarksPanelProps) => import("react/jsx-runtime").JSX.Element;
79
+ export declare const BookmarksPanel: ({ bookmarks, className, contentMaxHeight, createLabel, getMenuAriaLabel, getRemoveCriticalLabel, heading, isLoading, loadingRowCount, noResultsText, onCreateBookmark, removeLabel, renameLabel, ...props }: BookmarksPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- @layer pds-v1, pds-v2;@layer pds-v2{.pds-bookmarks-panel .pds-widget-panel__content{padding-block:var(--pds-spacing-3xs)}.pds-bookmarks-panel .pds-bookmarks-empty-state{padding-block:var(--pds-spacing-m)}.pds-bookmarks-panel__list{display:flex;flex-direction:column;list-style:none;margin-block:0;margin-inline:calc(var(--panel-padding-inline)*-1);padding:0;row-gap:var(--pds-spacing-xs)}.pds-bookmarks-panel__item-label{display:flex;flex-direction:column;min-width:0}.pds-bookmarks-panel__item-subtitle,.pds-bookmarks-panel__item-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pds-bookmarks-panel__item-title{font-size:var(--pds-typography-size-s);line-height:var(--pds-typography-lh-s)}.pds-bookmarks-panel__item-subtitle{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-5xs)}}
1
+ @layer pds-v1, pds-v2;@layer pds-v2{.pds-bookmarks-panel .pds-widget-panel__content{padding-block:var(--pds-spacing-3xs) var(--pds-spacing-2xs)}.pds-bookmarks-panel .pds-bookmarks-empty-state{padding-block:var(--pds-spacing-m)}.pds-bookmarks-panel__list{display:flex;flex-direction:column;list-style:none;margin-block:0;margin-inline:calc(var(--panel-padding-inline)*-1);padding:0;row-gap:var(--pds-spacing-xs)}.pds-bookmarks-panel__item .pds-row-actions-menu__content a{padding-inline-start:calc(var(--panel-padding-inline)*1.125)}.pds-bookmarks-panel__item-label{display:flex;flex-direction:column;min-width:0}.pds-bookmarks-panel__item-subtitle,.pds-bookmarks-panel__item-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pds-bookmarks-panel__item-title{font-size:var(--pds-typography-size-s);line-height:var(--pds-typography-lh-s)}.pds-bookmarks-panel__item-subtitle{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-5xs)}.pds-bookmarks-panel__item--loading{padding-inline:calc(var(--panel-padding-inline)*1.125)}.pds-bookmarks-panel__list--loading{padding-block:var(--pds-spacing-2xs)}}
@@ -2,7 +2,7 @@
2
2
  --pds-color-button-primary-background-hover
3
3
  );--button-background-color-active:var(
4
4
  --pds-color-button-primary-background-active
5
- );--button-foreground-color:var(--pds-color-button-primary-foreground);--button-foreground-color-hover:var(--button-foreground-color);--button-border-color:var(--pds-color-button-primary-background-default);--button-border-color-hover:var(--pds-color-button-primary-background-hover);--button-border-color-active:var(--button-background-color-active);--button-box-shadow-active:var(--pds-elevation-button-primary-active);align-items:center;background-color:var(--button-background-color);border-color:var(--button-border-color);border-radius:var(--pds-border-radius-button);border-style:solid;border-width:var(--pds-border-width-default);color:var(--button-foreground-color);cursor:pointer;display:inline-flex;font-family:var(--pds-typography-ff-default);font-size:var(--button-font-size);font-weight:var(--pds-typography-fw-medium);gap:var(--button-gap-inline);height:var(--button-height);justify-content:center;line-height:1;max-height:var(--button-height);padding-block:0;padding-inline:var(--button-padding-inline);text-decoration:none;transition:var(--pds-animation-transition-button);white-space:nowrap}.pds-button:disabled{cursor:not-allowed;opacity:40%}.pds-button:hover:enabled,a.pds-button:hover{--button-background-color:var(--button-background-color-hover);--button-border-color:var(--button-border-color-hover);color:var(--button-foreground-color-hover);text-decoration:none}.pds-button:active:enabled,a.pds-button:active{--button-background-color:var(--button-background-color-active);--button-border-color:var(--button-border-color-active);box-shadow:var(--button-box-shadow-active);color:var(--button-foreground-color-hover);text-decoration:none}.pds-button:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:1px;transition:var(--pds-animation-transition-focus)}.pds-button__icon{flex-shrink:0}.pds-button--l .pds-button__icon:not(.pds-status-dot){height:var(--button-font-size);width:var(--button-font-size)}.pds-button__tally{flex-shrink:0}.pds-button--highlight .pds-button__tally,.pds-button--primary .pds-button__tally{box-shadow:0 0 0 1px hsla(0,0%,100%,.75)}.pds-button--xs .pds-status-dot{--dot-size:8px}.pds-button--s .pds-status-dot{--dot-size:10px}.pds-button--m .pds-status-dot{--dot-size:12px;margin-inline-end:2px}.pds-button--l .pds-status-dot{--dot-size:14px;margin-inline-end:4px}.pds-button--full-width{width:100%}.pds-button--xs{--button-font-size:var(--pds-typography-size-xs);--button-height:var(--pds-spacing-button-height-xs);--button-padding-inline:var(--pds-spacing-button-padding-inline-xs);--button-gap-inline:var(--pds-spacing-button-gap-inline-xs)}.pds-button--s{--button-font-size:var(--pds-typography-size-s);--button-height:var(--pds-spacing-button-height-s);--button-padding-inline:var(--pds-spacing-button-padding-inline-s);-button-gap-inline:var(--pds-spacing-button-gap-inline-s)}.pds-button--m{--button-font-size:var(--pds-typography-size-m);--button-height:var(--pds-spacing-button-height-m);--button-padding-inline:var(--pds-spacing-button-padding-inline-m);--button-gap-inline:var(--pds-spacing-button-gap-inline-m)}.pds-button--l{--button-font-size:var(--pds-typography-size-l);--button-height:var(--pds-spacing-button-height-l);--button-padding-inline:var(--pds-spacing-button-padding-inline-l);--button-gap-inline:var(--pds-spacing-button-gap-inline-l)}.pds-button--secondary{--button-background-color:var(
5
+ );--button-foreground-color:var(--pds-color-button-primary-foreground);--button-foreground-color-hover:var(--button-foreground-color);--button-border-color:var(--pds-color-button-primary-background-default);--button-border-color-hover:var(--pds-color-button-primary-background-hover);--button-border-color-active:var(--button-background-color-active);--button-box-shadow-active:var(--pds-elevation-button-primary-active);align-items:center;background-color:var(--button-background-color);border-color:var(--button-border-color);border-radius:var(--pds-border-radius-button);border-style:solid;border-width:var(--pds-border-width-default);color:var(--button-foreground-color);cursor:pointer;display:inline-flex;font-family:var(--pds-typography-ff-default);font-size:var(--button-font-size);font-weight:var(--pds-typography-fw-medium);gap:var(--button-gap-inline);height:var(--button-height);justify-content:center;line-height:1;max-height:var(--button-height);padding-block:0;padding-inline:var(--button-padding-inline);text-decoration:none;transition:var(--pds-animation-transition-button);white-space:nowrap}.pds-button:has(>.pds-button__leading>.pds-button__working-indicator){padding-inline-start:calc(var(--button-padding-inline) - var(--pds-spacing-4xs))}.pds-button__working-indicator{margin-inline-end:var(--pds-spacing-4xs)}.pds-button__leading{display:contents}.pds-button:disabled{cursor:not-allowed;opacity:40%}.pds-button:hover:enabled,a.pds-button:hover{--button-background-color:var(--button-background-color-hover);--button-border-color:var(--button-border-color-hover);color:var(--button-foreground-color-hover);text-decoration:none}.pds-button:active:enabled,a.pds-button:active{--button-background-color:var(--button-background-color-active);--button-border-color:var(--button-border-color-active);box-shadow:var(--button-box-shadow-active);color:var(--button-foreground-color-hover);text-decoration:none}.pds-button:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:1px;transition:var(--pds-animation-transition-focus)}.pds-button__icon{flex-shrink:0}.pds-button--l .pds-button__icon:not(.pds-status-dot){height:var(--button-font-size);width:var(--button-font-size)}.pds-button__tally{flex-shrink:0}.pds-button--highlight .pds-button__tally,.pds-button--primary .pds-button__tally{box-shadow:0 0 0 1px hsla(0,0%,100%,.75)}.pds-button--xs .pds-status-dot{--dot-size:8px}.pds-button--s .pds-status-dot{--dot-size:10px}.pds-button--m .pds-status-dot{--dot-size:12px;margin-inline-end:2px}.pds-button--l .pds-status-dot{--dot-size:14px;margin-inline-end:4px}.pds-button--full-width{width:100%}.pds-button--xs{--button-font-size:var(--pds-typography-size-xs);--button-height:var(--pds-spacing-button-height-xs);--button-padding-inline:var(--pds-spacing-button-padding-inline-xs);--button-gap-inline:var(--pds-spacing-button-gap-inline-xs)}.pds-button--s{--button-font-size:var(--pds-typography-size-s);--button-height:var(--pds-spacing-button-height-s);--button-padding-inline:var(--pds-spacing-button-padding-inline-s);-button-gap-inline:var(--pds-spacing-button-gap-inline-s)}.pds-button--m{--button-font-size:var(--pds-typography-size-m);--button-height:var(--pds-spacing-button-height-m);--button-padding-inline:var(--pds-spacing-button-padding-inline-m);--button-gap-inline:var(--pds-spacing-button-gap-inline-m)}.pds-button--l{--button-font-size:var(--pds-typography-size-l);--button-height:var(--pds-spacing-button-height-l);--button-padding-inline:var(--pds-spacing-button-padding-inline-l);--button-gap-inline:var(--pds-spacing-button-gap-inline-l)}.pds-button--secondary{--button-background-color:var(
6
6
  --pds-color-button-secondary-background-default
7
7
  );--button-background-color-hover:var(
8
8
  --pds-color-button-secondary-background-hover
@@ -68,4 +68,4 @@
68
68
  --pds-color-button-reverse-secondary-foreground
69
69
  );--button-border-color:var(--pds-color-button-reverse-secondary-border);--button-border-color-hover:var(--pds-color-button-reverse-secondary-border);--button-border-color-active:var(
70
70
  --pds-color-button-reverse-secondary-border
71
- )}.pds-button--link{background-color:transparent;border:none;border-radius:0;color:var(--pds-color-interactive-link-default);height:unset;justify-content:unset;letter-spacing:0;max-height:unset;padding-inline:0;padding:0;transition:var(--pds-animation-transition-button)}.pds-button--link:hover:enabled,a.pds-button--link:hover{color:var(--pds-color-interactive-link-hover);text-decoration:underline}.pds-button--link:active:enabled,a.pds-button--link:active{box-shadow:none;color:var(--pds-color-interactive-link-active)}.pds-button--link .pds-button-link__icon,.pds-button--link .pds-button__icon{transform:scale(.9)}.pds-button--loading{cursor:not-allowed}.pds-button--loading:active,.pds-button--loading:hover:enabled{--button-background-color:var(--pulse-regular-base-color);--button-border-color:var(--pulse-regular-base-color)}.pds-button--loading.pds-pulse{background-color:var(--pulse-regular-base-color);border-color:var(--pulse-regular-base-color);color:transparent}.pds-button--loading .pds-button__icon,.pds-button--loading .pds-button__tally,.pds-button--loading .pds-button__working-indicator{opacity:0}.pds-button-group{display:flex;flex-direction:column;row-gap:var(--pds-spacing-m);width:100%}@media (min-width:768px){.pds-button-group{column-gap:var(--pds-spacing-s);flex-direction:row;width:unset}.pds-button-group--lg{column-gap:var(--pds-spacing-m)}}}
71
+ )}.pds-button--link{background-color:transparent;border:none;border-radius:0;color:var(--pds-color-interactive-link-default);height:unset;justify-content:unset;letter-spacing:0;max-height:unset;padding-inline:0;padding:0;transition:var(--pds-animation-transition-button)}.pds-button--link:hover:enabled,a.pds-button--link:hover{color:var(--pds-color-interactive-link-hover);text-decoration:underline}.pds-button--link:active:enabled,a.pds-button--link:active{box-shadow:none;color:var(--pds-color-interactive-link-active)}.pds-button--link .pds-button-link__icon,.pds-button--link .pds-button__icon{transform:scale(.9)}.pds-button--loading{cursor:not-allowed}.pds-button--loading:active,.pds-button--loading:hover:enabled{--button-background-color:var(--pulse-regular-base-color);--button-border-color:var(--pulse-regular-base-color)}.pds-button--loading.pds-pulse{background-color:var(--pulse-regular-base-color);border-color:var(--pulse-regular-base-color);color:transparent}.pds-button--loading .pds-button__icon,.pds-button--loading .pds-button__tally,.pds-button--loading .pds-button__working-indicator{opacity:0}.pds-button-group{display:flex;flex-direction:column;row-gap:var(--pds-spacing-m);width:100%}.pds-button-group--inline{column-gap:var(--pds-spacing-s);flex-direction:row;flex-wrap:wrap;row-gap:var(--pds-spacing-s);width:unset}@media (min-width:768px){.pds-button-group{column-gap:var(--pds-spacing-s);flex-direction:row;width:unset}.pds-button-group--l{column-gap:var(--pds-spacing-m)}}}
@@ -1 +1 @@
1
- @layer pds-v1, pds-v2;@layer pds-v2{.pds-compact-empty-state{align-items:center;display:flex;flex-direction:column;font-family:var(--pds-typography-ff-default);padding-block:var(--pds-spacing-5xl);row-gap:var(--pds-spacing-xl);text-align:center;width:100%}.pds-compact-empty-state__icon{color:var(--pds-color-foreground-default-secondary)}.pds-compact-empty-state__heading{display:block;font-family:var(--pds-typography-ff-compact);font-size:var(--pds-typography-size-l);font-weight:var(--pds-typography-fw-bold);margin-block-end:var(--pds-spacing-3xs)}.pds-compact-empty-state__message{color:var(--pds-color-foreground-default-secondary);font-size:var(--pds-typography-size-m);margin-block-end:0;margin-inline:auto;max-width:600px;text-wrap:pretty}}
1
+ @layer pds-v1, pds-v2;@layer pds-v2{.pds-compact-empty-state{align-items:center;display:flex;flex-direction:column;font-family:var(--pds-typography-ff-default);padding-block:var(--pds-spacing-5xl);padding-inline:var(--pds-spacing-l);row-gap:var(--pds-spacing-xl);text-align:center;width:100%}.pds-compact-empty-state__icon{color:var(--pds-color-foreground-default-secondary)}.pds-compact-empty-state__heading{display:block;font-family:var(--pds-typography-ff-compact);font-size:var(--pds-typography-size-l);font-weight:var(--pds-typography-fw-bold);margin-block-end:var(--pds-spacing-3xs)}.pds-compact-empty-state__message{color:var(--pds-color-foreground-default-secondary);font-size:var(--pds-typography-size-m);margin-block-end:0;margin-inline:auto;max-width:600px;text-wrap:pretty}}
@@ -1 +1 @@
1
- @layer pds-v1, pds-v2;@layer pds-v2{.pds-datepicker{color:var(--pds-color-foreground-default);font-family:var(--pds-typography-ff-default)}.pds-datepicker__input-wrapper{align-items:center;column-gap:var(--pds-spacing-s);display:flex;row-gap:var(--pds-spacing-xs);width:100%}.pds-datepicker__trigger{align-items:center;background:var(--pds-color-surface-default);border:var(--pds-border-width-default) solid var(--pds-color-border-input);border-radius:var(--pds-border-radius-input);color:var(--pds-color-foreground-default);cursor:pointer;display:flex;font-size:var(--pds-typography-size-s);gap:var(--pds-spacing-s);height:var(--pds-spacing-input-height-s);justify-content:space-between;min-width:10rem;padding:var(--pds-spacing-s);width:100%}.pds-datepicker__trigger:disabled{cursor:not-allowed}.pds-datepicker__trigger--open,.pds-datepicker__trigger:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:0;transition:var(--pds-animation-transition-focus)}.pds-datepicker__trigger-text{align-items:center;display:flex;flex:1;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.pds-datepicker__trigger-text--placeholder{color:var(--pds-color-input-placeholder)}.pds-datepicker__trigger-icon{color:var(--pds-color-foreground-default);flex-shrink:0;margin-block-start:-1px}.pds-datepicker__separator{padding-inline:var(--pds-spacing-s)}.pds-datepicker__popover{--day-size:1.75rem;--day-gap:4px;background-color:var(--pds-color-surface-default);border-radius:var(--pds-border-radius-container);box-shadow:var(--pds-elevation-overlay);display:flex;overflow-x:hidden;overflow-y:auto;z-index:var(--pds-z-index-overlay)}.pds-datepicker__presets{border-inline-end:var(--pds-border-width-default) solid var(--pds-color-dropdown-separator);display:flex;flex-direction:column;justify-content:space-between;min-width:13.75rem;padding:var(--pds-spacing-s);width:13.75rem}.pds-datepicker__presets--collapsed{border-inline-end:none}.pds-datepicker__calendar-wrapper{flex-basis:0;flex-shrink:0;overflow:hidden;transition:flex-basis .3s cubic-bezier(.2,0,0,1)}.pds-datepicker__calendar-wrapper-inner{display:flex;flex-direction:column;height:100%;min-height:0}.pds-datepicker__preset-list{display:flex;flex-direction:column;gap:var(--pds-spacing-4xs);min-height:0;overflow-y:auto}.pds-datepicker__preset-item{align-items:center;background:none;border:none;border-radius:var(--pds-border-radius-container);color:var(--pds-color-dropdown-foreground);cursor:pointer;display:flex;font-size:var(--pds-typography-size-s);justify-content:space-between;min-height:var(--pds-spacing-2xl);padding-block:var(--pds-spacing-2xs);padding-inline:var(--pds-spacing-xs);text-align:start}.pds-datepicker__preset-item:hover{background-color:var(--pds-color-dropdown-item-background-hover)}.pds-datepicker__preset-item:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus)}.pds-datepicker__preset-item--active{font-weight:var(--pds-typography-fw-medium)}.pds-datepicker__preset-item--active,.pds-datepicker__preset-item--active:hover{background-color:var(--pds-color-interactive-background-active)}.pds-datepicker__preset-divider{background-color:var(--pds-color-dropdown-separator);height:var(--pds-border-width-default);margin-block:var(--pds-spacing-2xs)}.pds-datepicker__calendar{background-color:var(--pds-color-surface-default);display:flex;flex-direction:column;gap:var(--pds-spacing-m);max-height:100%;min-height:0;padding:var(--pds-spacing-s) var(--pds-spacing-s) var(--pds-spacing-s)}.pds-datepicker__nav{align-items:center;display:flex;justify-content:space-between;margin-block-end:var(--pds-spacing-s)}.pds-datepicker__nav-title{color:var(--pds-color-foreground-default);flex:1;font-size:var(--pds-typography-size-s);font-weight:var(--pds-typography-fw-semibold);text-align:center}.pds-datepicker__nav-button{align-items:center;background:none;border:none;border-radius:var(--pds-border-radius-button);color:var(--pds-color-foreground-default-secondary);cursor:pointer;display:flex;justify-content:center;padding:var(--pds-spacing-2xs)}.pds-datepicker__nav-button:hover:enabled{background-color:var(--pds-color-button-subtle-background-hover);color:var(--pds-color-button-secondary-foreground-hover)}.pds-datepicker__nav-button:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus)}.pds-datepicker__nav-button:disabled{cursor:not-allowed;opacity:40%}.pds-datepicker__nav-button-spacer{visibility:hidden}.pds-datepicker__grids{display:flex;flex:1 1 auto;gap:var(--pds-spacing-l);min-height:0;overflow-y:auto}.pds-datepicker__actions,.pds-datepicker__footer-note,.pds-datepicker__time-section{flex-shrink:0}.pds-datepicker__month{flex:1}.pds-datepicker__grid{border-collapse:collapse;margin-inline:auto;width:auto}.pds-datepicker__grid th{padding:0}.pds-datepicker__grid tr{border-block-end:none}.pds-datepicker__weekday{color:var(--pds-color-foreground-default-secondary);font-size:var(--pds-typography-size-s);font-weight:var(--pds-typography-fw-semibold);height:var(--day-size);text-align:center}.pds-datepicker__cell{padding-block:3px;padding-inline:0;position:relative;text-align:center;width:calc(var(--day-size) + var(--day-gap))}.pds-datepicker__day{align-items:center;border-radius:50%;cursor:pointer;display:flex;font-size:var(--pds-typography-size-s);font-weight:var(--pds-typography-fw-regular);height:var(--day-size);justify-content:center;outline:none;position:relative;width:var(--day-size);z-index:0}.pds-datepicker__day[hidden]{display:none}.pds-datepicker__day:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus)}.pds-datepicker__day--today{box-shadow:inset 0 0 0 var(--pds-border-width-default) var(--pds-color-datepicker-accent-foreground)}.pds-datepicker__cell--in-range{background-clip:content-box;background-color:var(--pds-color-interactive-background-selected)}.pds-datepicker__cell--range-start{border-end-start-radius:calc(var(--day-size)/2);border-start-start-radius:calc(var(--day-size)/2)}.pds-datepicker__cell--range-end{border-end-end-radius:calc(var(--day-size)/2);border-start-end-radius:calc(var(--day-size)/2);padding-inline-end:var(--day-gap)}.pds-datepicker__day--selected{background-color:var(--pds-color-datepicker-selected-background);color:var(--pds-color-datepicker-selected-foreground)}.pds-datepicker__day--today.pds-datepicker__day--selected{box-shadow:inset 0 0 0 var(--pds-border-width-default) var(--pds-color-datepicker-selected-foreground)}.pds-datepicker__day--disabled,.pds-datepicker__day--unavailable{cursor:not-allowed;opacity:40%}.pds-datepicker__time-section{border-block-start:var(--pds-border-width-default) solid var(--pds-color-border-default);display:flex;flex-direction:column;gap:var(--pds-spacing-s);padding-block-start:var(--pds-spacing-m)}.pds-datepicker__timezone-switcher{align-items:center;display:flex;gap:var(--pds-spacing-s)}.pds-datepicker__timezone-switcher-label{color:var(--pds-color-foreground-default);font-size:var(--pds-typography-size-input-label);font-weight:var(--pds-typography-fw-medium);white-space:nowrap}.pds-datepicker__time-fields{display:flex;gap:var(--pds-spacing-l)}.pds-datepicker__time-fields>*{flex:1}.pds-datepicker__footer-note{color:var(--pds-color-foreground-default-secondary);font-size:var(--pds-typography-size-s)}.pds-datepicker__actions{display:flex;padding:var(--pds-spacing-xs) var(--pds-spacing-4xs) var(--pds-spacing-3xs)}.pds-datepicker__actions-group{display:flex;gap:var(--pds-spacing-s);margin-inline-start:auto}@media (max-width:767px){.pds-datepicker__input-wrapper{align-items:stretch;flex-direction:column}.pds-datepicker__grids{flex-direction:column}}}
1
+ @layer pds-v1, pds-v2;@layer pds-v2{.pds-datepicker{color:var(--pds-color-foreground-default);font-family:var(--pds-typography-ff-default)}.pds-datepicker__input-wrapper{align-items:center;column-gap:var(--pds-spacing-s);display:flex;row-gap:var(--pds-spacing-xs);width:100%}.pds-datepicker__trigger{align-items:center;background:var(--pds-color-surface-default);border:var(--pds-border-width-default) solid var(--pds-color-border-input);border-radius:var(--pds-border-radius-input);color:var(--pds-color-foreground-default);cursor:pointer;display:flex;font-size:var(--pds-typography-size-s);gap:var(--pds-spacing-s);height:var(--pds-spacing-input-height-s);justify-content:space-between;min-width:10rem;padding:var(--pds-spacing-s);width:100%}.pds-datepicker__trigger:disabled{cursor:not-allowed}.pds-datepicker__trigger--open,.pds-datepicker__trigger:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus);outline-offset:0;transition:var(--pds-animation-transition-focus)}.pds-datepicker__trigger-text{align-items:center;display:flex;flex:1;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.pds-datepicker__trigger-text--placeholder{color:var(--pds-color-input-placeholder)}.pds-datepicker__trigger-icon{color:var(--pds-color-foreground-default);flex-shrink:0;margin-block-start:-1px}.pds-datepicker__separator{padding-inline:var(--pds-spacing-s)}.pds-datepicker__popover{--day-size:1.75rem;--day-gap:4px;background-color:var(--pds-color-surface-default);border-radius:var(--pds-border-radius-container);box-shadow:var(--pds-elevation-overlay);display:flex;overflow-x:hidden;overflow-y:auto;z-index:var(--pds-z-index-overlay)}.pds-datepicker__presets{border-inline-end:var(--pds-border-width-default) solid var(--pds-color-dropdown-separator);display:flex;flex-direction:column;justify-content:space-between;min-width:12.5rem;padding-block:var(--pds-spacing-s);padding-inline:var(--pds-spacing-xs);width:12.5rem}.pds-datepicker__presets--collapsed{border-inline-end:none}.pds-datepicker__calendar-wrapper{flex-basis:0;flex-shrink:0;overflow:hidden;transition:flex-basis .3s cubic-bezier(.2,0,0,1)}.pds-datepicker__calendar-wrapper-inner{display:flex;flex-direction:column;height:100%;min-height:0}.pds-datepicker__preset-list{display:flex;flex-direction:column;gap:var(--pds-spacing-4xs);min-height:0;overflow-y:auto;padding:var(--pds-border-width-outline)}.pds-datepicker__preset-item{align-items:center;background:none;border:none;border-radius:var(--pds-border-radius-container);color:var(--pds-color-dropdown-foreground);cursor:pointer;display:flex;font-size:var(--pds-typography-size-s);justify-content:space-between;min-height:var(--pds-spacing-2xl);padding-block:var(--pds-spacing-2xs);padding-inline:var(--pds-spacing-xs);text-align:start}.pds-datepicker__preset-item:hover{background-color:var(--pds-color-dropdown-item-background-hover)}.pds-datepicker__preset-item:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus)}.pds-datepicker__preset-item--active{font-weight:var(--pds-typography-fw-medium)}.pds-datepicker__preset-item--active,.pds-datepicker__preset-item--active:hover{background-color:var(--pds-color-interactive-background-active)}.pds-datepicker__preset-divider{background-color:var(--pds-color-dropdown-separator);height:var(--pds-border-width-default);margin-block:var(--pds-spacing-2xs)}.pds-datepicker__calendar{background-color:var(--pds-color-surface-default);display:flex;flex-direction:column;gap:var(--pds-spacing-m);max-height:100%;min-height:0;padding:var(--pds-spacing-s) var(--pds-spacing-s) var(--pds-spacing-s)}.pds-datepicker__nav{align-items:center;display:flex;justify-content:space-between;margin-block-end:var(--pds-spacing-s)}.pds-datepicker__nav-title{color:var(--pds-color-foreground-default);flex:1;font-size:var(--pds-typography-size-s);font-weight:var(--pds-typography-fw-semibold);text-align:center}.pds-datepicker__nav-button{align-items:center;background:none;border:none;border-radius:var(--pds-border-radius-button);color:var(--pds-color-foreground-default-secondary);cursor:pointer;display:flex;justify-content:center;padding:var(--pds-spacing-2xs)}.pds-datepicker__nav-button:hover:enabled{background-color:var(--pds-color-button-subtle-background-hover);color:var(--pds-color-button-secondary-foreground-hover)}.pds-datepicker__nav-button:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus)}.pds-datepicker__nav-button:disabled{cursor:not-allowed;opacity:40%}.pds-datepicker__nav-button-spacer{visibility:hidden}.pds-datepicker__grids{display:flex;flex:1 1 auto;gap:var(--pds-spacing-l);min-height:0;overflow-y:auto}.pds-datepicker__actions,.pds-datepicker__footer-note,.pds-datepicker__time-section{flex-shrink:0}.pds-datepicker__month{flex:1}.pds-datepicker__grid{border-collapse:collapse;margin-inline:auto;width:auto}.pds-datepicker__grid th{padding:0}.pds-datepicker__grid tr{border-block-end:none}.pds-datepicker__weekday{color:var(--pds-color-foreground-default-secondary);font-size:var(--pds-typography-size-s);font-weight:var(--pds-typography-fw-semibold);height:var(--day-size);text-align:center}.pds-datepicker__cell{padding-block:3px;padding-inline:0;position:relative;text-align:center;width:calc(var(--day-size) + var(--day-gap))}.pds-datepicker__day{align-items:center;border-radius:50%;cursor:pointer;display:flex;font-size:var(--pds-typography-size-s);font-weight:var(--pds-typography-fw-regular);height:var(--day-size);justify-content:center;outline:none;position:relative;width:var(--day-size);z-index:0}.pds-datepicker__day[hidden]{display:none}.pds-datepicker__day:focus-visible{outline:var(--pds-border-width-outline) solid var(--pds-color-interactive-focus)}.pds-datepicker__day--today{box-shadow:inset 0 0 0 var(--pds-border-width-default) var(--pds-color-datepicker-accent-foreground)}.pds-datepicker__cell--in-range{background-clip:content-box;background-color:var(--pds-color-interactive-background-selected)}.pds-datepicker__cell--range-start{border-end-start-radius:calc(var(--day-size)/2);border-start-start-radius:calc(var(--day-size)/2)}.pds-datepicker__cell--range-end{border-end-end-radius:calc(var(--day-size)/2);border-start-end-radius:calc(var(--day-size)/2);padding-inline-end:var(--day-gap)}.pds-datepicker__day--selected{background-color:var(--pds-color-datepicker-selected-background);color:var(--pds-color-datepicker-selected-foreground)}.pds-datepicker__day--today.pds-datepicker__day--selected{box-shadow:inset 0 0 0 var(--pds-border-width-default) var(--pds-color-datepicker-selected-foreground)}.pds-datepicker__day--disabled,.pds-datepicker__day--unavailable{cursor:not-allowed;opacity:40%}.pds-datepicker__time-section{border-block-start:var(--pds-border-width-default) solid var(--pds-color-border-default);display:flex;flex-direction:column;gap:var(--pds-spacing-s);padding-block-start:var(--pds-spacing-m)}.pds-datepicker__timezone-switcher{align-items:center;display:flex;gap:var(--pds-spacing-s)}.pds-datepicker__presets .pds-datepicker__timezone-switcher{border-block-start:var(--pds-border-width-default) solid var(--pds-color-dropdown-separator);gap:var(--pds-spacing-m);margin-block-start:var(--pds-spacing-2xs);margin-inline:var(--pds-border-width-outline);padding-block-start:var(--pds-spacing-s);padding-inline:var(--pds-spacing-xs)}.pds-datepicker__timezone-switcher-label{color:var(--pds-color-foreground-default);font-size:var(--pds-typography-size-input-label);font-weight:var(--pds-typography-fw-medium);white-space:nowrap}.pds-datepicker__time-fields{display:flex;gap:var(--pds-spacing-l)}.pds-datepicker__time-fields>*{flex:1}.pds-datepicker__footer-note{color:var(--pds-color-foreground-default-secondary);font-size:var(--pds-typography-size-s)}.pds-datepicker__actions{display:flex;padding:var(--pds-spacing-xs) var(--pds-spacing-4xs) var(--pds-spacing-3xs)}.pds-datepicker__actions-group{display:flex;gap:var(--pds-spacing-s);margin-inline-start:auto}@media (max-width:767px){.pds-datepicker__input-wrapper{align-items:stretch;flex-direction:column}.pds-datepicker__grids{flex-direction:column;flex-shrink:0;overflow-y:visible}.pds-datepicker__time-fields{flex-direction:column}.pds-datepicker__popover{flex-direction:column;max-width:calc(100vw - var(--pds-spacing-l)*2)}.pds-datepicker__presets{border-block-end:var(--pds-border-width-default) solid var(--pds-color-dropdown-separator);border-inline-end:none;min-width:0;width:100%}.pds-datepicker__calendar-wrapper{flex-basis:auto;transition:none;width:100%}.pds-datepicker__calendar-wrapper--collapsed{display:none}.pds-datepicker__calendar-wrapper-inner{width:100%}}}