@dataverse-kit/form-runtime 0.1.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/businessRules-U1_MBgyG.d.cts +372 -0
  4. package/dist/businessRules-U1_MBgyG.d.ts +372 -0
  5. package/dist/context.cjs +151 -0
  6. package/dist/context.cjs.map +1 -0
  7. package/dist/context.d.cts +132 -0
  8. package/dist/context.d.ts +132 -0
  9. package/dist/context.mjs +113 -0
  10. package/dist/context.mjs.map +1 -0
  11. package/dist/control-DFOg_pc_.d.cts +1027 -0
  12. package/dist/control-DaXBm-52.d.ts +1027 -0
  13. package/dist/gridCustomizer-C0V9FAE_.d.ts +569 -0
  14. package/dist/gridCustomizer-mJO-kmQ4.d.cts +569 -0
  15. package/dist/hooks.cjs +85 -0
  16. package/dist/hooks.cjs.map +1 -0
  17. package/dist/hooks.d.cts +24 -0
  18. package/dist/hooks.d.ts +24 -0
  19. package/dist/hooks.mjs +60 -0
  20. package/dist/hooks.mjs.map +1 -0
  21. package/dist/icons.cjs +202 -0
  22. package/dist/icons.cjs.map +1 -0
  23. package/dist/icons.d.cts +130 -0
  24. package/dist/icons.d.ts +130 -0
  25. package/dist/icons.mjs +165 -0
  26. package/dist/icons.mjs.map +1 -0
  27. package/dist/index.cjs +6509 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.cts +410 -0
  30. package/dist/index.d.ts +410 -0
  31. package/dist/index.mjs +6490 -0
  32. package/dist/index.mjs.map +1 -0
  33. package/dist/runtime-capabilities-BdGDdu0d.d.cts +119 -0
  34. package/dist/runtime-capabilities-Brfc7loJ.d.ts +119 -0
  35. package/dist/theme-BfeZIxmZ.d.cts +74 -0
  36. package/dist/theme-BfeZIxmZ.d.ts +74 -0
  37. package/dist/theme.cjs +215 -0
  38. package/dist/theme.cjs.map +1 -0
  39. package/dist/theme.d.cts +32 -0
  40. package/dist/theme.d.ts +32 -0
  41. package/dist/theme.mjs +186 -0
  42. package/dist/theme.mjs.map +1 -0
  43. package/dist/types.cjs +976 -0
  44. package/dist/types.cjs.map +1 -0
  45. package/dist/types.d.cts +813 -0
  46. package/dist/types.d.ts +813 -0
  47. package/dist/types.mjs +902 -0
  48. package/dist/types.mjs.map +1 -0
  49. package/dist/utils.cjs +250 -0
  50. package/dist/utils.cjs.map +1 -0
  51. package/dist/utils.d.cts +99 -0
  52. package/dist/utils.d.ts +99 -0
  53. package/dist/utils.mjs +220 -0
  54. package/dist/utils.mjs.map +1 -0
  55. package/dist/v8.cjs +4622 -0
  56. package/dist/v8.cjs.map +1 -0
  57. package/dist/v8.d.cts +730 -0
  58. package/dist/v8.d.ts +730 -0
  59. package/dist/v8.mjs +4622 -0
  60. package/dist/v8.mjs.map +1 -0
  61. package/dist/v9.cjs +19 -0
  62. package/dist/v9.cjs.map +1 -0
  63. package/dist/v9.d.cts +2 -0
  64. package/dist/v9.d.ts +2 -0
  65. package/dist/v9.mjs +1 -0
  66. package/dist/v9.mjs.map +1 -0
  67. package/package.json +113 -0
@@ -0,0 +1,1027 @@
1
+ import { b as FormThemeSettings, B as BackgroundConfig } from './theme-BfeZIxmZ.cjs';
2
+
3
+ /**
4
+ * Navigation types for inter-form communication in the form builder.
5
+ * Supports opening dialogs, panels, and callouts from buttons/commands.
6
+ */
7
+ /** Types of navigation actions available */
8
+ type NavigationActionType = 'openDialog' | 'openPanel' | 'openCallout' | 'closeForm';
9
+ /** Source for parameter values */
10
+ type ParameterSourceType = 'field' | 'constant' | 'context';
11
+ /** Position for panel overlays */
12
+ type PanelPosition = 'left' | 'right';
13
+ /**
14
+ * Maps a source value to a target form parameter.
15
+ * Used to pass data from one form to another.
16
+ */
17
+ interface ParameterMapping {
18
+ /** Name of the parameter on the target form */
19
+ targetParameter: string;
20
+ /** Where to get the value from */
21
+ source: ParameterSourceType;
22
+ /**
23
+ * Value based on source type:
24
+ * - 'field': field logical name from source form
25
+ * - 'constant': literal value
26
+ * - 'context': context variable name (e.g., 'recordId', 'entityName')
27
+ */
28
+ value: string;
29
+ }
30
+ /** Size configuration for overlay forms */
31
+ interface NavigationSizeConfig {
32
+ /** Width in pixels */
33
+ width?: number;
34
+ /** Height in pixels (primarily for dialogs) */
35
+ height?: number;
36
+ /** Position for panels */
37
+ position?: PanelPosition;
38
+ }
39
+ /** Configuration for what happens when the target form closes */
40
+ interface NavigationOnCloseConfig {
41
+ /** Whether to refresh data in the source form after close */
42
+ refreshData?: boolean;
43
+ /** Callback action name to execute (for custom handling) */
44
+ callbackAction?: string;
45
+ }
46
+ /**
47
+ * Navigation action configuration.
48
+ * Defines how to open another form from a button or command.
49
+ */
50
+ interface NavigationAction {
51
+ /** Unique identifier for this action */
52
+ id: string;
53
+ /** Type of navigation (what kind of overlay to use) */
54
+ type: NavigationActionType;
55
+ /** ID of the form to open */
56
+ targetFormId: string;
57
+ /** Parameter mappings to pass data to the target form */
58
+ parameterMappings?: ParameterMapping[];
59
+ /** Size and position configuration */
60
+ sizeConfig?: NavigationSizeConfig;
61
+ /** Configuration for when the target form closes */
62
+ onClose?: NavigationOnCloseConfig;
63
+ }
64
+ /**
65
+ * Parameter definition for form input parameters.
66
+ * Defines what parameters a form accepts when opened from navigation.
67
+ */
68
+ interface FormParameter {
69
+ /** Unique identifier */
70
+ id: string;
71
+ /** Internal name (used in code/mappings) */
72
+ name: string;
73
+ /** User-friendly display name */
74
+ displayName: string;
75
+ /** Data type of the parameter */
76
+ type: 'string' | 'number' | 'boolean' | 'lookup' | 'date' | 'record';
77
+ /** Whether the parameter is required */
78
+ required: boolean;
79
+ /** Default value if not provided */
80
+ defaultValue?: unknown;
81
+ /** Description for documentation */
82
+ description?: string;
83
+ }
84
+ /** Entry in the navigation stack (runtime state) */
85
+ interface NavigationStackEntry {
86
+ /** ID of the form that was opened */
87
+ formId: string;
88
+ /** Type of the form */
89
+ formType: 'dialog' | 'panel' | 'callout';
90
+ /** Parameters passed to the form */
91
+ parameters: Record<string, unknown>;
92
+ /** ID of the source form that opened this one */
93
+ sourceFormId: string;
94
+ /** Size configuration used */
95
+ sizeConfig?: NavigationSizeConfig;
96
+ /** On-close configuration */
97
+ onClose?: NavigationOnCloseConfig;
98
+ }
99
+ /** Result returned when a navigated form closes */
100
+ interface NavigationCloseResult {
101
+ /** Whether the form was submitted (vs cancelled) */
102
+ submitted: boolean;
103
+ /** Return values from the form */
104
+ returnValues?: Record<string, unknown>;
105
+ }
106
+ /** Context available to a form opened via navigation */
107
+ interface NavigationContext {
108
+ /** Parameters passed to this form */
109
+ parameters: Record<string, unknown>;
110
+ /** ID of the form that opened this one */
111
+ sourceFormId: string | null;
112
+ /** Function to close the current form */
113
+ closeForm: (result?: NavigationCloseResult) => void;
114
+ /** Whether this form was opened via navigation (vs direct) */
115
+ isNavigated: boolean;
116
+ }
117
+
118
+ type FormType = 'main' | 'dialog' | 'panel' | 'callout';
119
+ /**
120
+ * Layout mode for a form. Tabbed forms use the classic tab/section/row/cell
121
+ * flow; grid forms place sections as tiles on a CSS Grid (dashboard-style).
122
+ *
123
+ * Defaulting absent values to `'tabbed'` at read time preserves backwards
124
+ * compatibility with v12 projects (see StorageService migration v12 → v13).
125
+ */
126
+ type FormLayoutMode = 'tabbed' | 'grid';
127
+ /**
128
+ * Grid container configuration used when `FormDefinition.layoutMode === 'grid'`.
129
+ * Sections position themselves with `FormSection.gridPosition`; sections lacking
130
+ * a position get auto-placed by the renderer (top-to-bottom, column-first).
131
+ */
132
+ interface FormGridLayout {
133
+ /** Total columns in the grid (e.g. 12 for a responsive 12-column grid). */
134
+ columns: number;
135
+ /** Auto-row height in pixels. Sections span H rows. */
136
+ rowHeight: number;
137
+ /** Gap between grid cells in pixels (applies to both axes). */
138
+ gap: number;
139
+ /** Optional responsive column overrides — designer hint only in v1. */
140
+ breakpoints?: {
141
+ sm?: number;
142
+ md?: number;
143
+ lg?: number;
144
+ };
145
+ }
146
+ /** Default grid layout applied when a form is created in grid mode. */
147
+ declare const DEFAULT_FORM_GRID_LAYOUT: FormGridLayout;
148
+ /** Button appearance style */
149
+ type DialogButtonAppearance = 'primary' | 'default' | 'subtle';
150
+ /** Button position in dialog footer */
151
+ type DialogButtonPosition = 'left' | 'right';
152
+ /**
153
+ * Action to perform when a dialog button is clicked.
154
+ * Supports close, submit, navigate, and custom actions.
155
+ */
156
+ type DialogButtonAction = {
157
+ type: 'close';
158
+ } | {
159
+ type: 'submit';
160
+ } | {
161
+ type: 'navigate';
162
+ target: NavigationAction;
163
+ } | {
164
+ type: 'custom';
165
+ actionId: string;
166
+ };
167
+ /**
168
+ * Configuration for a dialog action button.
169
+ * Used in dialog footers for confirm/cancel/custom actions.
170
+ */
171
+ interface DialogActionButton {
172
+ /** Unique identifier */
173
+ id: string;
174
+ /** Button label text */
175
+ label: string;
176
+ /** Optional Fluent UI icon name */
177
+ icon?: string;
178
+ /** Button appearance style */
179
+ appearance: DialogButtonAppearance;
180
+ /** Position in dialog footer (left or right side) */
181
+ position: DialogButtonPosition;
182
+ /** Sort order within position group (lower = first) */
183
+ order: number;
184
+ /** Whether button is disabled */
185
+ disabled?: boolean;
186
+ /** Whether button is hidden */
187
+ hidden?: boolean;
188
+ /** Action when button is clicked */
189
+ action: DialogButtonAction;
190
+ }
191
+ type CommandBarItemPosition = 'primary' | 'overflow' | 'far';
192
+ /**
193
+ * Where a command bar item is shown. Only meaningful for grid/subgrid
194
+ * command bars (which also expose a row right-click menu); form-level
195
+ * command bars treat any value as `commandBar`. Defaults to `both` at
196
+ * read time so legacy items keep their current behavior.
197
+ */
198
+ type CommandBarItemVisibility = 'commandBar' | 'contextMenu' | 'both';
199
+ /**
200
+ * Default Dynamics action behaviors that a command bar item can be wired to.
201
+ * - `custom` no default behavior (legacy items default here)
202
+ * - `navigate` opens another form via `navigationAction`
203
+ * - `new` opens the create form for the grid's entity
204
+ * - `addExisting` opens the lookup dialog to associate an existing record
205
+ * (only valid on related/nested grids)
206
+ * - `edit` opens the edit form for the selected row; multi-select
207
+ * falls through to the OOB bulk edit form
208
+ * - `delete` deletes selected rows via `Xrm.WebApi.deleteRecord`
209
+ * - `activate` sets statecode to active for selected rows
210
+ * - `deactivate` sets statecode to inactive for selected rows
211
+ * - `refresh` re-fetches the grid (always whole-grid)
212
+ * - `export` exports the current view (always whole-grid)
213
+ * - `bulkEdit` explicitly invokes `Xrm.Navigation.openBulkEditForm`
214
+ */
215
+ type CommandBarItemActionType = 'custom' | 'navigate' | 'new' | 'addExisting' | 'edit' | 'delete' | 'activate' | 'deactivate' | 'refresh' | 'export' | 'bulkEdit';
216
+ /**
217
+ * Whether an action operates on selected rows or the whole grid.
218
+ * - `auto` derived from `actionType`. Resolution:
219
+ * refresh/export/new/addExisting → grid;
220
+ * edit/delete/activate/deactivate/bulkEdit → selection;
221
+ * navigate/custom → grid (caller decides).
222
+ * - `selection` requires at least one selected row
223
+ * - `grid` operates on the whole grid
224
+ */
225
+ type CommandBarItemActionScope = 'auto' | 'selection' | 'grid';
226
+ interface CommandBarItem {
227
+ id: string;
228
+ text: string;
229
+ iconName: string;
230
+ position: CommandBarItemPosition;
231
+ iconOnly?: boolean;
232
+ /**
233
+ * Optional visibility override (grids only). Defaults to `both` —
234
+ * the item appears in both the toolbar and the row right-click menu.
235
+ */
236
+ visibility?: CommandBarItemVisibility;
237
+ /** Navigation action when clicked (opens another form) */
238
+ navigationAction?: NavigationAction;
239
+ /**
240
+ * Default Dynamics action behavior. Defaults to `custom` for legacy items
241
+ * (no wired behavior). When set to `navigate`, `navigationAction` is used.
242
+ */
243
+ actionType?: CommandBarItemActionType;
244
+ /** Whether the action operates on selected rows or the whole grid. Defaults to `auto`. */
245
+ actionScope?: CommandBarItemActionScope;
246
+ /**
247
+ * Hide this item until at least N rows are selected. `0` (or undefined)
248
+ * means always show. Most useful for `delete`, `edit`, `activate`,
249
+ * `deactivate`, and `bulkEdit` — defaults are derived from `actionType`
250
+ * when this is unset.
251
+ */
252
+ minSelectionCount?: number;
253
+ }
254
+ /** Number of header field slots (0-4) */
255
+ type HeaderSlotCount = 0 | 1 | 2 | 3 | 4;
256
+ /** Header display modes */
257
+ type HeaderDisplayMode = 'inline' | 'flyout';
258
+ /** Persona size options for header */
259
+ type HeaderPersonaSize = 'size32' | 'size48' | 'size72';
260
+ /** Preset colors for persona avatar */
261
+ type HeaderPersonaColor = 'lightBlue' | 'blue' | 'darkBlue' | 'teal' | 'lightGreen' | 'green' | 'darkGreen' | 'lightPink' | 'pink' | 'magenta' | 'purple' | 'orange' | 'red' | 'darkRed' | 'violet' | 'gold' | 'burgundy' | 'warmGray' | 'coolGray' | 'cyan' | 'rust' | 'custom';
262
+ /** Source mode for header persona data */
263
+ type HeaderPersonaSourceMode = 'static' | 'dataverse';
264
+ /** Configuration for the header persona/avatar */
265
+ interface HeaderPersonaConfig {
266
+ /** Whether to show the persona in the header */
267
+ enabled: boolean;
268
+ /** Source mode: 'static' for manual text/image, 'dataverse' for record-driven */
269
+ sourceMode?: HeaderPersonaSourceMode;
270
+ /** Field logical name to use for the display name (e.g., "fullname", "name") */
271
+ nameField?: string;
272
+ /** Field logical name to use for the image URL (e.g., "entityimage_url") */
273
+ imageField?: string;
274
+ /** Secondary text to display (e.g., entity type). Leave empty to use entity display name */
275
+ secondaryText?: string;
276
+ /** Whether to show the secondary text line */
277
+ showSecondaryText?: boolean;
278
+ /** Size of the persona avatar */
279
+ size?: HeaderPersonaSize;
280
+ /** Preset color for the avatar background */
281
+ color?: HeaderPersonaColor;
282
+ /** Custom hex color (used when color is 'custom') */
283
+ customColor?: string;
284
+ /** Static image URL or base64 data URL for the avatar */
285
+ imageUrl?: string;
286
+ /** Whether to use an uploaded image instead of initials */
287
+ useImage?: boolean;
288
+ /** Dataverse entity logical name (e.g., 'systemuser', 'contact', 'account') */
289
+ dvRecordEntityName?: string;
290
+ /** Selected record ID */
291
+ dvRecordId?: string;
292
+ /** Selected record primary name */
293
+ dvRecordName?: string;
294
+ /** Selected record secondary text (jobtitle, description, etc.) */
295
+ dvRecordSecondaryText?: string;
296
+ /** Base64 data URL of the record's entity image */
297
+ dvRecordImageDataUrl?: string;
298
+ /** Whether the record is disabled (systemuser only, for presence derivation) */
299
+ dvRecordIsDisabled?: boolean;
300
+ /** Show presence indicator */
301
+ showPresence?: boolean;
302
+ /** Presence status override */
303
+ presence?: string;
304
+ }
305
+ interface FormHeader {
306
+ /** Display title shown in header; falls back to form.name when empty */
307
+ title?: string;
308
+ /** Subtitle shown below title; falls back to form type label when empty */
309
+ subtitle?: string;
310
+ /** Manual title text color override. Overrides auto-contrast when set. */
311
+ titleColor?: string;
312
+ /** Manual subtitle text color override. Overrides auto-contrast when set. */
313
+ subtitleColor?: string;
314
+ /** Number of field slots to display (0-4), defaults to 4 */
315
+ slotCount?: HeaderSlotCount;
316
+ /** Persona configuration for showing an avatar with name */
317
+ persona?: HeaderPersonaConfig;
318
+ cells: FormCell[];
319
+ }
320
+ interface FormDefinition {
321
+ id: string;
322
+ name: string;
323
+ type: FormType;
324
+ /**
325
+ * Layout mode. `'tabbed'` (default) uses the classic tabs/sections flow.
326
+ * `'grid'` places sections as tiles on a CSS Grid (dashboard-style). Only
327
+ * meaningful when `type === 'main'` in v1; dialog/panel/callout ignore it.
328
+ * Absent on v12-and-earlier projects → treated as `'tabbed'`.
329
+ */
330
+ layoutMode?: FormLayoutMode;
331
+ /**
332
+ * Grid container configuration. Only read when `layoutMode === 'grid'`.
333
+ * Undefined means use `DEFAULT_FORM_GRID_LAYOUT`.
334
+ */
335
+ gridLayout?: FormGridLayout;
336
+ settings: FormSettings;
337
+ /** Header fields for main forms (up to 4 key fields) */
338
+ header?: FormHeader;
339
+ /** Command bar items for main forms */
340
+ commandBar?: CommandBarItem[];
341
+ /** Tabs for main forms */
342
+ tabs: FormTab[];
343
+ /** Flat sections for dialog/panel/callout */
344
+ sections: FormSection[];
345
+ /** Display order within type category (for sidebar organization) */
346
+ order?: number;
347
+ /** Description for documentation */
348
+ description?: string;
349
+ /** Parameters this form accepts when opened from another form */
350
+ inputParameters?: FormParameter[];
351
+ /** ID of the template this form was created from (for template editing workflow) */
352
+ sourceTemplateId?: string;
353
+ /** Embedded callout definitions owned by this form */
354
+ callouts?: CalloutDefinition[];
355
+ /** Callout-to-target attachments (maps callouts to controls/sections/etc.) */
356
+ calloutAttachments?: CalloutAttachment[];
357
+ }
358
+ /** Aggregate function types supported in FetchXML */
359
+ type FetchXmlAggregateFunction = 'avg' | 'count' | 'countcolumn' | 'max' | 'min' | 'sum';
360
+ /** Attribute parsed from FetchXML */
361
+ interface FetchXmlAttribute {
362
+ /** The logical name of the attribute, e.g., "fullname" */
363
+ logicalName: string;
364
+ /** Optional alias if specified in FetchXML */
365
+ alias?: string;
366
+ /** If from a link-entity, the alias of that link-entity */
367
+ linkedEntityAlias?: string;
368
+ /** Whether to use the formatted value (e.g., "Active" instead of 0 for option sets) */
369
+ useFormattedValue?: boolean;
370
+ /** Aggregate function if this is an aggregate attribute (avg, count, countcolumn, max, min, sum) */
371
+ aggregateFunction?: FetchXmlAggregateFunction;
372
+ }
373
+ /**
374
+ * A FetchXML-based data source.
375
+ *
376
+ * The FIRST entry in `form.settings.dataSources` is the form's primary source and carries
377
+ * the primary-entity metadata fields (entitySetName, primaryIdAttribute, etc.) needed for
378
+ * runtime record fetching and PCF manifest generation. Secondary entries (index >= 1) are
379
+ * related-record queries and may leave the primary-only fields undefined.
380
+ */
381
+ interface FormDataSource {
382
+ /** Unique identifier for this data source */
383
+ id: string;
384
+ /** User-friendly name, e.g., "Related Contacts" */
385
+ name: string;
386
+ /** The raw FetchXML query */
387
+ fetchXml: string;
388
+ /** Entity name parsed from <entity name="..."> */
389
+ entityName: string;
390
+ /** Attributes parsed from <attribute name="..."/> */
391
+ attributes: FetchXmlAttribute[];
392
+ /** Placeholder tokens like {*accountid*} found in the FetchXML */
393
+ placeholders: string[];
394
+ /**
395
+ * Include formatted values in API response.
396
+ * When true, adds `Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"`
397
+ * header to the request. This provides display names for option sets, lookups, dates, etc.
398
+ */
399
+ includeFormattedValues?: boolean;
400
+ /** True if fetch element has aggregate='true' - returns computed values instead of records */
401
+ isAggregate?: boolean;
402
+ /** OData entity set name, e.g., "accounts". Required on the primary source for record fetch. */
403
+ entitySetName?: string;
404
+ /** Primary key attribute, e.g., "accountid". Required on the primary source. */
405
+ primaryIdAttribute?: string;
406
+ /** Primary name attribute, e.g., "name". Used by headers and lookup displays. */
407
+ primaryNameAttribute?: string;
408
+ /** Localized entity display name, e.g., "Account". */
409
+ displayName?: string;
410
+ /** Localized plural entity display name, e.g., "Accounts". */
411
+ displayNamePlural?: string;
412
+ }
413
+ interface FormSettings {
414
+ width?: number;
415
+ height?: number;
416
+ position?: 'left' | 'right' | 'center';
417
+ showCommandBar: boolean;
418
+ /** Whether to show text labels on command bar items (default: true) */
419
+ showCommandBarLabels?: boolean;
420
+ showHeader: boolean;
421
+ /** How header fields are displayed: 'inline' (always visible) or 'flyout' (expandable callout). Default: 'flyout' */
422
+ headerDisplayMode?: HeaderDisplayMode;
423
+ /**
424
+ * FetchXML-based data sources. The first entry (index [0]) is the form's primary source,
425
+ * carrying entity metadata (entitySetName, primaryIdAttribute, etc.). Secondary entries are
426
+ * related-record queries. Use `getPrimaryDataSource()` from `utils/formDataSource` to read.
427
+ */
428
+ dataSources?: FormDataSource[];
429
+ /** Theme configuration (preset and custom colors) */
430
+ theme?: FormThemeSettings;
431
+ /** Business rule IDs applied to this form (references project.businessRules) */
432
+ businessRuleIds?: string[];
433
+ /** Overrides for entity-scoped rules on this form */
434
+ ruleOverrides?: {
435
+ ruleId: string;
436
+ enabled: boolean;
437
+ }[];
438
+ /** Dialog action buttons (only applicable for dialog form type) */
439
+ dialogButtons?: DialogActionButton[];
440
+ /** Alignment of the dialog button footer: left, center, or right (default: 'right') */
441
+ dialogButtonAlignment?: 'left' | 'center' | 'right';
442
+ /** Optional subheader text shown below the dialog title */
443
+ dialogSubheader?: string;
444
+ /** When true, dialog sections render as Pivot tabs instead of stacking vertically */
445
+ dialogUsePivots?: boolean;
446
+ /** Column layout for dialog sections (like tab layout for main forms) */
447
+ dialogLayout?: TabLayout;
448
+ /** When true, dialog expands to full viewport width */
449
+ dialogFullWidth?: boolean;
450
+ /** Optional record counter shown in dialog header (e.g., "3 of 12") */
451
+ dialogRecordCounter?: {
452
+ enabled: boolean;
453
+ current: number;
454
+ total: number;
455
+ position?: 'left' | 'right';
456
+ };
457
+ /** Panel action buttons (footer buttons for panel form type) */
458
+ panelButtons?: DialogActionButton[];
459
+ /** Alignment of the panel button footer (default: 'right') */
460
+ panelButtonAlignment?: 'left' | 'center' | 'right';
461
+ /** Optional subheader text shown below the panel title */
462
+ panelSubheader?: string;
463
+ /** When true, panel sections render as Pivot tabs */
464
+ panelUsePivots?: boolean;
465
+ /** Column layout for panel sections */
466
+ panelLayout?: TabLayout;
467
+ /** Fluent UI PanelType for controlling panel size/position */
468
+ panelType?: 'smallFixedFar' | 'smallFixedNear' | 'medium' | 'large' | 'largeFixed' | 'extraLarge' | 'custom' | 'customNear';
469
+ /** Whether panel shows a close button (default: true) */
470
+ panelHasCloseButton?: boolean;
471
+ /** Whether clicking outside the panel dismisses it (default: false) */
472
+ panelIsLightDismiss?: boolean;
473
+ /** Whether footer buttons are pinned to the bottom (default: true) */
474
+ panelIsFooterAtBottom?: boolean;
475
+ /** Whether the panel is non-modal (allows interaction with content behind it, no overlay) */
476
+ panelIsNonModal?: boolean;
477
+ /** Business Process Flow ID this form is associated with */
478
+ bpfId?: string;
479
+ /** BPF stage ID this form is linked to (for stage-specific forms) */
480
+ bpfStageId?: string;
481
+ /** Whether to show the BPF progress indicator on this form */
482
+ showBpfProgress?: boolean;
483
+ /** BPF progress indicator alignment */
484
+ bpfAlignment?: 'left' | 'center' | 'right';
485
+ /** Whether the BPF progress indicator should span full width */
486
+ bpfFullWidth?: boolean;
487
+ /** Whether this is the default form for the entity (only one per entity) */
488
+ isDefaultForEntity?: boolean;
489
+ /** Order in form selector dropdown (lower = first) */
490
+ formSelectorOrder?: number;
491
+ /**
492
+ * Form group ID for manual grouping.
493
+ * Forms with the same formGroupId are grouped together in the form selector,
494
+ * independent of or in addition to entity binding.
495
+ */
496
+ formGroupId?: string;
497
+ /**
498
+ * Display name for the form group (used when this form defines a new group)
499
+ */
500
+ formGroupName?: string;
501
+ /**
502
+ * Optional color for the form group indicator (hex color, e.g., "#0078d4")
503
+ * When set, the link icon in the sidebar uses this color instead of default blue.
504
+ */
505
+ formGroupColor?: string;
506
+ }
507
+ interface TabLayout {
508
+ columns: 1 | 2 | 3;
509
+ columnWidths: number[];
510
+ }
511
+ /** Base tab properties shared by all tab types */
512
+ interface FormTabBase {
513
+ id: string;
514
+ label: string;
515
+ expanded: boolean;
516
+ showLabel: boolean;
517
+ }
518
+ /** Main content tab with sections (existing behavior) */
519
+ interface MainFormTab extends FormTabBase {
520
+ tabType: 'main';
521
+ layout: TabLayout;
522
+ sections: FormSection[];
523
+ }
524
+ /** Related records tab configuration */
525
+ interface RelatedTabConfig {
526
+ /** Logical name of the related entity (e.g., "contact") */
527
+ entityLogicalName: string;
528
+ /** Display name of the related entity (e.g., "Contacts") */
529
+ entityDisplayName: string;
530
+ /** FetchXML query for retrieving related records */
531
+ fetchXml: string;
532
+ /** Attributes parsed from the FetchXML */
533
+ attributes: FetchXmlAttribute[];
534
+ /** Placeholder tokens found in the FetchXML (e.g., "{*accountid*}") */
535
+ placeholders: string[];
536
+ /** Grid display type */
537
+ gridType: 'standard' | 'readonly';
538
+ /** Column configuration for the grid (optional - auto-generated from attributes if not provided) */
539
+ columns?: SubgridColumn[];
540
+ /** Maximum rows to display (default: 5) */
541
+ maxRows?: number;
542
+ /** Whether to show the command bar (Add, Edit, Delete buttons) */
543
+ showCommandBar?: boolean;
544
+ }
545
+ /** Related records tab */
546
+ interface RelatedFormTab extends FormTabBase {
547
+ tabType: 'related';
548
+ relatedConfig: RelatedTabConfig;
549
+ }
550
+ /** Configuration for audit history tab */
551
+ interface AuditHistoryConfig {
552
+ /** Maximum number of audit records to display (default: 20) */
553
+ maxRows?: number;
554
+ /** Whether to show the user who made the change (default: true) */
555
+ showChangedBy?: boolean;
556
+ /** Whether to show detailed field changes (default: true) */
557
+ showFieldChanges?: boolean;
558
+ /** Sort order for audit records (default: 'newest') */
559
+ sortOrder?: 'newest' | 'oldest';
560
+ }
561
+ /** Audit history tab */
562
+ interface AuditFormTab extends FormTabBase {
563
+ tabType: 'audit';
564
+ auditConfig: AuditHistoryConfig;
565
+ }
566
+ /**
567
+ * Union type for form tabs.
568
+ * - Main tabs: Have sections and layout (existing behavior)
569
+ * - Related tabs: Display related records via FetchXML
570
+ * - Audit tabs: Display change history from the audit entity
571
+ *
572
+ * Note: For backward compatibility, tabs without tabType are treated as 'main'
573
+ */
574
+ type FormTab = MainFormTab | RelatedFormTab | AuditFormTab;
575
+ /**
576
+ * Check if a tab is a main content tab (has sections).
577
+ * Also handles backward compatibility for tabs without tabType property.
578
+ */
579
+ declare function isMainTab(tab: FormTab): tab is MainFormTab;
580
+ /**
581
+ * Check if a tab is a related records tab.
582
+ */
583
+ declare function isRelatedTab(tab: FormTab): tab is RelatedFormTab;
584
+ /**
585
+ * Check if a tab is an audit history tab.
586
+ */
587
+ declare function isAuditTab(tab: FormTab): tab is AuditFormTab;
588
+ /**
589
+ * Position of a section within a grid-mode form. `x`/`y` are top-left cell
590
+ * indices; `w`/`h` are spans in grid cells. Only read when the parent
591
+ * `FormDefinition.layoutMode === 'grid'`. Tabbed mode ignores this field.
592
+ */
593
+ interface FormSectionGridPosition {
594
+ x: number;
595
+ y: number;
596
+ w: number;
597
+ h: number;
598
+ }
599
+ interface FormSection {
600
+ id: string;
601
+ label: string;
602
+ columns: 1 | 2 | 3 | 4;
603
+ showLabel: boolean;
604
+ collapsible: boolean;
605
+ variant: 'card' | 'flat' | 'placeholder';
606
+ tabColumn?: number;
607
+ /**
608
+ * Grid placement for this section. Only honored when the parent form's
609
+ * `layoutMode === 'grid'`. Absent → renderer auto-places the section.
610
+ */
611
+ gridPosition?: FormSectionGridPosition;
612
+ rows: FormRow[];
613
+ minHeight?: number;
614
+ widthPercent?: number;
615
+ fullWidth?: boolean;
616
+ /** When true, this section renders as a tab in a pivot group with adjacent pivot sections */
617
+ isPivotTab?: boolean;
618
+ /** Per-section background override (color, image, or gradient). When undefined, inherits from theme. */
619
+ background?: BackgroundConfig;
620
+ /** Manual text color override for section header label. Overrides auto-contrast when set. */
621
+ textColor?: string;
622
+ /** Label position: 'beside' (left of field, default) or 'above' (stacked on top) */
623
+ labelPosition?: 'beside' | 'above';
624
+ /** Label column width as a percentage (default 35). Only applies when labelPosition is 'beside'. */
625
+ labelWidth?: number;
626
+ /** Vertical gap between rows in pixels (default 4) */
627
+ rowGap?: number;
628
+ /** Horizontal gap between cells in pixels (default 8) */
629
+ cellGap?: number;
630
+ /** When true, labels wrap instead of truncating with ellipsis */
631
+ wrapLabel?: boolean;
632
+ /** When true, hidden fields collapse and remaining fields reflow to fill space */
633
+ collapseHidden?: boolean;
634
+ }
635
+ interface FormRow {
636
+ id: string;
637
+ columns: 1 | 2 | 3 | 4;
638
+ cells: FormCell[];
639
+ }
640
+ interface FormCell {
641
+ id: string;
642
+ control: ControlDefinition | null;
643
+ colSpan: number;
644
+ rowSpan: number;
645
+ }
646
+ /** Directional hint for callout positioning relative to target */
647
+ type CalloutDirectionalHint = 'topLeftEdge' | 'topCenter' | 'topRightEdge' | 'topAutoEdge' | 'bottomLeftEdge' | 'bottomCenter' | 'bottomRightEdge' | 'bottomAutoEdge' | 'leftTopEdge' | 'leftCenter' | 'leftBottomEdge' | 'rightTopEdge' | 'rightCenter' | 'rightBottomEdge';
648
+ /** How the callout is triggered on the target element */
649
+ type CalloutTrigger = 'click' | 'hover' | 'icon-click';
650
+ /** Action button in callout footer */
651
+ interface CalloutActionButton {
652
+ id: string;
653
+ label: string;
654
+ icon?: string;
655
+ appearance: 'primary' | 'default';
656
+ action: 'dismiss' | 'submit';
657
+ }
658
+ /** A field binding for data-bound grid callouts */
659
+ interface CalloutFieldBinding {
660
+ id: string;
661
+ /** Row field name to read the value from */
662
+ fieldName: string;
663
+ /** Display label shown in the callout */
664
+ label: string;
665
+ /** How to render the value */
666
+ displayType: 'text' | 'badge' | 'currency' | 'date' | 'link' | 'icon-value';
667
+ /** Optional icon to show next to the label */
668
+ iconName?: string;
669
+ /** Display order */
670
+ order: number;
671
+ }
672
+ /**
673
+ * A callout definition embedded within a parent form or grid.
674
+ * Callouts are floating popups attached to controls/sections on a form,
675
+ * or to grid columns for data-aware cell popups.
676
+ * Static callouts use FormSection structure for content.
677
+ * Data-bound callouts use fieldBindings resolved against row data.
678
+ */
679
+ interface CalloutDefinition {
680
+ id: string;
681
+ name: string;
682
+ /** Callout width in pixels (default: 320) */
683
+ width?: number;
684
+ /** Position relative to target (default: bottomAutoEdge) */
685
+ directionalHint?: CalloutDirectionalHint;
686
+ /** Show the beak/arrow pointing to target (default: true) */
687
+ isBeakVisible?: boolean;
688
+ /** Beak width in pixels (default: 16) */
689
+ beakWidth?: number;
690
+ /** Gap between callout and target in pixels (default: 0) */
691
+ gapSpace?: number;
692
+ /** How the callout is triggered (default: click) */
693
+ trigger?: CalloutTrigger;
694
+ /** Whether clicking outside dismisses the callout (default: true) */
695
+ dismissOnClickOutside?: boolean;
696
+ /** Action buttons in callout footer */
697
+ actionButtons?: CalloutActionButton[];
698
+ /** Footer button alignment (default: right) */
699
+ buttonAlignment?: 'left' | 'center' | 'right';
700
+ /** When true, sections render as Pivot tabs instead of stacking vertically */
701
+ usePivots?: boolean;
702
+ /** Callout content (reuses existing section structure) — used when contentMode is 'static' */
703
+ sections: FormSection[];
704
+ /** Content mode: 'static' uses sections, 'data-bound' uses fieldBindings (default: 'static') */
705
+ contentMode?: 'static' | 'data-bound';
706
+ /** Field bindings for data-bound callouts — each maps a row field to a display slot */
707
+ fieldBindings?: CalloutFieldBinding[];
708
+ /** Tracks which factory preset was used for data-bound callouts */
709
+ presetType?: 'lookup-detail' | 'status-detail' | 'custom';
710
+ }
711
+ /** Type of element a callout can be attached to */
712
+ type CalloutTargetType = 'control' | 'section' | 'commandBarItem' | 'headerField';
713
+ /** Describes a callout's attachment to a specific target element */
714
+ interface CalloutAttachment {
715
+ calloutId: string;
716
+ targetType: CalloutTargetType;
717
+ targetId: string;
718
+ /** Override the callout's default trigger for this specific attachment */
719
+ trigger?: CalloutTrigger;
720
+ }
721
+
722
+ type ControlType = 'text' | 'textarea' | 'number' | 'decimal' | 'currency' | 'date' | 'datetime' | 'dropdown' | 'optionset' | 'checkbox' | 'toggle' | 'combobox' | 'choicegroup' | 'lookup' | 'phone' | 'email' | 'url' | 'subgrid' | 'timeline' | 'webresource' | 'slider' | 'rating' | 'spinbutton' | 'formlink' | 'persona' | 'spacer' | 'label' | 'button' | 'barchart' | 'linechart' | 'areachart' | 'piechart' | 'donutchart' | 'horizontalbarchart' | 'gaugechart' | 'sparkline' | 'heatmapchart' | 'kpicard' | 'funnelchart' | 'scatterchart';
723
+ type ControlCategory = 'popular' | 'input' | 'choice' | 'display' | 'grid' | 'layout' | 'action' | 'chart';
724
+ /** Aggregation function applied when multiple rows share a category. */
725
+ type ChartAggregation = 'count' | 'sum' | 'avg' | 'min' | 'max';
726
+ /** Color palette key for chart rendering. */
727
+ type ChartPalette = 'default' | 'categorical' | 'sequential' | 'diverging';
728
+ /**
729
+ * Per-control configuration for chart-category controls. Lives on
730
+ * `ControlDefinition.properties.chartConfig`. The renderer reads from
731
+ * `dataSourceId` to look up the FetchXML data source on the parent form
732
+ * (form.settings.dataSources). Sample data is used when dataSourceId is
733
+ * undefined so the designer canvas shows a plausible visualization
734
+ * before the user wires up data.
735
+ */
736
+ interface ChartConfig {
737
+ /**
738
+ * Id of a `FormDataSource` on the parent form. When undefined, the
739
+ * chart renders with library sample data (designer + preview only —
740
+ * runtime emitted code requires a real source).
741
+ */
742
+ dataSourceId?: string;
743
+ /**
744
+ * Attribute used as the x-axis / category. For pie/donut, this is
745
+ * the slice label. Ignored for gauge/kpi (single-value controls).
746
+ */
747
+ categoryAttribute?: string;
748
+ /** Attribute used as the y-axis / value. */
749
+ valueAttribute?: string;
750
+ /** Aggregation when multiple rows share a category. */
751
+ aggregation?: ChartAggregation;
752
+ /** Chart title displayed above the visualization. */
753
+ title?: string;
754
+ /** Color palette. */
755
+ palette?: ChartPalette;
756
+ /** Whether to show the legend (most chart types). */
757
+ showLegend?: boolean;
758
+ /** Gauge/KPI: target value for trend comparison. */
759
+ target?: number;
760
+ /** Gauge: min value of the range. */
761
+ min?: number;
762
+ /** Gauge: max value of the range. */
763
+ max?: number;
764
+ }
765
+ type SubgridColumnDataType = 'text' | 'numeric' | 'yesno' | 'date';
766
+ interface SubgridColumn {
767
+ key: string;
768
+ name: string;
769
+ fieldName: string;
770
+ minWidth: number;
771
+ maxWidth?: number;
772
+ isResizable?: boolean;
773
+ dataType?: SubgridColumnDataType;
774
+ isCustom?: boolean;
775
+ }
776
+ type SubgridGridType = 'standard' | 'readonly' | 'focused-view';
777
+ interface ControlDataBinding {
778
+ attributeLogicalName: string;
779
+ attributeType: string;
780
+ metadataDriven: boolean;
781
+ customFetchXml?: string;
782
+ lookupTargets?: string[];
783
+ optionSetOptions?: Array<{
784
+ value: number;
785
+ label: string;
786
+ color?: string;
787
+ }>;
788
+ viewId?: string;
789
+ viewFetchXml?: string;
790
+ /** If bound to a FetchXML data source instead of primary entity */
791
+ dataSourceId?: string;
792
+ /** Field from the data source (logical name or alias) */
793
+ dataSourceField?: string;
794
+ /**
795
+ * Use the formatted/display value instead of raw value.
796
+ * For option sets: "Active" instead of 0
797
+ * For lookups: Display name instead of GUID
798
+ * For dates: Localized date string
799
+ * For money: Formatted currency string
800
+ * Requires data source to have includeFormattedValues=true
801
+ */
802
+ useFormattedValue?: boolean;
803
+ /** Lookup-specific: Default view ID for filtering lookup records */
804
+ lookupViewId?: string;
805
+ /** Lookup-specific: Custom FetchXML for filtering lookup records */
806
+ lookupFetchXml?: string;
807
+ /** Lookup-specific: Whether to use custom FetchXML filter instead of view */
808
+ useLookupFetchXml?: boolean;
809
+ /** Global option set options (for dropdown/optionset with global source) */
810
+ globalOptionSetOptions?: Array<{
811
+ value: number;
812
+ label: string;
813
+ color?: string;
814
+ }>;
815
+ /** Global option set name (for dropdown/optionset with global source) */
816
+ globalOptionSetName?: string;
817
+ }
818
+ interface ControlDefinition {
819
+ type: ControlType;
820
+ label: string;
821
+ name: string;
822
+ required: boolean;
823
+ readOnly: boolean;
824
+ /** When true, the control is hidden by default on the form. Business rules can override visibility at runtime. */
825
+ hidden?: boolean;
826
+ hideLabel: boolean;
827
+ /** Manual label color override. When set, takes precedence over auto-contrast. */
828
+ labelColor?: string;
829
+ /** Per-control label position override. When set, takes precedence over section-level setting. */
830
+ labelPosition?: 'beside' | 'above';
831
+ /** Per-control label width override (percentage). When set, takes precedence over section-level setting. */
832
+ labelWidth?: number;
833
+ /** When true, label wraps instead of truncating with ellipsis. Overrides section-level setting. */
834
+ wrapLabel?: boolean;
835
+ /** Manual value/input text color override. When set, overrides theme default. */
836
+ valueColor?: string;
837
+ properties: Record<string, unknown>;
838
+ validation: ValidationRule[];
839
+ responsive: ResponsiveSettings;
840
+ dataBinding?: ControlDataBinding;
841
+ /** References a callout in parent form's callouts array */
842
+ calloutId?: string;
843
+ /** Override the callout's default trigger for this control */
844
+ calloutTrigger?: CalloutTrigger;
845
+ }
846
+ interface ValidationRule {
847
+ type: 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'custom';
848
+ value?: string | number;
849
+ message: string;
850
+ }
851
+ interface ResponsiveSettings {
852
+ hideOnPhone: boolean;
853
+ hideOnTablet: boolean;
854
+ }
855
+ interface ControlRegistryEntry {
856
+ type: ControlType;
857
+ label: string;
858
+ icon: string;
859
+ category: ControlCategory;
860
+ defaultProperties: Record<string, unknown>;
861
+ description: string;
862
+ /**
863
+ * If set, this control type is an alias for another type.
864
+ * When dragged from palette, it creates a control of the aliasFor type
865
+ * with the specified defaultProperties.
866
+ */
867
+ aliasFor?: ControlType;
868
+ /**
869
+ * If true, this control type should not appear in the Type dropdown
870
+ * in control properties (e.g., phone, email, url are aliases of text)
871
+ */
872
+ hideFromTypeDropdown?: boolean;
873
+ /**
874
+ * When true, this control type has no Fluent UI v8 equivalent and can
875
+ * only render under v9 export targets. ExportDialog blocks v8-only
876
+ * targets (Power Pages Web Resource, Canvas App PCF) when the project
877
+ * uses any v9-required control. Symmetric counterpart to the existing
878
+ * `V9_INCOMPATIBLE_CONTROL_TYPES` set (controls with no v9 equivalent).
879
+ */
880
+ requiresV9?: boolean;
881
+ }
882
+ /** Text field format types (similar to Dynamics 365) */
883
+ type TextFormat = 'text' | 'email' | 'url' | 'phone' | 'password';
884
+ /** Text field configuration */
885
+ interface TextFieldConfig {
886
+ /** Text format type */
887
+ textFormat?: TextFormat;
888
+ /** Max character length */
889
+ maxLength?: number;
890
+ /** Placeholder text (custom override) */
891
+ placeholder?: string;
892
+ /** Whether to show placeholder text (default: true) */
893
+ showPlaceholder?: boolean;
894
+ /** Show action button (mailto, tel:, open link) */
895
+ showActionButton?: boolean;
896
+ /** For password: allow show/hide toggle */
897
+ allowPasswordToggle?: boolean;
898
+ }
899
+ /** Mode for determining option source */
900
+ type OptionSourceMode = 'attribute' | 'global' | 'custom';
901
+ /** Custom option item with optional color and icon */
902
+ interface CustomOptionItem {
903
+ value: number;
904
+ label: string;
905
+ color?: string;
906
+ icon?: string;
907
+ imageSrc?: string;
908
+ /** For ComboBox grouping: 'normal' (default), 'header', or 'divider' */
909
+ itemType?: 'normal' | 'header' | 'divider';
910
+ }
911
+ /** Configuration for dropdown/optionset controls */
912
+ interface DropdownConfig {
913
+ /** Source mode for options */
914
+ optionSourceMode: OptionSourceMode;
915
+ /** Bound attribute name (for attribute mode) */
916
+ boundAttributeName?: string;
917
+ /** Global option set name (for global mode) */
918
+ globalOptionSetName?: string;
919
+ /** Custom options (for custom mode) */
920
+ customOptions?: CustomOptionItem[];
921
+ /** Enable multi-select (uses ComboBox) */
922
+ multiSelect?: boolean;
923
+ /** Show option colors as badges */
924
+ showOptionColors?: boolean;
925
+ }
926
+ /** Configuration for combobox controls */
927
+ interface ComboBoxConfig {
928
+ /** Source mode for options */
929
+ optionSourceMode: OptionSourceMode;
930
+ /** Bound attribute name (for attribute mode) */
931
+ boundAttributeName?: string;
932
+ /** Global option set name (for global mode) */
933
+ globalOptionSetName?: string;
934
+ /** Custom options (for custom mode) */
935
+ customOptions?: CustomOptionItem[];
936
+ /** Enable multi-select */
937
+ multiSelect?: boolean;
938
+ /** Allow typing values not in the option list */
939
+ allowFreeform?: boolean;
940
+ /** Type-ahead auto-complete */
941
+ autoComplete?: 'on' | 'off';
942
+ /** Show option colors as badges */
943
+ showOptionColors?: boolean;
944
+ }
945
+ type ButtonVariant = 'default' | 'primary' | 'compound' | 'icon' | 'action' | 'command' | 'split' | 'toggle';
946
+ /** Variants that support the `primary` (blue) styling toggle */
947
+ declare const PRIMARY_CAPABLE_VARIANTS: ButtonVariant[];
948
+ type ButtonSize = 'small' | 'medium' | 'large';
949
+ type ButtonAction = {
950
+ type: 'none';
951
+ } | {
952
+ type: 'switchTab';
953
+ targetTabId: string;
954
+ } | {
955
+ type: 'navigate';
956
+ target: NavigationAction;
957
+ } | {
958
+ type: 'triggerBusinessRule';
959
+ ruleId: string;
960
+ } | {
961
+ type: 'navigateUrl';
962
+ url: string;
963
+ openInNewTab?: boolean;
964
+ } | {
965
+ type: 'submitForm';
966
+ } | {
967
+ type: 'scrollToSection';
968
+ sectionId: string;
969
+ } | {
970
+ type: 'custom';
971
+ actionId: string;
972
+ };
973
+ interface ButtonMenuItem {
974
+ id: string;
975
+ text: string;
976
+ iconName?: string;
977
+ action: ButtonAction;
978
+ }
979
+ interface ButtonCommandBarItem {
980
+ id: string;
981
+ text: string;
982
+ iconName?: string;
983
+ iconOnly?: boolean;
984
+ action: ButtonAction;
985
+ subMenuItems?: ButtonMenuItem[];
986
+ }
987
+ interface ButtonConfig {
988
+ buttonText: string;
989
+ buttonVariant: ButtonVariant;
990
+ buttonAction: ButtonAction;
991
+ primary?: boolean;
992
+ iconName?: string;
993
+ iconPosition?: 'before' | 'after';
994
+ size?: ButtonSize;
995
+ fullWidth?: boolean;
996
+ alignment?: 'left' | 'center' | 'right';
997
+ disabled?: boolean;
998
+ tooltip?: string;
999
+ secondaryText?: string;
1000
+ iconOnly?: boolean;
1001
+ backgroundColor?: string;
1002
+ textColor?: string;
1003
+ iconColor?: string;
1004
+ menuItems?: ButtonMenuItem[];
1005
+ commandBarItems?: ButtonCommandBarItem[];
1006
+ commandBarIconOnly?: boolean;
1007
+ /** Position of the main button within the combined command bar list (default 0 = first) */
1008
+ commandBarMainPosition?: number;
1009
+ checkedText?: string;
1010
+ uncheckedText?: string;
1011
+ checkedIconName?: string;
1012
+ checkedBackgroundColor?: string;
1013
+ checkedTextColor?: string;
1014
+ checkedIconColor?: string;
1015
+ }
1016
+ type LayoutActionType = 'tab-1col' | 'tab-2col' | 'tab-3col' | 'section-1col' | 'section-2col' | 'section-3col' | 'section-4col' | 'tabbed-section';
1017
+ interface LayoutActionEntry {
1018
+ type: LayoutActionType;
1019
+ label: string;
1020
+ icon: string;
1021
+ description: string;
1022
+ columns?: 1 | 2 | 3 | 4;
1023
+ targetStructure: 'tab' | 'section' | 'tabbed-section';
1024
+ disabled?: boolean;
1025
+ }
1026
+
1027
+ export { type HeaderPersonaConfig as $, type AuditFormTab as A, type ButtonAction as B, type CalloutActionButton as C, type CustomOptionItem as D, DEFAULT_FORM_GRID_LAYOUT as E, type DialogActionButton as F, type DialogButtonAction as G, type DialogButtonAppearance as H, type DialogButtonPosition as I, type DropdownConfig as J, type FetchXmlAggregateFunction as K, type FetchXmlAttribute as L, type FormCell as M, type FormDataSource as N, type FormDefinition as O, type FormGridLayout as P, type FormHeader as Q, type FormLayoutMode as R, type FormParameter as S, type FormRow as T, type FormSection as U, type FormSectionGridPosition as V, type FormSettings as W, type FormTab as X, type FormType as Y, type HeaderDisplayMode as Z, type HeaderPersonaColor as _, type AuditHistoryConfig as a, type HeaderPersonaSize as a0, type HeaderPersonaSourceMode as a1, type HeaderSlotCount as a2, type LayoutActionEntry as a3, type LayoutActionType as a4, type MainFormTab as a5, type NavigationAction as a6, type NavigationActionType as a7, type NavigationCloseResult as a8, type NavigationContext as a9, type NavigationOnCloseConfig as aa, type NavigationSizeConfig as ab, type NavigationStackEntry as ac, type OptionSourceMode as ad, PRIMARY_CAPABLE_VARIANTS as ae, type PanelPosition as af, type ParameterMapping as ag, type ParameterSourceType as ah, type RelatedFormTab as ai, type RelatedTabConfig as aj, type ResponsiveSettings as ak, type SubgridColumn as al, type SubgridColumnDataType as am, type SubgridGridType as an, type TabLayout as ao, type TextFieldConfig as ap, type TextFormat as aq, type ValidationRule as ar, isAuditTab as as, isMainTab as at, isRelatedTab as au, type ButtonCommandBarItem as b, type ButtonConfig as c, type ButtonMenuItem as d, type ButtonSize as e, type ButtonVariant as f, type CalloutAttachment as g, type CalloutDefinition as h, type CalloutDirectionalHint as i, type CalloutFieldBinding as j, type CalloutTargetType as k, type CalloutTrigger as l, type ChartAggregation as m, type ChartConfig as n, type ChartPalette as o, type ComboBoxConfig as p, type CommandBarItem as q, type CommandBarItemActionScope as r, type CommandBarItemActionType as s, type CommandBarItemPosition as t, type CommandBarItemVisibility as u, type ControlCategory as v, type ControlDataBinding as w, type ControlDefinition as x, type ControlRegistryEntry as y, type ControlType as z };