@almadar/patterns 2.8.13 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2840 @@
1
+ /**
2
+ * Pattern Types (Auto-Generated)
3
+ *
4
+ * DO NOT EDIT MANUALLY - Generated by scripts/generate-pattern-types.ts
5
+ * Run: npx tsx scripts/generate-pattern-types.ts
6
+ *
7
+ * Generated: 2026-02-10T14:06:03.975Z
8
+ * Pattern count: 120
9
+ */
10
+ /**
11
+ * All valid pattern type names from almadar-patterns registry.
12
+ * Use this type in render-ui effects for compile-time validation.
13
+ */
14
+ export type PatternType = 'accordion' | 'action-buttons' | 'alert' | 'auth-layout' | 'avatar' | 'badge' | 'battle-template' | 'box' | 'breadcrumb' | 'button' | 'button-pattern' | 'canvas-effect' | 'card' | 'castle-template' | 'center' | 'chart' | 'checkbox' | 'code-viewer' | 'conditional-wrapper' | 'confirm-dialog' | 'container' | 'control-button' | 'counter-template' | 'crud-template' | 'custom-pattern' | 'd-pad' | 'dashboard-grid' | 'dashboard-layout' | 'detail-panel' | 'dialogue-box' | 'divider' | 'document-viewer' | 'drawer' | 'drawer-slot' | 'empty-state' | 'entity-cards' | 'entity-list' | 'entity-table' | 'error-state' | 'filter-group' | 'flex' | 'floating-action-button' | 'form' | 'form-actions' | 'form-field' | 'form-section' | 'form-section-header' | 'form-template' | 'game-hud' | 'game-menu' | 'game-over-screen' | 'game-shell' | 'game-template' | 'generic-app-template' | 'graph-canvas' | 'grid' | 'header' | 'health-bar' | 'icon' | 'input' | 'input-group' | 'inventory-panel' | 'isometric-canvas' | 'label' | 'law-reference-tooltip' | 'layout-pattern' | 'list-template' | 'loading-state' | 'master-detail' | 'media-gallery' | 'menu' | 'meter' | 'modal' | 'modal-slot' | 'navigation' | 'notification' | 'orbital-visualization' | 'overlay' | 'page-header' | 'pagination' | 'popover' | 'progress-bar' | 'radio' | 'relation-select' | 'repeatable-form-section' | 'runtime-debugger' | 'score-display' | 'search-input' | 'section' | 'select' | 'settings-template' | 'side-panel' | 'sidebar' | 'signature-pad' | 'simple-grid' | 'spacer' | 'spinner' | 'split' | 'split-pane' | 'sprite' | 'stack' | 'stat-badge' | 'stats' | 'switch' | 'tabbed-container' | 'table' | 'tabs' | 'text-highlight' | 'textarea' | 'theme-toggle' | 'timeline' | 'toast-slot' | 'tooltip' | 'typography' | 'u-i-slot-renderer' | 'violation-alert' | 'wizard-container' | 'wizard-navigation' | 'wizard-progress' | 'world-map-template';
15
+ /**
16
+ * Pattern props map - each pattern type maps to its valid props interface.
17
+ * This enables full type-checking of pattern configurations.
18
+ */
19
+ export interface PatternPropsMap {
20
+ 'accordion': {
21
+ type: 'accordion';
22
+ /** Accordion items */
23
+ items: unknown[] | string;
24
+ /** Allow multiple items open at once @default false */
25
+ multiple?: boolean | string;
26
+ /** Default open items (IDs) */
27
+ defaultOpenItems?: unknown[] | string;
28
+ /** Default open items by index (pattern compatibility) */
29
+ defaultOpen?: unknown[] | string;
30
+ /** Controlled open items (IDs) */
31
+ openItems?: unknown[] | string;
32
+ /** Callback when item opens/closes */
33
+ onItemToggle?: ((...args: unknown[]) => unknown) | string;
34
+ /** Additional CSS classes */
35
+ className?: string;
36
+ };
37
+ 'action-buttons': {
38
+ type: 'action-buttons';
39
+ /** Button configurations */
40
+ buttons: unknown[] | string;
41
+ /** Called when a button is pressed/released */
42
+ onAction: ((...args: unknown[]) => unknown) | string;
43
+ /** Layout variant */
44
+ layout?: string;
45
+ /** Size variant */
46
+ size?: string;
47
+ /** Additional CSS classes */
48
+ className?: string;
49
+ /** Disabled state */
50
+ disabled?: boolean | string;
51
+ };
52
+ 'alert': {
53
+ type: 'alert';
54
+ /** Alert content (children or message) */
55
+ children?: unknown | string;
56
+ /** Alert message (alias for children) */
57
+ message?: string;
58
+ /** variant prop */
59
+ variant?: unknown | string;
60
+ /** title prop */
61
+ title?: string;
62
+ /** dismissible prop */
63
+ dismissible?: boolean | string;
64
+ /** onDismiss prop */
65
+ onDismiss?: ((...args: unknown[]) => unknown) | string;
66
+ /** onClose prop */
67
+ onClose?: ((...args: unknown[]) => unknown) | string;
68
+ /** actions prop */
69
+ actions?: unknown | string;
70
+ /** className prop */
71
+ className?: string;
72
+ };
73
+ 'auth-layout': {
74
+ type: 'auth-layout';
75
+ /** App name */
76
+ appName?: string;
77
+ /** Logo component or URL */
78
+ logo?: unknown | string;
79
+ /** Background image URL */
80
+ backgroundImage?: string;
81
+ /** Show branding panel on the side */
82
+ showBranding?: boolean | string;
83
+ /** Branding panel content */
84
+ brandingContent?: unknown | string;
85
+ };
86
+ 'avatar': {
87
+ type: 'avatar';
88
+ /** Image source URL */
89
+ src?: string;
90
+ /** Alt text for the image */
91
+ alt?: string;
92
+ /** Full name - initials will be generated automatically */
93
+ name?: string;
94
+ /** Initials to display (e.g., "JD" for John Doe) If not provided but name is, initials will be auto-generated */
95
+ initials?: string;
96
+ /** Icon to display when no image or initials */
97
+ icon?: unknown | string;
98
+ /** Size of the avatar @default 'md' */
99
+ size?: unknown | string;
100
+ /** Status indicator */
101
+ status?: unknown | string;
102
+ /** Badge content (e.g., notification count) */
103
+ badge?: string | number;
104
+ /** Additional CSS classes */
105
+ className?: string;
106
+ /** Click handler */
107
+ onClick?: ((...args: unknown[]) => unknown) | string;
108
+ };
109
+ 'badge': {
110
+ type: 'badge';
111
+ /** variant prop */
112
+ variant?: unknown | string;
113
+ /** size prop */
114
+ size?: unknown | string;
115
+ };
116
+ 'battle-template': {
117
+ type: 'battle-template';
118
+ /** Initial units for the battle */
119
+ initialUnits: unknown[] | string;
120
+ /** Isometric tiles (pre-resolved with terrainSprite) */
121
+ tiles: unknown[] | string;
122
+ /** Canvas render scale */
123
+ scale?: number | string;
124
+ /** Board width for bounds checking */
125
+ boardWidth?: number | string;
126
+ /** Board height for bounds checking */
127
+ boardHeight?: number | string;
128
+ /** Asset manifest for IsometricCanvas */
129
+ assetManifest?: Record<string, unknown> | string;
130
+ /** Background image URL for canvas */
131
+ backgroundImage?: string;
132
+ /** Unit draw-size multiplier */
133
+ unitScale?: number | string;
134
+ /** -- Slots -- */
135
+ header?: ((...args: unknown[]) => unknown) | string;
136
+ /** Sidebar content (combat log, unit roster, etc.) */
137
+ sidebar?: ((...args: unknown[]) => unknown) | string;
138
+ /** Floating action buttons */
139
+ actions?: ((...args: unknown[]) => unknown) | string;
140
+ /** Floating overlays above the canvas (damage popups, tooltips) */
141
+ overlay?: ((...args: unknown[]) => unknown) | string;
142
+ /** Game-over screen overlay */
143
+ gameOverOverlay?: ((...args: unknown[]) => unknown) | string;
144
+ /** -- Obstacle features -- */
145
+ features?: unknown[] | string;
146
+ /** -- Callbacks -- */
147
+ onAttack?: ((...args: unknown[]) => unknown) | string;
148
+ /** Called when battle ends */
149
+ onGameEnd?: ((...args: unknown[]) => unknown) | string;
150
+ /** Called after a unit moves */
151
+ onUnitMove?: ((...args: unknown[]) => unknown) | string;
152
+ /** Custom combat damage calculator */
153
+ calculateDamage?: ((...args: unknown[]) => unknown) | string;
154
+ /** -- Canvas pass-through -- */
155
+ onDrawEffects?: ((...args: unknown[]) => unknown) | string;
156
+ /** hasActiveEffects prop */
157
+ hasActiveEffects?: boolean | string;
158
+ /** effectSpriteUrls prop */
159
+ effectSpriteUrls?: unknown[] | string;
160
+ /** resolveUnitFrame prop */
161
+ resolveUnitFrame?: ((...args: unknown[]) => unknown) | string;
162
+ /** className prop */
163
+ className?: string;
164
+ };
165
+ 'box': {
166
+ type: 'box';
167
+ /** Padding on all sides */
168
+ padding?: unknown | string;
169
+ /** Horizontal padding (overrides padding for x-axis) */
170
+ paddingX?: unknown | string;
171
+ /** Vertical padding (overrides padding for y-axis) */
172
+ paddingY?: unknown | string;
173
+ /** Margin on all sides */
174
+ margin?: unknown | string;
175
+ /** Horizontal margin */
176
+ marginX?: unknown | string;
177
+ /** Vertical margin */
178
+ marginY?: unknown | string;
179
+ /** Background color */
180
+ bg?: unknown | string;
181
+ /** Show border */
182
+ border?: boolean | string;
183
+ /** Border radius */
184
+ rounded?: unknown | string;
185
+ /** Box shadow */
186
+ shadow?: unknown | string;
187
+ /** Display type */
188
+ display?: string;
189
+ /** Fill available width */
190
+ fullWidth?: boolean | string;
191
+ /** Fill available height */
192
+ fullHeight?: boolean | string;
193
+ /** Overflow behavior */
194
+ overflow?: string;
195
+ /** Position */
196
+ position?: string;
197
+ /** HTML element to render as */
198
+ as?: unknown | string;
199
+ };
200
+ 'breadcrumb': {
201
+ type: 'breadcrumb';
202
+ /** Breadcrumb items */
203
+ items: unknown[] | string;
204
+ /** Separator icon */
205
+ separator?: unknown | string;
206
+ /** Maximum items to show (truncates with ellipsis) */
207
+ maxItems?: number | string;
208
+ /** Additional CSS classes */
209
+ className?: string;
210
+ };
211
+ 'button': {
212
+ type: 'button';
213
+ /** variant prop */
214
+ variant?: unknown | string;
215
+ /** size prop */
216
+ size?: unknown | string;
217
+ /** isLoading prop */
218
+ isLoading?: boolean | string;
219
+ /** Left icon as ReactNode (preferred) */
220
+ leftIcon?: unknown | string;
221
+ /** Right icon as ReactNode (preferred) */
222
+ rightIcon?: unknown | string;
223
+ /** Left icon as Lucide icon component (convenience prop, renders with default size) */
224
+ icon?: unknown | string;
225
+ /** Right icon as Lucide icon component (convenience prop) */
226
+ iconRight?: unknown | string;
227
+ };
228
+ 'button-pattern': {
229
+ type: 'button-pattern';
230
+ /** label prop */
231
+ label: string;
232
+ /** variant prop */
233
+ variant?: unknown | string;
234
+ /** size prop */
235
+ size?: unknown | string;
236
+ /** disabled prop */
237
+ disabled?: boolean | string;
238
+ /** onClick prop */
239
+ onClick?: string;
240
+ /** icon prop */
241
+ icon?: string;
242
+ /** iconPosition prop */
243
+ iconPosition?: string;
244
+ /** className prop */
245
+ className?: string;
246
+ };
247
+ 'canvas-effect': {
248
+ type: 'canvas-effect';
249
+ /** The type of combat action to visualise */
250
+ actionType: unknown | string;
251
+ /** Screen-space X position (center of the effect) */
252
+ x: number | string;
253
+ /** Screen-space Y position (center of the effect) */
254
+ y: number | string;
255
+ /** Duration in ms before auto-dismiss (default 2000 for canvas, 800 for emoji) */
256
+ duration?: number | string;
257
+ /** Optional intensity multiplier (1 = normal, 2 = double size/brightness) */
258
+ intensity?: number | string;
259
+ /** Callback when the effect animation completes */
260
+ onComplete?: ((...args: unknown[]) => unknown) | string;
261
+ /** Additional CSS classes */
262
+ className?: string;
263
+ /** Loading state indicator */
264
+ isLoading?: boolean | string;
265
+ /** Error state */
266
+ error?: unknown | string;
267
+ /** --- Remote asset loading --- */
268
+ effectSpriteUrl?: string;
269
+ /** Base URL for remote assets. Prepended to relative effectSpriteUrl paths. */
270
+ assetBaseUrl?: string;
271
+ /** Full effect asset manifest for the sprite particle engine. When provided, enables the canvas-based particle system. */
272
+ assetManifest?: unknown | string;
273
+ /** Canvas width (default 400) */
274
+ width?: number | string;
275
+ /** Canvas height (default 300) */
276
+ height?: number | string;
277
+ };
278
+ 'card': {
279
+ type: 'card';
280
+ /** Card title */
281
+ title?: string;
282
+ /** Card subtitle or description */
283
+ subtitle?: string;
284
+ /** Image URL to display at top of card */
285
+ image?: string;
286
+ /** Action buttons to display in card footer */
287
+ actions?: unknown[] | string;
288
+ /** Card content */
289
+ children?: unknown | string;
290
+ /** Click handler for the entire card */
291
+ onClick?: ((...args: unknown[]) => unknown) | string;
292
+ /** Additional CSS classes */
293
+ className?: string;
294
+ };
295
+ 'castle-template': {
296
+ type: 'castle-template';
297
+ /** Isometric tiles (pre-resolved with terrainSprite) */
298
+ tiles: unknown[] | string;
299
+ /** Building features rendered on the grid */
300
+ features?: unknown[] | string;
301
+ /** Garrison / stationed units on the grid */
302
+ units?: unknown[] | string;
303
+ /** Canvas render scale */
304
+ scale?: number | string;
305
+ /** Asset manifest for IsometricCanvas */
306
+ assetManifest?: Record<string, unknown> | string;
307
+ /** Background image URL */
308
+ backgroundImage?: string;
309
+ /** -- Slots -- */
310
+ header?: ((...args: unknown[]) => unknown) | string;
311
+ /** Side panel content (buildings list, recruit tab, garrison tab) */
312
+ sidePanel?: ((...args: unknown[]) => unknown) | string;
313
+ /** Canvas overlay (hover tooltips, etc.) */
314
+ overlay?: ((...args: unknown[]) => unknown) | string;
315
+ /** Bottom bar (income summary, etc.) */
316
+ footer?: ((...args: unknown[]) => unknown) | string;
317
+ /** -- Callbacks -- */
318
+ onFeatureClick?: ((...args: unknown[]) => unknown) | string;
319
+ /** Called when a unit is clicked */
320
+ onUnitClick?: ((...args: unknown[]) => unknown) | string;
321
+ /** Called when any tile is clicked */
322
+ onTileClick?: ((...args: unknown[]) => unknown) | string;
323
+ /** className prop */
324
+ className?: string;
325
+ };
326
+ 'center': {
327
+ type: 'center';
328
+ /** Center inline (width fits content) vs block (full width) */
329
+ inline?: boolean | string;
330
+ /** Center only horizontally */
331
+ horizontal?: boolean | string;
332
+ /** Center only vertically */
333
+ vertical?: boolean | string;
334
+ /** Minimum height (useful for vertical centering) */
335
+ minHeight?: string | number;
336
+ /** Fill available height */
337
+ fullHeight?: boolean | string;
338
+ /** Fill available width */
339
+ fullWidth?: boolean | string;
340
+ /** Custom class name */
341
+ className?: string;
342
+ /** Inline styles */
343
+ style?: Record<string, unknown> | string;
344
+ /** Children elements */
345
+ children: unknown | string;
346
+ /** HTML element to render as */
347
+ as?: unknown | string;
348
+ };
349
+ 'chart': {
350
+ type: 'chart';
351
+ /** Chart title */
352
+ title?: string;
353
+ /** Chart subtitle / description */
354
+ subtitle?: string;
355
+ /** Chart type */
356
+ chartType?: unknown | string;
357
+ /** Data series */
358
+ series?: unknown | string;
359
+ /** Simple data (single series shorthand) */
360
+ data?: unknown | string;
361
+ /** Chart height in px */
362
+ height?: number | string;
363
+ /** Show legend */
364
+ showLegend?: boolean | string;
365
+ /** Show values on chart */
366
+ showValues?: boolean | string;
367
+ /** Actions for chart interactions */
368
+ actions?: unknown | string;
369
+ /** Entity name for schema-driven auto-fetch */
370
+ entity?: string;
371
+ /** Loading state */
372
+ isLoading?: boolean | string;
373
+ /** Error state */
374
+ error?: unknown | string;
375
+ /** Additional CSS classes */
376
+ className?: string;
377
+ };
378
+ 'checkbox': {
379
+ type: 'checkbox';
380
+ /** label prop */
381
+ label?: string;
382
+ };
383
+ 'code-viewer': {
384
+ type: 'code-viewer';
385
+ /** Viewer title */
386
+ title?: string;
387
+ /** Code content */
388
+ code?: string;
389
+ /** Language for display label */
390
+ language?: string;
391
+ /** Diff lines (for diff mode) */
392
+ diff?: unknown | string;
393
+ /** Old value (for generating diff) */
394
+ oldValue?: string;
395
+ /** New value (for generating diff) */
396
+ newValue?: string;
397
+ /** Display mode */
398
+ mode?: unknown | string;
399
+ /** Show line numbers */
400
+ showLineNumbers?: boolean | string;
401
+ /** Show copy button */
402
+ showCopy?: boolean | string;
403
+ /** Enable word wrap */
404
+ wordWrap?: boolean | string;
405
+ /** Max height before scrolling */
406
+ maxHeight?: number | string;
407
+ /** Multiple files (tabbed view) */
408
+ files?: unknown | string;
409
+ /** Actions */
410
+ actions?: unknown | string;
411
+ /** Entity name for schema-driven auto-fetch */
412
+ entity?: string;
413
+ /** Loading state */
414
+ isLoading?: boolean | string;
415
+ /** Error state */
416
+ error?: unknown | string;
417
+ /** Additional CSS classes */
418
+ className?: string;
419
+ };
420
+ 'conditional-wrapper': {
421
+ type: 'conditional-wrapper';
422
+ /** The S-expression condition to evaluate */
423
+ condition?: unknown | string;
424
+ /** Context for evaluating the condition */
425
+ context: unknown | string;
426
+ /** Children to render when condition is true (or when no condition is provided) */
427
+ children: unknown | string;
428
+ /** Optional fallback to render when condition is false */
429
+ fallback?: unknown | string;
430
+ /** Whether to animate the transition (uses CSS transitions) */
431
+ animate?: boolean | string;
432
+ };
433
+ 'confirm-dialog': {
434
+ type: 'confirm-dialog';
435
+ /** Whether the dialog is open (defaults to true when rendered by slot wrapper) */
436
+ isOpen?: boolean | string;
437
+ /** Callback when dialog is closed (injected by slot wrapper) */
438
+ onClose?: ((...args: unknown[]) => unknown) | string;
439
+ /** Callback when action is confirmed (injected by slot wrapper) */
440
+ onConfirm?: ((...args: unknown[]) => unknown) | string;
441
+ /** Dialog title */
442
+ title: string;
443
+ /** Dialog message/description */
444
+ message?: string | unknown;
445
+ /** Alias for message (schema compatibility) */
446
+ description?: string | unknown;
447
+ /** Confirm button text */
448
+ confirmText?: string;
449
+ /** Alias for confirmText (schema compatibility) */
450
+ confirmLabel?: string;
451
+ /** Cancel button text */
452
+ cancelText?: string;
453
+ /** Alias for cancelText (schema compatibility) */
454
+ cancelLabel?: string;
455
+ /** Dialog variant */
456
+ variant?: unknown | string;
457
+ /** Dialog size */
458
+ size?: unknown | string;
459
+ /** Loading state for confirm button */
460
+ isLoading?: boolean | string;
461
+ /** Additional CSS classes */
462
+ className?: string;
463
+ };
464
+ 'container': {
465
+ type: 'container';
466
+ /** Maximum width */
467
+ size?: unknown | string;
468
+ /** Alias for size (pattern compatibility) */
469
+ maxWidth?: unknown | string;
470
+ /** Horizontal padding */
471
+ padding?: unknown | string;
472
+ /** Center horizontally */
473
+ center?: boolean | string;
474
+ /** Custom class name */
475
+ className?: string;
476
+ /** Children elements */
477
+ children?: unknown | string;
478
+ /** HTML element to render as */
479
+ as?: unknown | string;
480
+ };
481
+ 'control-button': {
482
+ type: 'control-button';
483
+ /** Button label text */
484
+ label?: string;
485
+ /** Icon component or emoji */
486
+ icon?: unknown | string;
487
+ /** Size variant */
488
+ size?: string;
489
+ /** Shape variant */
490
+ shape?: string;
491
+ /** Visual variant */
492
+ variant?: string;
493
+ /** Called when button is pressed */
494
+ onPress?: ((...args: unknown[]) => unknown) | string;
495
+ /** Called when button is released */
496
+ onRelease?: ((...args: unknown[]) => unknown) | string;
497
+ /** Whether the button is currently pressed */
498
+ pressed?: boolean | string;
499
+ /** Whether the button is disabled */
500
+ disabled?: boolean | string;
501
+ /** Additional CSS classes */
502
+ className?: string;
503
+ };
504
+ 'counter-template': {
505
+ type: 'counter-template';
506
+ /** Current count value */
507
+ count: number | string;
508
+ /** Minimum allowed value */
509
+ min?: number | string;
510
+ /** Maximum allowed value */
511
+ max?: number | string;
512
+ /** Step size for increment/decrement */
513
+ step?: number | string;
514
+ /** Called when increment is clicked */
515
+ onIncrement?: ((...args: unknown[]) => unknown) | string;
516
+ /** Called when decrement is clicked */
517
+ onDecrement?: ((...args: unknown[]) => unknown) | string;
518
+ /** Called when reset is clicked */
519
+ onReset?: ((...args: unknown[]) => unknown) | string;
520
+ /** Title displayed above the counter */
521
+ title?: string;
522
+ /** Show reset button */
523
+ showReset?: boolean | string;
524
+ /** Counter display size */
525
+ size?: unknown | string;
526
+ /** Template variant */
527
+ variant?: unknown | string;
528
+ /** Additional class name */
529
+ className?: string;
530
+ };
531
+ 'crud-template': {
532
+ type: 'crud-template';
533
+ /** Array of items to display */
534
+ items: unknown[] | string;
535
+ /** Whether data is loading */
536
+ isLoading?: boolean | string;
537
+ /** Error object if loading failed */
538
+ error?: unknown | string;
539
+ /** Currently selected item for editing */
540
+ selectedItem?: unknown | string;
541
+ /** Whether the create/edit modal is open */
542
+ isModalOpen?: boolean | string;
543
+ /** Current search query */
544
+ searchQuery?: string;
545
+ /** Current sort field */
546
+ sortBy?: string;
547
+ /** Current sort order */
548
+ sortOrder?: string;
549
+ /** Called to load/refresh items */
550
+ onLoad?: ((...args: unknown[]) => unknown) | string;
551
+ /** Called when creating a new item */
552
+ onCreate?: ((...args: unknown[]) => unknown) | string;
553
+ /** Called when updating an item */
554
+ onUpdate?: ((...args: unknown[]) => unknown) | string;
555
+ /** Called when deleting an item */
556
+ onDelete?: ((...args: unknown[]) => unknown) | string;
557
+ /** Called when selecting an item for editing */
558
+ onSelect?: ((...args: unknown[]) => unknown) | string;
559
+ /** Called when viewing an item */
560
+ onView?: ((...args: unknown[]) => unknown) | string;
561
+ /** Called when search query changes */
562
+ onSearch?: ((...args: unknown[]) => unknown) | string;
563
+ /** Called when sort changes */
564
+ onSort?: ((...args: unknown[]) => unknown) | string;
565
+ /** Called to open create/edit modal */
566
+ onOpenModal?: ((...args: unknown[]) => unknown) | string;
567
+ /** Called to close modal */
568
+ onCloseModal?: ((...args: unknown[]) => unknown) | string;
569
+ /** Page title */
570
+ title?: string;
571
+ /** Singular entity name for labels */
572
+ entityName?: string;
573
+ /** Table column definitions */
574
+ columns?: unknown[] | string;
575
+ /** Form field definitions for create/edit */
576
+ fields?: unknown[] | string;
577
+ /** Whether to show search input */
578
+ showSearch?: boolean | string;
579
+ /** Search input placeholder */
580
+ searchPlaceholder?: string;
581
+ /** Whether to show view action */
582
+ showViewAction?: boolean | string;
583
+ /** Template variant */
584
+ variant?: unknown | string;
585
+ /** Additional class name */
586
+ className?: string;
587
+ };
588
+ 'custom-pattern': {
589
+ type: 'custom-pattern';
590
+ /** HTML element to render */
591
+ component: unknown | string;
592
+ /** Tailwind classes */
593
+ className?: string;
594
+ /** Token path(s) for design token resolution */
595
+ token?: string | unknown[];
596
+ /** Text content (for leaf elements) */
597
+ content?: string;
598
+ /** Event to emit on click (REQUIRED for interactive elements) */
599
+ action?: string;
600
+ /** Event payload */
601
+ payload?: Record<string, unknown> | string;
602
+ /** Nested children patterns */
603
+ children?: unknown | string;
604
+ /** Image source (for img elements) */
605
+ src?: string;
606
+ /** Image alt text (for img elements) */
607
+ alt?: string;
608
+ /** Link href (for a elements) */
609
+ href?: string;
610
+ /** Open link in new tab */
611
+ external?: boolean | string;
612
+ /** Disabled state */
613
+ disabled?: boolean | string;
614
+ /** Additional HTML attributes */
615
+ htmlProps?: Record<string, unknown> | string;
616
+ };
617
+ 'd-pad': {
618
+ type: 'd-pad';
619
+ /** Called when a direction is pressed/released */
620
+ onDirection: ((...args: unknown[]) => unknown) | string;
621
+ /** Size variant */
622
+ size?: string;
623
+ /** Whether to include diagonal buttons */
624
+ includeDiagonals?: boolean | string;
625
+ /** Additional CSS classes */
626
+ className?: string;
627
+ /** Disabled state */
628
+ disabled?: boolean | string;
629
+ };
630
+ 'dashboard-grid': {
631
+ type: 'dashboard-grid';
632
+ /** Number of columns */
633
+ columns?: number | string;
634
+ /** Gap between cells */
635
+ gap?: string;
636
+ /** Cell definitions */
637
+ cells: unknown[] | string;
638
+ /** Additional CSS classes */
639
+ className?: string;
640
+ };
641
+ 'dashboard-layout': {
642
+ type: 'dashboard-layout';
643
+ /** App name shown in sidebar */
644
+ appName?: string;
645
+ /** Logo component or URL */
646
+ logo?: unknown | string;
647
+ /** Navigation items */
648
+ navItems?: unknown[] | string;
649
+ /** Current user info (optional - auto-populated from auth context if not provided) */
650
+ user?: Record<string, unknown> | string;
651
+ /** Header actions (notifications, etc.) */
652
+ headerActions?: unknown | string;
653
+ /** Show search in header */
654
+ showSearch?: boolean | string;
655
+ /** Custom sidebar footer */
656
+ sidebarFooter?: unknown | string;
657
+ /** Callback when user clicks sign out (optional - uses auth context signOut if not provided) */
658
+ onSignOut?: ((...args: unknown[]) => unknown) | string;
659
+ };
660
+ 'detail-panel': {
661
+ type: 'detail-panel';
662
+ /** title prop */
663
+ title?: string;
664
+ /** subtitle prop */
665
+ subtitle?: string;
666
+ /** status prop */
667
+ status?: Record<string, unknown> | string;
668
+ /** avatar prop */
669
+ avatar?: unknown | string;
670
+ /** sections prop */
671
+ sections?: unknown | string;
672
+ /** Unified actions array - first action with variant='primary' is the main action */
673
+ actions?: unknown | string;
674
+ /** footer prop */
675
+ footer?: unknown | string;
676
+ /** slideOver prop */
677
+ slideOver?: boolean | string;
678
+ /** onClose prop */
679
+ onClose?: ((...args: unknown[]) => unknown) | string;
680
+ /** className prop */
681
+ className?: string;
682
+ /** Schema-based props */
683
+ entity?: string;
684
+ /** Fields to display - accepts string[] or {key, header}[] for unified interface */
685
+ fields?: unknown | string;
686
+ /** Alias for fields - backwards compatibility */
687
+ fieldNames?: unknown | string;
688
+ /** data prop */
689
+ data?: Record<string, unknown> | unknown | string;
690
+ /** isLoading prop */
691
+ isLoading?: boolean | string;
692
+ /** error prop */
693
+ error?: unknown | string;
694
+ /** Panel position (for drawer/sidebar placement) */
695
+ position?: string;
696
+ /** Panel width (CSS value, e.g., '400px', '50%') */
697
+ width?: string;
698
+ };
699
+ 'dialogue-box': {
700
+ type: 'dialogue-box';
701
+ /** Current dialogue node to display */
702
+ dialogue: unknown | string;
703
+ /** Typewriter speed in ms per character (0 = instant) */
704
+ typewriterSpeed?: number | string;
705
+ /** Position of dialogue box */
706
+ position?: string;
707
+ /** Called when text animation completes */
708
+ onComplete?: ((...args: unknown[]) => unknown) | string;
709
+ /** Called when a choice is selected */
710
+ onChoice?: ((...args: unknown[]) => unknown) | string;
711
+ /** Called when dialogue is advanced (no choices) */
712
+ onAdvance?: ((...args: unknown[]) => unknown) | string;
713
+ /** Optional className */
714
+ className?: string;
715
+ };
716
+ 'divider': {
717
+ type: 'divider';
718
+ /** Orientation of the divider @default 'horizontal' */
719
+ orientation?: unknown | string;
720
+ /** Text label to display in the divider */
721
+ label?: string;
722
+ /** Line style variant @default 'solid' */
723
+ variant?: unknown | string;
724
+ /** Additional CSS classes */
725
+ className?: string;
726
+ };
727
+ 'document-viewer': {
728
+ type: 'document-viewer';
729
+ /** Document title */
730
+ title?: string;
731
+ /** Document URL (for PDF/external documents) */
732
+ src?: string;
733
+ /** Document content (for text/html/markdown) */
734
+ content?: string;
735
+ /** Document type */
736
+ documentType?: unknown | string;
737
+ /** Current page (for multi-page documents) */
738
+ currentPage?: number | string;
739
+ /** Total pages */
740
+ totalPages?: number | string;
741
+ /** Viewer height */
742
+ height?: number | string;
743
+ /** Show toolbar */
744
+ showToolbar?: boolean | string;
745
+ /** Show download button */
746
+ showDownload?: boolean | string;
747
+ /** Show print button */
748
+ showPrint?: boolean | string;
749
+ /** Actions */
750
+ actions?: unknown | string;
751
+ /** Multiple documents (tabbed view) */
752
+ documents?: unknown | string;
753
+ /** Entity name for schema-driven auto-fetch */
754
+ entity?: string;
755
+ /** Loading state */
756
+ isLoading?: boolean | string;
757
+ /** Error state */
758
+ error?: unknown | string;
759
+ /** Additional CSS classes */
760
+ className?: string;
761
+ };
762
+ 'drawer': {
763
+ type: 'drawer';
764
+ /** Whether the drawer is open (defaults to true when rendered by slot wrapper) */
765
+ isOpen?: boolean | string;
766
+ /** Callback when drawer should close (injected by slot wrapper) */
767
+ onClose?: ((...args: unknown[]) => unknown) | string;
768
+ /** Drawer title */
769
+ title?: string;
770
+ /** Drawer content (can be empty if using slot content) */
771
+ children?: unknown | string;
772
+ /** Footer content */
773
+ footer?: unknown | string;
774
+ /** Position (left or right) */
775
+ position?: unknown | string;
776
+ /** Width (CSS value or preset size) */
777
+ width?: string | unknown;
778
+ /** Show close button */
779
+ showCloseButton?: boolean | string;
780
+ /** Close on overlay click */
781
+ closeOnOverlayClick?: boolean | string;
782
+ /** Close on escape key */
783
+ closeOnEscape?: boolean | string;
784
+ /** Additional class name */
785
+ className?: string;
786
+ };
787
+ 'drawer-slot': {
788
+ type: 'drawer-slot';
789
+ /** Content to display in the drawer */
790
+ children?: unknown | string;
791
+ /** Override drawer title (extracted from children if not provided) */
792
+ title?: string;
793
+ /** Drawer position */
794
+ position?: unknown | string;
795
+ /** Drawer size */
796
+ size?: unknown | string;
797
+ /** Custom class name */
798
+ className?: string;
799
+ };
800
+ 'empty-state': {
801
+ type: 'empty-state';
802
+ /** Icon to display. Accepts either: - A Lucide icon component (LucideIcon) - A string icon name (e.g., "check-circle", "x-circle") */
803
+ icon?: unknown | string;
804
+ /** Primary text to display - use title or message (message is alias for backwards compat) */
805
+ title?: string;
806
+ /** Alias for title - used by schema patterns */
807
+ message?: string;
808
+ /** description prop */
809
+ description?: string;
810
+ /** actionLabel prop */
811
+ actionLabel?: string;
812
+ /** onAction prop */
813
+ onAction?: ((...args: unknown[]) => unknown) | string;
814
+ /** className prop */
815
+ className?: string;
816
+ /** Destructive styling for confirmation dialogs */
817
+ destructive?: boolean | string;
818
+ /** Variant for color styling */
819
+ variant?: string;
820
+ };
821
+ 'entity-cards': {
822
+ type: 'entity-cards';
823
+ /** Minimum width of each card (default: 280px) */
824
+ minCardWidth?: number | string;
825
+ /** Maximum number of columns */
826
+ maxCols?: number | string;
827
+ /** Gap between cards */
828
+ gap?: unknown | string;
829
+ /** Align cards vertically in their cells */
830
+ alignItems?: string;
831
+ /** Custom class name */
832
+ className?: string;
833
+ /** Children elements (cards) - optional when using entity/data props */
834
+ children?: unknown | string;
835
+ /** Entity type for data-bound usage */
836
+ entity?: string;
837
+ /** Fields to display - accepts string[] or {key, header}[] for unified interface */
838
+ fields?: unknown | string;
839
+ /** Alias for fields - backwards compatibility */
840
+ fieldNames?: unknown | string;
841
+ /** Alias for fields - backwards compatibility */
842
+ columns?: unknown | string;
843
+ /** Data array for data-bound usage - accepts readonly for generated const arrays */
844
+ data?: unknown | string;
845
+ /** Loading state indicator */
846
+ isLoading?: boolean | string;
847
+ /** Error state */
848
+ error?: unknown | string;
849
+ /** Actions for each card item (schema-driven) */
850
+ itemActions?: unknown | string;
851
+ /** Callback when a card is clicked */
852
+ onCardClick?: ((...args: unknown[]) => unknown) | string;
853
+ /** Enable server-side pagination */
854
+ enablePagination?: boolean | string;
855
+ /** Items per page (default: 20) */
856
+ pageSize?: number | string;
857
+ /** Show total count in pagination */
858
+ showTotal?: boolean | string;
859
+ /** Filter configuration for entity data */
860
+ filter?: Record<string, unknown> | string;
861
+ /** Query singleton binding for filter/sort state. When provided, syncs with the query singleton for filtering and sorting. Example: "@TaskQuery" */
862
+ query?: string;
863
+ };
864
+ 'entity-list': {
865
+ type: 'entity-list';
866
+ /** Entity name for auto-fetch OR data array (backwards compatible) */
867
+ entity?: unknown[] | unknown | string;
868
+ /** Data array - primary prop for data */
869
+ data?: unknown[] | unknown | string;
870
+ /** Loading state */
871
+ isLoading?: boolean | string;
872
+ /** Error state */
873
+ error?: unknown | string;
874
+ /** selectable prop */
875
+ selectable?: boolean | string;
876
+ /** selectedItems prop */
877
+ selectedItems?: unknown | string;
878
+ /** onSelectionChange prop */
879
+ onSelectionChange?: ((...args: unknown[]) => unknown) | string;
880
+ /** Item actions - schema-driven or function-based */
881
+ itemActions?: ((...args: unknown[]) => unknown) | unknown | string;
882
+ /** showDividers prop */
883
+ showDividers?: boolean | string;
884
+ /** variant prop */
885
+ variant?: string;
886
+ /** emptyMessage prop */
887
+ emptyMessage?: string;
888
+ /** className prop */
889
+ className?: string;
890
+ /** renderItem prop */
891
+ renderItem?: ((...args: unknown[]) => unknown) | string;
892
+ /** children prop */
893
+ children?: unknown | string;
894
+ /** onItemAction prop */
895
+ onItemAction?: ((...args: unknown[]) => unknown) | string;
896
+ /** onRowClick prop */
897
+ onRowClick?: ((...args: unknown[]) => unknown) | string;
898
+ /** Fields to display - accepts string[] or {key, header}[] for unified interface */
899
+ fields?: unknown | string;
900
+ /** Alias for fields - backwards compatibility */
901
+ fieldNames?: unknown | string;
902
+ /** Query singleton binding for filter/sort state. When provided, syncs with the query singleton for filtering and sorting. Example: "@TaskQuery" */
903
+ query?: string;
904
+ /** Entity type name for display */
905
+ entityType?: string;
906
+ };
907
+ 'entity-table': {
908
+ type: 'entity-table';
909
+ /** Fields to display - accepts string[] or Column[] for unified interface. Alias for columns */
910
+ fields?: unknown | string;
911
+ /** Columns can be Column objects or simple string field names - accepts readonly for generated const arrays */
912
+ columns?: unknown | string;
913
+ /** Data array - primary prop for data. Accepts readonly or mutable arrays, and unknown for generated components */
914
+ data?: unknown | unknown[] | string;
915
+ /** Entity name for auto-fetch OR data array (backwards compatible) */
916
+ entity?: string | unknown | unknown[];
917
+ /** Item actions from generated code - maps to rowActions */
918
+ itemActions?: unknown | string;
919
+ /** Loading state indicator */
920
+ isLoading?: boolean | string;
921
+ /** Error state */
922
+ error?: unknown | string;
923
+ /** emptyIcon prop */
924
+ emptyIcon?: unknown | string;
925
+ /** emptyTitle prop */
926
+ emptyTitle?: string;
927
+ /** emptyDescription prop */
928
+ emptyDescription?: string;
929
+ /** emptyAction prop */
930
+ emptyAction?: Record<string, unknown> | string;
931
+ /** Selection */
932
+ selectable?: boolean | string;
933
+ /** selectedIds prop */
934
+ selectedIds?: unknown | string;
935
+ /** onSelectionChange prop */
936
+ onSelectionChange?: ((...args: unknown[]) => unknown) | string;
937
+ /** Sorting */
938
+ sortBy?: string;
939
+ /** sortDirection prop */
940
+ sortDirection?: string;
941
+ /** onSort prop */
942
+ onSort?: ((...args: unknown[]) => unknown) | string;
943
+ /** Pagination (manual control) */
944
+ pagination?: Record<string, unknown> | string;
945
+ /** Server-side pagination (automatic when enabled) */
946
+ enablePagination?: boolean | string;
947
+ /** Items per page for automatic pagination (default: 20) */
948
+ defaultPageSize?: number | string;
949
+ /** Show total count in pagination */
950
+ showTotal?: boolean | string;
951
+ /** Search */
952
+ searchable?: boolean | string;
953
+ /** searchValue prop */
954
+ searchValue?: string;
955
+ /** onSearch prop */
956
+ onSearch?: ((...args: unknown[]) => unknown) | string;
957
+ /** searchPlaceholder prop */
958
+ searchPlaceholder?: string;
959
+ /** Row click navigation */
960
+ onRowClick?: ((...args: unknown[]) => unknown) | string;
961
+ /** Row actions */
962
+ rowActions?: unknown | string;
963
+ /** Bulk actions */
964
+ bulkActions?: unknown[] | string;
965
+ /** Header actions */
966
+ headerActions?: unknown | string;
967
+ /** Query singleton binding for filter/sort state. When provided, syncs with the query singleton for filtering and sorting. Example: "@TaskQuery" */
968
+ query?: string;
969
+ /** className prop */
970
+ className?: string;
971
+ };
972
+ 'error-state': {
973
+ type: 'error-state';
974
+ /** title prop */
975
+ title?: string;
976
+ /** Error message to display */
977
+ message?: string;
978
+ /** Alias for message (schema compatibility) */
979
+ description?: string;
980
+ /** onRetry prop */
981
+ onRetry?: ((...args: unknown[]) => unknown) | string;
982
+ /** className prop */
983
+ className?: string;
984
+ };
985
+ 'filter-group': {
986
+ type: 'filter-group';
987
+ /** Entity name to filter */
988
+ entity: string;
989
+ /** Filter definitions from schema */
990
+ filters: unknown | string;
991
+ /** Callback when a filter changes - for EntityStore integration */
992
+ onFilterChange?: ((...args: unknown[]) => unknown) | string;
993
+ /** Callback to clear all filters */
994
+ onClearAll?: ((...args: unknown[]) => unknown) | string;
995
+ /** Additional CSS classes */
996
+ className?: string;
997
+ /** Variant style */
998
+ variant?: string;
999
+ /** Show filter icon */
1000
+ showIcon?: boolean | string;
1001
+ /** Query singleton binding for state management. When provided, syncs filter state with the query singleton. Example: "@TaskQuery" */
1002
+ query?: string;
1003
+ /** Loading state indicator */
1004
+ isLoading?: boolean | string;
1005
+ };
1006
+ 'flex': {
1007
+ type: 'flex';
1008
+ /** Flex direction */
1009
+ direction?: unknown | string;
1010
+ /** Flex wrap */
1011
+ wrap?: unknown | string;
1012
+ /** Align items */
1013
+ align?: unknown | string;
1014
+ /** Justify content */
1015
+ justify?: unknown | string;
1016
+ /** Gap between items */
1017
+ gap?: unknown | string;
1018
+ /** Inline flex */
1019
+ inline?: boolean | string;
1020
+ /** Flex grow */
1021
+ grow?: boolean | number | string;
1022
+ /** Flex shrink */
1023
+ shrink?: boolean | number | string;
1024
+ /** Flex basis */
1025
+ basis?: string | number;
1026
+ /** Custom class name */
1027
+ className?: string;
1028
+ /** Children elements */
1029
+ children: unknown | string;
1030
+ /** HTML element to render as */
1031
+ as?: unknown | string;
1032
+ };
1033
+ 'floating-action-button': {
1034
+ type: 'floating-action-button';
1035
+ /** Single action (if only one action, button will directly trigger onClick) */
1036
+ action?: Record<string, unknown> | string;
1037
+ /** Multiple actions (if provided, button will expand to show all actions) */
1038
+ actions?: unknown[] | string;
1039
+ /** Icon name (simplified API for pattern compatibility) */
1040
+ icon?: string;
1041
+ /** Click handler (simplified API for pattern compatibility) */
1042
+ onClick?: ((...args: unknown[]) => unknown) | string;
1043
+ /** Variant (simplified API for pattern compatibility) */
1044
+ variant?: string;
1045
+ /** Button position @default 'bottom-right' */
1046
+ position?: string;
1047
+ /** Additional CSS classes */
1048
+ className?: string;
1049
+ };
1050
+ 'form': {
1051
+ type: 'form';
1052
+ /** Form fields (traditional React children) */
1053
+ children?: unknown | string;
1054
+ /** Submit handler - receives form data, or event name string for trait dispatch */
1055
+ onSubmit?: ((...args: unknown[]) => unknown) | string;
1056
+ /** Cancel handler - function or event name string for trait dispatch */
1057
+ onCancel?: ((...args: unknown[]) => unknown) | string;
1058
+ /** Form layout */
1059
+ layout?: string;
1060
+ /** Gap between fields */
1061
+ gap?: string;
1062
+ /** Additional CSS classes */
1063
+ className?: string;
1064
+ /** Schema-based props */
1065
+ entity?: string;
1066
+ /** Form mode - 'create' for new records, 'edit' for updating existing */
1067
+ mode?: string;
1068
+ /** Fields definition (schema format) - accepts readonly for generated const arrays */
1069
+ fields?: unknown | string;
1070
+ /** Initial form data */
1071
+ initialData?: Record<string, unknown> | unknown | string;
1072
+ /** Loading state */
1073
+ isLoading?: boolean | string;
1074
+ /** Error state */
1075
+ error?: unknown | string;
1076
+ /** Submit button label */
1077
+ submitLabel?: string;
1078
+ /** Cancel button label (if provided, shows cancel button) */
1079
+ cancelLabel?: string;
1080
+ /** Show cancel button (defaults to true for schema forms) */
1081
+ showCancel?: boolean | string;
1082
+ /** Form title (used by ModalSlot to extract title) */
1083
+ title?: string;
1084
+ /** Event dispatch props (for trait state machine integration) */
1085
+ submitEvent?: string;
1086
+ /** Event to dispatch on cancel (defaults to 'CANCEL') */
1087
+ cancelEvent?: string;
1088
+ /** Relation data props */
1089
+ relationsData?: Record<string, unknown> | string;
1090
+ /** Loading state for relation data: { fieldName: boolean } */
1091
+ relationsLoading?: Record<string, unknown> | string;
1092
+ /** Inspection form extensions */
1093
+ conditionalFields?: Record<string, unknown> | boolean | string;
1094
+ /** Hidden calculations that emit GLOBAL_VARIABLE_SET on field change (boolean true means enabled but config loaded separately) */
1095
+ hiddenCalculations?: unknown[] | boolean | string;
1096
+ /** Violation conditions that emit VIOLATION_DETECTED when met (boolean true means enabled but config loaded separately) */
1097
+ violationTriggers?: unknown[] | boolean | string;
1098
+ /** Context for S-expression evaluation - accepts flexible types from generated code */
1099
+ evaluationContext?: unknown | Record<string, unknown> | string;
1100
+ /** Nested form sections with optional conditions */
1101
+ sections?: unknown[] | string;
1102
+ /** Callback when any field value changes */
1103
+ onFieldChange?: ((...args: unknown[]) => unknown) | string;
1104
+ /** Config path for form configuration (schema-driven) */
1105
+ configPath?: string;
1106
+ /** Whether the form supports repeatable entries */
1107
+ repeatable?: boolean | string;
1108
+ };
1109
+ 'form-actions': {
1110
+ type: 'form-actions';
1111
+ /** Button group content (Button components) - use this OR primary/secondary */
1112
+ children?: unknown | string;
1113
+ /** Primary action button config (for form-actions pattern) Accepts Readonly for compatibility with generated const objects */
1114
+ primary?: unknown | string;
1115
+ /** Secondary action buttons config (for form-actions pattern) Accepts readonly array for compatibility with generated const arrays */
1116
+ secondary?: unknown | string;
1117
+ /** Visual variant @default 'default' */
1118
+ variant?: unknown | string;
1119
+ /** Orientation @default 'horizontal' */
1120
+ orientation?: string;
1121
+ /** Additional CSS classes */
1122
+ className?: string;
1123
+ /** Entity type for filter-group pattern (schema metadata) */
1124
+ entity?: string;
1125
+ /** Filter definitions for filter-group pattern */
1126
+ filters?: unknown | string;
1127
+ };
1128
+ 'form-field': {
1129
+ type: 'form-field';
1130
+ /** label prop */
1131
+ label: string;
1132
+ /** required prop */
1133
+ required?: boolean | string;
1134
+ /** error prop */
1135
+ error?: string;
1136
+ /** hint prop */
1137
+ hint?: string;
1138
+ /** className prop */
1139
+ className?: string;
1140
+ /** children prop */
1141
+ children: unknown | string;
1142
+ };
1143
+ 'form-section': {
1144
+ type: 'form-section';
1145
+ /** Form fields (traditional React children) */
1146
+ children?: unknown | string;
1147
+ /** Submit handler - receives form data, or event name string for trait dispatch */
1148
+ onSubmit?: ((...args: unknown[]) => unknown) | string;
1149
+ /** Cancel handler - function or event name string for trait dispatch */
1150
+ onCancel?: ((...args: unknown[]) => unknown) | string;
1151
+ /** Form layout */
1152
+ layout?: string;
1153
+ /** Gap between fields */
1154
+ gap?: string;
1155
+ /** Additional CSS classes */
1156
+ className?: string;
1157
+ /** Schema-based props */
1158
+ entity?: string;
1159
+ /** Form mode - 'create' for new records, 'edit' for updating existing */
1160
+ mode?: string;
1161
+ /** Fields definition (schema format) - accepts readonly for generated const arrays */
1162
+ fields?: unknown | string;
1163
+ /** Initial form data */
1164
+ initialData?: Record<string, unknown> | unknown | string;
1165
+ /** Loading state */
1166
+ isLoading?: boolean | string;
1167
+ /** Error state */
1168
+ error?: unknown | string;
1169
+ /** Submit button label */
1170
+ submitLabel?: string;
1171
+ /** Cancel button label (if provided, shows cancel button) */
1172
+ cancelLabel?: string;
1173
+ /** Show cancel button (defaults to true for schema forms) */
1174
+ showCancel?: boolean | string;
1175
+ /** Form title (used by ModalSlot to extract title) */
1176
+ title?: string;
1177
+ /** Event dispatch props (for trait state machine integration) */
1178
+ submitEvent?: string;
1179
+ /** Event to dispatch on cancel (defaults to 'CANCEL') */
1180
+ cancelEvent?: string;
1181
+ /** Relation data props */
1182
+ relationsData?: Record<string, unknown> | string;
1183
+ /** Loading state for relation data: { fieldName: boolean } */
1184
+ relationsLoading?: Record<string, unknown> | string;
1185
+ /** Inspection form extensions */
1186
+ conditionalFields?: Record<string, unknown> | boolean | string;
1187
+ /** Hidden calculations that emit GLOBAL_VARIABLE_SET on field change (boolean true means enabled but config loaded separately) */
1188
+ hiddenCalculations?: unknown[] | boolean | string;
1189
+ /** Violation conditions that emit VIOLATION_DETECTED when met (boolean true means enabled but config loaded separately) */
1190
+ violationTriggers?: unknown[] | boolean | string;
1191
+ /** Context for S-expression evaluation - accepts flexible types from generated code */
1192
+ evaluationContext?: unknown | Record<string, unknown> | string;
1193
+ /** Nested form sections with optional conditions */
1194
+ sections?: unknown[] | string;
1195
+ /** Callback when any field value changes */
1196
+ onFieldChange?: ((...args: unknown[]) => unknown) | string;
1197
+ /** Config path for form configuration (schema-driven) */
1198
+ configPath?: string;
1199
+ /** Whether the form supports repeatable entries */
1200
+ repeatable?: boolean | string;
1201
+ };
1202
+ 'form-section-header': {
1203
+ type: 'form-section-header';
1204
+ /** Section title */
1205
+ title: string;
1206
+ /** Section subtitle */
1207
+ subtitle?: string;
1208
+ /** Whether section is collapsed */
1209
+ isCollapsed?: boolean | string;
1210
+ /** Toggle collapse handler (makes header clickable) */
1211
+ onToggle?: ((...args: unknown[]) => unknown) | string;
1212
+ /** Badge text (e.g., "3 fields", "Required", "Complete") */
1213
+ badge?: string;
1214
+ /** Badge variant */
1215
+ badgeVariant?: string;
1216
+ /** Icon name to show before title */
1217
+ icon?: string;
1218
+ /** Whether section has validation errors */
1219
+ hasErrors?: boolean | string;
1220
+ /** Whether section is complete */
1221
+ isComplete?: boolean | string;
1222
+ /** Additional CSS classes */
1223
+ className?: string;
1224
+ };
1225
+ 'form-template': {
1226
+ type: 'form-template';
1227
+ /** Current form field values */
1228
+ formData: Record<string, unknown> | string;
1229
+ /** Whether form is being submitted */
1230
+ isSubmitting?: boolean | string;
1231
+ /** Whether submission was successful */
1232
+ isSuccess?: boolean | string;
1233
+ /** Error object if submission failed */
1234
+ error?: unknown | string;
1235
+ /** Field-level validation errors */
1236
+ validationErrors?: Record<string, unknown> | string;
1237
+ /** Called when form is submitted */
1238
+ onSubmit?: ((...args: unknown[]) => unknown) | string;
1239
+ /** Called when a field value changes */
1240
+ onFieldChange?: ((...args: unknown[]) => unknown) | string;
1241
+ /** Called to reset the form */
1242
+ onReset?: ((...args: unknown[]) => unknown) | string;
1243
+ /** Called to dismiss success message */
1244
+ onDismissSuccess?: ((...args: unknown[]) => unknown) | string;
1245
+ /** Form title */
1246
+ title?: string;
1247
+ /** Form subtitle/description */
1248
+ subtitle?: string;
1249
+ /** Submit button label */
1250
+ submitLabel?: string;
1251
+ /** Success message */
1252
+ successMessage?: string;
1253
+ /** Whether to show reset button */
1254
+ showReset?: boolean | string;
1255
+ /** Form field definitions */
1256
+ fields?: unknown[] | string;
1257
+ /** Template variant */
1258
+ variant?: unknown | string;
1259
+ /** Additional class name */
1260
+ className?: string;
1261
+ };
1262
+ 'game-hud': {
1263
+ type: 'game-hud';
1264
+ /** Position of the HUD */
1265
+ position?: string;
1266
+ /** Stats to display - accepts readonly for compatibility with generated const arrays */
1267
+ stats?: unknown | string;
1268
+ /** Alias for stats (schema compatibility) */
1269
+ items?: unknown | string;
1270
+ /** Schema-style elements array (alternative to stats). Converted to stats internally for backwards compatibility. */
1271
+ elements?: unknown | string;
1272
+ /** Size variant */
1273
+ size?: string;
1274
+ /** Additional CSS classes */
1275
+ className?: string;
1276
+ /** Whether to use a semi-transparent background */
1277
+ transparent?: boolean | string;
1278
+ };
1279
+ 'game-menu': {
1280
+ type: 'game-menu';
1281
+ /** Menu title */
1282
+ title: string;
1283
+ /** Optional subtitle or version */
1284
+ subtitle?: string;
1285
+ /** Menu options - accepts readonly for compatibility with generated const arrays */
1286
+ options?: unknown | string;
1287
+ /** Alias for options (schema compatibility) */
1288
+ menuItems?: unknown | string;
1289
+ /** Called when an option is selected (legacy callback, prefer event bus) */
1290
+ onSelect?: ((...args: unknown[]) => unknown) | string;
1291
+ /** Event bus for emitting UI events (optional, uses hook if not provided) */
1292
+ eventBus?: unknown | string;
1293
+ /** Background image or gradient */
1294
+ background?: string;
1295
+ /** Logo image URL */
1296
+ logo?: string;
1297
+ /** Additional CSS classes */
1298
+ className?: string;
1299
+ };
1300
+ 'game-over-screen': {
1301
+ type: 'game-over-screen';
1302
+ /** Screen title (e.g., "Game Over", "Victory!") */
1303
+ title: string;
1304
+ /** Optional message */
1305
+ message?: string;
1306
+ /** Stats to display */
1307
+ stats?: unknown[] | string;
1308
+ /** Action buttons */
1309
+ actions?: unknown[] | string;
1310
+ /** Alias for actions (schema compatibility) */
1311
+ menuItems?: unknown[] | string;
1312
+ /** Called when an action is selected (legacy callback, prefer event bus) */
1313
+ onAction?: ((...args: unknown[]) => unknown) | string;
1314
+ /** Event bus for emitting UI events (optional, uses hook if not provided) */
1315
+ eventBus?: unknown | string;
1316
+ /** Victory or defeat variant */
1317
+ variant?: string;
1318
+ /** High score (optional, shows "NEW HIGH SCORE!" if exceeded) */
1319
+ highScore?: number | string;
1320
+ /** Current score for high score comparison (accepts string for schema bindings) */
1321
+ currentScore?: number | string;
1322
+ /** Additional CSS classes */
1323
+ className?: string;
1324
+ };
1325
+ 'game-shell': {
1326
+ type: 'game-shell';
1327
+ /** Application / game title shown in the HUD bar */
1328
+ appName?: string;
1329
+ /** Optional HUD content rendered above the main area */
1330
+ hud?: unknown | string;
1331
+ /** Extra class name on the root container */
1332
+ className?: string;
1333
+ /** Whether to show the minimal top bar (default: true) */
1334
+ showTopBar?: boolean | string;
1335
+ };
1336
+ 'game-template': {
1337
+ type: 'game-template';
1338
+ /** Title of the game */
1339
+ title?: string;
1340
+ /** The main game canvas or content */
1341
+ children: unknown | string;
1342
+ /** HUD overlay content (scores, health, etc.) */
1343
+ hud?: unknown | string;
1344
+ /** Debug panel content */
1345
+ debugPanel?: unknown | string;
1346
+ /** Whether the debug panel is visible */
1347
+ showDebugPanel?: boolean | string;
1348
+ /** Game controls */
1349
+ controls?: Record<string, unknown> | string;
1350
+ /** Additional class name */
1351
+ className?: string;
1352
+ };
1353
+ 'generic-app-template': {
1354
+ type: 'generic-app-template';
1355
+ /** Page title */
1356
+ title: string;
1357
+ /** Subtitle or description */
1358
+ subtitle?: string;
1359
+ /** Main content */
1360
+ children: unknown | string;
1361
+ /** Header actions (buttons, links) */
1362
+ headerActions?: unknown | string;
1363
+ /** Footer content */
1364
+ footer?: unknown | string;
1365
+ /** Additional class name */
1366
+ className?: string;
1367
+ };
1368
+ 'graph-canvas': {
1369
+ type: 'graph-canvas';
1370
+ /** Graph title */
1371
+ title?: string;
1372
+ /** Graph nodes */
1373
+ nodes?: unknown | string;
1374
+ /** Graph edges */
1375
+ edges?: unknown | string;
1376
+ /** Canvas height */
1377
+ height?: number | string;
1378
+ /** Show node labels */
1379
+ showLabels?: boolean | string;
1380
+ /** Enable zoom/pan */
1381
+ interactive?: boolean | string;
1382
+ /** Enable node dragging */
1383
+ draggable?: boolean | string;
1384
+ /** Actions */
1385
+ actions?: unknown | string;
1386
+ /** On node click */
1387
+ onNodeClick?: ((...args: unknown[]) => unknown) | string;
1388
+ /** Node click event */
1389
+ nodeClickEvent?: string;
1390
+ /** Layout algorithm */
1391
+ layout?: string;
1392
+ /** Entity name for schema-driven auto-fetch */
1393
+ entity?: string;
1394
+ /** Loading state */
1395
+ isLoading?: boolean | string;
1396
+ /** Error state */
1397
+ error?: unknown | string;
1398
+ /** Additional CSS classes */
1399
+ className?: string;
1400
+ };
1401
+ 'grid': {
1402
+ type: 'grid';
1403
+ /** Number of columns (can be responsive object) */
1404
+ cols?: unknown | unknown | string;
1405
+ /** Number of rows */
1406
+ rows?: number | string;
1407
+ /** Gap between items */
1408
+ gap?: unknown | string;
1409
+ /** Row gap (overrides gap for rows) */
1410
+ rowGap?: unknown | string;
1411
+ /** Column gap (overrides gap for columns) */
1412
+ colGap?: unknown | string;
1413
+ /** Align items on block axis */
1414
+ alignItems?: unknown | string;
1415
+ /** Justify items on inline axis */
1416
+ justifyItems?: unknown | string;
1417
+ /** Auto-flow direction */
1418
+ flow?: string;
1419
+ /** Custom class name */
1420
+ className?: string;
1421
+ /** Inline styles */
1422
+ style?: Record<string, unknown> | string;
1423
+ /** Children elements */
1424
+ children: unknown | string;
1425
+ /** HTML element to render as */
1426
+ as?: unknown | string;
1427
+ };
1428
+ 'header': {
1429
+ type: 'header';
1430
+ /** Logo/Brand content */
1431
+ logo?: unknown | string;
1432
+ /** Logo image source */
1433
+ logoSrc?: string;
1434
+ /** Brand/App name */
1435
+ brandName?: string;
1436
+ /** Navigation items (for desktop header variant) */
1437
+ navigationItems?: unknown[] | string;
1438
+ /** Show menu toggle button @default true */
1439
+ showMenuToggle?: boolean | string;
1440
+ /** Is menu open (for toggle icon) */
1441
+ isMenuOpen?: boolean | string;
1442
+ /** Menu toggle callback */
1443
+ onMenuToggle?: ((...args: unknown[]) => unknown) | string;
1444
+ /** Show search input @default false */
1445
+ showSearch?: boolean | string;
1446
+ /** Search placeholder */
1447
+ searchPlaceholder?: string;
1448
+ /** Search callback */
1449
+ onSearch?: ((...args: unknown[]) => unknown) | string;
1450
+ /** User avatar configuration */
1451
+ userAvatar?: Record<string, unknown> | string;
1452
+ /** User name (display name or email) */
1453
+ userName?: string;
1454
+ /** Callback when user avatar is clicked */
1455
+ onUserClick?: ((...args: unknown[]) => unknown) | string;
1456
+ /** Action buttons (right side) */
1457
+ actions?: unknown | string;
1458
+ /** Sticky header @default true */
1459
+ sticky?: boolean | string;
1460
+ /** Variant - mobile shows menu toggle, desktop shows full nav @default 'mobile' */
1461
+ variant?: string;
1462
+ /** Callback when logo/brand is clicked */
1463
+ onLogoClick?: ((...args: unknown[]) => unknown) | string;
1464
+ /** Additional CSS classes */
1465
+ className?: string;
1466
+ };
1467
+ 'health-bar': {
1468
+ type: 'health-bar';
1469
+ /** Current health value */
1470
+ current: number | string;
1471
+ /** Maximum health value */
1472
+ max: number | string;
1473
+ /** Display format */
1474
+ format?: string;
1475
+ /** Size variant */
1476
+ size?: string;
1477
+ /** Additional CSS classes */
1478
+ className?: string;
1479
+ /** Animation on change */
1480
+ animated?: boolean | string;
1481
+ };
1482
+ 'icon': {
1483
+ type: 'icon';
1484
+ /** Lucide icon component (preferred for type-safe usage) */
1485
+ icon?: unknown | string;
1486
+ /** Icon name as string (resolved from iconMap) */
1487
+ name?: string;
1488
+ /** Size of the icon */
1489
+ size?: unknown | string;
1490
+ /** Color class (Tailwind color class) or 'inherit' for theme default */
1491
+ color?: string;
1492
+ /** Animation type */
1493
+ animation?: unknown | string;
1494
+ /** Additional CSS classes */
1495
+ className?: string;
1496
+ /** Icon stroke width - uses theme default if not specified */
1497
+ strokeWidth?: number | string;
1498
+ /** Inline style */
1499
+ style?: Record<string, unknown> | string;
1500
+ };
1501
+ 'input': {
1502
+ type: 'input';
1503
+ /** error prop */
1504
+ error?: string;
1505
+ /** leftIcon prop */
1506
+ leftIcon?: unknown | string;
1507
+ /** rightIcon prop */
1508
+ rightIcon?: unknown | string;
1509
+ /** Lucide icon component for left side (convenience prop) */
1510
+ icon?: unknown | string;
1511
+ /** Show clear button when input has value */
1512
+ clearable?: boolean | string;
1513
+ /** Callback when clear button is clicked */
1514
+ onClear?: ((...args: unknown[]) => unknown) | string;
1515
+ /** Options for select type */
1516
+ options?: unknown[] | string;
1517
+ /** Rows for textarea type */
1518
+ rows?: number | string;
1519
+ /** onChange handler - accepts events from input, select, or textarea */
1520
+ onChange?: unknown | string;
1521
+ /** Input type - supports 'select' and 'textarea' in addition to standard types */
1522
+ inputType?: string;
1523
+ };
1524
+ 'input-group': {
1525
+ type: 'input-group';
1526
+ /** Left addon (icon, button, or text) */
1527
+ leftAddon?: unknown | unknown | string;
1528
+ /** Right addon (icon, button, or text) */
1529
+ rightAddon?: unknown | unknown | string;
1530
+ /** Additional CSS classes */
1531
+ className?: string;
1532
+ };
1533
+ 'inventory-panel': {
1534
+ type: 'inventory-panel';
1535
+ /** Array of items in inventory */
1536
+ items: unknown[] | string;
1537
+ /** Total number of slots */
1538
+ slots: number | string;
1539
+ /** Number of columns in grid */
1540
+ columns: number | string;
1541
+ /** Currently selected slot index */
1542
+ selectedSlot?: number | string;
1543
+ /** Called when a slot is selected */
1544
+ onSelectSlot: ((...args: unknown[]) => unknown) | string;
1545
+ /** Called when an item is used (double-click or Enter) */
1546
+ onUseItem?: ((...args: unknown[]) => unknown) | string;
1547
+ /** Called when an item is dropped */
1548
+ onDropItem?: ((...args: unknown[]) => unknown) | string;
1549
+ /** Show item tooltips on hover */
1550
+ showTooltips?: boolean | string;
1551
+ /** Optional className */
1552
+ className?: string;
1553
+ /** Slot size in pixels */
1554
+ slotSize?: number | string;
1555
+ };
1556
+ 'isometric-canvas': {
1557
+ type: 'isometric-canvas';
1558
+ /** --- Closed-circuit props (MANDATORY) --- */
1559
+ className?: string;
1560
+ /** Loading state indicator */
1561
+ isLoading?: boolean | string;
1562
+ /** Error state */
1563
+ error?: unknown | string;
1564
+ /** Entity name for schema-driven auto-fetch */
1565
+ entity?: string;
1566
+ /** --- Grid data --- */
1567
+ tiles?: unknown[] | string;
1568
+ /** Array of units on the board */
1569
+ units?: unknown[] | string;
1570
+ /** Array of features (resources, portals, buildings, etc.) */
1571
+ features?: unknown[] | string;
1572
+ /** --- Interaction state --- */
1573
+ selectedUnitId?: string;
1574
+ /** Valid move positions (shown as pulsing green highlights) */
1575
+ validMoves?: unknown[] | string;
1576
+ /** Attack target positions (shown as pulsing red highlights) */
1577
+ attackTargets?: unknown[] | string;
1578
+ /** Hovered tile position */
1579
+ hoveredTile?: Record<string, unknown> | string;
1580
+ /** --- Event handlers --- */
1581
+ onTileClick?: ((...args: unknown[]) => unknown) | string;
1582
+ /** Unit click handler */
1583
+ onUnitClick?: ((...args: unknown[]) => unknown) | string;
1584
+ /** Tile hover handler */
1585
+ onTileHover?: ((...args: unknown[]) => unknown) | string;
1586
+ /** Tile leave handler */
1587
+ onTileLeave?: ((...args: unknown[]) => unknown) | string;
1588
+ /** --- Rendering options --- */
1589
+ scale?: number | string;
1590
+ /** Show debug grid lines and coordinates */
1591
+ debug?: boolean | string;
1592
+ /** Background image URL tiled behind the isometric grid */
1593
+ backgroundImage?: string;
1594
+ /** Toggle minimap overlay */
1595
+ showMinimap?: boolean | string;
1596
+ /** Enable camera pan/zoom controls */
1597
+ enableCamera?: boolean | string;
1598
+ /** Extra scale multiplier for unit draw size. 1 = default. */
1599
+ unitScale?: number | string;
1600
+ /** --- Asset resolution (project-agnostic) --- */
1601
+ getTerrainSprite?: ((...args: unknown[]) => unknown) | string;
1602
+ /** Resolve feature sprite URL from feature type key */
1603
+ getFeatureSprite?: ((...args: unknown[]) => unknown) | string;
1604
+ /** Resolve unit static sprite URL */
1605
+ getUnitSprite?: ((...args: unknown[]) => unknown) | string;
1606
+ /** Resolve animated sprite sheet frame for a unit */
1607
+ resolveUnitFrame?: ((...args: unknown[]) => unknown) | string;
1608
+ /** Additional sprite URLs to preload (e.g., effect sprites) */
1609
+ effectSpriteUrls?: unknown[] | string;
1610
+ /** Callback to draw canvas effects after units */
1611
+ onDrawEffects?: ((...args: unknown[]) => unknown) | string;
1612
+ /** Whether there are active effects — keeps RAF loop alive */
1613
+ hasActiveEffects?: boolean | string;
1614
+ /** --- Remote asset loading --- */
1615
+ assetBaseUrl?: string;
1616
+ /** Manifest mapping entity keys to relative sprite paths. Combined with assetBaseUrl to produce full URLs. Used as a fallback when inline URLs and callbacks don't resolve. */
1617
+ assetManifest?: Record<string, unknown> | string;
1618
+ };
1619
+ 'label': {
1620
+ type: 'label';
1621
+ /** required prop */
1622
+ required?: boolean | string;
1623
+ };
1624
+ 'law-reference-tooltip': {
1625
+ type: 'law-reference-tooltip';
1626
+ /** The law reference to display */
1627
+ reference: unknown | string;
1628
+ /** Children element that triggers the tooltip */
1629
+ children: unknown | string;
1630
+ /** Tooltip position */
1631
+ position?: string;
1632
+ /** Additional CSS classes */
1633
+ className?: string;
1634
+ };
1635
+ 'layout-pattern': {
1636
+ type: 'layout-pattern';
1637
+ /** Nested pattern configurations - rendered recursively */
1638
+ children?: unknown | string;
1639
+ /** Additional CSS classes */
1640
+ className?: string;
1641
+ /** Inline styles */
1642
+ style?: Record<string, unknown> | string;
1643
+ };
1644
+ 'list-template': {
1645
+ type: 'list-template';
1646
+ /** Array of list items */
1647
+ items: unknown[] | string;
1648
+ /** Whether data is loading */
1649
+ isLoading?: boolean | string;
1650
+ /** Error object if loading failed */
1651
+ error?: unknown | string;
1652
+ /** Current filter value */
1653
+ filter?: unknown | string;
1654
+ /** Called when a new item is added */
1655
+ onAdd?: ((...args: unknown[]) => unknown) | string;
1656
+ /** Called when an item is toggled */
1657
+ onToggle?: ((...args: unknown[]) => unknown) | string;
1658
+ /** Called when an item is deleted */
1659
+ onDelete?: ((...args: unknown[]) => unknown) | string;
1660
+ /** Called when filter changes */
1661
+ onFilterChange?: ((...args: unknown[]) => unknown) | string;
1662
+ /** Called to retry loading */
1663
+ onRetry?: ((...args: unknown[]) => unknown) | string;
1664
+ /** Title displayed above the list */
1665
+ title?: string;
1666
+ /** Placeholder for the input field */
1667
+ placeholder?: string;
1668
+ /** Whether to show filter buttons */
1669
+ showFilters?: boolean | string;
1670
+ /** Whether to show item count */
1671
+ showCount?: boolean | string;
1672
+ /** Message shown when list is empty */
1673
+ emptyMessage?: string;
1674
+ /** Template variant */
1675
+ variant?: unknown | string;
1676
+ /** Additional class name */
1677
+ className?: string;
1678
+ };
1679
+ 'loading-state': {
1680
+ type: 'loading-state';
1681
+ /** title prop */
1682
+ title?: string;
1683
+ /** message prop */
1684
+ message?: string;
1685
+ /** className prop */
1686
+ className?: string;
1687
+ };
1688
+ 'master-detail': {
1689
+ type: 'master-detail';
1690
+ /** Master panel content (usually a list) */
1691
+ master: unknown | string;
1692
+ /** Detail panel content */
1693
+ detail: unknown | string;
1694
+ /** Content shown when nothing is selected */
1695
+ emptyDetail?: unknown | string;
1696
+ /** Whether an item is currently selected */
1697
+ hasSelection?: boolean | string;
1698
+ /** Width of master panel (e.g., '350px', '30%') */
1699
+ masterWidth?: string;
1700
+ /** Additional CSS classes */
1701
+ className?: string;
1702
+ /** Class for master pane */
1703
+ masterClassName?: string;
1704
+ /** Class for detail pane */
1705
+ detailClassName?: string;
1706
+ };
1707
+ 'media-gallery': {
1708
+ type: 'media-gallery';
1709
+ /** Gallery title */
1710
+ title?: string;
1711
+ /** Media items */
1712
+ items?: unknown | string;
1713
+ /** Schema-driven data */
1714
+ data?: unknown | string;
1715
+ /** Column count */
1716
+ columns?: number | string;
1717
+ /** Enable item selection */
1718
+ selectable?: boolean | string;
1719
+ /** Selected item IDs */
1720
+ selectedItems?: unknown | string;
1721
+ /** Selection change callback */
1722
+ onSelectionChange?: ((...args: unknown[]) => unknown) | string;
1723
+ /** Show upload button */
1724
+ showUpload?: boolean | string;
1725
+ /** Actions */
1726
+ actions?: unknown | string;
1727
+ /** Aspect ratio for thumbnails */
1728
+ aspectRatio?: string;
1729
+ /** Entity name for schema-driven auto-fetch */
1730
+ entity?: string;
1731
+ /** Loading state */
1732
+ isLoading?: boolean | string;
1733
+ /** Error state */
1734
+ error?: unknown | string;
1735
+ /** Additional CSS classes */
1736
+ className?: string;
1737
+ };
1738
+ 'menu': {
1739
+ type: 'menu';
1740
+ /** Menu trigger element */
1741
+ trigger: unknown | string;
1742
+ /** Menu items */
1743
+ items: unknown[] | string;
1744
+ /** Menu position */
1745
+ position?: unknown | string;
1746
+ /** Additional CSS classes */
1747
+ className?: string;
1748
+ };
1749
+ 'meter': {
1750
+ type: 'meter';
1751
+ /** Current value */
1752
+ value: number | string;
1753
+ /** Minimum value */
1754
+ min?: number | string;
1755
+ /** Maximum value */
1756
+ max?: number | string;
1757
+ /** Display label */
1758
+ label?: string;
1759
+ /** Unit suffix (e.g., '%', 'MB', 'credits') */
1760
+ unit?: string;
1761
+ /** Display variant */
1762
+ variant?: unknown | string;
1763
+ /** Color thresholds */
1764
+ thresholds?: unknown | string;
1765
+ /** Number of segments (for segmented variant) */
1766
+ segments?: number | string;
1767
+ /** Show value text */
1768
+ showValue?: boolean | string;
1769
+ /** Size (for radial variant) */
1770
+ size?: string;
1771
+ /** Actions */
1772
+ actions?: unknown | string;
1773
+ /** Entity name for schema-driven auto-fetch */
1774
+ entity?: string;
1775
+ /** Loading state */
1776
+ isLoading?: boolean | string;
1777
+ /** Error state */
1778
+ error?: unknown | string;
1779
+ /** Additional CSS classes */
1780
+ className?: string;
1781
+ };
1782
+ 'modal': {
1783
+ type: 'modal';
1784
+ /** Whether the modal is open (defaults to true when rendered by slot wrapper) */
1785
+ isOpen?: boolean | string;
1786
+ /** Callback when modal should close (injected by slot wrapper) */
1787
+ onClose?: ((...args: unknown[]) => unknown) | string;
1788
+ /** title prop */
1789
+ title?: string;
1790
+ /** Modal content (can be empty if using slot content) */
1791
+ children?: unknown | string;
1792
+ /** footer prop */
1793
+ footer?: unknown | string;
1794
+ /** size prop */
1795
+ size?: unknown | string;
1796
+ /** showCloseButton prop */
1797
+ showCloseButton?: boolean | string;
1798
+ /** closeOnOverlayClick prop */
1799
+ closeOnOverlayClick?: boolean | string;
1800
+ /** closeOnEscape prop */
1801
+ closeOnEscape?: boolean | string;
1802
+ /** className prop */
1803
+ className?: string;
1804
+ };
1805
+ 'modal-slot': {
1806
+ type: 'modal-slot';
1807
+ /** Content to display in the modal */
1808
+ children?: unknown | string;
1809
+ /** Override modal title (extracted from children if not provided) */
1810
+ title?: string;
1811
+ /** Modal size */
1812
+ size?: string;
1813
+ /** Custom class name */
1814
+ className?: string;
1815
+ };
1816
+ 'navigation': {
1817
+ type: 'navigation';
1818
+ /** Navigation items */
1819
+ items: unknown[] | string;
1820
+ /** Navigation orientation @default 'horizontal' */
1821
+ orientation?: string;
1822
+ /** Additional CSS classes */
1823
+ className?: string;
1824
+ };
1825
+ 'notification': {
1826
+ type: 'notification';
1827
+ /** Toast variant */
1828
+ variant?: unknown | string;
1829
+ /** Toast message */
1830
+ message: string;
1831
+ /** Toast title (optional) */
1832
+ title?: string;
1833
+ /** Auto-dismiss duration in milliseconds (0 = no auto-dismiss) */
1834
+ duration?: number | string;
1835
+ /** Show dismiss button */
1836
+ dismissible?: boolean | string;
1837
+ /** Callback when toast is dismissed */
1838
+ onDismiss?: ((...args: unknown[]) => unknown) | string;
1839
+ /** Action button label */
1840
+ actionLabel?: string;
1841
+ /** Action button click handler */
1842
+ onAction?: ((...args: unknown[]) => unknown) | string;
1843
+ /** Badge count (optional) */
1844
+ badge?: string | number;
1845
+ /** Additional CSS classes */
1846
+ className?: string;
1847
+ };
1848
+ 'orbital-visualization': {
1849
+ type: 'orbital-visualization';
1850
+ /** Full KFlow schema object */
1851
+ schema?: Record<string, unknown> | string;
1852
+ /** Direct complexity override (1-100+) */
1853
+ complexity?: number | string;
1854
+ /** Size of the visualization */
1855
+ size?: string;
1856
+ /** Show complexity label */
1857
+ showLabel?: boolean | string;
1858
+ /** Animation enabled */
1859
+ animated?: boolean | string;
1860
+ /** Click handler */
1861
+ onClick?: ((...args: unknown[]) => unknown) | string;
1862
+ /** Additional CSS classes */
1863
+ className?: string;
1864
+ };
1865
+ 'overlay': {
1866
+ type: 'overlay';
1867
+ /** isVisible prop */
1868
+ isVisible?: boolean | string;
1869
+ /** onClick prop */
1870
+ onClick?: ((...args: unknown[]) => unknown) | string;
1871
+ /** className prop */
1872
+ className?: string;
1873
+ /** blur prop */
1874
+ blur?: boolean | string;
1875
+ };
1876
+ 'page-header': {
1877
+ type: 'page-header';
1878
+ /** Page title - accepts unknown to handle generated code accessing dynamic entity data */
1879
+ title?: string | number | unknown;
1880
+ /** Optional subtitle/description */
1881
+ subtitle?: string | number | unknown;
1882
+ /** Show back button */
1883
+ showBack?: boolean | string;
1884
+ /** Event to emit when back is clicked (default: BACK) */
1885
+ backEvent?: string;
1886
+ /** Breadcrumbs */
1887
+ breadcrumbs?: unknown | string;
1888
+ /** Status badge */
1889
+ status?: Record<string, unknown> | string;
1890
+ /** Actions array - first action with variant='primary' (or first action) is the main action */
1891
+ actions?: unknown | string;
1892
+ /** Loading state indicator */
1893
+ isLoading?: boolean | string;
1894
+ /** Tabs for sub-navigation */
1895
+ tabs?: unknown[] | string;
1896
+ /** activeTab prop */
1897
+ activeTab?: string;
1898
+ /** onTabChange prop */
1899
+ onTabChange?: ((...args: unknown[]) => unknown) | string;
1900
+ /** Custom content in the header */
1901
+ children?: unknown | string;
1902
+ /** className prop */
1903
+ className?: string;
1904
+ };
1905
+ 'pagination': {
1906
+ type: 'pagination';
1907
+ /** Current page (1-indexed) */
1908
+ currentPage: number | string;
1909
+ /** Total number of pages */
1910
+ totalPages: number | string;
1911
+ /** Callback when page changes (optional - can be a no-op if not interactive) */
1912
+ onPageChange?: ((...args: unknown[]) => unknown) | string;
1913
+ /** Show page size selector @default false */
1914
+ showPageSize?: boolean | string;
1915
+ /** Page size options */
1916
+ pageSizeOptions?: unknown[] | string;
1917
+ /** Current page size */
1918
+ pageSize?: number | string;
1919
+ /** Callback when page size changes */
1920
+ onPageSizeChange?: ((...args: unknown[]) => unknown) | string;
1921
+ /** Show jump to page input @default false */
1922
+ showJumpToPage?: boolean | string;
1923
+ /** Show total count @default false */
1924
+ showTotal?: boolean | string;
1925
+ /** Total items count */
1926
+ totalItems?: number | string;
1927
+ /** Maximum number of page buttons to show @default 7 */
1928
+ maxVisiblePages?: number | string;
1929
+ /** Additional CSS classes */
1930
+ className?: string;
1931
+ };
1932
+ 'popover': {
1933
+ type: 'popover';
1934
+ /** Popover content */
1935
+ content: unknown | string;
1936
+ /** Popover trigger element (ReactElement or ReactNode that will be wrapped in span) */
1937
+ children: unknown | string;
1938
+ /** Popover position @default 'bottom' */
1939
+ position?: unknown | string;
1940
+ /** Trigger type @default 'click' */
1941
+ trigger?: unknown | string;
1942
+ /** Show arrow @default true */
1943
+ showArrow?: boolean | string;
1944
+ /** Additional CSS classes */
1945
+ className?: string;
1946
+ };
1947
+ 'progress-bar': {
1948
+ type: 'progress-bar';
1949
+ /** Progress value (0-100) */
1950
+ value: number | string;
1951
+ /** Maximum value (for calculating percentage) @default 100 */
1952
+ max?: number | string;
1953
+ /** Variant/color of the progress bar @default 'primary' */
1954
+ variant?: unknown | string;
1955
+ /** Color variant (alias for variant) @default 'primary' */
1956
+ color?: unknown | string;
1957
+ /** Show percentage text @default false */
1958
+ showPercentage?: boolean | string;
1959
+ /** Alias for showPercentage (pattern compatibility) */
1960
+ showLabel?: boolean | string;
1961
+ /** Label text */
1962
+ label?: string;
1963
+ /** Size (for circular variant) @default 'md' */
1964
+ size?: string;
1965
+ /** Number of steps (for stepped variant) @default 5 */
1966
+ steps?: number | string;
1967
+ /** Additional CSS classes */
1968
+ className?: string;
1969
+ /** Type of the progress bar (linear, circular, stepped) @default 'linear' */
1970
+ progressType?: unknown | string;
1971
+ };
1972
+ 'radio': {
1973
+ type: 'radio';
1974
+ /** Label text displayed next to the radio button */
1975
+ label?: string;
1976
+ /** Helper text displayed below the radio button */
1977
+ helperText?: string;
1978
+ /** Error message displayed below the radio button */
1979
+ error?: string;
1980
+ /** Size of the radio button @default 'md' */
1981
+ size?: string;
1982
+ };
1983
+ 'relation-select': {
1984
+ type: 'relation-select';
1985
+ /** Current value (ID) */
1986
+ value?: string;
1987
+ /** Callback when value changes */
1988
+ onChange?: ((...args: unknown[]) => unknown) | string;
1989
+ /** Available options - accepts readonly for compatibility with generated const arrays */
1990
+ options: unknown | string;
1991
+ /** Placeholder text */
1992
+ placeholder?: string;
1993
+ /** Whether the field is required */
1994
+ required?: boolean | string;
1995
+ /** Whether the field is disabled */
1996
+ disabled?: boolean | string;
1997
+ /** Whether data is loading */
1998
+ isLoading?: boolean | string;
1999
+ /** Error message */
2000
+ error?: string;
2001
+ /** Allow clearing the selection */
2002
+ clearable?: boolean | string;
2003
+ /** Name attribute for forms */
2004
+ name?: string;
2005
+ /** Additional CSS classes */
2006
+ className?: string;
2007
+ /** Search placeholder */
2008
+ searchPlaceholder?: string;
2009
+ /** Empty state message */
2010
+ emptyMessage?: string;
2011
+ };
2012
+ 'repeatable-form-section': {
2013
+ type: 'repeatable-form-section';
2014
+ /** Section type identifier */
2015
+ sectionType: string;
2016
+ /** Section title */
2017
+ title: string;
2018
+ /** Items in the section */
2019
+ items: unknown[] | string;
2020
+ /** Render function for each item */
2021
+ renderItem: ((...args: unknown[]) => unknown) | string;
2022
+ /** Minimum items required */
2023
+ minItems?: number | string;
2024
+ /** Maximum items allowed */
2025
+ maxItems?: number | string;
2026
+ /** Allow reordering */
2027
+ allowReorder?: boolean | string;
2028
+ /** Add button label */
2029
+ addLabel?: string;
2030
+ /** Empty state message */
2031
+ emptyMessage?: string;
2032
+ /** Read-only mode */
2033
+ readOnly?: boolean | string;
2034
+ /** Additional CSS classes */
2035
+ className?: string;
2036
+ /** Add handler */
2037
+ onAdd?: ((...args: unknown[]) => unknown) | string;
2038
+ /** Remove handler */
2039
+ onRemove?: ((...args: unknown[]) => unknown) | string;
2040
+ /** Reorder handler */
2041
+ onReorder?: ((...args: unknown[]) => unknown) | string;
2042
+ /** Inspection-specific enhancements */
2043
+ trackAddedInState?: boolean | string;
2044
+ /** Current inspection state (used when trackAddedInState is true) */
2045
+ currentState?: string;
2046
+ /** Show audit metadata (addedInState, addedAt) */
2047
+ showAuditInfo?: boolean | string;
2048
+ };
2049
+ 'runtime-debugger': {
2050
+ type: 'runtime-debugger';
2051
+ /** Initial position */
2052
+ position?: string;
2053
+ /** Initial collapsed state */
2054
+ defaultCollapsed?: boolean | string;
2055
+ /** Additional CSS classes */
2056
+ className?: string;
2057
+ };
2058
+ 'score-display': {
2059
+ type: 'score-display';
2060
+ /** Current score value */
2061
+ value: number | string;
2062
+ /** Label to display before score */
2063
+ label?: string;
2064
+ /** Icon component or emoji */
2065
+ icon?: unknown | string;
2066
+ /** Size variant */
2067
+ size?: string;
2068
+ /** Additional CSS classes */
2069
+ className?: string;
2070
+ /** Animation on value change */
2071
+ animated?: boolean | string;
2072
+ /** Number formatting locale */
2073
+ locale?: string;
2074
+ };
2075
+ 'search-input': {
2076
+ type: 'search-input';
2077
+ /** Search value (controlled mode) */
2078
+ value?: string;
2079
+ /** Callback when search value changes */
2080
+ onSearch?: ((...args: unknown[]) => unknown) | string;
2081
+ /** Debounce delay in milliseconds @default 300 */
2082
+ debounceMs?: number | string;
2083
+ /** Show loading state @default false */
2084
+ isLoading?: boolean | string;
2085
+ /** Placeholder text @default 'Search...' */
2086
+ placeholder?: string;
2087
+ /** Show clear button @default true */
2088
+ clearable?: boolean | string;
2089
+ /** Additional CSS classes */
2090
+ className?: string;
2091
+ /** Event name to dispatch on search (schema metadata, wired by trait) This is metadata used by the trait generator, not by the component. */
2092
+ event?: string;
2093
+ /** Entity type for context-aware search. When provided, search events include entity context. */
2094
+ entity?: string;
2095
+ /** Query singleton binding for state management. When provided, syncs search state with the query singleton. Example: "@TaskQuery" */
2096
+ query?: string;
2097
+ };
2098
+ 'section': {
2099
+ type: 'section';
2100
+ /** Section title */
2101
+ title?: string;
2102
+ /** Section subtitle/description */
2103
+ description?: string;
2104
+ /** Action element (e.g., button, link) */
2105
+ action?: unknown | string;
2106
+ /** Padding amount */
2107
+ padding?: unknown | string;
2108
+ /** Visual variant */
2109
+ variant?: unknown | string;
2110
+ /** Show divider below header */
2111
+ divider?: boolean | string;
2112
+ /** Custom class name */
2113
+ className?: string;
2114
+ /** Children elements */
2115
+ children: unknown | string;
2116
+ /** Header custom class name */
2117
+ headerClassName?: string;
2118
+ /** Content custom class name */
2119
+ contentClassName?: string;
2120
+ /** HTML element to render as */
2121
+ as?: unknown | string;
2122
+ };
2123
+ 'select': {
2124
+ type: 'select';
2125
+ /** options prop */
2126
+ options: unknown[] | string;
2127
+ /** placeholder prop */
2128
+ placeholder?: string;
2129
+ /** error prop */
2130
+ error?: string;
2131
+ };
2132
+ 'settings-template': {
2133
+ type: 'settings-template';
2134
+ /** Current settings values */
2135
+ settings: Record<string, unknown> | string;
2136
+ /** Whether settings are being saved */
2137
+ isSaving?: boolean | string;
2138
+ /** Whether there are unsaved changes */
2139
+ hasChanges?: boolean | string;
2140
+ /** Error object if save failed */
2141
+ error?: unknown | string;
2142
+ /** Success message after save */
2143
+ successMessage?: string;
2144
+ /** Called when saving settings */
2145
+ onSave?: ((...args: unknown[]) => unknown) | string;
2146
+ /** Called when a setting value changes */
2147
+ onChange?: ((...args: unknown[]) => unknown) | string;
2148
+ /** Called to reset to default settings */
2149
+ onReset?: ((...args: unknown[]) => unknown) | string;
2150
+ /** Called to revert unsaved changes */
2151
+ onRevert?: ((...args: unknown[]) => unknown) | string;
2152
+ /** Called to dismiss success message */
2153
+ onDismissSuccess?: ((...args: unknown[]) => unknown) | string;
2154
+ /** Page title */
2155
+ title?: string;
2156
+ /** Settings sections */
2157
+ sections?: unknown[] | string;
2158
+ /** Whether to show reset to defaults button */
2159
+ showResetToDefaults?: boolean | string;
2160
+ /** Template variant */
2161
+ variant?: unknown | string;
2162
+ /** Additional class name */
2163
+ className?: string;
2164
+ };
2165
+ 'side-panel': {
2166
+ type: 'side-panel';
2167
+ /** Panel title */
2168
+ title: string;
2169
+ /** Panel content */
2170
+ children: unknown | string;
2171
+ /** Is panel open */
2172
+ isOpen: boolean | string;
2173
+ /** On close handler */
2174
+ onClose: ((...args: unknown[]) => unknown) | string;
2175
+ /** Panel width @default 'w-96' */
2176
+ width?: string;
2177
+ /** Panel position @default 'right' */
2178
+ position?: string;
2179
+ /** Show overlay on mobile @default true */
2180
+ showOverlay?: boolean | string;
2181
+ /** Additional CSS classes */
2182
+ className?: string;
2183
+ };
2184
+ 'sidebar': {
2185
+ type: 'sidebar';
2186
+ /** Logo/Brand content - can be a ReactNode or logo config */
2187
+ logo?: unknown | string;
2188
+ /** Logo image source */
2189
+ logoSrc?: string;
2190
+ /** Brand/App name */
2191
+ brandName?: string;
2192
+ /** Navigation items */
2193
+ items: unknown[] | string;
2194
+ /** User section content */
2195
+ userSection?: unknown | string;
2196
+ /** Footer content (e.g., theme toggle) */
2197
+ footerContent?: unknown | string;
2198
+ /** Collapsed state (controlled) */
2199
+ collapsed?: boolean | string;
2200
+ /** Default collapsed state */
2201
+ defaultCollapsed?: boolean | string;
2202
+ /** Callback when collapse state changes */
2203
+ onCollapseChange?: ((...args: unknown[]) => unknown) | string;
2204
+ /** Hide the collapse/expand button */
2205
+ hideCollapseButton?: boolean | string;
2206
+ /** Show a close button (for mobile) */
2207
+ showCloseButton?: boolean | string;
2208
+ /** Callback when close button is clicked */
2209
+ onClose?: ((...args: unknown[]) => unknown) | string;
2210
+ /** Callback when logo/brand is clicked */
2211
+ onLogoClick?: ((...args: unknown[]) => unknown) | string;
2212
+ /** Additional CSS classes */
2213
+ className?: string;
2214
+ };
2215
+ 'signature-pad': {
2216
+ type: 'signature-pad';
2217
+ /** Label above the pad */
2218
+ label?: string;
2219
+ /** Helper text */
2220
+ helperText?: string;
2221
+ /** Stroke color */
2222
+ strokeColor?: string;
2223
+ /** Stroke width */
2224
+ strokeWidth?: number | string;
2225
+ /** Pad height */
2226
+ height?: number | string;
2227
+ /** Whether the pad is read-only */
2228
+ readOnly?: boolean | string;
2229
+ /** Existing signature image URL */
2230
+ value?: string;
2231
+ /** Callback when signature changes */
2232
+ onChange?: ((...args: unknown[]) => unknown) | string;
2233
+ /** Event to emit on sign */
2234
+ signEvent?: string;
2235
+ /** Event to emit on clear */
2236
+ clearEvent?: string;
2237
+ /** Entity name for schema-driven context */
2238
+ entity?: string;
2239
+ /** Loading state */
2240
+ isLoading?: boolean | string;
2241
+ /** Error state */
2242
+ error?: unknown | string;
2243
+ /** Additional CSS classes */
2244
+ className?: string;
2245
+ };
2246
+ 'simple-grid': {
2247
+ type: 'simple-grid';
2248
+ /** Minimum width of each child (e.g., 200, "200px", "15rem") */
2249
+ minChildWidth?: number | string;
2250
+ /** Maximum number of columns */
2251
+ maxCols?: number | string;
2252
+ /** Exact number of columns (disables auto-fit) */
2253
+ cols?: number | string;
2254
+ /** Gap between items */
2255
+ gap?: unknown | string;
2256
+ /** Custom class name */
2257
+ className?: string;
2258
+ /** Children elements */
2259
+ children: unknown | string;
2260
+ };
2261
+ 'spacer': {
2262
+ type: 'spacer';
2263
+ /** Fixed size (auto = flex grow) */
2264
+ size?: unknown | string;
2265
+ /** Orientation (for fixed sizes) */
2266
+ axis?: string;
2267
+ /** Custom class name */
2268
+ className?: string;
2269
+ };
2270
+ 'spinner': {
2271
+ type: 'spinner';
2272
+ /** size prop */
2273
+ size?: unknown | string;
2274
+ };
2275
+ 'split': {
2276
+ type: 'split';
2277
+ /** Size ratio between left and right panels */
2278
+ ratio?: unknown | string;
2279
+ /** Gap between panels */
2280
+ gap?: unknown | string;
2281
+ /** Reverse the order (right first) */
2282
+ reverse?: boolean | string;
2283
+ /** Stack vertically on mobile */
2284
+ stackOnMobile?: boolean | string;
2285
+ /** Breakpoint to switch from stacked to side-by-side */
2286
+ stackBreakpoint?: string;
2287
+ /** Align items vertically */
2288
+ align?: string;
2289
+ /** Custom class name */
2290
+ className?: string;
2291
+ /** Left/first panel class name */
2292
+ leftClassName?: string;
2293
+ /** Right/second panel class name */
2294
+ rightClassName?: string;
2295
+ /** Exactly two children: [left, right] */
2296
+ children: unknown | string;
2297
+ };
2298
+ 'split-pane': {
2299
+ type: 'split-pane';
2300
+ /** Direction of the split */
2301
+ direction?: string;
2302
+ /** Initial ratio (0-100, percentage of first pane) */
2303
+ ratio?: number | string;
2304
+ /** Minimum size of either pane in pixels */
2305
+ minSize?: number | string;
2306
+ /** Allow user resizing */
2307
+ resizable?: boolean | string;
2308
+ /** Content for the left/top pane */
2309
+ left: unknown | string;
2310
+ /** Content for the right/bottom pane */
2311
+ right: unknown | string;
2312
+ /** Additional CSS classes */
2313
+ className?: string;
2314
+ /** Class for left/top pane */
2315
+ leftClassName?: string;
2316
+ /** Class for right/bottom pane */
2317
+ rightClassName?: string;
2318
+ };
2319
+ 'sprite': {
2320
+ type: 'sprite';
2321
+ /** Spritesheet image URL */
2322
+ spritesheet: string;
2323
+ /** Width of each frame in pixels */
2324
+ frameWidth: number | string;
2325
+ /** Height of each frame in pixels */
2326
+ frameHeight: number | string;
2327
+ /** Frame index to display (0-based, left-to-right, top-to-bottom) */
2328
+ frame: number | string;
2329
+ /** X position in pixels */
2330
+ x: number | string;
2331
+ /** Y position in pixels */
2332
+ y: number | string;
2333
+ /** Scale factor (default: 1) */
2334
+ scale?: number | string;
2335
+ /** Flip horizontally */
2336
+ flipX?: boolean | string;
2337
+ /** Flip vertically */
2338
+ flipY?: boolean | string;
2339
+ /** Rotation in degrees */
2340
+ rotation?: number | string;
2341
+ /** Opacity (0-1) */
2342
+ opacity?: number | string;
2343
+ /** Z-index for layering */
2344
+ zIndex?: number | string;
2345
+ /** Number of columns in spritesheet (for frame calculation) */
2346
+ columns?: number | string;
2347
+ /** Optional className */
2348
+ className?: string;
2349
+ /** Optional onClick handler */
2350
+ onClick?: ((...args: unknown[]) => unknown) | string;
2351
+ };
2352
+ 'stack': {
2353
+ type: 'stack';
2354
+ /** Stack direction */
2355
+ direction?: unknown | string;
2356
+ /** Gap between children */
2357
+ gap?: unknown | string;
2358
+ /** Align items on the cross axis */
2359
+ align?: unknown | string;
2360
+ /** Justify items on the main axis */
2361
+ justify?: unknown | string;
2362
+ /** Allow items to wrap */
2363
+ wrap?: boolean | string;
2364
+ /** Reverse the order of children */
2365
+ reverse?: boolean | string;
2366
+ /** Fill available space (flex: 1) */
2367
+ flex?: boolean | string;
2368
+ /** Custom class name */
2369
+ className?: string;
2370
+ /** Inline styles */
2371
+ style?: Record<string, unknown> | string;
2372
+ /** Children elements */
2373
+ children?: unknown | string;
2374
+ /** HTML element to render as */
2375
+ as?: unknown | string;
2376
+ /** Click handler */
2377
+ onClick?: ((...args: unknown[]) => unknown) | string;
2378
+ /** Keyboard handler */
2379
+ onKeyDown?: ((...args: unknown[]) => unknown) | string;
2380
+ /** Role for accessibility */
2381
+ role?: string;
2382
+ /** Tab index for focus management */
2383
+ tabIndex?: number | string;
2384
+ };
2385
+ 'stat-badge': {
2386
+ type: 'stat-badge';
2387
+ /** Stat label */
2388
+ label: string;
2389
+ /** Current value (defaults to 0 if not provided) */
2390
+ value?: number | string;
2391
+ /** Maximum value (for bar/hearts format) */
2392
+ max?: number | string;
2393
+ /** Data source entity name (for schema config) */
2394
+ source?: string;
2395
+ /** Field name in the source (for schema config) */
2396
+ field?: string;
2397
+ /** Display format */
2398
+ format?: string;
2399
+ /** Icon component or emoji */
2400
+ icon?: unknown | string;
2401
+ /** Size variant */
2402
+ size?: string;
2403
+ /** Visual variant */
2404
+ variant?: string;
2405
+ /** Additional CSS classes */
2406
+ className?: string;
2407
+ };
2408
+ 'stats': {
2409
+ type: 'stats';
2410
+ /** Main label */
2411
+ label?: string;
2412
+ /** Title (alias for label) */
2413
+ title?: string;
2414
+ /** Primary value - accepts array/unknown from generated code (will use first element or length) */
2415
+ value?: string | number | unknown[] | unknown;
2416
+ /** Previous value for comparison */
2417
+ previousValue?: number | string;
2418
+ /** Current value as number for trend calculation */
2419
+ currentValue?: number | string;
2420
+ /** Manual trend percentage (overrides calculation) */
2421
+ trend?: number | string;
2422
+ /** Trend direction (overrides calculation) */
2423
+ trendDirection?: string;
2424
+ /** Whether up is good (green) or bad (red) */
2425
+ invertTrend?: boolean | string;
2426
+ /** Icon to display */
2427
+ icon?: unknown | string;
2428
+ /** Icon background color */
2429
+ iconBg?: string;
2430
+ /** Icon color */
2431
+ iconColor?: string;
2432
+ /** Subtitle or description */
2433
+ subtitle?: string;
2434
+ /** Action button */
2435
+ action?: Record<string, unknown> | string;
2436
+ /** className prop */
2437
+ className?: string;
2438
+ /** Schema-based props */
2439
+ entity?: string;
2440
+ /** Metrics to display (schema format) - accepts readonly for compatibility with generated const arrays */
2441
+ metrics?: unknown | string;
2442
+ /** Data to calculate stats from - accepts readonly for compatibility with generated const arrays */
2443
+ data?: unknown | string;
2444
+ /** Loading state indicator */
2445
+ isLoading?: boolean | string;
2446
+ /** Error state */
2447
+ error?: unknown | string;
2448
+ };
2449
+ 'switch': {
2450
+ type: 'switch';
2451
+ /** checked prop */
2452
+ checked?: boolean | string;
2453
+ /** defaultChecked prop */
2454
+ defaultChecked?: boolean | string;
2455
+ /** onChange prop */
2456
+ onChange?: ((...args: unknown[]) => unknown) | string;
2457
+ /** disabled prop */
2458
+ disabled?: boolean | string;
2459
+ /** label prop */
2460
+ label?: string;
2461
+ /** id prop */
2462
+ id?: string;
2463
+ /** name prop */
2464
+ name?: string;
2465
+ /** className prop */
2466
+ className?: string;
2467
+ };
2468
+ 'tabbed-container': {
2469
+ type: 'tabbed-container';
2470
+ /** Tab definitions */
2471
+ tabs: unknown[] | string;
2472
+ /** Default active tab ID */
2473
+ defaultTab?: string;
2474
+ /** Controlled active tab */
2475
+ activeTab?: string;
2476
+ /** Callback when tab changes */
2477
+ onTabChange?: ((...args: unknown[]) => unknown) | string;
2478
+ /** Tab position */
2479
+ position?: string;
2480
+ /** Additional CSS classes */
2481
+ className?: string;
2482
+ };
2483
+ 'table': {
2484
+ type: 'table';
2485
+ /** Table columns */
2486
+ columns: unknown[] | string;
2487
+ /** Table entity data */
2488
+ entity: unknown[] | string;
2489
+ /** Row key getter */
2490
+ getRowKey: ((...args: unknown[]) => unknown) | string;
2491
+ /** Enable row selection @default false */
2492
+ selectable?: boolean | string;
2493
+ /** Selected row keys */
2494
+ selectedRows?: unknown[] | string;
2495
+ /** Callback when selection changes */
2496
+ onSelectionChange?: ((...args: unknown[]) => unknown) | string;
2497
+ /** Enable sorting @default false */
2498
+ sortable?: boolean | string;
2499
+ /** Current sort column */
2500
+ sortColumn?: string;
2501
+ /** Current sort direction */
2502
+ sortDirection?: unknown | string;
2503
+ /** Callback when sort changes */
2504
+ onSortChange?: ((...args: unknown[]) => unknown) | string;
2505
+ /** Enable search/filter @default false */
2506
+ searchable?: boolean | string;
2507
+ /** Search placeholder */
2508
+ searchPlaceholder?: string;
2509
+ /** Enable pagination @default false */
2510
+ paginated?: boolean | string;
2511
+ /** Current page */
2512
+ currentPage?: number | string;
2513
+ /** Total pages */
2514
+ totalPages?: number | string;
2515
+ /** Callback when page changes */
2516
+ onPageChange?: ((...args: unknown[]) => unknown) | string;
2517
+ /** Row actions menu items */
2518
+ rowActions?: ((...args: unknown[]) => unknown) | string;
2519
+ /** Empty state message */
2520
+ emptyMessage?: string;
2521
+ /** Loading state @default false */
2522
+ loading?: boolean | string;
2523
+ /** Additional CSS classes */
2524
+ className?: string;
2525
+ };
2526
+ 'tabs': {
2527
+ type: 'tabs';
2528
+ /** Tab items */
2529
+ items?: unknown[] | string;
2530
+ /** Tab items (alias for items - used by generated code) */
2531
+ tabs?: unknown[] | string;
2532
+ /** Default active tab ID */
2533
+ defaultActiveTab?: string;
2534
+ /** Controlled active tab ID */
2535
+ activeTab?: string;
2536
+ /** Callback when tab changes */
2537
+ onTabChange?: ((...args: unknown[]) => unknown) | string;
2538
+ /** Tab variant */
2539
+ variant?: string;
2540
+ /** Tab orientation */
2541
+ orientation?: string;
2542
+ /** Additional CSS classes */
2543
+ className?: string;
2544
+ };
2545
+ 'text-highlight': {
2546
+ type: 'text-highlight';
2547
+ /** Whether the highlight is currently active/focused @default false */
2548
+ isActive?: boolean | string;
2549
+ /** Callback when highlight is clicked */
2550
+ onClick?: ((...args: unknown[]) => unknown) | string;
2551
+ /** Callback when highlight is hovered */
2552
+ onMouseEnter?: ((...args: unknown[]) => unknown) | string;
2553
+ /** Callback when hover ends */
2554
+ onMouseLeave?: ((...args: unknown[]) => unknown) | string;
2555
+ /** Unique ID for the annotation */
2556
+ annotationId?: string;
2557
+ /** Additional CSS classes */
2558
+ className?: string;
2559
+ /** Highlighted text content */
2560
+ children: unknown | string;
2561
+ /** Type of highlight (determines color) */
2562
+ highlightType: unknown | string;
2563
+ };
2564
+ 'textarea': {
2565
+ type: 'textarea';
2566
+ /** error prop */
2567
+ error?: string;
2568
+ };
2569
+ 'theme-toggle': {
2570
+ type: 'theme-toggle';
2571
+ /** Additional CSS classes */
2572
+ className?: string;
2573
+ /** Size variant */
2574
+ size?: string;
2575
+ /** Show label text */
2576
+ showLabel?: boolean | string;
2577
+ };
2578
+ 'timeline': {
2579
+ type: 'timeline';
2580
+ /** Timeline title */
2581
+ title?: string;
2582
+ /** Timeline items */
2583
+ items?: unknown | string;
2584
+ /** Schema-driven data */
2585
+ data?: unknown | string;
2586
+ /** Fields to display */
2587
+ fields?: unknown | string;
2588
+ /** Actions per item */
2589
+ itemActions?: unknown | string;
2590
+ /** Entity name for schema-driven auto-fetch */
2591
+ entity?: string;
2592
+ /** Loading state */
2593
+ isLoading?: boolean | string;
2594
+ /** Error state */
2595
+ error?: unknown | string;
2596
+ /** Additional CSS classes */
2597
+ className?: string;
2598
+ };
2599
+ 'toast-slot': {
2600
+ type: 'toast-slot';
2601
+ /** Content to display in the toast (message or ReactNode) */
2602
+ children?: unknown | string;
2603
+ /** Toast variant */
2604
+ variant?: unknown | string;
2605
+ /** Toast title */
2606
+ title?: string;
2607
+ /** Auto-dismiss duration in ms (0 = no auto-dismiss) */
2608
+ duration?: number | string;
2609
+ /** Custom class name */
2610
+ className?: string;
2611
+ };
2612
+ 'tooltip': {
2613
+ type: 'tooltip';
2614
+ /** Tooltip content */
2615
+ content: unknown | string;
2616
+ /** Tooltip trigger element (ReactElement or ReactNode that will be wrapped in span) */
2617
+ children: unknown | string;
2618
+ /** Tooltip position */
2619
+ position?: unknown | string;
2620
+ /** Show delay in milliseconds */
2621
+ delay?: number | string;
2622
+ /** Hide delay in milliseconds */
2623
+ hideDelay?: number | string;
2624
+ /** Show arrow */
2625
+ showArrow?: boolean | string;
2626
+ /** Additional CSS classes */
2627
+ className?: string;
2628
+ };
2629
+ 'typography': {
2630
+ type: 'typography';
2631
+ /** Typography variant */
2632
+ variant?: unknown | string;
2633
+ /** Heading level (1-6) - alternative to variant for headings */
2634
+ level?: number | string;
2635
+ /** Text color */
2636
+ color?: string;
2637
+ /** Text alignment */
2638
+ align?: string;
2639
+ /** Font weight override */
2640
+ weight?: string;
2641
+ /** Font size override */
2642
+ size?: unknown | string;
2643
+ /** Truncate with ellipsis (single line) */
2644
+ truncate?: boolean | string;
2645
+ /** Overflow handling mode */
2646
+ overflow?: string;
2647
+ /** Custom HTML element */
2648
+ as?: unknown | string;
2649
+ /** HTML id attribute */
2650
+ id?: string;
2651
+ /** Additional class names */
2652
+ className?: string;
2653
+ /** Inline style */
2654
+ style?: Record<string, unknown> | string;
2655
+ /** Text content (alternative to children) */
2656
+ content?: unknown | string;
2657
+ /** Children elements */
2658
+ children?: unknown | string;
2659
+ };
2660
+ 'u-i-slot-renderer': {
2661
+ type: 'u-i-slot-renderer';
2662
+ /** Include HUD slots */
2663
+ includeHud?: boolean | string;
2664
+ /** Include floating slot */
2665
+ includeFloating?: boolean | string;
2666
+ /** Additional class name for the container */
2667
+ className?: string;
2668
+ };
2669
+ 'violation-alert': {
2670
+ type: 'violation-alert';
2671
+ /** Violation data */
2672
+ violation: unknown | string;
2673
+ /** Visual severity (derived from actionType if not specified) */
2674
+ severity?: string;
2675
+ /** Dismissible alert */
2676
+ dismissible?: boolean | string;
2677
+ /** Dismiss handler */
2678
+ onDismiss?: ((...args: unknown[]) => unknown) | string;
2679
+ /** Navigate to the field that caused violation */
2680
+ onNavigateToField?: ((...args: unknown[]) => unknown) | string;
2681
+ /** Compact display mode */
2682
+ compact?: boolean | string;
2683
+ /** Additional CSS classes */
2684
+ className?: string;
2685
+ };
2686
+ 'wizard-container': {
2687
+ type: 'wizard-container';
2688
+ /** Wizard steps */
2689
+ steps: unknown[] | string;
2690
+ /** Current step index (controlled) - accepts unknown for generated code compatibility */
2691
+ currentStep?: number | string | unknown;
2692
+ /** Callback when step changes */
2693
+ onStepChange?: ((...args: unknown[]) => unknown) | string;
2694
+ /** Callback when wizard is completed */
2695
+ onComplete?: ((...args: unknown[]) => unknown) | string;
2696
+ /** Show progress indicator */
2697
+ showProgress?: boolean | string;
2698
+ /** Allow navigation to previous steps */
2699
+ allowBack?: boolean | string;
2700
+ /** Modal mode (compact header, no padding) */
2701
+ compact?: boolean | string;
2702
+ /** Additional CSS classes */
2703
+ className?: string;
2704
+ /** Entity type name (schema-driven) */
2705
+ entity?: string;
2706
+ };
2707
+ 'wizard-navigation': {
2708
+ type: 'wizard-navigation';
2709
+ /** Current step index (0-based) */
2710
+ currentStep: number | string;
2711
+ /** Total number of steps */
2712
+ totalSteps: number | string;
2713
+ /** Whether the current step is valid (enables Next/Complete) */
2714
+ isValid?: boolean | string;
2715
+ /** Show the Back button */
2716
+ showBack?: boolean | string;
2717
+ /** Show the Next button */
2718
+ showNext?: boolean | string;
2719
+ /** Show the Complete button (on last step) */
2720
+ showComplete?: boolean | string;
2721
+ /** Custom label for Back button */
2722
+ backLabel?: string;
2723
+ /** Custom label for Next button */
2724
+ nextLabel?: string;
2725
+ /** Custom label for Complete button */
2726
+ completeLabel?: string;
2727
+ /** Event to emit on Back click */
2728
+ onBack?: string;
2729
+ /** Event to emit on Next click */
2730
+ onNext?: string;
2731
+ /** Event to emit on Complete click */
2732
+ onComplete?: string;
2733
+ /** Direct callback for Back (alternative to event) */
2734
+ onBackClick?: ((...args: unknown[]) => unknown) | string;
2735
+ /** Direct callback for Next (alternative to event) */
2736
+ onNextClick?: ((...args: unknown[]) => unknown) | string;
2737
+ /** Direct callback for Complete (alternative to event) */
2738
+ onCompleteClick?: ((...args: unknown[]) => unknown) | string;
2739
+ /** Compact mode (smaller padding) */
2740
+ compact?: boolean | string;
2741
+ /** Additional CSS classes */
2742
+ className?: string;
2743
+ };
2744
+ 'wizard-progress': {
2745
+ type: 'wizard-progress';
2746
+ /** Step definitions (compatible with WizardContainer's WizardStep) */
2747
+ steps: unknown[] | string;
2748
+ /** Current step index (0-based) */
2749
+ currentStep: number | string;
2750
+ /** Callback when a completed step is clicked */
2751
+ onStepClick?: ((...args: unknown[]) => unknown) | string;
2752
+ /** Allow clicking on completed steps to navigate back */
2753
+ allowNavigation?: boolean | string;
2754
+ /** Compact mode (smaller, no titles) */
2755
+ compact?: boolean | string;
2756
+ /** Additional CSS classes */
2757
+ className?: string;
2758
+ };
2759
+ 'world-map-template': {
2760
+ type: 'world-map-template';
2761
+ /** All map hexes (with pre-resolved terrain sprites) */
2762
+ hexes: unknown[] | string;
2763
+ /** Heroes on the map */
2764
+ heroes: unknown[] | string;
2765
+ /** Features rendered on tiles */
2766
+ features?: unknown[] | string;
2767
+ /** Currently selected hero ID */
2768
+ selectedHeroId?: string;
2769
+ /** Canvas render scale */
2770
+ scale?: number | string;
2771
+ /** Unit draw-size multiplier */
2772
+ unitScale?: number | string;
2773
+ /** Asset manifest for IsometricCanvas */
2774
+ assetManifest?: Record<string, unknown> | string;
2775
+ /** Background image URL */
2776
+ backgroundImage?: string;
2777
+ /** Allow selecting / moving ALL heroes (including enemy). For testing. */
2778
+ allowMoveAllHeroes?: boolean | string;
2779
+ /** Custom movement range validator */
2780
+ isInRange?: ((...args: unknown[]) => unknown) | string;
2781
+ /** -- Slots -- */
2782
+ header?: ((...args: unknown[]) => unknown) | string;
2783
+ /** Side panel (hero detail, hero lists, etc.) */
2784
+ sidePanel?: ((...args: unknown[]) => unknown) | string;
2785
+ /** Canvas overlay (tooltips, popups) */
2786
+ overlay?: ((...args: unknown[]) => unknown) | string;
2787
+ /** Footer */
2788
+ footer?: ((...args: unknown[]) => unknown) | string;
2789
+ /** -- Callbacks -- */
2790
+ onHeroSelect?: ((...args: unknown[]) => unknown) | string;
2791
+ /** onHeroMove prop */
2792
+ onHeroMove?: ((...args: unknown[]) => unknown) | string;
2793
+ /** Called when hero clicks an enemy hero tile */
2794
+ onBattleEncounter?: ((...args: unknown[]) => unknown) | string;
2795
+ /** Called when hero enters a feature hex (castle, resource, etc.) */
2796
+ onFeatureEnter?: ((...args: unknown[]) => unknown) | string;
2797
+ /** -- Canvas pass-through -- */
2798
+ effectSpriteUrls?: unknown[] | string;
2799
+ /** resolveUnitFrame prop */
2800
+ resolveUnitFrame?: ((...args: unknown[]) => unknown) | string;
2801
+ /** className prop */
2802
+ className?: string;
2803
+ };
2804
+ }
2805
+ /**
2806
+ * Get the props type for a specific pattern.
2807
+ *
2808
+ * @example
2809
+ * type TableProps = PatternProps<'entity-table'>;
2810
+ * // { type: 'entity-table'; columns: unknown[]; data?: Record<string, unknown>; ... }
2811
+ */
2812
+ export type PatternProps<T extends PatternType> = PatternPropsMap[T];
2813
+ /**
2814
+ * Type-safe pattern configuration.
2815
+ * The props are validated based on the pattern type.
2816
+ *
2817
+ * @example
2818
+ * // ✅ Valid
2819
+ * const config: PatternConfig<'entity-table'> = {
2820
+ * type: 'entity-table',
2821
+ * columns: ['name', 'email']
2822
+ * };
2823
+ *
2824
+ * // ❌ Error: Property 'columns' is missing
2825
+ * const bad: PatternConfig<'entity-table'> = { type: 'entity-table' };
2826
+ */
2827
+ export type PatternConfig<T extends PatternType = PatternType> = PatternPropsMap[T];
2828
+ /**
2829
+ * Discriminated union of all pattern configs.
2830
+ * Use when the pattern type is not known statically.
2831
+ */
2832
+ export type AnyPatternConfig = PatternPropsMap[PatternType];
2833
+ /**
2834
+ * Array of all pattern type names (for runtime validation)
2835
+ */
2836
+ export declare const PATTERN_TYPES: PatternType[];
2837
+ /**
2838
+ * Check if a string is a valid pattern type
2839
+ */
2840
+ export declare function isValidPatternType(type: string): type is PatternType;