@pstdio/ui 0.8.0 → 0.9.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 (71) hide show
  1. package/dist/{MermaidComponent-D7Baqkwx.js → MermaidComponent-Cz_Iob5U.js} +56 -53
  2. package/dist/MermaidComponent-Cz_Iob5U.js.map +1 -0
  3. package/dist/chat-ui.js +117 -117
  4. package/dist/chat-ui.js.map +1 -1
  5. package/dist/components/data-renderer/data-renderer-board.d.ts +1 -0
  6. package/dist/components/data-renderer/data-renderer-card.d.ts +5 -20
  7. package/dist/components/data-renderer/data-renderer-grouping.d.ts +11 -10
  8. package/dist/components/data-renderer/data-renderer-helpers.d.ts +63 -15
  9. package/dist/components/data-renderer/data-renderer-list.d.ts +5 -8
  10. package/dist/components/data-renderer/data-renderer-toolbar.d.ts +12 -0
  11. package/dist/components/data-renderer/data-renderer.d.ts +12 -23
  12. package/dist/components/data-renderer/display-menu.d.ts +9 -8
  13. package/dist/components/data-renderer/filter-menu.d.ts +5 -4
  14. package/dist/components/data-renderer/types.d.ts +83 -49
  15. package/dist/components/data-renderer/use-data-renderer-store.d.ts +15 -11
  16. package/dist/components/data-renderer/use-resolved-attributes.d.ts +14 -0
  17. package/dist/components/diff-viewer/diff-card-body.d.ts +10 -0
  18. package/dist/components/diff-viewer/diff-card-content.d.ts +1 -0
  19. package/dist/components/diff-viewer/diff-card.d.ts +1 -0
  20. package/dist/components/diff-viewer/diff-size.d.ts +2 -0
  21. package/dist/components/icon-color-picker.d.ts +13 -0
  22. package/dist/components/list-row/list-row-content.d.ts +9 -0
  23. package/dist/components/list-row/list-row.types.d.ts +1 -0
  24. package/dist/components/rich-text/shared/lexical-code.d.ts +2 -0
  25. package/dist/components/rich-text/shared/plugins/CodePlugin/CodeBlockPlugin.d.ts +1 -1
  26. package/dist/components/rich-text/shared/prism-global.d.ts +2 -0
  27. package/dist/components/status-option-editor/index.d.ts +2 -0
  28. package/dist/components/status-option-editor/status-option-editor.d.ts +2 -0
  29. package/dist/components/status-option-editor/status-option-editor.types.d.ts +39 -0
  30. package/dist/components/status-option-editor/status-option-row.d.ts +16 -0
  31. package/dist/components/tab-strip/tab-visibility-filter.d.ts +19 -0
  32. package/dist/components/tab-strip/tab-visibility.store.d.ts +41 -0
  33. package/dist/components/tree-list/tree-list-model.d.ts +58 -0
  34. package/dist/components/tree-list/tree-list-node-row.d.ts +20 -0
  35. package/dist/components/tree-list/tree-list-order-filter.d.ts +3 -0
  36. package/dist/components/tree-list/tree-list-order.store.d.ts +42 -0
  37. package/dist/components/tree-list/tree-list-reorder.d.ts +13 -0
  38. package/dist/components/tree-list/tree-list-section-header.d.ts +14 -0
  39. package/dist/components/tree-list/tree-list-sortable.d.ts +22 -0
  40. package/dist/components/tree-list/tree-list-visibility-filter.d.ts +17 -0
  41. package/dist/components/tree-list/tree-list-visibility.store.d.ts +45 -0
  42. package/dist/components/tree-list/tree-list.d.ts +7 -27
  43. package/dist/components/tree-list/tree-list.types.d.ts +2 -0
  44. package/dist/components/tree-list/use-tree-list-keyboard-navigation.d.ts +15 -0
  45. package/dist/get-file-type-icon-ufFb0IkR.js +102 -0
  46. package/dist/get-file-type-icon-ufFb0IkR.js.map +1 -0
  47. package/dist/index.d.ts +22 -3
  48. package/dist/index.js +5171 -3890
  49. package/dist/index.js.map +1 -1
  50. package/dist/{rich-message-33DPxuWJ.js → rich-message-CEOSsdR2.js} +428 -421
  51. package/dist/rich-message-CEOSsdR2.js.map +1 -0
  52. package/dist/rich-text.js +26 -26
  53. package/dist/rich-text.js.map +1 -1
  54. package/dist/theme/custom/index.d.ts +0 -3
  55. package/dist/theme/index.d.ts +1 -1
  56. package/dist/theme/recipes/tabs.d.ts +30 -0
  57. package/dist/theme/tokens/colors.d.ts +6 -0
  58. package/dist/{theme-D-aCJqTf.js → theme-qP4YOZ2R.js} +197 -148
  59. package/dist/theme-qP4YOZ2R.js.map +1 -0
  60. package/dist/theme.js +2 -4
  61. package/dist/utils/browser-storage.d.ts +7 -0
  62. package/dist/utils/prism.d.ts +1 -0
  63. package/package.json +8 -3
  64. package/dist/MermaidComponent-D7Baqkwx.js.map +0 -1
  65. package/dist/components/data-renderer/tag-badge.d.ts +0 -10
  66. package/dist/components/data-renderer/tag-option-icon.d.ts +0 -2
  67. package/dist/get-file-type-icon-Bwqf1WXA.js +0 -101
  68. package/dist/get-file-type-icon-Bwqf1WXA.js.map +0 -1
  69. package/dist/rich-message-33DPxuWJ.js.map +0 -1
  70. package/dist/theme/custom/monokai.json.d.ts +0 -80
  71. package/dist/theme-D-aCJqTf.js.map +0 -1
@@ -0,0 +1,39 @@
1
+ export interface StatusOptionEditorItem {
2
+ id: string;
3
+ name: string;
4
+ color: string;
5
+ sortOrder: number;
6
+ actions?: string[];
7
+ icon?: string | null;
8
+ isDefault?: boolean;
9
+ isNew?: boolean;
10
+ }
11
+ export interface StatusOptionEditorAction {
12
+ value: string;
13
+ label: string;
14
+ }
15
+ export interface StatusOptionEditorProps {
16
+ title: string;
17
+ description?: string;
18
+ items: StatusOptionEditorItem[];
19
+ onItemsChange: (items: StatusOptionEditorItem[]) => void;
20
+ onSave: () => void | Promise<void>;
21
+ onCancel: () => void;
22
+ onDeleteItem?: (item: StatusOptionEditorItem) => void;
23
+ onSetDefault?: (item: StatusOptionEditorItem) => void;
24
+ hasChanges?: boolean;
25
+ isSaving?: boolean;
26
+ addLabel?: string;
27
+ addPlaceholder?: string;
28
+ actionOptions?: StatusOptionEditorAction[];
29
+ actionsColumnLabel?: string;
30
+ cancelLabel?: string;
31
+ defaultAddColor?: string;
32
+ defaultColumnLabel?: string;
33
+ deleteButtonText?: string;
34
+ deleteHeadline?: string;
35
+ deleteNotificationText?: (item: StatusOptionEditorItem) => string;
36
+ saveLabel?: string;
37
+ showDefault?: boolean;
38
+ showIcons?: boolean;
39
+ }
@@ -0,0 +1,16 @@
1
+ import { StatusOptionEditorAction, StatusOptionEditorItem } from './status-option-editor.types';
2
+ interface StatusOptionRowProps {
3
+ actionOptions?: StatusOptionEditorAction[];
4
+ item: StatusOptionEditorItem;
5
+ isSaving?: boolean;
6
+ showDefault?: boolean;
7
+ showIcons?: boolean;
8
+ onActionsChange: (actions: string[]) => void;
9
+ onColorChange: (color: string) => void;
10
+ onDelete: () => void;
11
+ onIconChange: (icon: string | null) => void;
12
+ onNameChange: (name: string) => void;
13
+ onSetDefault: () => void;
14
+ }
15
+ export declare const StatusOptionRow: (props: StatusOptionRowProps) => import("react/jsx-runtime").JSX.Element;
16
+ export {};
@@ -0,0 +1,19 @@
1
+ import { ReactNode } from 'react';
2
+ import { ResourceContextAction } from '../resource-context-menu';
3
+ import { VisibilityOverride } from '../tree-list/tree-list-visibility.store';
4
+ export interface TabVisibilityPlacement {
5
+ closable?: boolean;
6
+ hiddenByDefault?: boolean;
7
+ title?: string;
8
+ contributionId: string;
9
+ }
10
+ export declare const filterVisibleTabs: <T extends TabVisibilityPlacement>(placements: T[], tabOverrides: Record<string, VisibilityOverride>, getKey: (placement: T) => string) => T[];
11
+ export interface TabVisibilityMenuActions {
12
+ onToggleTab: (key: string, hiddenByDefault: boolean) => void;
13
+ onResetAll: () => void;
14
+ }
15
+ interface BuildTabMenuOptions {
16
+ checkmark: ReactNode;
17
+ }
18
+ export declare const buildTabVisibilityMenuActions: <T extends TabVisibilityPlacement>(placements: T[], tabOverrides: Record<string, VisibilityOverride>, actions: TabVisibilityMenuActions, getKey: (placement: T) => string, options: BuildTabMenuOptions) => ResourceContextAction[];
19
+ export {};
@@ -0,0 +1,41 @@
1
+ import { VisibilityOverride } from '../tree-list/tree-list-visibility.store';
2
+ interface TabVisibilitySnapshot {
3
+ tabOverrides: Record<string, VisibilityOverride>;
4
+ }
5
+ interface TabVisibilityState extends TabVisibilitySnapshot {
6
+ setTab: (key: string, value: VisibilityOverride | undefined) => void;
7
+ toggleTab: (key: string, hiddenByDefault: boolean) => void;
8
+ clearTab: (key: string) => void;
9
+ reset: () => void;
10
+ }
11
+ interface CreateTabVisibilityStoreOptions {
12
+ storageKey: string;
13
+ }
14
+ export declare const createTabVisibilityStore: (options: CreateTabVisibilityStoreOptions) => Omit<import('zustand').StoreApi<TabVisibilityState>, "setState" | "persist"> & {
15
+ setState(partial: TabVisibilityState | Partial<TabVisibilityState> | ((state: TabVisibilityState) => TabVisibilityState | Partial<TabVisibilityState>), replace?: false | undefined): unknown;
16
+ setState(state: TabVisibilityState | ((state: TabVisibilityState) => TabVisibilityState), replace: true): unknown;
17
+ persist: {
18
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<TabVisibilityState, unknown, unknown>>) => void;
19
+ clearStorage: () => void;
20
+ rehydrate: () => Promise<void> | void;
21
+ hasHydrated: () => boolean;
22
+ onHydrate: (fn: (state: TabVisibilityState) => void) => () => void;
23
+ onFinishHydration: (fn: (state: TabVisibilityState) => void) => () => void;
24
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<TabVisibilityState, unknown, unknown>>;
25
+ };
26
+ };
27
+ export declare const getTabVisibilityStore: (storageKey: string) => Omit<import('zustand').StoreApi<TabVisibilityState>, "setState" | "persist"> & {
28
+ setState(partial: TabVisibilityState | Partial<TabVisibilityState> | ((state: TabVisibilityState) => TabVisibilityState | Partial<TabVisibilityState>), replace?: false | undefined): unknown;
29
+ setState(state: TabVisibilityState | ((state: TabVisibilityState) => TabVisibilityState), replace: true): unknown;
30
+ persist: {
31
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<TabVisibilityState, unknown, unknown>>) => void;
32
+ clearStorage: () => void;
33
+ rehydrate: () => Promise<void> | void;
34
+ hasHydrated: () => boolean;
35
+ onHydrate: (fn: (state: TabVisibilityState) => void) => () => void;
36
+ onFinishHydration: (fn: (state: TabVisibilityState) => void) => () => void;
37
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<TabVisibilityState, unknown, unknown>>;
38
+ };
39
+ };
40
+ export declare const useTabVisibilityStore: <T>(storageKey: string, selector: (state: TabVisibilityState) => T) => T;
41
+ export type { TabVisibilitySnapshot, TabVisibilityState };
@@ -0,0 +1,58 @@
1
+ import { TreeListNode, TreeListSection } from './tree-list.types';
2
+ export declare const isInList: (id: string, values: string[]) => boolean;
3
+ export declare const isActiveNode: (id: string, activeNodeId?: string | string[] | null) => boolean;
4
+ export declare const isNavigableNode: (node: TreeListNode) => boolean;
5
+ export declare const getNodeChildren: (node: TreeListNode) => TreeListNode[];
6
+ export declare const hasExpandableChildren: (node: TreeListNode) => boolean;
7
+ export type VirtualRow = {
8
+ kind: "section-header";
9
+ key: string;
10
+ sectionId: string;
11
+ section: TreeListSection;
12
+ collapsible: boolean;
13
+ expanded: boolean;
14
+ } | {
15
+ kind: "node";
16
+ key: string;
17
+ sectionId: string;
18
+ node: TreeListNode;
19
+ level: number;
20
+ parentNodeId?: string;
21
+ } | {
22
+ kind: "section-empty";
23
+ key: string;
24
+ sectionId: string;
25
+ emptyState: TreeListSection["emptyState"];
26
+ };
27
+ export type VirtualNodeRow = Extract<VirtualRow, {
28
+ kind: "node";
29
+ }>;
30
+ export type VirtualSectionHeaderRow = Extract<VirtualRow, {
31
+ kind: "section-header";
32
+ }>;
33
+ /** Rows the keyboard can land on: enabled nodes and collapsible section headers. */
34
+ export type FocusableRow = VirtualNodeRow | VirtualSectionHeaderRow;
35
+ export declare const buildVirtualRows: (sections: TreeListSection[], expandedSectionIds: string[], expandedNodeIds: string[]) => VirtualRow[];
36
+ /** Stable id used to track keyboard focus across renders. */
37
+ export declare const getRowFocusId: (row: FocusableRow) => string;
38
+ export declare const isFocusableRow: (row: VirtualRow) => row is FocusableRow;
39
+ export declare const getFocusableRows: (rows: VirtualRow[]) => FocusableRow[];
40
+ export declare const resolveTreeListFocusRowId: (focusedRowId: string | undefined, activeNodeId: string | string[] | null | undefined, rows: VirtualRow[]) => string | undefined;
41
+ export declare const resolveTreeListKeyboardNavigation: (input: {
42
+ rows: VirtualRow[];
43
+ focusedRowId: string | undefined;
44
+ activeNodeId?: string | string[] | null;
45
+ expandedNodeIds: string[];
46
+ key: string;
47
+ }) => {
48
+ type: "toggle-section";
49
+ sectionId: string;
50
+ rowId?: undefined;
51
+ } | {
52
+ type: "toggle-node";
53
+ nodeId: string;
54
+ rowId?: undefined;
55
+ } | {
56
+ type: "focus";
57
+ rowId: string;
58
+ } | null;
@@ -0,0 +1,20 @@
1
+ import { StackProps } from '@chakra-ui/react';
2
+ import { FocusEventHandler } from 'react';
3
+ import { TreeListLinkComponent, TreeListNavigateEvent, TreeListNode } from './tree-list.types';
4
+ type TreeListRowVariant = "compact" | "tree";
5
+ interface TreeListNodeRowProps {
6
+ sectionId: string;
7
+ node: TreeListNode;
8
+ level: number;
9
+ expandedNodeIds: string[];
10
+ activeNodeId?: string | string[] | null;
11
+ rowVariant: TreeListRowVariant;
12
+ nodeGap: StackProps["gap"];
13
+ linkComponent?: TreeListLinkComponent;
14
+ tabIndex?: number;
15
+ onFocus?: FocusEventHandler<HTMLElement>;
16
+ onNavigate?: (event: TreeListNavigateEvent) => void;
17
+ onToggleNode?: (nodeId: string) => void;
18
+ }
19
+ export declare const TreeListNodeRow: (props: TreeListNodeRowProps) => import("react/jsx-runtime").JSX.Element;
20
+ export {};
@@ -0,0 +1,3 @@
1
+ import { TreeListNode, TreeListSection } from './tree-list.types';
2
+ export declare const applyTreeListOrder: (sections: TreeListSection[], sectionOrder: string[], nodeOrderBySection: Record<string, string[]>) => TreeListSection[];
3
+ export declare const reorderNodesById: (nodes: TreeListNode[], order: string[]) => TreeListNode[];
@@ -0,0 +1,42 @@
1
+ interface TreeListOrderSnapshot {
2
+ sectionOrder: string[];
3
+ nodeOrderBySection: Record<string, string[]>;
4
+ }
5
+ interface TreeListOrderState extends TreeListOrderSnapshot {
6
+ setSectionOrder: (nextSectionIds: string[]) => void;
7
+ setNodeOrder: (sectionId: string, nextNodeIds: string[]) => void;
8
+ resetSectionOrder: () => void;
9
+ resetNodeOrder: (sectionId: string) => void;
10
+ reset: () => void;
11
+ }
12
+ interface CreateTreeListOrderStoreOptions {
13
+ storageKey: string;
14
+ }
15
+ export declare const createTreeListOrderStore: (options: CreateTreeListOrderStoreOptions) => Omit<import('zustand').StoreApi<TreeListOrderState>, "setState" | "persist"> & {
16
+ setState(partial: TreeListOrderState | Partial<TreeListOrderState> | ((state: TreeListOrderState) => TreeListOrderState | Partial<TreeListOrderState>), replace?: false | undefined): unknown;
17
+ setState(state: TreeListOrderState | ((state: TreeListOrderState) => TreeListOrderState), replace: true): unknown;
18
+ persist: {
19
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<TreeListOrderState, unknown, unknown>>) => void;
20
+ clearStorage: () => void;
21
+ rehydrate: () => Promise<void> | void;
22
+ hasHydrated: () => boolean;
23
+ onHydrate: (fn: (state: TreeListOrderState) => void) => () => void;
24
+ onFinishHydration: (fn: (state: TreeListOrderState) => void) => () => void;
25
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<TreeListOrderState, unknown, unknown>>;
26
+ };
27
+ };
28
+ export declare const getTreeListOrderStore: (storageKey: string) => Omit<import('zustand').StoreApi<TreeListOrderState>, "setState" | "persist"> & {
29
+ setState(partial: TreeListOrderState | Partial<TreeListOrderState> | ((state: TreeListOrderState) => TreeListOrderState | Partial<TreeListOrderState>), replace?: false | undefined): unknown;
30
+ setState(state: TreeListOrderState | ((state: TreeListOrderState) => TreeListOrderState), replace: true): unknown;
31
+ persist: {
32
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<TreeListOrderState, unknown, unknown>>) => void;
33
+ clearStorage: () => void;
34
+ rehydrate: () => Promise<void> | void;
35
+ hasHydrated: () => boolean;
36
+ onHydrate: (fn: (state: TreeListOrderState) => void) => () => void;
37
+ onFinishHydration: (fn: (state: TreeListOrderState) => void) => () => void;
38
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<TreeListOrderState, unknown, unknown>>;
39
+ };
40
+ };
41
+ export declare const useTreeListOrderStore: <T>(storageKey: string, selector: (state: TreeListOrderState) => T) => T;
42
+ export type { TreeListOrderSnapshot, TreeListOrderState };
@@ -0,0 +1,13 @@
1
+ import { TreeListSection } from './tree-list.types';
2
+ export declare const toSectionDragId: (sectionId: string) => string;
3
+ export declare const isSectionDragId: (id: string) => boolean;
4
+ export declare const fromSectionDragId: (id: string) => string;
5
+ export type ReorderResult = {
6
+ kind: "section";
7
+ nextSectionIds: string[];
8
+ } | {
9
+ kind: "node";
10
+ sectionId: string;
11
+ nextNodeIds: string[];
12
+ };
13
+ export declare const computeReorderResult: (sections: TreeListSection[], activeId: string, overId: string) => ReorderResult | null;
@@ -0,0 +1,14 @@
1
+ import { FocusEventHandler, MouseEvent as ReactMouseEvent } from 'react';
2
+ import { TreeListSection } from './tree-list.types';
3
+ interface TreeListSectionHeaderProps {
4
+ section: TreeListSection;
5
+ collapsible: boolean;
6
+ expanded: boolean;
7
+ focusId: string;
8
+ tabIndex: number;
9
+ onFocus: FocusEventHandler<HTMLElement>;
10
+ onToggle: () => void;
11
+ onContextMenu?: (event: ReactMouseEvent<HTMLElement>, sectionId: string) => void;
12
+ }
13
+ export declare const TreeListSectionHeader: (props: TreeListSectionHeaderProps) => import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1,22 @@
1
+ import { StackProps } from '@chakra-ui/react';
2
+ import { MouseEvent as ReactMouseEvent } from 'react';
3
+ import { TreeListLinkComponent, TreeListNavigateEvent, TreeListSection } from './tree-list.types';
4
+ type TreeListRowVariant = "compact" | "tree";
5
+ interface TreeListSortableProps {
6
+ sections: TreeListSection[];
7
+ expandedSectionIds?: string[];
8
+ expandedNodeIds?: string[];
9
+ activeNodeId?: string | string[] | null;
10
+ rowVariant?: TreeListRowVariant;
11
+ sectionGap?: StackProps["gap"];
12
+ nodeGap?: StackProps["gap"];
13
+ linkComponent?: TreeListLinkComponent;
14
+ onNavigate?: (event: TreeListNavigateEvent) => void;
15
+ onToggleSection?: (sectionId: string) => void;
16
+ onToggleNode?: (nodeId: string) => void;
17
+ onSectionContextMenu?: (event: ReactMouseEvent<HTMLElement>, sectionId: string) => void;
18
+ onReorderSections?: (nextSectionIds: string[]) => void;
19
+ onReorderNodes?: (sectionId: string, nextNodeIds: string[]) => void;
20
+ }
21
+ export declare const TreeListSortable: (props: TreeListSortableProps) => import("react/jsx-runtime").JSX.Element;
22
+ export {};
@@ -0,0 +1,17 @@
1
+ import { ReactNode } from 'react';
2
+ import { ResourceContextAction } from '../resource-context-menu';
3
+ import { TreeListSection } from './tree-list.types';
4
+ import { VisibilityOverride } from './tree-list-visibility.store';
5
+ export declare const resolveVisibility: (override: VisibilityOverride | undefined, hiddenByDefault: boolean | undefined) => VisibilityOverride;
6
+ export declare const filterVisibleSections: (sections: TreeListSection[], sectionOverrides: Record<string, VisibilityOverride>, nodeOverrides: Record<string, VisibilityOverride>) => TreeListSection[];
7
+ export interface TreeVisibilityMenuActions {
8
+ onToggleSection: (id: string, hiddenByDefault: boolean) => void;
9
+ onToggleNode: (id: string, hiddenByDefault: boolean) => void;
10
+ onResetAll: () => void;
11
+ onResetOrder?: () => void;
12
+ }
13
+ interface BuildMenuOptions {
14
+ checkmark: ReactNode;
15
+ }
16
+ export declare const buildTreeVisibilityMenuActions: (sections: TreeListSection[], sectionOverrides: Record<string, VisibilityOverride>, nodeOverrides: Record<string, VisibilityOverride>, actions: TreeVisibilityMenuActions, options: BuildMenuOptions) => ResourceContextAction[];
17
+ export {};
@@ -0,0 +1,45 @@
1
+ export type VisibilityOverride = "hidden" | "shown";
2
+ interface TreeListVisibilitySnapshot {
3
+ sectionOverrides: Record<string, VisibilityOverride>;
4
+ nodeOverrides: Record<string, VisibilityOverride>;
5
+ }
6
+ interface TreeListVisibilityState extends TreeListVisibilitySnapshot {
7
+ setSection: (id: string, value: VisibilityOverride | undefined) => void;
8
+ setNode: (id: string, value: VisibilityOverride | undefined) => void;
9
+ toggleSection: (id: string, hiddenByDefault: boolean) => void;
10
+ toggleNode: (id: string, hiddenByDefault: boolean) => void;
11
+ clearSection: (id: string) => void;
12
+ clearNode: (id: string) => void;
13
+ reset: () => void;
14
+ }
15
+ interface CreateTreeListVisibilityStoreOptions {
16
+ storageKey: string;
17
+ }
18
+ export declare const createTreeListVisibilityStore: (options: CreateTreeListVisibilityStoreOptions) => Omit<import('zustand').StoreApi<TreeListVisibilityState>, "setState" | "persist"> & {
19
+ setState(partial: TreeListVisibilityState | Partial<TreeListVisibilityState> | ((state: TreeListVisibilityState) => TreeListVisibilityState | Partial<TreeListVisibilityState>), replace?: false | undefined): unknown;
20
+ setState(state: TreeListVisibilityState | ((state: TreeListVisibilityState) => TreeListVisibilityState), replace: true): unknown;
21
+ persist: {
22
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<TreeListVisibilityState, unknown, unknown>>) => void;
23
+ clearStorage: () => void;
24
+ rehydrate: () => Promise<void> | void;
25
+ hasHydrated: () => boolean;
26
+ onHydrate: (fn: (state: TreeListVisibilityState) => void) => () => void;
27
+ onFinishHydration: (fn: (state: TreeListVisibilityState) => void) => () => void;
28
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<TreeListVisibilityState, unknown, unknown>>;
29
+ };
30
+ };
31
+ export declare const getTreeListVisibilityStore: (storageKey: string) => Omit<import('zustand').StoreApi<TreeListVisibilityState>, "setState" | "persist"> & {
32
+ setState(partial: TreeListVisibilityState | Partial<TreeListVisibilityState> | ((state: TreeListVisibilityState) => TreeListVisibilityState | Partial<TreeListVisibilityState>), replace?: false | undefined): unknown;
33
+ setState(state: TreeListVisibilityState | ((state: TreeListVisibilityState) => TreeListVisibilityState), replace: true): unknown;
34
+ persist: {
35
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<TreeListVisibilityState, unknown, unknown>>) => void;
36
+ clearStorage: () => void;
37
+ rehydrate: () => Promise<void> | void;
38
+ hasHydrated: () => boolean;
39
+ onHydrate: (fn: (state: TreeListVisibilityState) => void) => () => void;
40
+ onFinishHydration: (fn: (state: TreeListVisibilityState) => void) => () => void;
41
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<TreeListVisibilityState, unknown, unknown>>;
42
+ };
43
+ };
44
+ export declare const useTreeListVisibilityStore: <T>(storageKey: string, selector: (state: TreeListVisibilityState) => T) => T;
45
+ export type { TreeListVisibilitySnapshot, TreeListVisibilityState };
@@ -1,6 +1,7 @@
1
1
  import { StackProps } from '@chakra-ui/react';
2
- import { RefObject } from 'react';
3
- import { TreeListLinkComponent, TreeListNavigateEvent, TreeListNode, TreeListSection } from './tree-list.types';
2
+ import { MouseEvent as ReactMouseEvent, RefObject } from 'react';
3
+ import { TreeListLinkComponent, TreeListNavigateEvent, TreeListSection } from './tree-list.types';
4
+ export { buildVirtualRows } from './tree-list-model';
4
5
  type TreeListRowVariant = "compact" | "tree";
5
6
  interface TreeListProps {
6
7
  sections: TreeListSection[];
@@ -14,32 +15,11 @@ interface TreeListProps {
14
15
  onNavigate?: (event: TreeListNavigateEvent) => void;
15
16
  onToggleSection?: (sectionId: string) => void;
16
17
  onToggleNode?: (nodeId: string) => void;
17
- /**
18
- * When set, the tree's rows are virtualized via @tanstack/react-virtual.
19
- * Requires `scrollRef` to point at the ancestor scroll viewport.
20
- */
18
+ onSectionContextMenu?: (event: ReactMouseEvent<HTMLElement>, sectionId: string) => void;
21
19
  virtualize?: boolean;
22
20
  scrollRef?: RefObject<HTMLDivElement | null>;
21
+ draggable?: boolean;
22
+ onReorderSections?: (nextSectionIds: string[]) => void;
23
+ onReorderNodes?: (sectionId: string, nextNodeIds: string[]) => void;
23
24
  }
24
- export type VirtualRow = {
25
- kind: "section-header";
26
- key: string;
27
- sectionId: string;
28
- section: TreeListSection;
29
- collapsible: boolean;
30
- expanded: boolean;
31
- } | {
32
- kind: "node";
33
- key: string;
34
- sectionId: string;
35
- node: TreeListNode;
36
- level: number;
37
- } | {
38
- kind: "section-empty";
39
- key: string;
40
- sectionId: string;
41
- emptyState: TreeListSection["emptyState"];
42
- };
43
- export declare const buildVirtualRows: (sections: TreeListSection[], expandedSectionIds: string[], expandedNodeIds: string[]) => VirtualRow[];
44
25
  export declare const TreeList: (props: TreeListProps) => import("react/jsx-runtime").JSX.Element;
45
- export {};
@@ -7,6 +7,7 @@ export type TreeListAction = ListRowAction;
7
7
  export type TreeListNode = ListRowItem & {
8
8
  id: string;
9
9
  children?: TreeListNode[];
10
+ hiddenByDefault?: boolean;
10
11
  };
11
12
  export interface TreeListSection {
12
13
  id: string;
@@ -15,6 +16,7 @@ export interface TreeListSection {
15
16
  actions?: TreeListAction[];
16
17
  emptyState?: ReactNode;
17
18
  nodes: TreeListNode[];
19
+ hiddenByDefault?: boolean;
18
20
  }
19
21
  export interface TreeListNavigateEvent {
20
22
  sectionId: string;
@@ -0,0 +1,15 @@
1
+ import { KeyboardEvent } from 'react';
2
+ import { VirtualRow } from './tree-list-model';
3
+ export declare const useTreeListKeyboardNavigation: (input: {
4
+ rows: VirtualRow[];
5
+ activeNodeId?: string | string[] | null;
6
+ expandedNodeIds: string[];
7
+ onToggleNode?: (nodeId: string) => void;
8
+ onToggleSection?: (sectionId: string) => void;
9
+ scrollToRow?: (index: number) => void;
10
+ }) => {
11
+ focusRowId: string | undefined;
12
+ rootRef: import('react').RefObject<HTMLDivElement | null>;
13
+ handleKeyDown: (event: KeyboardEvent<HTMLElement>) => void;
14
+ onRowFocus: (rowId: string) => void;
15
+ };
@@ -0,0 +1,102 @@
1
+ import { jsx as g, jsxs as $ } from "react/jsx-runtime";
2
+ import { c as q } from "react/compiler-runtime";
3
+ import { Tooltip as F, Portal as D, ScrollArea as R } from "@chakra-ui/react";
4
+ import * as V from "react";
5
+ import { FileSpreadsheet as E, FileCode as H, FileChartLine as I, FileJson as L, FileText as _, FileCog as k, FileImage as J, FileArchive as W, File as B } from "lucide-react";
6
+ const U = V.forwardRef(function(t, v) {
7
+ const e = q(26);
8
+ let l, r, i, d, s, a, f, u;
9
+ e[0] !== t ? ({
10
+ showArrow: f,
11
+ children: l,
12
+ disabled: d,
13
+ portalled: u,
14
+ content: r,
15
+ contentProps: i,
16
+ portalRef: s,
17
+ ...a
18
+ } = t, e[0] = t, e[1] = l, e[2] = r, e[3] = i, e[4] = d, e[5] = s, e[6] = a, e[7] = f, e[8] = u) : (l = e[1], r = e[2], i = e[3], d = e[4], s = e[5], a = e[6], f = e[7], u = e[8]);
19
+ const x = u === void 0 ? !0 : u;
20
+ if (d || K(r))
21
+ return l;
22
+ let n;
23
+ e[9] !== l ? (n = /* @__PURE__ */ g(F.Trigger, { asChild: !0, children: l }), e[9] = l, e[10] = n) : n = e[10];
24
+ const h = !x;
25
+ let p;
26
+ e[11] !== f ? (p = f && /* @__PURE__ */ g(F.Arrow, { children: /* @__PURE__ */ g(F.ArrowTip, {}) }), e[11] = f, e[12] = p) : p = e[12];
27
+ let o;
28
+ e[13] !== r || e[14] !== i || e[15] !== v || e[16] !== p ? (o = /* @__PURE__ */ g(F.Positioner, { children: /* @__PURE__ */ $(F.Content, { ref: v, ...i, children: [
29
+ p,
30
+ r
31
+ ] }) }), e[13] = r, e[14] = i, e[15] = v, e[16] = p, e[17] = o) : o = e[17];
32
+ let m;
33
+ e[18] !== s || e[19] !== h || e[20] !== o ? (m = /* @__PURE__ */ g(D, { disabled: h, container: s, children: o }), e[18] = s, e[19] = h, e[20] = o, e[21] = m) : m = e[21];
34
+ let w;
35
+ return e[22] !== a || e[23] !== n || e[24] !== m ? (w = /* @__PURE__ */ $(F.Root, { openDelay: 100, closeDelay: 100, ...a, children: [
36
+ n,
37
+ m
38
+ ] }), e[22] = a, e[23] = n, e[24] = m, e[25] = w) : w = e[25], w;
39
+ });
40
+ function G(c) {
41
+ return typeof c == "string" ? c.trim().length === 0 : !1;
42
+ }
43
+ function K(c) {
44
+ if (c == null || c === !1)
45
+ return !0;
46
+ const t = V.Children.toArray(c);
47
+ return t.length === 0 ? !0 : t.every(G);
48
+ }
49
+ const X = V.forwardRef(function(t, v) {
50
+ const e = q(40);
51
+ let l, r, i, d, s, a, f, u, x, b, n, h;
52
+ e[0] !== t ? ({
53
+ children: l,
54
+ viewportRef: h,
55
+ contentRef: i,
56
+ viewportProps: n,
57
+ contentProps: r,
58
+ verticalScrollbarProps: b,
59
+ horizontalScrollbarProps: d,
60
+ showVerticalScrollbar: a,
61
+ showHorizontalScrollbar: f,
62
+ showCorner: u,
63
+ size: x,
64
+ ...s
65
+ } = t, e[0] = t, e[1] = l, e[2] = r, e[3] = i, e[4] = d, e[5] = s, e[6] = a, e[7] = f, e[8] = u, e[9] = x, e[10] = b, e[11] = n, e[12] = h) : (l = e[1], r = e[2], i = e[3], d = e[4], s = e[5], a = e[6], f = e[7], u = e[8], x = e[9], b = e[10], n = e[11], h = e[12]);
66
+ const p = a === void 0 ? !0 : a, o = f === void 0 ? !1 : f, m = u === void 0 ? p && o : u, w = x === void 0 ? "xs" : x;
67
+ let A;
68
+ e[13] !== r || e[14] !== o ? (A = o ? r : {
69
+ ...r,
70
+ style: {
71
+ minWidth: 0,
72
+ ...r?.style
73
+ }
74
+ }, e[13] = r, e[14] = o, e[15] = A) : A = e[15];
75
+ const P = A;
76
+ let C;
77
+ e[16] !== l || e[17] !== i || e[18] !== P ? (C = /* @__PURE__ */ g(R.Content, { ...P, ref: i, children: l }), e[16] = l, e[17] = i, e[18] = P, e[19] = C) : C = e[19];
78
+ let S;
79
+ e[20] !== C || e[21] !== n || e[22] !== h ? (S = /* @__PURE__ */ g(R.Viewport, { ...n, ref: h, children: C }), e[20] = C, e[21] = n, e[22] = h, e[23] = S) : S = e[23];
80
+ let y;
81
+ e[24] !== p || e[25] !== b ? (y = p ? /* @__PURE__ */ g(R.Scrollbar, { ...b, borderRadius: "xs" }) : null, e[24] = p, e[25] = b, e[26] = y) : y = e[26];
82
+ let j;
83
+ e[27] !== d || e[28] !== o ? (j = o ? /* @__PURE__ */ g(R.Scrollbar, { orientation: "horizontal", ...d, borderRadius: "xs" }) : null, e[27] = d, e[28] = o, e[29] = j) : j = e[29];
84
+ let z;
85
+ e[30] !== m ? (z = m ? /* @__PURE__ */ g(R.Corner, {}) : null, e[30] = m, e[31] = z) : z = e[31];
86
+ let T;
87
+ return e[32] !== v || e[33] !== s || e[34] !== w || e[35] !== S || e[36] !== y || e[37] !== j || e[38] !== z ? (T = /* @__PURE__ */ $(R.Root, { ref: v, size: w, ...s, children: [
88
+ S,
89
+ y,
90
+ j,
91
+ z
92
+ ] }), e[32] = v, e[33] = s, e[34] = w, e[35] = S, e[36] = y, e[37] = j, e[38] = z, e[39] = T) : T = e[39], T;
93
+ }), Y = (c) => {
94
+ const t = c.split(".").pop()?.toLowerCase() ?? "";
95
+ return ["csv", "tsv", "xlsx", "xls", "parquet"].includes(t) ? E : ["sql", "py", "js", "ts", "jsx", "tsx", "java", "cpp", "c", "h", "css", "scss", "sass", "php", "rb", "go", "rs", "kt", "swift"].includes(t) ? H : ["json", "jsonl", "ndjson"].includes(t) ? c.includes("/visualizations/") ? I : L : ["md", "txt", "rst", "org", "pdf", "doc", "docx", "rtf"].includes(t) ? _ : ["yaml", "yml", "toml", "ini", "conf", "config"].includes(t) ? k : ["png", "jpg", "jpeg", "gif", "svg", "webp", "ico"].includes(t) ? J : ["zip", "tar", "gz", "rar", "7z"].includes(t) ? W : B;
96
+ };
97
+ export {
98
+ X as S,
99
+ U as T,
100
+ Y as g
101
+ };
102
+ //# sourceMappingURL=get-file-type-icon-ufFb0IkR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-file-type-icon-ufFb0IkR.js","sources":["../src/components/tooltip.tsx","../src/components/scroll-area.tsx","../src/utils/get-file-type-icon.ts"],"sourcesContent":["import { Tooltip as ChakraTooltip, Portal } from \"@chakra-ui/react\";\nimport * as React from \"react\";\n\nexport interface TooltipProps extends ChakraTooltip.RootProps {\n children?: React.ReactElement;\n showArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement>;\n content: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n}\n\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(function Tooltip(props, ref) {\n const { showArrow, children, disabled, portalled = true, content, contentProps, portalRef, ...rest } = props;\n\n const isEmptyContent = (node: React.ReactNode): boolean => {\n if (node === null || node === undefined || node === false) return true;\n const arr = React.Children.toArray(node);\n if (arr.length === 0) return true;\n return arr.every((child) => (typeof child === \"string\" ? child.trim().length === 0 : false));\n };\n\n if (disabled || isEmptyContent(content)) return children;\n\n return (\n <ChakraTooltip.Root openDelay={100} closeDelay={100} {...rest}>\n <ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content ref={ref} {...contentProps}>\n {showArrow && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {content}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n});\n","import { ScrollArea as ChakraScrollArea } from \"@chakra-ui/react\";\nimport * as React from \"react\";\n\ntype VerticalScrollbarProps = Omit<ChakraScrollArea.ScrollbarProps, \"orientation\">;\ntype HorizontalScrollbarProps = Omit<ChakraScrollArea.ScrollbarProps, \"orientation\">;\n\nexport interface ScrollAreaProps extends ChakraScrollArea.RootProps {\n viewportRef?: React.Ref<HTMLDivElement>;\n contentRef?: React.Ref<HTMLDivElement>;\n viewportProps?: ChakraScrollArea.ViewportProps;\n contentProps?: ChakraScrollArea.ContentProps;\n verticalScrollbarProps?: VerticalScrollbarProps;\n horizontalScrollbarProps?: HorizontalScrollbarProps;\n showVerticalScrollbar?: boolean;\n showHorizontalScrollbar?: boolean;\n showCorner?: boolean;\n}\n\nexport const ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(function ScrollArea(props, ref) {\n const {\n children,\n viewportRef,\n contentRef,\n viewportProps,\n contentProps,\n verticalScrollbarProps,\n horizontalScrollbarProps,\n showVerticalScrollbar = true,\n showHorizontalScrollbar = false,\n showCorner = showVerticalScrollbar && showHorizontalScrollbar,\n size = \"xs\",\n ...rest\n } = props;\n\n const mergedContentProps = showHorizontalScrollbar\n ? contentProps\n : { ...contentProps, style: { minWidth: 0, ...contentProps?.style } };\n\n return (\n <ChakraScrollArea.Root ref={ref} size={size} {...rest}>\n <ChakraScrollArea.Viewport {...viewportProps} ref={viewportRef}>\n <ChakraScrollArea.Content {...mergedContentProps} ref={contentRef}>\n {children}\n </ChakraScrollArea.Content>\n </ChakraScrollArea.Viewport>\n {showVerticalScrollbar ? <ChakraScrollArea.Scrollbar {...verticalScrollbarProps} borderRadius={\"xs\"} /> : null}\n {showHorizontalScrollbar ? (\n <ChakraScrollArea.Scrollbar orientation=\"horizontal\" {...horizontalScrollbarProps} borderRadius={\"xs\"} />\n ) : null}\n {showCorner ? <ChakraScrollArea.Corner /> : null}\n </ChakraScrollArea.Root>\n );\n});\n","import type { LucideIcon } from \"lucide-react\";\nimport {\n File,\n FileArchive,\n FileChartLine,\n FileCode,\n FileCog,\n FileImage,\n FileJson,\n FileSpreadsheet,\n FileText,\n} from \"lucide-react\";\n\nexport const getFileTypeIcon = (filename: string): LucideIcon => {\n const extension = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n\n if ([\"csv\", \"tsv\", \"xlsx\", \"xls\", \"parquet\"].includes(extension)) return FileSpreadsheet;\n if (\n [\n \"sql\",\n \"py\",\n \"js\",\n \"ts\",\n \"jsx\",\n \"tsx\",\n \"java\",\n \"cpp\",\n \"c\",\n \"h\",\n \"css\",\n \"scss\",\n \"sass\",\n \"php\",\n \"rb\",\n \"go\",\n \"rs\",\n \"kt\",\n \"swift\",\n ].includes(extension)\n ) {\n return FileCode;\n }\n if ([\"json\", \"jsonl\", \"ndjson\"].includes(extension)) {\n if (filename.includes(\"/visualizations/\")) return FileChartLine;\n return FileJson;\n }\n if ([\"md\", \"txt\", \"rst\", \"org\", \"pdf\", \"doc\", \"docx\", \"rtf\"].includes(extension)) return FileText;\n if ([\"yaml\", \"yml\", \"toml\", \"ini\", \"conf\", \"config\"].includes(extension)) return FileCog;\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"svg\", \"webp\", \"ico\"].includes(extension)) return FileImage;\n if ([\"zip\", \"tar\", \"gz\", \"rar\", \"7z\"].includes(extension)) return FileArchive;\n return File;\n};\n"],"names":["Tooltip","React","forwardRef","props","ref","$","_c","children","content","contentProps","disabled","portalRef","rest","showArrow","t0","portalled","undefined","_temp2","t1","ChakraTooltip","t2","t3","jsx","t4","jsxs","t5","Portal","t6","_temp","child","trim","length","node","arr","Children","toArray","every","ScrollArea","contentRef","horizontalScrollbarProps","verticalScrollbarProps","viewportProps","viewportRef","showVerticalScrollbar","showHorizontalScrollbar","showCorner","size","style","minWidth","mergedContentProps","ChakraScrollArea","t7","t8","t9","t10","getFileTypeIcon","filename","extension","split","pop","toLowerCase","includes","FileSpreadsheet","FileCode","FileChartLine","FileJson","FileText","FileCog","FileImage","FileArchive","File"],"mappings":"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"}