@omniviewdev/base-ui 0.4.3 → 0.6.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.
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ import { Checkbox as Checkbox_2 } from '@base-ui/react/checkbox';
12
12
  import { CheckboxGroup as CheckboxGroup_2 } from '@base-ui/react/checkbox-group';
13
13
  import { ClipboardEvent as ClipboardEvent_2 } from 'react';
14
14
  import { ColumnDef as ColumnDef_2 } from '@tanstack/react-table';
15
+ import { ColumnFiltersState } from '@tanstack/react-table';
15
16
  import { ColumnOrderState } from '@tanstack/react-table';
16
17
  import { ColumnPinningState } from '@tanstack/react-table';
17
18
  import { ColumnSizingState } from '@tanstack/react-table';
@@ -42,6 +43,7 @@ import { FieldLabelProps } from '@base-ui/react';
42
43
  import { FieldsetHTMLAttributes } from 'react';
43
44
  import { FocusEvent as FocusEvent_2 } from 'react';
44
45
  import { ForwardRefExoticComponent } from 'react';
46
+ import { GroupingState } from '@tanstack/react-table';
45
47
  import { HTMLAttributes } from 'react';
46
48
  import { ImgHTMLAttributes } from 'react';
47
49
  import { Input as Input_2 } from '@base-ui/react/input';
@@ -239,6 +241,11 @@ declare const AlertDialogTrigger: {
239
241
  export declare interface AlertDialogTriggerProps extends Omit<ComponentPropsWithoutRef<typeof AlertDialog_2.Trigger>, 'color'>, StyledComponentProps {
240
242
  }
241
243
 
244
+ export declare function applyQueryEdit(text: string, edit: QueryEdit): {
245
+ text: string;
246
+ selection: number;
247
+ };
248
+
242
249
  export declare const AppShell: AppShellCompound;
243
250
 
244
251
  declare type AppShellCompound = typeof AppShellRoot & {
@@ -1384,6 +1391,7 @@ export declare const DataTable: DataTableCompound;
1384
1391
  declare const DataTableBody: ForwardRefExoticComponent<DataTableBodyProps & RefAttributes<HTMLTableSectionElement>>;
1385
1392
 
1386
1393
  export declare interface DataTableBodyProps extends HTMLAttributes<HTMLTableSectionElement> {
1394
+ /** Use DataTable.ExpansionToggle, or mark a custom disclosure with data-ov-expansion-toggle="". */
1387
1395
  renderExpandedRow?: (row: unknown) => ReactNode;
1388
1396
  }
1389
1397
 
@@ -1403,10 +1411,12 @@ declare type DataTableCompound = typeof DataTableRoot & {
1403
1411
  Pagination: typeof DataTablePagination;
1404
1412
  Empty: typeof DataTableEmpty;
1405
1413
  Loading: typeof DataTableLoading;
1414
+ ExpansionToggle: typeof DataTableExpansionToggle;
1406
1415
  };
1407
1416
 
1408
1417
  declare const DataTableContainer: ForwardRefExoticComponent<DataTableContainerProps & RefAttributes<HTMLDivElement>>;
1409
1418
 
1419
+ /** Supply aria-label/aria-labelledby to name the viewport focus fallback. */
1410
1420
  export declare interface DataTableContainerProps extends HTMLAttributes<HTMLDivElement> {
1411
1421
  height?: number | string;
1412
1422
  maxHeight?: number | string;
@@ -1428,6 +1438,17 @@ export declare interface DataTableEmptyProps extends HTMLAttributes<HTMLDivEleme
1428
1438
  description?: string;
1429
1439
  }
1430
1440
 
1441
+ /** Native Tab/Enter/Space behavior; does not turn the table into a grid. */
1442
+ declare function DataTableExpansionToggle<TData>({ row, label, getAccessibleLabel, className, children, disabled, onClick, ...props }: DataTableExpansionToggleProps<TData>): JSX.Element;
1443
+
1444
+ declare interface DataTableExpansionToggleProps<TData> extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'aria-label' | 'aria-expanded'> {
1445
+ row: Row<TData>;
1446
+ /** Row-specific accessible name, e.g. the displayed resource name. */
1447
+ label: string;
1448
+ /** Localize the complete accessible name; defaults to English Expand/Collapse plus label. */
1449
+ getAccessibleLabel?: (expanded: boolean, label: string) => string;
1450
+ }
1451
+
1431
1452
  export declare interface DataTableFeatures {
1432
1453
  sorting?: boolean;
1433
1454
  filtering?: boolean;
@@ -1475,25 +1496,27 @@ export declare interface DataTableToolbarProps extends HTMLAttributes<HTMLDivEle
1475
1496
  searchPlaceholder?: string;
1476
1497
  }
1477
1498
 
1478
- declare const DataTableVirtualBody: ForwardRefExoticComponent<DataTableVirtualBodyProps & RefAttributes<HTMLTableSectionElement>>;
1499
+ declare const DataTableVirtualBody: <TData = unknown>(props: DataTableVirtualBodyProps<TData> & RefAttributes<HTMLTableSectionElement>) => ReactElement | null;
1479
1500
 
1480
- export declare interface DataTableVirtualBodyProps extends HTMLAttributes<HTMLTableSectionElement> {
1501
+ export declare interface DataTableVirtualBodyProps<TData = unknown> extends HTMLAttributes<HTMLTableSectionElement> {
1481
1502
  estimateRowSize?: number;
1482
1503
  overscan?: number;
1483
- /**
1484
- * When true, skips dynamic row measurement via `getBoundingClientRect`.
1485
- * Use this when all rows have the same height (set via `estimateRowSize`)
1486
- * to avoid forced reflow on mount — a significant perf win for large tables.
1487
- */
1504
+ /** Fixed parent-row height only. Expanded content is always dynamically measured. */
1488
1505
  fixedRowHeight?: boolean;
1489
- /** Called when a row is clicked. Not called if a `getRowProps` onClick prevents default. */
1490
- onRowClick?: (row: Row<any>, event: MouseEvent_2<HTMLTableRowElement>) => void;
1506
+ /** Estimate for an unmeasured detail slot; actual asynchronous height is observed. */
1507
+ estimateExpandedRowSize?: number;
1491
1508
  /**
1492
- * Extra props for each `<tr>` (className, aria/data attributes, handlers).
1493
- * Positioning styles and data attributes owned by the table take precedence.
1494
- * Memoize it (e.g. `useCallback`): a new function re-renders every row.
1509
+ * Same original-data slot as Body. Children mount only while expanded AND in
1510
+ * the virtual range. Retain query/cache ownership outside this component if
1511
+ * it must survive scrolling away. Collapse always removes the slot.
1512
+ * Use DataTable.ExpansionToggle for the disclosure. Custom disclosure buttons
1513
+ * need data-ov-expansion-toggle="" for parent-focus recovery after collapse.
1495
1514
  */
1496
- getRowProps?: (row: Row<any>) => HTMLAttributes<HTMLTableRowElement>;
1515
+ renderExpandedRow?: (original: TData) => ReactNode;
1516
+ /** Plain-cell pointer convenience; expose equivalent actions in native controls. */
1517
+ onRowClick?: (row: Row<TData>, event: MouseEvent_2<HTMLTableRowElement>) => void;
1518
+ /** Internal positioning and measurement attributes take precedence. */
1519
+ getRowProps?: (row: Row<TData>) => HTMLAttributes<HTMLTableRowElement>;
1497
1520
  }
1498
1521
 
1499
1522
  /**
@@ -2001,6 +2024,23 @@ export declare interface EmptyStateProps extends HTMLAttributes<HTMLDivElement>
2001
2024
  size?: 'sm' | 'md' | 'lg';
2002
2025
  }
2003
2026
 
2027
+ /** Composition only. Hosts retain query leases, routing, rendering and all query semantics. */
2028
+ export declare function ExploreWorkspace({ title, scope, query, variables, grouping, results, saveActions, status, inspector, loading, className, }: ExploreWorkspaceProps): JSX.Element;
2029
+
2030
+ export declare interface ExploreWorkspaceProps {
2031
+ title?: string;
2032
+ scope: ReactNode;
2033
+ query: ReactNode;
2034
+ variables?: ReactNode;
2035
+ grouping?: ReactNode;
2036
+ results: ReactNode;
2037
+ saveActions?: ReactNode;
2038
+ status?: ReactNode;
2039
+ inspector?: ReactNode;
2040
+ loading?: boolean;
2041
+ className?: string;
2042
+ }
2043
+
2004
2044
  /** Any element that has a string `.value` and can receive focus. */
2005
2045
  export declare interface FieldElement {
2006
2046
  value: string;
@@ -2308,6 +2348,15 @@ export declare interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElem
2308
2348
  borderRadius?: ImageBorderRadius;
2309
2349
  }
2310
2350
 
2351
+ export declare type IndexFootprint = {
2352
+ kind: 'actual' | 'estimated';
2353
+ value: string;
2354
+ basis: string;
2355
+ } | {
2356
+ kind: 'unavailable' | 'not-applicable';
2357
+ reason: string;
2358
+ };
2359
+
2311
2360
  /** Internal props injected by StepperRoot via Children.map. */
2312
2361
  declare interface InjectedStepProps {
2313
2362
  /* Excluded from this release type: _index */
@@ -2349,6 +2398,25 @@ declare const InputRoot: ForwardRefExoticComponent<Omit<InputRootProps, "ref"> &
2349
2398
  export declare interface InputRootProps extends Field.Root.Props, StyledComponentProps {
2350
2399
  }
2351
2400
 
2401
+ export declare interface InspectorAsyncContext {
2402
+ /** Abort stops waiting for this request. The host decides whether underlying work can stop. */
2403
+ signal: AbortSignal;
2404
+ }
2405
+
2406
+ /** Presentation contracts only. The host owns planning, validation, matching and index lifecycle. */
2407
+ export declare interface InspectorDiagnostic {
2408
+ id: string;
2409
+ severity: 'info' | 'warning' | 'error';
2410
+ message: string;
2411
+ }
2412
+
2413
+ export declare interface InspectorEvidence {
2414
+ label: string;
2415
+ kind: 'actual' | 'estimated' | 'unavailable';
2416
+ value: string;
2417
+ basis: string;
2418
+ }
2419
+
2352
2420
  export declare function isBuiltInThemeId(id: string): id is BuiltInThemeId;
2353
2421
 
2354
2422
  /** True if the `year` is a leap year (Gregorian calendar). */
@@ -2869,6 +2937,428 @@ export declare interface ProgressProps extends Omit<HTMLAttributes<HTMLDivElemen
2869
2937
  size?: ComponentSize;
2870
2938
  }
2871
2939
 
2940
+ /** Both drafts are retained. Only an explicit successful host conversion changes mode. */
2941
+ export declare function QueryAuthoring({ value, onChange, contextKey, fields, request, renderEditor, toBuilder, toCode, onRun, onCancel, onRefresh, onClear, running, disabled, availability, state, scopes, scope, onScopeChange, inputProps, builderProps, labels, actions, children, className, }: QueryAuthoringProps): JSX.Element;
2942
+
2943
+ export declare interface QueryAuthoringLabels {
2944
+ code?: string;
2945
+ builder?: string;
2946
+ run?: string;
2947
+ clear?: string;
2948
+ }
2949
+
2950
+ export declare interface QueryAuthoringProps {
2951
+ value: QueryAuthoringValue;
2952
+ onChange: (value: QueryAuthoringValue) => void;
2953
+ contextKey: string;
2954
+ fields: QueryBuilderProps['fields'];
2955
+ request?: QueryLanguageService;
2956
+ /** Render the host's code editor without introducing a base-ui/editor dependency. */
2957
+ renderEditor?: (props: QueryEditorRenderProps) => ReactNode;
2958
+ toBuilder?: (document: QueryDocument, context: QueryConversionContext) => Promise<QueryConversionResult<QueryGroup>>;
2959
+ toCode?: (builder: QueryGroup, context: QueryConversionContext) => Promise<QueryConversionResult<string>>;
2960
+ onRun?: (value: QueryAuthoringValue) => void;
2961
+ onCancel?: () => void;
2962
+ onRefresh?: () => void;
2963
+ onClear?: () => void;
2964
+ running?: boolean;
2965
+ disabled?: boolean;
2966
+ availability?: QueryAvailability;
2967
+ state?: QueryPresentationState;
2968
+ scopes?: readonly QueryScopeOption[];
2969
+ scope?: string;
2970
+ onScopeChange?: (scope: string) => void;
2971
+ inputProps?: Pick<QueryInputProps, 'rows' | 'label' | 'placeholder' | 'debounceMs' | 'maxSuggestions'>;
2972
+ builderProps?: Omit<QueryBuilderProps, 'value' | 'onChange' | 'fields' | 'contextKey' | 'availability' | 'disabled'>;
2973
+ labels?: QueryAuthoringLabels;
2974
+ actions?: ReactNode;
2975
+ children?: ReactNode;
2976
+ className?: string;
2977
+ }
2978
+
2979
+ export declare interface QueryAuthoringValue {
2980
+ mode: 'code' | 'builder';
2981
+ code: QueryDocument;
2982
+ builder: QueryGroup;
2983
+ }
2984
+
2985
+ export declare interface QueryAvailability {
2986
+ status: 'ready' | 'loading' | 'error' | 'denied' | 'unavailable';
2987
+ message?: string;
2988
+ }
2989
+
2990
+ export declare function QueryBuilder({ value, onChange, fields, contextKey, disabled, availability, allowNegation, diagnostics, analyze, preview, explanation, examples, className, }: QueryBuilderProps): JSX.Element;
2991
+
2992
+ export declare interface QueryBuilderAnalysis {
2993
+ status: QueryServiceStatus;
2994
+ message?: string;
2995
+ diagnostics: readonly QueryBuilderDiagnostic[];
2996
+ preview?: string;
2997
+ explanation?: string;
2998
+ }
2999
+
3000
+ export declare interface QueryBuilderDiagnostic {
3001
+ nodeId?: string;
3002
+ message: string;
3003
+ severity: 'error' | 'warning' | 'info';
3004
+ }
3005
+
3006
+ export declare interface QueryBuilderProps {
3007
+ value: QueryGroup;
3008
+ onChange: (value: QueryGroup) => void;
3009
+ fields: readonly QueryField[];
3010
+ contextKey?: string;
3011
+ disabled?: boolean;
3012
+ availability?: QueryAvailability;
3013
+ diagnostics?: readonly QueryBuilderDiagnostic[];
3014
+ /** Host-authorized operation. Negation is whole-clause/group NOT, never inequality. */
3015
+ allowNegation?: boolean;
3016
+ analyze?: (value: QueryGroup, context: QueryConversionContext) => Promise<QueryBuilderAnalysis>;
3017
+ preview?: string;
3018
+ explanation?: string;
3019
+ examples?: readonly {
3020
+ label: string;
3021
+ description: string;
3022
+ value: QueryGroup;
3023
+ }[];
3024
+ className?: string;
3025
+ }
3026
+
3027
+ export declare interface QueryClause {
3028
+ kind: 'clause';
3029
+ id: string;
3030
+ field?: string;
3031
+ operator?: string;
3032
+ value?: QueryValue;
3033
+ negated?: boolean;
3034
+ }
3035
+
3036
+ export declare interface QueryCompletion {
3037
+ id: string;
3038
+ label: string;
3039
+ kind: 'field' | 'operator' | 'value' | 'parameter' | 'function';
3040
+ type?: string;
3041
+ description?: string;
3042
+ /** Presentation-only candidate matching and host relevance order. */
3043
+ filterText?: string;
3044
+ sortText?: string;
3045
+ /** Snippets use Monaco/LSP tab-stop syntax; plain edits are the default. */
3046
+ insertTextFormat?: 'plain' | 'snippet';
3047
+ /** Host-provided union/branch applicability. Never inferred by the component. */
3048
+ condition?: string;
3049
+ detail?: string;
3050
+ disabledReason?: string;
3051
+ edit: QueryEdit;
3052
+ }
3053
+
3054
+ export declare interface QueryConversionContext {
3055
+ contextKey: string;
3056
+ signal: AbortSignal;
3057
+ }
3058
+
3059
+ export declare type QueryConversionResult<T> = {
3060
+ status: 'ready';
3061
+ value: T;
3062
+ message?: string;
3063
+ } | {
3064
+ status: 'unsupported' | 'error' | 'denied' | 'unavailable';
3065
+ message: string;
3066
+ };
3067
+
3068
+ export declare interface QueryDiagnostic {
3069
+ id: string;
3070
+ severity: 'error' | 'warning' | 'info' | 'hint';
3071
+ message: string;
3072
+ range: QueryRange;
3073
+ fix?: QueryEdit;
3074
+ }
3075
+
3076
+ export declare interface QueryDocument {
3077
+ text: string;
3078
+ version: number;
3079
+ /** Optional editor-owned identity; authoring adapters must isolate distinct models. */
3080
+ uri?: string;
3081
+ }
3082
+
3083
+ export declare interface QueryEdit {
3084
+ range: QueryRange;
3085
+ text: string;
3086
+ }
3087
+
3088
+ /** Dependency-injected code surface. Base UI owns controls and drafts, never Monaco. */
3089
+ export declare interface QueryEditorRenderProps {
3090
+ document: QueryDocument;
3091
+ onChange: (text: string) => void;
3092
+ contextKey: string;
3093
+ request?: QueryLanguageService;
3094
+ availability?: QueryAvailability;
3095
+ disabled?: boolean;
3096
+ onSubmit?: () => void;
3097
+ label?: string;
3098
+ placeholder?: string;
3099
+ debounceMs?: number;
3100
+ maxSuggestions?: number;
3101
+ }
3102
+
3103
+ export declare interface QueryExplain {
3104
+ queryLabel: string;
3105
+ scope: string;
3106
+ coverage: string;
3107
+ freshness: string;
3108
+ selectionReason: string;
3109
+ measuredAt?: string;
3110
+ stages: readonly {
3111
+ id: string;
3112
+ label: string;
3113
+ description: string;
3114
+ indexIds: readonly string[];
3115
+ work: readonly InspectorEvidence[];
3116
+ }[];
3117
+ diagnostics: readonly InspectorDiagnostic[];
3118
+ }
3119
+
3120
+ export declare function QueryExplainPanel({ explain, state, message }: QueryExplainPanelProps): JSX.Element;
3121
+
3122
+ export declare interface QueryExplainPanelProps {
3123
+ explain?: QueryExplain;
3124
+ state?: 'ready' | 'loading' | 'denied' | 'unavailable';
3125
+ message?: string;
3126
+ }
3127
+
3128
+ export declare interface QueryField {
3129
+ id: string;
3130
+ label: string;
3131
+ type: string;
3132
+ description?: string;
3133
+ condition?: string;
3134
+ disabledReason?: string;
3135
+ operators: readonly QueryOperator[];
3136
+ }
3137
+
3138
+ export declare interface QueryGroup {
3139
+ kind: 'group';
3140
+ id: string;
3141
+ combinator: 'and' | 'or';
3142
+ children: readonly QueryNode[];
3143
+ negated?: boolean;
3144
+ }
3145
+
3146
+ export declare interface QueryHoverResponse {
3147
+ documentVersion: number;
3148
+ contextKey: string;
3149
+ status: QueryServiceStatus;
3150
+ message?: string;
3151
+ /** Untrusted Markdown documentation for a checked source range. */
3152
+ hover?: {
3153
+ range: QueryRange;
3154
+ contents: string;
3155
+ };
3156
+ }
3157
+
3158
+ export declare type QueryHoverService = (request: QueryLanguageRequest) => Promise<QueryHoverResponse>;
3159
+
3160
+ /** Compact native editing mechanics: no CEL parser, schema walker, Monaco model or worker. */
3161
+ export declare function QueryInput({ document, onChange, contextKey, request, onSubmit, label, placeholder, disabled, readOnly, availability, debounceMs, maxSuggestions, rows, className, }: QueryInputProps): JSX.Element;
3162
+
3163
+ export declare interface QueryInputProps {
3164
+ document: QueryDocument;
3165
+ onChange: (text: string) => void;
3166
+ contextKey: string;
3167
+ request?: QueryLanguageService;
3168
+ onSubmit?: () => void;
3169
+ label?: string;
3170
+ placeholder?: string;
3171
+ disabled?: boolean;
3172
+ readOnly?: boolean;
3173
+ availability?: QueryAvailability;
3174
+ debounceMs?: number;
3175
+ /** Bounded visible suggestions; the service must also enforce its own response limit. */
3176
+ maxSuggestions?: number;
3177
+ rows?: number;
3178
+ className?: string;
3179
+ }
3180
+
3181
+ export declare interface QueryLanguageRequest {
3182
+ document: QueryDocument;
3183
+ cursor: {
3184
+ offset: number;
3185
+ unit: 'utf8-byte';
3186
+ };
3187
+ contextKey: string;
3188
+ signal: AbortSignal;
3189
+ }
3190
+
3191
+ export declare interface QueryLanguageResponse {
3192
+ documentVersion: number;
3193
+ contextKey: string;
3194
+ status: QueryServiceStatus;
3195
+ message?: string;
3196
+ completions: readonly QueryCompletion[];
3197
+ diagnostics: readonly QueryDiagnostic[];
3198
+ /** Suggestions are bounded observations, not exhaustive inventory/schema facts. */
3199
+ incomplete?: boolean;
3200
+ }
3201
+
3202
+ export declare type QueryLanguageService = (request: QueryLanguageRequest) => Promise<QueryLanguageResponse>;
3203
+
3204
+ export declare type QueryNode = QueryClause | QueryGroup;
3205
+
3206
+ export declare interface QueryOperator {
3207
+ id: string;
3208
+ label: string;
3209
+ description?: string;
3210
+ /** Omit for host-defined state clauses such as present/absent/null. */
3211
+ value?: QueryValueDefinition;
3212
+ disabledReason?: string;
3213
+ }
3214
+
3215
+ export declare interface QueryOptionRequest {
3216
+ contextKey: string;
3217
+ search: string;
3218
+ signal: AbortSignal;
3219
+ }
3220
+
3221
+ export declare interface QueryOptionResponse {
3222
+ contextKey: string;
3223
+ status: QueryServiceStatus;
3224
+ options: readonly QueryValueOption[];
3225
+ message?: string;
3226
+ incomplete?: boolean;
3227
+ }
3228
+
3229
+ export declare interface QueryPresentationState {
3230
+ status: 'idle' | 'loading' | 'live' | 'snapshot' | 'stale' | 'partial' | 'error' | 'denied' | 'unavailable';
3231
+ message: string;
3232
+ detail?: ReactNode;
3233
+ }
3234
+
3235
+ /** Local presentation contracts, not a host wire protocol. Source offsets are zero-based,
3236
+ * half-open UTF-8 byte offsets. The adapter converts DOM UTF-16 offsets explicitly. */
3237
+ export declare interface QueryRange {
3238
+ start: number;
3239
+ end: number;
3240
+ unit: 'utf8-byte';
3241
+ }
3242
+
3243
+ export declare interface QueryScopeOption {
3244
+ id: string;
3245
+ label: string;
3246
+ description?: string;
3247
+ disabledReason?: string;
3248
+ }
3249
+
3250
+ export declare type QueryServiceStatus = 'ready' | 'empty' | 'error' | 'denied' | 'unavailable';
3251
+
3252
+ export declare interface QuerySignatureResponse {
3253
+ documentVersion: number;
3254
+ contextKey: string;
3255
+ status: QueryServiceStatus;
3256
+ message?: string;
3257
+ signature?: {
3258
+ label: string;
3259
+ documentation?: string;
3260
+ parameters: readonly {
3261
+ label: string;
3262
+ documentation?: string;
3263
+ }[];
3264
+ activeParameter: number;
3265
+ };
3266
+ }
3267
+
3268
+ export declare type QuerySignatureService = (request: QueryLanguageRequest) => Promise<QuerySignatureResponse>;
3269
+
3270
+ /** Numeric and timestamp drafts remain text. Host validation/admission owns conversion,
3271
+ * exactness, ranges, timezone policy, nullability, defaults and execution binding. */
3272
+ export declare type QueryValue = {
3273
+ kind: 'string' | 'integer' | 'number' | 'timestamp';
3274
+ value: string;
3275
+ } | {
3276
+ kind: 'boolean';
3277
+ value: boolean;
3278
+ } | {
3279
+ kind: 'enum';
3280
+ value: string;
3281
+ } | {
3282
+ kind: 'list';
3283
+ value: readonly string[];
3284
+ } | {
3285
+ kind: 'record';
3286
+ value: Readonly<Record<string, QueryValue | undefined>>;
3287
+ };
3288
+
3289
+ /** Host-defined compound inputs preserve correlations (for example a tag key/value
3290
+ * pair). Their field IDs are opaque and do not imply paths or query semantics. */
3291
+ export declare type QueryValueDefinition = QueryValueDefinitionBase & ({
3292
+ kind: Exclude<QueryValue['kind'], 'record'>;
3293
+ } | {
3294
+ kind: 'record';
3295
+ fields: readonly {
3296
+ id: string;
3297
+ label: string;
3298
+ definition: QueryValueDefinition;
3299
+ required?: boolean;
3300
+ }[];
3301
+ });
3302
+
3303
+ declare interface QueryValueDefinitionBase {
3304
+ placeholder?: string;
3305
+ description?: string;
3306
+ options?: readonly QueryValueOption[];
3307
+ loadOptions?: (request: QueryOptionRequest) => Promise<QueryOptionResponse>;
3308
+ /** Host explanation of supported constraints, rendered without reimplementing validation. */
3309
+ constraint?: string;
3310
+ }
3311
+
3312
+ /** Renders host-declared types. Numeric drafts never pass through Number/parseInt. */
3313
+ export declare function QueryValueInput({ definition, value, onChange, contextKey, label, disabled, sensitive, required, error, }: QueryValueInputProps): JSX.Element;
3314
+
3315
+ export declare interface QueryValueInputProps {
3316
+ definition: QueryValueDefinition;
3317
+ value?: QueryValue;
3318
+ onChange: (value: QueryValue | undefined) => void;
3319
+ contextKey?: string;
3320
+ label?: string;
3321
+ disabled?: boolean;
3322
+ sensitive?: boolean;
3323
+ required?: boolean;
3324
+ error?: string;
3325
+ }
3326
+
3327
+ export declare interface QueryValueOption {
3328
+ id: string;
3329
+ label: string;
3330
+ value: string;
3331
+ description?: string;
3332
+ disabledReason?: string;
3333
+ }
3334
+
3335
+ export declare interface QueryVariable {
3336
+ id: string;
3337
+ label: string;
3338
+ definition: QueryValueDefinition;
3339
+ description?: string;
3340
+ required?: boolean;
3341
+ sensitive?: boolean;
3342
+ disabledReason?: string;
3343
+ defaultValue?: QueryValue;
3344
+ error?: string;
3345
+ }
3346
+
3347
+ /** Editing drafts only: the host owns defaults, constraints, dependency cycles and binding.
3348
+ * Values never interpolate into query text and sensitive values are never serialized here. */
3349
+ export declare function QueryVariables({ variables, value, onChange, contextKey, availability, disabled, diagnostics, }: QueryVariablesProps): JSX.Element;
3350
+
3351
+ export declare interface QueryVariablesProps {
3352
+ variables: readonly QueryVariable[];
3353
+ value: Readonly<Record<string, QueryValue | undefined>>;
3354
+ onChange: (value: Readonly<Record<string, QueryValue | undefined>>) => void;
3355
+ /** Include dependency/scope/permission revisions to cancel outdated value lookups. */
3356
+ contextKey?: string;
3357
+ availability?: QueryAvailability;
3358
+ disabled?: boolean;
3359
+ diagnostics?: readonly string[];
3360
+ }
3361
+
2872
3362
  export declare const Quote: <C extends QuoteElement = "q">(props: TypographyBaseProps & TruncationProps & {
2873
3363
  as?: C | undefined;
2874
3364
  } & Omit<PropsWithoutRef<ComponentProps<C>>, "color" | "as" | "truncate" | keyof TypographyBaseProps> & {
@@ -2952,6 +3442,118 @@ export declare interface RegisteredTheme extends ThemeSummary {
2952
3442
  definition: ThemeDefinition;
2953
3443
  }
2954
3444
 
3445
+ export declare type RelationshipCardinality = 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many';
3446
+
3447
+ export declare interface RelationshipCatalog {
3448
+ sourceTypes: readonly RelationshipTypeOption[];
3449
+ targetTypes: readonly RelationshipTypeOption[];
3450
+ scopeMappings: readonly {
3451
+ id: string;
3452
+ label: string;
3453
+ description: string;
3454
+ state: 'available' | 'denied' | 'unavailable';
3455
+ }[];
3456
+ /** Host-supplied operators; compatibility is validated by the host, never inferred here. */
3457
+ operators: readonly {
3458
+ id: string;
3459
+ label: string;
3460
+ description: string;
3461
+ }[];
3462
+ }
3463
+
3464
+ export declare interface RelationshipCondition {
3465
+ id: string;
3466
+ sourceFieldId: string;
3467
+ operatorId: string;
3468
+ targetFieldId: string;
3469
+ }
3470
+
3471
+ export declare interface RelationshipEndpoint {
3472
+ label: string;
3473
+ /** Opaque host navigation target, not an inferred identity. Omit for protected endpoints. */
3474
+ navigationId?: string;
3475
+ }
3476
+
3477
+ export declare interface RelationshipFieldOption {
3478
+ id: string;
3479
+ label: string;
3480
+ type: string;
3481
+ }
3482
+
3483
+ export declare function RelationshipPreview({ preview, state, message, onNavigate, }: RelationshipPreviewProps): JSX.Element;
3484
+
3485
+ export declare interface RelationshipPreviewData {
3486
+ scope: string;
3487
+ coverage: string;
3488
+ limit: number;
3489
+ truncated: boolean;
3490
+ summary: string;
3491
+ diagnostics: readonly InspectorDiagnostic[];
3492
+ edges: readonly {
3493
+ id: string;
3494
+ source: RelationshipEndpoint;
3495
+ target?: RelationshipEndpoint;
3496
+ state: 'matched' | 'unmatched' | 'ambiguous' | 'denied' | 'unavailable';
3497
+ detail: string;
3498
+ provenance: {
3499
+ origin: 'provider' | 'user';
3500
+ ruleLabel: string;
3501
+ condition: string;
3502
+ scopeMapping: string;
3503
+ };
3504
+ }[];
3505
+ }
3506
+
3507
+ export declare interface RelationshipPreviewProps {
3508
+ preview?: RelationshipPreviewData;
3509
+ state?: 'ready' | 'loading' | 'denied' | 'unavailable';
3510
+ message?: string;
3511
+ onNavigate?: (navigationId: string) => void;
3512
+ }
3513
+
3514
+ export declare interface RelationshipRuleDraft {
3515
+ id: string;
3516
+ name: string;
3517
+ sourceTypeId: string;
3518
+ targetTypeId: string;
3519
+ scopeMappingId: string;
3520
+ cardinality: RelationshipCardinality;
3521
+ conditions: readonly RelationshipCondition[];
3522
+ enabled: boolean;
3523
+ origin: 'user' | 'provider';
3524
+ }
3525
+
3526
+ export declare function RelationshipRuleEditor({ draft, catalog, onChange, onSave, onPreview, onSetEnabled, validation, preview, previewIsCurrent, onNavigate, state, message, }: RelationshipRuleEditorProps): JSX.Element;
3527
+
3528
+ export declare interface RelationshipRuleEditorProps {
3529
+ draft: RelationshipRuleDraft;
3530
+ catalog: RelationshipCatalog;
3531
+ onChange: (draft: RelationshipRuleDraft) => void;
3532
+ onSave: (draft: RelationshipRuleDraft, context: InspectorAsyncContext) => Promise<void>;
3533
+ onPreview: (draft: RelationshipRuleDraft, context: InspectorAsyncContext) => Promise<void>;
3534
+ onSetEnabled: (enabled: boolean, context: InspectorAsyncContext) => Promise<void>;
3535
+ /** Must describe the current controlled draft. Unknown/pending drafts cannot be saved. */
3536
+ validation: RelationshipValidation;
3537
+ preview?: RelationshipPreviewData;
3538
+ /** The host confirms the preview belongs to this exact draft/access context. Defaults to false. */
3539
+ previewIsCurrent?: boolean;
3540
+ onNavigate?: (navigationId: string) => void;
3541
+ state?: 'ready' | 'loading' | 'denied' | 'unavailable';
3542
+ message?: string;
3543
+ }
3544
+
3545
+ export declare interface RelationshipTypeOption {
3546
+ id: string;
3547
+ label: string;
3548
+ provider: string;
3549
+ fields: readonly RelationshipFieldOption[];
3550
+ }
3551
+
3552
+ export declare interface RelationshipValidation {
3553
+ state: 'unchecked' | 'pending' | 'valid' | 'invalid' | 'denied' | 'unavailable';
3554
+ diagnostics: readonly InspectorDiagnostic[];
3555
+ }
3556
+
2955
3557
  export declare type ReorderMeta = {
2956
3558
  id: TabId;
2957
3559
  from: number;
@@ -2979,6 +3581,200 @@ export declare interface ResizableSplitPaneProps extends HTMLAttributes<HTMLDivE
2979
3581
  children: [ReactNode, ReactNode];
2980
3582
  }
2981
3583
 
3584
+ export declare function ResourceGroupingControls({ fields, value, onChange, loading, error, disabled, className, }: ResourceGroupingControlsProps): JSX.Element;
3585
+
3586
+ export declare interface ResourceGroupingControlsProps {
3587
+ fields: readonly ResourceGroupingField[];
3588
+ value: ResourceGroupingValue;
3589
+ onChange: (value: ResourceGroupingValue) => void;
3590
+ loading?: boolean;
3591
+ error?: string;
3592
+ disabled?: boolean;
3593
+ className?: string;
3594
+ }
3595
+
3596
+ export declare interface ResourceGroupingField {
3597
+ id: string;
3598
+ label: string;
3599
+ groupable: boolean;
3600
+ splittable: boolean;
3601
+ reason?: string;
3602
+ applicability?: string;
3603
+ }
3604
+
3605
+ export declare interface ResourceGroupingValue {
3606
+ groupBy: readonly string[];
3607
+ splitBy: readonly string[];
3608
+ }
3609
+
3610
+ export declare type ResourceIndexAction = {
3611
+ kind: 'create';
3612
+ definition: ResourceIndexDefinition;
3613
+ } | {
3614
+ kind: 'rebuild' | 'drop';
3615
+ indexId: string;
3616
+ } | {
3617
+ kind: 'cancel';
3618
+ operationId: string;
3619
+ };
3620
+
3621
+ export declare interface ResourceIndexAdvice {
3622
+ id: string;
3623
+ viewLabel: string;
3624
+ queryLabel: string;
3625
+ proposalId?: string;
3626
+ indexIds: readonly string[];
3627
+ recommendation: string;
3628
+ confidence: string;
3629
+ basis: string;
3630
+ benefit: InspectorEvidence;
3631
+ memory: IndexFootprint;
3632
+ disk: IndexFootprint;
3633
+ writeCost: InspectorEvidence;
3634
+ beforeAfter?: {
3635
+ before: string;
3636
+ after: string;
3637
+ basis: string;
3638
+ };
3639
+ }
3640
+
3641
+ export declare interface ResourceIndexDefinition {
3642
+ id: string;
3643
+ label: string;
3644
+ provider: string;
3645
+ resourceType: string;
3646
+ scope: string;
3647
+ path: string;
3648
+ valueType: string;
3649
+ schema: string;
3650
+ storage: 'memory' | 'persisted';
3651
+ dataPolicy: string;
3652
+ }
3653
+
3654
+ export declare interface ResourceIndexInventory extends ResourceIndexDefinition {
3655
+ kind: 'metadata' | 'document';
3656
+ state: 'ready' | 'building' | 'catching-up' | 'stale' | 'failed' | 'canceled' | 'unavailable' | 'denied';
3657
+ coverage: string;
3658
+ freshness: string;
3659
+ generation?: string;
3660
+ memory: IndexFootprint;
3661
+ disk: IndexFootprint;
3662
+ quota?: string;
3663
+ references: readonly {
3664
+ id: string;
3665
+ label: string;
3666
+ queryLabel: string;
3667
+ }[];
3668
+ fallback: string;
3669
+ failure?: string;
3670
+ operation?: {
3671
+ id: string;
3672
+ label: string;
3673
+ progress?: number;
3674
+ cancellable: boolean;
3675
+ };
3676
+ /** Host-authorized actions; absence never means allowed. */
3677
+ actions: readonly ('rebuild' | 'drop')[];
3678
+ }
3679
+
3680
+ export declare function ResourceIndexManager({ indexes, proposals, advice, onAction, state, message, }: ResourceIndexManagerProps): JSX.Element;
3681
+
3682
+ export declare interface ResourceIndexManagerProps {
3683
+ indexes: readonly ResourceIndexInventory[];
3684
+ /** Host-admitted create definitions, including schema/scope/storage/data policy. */
3685
+ proposals: readonly ResourceIndexDefinition[];
3686
+ advice: readonly ResourceIndexAdvice[];
3687
+ onAction: (action: ResourceIndexAction, context: InspectorAsyncContext) => Promise<void>;
3688
+ state?: 'ready' | 'loading' | 'denied' | 'unavailable';
3689
+ message?: string;
3690
+ }
3691
+
3692
+ export declare interface ResourceNavigationResult<TResource> {
3693
+ label: string;
3694
+ provenance: string;
3695
+ resource: TResource;
3696
+ disabledReason?: string;
3697
+ }
3698
+
3699
+ export declare function ResourceResultNavigation<TResource, TContext>({ result, context, requestKey, onNavigate, }: ResourceResultNavigationProps<TResource, TContext>): JSX.Element;
3700
+
3701
+ export declare interface ResourceResultNavigationProps<TResource, TContext> {
3702
+ result: ResourceNavigationResult<TResource>;
3703
+ /** Passed intact to the host so opening a drawer/route can retain the originating workspace. */
3704
+ context: TContext;
3705
+ /** Host destination/context generation. Change to cancel a pending navigation; object identity is irrelevant. */
3706
+ requestKey: string | number;
3707
+ onNavigate: (result: ResourceNavigationResult<TResource>, context: TContext, signal: AbortSignal) => Promise<WorkspaceActionResult>;
3708
+ }
3709
+
3710
+ export declare function ResourceScopePicker({ targets, value, onChange, loading, error, disabled, className, }: ResourceScopePickerProps): JSX.Element;
3711
+
3712
+ export declare interface ResourceScopePickerProps {
3713
+ targets: readonly ResourceScopeTarget[];
3714
+ value: readonly ResourceScopeSelection[];
3715
+ onChange: (value: readonly ResourceScopeSelection[]) => void;
3716
+ loading?: boolean;
3717
+ error?: string;
3718
+ disabled?: boolean;
3719
+ className?: string;
3720
+ }
3721
+
3722
+ /** Empty/missing dimensions stay unresolved; this control never broadens them. */
3723
+ export declare interface ResourceScopeSelection {
3724
+ targetId: string;
3725
+ dimensions: Readonly<Record<string, readonly string[] | 'any'>>;
3726
+ }
3727
+
3728
+ /** Host catalog identifiers are opaque; display labels never become resource identity. */
3729
+ export declare interface ResourceScopeTarget {
3730
+ id: string;
3731
+ provider: string;
3732
+ connection: string;
3733
+ resourceType: string;
3734
+ description?: string;
3735
+ status?: 'ready' | 'loading' | 'partial' | 'denied' | 'offline' | 'unsupported';
3736
+ reason?: string;
3737
+ dimensions?: readonly {
3738
+ id: string;
3739
+ label: string;
3740
+ allowAny?: boolean;
3741
+ values: readonly {
3742
+ id: string;
3743
+ label: string;
3744
+ disabledReason?: string;
3745
+ }[];
3746
+ }[];
3747
+ }
3748
+
3749
+ /** The host supplies already bounded/ranked results; no client filtering or indexing. */
3750
+ export declare interface ResourceSearchItem<TPayload> {
3751
+ id: string;
3752
+ kind: 'command' | 'setting' | 'navigation' | 'resource';
3753
+ label: string;
3754
+ description?: string;
3755
+ provenance?: string;
3756
+ disabledReason?: string;
3757
+ payload: TPayload;
3758
+ decoration?: ReactNode;
3759
+ }
3760
+
3761
+ export declare function ResourceSearchResults<TPayload>({ query, onQueryChange, items, onActivate, onDismiss, loading, error, status, scopeStatus, stale, }: ResourceSearchResultsProps<TPayload>): JSX.Element;
3762
+
3763
+ export declare interface ResourceSearchResultsProps<TPayload> {
3764
+ query: string;
3765
+ onQueryChange: (query: string) => void;
3766
+ items: readonly ResourceSearchItem<TPayload>[];
3767
+ onActivate: (item: ResourceSearchItem<TPayload>, signal: AbortSignal) => Promise<WorkspaceActionResult>;
3768
+ onDismiss?: () => void;
3769
+ loading?: boolean;
3770
+ error?: string;
3771
+ /** Host-supplied permission, freshness, partial-source and bounded-result explanations. */
3772
+ status?: ReactNode;
3773
+ scopeStatus?: ReactNode;
3774
+ /** The host can disable older results while replacing its query generation. */
3775
+ stale?: boolean;
3776
+ }
3777
+
2982
3778
  /** A span value can be a plain number or a per-breakpoint responsive object. */
2983
3779
  export declare type ResponsiveSpan = number | Partial<Record<GridBreakpoint, number>>;
2984
3780
 
@@ -3035,6 +3831,66 @@ export declare interface RowListRootProps extends ListRootProps {
3035
3831
  onSortChange?: (sort: SortState) => void;
3036
3832
  }
3037
3833
 
3834
+ /** Presentation requests only: the host owns document schemas, semantics and persistence. */
3835
+ export declare type SavedResourceAction<TDraft> = {
3836
+ type: 'create';
3837
+ name: string;
3838
+ draft: TDraft;
3839
+ } | {
3840
+ type: 'rename';
3841
+ id: string;
3842
+ name: string;
3843
+ } | {
3844
+ type: 'select';
3845
+ id: string | null;
3846
+ } | {
3847
+ type: 'save';
3848
+ id: string;
3849
+ name: string;
3850
+ draft: TDraft;
3851
+ } | {
3852
+ type: 'reset';
3853
+ id: string | null;
3854
+ } | {
3855
+ type: 'delete';
3856
+ id: string;
3857
+ } | {
3858
+ type: 'import';
3859
+ document: string;
3860
+ } | {
3861
+ type: 'export';
3862
+ id: string;
3863
+ };
3864
+
3865
+ export declare interface SavedResourceItem {
3866
+ id: string;
3867
+ name: string;
3868
+ status?: 'ready' | 'conflict' | 'corrupt' | 'unsupported' | 'denied' | 'unavailable';
3869
+ reason?: string;
3870
+ }
3871
+
3872
+ export declare function SavedResourceManager<TDraft>({ kind, items, selectedId, nameDraft, onNameDraftChange, importDraft, onImportDraftChange, draft, dirty, onAction, status, loading, disabled, disabledReason, children, className, }: SavedResourceManagerProps<TDraft>): JSX.Element;
3873
+
3874
+ export declare interface SavedResourceManagerProps<TDraft> {
3875
+ kind: 'query' | 'view' | 'preset';
3876
+ items: readonly SavedResourceItem[];
3877
+ selectedId: string | null;
3878
+ nameDraft: string;
3879
+ onNameDraftChange: (name: string) => void;
3880
+ importDraft: string;
3881
+ onImportDraftChange: (document: string) => void;
3882
+ /** Opaque configuration. Never interpreted, serialized, or validated by this component. */
3883
+ draft: TDraft;
3884
+ dirty: boolean;
3885
+ onAction: (action: SavedResourceAction<TDraft>, signal: AbortSignal) => Promise<WorkspaceActionResult>;
3886
+ status?: WorkspaceActionResult;
3887
+ loading?: boolean;
3888
+ disabled?: boolean;
3889
+ disabledReason?: string;
3890
+ children?: ReactNode;
3891
+ className?: string;
3892
+ }
3893
+
3038
3894
  export declare const ScrollArea: ForwardRefExoticComponent<ScrollAreaProps & RefAttributes<HTMLDivElement>>;
3039
3895
 
3040
3896
  export declare type ScrollAreaOrientation = 'vertical' | 'horizontal' | 'both';
@@ -4639,7 +5495,7 @@ export declare function useCommandListItem(store: CommandListStore, key: Key_2):
4639
5495
 
4640
5496
  export declare function useCommandListStoreContext(): CommandListStore;
4641
5497
 
4642
- export declare function useDataTable<TData = any>(options: UseDataTableOptions<TData>): Table_2<TData>;
5498
+ export declare function useDataTable<TData = unknown>(options: UseDataTableOptions<TData>): Table_2<TData>;
4643
5499
 
4644
5500
  export declare function useDataTableContext(): DataTableContextValue;
4645
5501
 
@@ -4648,15 +5504,24 @@ export declare interface UseDataTableOptions<TData> {
4648
5504
  columns: ColumnDef_2<TData, unknown>[];
4649
5505
  features?: DataTableFeatures;
4650
5506
  initialState?: Partial<TableState>;
5507
+ /** Controlled slices override internal state. Callbacks request host edits. */
5508
+ state?: Partial<TableState>;
4651
5509
  getRowId?: (row: TData, index: number) => string;
4652
5510
  getSubRows?: (row: TData) => TData[] | undefined;
4653
5511
  getRowCanExpand?: (row: {
4654
5512
  original: TData;
4655
5513
  depth: number;
4656
5514
  }) => boolean;
5515
+ getRowCanSelect?: (row: {
5516
+ original: TData;
5517
+ depth: number;
5518
+ }) => boolean;
4657
5519
  persistenceKey?: string;
4658
5520
  onRowSelectionChange?: (selection: RowSelectionState) => void;
4659
5521
  onSortingChange?: (sorting: SortingState) => void;
5522
+ onGlobalFilterChange?: (filter: string) => void;
5523
+ onColumnFiltersChange?: (filters: ColumnFiltersState) => void;
5524
+ onGroupingChange?: (grouping: GroupingState) => void;
4660
5525
  onColumnVisibilityChange?: (visibility: VisibilityState) => void;
4661
5526
  onColumnOrderChange?: (order: ColumnOrderState) => void;
4662
5527
  onColumnSizingChange?: (sizing: ColumnSizingState) => void;
@@ -4669,6 +5534,10 @@ export declare interface UseDataTableOptions<TData> {
4669
5534
  manualSorting?: boolean;
4670
5535
  manualFiltering?: boolean;
4671
5536
  manualPagination?: boolean;
5537
+ /** Host-prepared groups/subrows are never regrouped in the browser. */
5538
+ manualGrouping?: boolean;
5539
+ manualExpanding?: boolean;
5540
+ rowCount?: number;
4672
5541
  pageCount?: number;
4673
5542
  globalFilterFn?: 'auto' | 'includesString' | 'includesStringSensitive';
4674
5543
  }
@@ -4842,6 +5711,10 @@ export declare function useTreeItem(store: TreeStore, key: Key_3, textValue?: st
4842
5711
 
4843
5712
  export declare function useTreeStoreContext(): TreeStore;
4844
5713
 
5714
+ export declare function utf16ToUtf8(text: string, offset: number): number;
5715
+
5716
+ export declare function utf8ToUtf16(text: string, offset: number): number;
5717
+
4845
5718
  /** Validation function. Return a FieldErrors map (empty or all-undefined = valid). */
4846
5719
  export declare type ValidateItem = (key: Key, values: Record<string, string>) => FieldErrors | Promise<FieldErrors>;
4847
5720
 
@@ -4862,6 +5735,127 @@ export declare interface ValidateSectionsResult {
4862
5735
 
4863
5736
  export declare function validateThemeDefinition(input: unknown, supportsColor?: SupportsColor): ThemeDefinition;
4864
5737
 
5738
+ /**
5739
+ * Controlled, keyed layout with pointer and keyboard arrangement. Renderers own
5740
+ * acquisition/lifetimes; preview does not silently unmount panels or pause data.
5741
+ */
5742
+ export declare function ViewLayout<TItem extends ViewLayoutItem>({ items, onItemsChange, renderItem, onConfigure, editing, disabled, readOnly, columns, rowHeight, maxRowSpan, emptyContent, className, onFocusCapture, ...props }: ViewLayoutProps<TItem>): JSX.Element;
5743
+
5744
+ /** Presentation geometry only, not a persisted saved-view document. */
5745
+ export declare interface ViewLayoutItem {
5746
+ id: string;
5747
+ title: string;
5748
+ columnSpan: number;
5749
+ rowSpan: number;
5750
+ }
5751
+
5752
+ export declare interface ViewLayoutProps<TItem extends ViewLayoutItem = ViewLayoutItem> extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
5753
+ items: readonly TItem[];
5754
+ onItemsChange: (items: TItem[]) => void;
5755
+ renderItem: (item: TItem) => ReactNode;
5756
+ onConfigure?: (id: string) => void;
5757
+ editing?: boolean;
5758
+ /** Prevent layout/configuration changes without disabling rendered panel content. */
5759
+ disabled?: boolean;
5760
+ /** Keep editing controls discoverable, but prevent layout/configuration changes. */
5761
+ readOnly?: boolean;
5762
+ columns?: 1 | 2 | 3 | 4 | 6 | 12;
5763
+ rowHeight?: number;
5764
+ maxRowSpan?: number;
5765
+ emptyContent?: ReactNode;
5766
+ }
5767
+
5768
+ export declare interface VisualizationBindingDiagnostic {
5769
+ slotId?: string;
5770
+ severity: 'error' | 'warning' | 'info';
5771
+ message: string;
5772
+ }
5773
+
5774
+ export declare function VisualizationBindingEditor({ slots, fields, value, onChange, diagnostics, disabled, visualizationId, visualizations, onVisualizationChange, children, className, ...props }: VisualizationBindingEditorProps): JSX.Element;
5775
+
5776
+ export declare interface VisualizationBindingEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
5777
+ slots: readonly VisualizationBindingSlot[];
5778
+ /** Host-projected choices. IDs are opaque: this component never resolves paths or compatibility. */
5779
+ fields: readonly VisualizationFieldOption[];
5780
+ value: VisualizationBindings;
5781
+ onChange: (bindings: VisualizationBindings) => void;
5782
+ diagnostics?: readonly VisualizationBindingDiagnostic[];
5783
+ disabled?: boolean;
5784
+ visualizationId?: string;
5785
+ visualizations?: readonly VisualizationOption[];
5786
+ onVisualizationChange?: (id: string) => void;
5787
+ }
5788
+
5789
+ export declare type VisualizationBindings = Readonly<Record<string, string | undefined>>;
5790
+
5791
+ export declare interface VisualizationBindingSlot {
5792
+ id: string;
5793
+ label: string;
5794
+ description?: string;
5795
+ required?: boolean;
5796
+ }
5797
+
5798
+ /** Values have already been selected/validated by the caller. Exact integers can remain strings. */
5799
+ export declare type VisualizationDisplayValue = string | number | boolean | null | readonly VisualizationDisplayValue[] | {
5800
+ readonly [key: string]: VisualizationDisplayValue;
5801
+ };
5802
+
5803
+ export declare interface VisualizationField {
5804
+ id: string;
5805
+ label: string;
5806
+ value: VisualizationFieldValue;
5807
+ }
5808
+
5809
+ export declare interface VisualizationFieldOption {
5810
+ id: string;
5811
+ label: string;
5812
+ type: string;
5813
+ description?: string;
5814
+ disabledReason?: string;
5815
+ }
5816
+
5817
+ /** Bounded presentation only: does not parse field paths, evaluate selectors or fetch resources. */
5818
+ export declare function VisualizationFields({ fields, presentation, className, ...props }: VisualizationFieldsProps): JSX.Element;
5819
+
5820
+ export declare interface VisualizationFieldsProps extends HTMLAttributes<HTMLDivElement> {
5821
+ fields: readonly VisualizationField[];
5822
+ presentation?: 'stat' | 'list' | 'key-value';
5823
+ }
5824
+
5825
+ export declare type VisualizationFieldValue = {
5826
+ status: 'ready';
5827
+ value: VisualizationDisplayValue;
5828
+ } | {
5829
+ status: 'missing' | 'type-error' | 'unavailable' | 'denied';
5830
+ message: string;
5831
+ };
5832
+
5833
+ export declare interface VisualizationOption {
5834
+ id: string;
5835
+ label: string;
5836
+ description?: string;
5837
+ disabledReason?: string;
5838
+ }
5839
+
5840
+ /** Non-ready content is not mounted; each panel fails independently. */
5841
+ export declare function VisualizationPanel({ title, status, description, detail, actions, children, className, ...props }: VisualizationPanelProps): JSX.Element;
5842
+
5843
+ export declare interface VisualizationPanelProps extends Omit<HTMLAttributes<HTMLElement>, 'color'> {
5844
+ title: string;
5845
+ status: VisualizationStatus;
5846
+ description?: string;
5847
+ /** Safe, host-provided diagnostic; never derives or requests protected data. */
5848
+ detail?: string;
5849
+ actions?: ReactNode;
5850
+ }
5851
+
5852
+ export declare type VisualizationStatus = 'ready' | 'loading' | 'empty' | 'error' | 'unavailable' | 'denied';
5853
+
4865
5854
  declare type WeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6;
4866
5855
 
5856
+ export declare type WorkspaceActionResult = {
5857
+ status: 'success' | 'conflict' | 'corrupt' | 'unsupported' | 'denied' | 'unavailable' | 'error';
5858
+ message?: string;
5859
+ };
5860
+
4867
5861
  export { }