@pstdio/ui 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/components/data-renderer/data-renderer-content.d.ts +20 -0
  2. package/dist/components/data-renderer/data-renderer-list.d.ts +8 -0
  3. package/dist/components/data-renderer/data-renderer-story-fixtures.d.ts +13 -0
  4. package/dist/components/data-renderer/data-renderer.d.ts +3 -0
  5. package/dist/components/diff-viewer/diff-drawer-empty-state.d.ts +1 -0
  6. package/dist/components/diff-viewer/diff-drawer-height.d.ts +10 -0
  7. package/dist/components/diff-viewer/diff-drawer-scroll.d.ts +47 -0
  8. package/dist/components/diff-viewer/diff-drawer.d.ts +2 -7
  9. package/dist/components/diff-viewer/use-selected-diff-scroll.d.ts +19 -0
  10. package/dist/components/icon-color-picker.d.ts +17 -1
  11. package/dist/components/list-row/list-row.types.d.ts +2 -0
  12. package/dist/components/palette.d.ts +1 -0
  13. package/dist/components/param-editor/index.d.ts +2 -0
  14. package/dist/components/tag-editor/index.d.ts +4 -0
  15. package/dist/components/tag-editor/tag-editor-row.d.ts +19 -0
  16. package/dist/components/tag-editor/tag-editor.d.ts +2 -0
  17. package/dist/components/{status-option-editor/status-option-editor.types.d.ts → tag-editor/tag-editor.types.d.ts} +14 -9
  18. package/dist/components/tag-editor/tag-settings-panel.d.ts +24 -0
  19. package/dist/index.d.ts +4 -4
  20. package/dist/index.js +4154 -3736
  21. package/dist/index.js.map +1 -1
  22. package/dist/theme/recipes/editable.d.ts +46 -1
  23. package/dist/{theme-qP4YOZ2R.js → theme-DOFdi_Ir.js} +63 -17
  24. package/dist/theme-DOFdi_Ir.js.map +1 -0
  25. package/dist/theme.js +1 -1
  26. package/package.json +2 -2
  27. package/dist/components/status-option-editor/index.d.ts +0 -2
  28. package/dist/components/status-option-editor/status-option-editor.d.ts +0 -2
  29. package/dist/components/status-option-editor/status-option-row.d.ts +0 -16
  30. package/dist/theme-qP4YOZ2R.js.map +0 -1
  31. /package/dist/components/{param-editor-color-input.d.ts → param-editor/color-input.d.ts} +0 -0
  32. /package/dist/components/{param-editor-date-input.d.ts → param-editor/date-input.d.ts} +0 -0
  33. /package/dist/components/{param-editor-horizontal-text-input.d.ts → param-editor/horizontal-text-input.d.ts} +0 -0
  34. /package/dist/components/{param-editor-input-group.d.ts → param-editor/input-group.d.ts} +0 -0
  35. /package/dist/components/{param-editor-number-input.d.ts → param-editor/number-input.d.ts} +0 -0
  36. /package/dist/components/{param-editor-horizontal.d.ts → param-editor/param-editor-horizontal.d.ts} +0 -0
  37. /package/dist/components/{param-editor-label.d.ts → param-editor/param-editor-label.d.ts} +0 -0
  38. /package/dist/components/{param-editor.d.ts → param-editor/param-editor.d.ts} +0 -0
  39. /package/dist/components/{param-editor.types.d.ts → param-editor/param-editor.types.d.ts} +0 -0
  40. /package/dist/components/{param-editor-selection-input.d.ts → param-editor/selection-input.d.ts} +0 -0
  41. /package/dist/components/{param-editor-text-input.d.ts → param-editor/text-input.d.ts} +0 -0
@@ -0,0 +1,20 @@
1
+ import { ReactNode } from 'react';
2
+ import { DataRendererBoardColumn } from './data-renderer-board';
3
+ import { DataRendererListItem } from './data-renderer-list';
4
+ import { DataRendererSettings } from './types';
5
+ interface DataRendererContentProps {
6
+ viewMode: DataRendererSettings["viewMode"];
7
+ boardColumns: DataRendererBoardColumn[];
8
+ listItems: DataRendererListItem[];
9
+ selectedRowId: string | null;
10
+ emptyState?: ReactNode;
11
+ emptyTitle: string;
12
+ emptyDescription?: string;
13
+ onBoardMoveItem: (rowId: string, targetColumnId: string) => void;
14
+ onBoardMoveToGroup: (rowId: string, targetGroupKey: string) => void;
15
+ onCreateRow?: (columnId: string) => void;
16
+ onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;
17
+ listKey: string;
18
+ }
19
+ export declare const DataRendererContent: (props: DataRendererContentProps) => import("react/jsx-runtime").JSX.Element;
20
+ export {};
@@ -23,6 +23,14 @@ interface DataRendererListProps {
23
23
  selectedItemId?: string | null;
24
24
  onItemClick?: (item: DataRendererListItem) => void;
25
25
  }
26
+ type DataRendererListExpandedState = true | Record<string, boolean>;
27
+ interface FlattenedDataRendererListItem {
28
+ id: string;
29
+ item: DataRendererListItem;
30
+ depth: number;
31
+ canExpand: boolean;
32
+ }
26
33
  export declare const getDataRendererListIndentation: (depth: number) => string | undefined;
34
+ export declare const flattenDataRendererListItems: (items: DataRendererListItem[], expanded: DataRendererListExpandedState, depth?: number) => FlattenedDataRendererListItem[];
27
35
  export declare const DataRendererList: (props: DataRendererListProps) => import("react/jsx-runtime").JSX.Element;
28
36
  export {};
@@ -0,0 +1,13 @@
1
+ import { AttributeDescriptor, DataRendererRow } from './types';
2
+ export declare const attributes: AttributeDescriptor[];
3
+ export interface StoryRow extends DataRendererRow {
4
+ attributes: {
5
+ status: string;
6
+ assignee: string;
7
+ component: string;
8
+ priority?: string;
9
+ updated: string;
10
+ labels?: string[];
11
+ };
12
+ }
13
+ export declare const initialRows: StoryRow[];
@@ -1,4 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
+ import { ResourceContextAction } from '../resource-context-menu';
2
3
  import { DataRendererBoardColumnAction } from './data-renderer-board';
3
4
  import { AttributeDescriptor, DataRendererFilterState, DataRendererRow, DataRendererSettings } from './types';
4
5
  export interface BoardColumnConfig {
@@ -13,6 +14,7 @@ export interface DataRendererProps<TRow extends DataRendererRow = DataRendererRo
13
14
  storageKey: string;
14
15
  attributes: AttributeDescriptor[];
15
16
  selectedRowId?: string | null;
17
+ emptyState?: ReactNode;
16
18
  emptyTitle?: string;
17
19
  emptyDescription?: string;
18
20
  defaultSettings?: Partial<DataRendererSettings>;
@@ -25,5 +27,6 @@ export interface DataRendererProps<TRow extends DataRendererRow = DataRendererRo
25
27
  onCreateRow?: (columnId: string) => void;
26
28
  onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;
27
29
  getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig;
30
+ getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
28
31
  }
29
32
  export declare const DataRenderer: <TRow extends DataRendererRow>(props: DataRendererProps<TRow>) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const DiffDrawerEmptyState: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { Diff } from './diff-card';
2
+ import { DiffViewMode } from './types';
3
+ interface EstimateDiffCardHeightInput {
4
+ diff: Diff;
5
+ isCollapsed: boolean;
6
+ hasOptedIntoLargeDiff?: boolean;
7
+ diffViewMode?: DiffViewMode;
8
+ }
9
+ export declare const estimateDiffCardHeight: (input: EstimateDiffCardHeightInput) => number;
10
+ export {};
@@ -0,0 +1,47 @@
1
+ import { Diff } from './diff-card';
2
+ import { DiffViewMode } from './types';
3
+ interface EstimateDiffRangeHeightInput {
4
+ diffs: Diff[];
5
+ collapsedPaths: Set<string>;
6
+ largeDiffOptInPaths: Set<string>;
7
+ diffViewMode: DiffViewMode;
8
+ startIndex: number;
9
+ endIndex: number;
10
+ }
11
+ interface SelectedExpansionCommand {
12
+ action: string;
13
+ id: number;
14
+ path?: string;
15
+ direction?: "up" | "down";
16
+ }
17
+ interface ResolveSelectedScrollStateInput {
18
+ diffs: Diff[];
19
+ selectedDiffPath: string | null;
20
+ collapsedPaths: Set<string>;
21
+ expansionCommand: SelectedExpansionCommand | null;
22
+ completedScrollCommandId: number | null;
23
+ }
24
+ export interface RenderedDiffItem {
25
+ element: HTMLElement;
26
+ index: number;
27
+ }
28
+ export declare const estimateDiffRangeHeight: (input: EstimateDiffRangeHeightInput) => number;
29
+ export declare const resolveSelectedScrollState: (input: ResolveSelectedScrollStateInput) => {
30
+ selectedScrollPath: string | null;
31
+ selectedScrollKey: string | null;
32
+ selectedScrollCommandId: number | null;
33
+ selectedScrollIndex: number;
34
+ shouldPinSelectedScrollIndex: boolean;
35
+ hasCompletedSelectedScroll: boolean;
36
+ };
37
+ export declare const includePinnedDiffIndexes: (input: {
38
+ indexes: number[];
39
+ selectedScrollIndex: number;
40
+ shouldPinSelectedScrollIndex: boolean;
41
+ }) => number[];
42
+ export declare const getRenderedDiffItems: (scrollElement: HTMLElement | null) => RenderedDiffItem[];
43
+ export declare const getElementScrollOffset: (input: {
44
+ element: HTMLElement;
45
+ scrollElement: HTMLElement | null;
46
+ }) => number;
47
+ export {};
@@ -13,19 +13,14 @@ export interface DiffExpansionCommand {
13
13
  action: "expand" | "collapse" | "expand-selected";
14
14
  id: number;
15
15
  path?: string;
16
+ direction?: "up" | "down";
16
17
  }
17
18
  export interface DiffDrawerExpansionState {
18
19
  allExpanded: boolean;
19
20
  allCollapsed: boolean;
20
21
  }
22
+ export { estimateDiffCardHeight } from './diff-drawer-height';
21
23
  export type { Diff };
22
- interface EstimateDiffCardHeightInput {
23
- diff: Diff;
24
- isCollapsed: boolean;
25
- hasOptedIntoLargeDiff?: boolean;
26
- diffViewMode?: DiffViewMode;
27
- }
28
- export declare const estimateDiffCardHeight: (input: EstimateDiffCardHeightInput) => number;
29
24
  export declare const buildInitialCollapsedPaths: (diffs: Diff[]) => Set<string>;
30
25
  export declare const buildAllCollapsedPaths: (diffs: Diff[]) => Set<string>;
31
26
  export declare const toggleCollapsedPath: (collapsedPaths: Set<string>, path: string) => Set<string>;
@@ -0,0 +1,19 @@
1
+ import { Diff } from './diff-card';
2
+ import { DiffExpansionCommand } from './diff-drawer';
3
+ import { DiffViewMode } from './types';
4
+ interface UseSelectedDiffScrollInput {
5
+ diffs: Diff[];
6
+ selectedDiffPath: string | null;
7
+ collapsedPaths: Set<string>;
8
+ largeDiffOptInPaths: Set<string>;
9
+ expansionCommand: DiffExpansionCommand | null;
10
+ diffViewMode: DiffViewMode;
11
+ scrollRef: {
12
+ current: HTMLDivElement | null;
13
+ };
14
+ }
15
+ export declare const useSelectedDiffScroll: (input: UseSelectedDiffScrollInput) => {
16
+ selectedScrollIndex: number;
17
+ shouldPinSelectedScrollIndex: boolean;
18
+ };
19
+ export {};
@@ -1,9 +1,25 @@
1
1
  import { ComponentType } from 'react';
2
+ export interface IconColorPickerIconOption {
3
+ value: string | null;
4
+ label: string;
5
+ icon: ComponentType;
6
+ }
2
7
  export declare const optionColors: readonly ["gray", "red", "orange", "yellow", "green", "teal", "blue", "cyan", "purple", "pink"];
3
- export declare const getIconComponent: (name: string | null | undefined) => ComponentType;
8
+ export declare const optionIcons: ({
9
+ value: null;
10
+ label: string;
11
+ icon: import('react').ForwardRefExoticComponent<Omit<import('lucide-react').LucideProps, "ref"> & import('react').RefAttributes<SVGSVGElement>>;
12
+ } | {
13
+ value: string;
14
+ label: string;
15
+ icon: import('react').ForwardRefExoticComponent<Omit<import('lucide-react').LucideProps, "ref"> & import('react').RefAttributes<SVGSVGElement>>;
16
+ })[];
17
+ export declare const getIconComponent: (name: string | null | undefined, iconOptions?: readonly IconColorPickerIconOption[]) => ComponentType;
4
18
  export interface IconColorPickerProps {
5
19
  color: string;
20
+ colorOptions?: readonly string[];
6
21
  icon?: string | null;
22
+ iconOptions?: readonly IconColorPickerIconOption[];
7
23
  onColorChange: (color: string) => void;
8
24
  onIconChange?: (icon: string | null) => void;
9
25
  disabled?: boolean;
@@ -72,6 +72,8 @@ export interface ListRowProps extends ListRowItem, Omit<ListRowRootProps, "as" |
72
72
  showExpandToggle?: boolean;
73
73
  variant?: ListRowVariant;
74
74
  tone?: ListRowTone;
75
+ selectedBg?: ListRowRootProps["bg"];
76
+ hoverBg?: ListRowRootProps["bg"];
75
77
  /** Wrap content into a single child element. Used for `<Menu.Item asChild><ListRow asChild>…</ListRow></Menu.Item>` and link components. */
76
78
  asChild?: boolean;
77
79
  onToggleExpand?: () => void;
@@ -41,6 +41,7 @@ export interface PaletteProps<T extends PaletteEntry = PaletteEntry> {
41
41
  footerEnd?: ReactNode;
42
42
  filterEntries?: (entries: T[], query: string, mode?: string) => T[];
43
43
  onActiveEntryChange?: (entry: T | null, index: number) => void;
44
+ onQueryChange?: (query: string) => void;
44
45
  onClose: () => void;
45
46
  onEscape?: (ctx: PaletteEscapeContext<T>) => boolean | undefined;
46
47
  }
@@ -0,0 +1,2 @@
1
+ export type { ParamEditorProps } from './param-editor';
2
+ export { ParamEditor } from './param-editor';
@@ -0,0 +1,4 @@
1
+ export { TagEditor } from './tag-editor';
2
+ export type { TagEditorAction, TagEditorProps, TagEditorValue } from './tag-editor.types';
3
+ export type { SaveTagSettingsInput, TagSettingsPanelProps } from './tag-settings-panel';
4
+ export { TagSettingsPanel } from './tag-settings-panel';
@@ -0,0 +1,19 @@
1
+ import { IconColorPickerIconOption } from '../icon-color-picker';
2
+ import { TagEditorAction, TagEditorValue } from './tag-editor.types';
3
+ interface TagEditorRowProps {
4
+ actionOptions?: TagEditorAction[];
5
+ colorOptions?: readonly string[];
6
+ iconOptions?: readonly IconColorPickerIconOption[];
7
+ value: TagEditorValue;
8
+ isSaving?: boolean;
9
+ showDefault?: boolean;
10
+ showIcons?: boolean;
11
+ onActionsChange: (actions: string[]) => void;
12
+ onColorChange: (color: string) => void;
13
+ onDelete: () => void;
14
+ onIconChange: (icon: string | null) => void;
15
+ onNameChange: (name: string) => void;
16
+ onSetDefault: () => void;
17
+ }
18
+ export declare const TagEditorRow: (props: TagEditorRowProps) => import("react/jsx-runtime").JSX.Element;
19
+ export {};
@@ -0,0 +1,2 @@
1
+ import { TagEditorProps } from './tag-editor.types';
2
+ export declare const TagEditor: (props: TagEditorProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,5 @@
1
- export interface StatusOptionEditorItem {
1
+ import { IconColorPickerIconOption } from '../icon-color-picker';
2
+ export interface TagEditorValue {
2
3
  id: string;
3
4
  name: string;
4
5
  color: string;
@@ -8,32 +9,36 @@ export interface StatusOptionEditorItem {
8
9
  isDefault?: boolean;
9
10
  isNew?: boolean;
10
11
  }
11
- export interface StatusOptionEditorAction {
12
+ export interface TagEditorAction {
12
13
  value: string;
13
14
  label: string;
14
15
  }
15
- export interface StatusOptionEditorProps {
16
+ export interface TagEditorProps {
16
17
  title: string;
17
18
  description?: string;
18
- items: StatusOptionEditorItem[];
19
- onItemsChange: (items: StatusOptionEditorItem[]) => void;
19
+ values: TagEditorValue[];
20
+ onValuesChange: (values: TagEditorValue[]) => void;
20
21
  onSave: () => void | Promise<void>;
21
22
  onCancel: () => void;
22
- onDeleteItem?: (item: StatusOptionEditorItem) => void;
23
- onSetDefault?: (item: StatusOptionEditorItem) => void;
23
+ onDeleteValue?: (value: TagEditorValue) => void;
24
+ onSetDefault?: (value: TagEditorValue) => void;
24
25
  hasChanges?: boolean;
25
26
  isSaving?: boolean;
26
27
  addLabel?: string;
27
28
  addPlaceholder?: string;
28
- actionOptions?: StatusOptionEditorAction[];
29
+ actionOptions?: TagEditorAction[];
29
30
  actionsColumnLabel?: string;
30
31
  cancelLabel?: string;
31
32
  defaultAddColor?: string;
33
+ defaultAddIcon?: string | null;
32
34
  defaultColumnLabel?: string;
33
35
  deleteButtonText?: string;
34
36
  deleteHeadline?: string;
35
- deleteNotificationText?: (item: StatusOptionEditorItem) => string;
37
+ deleteNotificationText?: (value: TagEditorValue) => string;
38
+ colorOptions?: readonly string[];
39
+ iconOptions?: readonly IconColorPickerIconOption[];
36
40
  saveLabel?: string;
37
41
  showDefault?: boolean;
38
42
  showIcons?: boolean;
43
+ valueColumnLabel?: string;
39
44
  }
@@ -0,0 +1,24 @@
1
+ import { QueryKey } from '@tanstack/react-query';
2
+ import { TagEditorProps, TagEditorValue } from './tag-editor.types';
3
+ export interface SaveTagSettingsInput<TValue> {
4
+ deletedIds: Set<string>;
5
+ drafts: TagEditorValue[];
6
+ values: TValue[];
7
+ }
8
+ type EditorLabels = Pick<TagEditorProps, "actionOptions" | "actionsColumnLabel" | "addLabel" | "addPlaceholder" | "colorOptions" | "deleteButtonText" | "deleteHeadline" | "deleteNotificationText" | "description" | "iconOptions" | "showIcons" | "title" | "valueColumnLabel">;
9
+ type SortableValue = {
10
+ id: string;
11
+ sortOrder: number;
12
+ };
13
+ export interface TagSettingsPanelProps<TValue extends SortableValue, TSource> extends EditorLabels {
14
+ errorTitle: string;
15
+ loadingText?: string;
16
+ queryKey: QueryKey;
17
+ readValues: (source: TSource) => Promise<TValue[]>;
18
+ saveValues: (source: TSource, input: SaveTagSettingsInput<TValue>) => Promise<void>;
19
+ source: TSource;
20
+ toEditorValue: (value: TValue) => TagEditorValue;
21
+ valueNeedsUpdate: (original: TValue, draft: TagEditorValue) => boolean;
22
+ }
23
+ export declare const TagSettingsPanel: <TValue extends SortableValue, TSource>(props: TagSettingsPanelProps<TValue, TSource>) => import("react/jsx-runtime").JSX.Element;
24
+ export {};
package/dist/index.d.ts CHANGED
@@ -40,8 +40,8 @@ export { ErrorBoundary } from './components/error-boundary';
40
40
  export type { HeaderProps, HeaderVariant } from './components/header';
41
41
  export { Header } from './components/header';
42
42
  export { HorizontalMenuStack } from './components/horizontal-menu-stack';
43
- export type { IconColorPickerProps } from './components/icon-color-picker';
44
- export { getIconComponent, IconColorPicker, optionColors } from './components/icon-color-picker';
43
+ export type { IconColorPickerIconOption, IconColorPickerProps } from './components/icon-color-picker';
44
+ export { getIconComponent, IconColorPicker, optionColors, optionIcons } from './components/icon-color-picker';
45
45
  export type { IntegrationCardProps } from './components/integration-card';
46
46
  export { IntegrationCard } from './components/integration-card';
47
47
  export type { ItemSectionProps } from './components/item-section';
@@ -75,13 +75,13 @@ export type { SidebarProps } from './components/sidebar/sidebar.types';
75
75
  export { SidebarProjectMenu } from './components/sidebar/sidebar-project-menu';
76
76
  export type { SimpleCardBodyProps, SimpleCardProps } from './components/simple-card';
77
77
  export { SimpleCard, SimpleCardBody } from './components/simple-card';
78
- export type { StatusOptionEditorItem, StatusOptionEditorProps } from './components/status-option-editor';
79
- export { StatusOptionEditor } from './components/status-option-editor';
80
78
  export type { SwitchProps } from './components/switch';
81
79
  export { Switch } from './components/switch';
82
80
  export { getTabVisibilityStore, useTabVisibilityStore, } from './components/tab-strip/tab-visibility.store';
83
81
  export type { TabVisibilityPlacement } from './components/tab-strip/tab-visibility-filter';
84
82
  export { buildTabVisibilityMenuActions, filterVisibleTabs, } from './components/tab-strip/tab-visibility-filter';
83
+ export type { SaveTagSettingsInput, TagEditorAction, TagEditorProps, TagEditorValue, TagSettingsPanelProps, } from './components/tag-editor';
84
+ export { TagEditor, TagSettingsPanel } from './components/tag-editor';
85
85
  export { Toaster, toaster } from './components/toaster';
86
86
  export { Tooltip } from './components/tooltip';
87
87
  export { TreeList } from './components/tree-list/tree-list';