@jetcrab/pi-desk-sdk 0.0.0-stage → 1.0.1-dev.9001

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.
@@ -0,0 +1,6 @@
1
+ export * from './capabilities.ts';
2
+ export * from './shared.ts';
3
+ export * from './settings.ts';
4
+ export * from './errors.ts';
5
+ export * from './entry.ts';
6
+ export * from './session.ts';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from "./capabilities.js";
2
+ export * from "./shared.js";
3
+ export * from "./settings.js";
4
+ export * from "./errors.js";
5
+ export * from "./entry.js";
6
+ export * from "./session.js";
@@ -0,0 +1,33 @@
1
+ import { Component, type ErrorInfo, type ReactNode } from 'react';
2
+ import type { BrowserConnectionHost, BrowserConnectionSnapshot, BrowserMessageHandle, BrowserPluginFacade, BrowserWorkSessionHost, PluginJsonObject, PluginPushMessage, PluginWorkSession, PublicMessageSnapshot } from './browser.js';
3
+ export type { BrowserConnectionHost, BrowserConnectionSnapshot, BrowserMessageHandle, BrowserNotificationInput, BrowserNotificationLevel, BrowserPluginFacade, BrowserWorkSessionHost, PluginPushMessage, PluginWorkSession, PublicMessageSnapshot } from './browser.js';
4
+ export * from './react-ui.tsx';
5
+ export * from './react-log.tsx';
6
+ export declare function usePluginConnection(connection: BrowserConnectionHost): BrowserConnectionSnapshot;
7
+ export declare function usePluginWorkSessions(workSessions: BrowserWorkSessionHost): readonly PluginWorkSession[];
8
+ export declare function usePluginPush(plugin: Pick<BrowserPluginFacade, 'onPush'>, listener: (message: PluginPushMessage) => void): void;
9
+ export declare function useMessageHandle(handle: BrowserMessageHandle): PublicMessageSnapshot;
10
+ export interface MessageDetailState {
11
+ detail: PluginJsonObject | null | undefined;
12
+ loading: boolean;
13
+ error: Error | null;
14
+ load(): Promise<PluginJsonObject | null>;
15
+ }
16
+ export declare function useMessageDetail(handle: BrowserMessageHandle, autoLoad?: boolean): MessageDetailState;
17
+ export interface PluginErrorBoundaryProps {
18
+ children: ReactNode;
19
+ fallback?: ReactNode | ((error: Error, retry: () => void) => ReactNode);
20
+ onError?(error: Error, info: ErrorInfo): void;
21
+ resetKey?: unknown;
22
+ }
23
+ interface PluginErrorBoundaryState {
24
+ error: Error | null;
25
+ }
26
+ export declare class PluginErrorBoundary extends Component<PluginErrorBoundaryProps, PluginErrorBoundaryState> {
27
+ state: PluginErrorBoundaryState;
28
+ static getDerivedStateFromError(error: Error): PluginErrorBoundaryState;
29
+ componentDidCatch(error: Error, info: ErrorInfo): void;
30
+ componentDidUpdate(previousProps: PluginErrorBoundaryProps): void;
31
+ private readonly retry;
32
+ render(): ReactNode;
33
+ }
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Component, useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';
3
+ export * from "./react-ui.js";
4
+ export * from "./react-log.js";
5
+ function useExternalSnapshot(owner) {
6
+ const subscribe = useCallback((listener) => {
7
+ const dispose = owner.subscribe(listener);
8
+ return () => {
9
+ void dispose();
10
+ };
11
+ }, [owner]);
12
+ const getSnapshot = useCallback(() => owner.getSnapshot(), [owner]);
13
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
14
+ }
15
+ export function usePluginConnection(connection) {
16
+ return useExternalSnapshot(connection);
17
+ }
18
+ export function usePluginWorkSessions(workSessions) {
19
+ return useExternalSnapshot(workSessions);
20
+ }
21
+ export function usePluginPush(plugin, listener) {
22
+ useEffect(() => {
23
+ const dispose = plugin.onPush(listener);
24
+ return () => {
25
+ void dispose();
26
+ };
27
+ }, [listener, plugin]);
28
+ }
29
+ export function useMessageHandle(handle) {
30
+ return useExternalSnapshot(handle);
31
+ }
32
+ export function useMessageDetail(handle, autoLoad = false) {
33
+ const snapshot = useMessageHandle(handle);
34
+ const requestEpoch = useRef(0);
35
+ const [requestState, setRequestState] = useState({ handle, loading: false, loaded: false, error: null });
36
+ const currentState = requestState.handle === handle
37
+ ? requestState
38
+ : { handle, loading: false, loaded: false, error: null };
39
+ const load = useCallback(async () => {
40
+ const epoch = requestEpoch.current + 1;
41
+ requestEpoch.current = epoch;
42
+ setRequestState({ handle, loading: true, loaded: false, error: null });
43
+ try {
44
+ const detail = await handle.loadDetail();
45
+ if (requestEpoch.current === epoch) {
46
+ setRequestState({ handle, loading: false, loaded: true, error: null });
47
+ }
48
+ return detail;
49
+ }
50
+ catch (cause) {
51
+ const nextError = cause instanceof Error ? cause : new Error(String(cause));
52
+ if (requestEpoch.current === epoch) {
53
+ setRequestState({ handle, loading: false, loaded: false, error: nextError });
54
+ }
55
+ throw nextError;
56
+ }
57
+ }, [handle]);
58
+ useEffect(() => {
59
+ if (!autoLoad ||
60
+ currentState.loading ||
61
+ currentState.loaded ||
62
+ currentState.error ||
63
+ snapshot.detail !== undefined ||
64
+ !snapshot.fixed.hasDetail ||
65
+ !('entryId' in snapshot.location)) {
66
+ return;
67
+ }
68
+ let active = true;
69
+ queueMicrotask(() => {
70
+ if (active)
71
+ void load().catch(() => undefined);
72
+ });
73
+ return () => {
74
+ active = false;
75
+ };
76
+ }, [
77
+ autoLoad,
78
+ currentState.error,
79
+ currentState.loaded,
80
+ currentState.loading,
81
+ load,
82
+ snapshot.detail,
83
+ snapshot.fixed.hasDetail,
84
+ snapshot.location
85
+ ]);
86
+ return {
87
+ detail: snapshot.detail,
88
+ loading: currentState.loading,
89
+ error: currentState.error,
90
+ load
91
+ };
92
+ }
93
+ export class PluginErrorBoundary extends Component {
94
+ state = { error: null };
95
+ static getDerivedStateFromError(error) {
96
+ return { error };
97
+ }
98
+ componentDidCatch(error, info) {
99
+ this.props.onError?.(error, info);
100
+ }
101
+ componentDidUpdate(previousProps) {
102
+ if (previousProps.resetKey !== this.props.resetKey && this.state.error) {
103
+ this.setState({ error: null });
104
+ }
105
+ }
106
+ retry = () => {
107
+ this.setState({ error: null });
108
+ };
109
+ render() {
110
+ const { error } = this.state;
111
+ if (!error)
112
+ return this.props.children;
113
+ if (typeof this.props.fallback === 'function') {
114
+ return this.props.fallback(error, this.retry);
115
+ }
116
+ if (this.props.fallback !== undefined)
117
+ return this.props.fallback;
118
+ return (_jsxs("div", { role: "alert", "data-pi-desk-plugin-error": "true", children: [_jsx("p", { children: "\u63D2\u4EF6\u754C\u9762\u52A0\u8F7D\u5931\u8D25" }), _jsx("pre", { children: error.message }), _jsx("button", { type: "button", onClick: this.retry, children: "\u91CD\u8BD5" })] }));
119
+ }
120
+ }
@@ -0,0 +1,12 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ import type { BrowserPluginHost } from './browser.js';
3
+ export interface PluginHostProviderProps {
4
+ host: BrowserPluginHost;
5
+ children: ReactNode;
6
+ }
7
+ export declare function PluginHostProvider({ host, children }: PluginHostProviderProps): React.JSX.Element;
8
+ export declare function usePluginHost(): BrowserPluginHost;
9
+ export interface PluginLogViewerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
10
+ path: string;
11
+ }
12
+ export declare function PluginLogViewer(props: PluginLogViewerProps): React.JSX.Element;
@@ -0,0 +1,99 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';
3
+ import { PluginButton, PluginScroll, PluginSurface } from "./react-ui.js";
4
+ const PluginHostContext = createContext(null);
5
+ const EMPTY_LOG_SNAPSHOT = {
6
+ text: '',
7
+ truncated: false,
8
+ loading: true,
9
+ error: null
10
+ };
11
+ const PLUGIN_LOG_STYLES = `
12
+ .pi-desk-ui-log{position:relative;display:flex;min-width:0;height:18rem;max-height:min(18rem,50dvh);flex-direction:column;overflow:hidden;border:1px solid var(--pi-desk-plugin-border,var(--border));border-radius:.5rem;background:var(--pi-desk-plugin-background,var(--background));color:var(--pi-desk-plugin-foreground,var(--foreground))}
13
+ .pi-desk-ui-log-status{display:flex;min-height:2rem;flex-shrink:0;align-items:center;justify-content:space-between;gap:.75rem;border-bottom:1px solid var(--pi-desk-plugin-border,var(--border));padding:.35rem .65rem;color:var(--pi-desk-plugin-muted-foreground,var(--muted-foreground));font-size:.75rem;line-height:1.5}
14
+ .pi-desk-ui-log-scroll{min-height:0;flex:1}
15
+ .pi-desk-ui-log-scroll-viewport{padding:.75rem;overscroll-behavior:contain}
16
+ .pi-desk-ui-log-content{margin:0;min-width:100%;font:.875rem/1.6 ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}
17
+ .pi-desk-ui-log-empty{display:grid;min-height:100%;place-items:center;padding:1rem;color:var(--pi-desk-plugin-muted-foreground,var(--muted-foreground));font-size:.875rem;text-align:center}
18
+ .pi-desk-ui-log-error{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;gap:.75rem;border-top:1px solid color-mix(in srgb,var(--pi-desk-plugin-destructive,var(--destructive)) 35%,var(--pi-desk-plugin-border,var(--border)));padding:.45rem .65rem;background:color-mix(in srgb,var(--pi-desk-plugin-destructive,var(--destructive)) 8%,transparent);color:var(--pi-desk-plugin-destructive,var(--destructive));font-size:.75rem}
19
+ .pi-desk-ui-log-bottom{position:absolute;right:.65rem;bottom:.65rem;box-shadow:0 4px 16px color-mix(in srgb,var(--pi-desk-plugin-foreground,var(--foreground)) 16%,transparent)}
20
+ @media(max-width:640px){.pi-desk-ui-log{height:14rem;max-height:45dvh}.pi-desk-ui-log-scroll-viewport{padding:.65rem}}
21
+ `;
22
+ function classNames(...values) {
23
+ return values.filter(Boolean).join(' ');
24
+ }
25
+ export function PluginHostProvider({ host, children }) {
26
+ return _jsx(PluginHostContext.Provider, { value: host, children: children });
27
+ }
28
+ export function usePluginHost() {
29
+ const host = useContext(PluginHostContext);
30
+ if (!host)
31
+ throw new Error('PluginLogViewer 必须位于 PluginHostProvider 内');
32
+ return host;
33
+ }
34
+ function usePluginLog(path) {
35
+ const host = usePluginHost();
36
+ const handleRef = useRef(null);
37
+ const [state, setState] = useState({
38
+ path,
39
+ snapshot: EMPTY_LOG_SNAPSHOT
40
+ });
41
+ useEffect(() => {
42
+ const handle = host.logs.open(path);
43
+ handleRef.current = { path, handle };
44
+ const update = () => {
45
+ setState({ path, snapshot: handle.getSnapshot() });
46
+ };
47
+ update();
48
+ const unsubscribe = handle.subscribe(update);
49
+ return () => {
50
+ unsubscribe();
51
+ handle.dispose();
52
+ if (handleRef.current?.handle === handle)
53
+ handleRef.current = null;
54
+ };
55
+ }, [host.logs, path]);
56
+ return {
57
+ snapshot: state.path === path ? state.snapshot : EMPTY_LOG_SNAPSHOT,
58
+ retry: () => {
59
+ const current = handleRef.current;
60
+ if (current?.path === path)
61
+ current.handle.retry();
62
+ }
63
+ };
64
+ }
65
+ function PluginLogViewerContent({ path, className, ...props }) {
66
+ const { snapshot, retry } = usePluginLog(path);
67
+ const scrollRef = useRef(null);
68
+ const followRef = useRef(true);
69
+ const [following, setFollowing] = useState(true);
70
+ const scrollToBottom = useCallback(() => {
71
+ const element = scrollRef.current;
72
+ if (!element)
73
+ return;
74
+ element.scrollTop = element.scrollHeight;
75
+ followRef.current = true;
76
+ setFollowing(true);
77
+ }, []);
78
+ useEffect(() => {
79
+ if (followRef.current)
80
+ scrollToBottom();
81
+ }, [scrollToBottom, snapshot.text]);
82
+ const handleScroll = () => {
83
+ const element = scrollRef.current;
84
+ if (!element)
85
+ return;
86
+ const atBottom = element.scrollHeight - element.scrollTop - element.clientHeight <= 24;
87
+ followRef.current = atBottom;
88
+ setFollowing(atBottom);
89
+ };
90
+ const status = snapshot.truncated
91
+ ? '日志较长,当前仅显示末尾内容'
92
+ : snapshot.loading && snapshot.text
93
+ ? '正在同步日志…'
94
+ : null;
95
+ return (_jsxs(PluginSurface, { ...props, "data-pi-desk-plugin-log-viewer": "", className: classNames('pi-desk-ui-log', className), children: [_jsx("style", { children: PLUGIN_LOG_STYLES }), status ? (_jsx("div", { className: "pi-desk-ui-log-status", role: "status", children: _jsx("span", { children: status }) })) : null, _jsx(PluginScroll, { viewportRef: scrollRef, className: "pi-desk-ui-log-scroll", viewportClassName: "pi-desk-ui-log-scroll-viewport", onScroll: handleScroll, children: snapshot.text ? (_jsx("pre", { className: "pi-desk-ui-log-content", children: snapshot.text })) : (_jsx("div", { className: "pi-desk-ui-log-empty", role: "status", children: snapshot.loading ? '正在加载日志…' : '等待日志输出…' })) }), snapshot.error ? (_jsxs("div", { className: "pi-desk-ui-log-error", role: "alert", children: [_jsx("span", { children: snapshot.error }), _jsx(PluginButton, { size: "sm", onClick: retry, children: "\u91CD\u8BD5" })] })) : null, !following && snapshot.text ? (_jsx(PluginButton, { size: "sm", className: "pi-desk-ui-log-bottom", onClick: scrollToBottom, children: "\u56DE\u5230\u5E95\u90E8" })) : null] }));
96
+ }
97
+ export function PluginLogViewer(props) {
98
+ return _jsx(PluginLogViewerContent, { ...props }, props.path);
99
+ }
@@ -0,0 +1,5 @@
1
+ export interface PluginMarkdownProps {
2
+ content: string;
3
+ className?: string;
4
+ }
5
+ export declare function PluginMarkdown({ content, className }: PluginMarkdownProps): React.JSX.Element;
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cjk } from '@streamdown/cjk';
3
+ import { Streamdown } from 'streamdown';
4
+ const PLUGIN_MARKDOWN_PLUGINS = { cjk };
5
+ const COMPACT_CODE_CONTROLS = {
6
+ code: {
7
+ copy: true,
8
+ download: false
9
+ }
10
+ };
11
+ function classNames(...values) {
12
+ return values.filter(Boolean).join(' ');
13
+ }
14
+ export function PluginMarkdown({ content, className }) {
15
+ return (_jsx(Streamdown, { className: classNames('pi-desk-ui-markdown space-y-0', className), controls: COMPACT_CODE_CONTROLS, lineNumbers: false, plugins: PLUGIN_MARKDOWN_PLUGINS, children: content }));
16
+ }
@@ -0,0 +1,197 @@
1
+ import { ContextMenu as ContextMenuPrimitive } from '@base-ui/react/context-menu';
2
+ import { type ButtonHTMLAttributes, type HTMLAttributes, type InputHTMLAttributes, type ReactNode, type Ref, type SelectHTMLAttributes, type TextareaHTMLAttributes, type UIEventHandler } from 'react';
3
+ export declare function PluginSurface({ className, children, ...props }: HTMLAttributes<HTMLDivElement>): React.JSX.Element;
4
+ export type PluginScrollOrientation = 'vertical' | 'horizontal' | 'both';
5
+ export type PluginScrollProps = Omit<HTMLAttributes<HTMLDivElement>, 'onScroll'> & {
6
+ orientation?: PluginScrollOrientation;
7
+ viewportClassName?: string;
8
+ viewportRef?: Ref<HTMLDivElement>;
9
+ onScroll?: UIEventHandler<HTMLDivElement>;
10
+ };
11
+ export declare function PluginScroll({ orientation, viewportClassName, viewportRef, onScroll, role, className, children, ...props }: PluginScrollProps): React.JSX.Element;
12
+ export type PluginDensity = 'regular' | 'compact';
13
+ export type PluginControlSize = 'default' | 'sm';
14
+ type PluginHeadingLevel = 1 | 2 | 3 | 4;
15
+ export interface PluginPanelHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
16
+ title: ReactNode;
17
+ description?: ReactNode;
18
+ actions?: ReactNode;
19
+ meta?: ReactNode;
20
+ density?: PluginDensity;
21
+ headingLevel?: PluginHeadingLevel;
22
+ }
23
+ export declare function PluginPanelHeader({ title, description, actions, meta, density, headingLevel, className, ...props }: PluginPanelHeaderProps): React.JSX.Element;
24
+ export interface PluginSectionProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
25
+ title: ReactNode;
26
+ description?: ReactNode;
27
+ action?: ReactNode;
28
+ density?: PluginDensity;
29
+ headingLevel?: PluginHeadingLevel;
30
+ }
31
+ export declare function PluginSection({ title, description, action, density, headingLevel, className, children, ...props }: PluginSectionProps): React.JSX.Element;
32
+ export interface PluginTabListProps extends HTMLAttributes<HTMLDivElement> {
33
+ label?: string;
34
+ }
35
+ export declare function PluginTabList({ label, className, ...props }: PluginTabListProps): React.JSX.Element;
36
+ export interface PluginTabProps extends ButtonHTMLAttributes<HTMLButtonElement> {
37
+ active?: boolean;
38
+ }
39
+ export declare function PluginTab({ active, className, type, ...props }: PluginTabProps): React.JSX.Element;
40
+ export type PluginActionRowAlign = 'start' | 'end' | 'between';
41
+ export interface PluginActionRowProps extends HTMLAttributes<HTMLDivElement> {
42
+ align?: PluginActionRowAlign;
43
+ mobileStack?: boolean;
44
+ }
45
+ export declare function PluginActionRow({ align, mobileStack, className, ...props }: PluginActionRowProps): React.JSX.Element;
46
+ export type PluginKeyValueLayout = 'inline' | 'stacked';
47
+ export interface PluginKeyValueListProps extends HTMLAttributes<HTMLDListElement> {
48
+ density?: PluginDensity;
49
+ layout?: PluginKeyValueLayout;
50
+ }
51
+ export declare function PluginKeyValueList({ density, layout, className, ...props }: PluginKeyValueListProps): React.JSX.Element;
52
+ export interface PluginKeyValueItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
53
+ label: ReactNode;
54
+ value: ReactNode;
55
+ action?: ReactNode;
56
+ }
57
+ export declare function PluginKeyValueItem({ label, value, action, className, ...props }: PluginKeyValueItemProps): React.JSX.Element;
58
+ export declare function PluginSpinner({ className }: {
59
+ className?: string;
60
+ }): React.JSX.Element;
61
+ export interface PluginLoadingStateProps {
62
+ loading: boolean;
63
+ error?: Error | string | null;
64
+ loadingLabel?: ReactNode;
65
+ retryLabel?: ReactNode;
66
+ onRetry?: () => void;
67
+ className?: string;
68
+ children: ReactNode;
69
+ }
70
+ export declare function PluginLoadingState({ loading, error, loadingLabel, retryLabel, onRetry, className, children }: PluginLoadingStateProps): React.JSX.Element;
71
+ export interface PluginSplitViewProps extends HTMLAttributes<HTMLDivElement> {
72
+ navigation: ReactNode;
73
+ navigationLabel?: string;
74
+ }
75
+ export declare function PluginSplitView({ navigation, navigationLabel, className, children, ...props }: PluginSplitViewProps): React.JSX.Element;
76
+ export interface PluginListProps extends HTMLAttributes<HTMLDivElement> {
77
+ density?: PluginDensity;
78
+ }
79
+ export declare function PluginList({ density, className, ...props }: PluginListProps): React.JSX.Element;
80
+ export interface PluginListItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {
81
+ selected?: boolean;
82
+ density?: PluginDensity;
83
+ }
84
+ export declare function PluginListItem({ selected, density, className, type, ...props }: PluginListItemProps): React.JSX.Element;
85
+ export interface PluginCardProps extends HTMLAttributes<HTMLDivElement> {
86
+ density?: PluginDensity;
87
+ }
88
+ export declare function PluginCard({ density, className, ...props }: PluginCardProps): React.JSX.Element;
89
+ export type PluginButtonVariant = 'primary' | 'secondary' | 'danger' | 'ghost';
90
+ export type PluginButtonSize = 'default' | 'sm' | 'xs';
91
+ export interface PluginButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
92
+ variant?: PluginButtonVariant;
93
+ size?: PluginButtonSize;
94
+ }
95
+ export declare function PluginButton({ variant, size, className, type, ...props }: PluginButtonProps): React.JSX.Element;
96
+ export declare function PluginContextMenu(props: ContextMenuPrimitive.Root.Props): React.JSX.Element;
97
+ export declare function PluginContextMenuTrigger(props: ContextMenuPrimitive.Trigger.Props): React.JSX.Element;
98
+ export type PluginContextMenuContentProps = Omit<ContextMenuPrimitive.Popup.Props, 'className'> & {
99
+ className?: string;
100
+ };
101
+ export declare function PluginContextMenuContent({ className, ...props }: PluginContextMenuContentProps): React.JSX.Element;
102
+ export type PluginContextMenuItemProps = Omit<ContextMenuPrimitive.Item.Props, 'className'> & {
103
+ className?: string;
104
+ };
105
+ export declare function PluginContextMenuItem({ className, ...props }: PluginContextMenuItemProps): React.JSX.Element;
106
+ export type PluginBadgeTone = 'neutral' | 'info' | 'success' | 'warning' | 'error';
107
+ export interface PluginBadgeProps extends HTMLAttributes<HTMLSpanElement> {
108
+ tone?: PluginBadgeTone;
109
+ }
110
+ export declare function PluginBadge({ tone, className, ...props }: PluginBadgeProps): React.JSX.Element;
111
+ export type PluginAlertTone = 'neutral' | 'info' | 'warning' | 'error';
112
+ export interface PluginAlertProps extends HTMLAttributes<HTMLDivElement> {
113
+ tone?: PluginAlertTone;
114
+ density?: PluginDensity;
115
+ }
116
+ export declare function PluginAlert({ tone, density, className, ...props }: PluginAlertProps): React.JSX.Element;
117
+ export type PluginDialogSize = 'sm' | 'md' | 'lg';
118
+ export interface PluginDialogProps {
119
+ open: boolean;
120
+ title: ReactNode;
121
+ description?: ReactNode;
122
+ size?: PluginDialogSize;
123
+ footer?: ReactNode;
124
+ closeLabel?: string;
125
+ children: ReactNode;
126
+ onOpenChange(open: boolean): void;
127
+ }
128
+ export declare function PluginDialog({ open, title, description, size, footer, closeLabel, children, onOpenChange }: PluginDialogProps): React.JSX.Element;
129
+ export interface PluginConfirmDialogProps {
130
+ open: boolean;
131
+ title: ReactNode;
132
+ description?: ReactNode;
133
+ confirmLabel: ReactNode;
134
+ cancelLabel?: ReactNode;
135
+ tone?: 'default' | 'danger';
136
+ pending?: boolean;
137
+ children?: ReactNode;
138
+ onConfirm(): void | Promise<void>;
139
+ onOpenChange(open: boolean): void;
140
+ }
141
+ export declare function PluginConfirmDialog({ open, title, description, confirmLabel, cancelLabel, tone, pending, children, onConfirm, onOpenChange }: PluginConfirmDialogProps): React.JSX.Element;
142
+ export interface PluginEmptyStateProps extends HTMLAttributes<HTMLDivElement> {
143
+ density?: PluginDensity;
144
+ }
145
+ export declare function PluginEmptyState({ density, className, ...props }: PluginEmptyStateProps): React.JSX.Element;
146
+ export interface PluginFieldProps extends HTMLAttributes<HTMLDivElement> {
147
+ label: ReactNode;
148
+ htmlFor?: string;
149
+ description?: ReactNode;
150
+ error?: ReactNode;
151
+ density?: PluginDensity;
152
+ }
153
+ export declare function PluginField({ label, htmlFor, description, error, density, className, children, ...props }: PluginFieldProps): React.JSX.Element;
154
+ export interface PluginInputProps extends InputHTMLAttributes<HTMLInputElement> {
155
+ controlSize?: PluginControlSize;
156
+ }
157
+ export declare function PluginInput({ controlSize, className, ...props }: PluginInputProps): React.JSX.Element;
158
+ export type PluginCheckboxProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>;
159
+ export declare function PluginCheckbox({ className, ...props }: PluginCheckboxProps): React.JSX.Element;
160
+ export type PluginSecretInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'autoComplete' | 'autoCapitalize' | 'spellCheck'> & {
161
+ controlSize?: PluginControlSize;
162
+ };
163
+ export declare function PluginSecretInput({ controlSize, className, disabled, id, ...props }: PluginSecretInputProps): React.JSX.Element;
164
+ export interface PluginSelectProps extends SelectHTMLAttributes<HTMLSelectElement> {
165
+ controlSize?: PluginControlSize;
166
+ }
167
+ export declare function PluginSelect({ controlSize, className, ...props }: PluginSelectProps): React.JSX.Element;
168
+ export interface PluginSelectOption {
169
+ value: string;
170
+ label: ReactNode;
171
+ disabled?: boolean;
172
+ textValue?: string;
173
+ }
174
+ export interface PluginSelectFieldProps {
175
+ id?: string;
176
+ name?: string;
177
+ label: ReactNode;
178
+ description?: ReactNode;
179
+ error?: ReactNode;
180
+ value?: string | null;
181
+ defaultValue?: string | null;
182
+ options: readonly PluginSelectOption[];
183
+ placeholder?: ReactNode;
184
+ disabled?: boolean;
185
+ required?: boolean;
186
+ size?: PluginControlSize;
187
+ className?: string;
188
+ triggerClassName?: string;
189
+ popupClassName?: string;
190
+ onValueChange?: (value: string | null) => void;
191
+ }
192
+ export declare function PluginSelectField({ id, name, label, description, error, value, defaultValue, options, placeholder, disabled, required, size, className, triggerClassName, popupClassName, onValueChange }: PluginSelectFieldProps): React.JSX.Element;
193
+ export interface PluginTextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
194
+ controlSize?: PluginControlSize;
195
+ }
196
+ export declare function PluginTextarea({ controlSize, className, ...props }: PluginTextareaProps): React.JSX.Element;
197
+ export {};