@shortstravelmgmt/component-lib 0.1.16 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,938 @@
1
1
  import * as React from 'react';
2
- import React__default, { HTMLAttributes, ButtonHTMLAttributes, InputHTMLAttributes, SVGProps, TextareaHTMLAttributes, SelectHTMLAttributes, ReactNode } from 'react';
2
+ import React__default, { CSSProperties, HTMLAttributes, ButtonHTMLAttributes, InputHTMLAttributes, SVGProps, TextareaHTMLAttributes, SelectHTMLAttributes, ReactNode, ChangeEvent } from 'react';
3
3
 
4
- type AlertVariant = 'primary' | 'success' | 'warning' | 'error';
4
+ /**
5
+ * STM Hub Design Tokens
6
+ * TypeScript implementation of the design system tokens
7
+ *
8
+ * These tokens are the single source of truth for all visual values.
9
+ * Components should use these tokens via the useTheme hook or css utility.
10
+ */
11
+ declare const brandColors: {
12
+ readonly blue: "#15538C";
13
+ readonly blueDeep: "#0E3F6E";
14
+ readonly blueTint: "#E5EDF4";
15
+ };
16
+ declare const primaryColors: {
17
+ readonly primary: "#0A53EF";
18
+ readonly primaryDark: "#1A43D1";
19
+ readonly primaryLight: "#E6ECFB";
20
+ readonly primaryLightHover: "#DAE3F8";
21
+ };
22
+ declare const neutralColors: {
23
+ readonly basecolor: "#F5F5F5";
24
+ readonly subtle: "#EFF0F0";
25
+ readonly card: "#EFEFEF";
26
+ readonly cardalt: "#EBEBEC";
27
+ readonly secondary: "#E4E5E7";
28
+ readonly secondaryDark: "#DFE1E3";
29
+ readonly tableBorder: "#D5D5D5";
30
+ readonly border: "#EDEDED";
31
+ readonly borderDark: "#D5D5D5";
32
+ readonly white: "#FFFFFF";
33
+ };
34
+ declare const textColors: {
35
+ readonly ink: "#282828";
36
+ readonly charcoal: "#3F3F3F";
37
+ readonly slate: "#5C5C5C";
38
+ readonly stone: "#787878";
39
+ readonly pending: "#C7C7CA";
40
+ readonly error: "#940000";
41
+ };
42
+ declare const statusColors: {
43
+ readonly success: "#138660";
44
+ readonly warning: "#9F5500";
45
+ readonly gold: "#FFC179";
46
+ readonly error: "#940000";
47
+ };
48
+ declare const accentColors: {
49
+ readonly mint: "#37C3A4";
50
+ readonly forest: "#003E1B";
51
+ readonly forestLight: "#E2F0EC";
52
+ readonly tangerine: "#FE7C35";
53
+ readonly tangerineLight: "#FFE2C1";
54
+ };
55
+ declare const teamColors: {
56
+ readonly men: "#8AC6D9";
57
+ readonly women: "#FFA99A";
58
+ readonly mixed: "#D1C1C3";
59
+ };
60
+ declare const travelColors: {
61
+ readonly limoBackground: "#EDE9FE";
62
+ readonly limoForeground: "#7C3AED";
63
+ readonly busBackground: "#FEF3C7";
64
+ readonly busForeground: "#D97706";
65
+ };
66
+ declare const vendorColors: {
67
+ readonly DL: {
68
+ readonly bg: "#003366";
69
+ readonly fg: "#FFFFFF";
70
+ };
71
+ readonly AA: {
72
+ readonly bg: "#0078D2";
73
+ readonly fg: "#FFFFFF";
74
+ };
75
+ readonly UA: {
76
+ readonly bg: "#002244";
77
+ readonly fg: "#FFFFFF";
78
+ };
79
+ readonly WN: {
80
+ readonly bg: "#F9B612";
81
+ readonly fg: "#304CB2";
82
+ };
83
+ readonly B6: {
84
+ readonly bg: "#003876";
85
+ readonly fg: "#FFFFFF";
86
+ };
87
+ readonly AS: {
88
+ readonly bg: "#016191";
89
+ readonly fg: "#FFFFFF";
90
+ };
91
+ readonly F9: {
92
+ readonly bg: "#2D8B45";
93
+ readonly fg: "#FFFFFF";
94
+ };
95
+ readonly NK: {
96
+ readonly bg: "#FFC72C";
97
+ readonly fg: "#000000";
98
+ };
99
+ readonly G4: {
100
+ readonly bg: "#00386C";
101
+ readonly fg: "#FFFFFF";
102
+ };
103
+ readonly HA: {
104
+ readonly bg: "#660099";
105
+ readonly fg: "#FFFFFF";
106
+ };
107
+ };
108
+ declare const gradients: {
109
+ readonly avatar: "linear-gradient(135deg, #4F7FFF 0%, #4066E8 100%)";
110
+ };
111
+ declare const alertTokens: {
112
+ readonly primary: {
113
+ readonly fg: "#0A53EF";
114
+ readonly bg: "#E6ECFB";
115
+ readonly border: "#0A53EF";
116
+ };
117
+ readonly success: {
118
+ readonly fg: "#138660";
119
+ readonly bg: "#E2F0EC";
120
+ readonly border: "#138660";
121
+ };
122
+ readonly warning: {
123
+ readonly fg: "#9F5500";
124
+ readonly bg: "#FFE2C1";
125
+ readonly border: "#FE7C35";
126
+ };
127
+ readonly error: {
128
+ readonly fg: "#940000";
129
+ readonly bg: "#FEE2E2";
130
+ readonly border: "#940000";
131
+ };
132
+ };
133
+ declare const semanticColors: {
134
+ readonly fg: {
135
+ readonly 1: "#282828";
136
+ readonly 2: "#3F3F3F";
137
+ readonly 3: "#5C5C5C";
138
+ readonly 4: "#787878";
139
+ readonly disabled: "#C7C7CA";
140
+ readonly link: "#0A53EF";
141
+ readonly linkHover: "#1A43D1";
142
+ };
143
+ readonly bg: {
144
+ readonly page: "#F5F5F5";
145
+ readonly surface: "#FFFFFF";
146
+ readonly card: "#EFEFEF";
147
+ readonly subtle: "#EFF0F0";
148
+ };
149
+ };
150
+ declare const fontFamily: {
151
+ readonly base: "'Roboto Flex', system-ui, -apple-system, 'Segoe UI', sans-serif";
152
+ readonly display: "'Roboto Flex', system-ui, -apple-system, sans-serif";
153
+ readonly mono: "'JetBrains Mono', ui-monospace, 'SFMono-Regular', Menlo, Consolas, monospace";
154
+ };
155
+ declare const fontSize: {
156
+ readonly xs: "12px";
157
+ readonly sm: "14px";
158
+ readonly base: "16px";
159
+ readonly lg: "18px";
160
+ readonly xl: "20px";
161
+ readonly '2xl': "24px";
162
+ readonly '4xl': "36px";
163
+ };
164
+ declare const lineHeight: {
165
+ readonly xs: "16px";
166
+ readonly sm: "20px";
167
+ readonly base: "24px";
168
+ readonly lg: "28px";
169
+ readonly xl: "28px";
170
+ readonly '2xl': "32px";
171
+ readonly '4xl': "40px";
172
+ readonly tight: 1.25;
173
+ readonly normal: 1.5;
174
+ };
175
+ declare const fontWeight: {
176
+ readonly light: 300;
177
+ readonly regular: 400;
178
+ readonly medium: 500;
179
+ readonly semibold: 600;
180
+ readonly bold: 700;
181
+ };
182
+ declare const spacing: {
183
+ readonly 0: "0";
184
+ readonly '0.5': "2px";
185
+ readonly 1: "4px";
186
+ readonly '1.5': "6px";
187
+ readonly 2: "8px";
188
+ readonly 3: "12px";
189
+ readonly 4: "16px";
190
+ readonly 5: "20px";
191
+ readonly 6: "24px";
192
+ readonly 7: "28px";
193
+ readonly 8: "32px";
194
+ readonly 9: "36px";
195
+ readonly 10: "40px";
196
+ readonly 12: "48px";
197
+ readonly 16: "64px";
198
+ };
199
+ declare const radius: {
200
+ readonly sm: "2px";
201
+ readonly md: "4px";
202
+ readonly lg: "6px";
203
+ readonly xl: "8px";
204
+ readonly '2xl': "12px";
205
+ readonly '3xl': "16px";
206
+ readonly full: "9999px";
207
+ };
208
+ declare const shadow: {
209
+ readonly sm: "0 1px 2px rgba(0, 0, 0, 0.04)";
210
+ readonly md: "0 4px 6px -1px rgba(0, 0, 0, 0.06), 0 2px 4px -2px rgba(0, 0, 0, 0.04)";
211
+ readonly lg: "0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04)";
212
+ };
213
+ declare const breakpoints: {
214
+ readonly sm: "640px";
215
+ readonly md: "768px";
216
+ readonly lg: "1024px";
217
+ readonly xl: "1280px";
218
+ readonly '2xl': "1536px";
219
+ };
220
+ declare const transition: {
221
+ readonly fast: "150ms ease";
222
+ readonly base: "200ms ease";
223
+ readonly slow: "300ms ease";
224
+ };
225
+ declare const lightTheme: {
226
+ readonly colors: {
227
+ readonly brand: {
228
+ readonly blue: "#15538C";
229
+ readonly blueDeep: "#0E3F6E";
230
+ readonly blueTint: "#E5EDF4";
231
+ };
232
+ readonly primary: {
233
+ readonly primary: "#0A53EF";
234
+ readonly primaryDark: "#1A43D1";
235
+ readonly primaryLight: "#E6ECFB";
236
+ readonly primaryLightHover: "#DAE3F8";
237
+ };
238
+ readonly neutral: {
239
+ readonly basecolor: "#F5F5F5";
240
+ readonly subtle: "#EFF0F0";
241
+ readonly card: "#EFEFEF";
242
+ readonly cardalt: "#EBEBEC";
243
+ readonly secondary: "#E4E5E7";
244
+ readonly secondaryDark: "#DFE1E3";
245
+ readonly tableBorder: "#D5D5D5";
246
+ readonly border: "#EDEDED";
247
+ readonly borderDark: "#D5D5D5";
248
+ readonly white: "#FFFFFF";
249
+ };
250
+ readonly text: {
251
+ readonly ink: "#282828";
252
+ readonly charcoal: "#3F3F3F";
253
+ readonly slate: "#5C5C5C";
254
+ readonly stone: "#787878";
255
+ readonly pending: "#C7C7CA";
256
+ readonly error: "#940000";
257
+ };
258
+ readonly status: {
259
+ readonly success: "#138660";
260
+ readonly warning: "#9F5500";
261
+ readonly gold: "#FFC179";
262
+ readonly error: "#940000";
263
+ };
264
+ readonly accent: {
265
+ readonly mint: "#37C3A4";
266
+ readonly forest: "#003E1B";
267
+ readonly forestLight: "#E2F0EC";
268
+ readonly tangerine: "#FE7C35";
269
+ readonly tangerineLight: "#FFE2C1";
270
+ };
271
+ readonly team: {
272
+ readonly men: "#8AC6D9";
273
+ readonly women: "#FFA99A";
274
+ readonly mixed: "#D1C1C3";
275
+ };
276
+ readonly travel: {
277
+ readonly limoBackground: "#EDE9FE";
278
+ readonly limoForeground: "#7C3AED";
279
+ readonly busBackground: "#FEF3C7";
280
+ readonly busForeground: "#D97706";
281
+ };
282
+ readonly vendor: {
283
+ readonly DL: {
284
+ readonly bg: "#003366";
285
+ readonly fg: "#FFFFFF";
286
+ };
287
+ readonly AA: {
288
+ readonly bg: "#0078D2";
289
+ readonly fg: "#FFFFFF";
290
+ };
291
+ readonly UA: {
292
+ readonly bg: "#002244";
293
+ readonly fg: "#FFFFFF";
294
+ };
295
+ readonly WN: {
296
+ readonly bg: "#F9B612";
297
+ readonly fg: "#304CB2";
298
+ };
299
+ readonly B6: {
300
+ readonly bg: "#003876";
301
+ readonly fg: "#FFFFFF";
302
+ };
303
+ readonly AS: {
304
+ readonly bg: "#016191";
305
+ readonly fg: "#FFFFFF";
306
+ };
307
+ readonly F9: {
308
+ readonly bg: "#2D8B45";
309
+ readonly fg: "#FFFFFF";
310
+ };
311
+ readonly NK: {
312
+ readonly bg: "#FFC72C";
313
+ readonly fg: "#000000";
314
+ };
315
+ readonly G4: {
316
+ readonly bg: "#00386C";
317
+ readonly fg: "#FFFFFF";
318
+ };
319
+ readonly HA: {
320
+ readonly bg: "#660099";
321
+ readonly fg: "#FFFFFF";
322
+ };
323
+ };
324
+ readonly alert: {
325
+ readonly primary: {
326
+ readonly fg: "#0A53EF";
327
+ readonly bg: "#E6ECFB";
328
+ readonly border: "#0A53EF";
329
+ };
330
+ readonly success: {
331
+ readonly fg: "#138660";
332
+ readonly bg: "#E2F0EC";
333
+ readonly border: "#138660";
334
+ };
335
+ readonly warning: {
336
+ readonly fg: "#9F5500";
337
+ readonly bg: "#FFE2C1";
338
+ readonly border: "#FE7C35";
339
+ };
340
+ readonly error: {
341
+ readonly fg: "#940000";
342
+ readonly bg: "#FEE2E2";
343
+ readonly border: "#940000";
344
+ };
345
+ };
346
+ readonly semantic: {
347
+ readonly fg: {
348
+ readonly 1: "#282828";
349
+ readonly 2: "#3F3F3F";
350
+ readonly 3: "#5C5C5C";
351
+ readonly 4: "#787878";
352
+ readonly disabled: "#C7C7CA";
353
+ readonly link: "#0A53EF";
354
+ readonly linkHover: "#1A43D1";
355
+ };
356
+ readonly bg: {
357
+ readonly page: "#F5F5F5";
358
+ readonly surface: "#FFFFFF";
359
+ readonly card: "#EFEFEF";
360
+ readonly subtle: "#EFF0F0";
361
+ };
362
+ };
363
+ };
364
+ readonly typography: {
365
+ readonly fontFamily: {
366
+ readonly base: "'Roboto Flex', system-ui, -apple-system, 'Segoe UI', sans-serif";
367
+ readonly display: "'Roboto Flex', system-ui, -apple-system, sans-serif";
368
+ readonly mono: "'JetBrains Mono', ui-monospace, 'SFMono-Regular', Menlo, Consolas, monospace";
369
+ };
370
+ readonly fontSize: {
371
+ readonly xs: "12px";
372
+ readonly sm: "14px";
373
+ readonly base: "16px";
374
+ readonly lg: "18px";
375
+ readonly xl: "20px";
376
+ readonly '2xl': "24px";
377
+ readonly '4xl': "36px";
378
+ };
379
+ readonly lineHeight: {
380
+ readonly xs: "16px";
381
+ readonly sm: "20px";
382
+ readonly base: "24px";
383
+ readonly lg: "28px";
384
+ readonly xl: "28px";
385
+ readonly '2xl': "32px";
386
+ readonly '4xl': "40px";
387
+ readonly tight: 1.25;
388
+ readonly normal: 1.5;
389
+ };
390
+ readonly fontWeight: {
391
+ readonly light: 300;
392
+ readonly regular: 400;
393
+ readonly medium: 500;
394
+ readonly semibold: 600;
395
+ readonly bold: 700;
396
+ };
397
+ };
398
+ readonly spacing: {
399
+ readonly 0: "0";
400
+ readonly '0.5': "2px";
401
+ readonly 1: "4px";
402
+ readonly '1.5': "6px";
403
+ readonly 2: "8px";
404
+ readonly 3: "12px";
405
+ readonly 4: "16px";
406
+ readonly 5: "20px";
407
+ readonly 6: "24px";
408
+ readonly 7: "28px";
409
+ readonly 8: "32px";
410
+ readonly 9: "36px";
411
+ readonly 10: "40px";
412
+ readonly 12: "48px";
413
+ readonly 16: "64px";
414
+ };
415
+ readonly radius: {
416
+ readonly sm: "2px";
417
+ readonly md: "4px";
418
+ readonly lg: "6px";
419
+ readonly xl: "8px";
420
+ readonly '2xl': "12px";
421
+ readonly '3xl': "16px";
422
+ readonly full: "9999px";
423
+ };
424
+ readonly shadow: {
425
+ readonly sm: "0 1px 2px rgba(0, 0, 0, 0.04)";
426
+ readonly md: "0 4px 6px -1px rgba(0, 0, 0, 0.06), 0 2px 4px -2px rgba(0, 0, 0, 0.04)";
427
+ readonly lg: "0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04)";
428
+ };
429
+ readonly breakpoints: {
430
+ readonly sm: "640px";
431
+ readonly md: "768px";
432
+ readonly lg: "1024px";
433
+ readonly xl: "1280px";
434
+ readonly '2xl': "1536px";
435
+ };
436
+ readonly transition: {
437
+ readonly fast: "150ms ease";
438
+ readonly base: "200ms ease";
439
+ readonly slow: "300ms ease";
440
+ };
441
+ readonly gradients: {
442
+ readonly avatar: "linear-gradient(135deg, #4F7FFF 0%, #4066E8 100%)";
443
+ };
444
+ };
445
+ declare const darkTheme: {
446
+ readonly colors: {
447
+ readonly neutral: {
448
+ readonly basecolor: "#1a1a1a";
449
+ readonly subtle: "#2a2a2a";
450
+ readonly card: "#252525";
451
+ readonly cardalt: "#2f2f2f";
452
+ readonly secondary: "#3a3a3a";
453
+ readonly secondaryDark: "#454545";
454
+ readonly tableBorder: "#4a4a4a";
455
+ readonly border: "#3a3a3a";
456
+ readonly borderDark: "#4a4a4a";
457
+ readonly white: "#1a1a1a";
458
+ };
459
+ readonly text: {
460
+ readonly ink: "#f0f0f0";
461
+ readonly charcoal: "#d0d0d0";
462
+ readonly slate: "#a0a0a0";
463
+ readonly stone: "#808080";
464
+ readonly pending: "#606060";
465
+ readonly error: "#ff6b6b";
466
+ };
467
+ readonly semantic: {
468
+ readonly fg: {
469
+ readonly 1: "#f0f0f0";
470
+ readonly 2: "#d0d0d0";
471
+ readonly 3: "#a0a0a0";
472
+ readonly 4: "#808080";
473
+ readonly disabled: "#606060";
474
+ readonly link: "#0A53EF";
475
+ readonly linkHover: "#1A43D1";
476
+ };
477
+ readonly bg: {
478
+ readonly page: "#1a1a1a";
479
+ readonly surface: "#252525";
480
+ readonly card: "#252525";
481
+ readonly subtle: "#2a2a2a";
482
+ };
483
+ };
484
+ readonly brand: {
485
+ readonly blue: "#15538C";
486
+ readonly blueDeep: "#0E3F6E";
487
+ readonly blueTint: "#E5EDF4";
488
+ };
489
+ readonly primary: {
490
+ readonly primary: "#0A53EF";
491
+ readonly primaryDark: "#1A43D1";
492
+ readonly primaryLight: "#E6ECFB";
493
+ readonly primaryLightHover: "#DAE3F8";
494
+ };
495
+ readonly status: {
496
+ readonly success: "#138660";
497
+ readonly warning: "#9F5500";
498
+ readonly gold: "#FFC179";
499
+ readonly error: "#940000";
500
+ };
501
+ readonly accent: {
502
+ readonly mint: "#37C3A4";
503
+ readonly forest: "#003E1B";
504
+ readonly forestLight: "#E2F0EC";
505
+ readonly tangerine: "#FE7C35";
506
+ readonly tangerineLight: "#FFE2C1";
507
+ };
508
+ readonly team: {
509
+ readonly men: "#8AC6D9";
510
+ readonly women: "#FFA99A";
511
+ readonly mixed: "#D1C1C3";
512
+ };
513
+ readonly travel: {
514
+ readonly limoBackground: "#EDE9FE";
515
+ readonly limoForeground: "#7C3AED";
516
+ readonly busBackground: "#FEF3C7";
517
+ readonly busForeground: "#D97706";
518
+ };
519
+ readonly vendor: {
520
+ readonly DL: {
521
+ readonly bg: "#003366";
522
+ readonly fg: "#FFFFFF";
523
+ };
524
+ readonly AA: {
525
+ readonly bg: "#0078D2";
526
+ readonly fg: "#FFFFFF";
527
+ };
528
+ readonly UA: {
529
+ readonly bg: "#002244";
530
+ readonly fg: "#FFFFFF";
531
+ };
532
+ readonly WN: {
533
+ readonly bg: "#F9B612";
534
+ readonly fg: "#304CB2";
535
+ };
536
+ readonly B6: {
537
+ readonly bg: "#003876";
538
+ readonly fg: "#FFFFFF";
539
+ };
540
+ readonly AS: {
541
+ readonly bg: "#016191";
542
+ readonly fg: "#FFFFFF";
543
+ };
544
+ readonly F9: {
545
+ readonly bg: "#2D8B45";
546
+ readonly fg: "#FFFFFF";
547
+ };
548
+ readonly NK: {
549
+ readonly bg: "#FFC72C";
550
+ readonly fg: "#000000";
551
+ };
552
+ readonly G4: {
553
+ readonly bg: "#00386C";
554
+ readonly fg: "#FFFFFF";
555
+ };
556
+ readonly HA: {
557
+ readonly bg: "#660099";
558
+ readonly fg: "#FFFFFF";
559
+ };
560
+ };
561
+ readonly alert: {
562
+ readonly primary: {
563
+ readonly fg: "#0A53EF";
564
+ readonly bg: "#E6ECFB";
565
+ readonly border: "#0A53EF";
566
+ };
567
+ readonly success: {
568
+ readonly fg: "#138660";
569
+ readonly bg: "#E2F0EC";
570
+ readonly border: "#138660";
571
+ };
572
+ readonly warning: {
573
+ readonly fg: "#9F5500";
574
+ readonly bg: "#FFE2C1";
575
+ readonly border: "#FE7C35";
576
+ };
577
+ readonly error: {
578
+ readonly fg: "#940000";
579
+ readonly bg: "#FEE2E2";
580
+ readonly border: "#940000";
581
+ };
582
+ };
583
+ };
584
+ readonly typography: {
585
+ readonly fontFamily: {
586
+ readonly base: "'Roboto Flex', system-ui, -apple-system, 'Segoe UI', sans-serif";
587
+ readonly display: "'Roboto Flex', system-ui, -apple-system, sans-serif";
588
+ readonly mono: "'JetBrains Mono', ui-monospace, 'SFMono-Regular', Menlo, Consolas, monospace";
589
+ };
590
+ readonly fontSize: {
591
+ readonly xs: "12px";
592
+ readonly sm: "14px";
593
+ readonly base: "16px";
594
+ readonly lg: "18px";
595
+ readonly xl: "20px";
596
+ readonly '2xl': "24px";
597
+ readonly '4xl': "36px";
598
+ };
599
+ readonly lineHeight: {
600
+ readonly xs: "16px";
601
+ readonly sm: "20px";
602
+ readonly base: "24px";
603
+ readonly lg: "28px";
604
+ readonly xl: "28px";
605
+ readonly '2xl': "32px";
606
+ readonly '4xl': "40px";
607
+ readonly tight: 1.25;
608
+ readonly normal: 1.5;
609
+ };
610
+ readonly fontWeight: {
611
+ readonly light: 300;
612
+ readonly regular: 400;
613
+ readonly medium: 500;
614
+ readonly semibold: 600;
615
+ readonly bold: 700;
616
+ };
617
+ };
618
+ readonly spacing: {
619
+ readonly 0: "0";
620
+ readonly '0.5': "2px";
621
+ readonly 1: "4px";
622
+ readonly '1.5': "6px";
623
+ readonly 2: "8px";
624
+ readonly 3: "12px";
625
+ readonly 4: "16px";
626
+ readonly 5: "20px";
627
+ readonly 6: "24px";
628
+ readonly 7: "28px";
629
+ readonly 8: "32px";
630
+ readonly 9: "36px";
631
+ readonly 10: "40px";
632
+ readonly 12: "48px";
633
+ readonly 16: "64px";
634
+ };
635
+ readonly radius: {
636
+ readonly sm: "2px";
637
+ readonly md: "4px";
638
+ readonly lg: "6px";
639
+ readonly xl: "8px";
640
+ readonly '2xl': "12px";
641
+ readonly '3xl': "16px";
642
+ readonly full: "9999px";
643
+ };
644
+ readonly shadow: {
645
+ readonly sm: "0 1px 2px rgba(0, 0, 0, 0.04)";
646
+ readonly md: "0 4px 6px -1px rgba(0, 0, 0, 0.06), 0 2px 4px -2px rgba(0, 0, 0, 0.04)";
647
+ readonly lg: "0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04)";
648
+ };
649
+ readonly breakpoints: {
650
+ readonly sm: "640px";
651
+ readonly md: "768px";
652
+ readonly lg: "1024px";
653
+ readonly xl: "1280px";
654
+ readonly '2xl': "1536px";
655
+ };
656
+ readonly transition: {
657
+ readonly fast: "150ms ease";
658
+ readonly base: "200ms ease";
659
+ readonly slow: "300ms ease";
660
+ };
661
+ readonly gradients: {
662
+ readonly avatar: "linear-gradient(135deg, #4F7FFF 0%, #4066E8 100%)";
663
+ };
664
+ };
665
+ /**
666
+ * Theme interface - allows both light and dark themes to be assignable.
667
+ * Uses structural typing rather than literal types for color values.
668
+ */
669
+ interface Theme {
670
+ colors: {
671
+ brand: typeof brandColors;
672
+ primary: typeof primaryColors;
673
+ neutral: {
674
+ basecolor: string;
675
+ subtle: string;
676
+ card: string;
677
+ cardalt: string;
678
+ secondary: string;
679
+ secondaryDark: string;
680
+ tableBorder: string;
681
+ border: string;
682
+ borderDark: string;
683
+ white: string;
684
+ };
685
+ text: {
686
+ ink: string;
687
+ charcoal: string;
688
+ slate: string;
689
+ stone: string;
690
+ pending: string;
691
+ error: string;
692
+ };
693
+ status: typeof statusColors;
694
+ accent: typeof accentColors;
695
+ team: typeof teamColors;
696
+ travel: typeof travelColors;
697
+ vendor: typeof vendorColors;
698
+ alert: typeof alertTokens;
699
+ semantic: {
700
+ fg: {
701
+ 1: string;
702
+ 2: string;
703
+ 3: string;
704
+ 4: string;
705
+ disabled: string;
706
+ link: string;
707
+ linkHover: string;
708
+ };
709
+ bg: {
710
+ page: string;
711
+ surface: string;
712
+ card: string;
713
+ subtle: string;
714
+ };
715
+ };
716
+ };
717
+ typography: {
718
+ fontFamily: typeof fontFamily;
719
+ fontSize: typeof fontSize;
720
+ lineHeight: typeof lineHeight;
721
+ fontWeight: typeof fontWeight;
722
+ };
723
+ spacing: typeof spacing;
724
+ radius: typeof radius;
725
+ shadow: typeof shadow;
726
+ breakpoints: typeof breakpoints;
727
+ transition: typeof transition;
728
+ gradients: typeof gradients;
729
+ }
730
+ type ThemeColors = Theme['colors'];
731
+ type ThemeTypography = Theme['typography'];
732
+ type ThemeSpacing = keyof typeof spacing;
733
+ type ThemeRadius = keyof typeof radius;
734
+ type ThemeShadow = keyof typeof shadow;
735
+ type ThemeBreakpoint = keyof typeof breakpoints;
736
+ type ThemeTransition = keyof typeof transition;
737
+
738
+ type ThemeMode = 'light' | 'dark' | 'system';
739
+ interface ThemeContextValue {
740
+ /** Current resolved theme object */
741
+ theme: Theme;
742
+ /** Current theme mode setting */
743
+ mode: ThemeMode;
744
+ /** Whether dark mode is currently active */
745
+ isDark: boolean;
746
+ /** Update the theme mode */
747
+ setMode: (mode: ThemeMode) => void;
748
+ /** Toggle between light and dark modes */
749
+ toggleTheme: () => void;
750
+ }
751
+ /**
752
+ * Access the current theme context.
753
+ *
754
+ * Outside a ThemeProvider this resolves to the light theme with no-op mode
755
+ * setters, so components stay renderable on their own.
756
+ *
757
+ * @example
758
+ * ```tsx
759
+ * const { theme, isDark, toggleTheme } = useTheme();
760
+ *
761
+ * const buttonStyle = css({
762
+ * backgroundColor: theme.colors.primary.primary,
763
+ * color: theme.colors.neutral.white,
764
+ * });
765
+ * ```
766
+ */
767
+ declare function useTheme(): ThemeContextValue;
768
+ interface ThemeProviderProps {
769
+ /** Child components */
770
+ children: React__default.ReactNode;
771
+ /** Initial theme mode (default: 'system') */
772
+ defaultMode?: ThemeMode;
773
+ /** Storage key for persisting theme preference */
774
+ storageKey?: string;
775
+ /** Whether to add theme class to document root */
776
+ applyToRoot?: boolean;
777
+ }
778
+ /**
779
+ * Provides theme context to child components.
780
+ * Supports light, dark, and system-preference modes.
781
+ *
782
+ * @example
783
+ * ```tsx
784
+ * // Basic usage
785
+ * <ThemeProvider>
786
+ * <App />
787
+ * </ThemeProvider>
788
+ *
789
+ * // With initial dark mode
790
+ * <ThemeProvider defaultMode="dark">
791
+ * <App />
792
+ * </ThemeProvider>
793
+ *
794
+ * // With persistence
795
+ * <ThemeProvider storageKey="stm-theme-mode">
796
+ * <App />
797
+ * </ThemeProvider>
798
+ * ```
799
+ */
800
+ declare function ThemeProvider({ children, defaultMode, storageKey, applyToRoot, }: ThemeProviderProps): React__default.ReactElement;
801
+
802
+ /**
803
+ * CSS object type - extends React's CSSProperties.
804
+ * Simpler type to avoid complex union issues.
805
+ */
806
+ type CSSObject = CSSProperties & Record<string, unknown>;
807
+ type StyleFunction<P = object> = (props: P & {
808
+ theme: Theme;
809
+ }) => CSSObject;
810
+ /**
811
+ * Create a CSS object with type safety.
812
+ * Converts nested pseudo-selectors for inline style compatibility.
813
+ *
814
+ * @example
815
+ * ```tsx
816
+ * const buttonStyle = css({
817
+ * backgroundColor: theme.colors.primary.primary,
818
+ * padding: `${theme.spacing[2]} ${theme.spacing[4]}`,
819
+ * borderRadius: theme.radius.full,
820
+ * '&:hover': {
821
+ * backgroundColor: theme.colors.primary.primaryDark,
822
+ * },
823
+ * });
824
+ * ```
825
+ */
826
+ declare function css(styles: CSSObject): CSSObject;
827
+ /**
828
+ * Merge multiple CSS objects together.
829
+ * Later objects override earlier ones.
830
+ *
831
+ * @example
832
+ * ```tsx
833
+ * const combined = merge(baseStyle, variantStyle, sizeStyle);
834
+ * ```
835
+ */
836
+ declare function merge(...styles: (CSSObject | CSSProperties | Record<string, unknown> | undefined | null | false)[]): CSSObject;
837
+ /**
838
+ * Convert a CSSObject to inline styles.
839
+ * Strips out pseudo-selectors (they can't be inlined).
840
+ */
841
+ declare function toInlineStyle(styles: CSSObject): CSSProperties;
842
+ /**
843
+ * Create spacing value from theme tokens.
844
+ */
845
+ declare function space(value: keyof typeof spacing | number): string;
846
+ /**
847
+ * Create border-radius value from theme tokens.
848
+ */
849
+ declare function rounded(value: keyof typeof radius): string;
850
+ /**
851
+ * Create box-shadow value from theme tokens.
852
+ */
853
+ declare function boxShadow(value: keyof typeof shadow): string;
854
+ /**
855
+ * Create transition value from theme tokens.
856
+ */
857
+ declare function trans(value: keyof typeof transition): string;
858
+ /**
859
+ * Create font-weight value from theme tokens.
860
+ */
861
+ declare function weight(value: keyof typeof fontWeight): number;
862
+ /**
863
+ * Create font-size value from theme tokens.
864
+ */
865
+ declare function size(value: keyof typeof fontSize): string;
866
+ /**
867
+ * Create line-height value from theme tokens.
868
+ */
869
+ declare function leading(value: keyof typeof lineHeight): string | number;
870
+ /**
871
+ * Create font-family value from theme tokens.
872
+ */
873
+ declare function font(value: keyof typeof fontFamily): string;
874
+ /**
875
+ * Reset button styles.
876
+ */
877
+ declare const buttonReset: CSSObject;
878
+ /**
879
+ * Flex center alignment.
880
+ */
881
+ declare const flexCenter: CSSObject;
882
+ /**
883
+ * Flex row with gap.
884
+ */
885
+ declare function flexRow(gap?: keyof typeof spacing): CSSObject;
886
+ /**
887
+ * Flex column with gap.
888
+ */
889
+ declare function flexCol(gap?: keyof typeof spacing): CSSObject;
890
+ /**
891
+ * Absolute fill parent.
892
+ */
893
+ declare const absoluteFill: CSSObject;
894
+ /**
895
+ * Screen reader only (visually hidden but accessible).
896
+ */
897
+ declare const srOnly: CSSObject;
898
+ /**
899
+ * Truncate text with ellipsis.
900
+ */
901
+ declare const truncate: CSSObject;
902
+ /**
903
+ * Line clamp for multi-line truncation.
904
+ */
905
+ declare function lineClamp(lines: number): CSSObject;
906
+ /**
907
+ * Create a style factory that receives the theme.
908
+ * Use with useTheme() hook.
909
+ *
910
+ * @example
911
+ * ```tsx
912
+ * const useButtonStyles = styled((theme) => ({
913
+ * root: css({
914
+ * backgroundColor: theme.colors.primary.primary,
915
+ * color: theme.colors.neutral.white,
916
+ * }),
917
+ * disabled: css({
918
+ * opacity: 0.5,
919
+ * cursor: 'not-allowed',
920
+ * }),
921
+ * }));
922
+ *
923
+ * function Button() {
924
+ * const { theme } = useTheme();
925
+ * const styles = useButtonStyles(theme);
926
+ * return <button style={toInlineStyle(styles.root)}>Click</button>;
927
+ * }
928
+ * ```
929
+ */
930
+ declare function styled<T extends Record<string, CSSObject>>(factory: (theme: Theme) => T): (theme: Theme) => T;
931
+
932
+ type AlertVariant$1 = 'primary' | 'success' | 'warning' | 'error';
5
933
  interface AlertProps {
6
934
  /** Visual style variant */
7
- variant?: AlertVariant;
935
+ variant?: AlertVariant$1;
8
936
  /** Optional title for the alert */
9
937
  title?: string;
10
938
  /** Content of the alert */
@@ -18,6 +946,42 @@ interface AlertProps {
18
946
  }
19
947
  declare const Alert: React__default.FC<AlertProps>;
20
948
 
949
+ type AlertVariant = 'primary' | 'success' | 'warning' | 'error';
950
+
951
+ interface AlertStyledProps {
952
+ /** Visual style variant */
953
+ variant?: AlertVariant;
954
+ /** Optional title for the alert */
955
+ title?: string;
956
+ /** Content of the alert */
957
+ children: React__default.ReactNode;
958
+ /** Whether the alert can be dismissed */
959
+ dismissible?: boolean;
960
+ /** Callback when dismiss button is clicked */
961
+ onDismiss?: () => void;
962
+ /** Additional inline styles */
963
+ style?: React__default.CSSProperties;
964
+ /** Data test attribute for testing */
965
+ 'data-test'?: string;
966
+ }
967
+ /**
968
+ * Alert component for displaying important messages.
969
+ * Uses CSS-in-JS styling with theme support.
970
+ * Supports primary, success, warning, and error variants.
971
+ *
972
+ * @example
973
+ * ```tsx
974
+ * <AlertStyled variant="success" title="Success!">
975
+ * Your changes have been saved.
976
+ * </AlertStyled>
977
+ *
978
+ * <AlertStyled variant="error" dismissible onDismiss={() => setShow(false)}>
979
+ * An error occurred. Please try again.
980
+ * </AlertStyled>
981
+ * ```
982
+ */
983
+ declare const AlertStyled: React__default.FC<AlertStyledProps>;
984
+
21
985
  type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
22
986
  interface AvatarProps extends HTMLAttributes<HTMLDivElement> {
23
987
  /** Image source URL */
@@ -29,7 +993,11 @@ interface AvatarProps extends HTMLAttributes<HTMLDivElement> {
29
993
  /** Name (used to generate initials if not provided) */
30
994
  name?: string;
31
995
  /** Size of the avatar */
32
- size?: AvatarSize;
996
+ /**
997
+ * One of the named sizes, or an explicit pixel value for hosts pinned to a
998
+ * dimension the scale does not carry.
999
+ */
1000
+ size?: AvatarSize | number;
33
1001
  }
34
1002
  /**
35
1003
  * Avatar component for user profile images or initials.
@@ -56,9 +1024,34 @@ interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
56
1024
  */
57
1025
  declare const Badge: React__default.FC<BadgeProps>;
58
1026
 
59
- type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';
60
- type ButtonSize = 'sm' | 'md' | 'lg';
1027
+ type ButtonVariant$1 = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';
1028
+ type ButtonSize$1 = 'sm' | 'md' | 'lg';
61
1029
  interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
1030
+ /** Visual style variant */
1031
+ variant?: ButtonVariant$1;
1032
+ /** Size of the button */
1033
+ size?: ButtonSize$1;
1034
+ /** Makes button take full width */
1035
+ fullWidth?: boolean;
1036
+ /** Shows loading spinner */
1037
+ loading?: boolean;
1038
+ /** Icon element to show before text */
1039
+ leftIcon?: React__default.ReactNode;
1040
+ /** Icon element to show after text */
1041
+ rightIcon?: React__default.ReactNode;
1042
+ /** Makes button square (equal width/height) */
1043
+ square?: boolean;
1044
+ }
1045
+ /**
1046
+ * Primary button component for user interactions.
1047
+ * Supports multiple variants, sizes, and states.
1048
+ */
1049
+ declare const Button: React__default.ForwardRefExoticComponent<ButtonProps & React__default.RefAttributes<HTMLButtonElement>>;
1050
+
1051
+ type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' | 'primary-light' | 'outline-primary' | 'outline-secondary' | 'outline-charcoal' | 'charcoal' | 'text';
1052
+ type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';
1053
+
1054
+ interface ButtonStyledProps extends ButtonHTMLAttributes<HTMLButtonElement> {
62
1055
  /** Visual style variant */
63
1056
  variant?: ButtonVariant;
64
1057
  /** Size of the button */
@@ -76,9 +1069,25 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
76
1069
  }
77
1070
  /**
78
1071
  * Primary button component for user interactions.
1072
+ * Uses CSS-in-JS styling with theme support.
79
1073
  * Supports multiple variants, sizes, and states.
1074
+ *
1075
+ * @example
1076
+ * ```tsx
1077
+ * <ButtonStyled variant="primary" size="md">
1078
+ * Click me
1079
+ * </ButtonStyled>
1080
+ *
1081
+ * <ButtonStyled variant="outline" leftIcon={<PlusIcon />}>
1082
+ * Add item
1083
+ * </ButtonStyled>
1084
+ *
1085
+ * <ButtonStyled loading>
1086
+ * Processing...
1087
+ * </ButtonStyled>
1088
+ * ```
80
1089
  */
81
- declare const Button: React__default.ForwardRefExoticComponent<ButtonProps & React__default.RefAttributes<HTMLButtonElement>>;
1090
+ declare const ButtonStyled: React__default.ForwardRefExoticComponent<ButtonStyledProps & React__default.RefAttributes<HTMLButtonElement>>;
82
1091
 
83
1092
  interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {
84
1093
  /** Label text for the checkbox */
@@ -147,6 +1156,7 @@ declare const UserIcon: React__default.FC<IconProps>;
147
1156
  declare const UsersIcon: React__default.FC<IconProps>;
148
1157
  declare const MailIcon: React__default.FC<IconProps>;
149
1158
  declare const PhoneIcon: React__default.FC<IconProps>;
1159
+ declare const HeadsetIcon: React__default.FC<IconProps>;
150
1160
  declare const PrinterIcon: React__default.FC<IconProps>;
151
1161
  declare const RefreshIcon: React__default.FC<IconProps>;
152
1162
  declare const WarningIcon: React__default.FC<IconProps>;
@@ -333,18 +1343,18 @@ interface SpinnerProps {
333
1343
  }
334
1344
  declare const Spinner: React__default.FC<SpinnerProps>;
335
1345
 
336
- type StatusBadgeVariant = 'ticketed' | 'itinerary' | 'not-ticketed' | 'submitted' | 'pending' | 'cancelled';
337
- interface StatusBadgeProps {
1346
+ type StatusBadgeVariant = 'ticketed' | 'itinerary' | 'not-ticketed' | 'submitted' | 'pending' | 'cancelled' | 'approved' | 'rejected' | 'in-review';
1347
+ interface StatusBadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
338
1348
  /** The status variant to display */
339
1349
  status: StatusBadgeVariant;
340
1350
  /** Optional custom label (defaults to formatted status) */
341
1351
  label?: string;
342
- /** Additional CSS class */
343
- className?: string;
344
1352
  }
345
1353
  declare const StatusBadge: React__default.FC<StatusBadgeProps>;
346
1354
 
347
- type TagVariant = 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info';
1355
+ type TagVariant = 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info'
1356
+ /** No fill or colour of its own — inherits, for grouping content inline. */
1357
+ | 'plain';
348
1358
  type TagSize = 'sm' | 'md' | 'lg';
349
1359
  interface TagProps {
350
1360
  /** Tag content */
@@ -364,7 +1374,7 @@ interface TagProps {
364
1374
  /** Inline styles */
365
1375
  style?: React__default.CSSProperties;
366
1376
  }
367
- declare const Tag: React__default.FC<TagProps>;
1377
+ declare const Tag: React__default.ForwardRefExoticComponent<TagProps & React__default.RefAttributes<HTMLSpanElement>>;
368
1378
 
369
1379
  type TimepickerSize = 'sm' | 'md' | 'lg';
370
1380
  interface TimepickerProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {
@@ -419,6 +1429,21 @@ interface ToggleProps {
419
1429
  className?: string;
420
1430
  /** Accessible name for the toggle */
421
1431
  'aria-label'?: string;
1432
+ /**
1433
+ * Field name. Supplying it renders a hidden checkbox so the toggle submits
1434
+ * with a surrounding form; without it the toggle is presentational.
1435
+ */
1436
+ name?: string;
1437
+ /** Id applied to the hidden checkbox, for an external `<label htmlFor>`. */
1438
+ id?: string;
1439
+ /** Class applied to the label wrapper, when a `label` is given. */
1440
+ wrapperClassName?: string;
1441
+ /**
1442
+ * Indicator shown inside the track while disabled — usually a padlock, to
1443
+ * explain why the control cannot be moved. Takes a node so the component
1444
+ * stays independent of any icon set.
1445
+ */
1446
+ disabledIcon?: ReactNode;
422
1447
  }
423
1448
  declare const Toggle: React__default.FC<ToggleProps>;
424
1449
 
@@ -443,20 +1468,18 @@ interface TooltipProps {
443
1468
  declare const Tooltip: React__default.FC<TooltipProps>;
444
1469
 
445
1470
  type TravelType = 'A' | 'C' | 'H' | 'L' | 'R' | 'B' | 'U';
446
- interface TypeIconProps {
1471
+ interface TypeIconProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
447
1472
  /** Travel type code: A=Air, C=Car, H=Hotel, L=Limo, R=Rail, B=Bus, U=Unknown */
448
1473
  type: TravelType;
449
1474
  /** Size in pixels */
450
1475
  size?: number;
451
1476
  /** Show tooltip on hover */
452
1477
  showTooltip?: boolean;
453
- /** Additional CSS class */
454
- className?: string;
455
1478
  }
456
1479
  declare const TypeIcon: React__default.FC<TypeIconProps>;
457
1480
 
458
1481
  type VendorCode = 'DL' | 'AA' | 'UA' | 'WN' | 'B6' | 'AS' | 'F9' | 'NK' | 'G4' | 'HA' | string;
459
- interface TravelServiceIconProps {
1482
+ interface TravelServiceIconProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
460
1483
  /** Travel type: A=Air, C=Car, H=Hotel, L=Limo, R=Rail */
461
1484
  type: TravelType;
462
1485
  /** Vendor/airline code (e.g., DL, AA, UA) */
@@ -467,8 +1490,6 @@ interface TravelServiceIconProps {
467
1490
  size?: number;
468
1491
  /** Show multi-segment indicator */
469
1492
  multi?: boolean;
470
- /** Additional CSS class */
471
- className?: string;
472
1493
  }
473
1494
  declare const TravelServiceIcon: React__default.FC<TravelServiceIconProps>;
474
1495
 
@@ -510,8 +1531,14 @@ interface SegmentedSelectorProps {
510
1531
  ariaLabel?: string;
511
1532
  /** Stable hook used by Hub acceptance and Chromatic tests. */
512
1533
  dataTest?: string;
513
- }
514
- declare const SegmentedSelector: ({ options, value, onChange, disabled, size, className, ariaLabel, dataTest, }: SegmentedSelectorProps) => React.JSX.Element;
1534
+ /** Class applied to every option button. */
1535
+ itemClassName?: string;
1536
+ /** Class applied to the selected option, on top of `itemClassName`. */
1537
+ activeItemClassName?: string;
1538
+ /** Which side of the label an option's icon sits on. Defaults to left. */
1539
+ iconPosition?: 'left' | 'right';
1540
+ }
1541
+ declare const SegmentedSelector: ({ options, value, onChange, disabled, size, className, ariaLabel, dataTest, itemClassName, activeItemClassName, iconPosition, }: SegmentedSelectorProps) => React.JSX.Element;
515
1542
  type CalendarViewValue = 'calendar' | 'card' | 'list';
516
1543
  interface CalendarViewSelectorProps extends Omit<SegmentedSelectorProps, 'options' | 'value' | 'onChange' | 'ariaLabel'> {
517
1544
  value: CalendarViewValue;
@@ -525,6 +1552,67 @@ interface CalendarTypeSelectorProps extends Omit<SegmentedSelectorProps, 'option
525
1552
  }
526
1553
  declare const CalendarTypeSelector: ({ value, onChange, ...props }: CalendarTypeSelectorProps) => React.JSX.Element;
527
1554
 
1555
+ interface ContactCardProps {
1556
+ /** Person's name. Also seeds the avatar's initials. */
1557
+ name?: string;
1558
+ /** Role or job title, shown under the name. */
1559
+ title?: string;
1560
+ /** Phone number, rendered as a `tel:` link. */
1561
+ phone?: string;
1562
+ /** Email address, rendered as a `mailto:` link. */
1563
+ email?: string;
1564
+ /**
1565
+ * Replaces the plain name with your own control — a button opening a
1566
+ * profile, say. The name is still used for the avatar's initials.
1567
+ */
1568
+ action?: ReactNode;
1569
+ /** Whether to show the avatar. */
1570
+ showAvatar?: boolean;
1571
+ /** Additional CSS class */
1572
+ className?: string;
1573
+ }
1574
+ /**
1575
+ * A single person's contact details: avatar, name, title, and tappable phone
1576
+ * and email links.
1577
+ *
1578
+ * Renders nothing when there is neither a name nor an action, so callers can
1579
+ * hand it a partially filled record without guarding first.
1580
+ */
1581
+ declare const ContactCard: React__default.FC<ContactCardProps>;
1582
+
1583
+ type DetailListVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'error';
1584
+ interface DetailListItem {
1585
+ /** Name of the field. Omitted for icon rows, which read as a single line. */
1586
+ label?: ReactNode;
1587
+ /** The value. A row with nothing to show is skipped. */
1588
+ description?: ReactNode;
1589
+ /** Leading icon. Supplying one makes this an icon row rather than a pair. */
1590
+ icon?: ReactNode;
1591
+ /** Tints the value as a status chip. */
1592
+ variant?: DetailListVariant;
1593
+ }
1594
+ interface DetailListProps {
1595
+ /** Rows to show. Items with no description are skipped. */
1596
+ items: DetailListItem[];
1597
+ /** Space between rows, and between an icon and its text, in pixels. */
1598
+ gap?: number;
1599
+ /** Additional CSS class */
1600
+ className?: string;
1601
+ }
1602
+ /**
1603
+ * A compact list of field/value pairs, as used down the side of a trip or
1604
+ * booking summary.
1605
+ *
1606
+ * Rows come in two shapes. A `label` and `description` render as a pair, the
1607
+ * value aligned right and optionally tinted as a status chip. An `icon` and
1608
+ * `description` render as one line, with rows lacking an icon still indented
1609
+ * so the text stays aligned.
1610
+ *
1611
+ * The whole list disappears when no item has a description, so callers can
1612
+ * pass a sparse record without checking whether anything survived.
1613
+ */
1614
+ declare const DetailList: React__default.FC<DetailListProps>;
1615
+
528
1616
  type DropdownAlignment = 'left' | 'center' | 'right';
529
1617
  interface DropdownProps {
530
1618
  /** Label for the dropdown trigger button */
@@ -539,6 +1627,16 @@ interface DropdownProps {
539
1627
  className?: string;
540
1628
  /** Whether the dropdown is disabled */
541
1629
  disabled?: boolean;
1630
+ /**
1631
+ * Render the trigger yourself, instead of the default labelled button.
1632
+ * Receives the open state and the handler that toggles the menu, so the
1633
+ * host can supply its own button with its own variant, icon and styling.
1634
+ */
1635
+ trigger?: (state: {
1636
+ isOpen: boolean;
1637
+ toggle: () => void;
1638
+ disabled: boolean;
1639
+ }) => React__default.ReactNode;
542
1640
  }
543
1641
  interface DropdownItemProps {
544
1642
  /** Item label */
@@ -556,6 +1654,113 @@ declare const Dropdown: React__default.FC<DropdownProps> & {
556
1654
  Item: React__default.FC<DropdownItemProps>;
557
1655
  };
558
1656
 
1657
+ type EmptyStateSize = 'sm' | 'md' | 'lg';
1658
+ interface EmptyStateProps {
1659
+ /** Headline explaining why the surface is empty. */
1660
+ title: string;
1661
+ /** Supporting copy shown under the title. */
1662
+ description?: string;
1663
+ /** Illustration or icon rendered above the title. */
1664
+ icon?: ReactNode;
1665
+ /** Label for the primary call to action; the button is hidden without it. */
1666
+ actionLabel?: string;
1667
+ /** Fired when the primary call to action is pressed. */
1668
+ onAction?: () => void;
1669
+ /** Label for the secondary call to action; the button is hidden without it. */
1670
+ secondaryActionLabel?: string;
1671
+ /** Fired when the secondary call to action is pressed. */
1672
+ onSecondaryAction?: () => void;
1673
+ /** Vertical padding scale — use `sm` inside a table body, `lg` for a full page. */
1674
+ size?: EmptyStateSize;
1675
+ /** Custom content rendered below the actions. */
1676
+ children?: ReactNode;
1677
+ /** Additional CSS class, appended last. */
1678
+ className?: string;
1679
+ }
1680
+ /** Placeholder shown when a list, table, or panel has nothing to display. */
1681
+ declare const EmptyState: ({ title, description, icon, actionLabel, onAction, secondaryActionLabel, onSecondaryAction, size, children, className, }: EmptyStateProps) => React.JSX.Element;
1682
+
1683
+ interface FieldLayoutRenderProps {
1684
+ /** Id to put on the control, so the label points at it. */
1685
+ id: string;
1686
+ /** Value for the control's `aria-describedby`, or undefined when clean. */
1687
+ describedBy?: string;
1688
+ /** Whether an error message is showing. */
1689
+ hasError: boolean;
1690
+ }
1691
+ interface FieldLayoutProps {
1692
+ /** Renders the control. Receives the id and description wiring to apply. */
1693
+ children: (props: FieldLayoutRenderProps) => ReactNode;
1694
+ /** Field label. */
1695
+ label?: ReactNode;
1696
+ /** Whether the label sits above the control or beside it. */
1697
+ labelPosition?: 'top' | 'left';
1698
+ /** Hides the label without removing it from the layout's wiring. */
1699
+ showLabel?: boolean;
1700
+ /** Marks the field required, adding an asterisk to the label. */
1701
+ required?: boolean;
1702
+ /** Greys the field and hides the asterisk and icons. */
1703
+ disabled?: boolean;
1704
+ /** Explanatory text shown from an info icon beside the label. */
1705
+ tooltip?: string;
1706
+ /** Validation message shown beneath the control. */
1707
+ error?: string;
1708
+ /** Hint shown beneath the control, under any error. */
1709
+ note?: ReactNode;
1710
+ /** Decoration inside the leading edge of the control. */
1711
+ leftIcon?: ReactNode;
1712
+ /** Decoration inside the trailing edge of the control. */
1713
+ rightIcon?: ReactNode;
1714
+ /** Additional CSS class for the wrapper. */
1715
+ className?: string;
1716
+ }
1717
+ /**
1718
+ * The chrome around a form control: label, required marker, tooltip, the
1719
+ * icons that sit inside the field, and the error and hint beneath it.
1720
+ *
1721
+ * It owns none of the input's behaviour. The control is supplied as a render
1722
+ * prop and handed the generated id and `aria-describedby`, so any input —
1723
+ * native, third-party, or form-library bound — can sit inside it while keeping
1724
+ * the label and error correctly associated.
1725
+ */
1726
+ declare const FieldLayout: React__default.FC<FieldLayoutProps>;
1727
+
1728
+ /** Document types a travel workflow usually accepts. */
1729
+ declare const DOCUMENT_FILE_EXTENSIONS: string[];
1730
+ interface FileUploadButtonProps {
1731
+ /** Text on the button, and the accessible name of the file input. */
1732
+ label?: string;
1733
+ /** Comma-separated list of accepted extensions or MIME types. */
1734
+ accept?: string;
1735
+ /** Allow choosing more than one file. */
1736
+ multiple?: boolean;
1737
+ /** Disables the control and removes the file input entirely. */
1738
+ disabled?: boolean;
1739
+ /** Shows the button's spinner, e.g. while an upload is in flight. */
1740
+ loading?: boolean;
1741
+ /** Visual style of the button. */
1742
+ variant?: ButtonVariant;
1743
+ /** Size of the button. */
1744
+ size?: ButtonSize;
1745
+ /** Icon shown after the label. */
1746
+ icon?: ReactNode;
1747
+ /** Called with the change event when files are chosen. */
1748
+ onSelect?: (event: ChangeEvent<HTMLInputElement>) => void;
1749
+ /** Additional CSS class */
1750
+ className?: string;
1751
+ /** Extra attributes for the underlying file input. */
1752
+ inputProps?: Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'accept' | 'multiple' | 'onChange'>;
1753
+ }
1754
+ /**
1755
+ * A styled button that opens the file picker.
1756
+ *
1757
+ * The file input is the control: it sits transparently over the button and
1758
+ * carries the accessible name, so keyboard and screen-reader users get one
1759
+ * "choose file" control rather than a button and an input side by side. The
1760
+ * button underneath is decorative and hidden from assistive technology.
1761
+ */
1762
+ declare const FileUploadButton: React__default.FC<FileUploadButtonProps>;
1763
+
559
1764
  interface FilterOption {
560
1765
  value: string;
561
1766
  label: string;
@@ -575,6 +1780,8 @@ interface FilterChipProps {
575
1780
  searchPlaceholder?: string;
576
1781
  /** Info message to show at top of dropdown */
577
1782
  infoMessage?: string;
1783
+ /** Disable the filter when a controlled host has no change handler */
1784
+ disabled?: boolean;
578
1785
  /** Additional CSS class */
579
1786
  className?: string;
580
1787
  }
@@ -652,6 +1859,39 @@ interface FormStackProps {
652
1859
  /** Standard vertical form-field rhythm used by Hub modal forms. */
653
1860
  declare const FormStack: ({ children, gap, className }: FormStackProps) => React.JSX.Element;
654
1861
 
1862
+ /** A side of the tile, used to describe how it joins its neighbours. */
1863
+ type InfoTileEdge = 'left' | 'right' | 'top' | 'bottom';
1864
+ interface InfoTileProps {
1865
+ /** Figure the tile exists to show, e.g. a count or a date. */
1866
+ value: ReactNode;
1867
+ /** Short caption naming what the value measures. */
1868
+ label: ReactNode;
1869
+ /** Optional leading icon, rendered in its own bordered cell. */
1870
+ icon?: ReactNode;
1871
+ /**
1872
+ * Edges whose corners should be square rather than rounded. Use when the
1873
+ * tile sits against another so the pair reads as one control.
1874
+ */
1875
+ square?: InfoTileEdge[];
1876
+ /**
1877
+ * Edges that should not draw a border. Give this to the second tile of a
1878
+ * pair so the two share a single divider instead of stacking two.
1879
+ */
1880
+ borderless?: InfoTileEdge[];
1881
+ /** Additional CSS class */
1882
+ className?: string;
1883
+ /** Inline style overrides, merged after the computed tile styles. */
1884
+ style?: CSSProperties;
1885
+ }
1886
+ /**
1887
+ * Compact statistic tile pairing a figure with a caption and an optional icon.
1888
+ *
1889
+ * Tiles are designed to butt together into a strip — horizontally on narrow
1890
+ * screens, vertically on wide ones — by squaring the touching corners and
1891
+ * dropping the duplicated border.
1892
+ */
1893
+ declare const InfoTile: React__default.FC<InfoTileProps>;
1894
+
655
1895
  type ManifestView = 'passengers' | 'equipment';
656
1896
  interface ManifestViewToggleProps {
657
1897
  view: ManifestView;
@@ -663,6 +1903,64 @@ interface ManifestViewToggleProps {
663
1903
  }
664
1904
  declare const ManifestViewToggle: ({ view, onView, paxCount, eqCount, locked, className, }: ManifestViewToggleProps) => React.JSX.Element;
665
1905
 
1906
+ /** A user option that can be searched for and selected. */
1907
+ interface MultiUserSearchOption {
1908
+ /** Unique identifier for the user. */
1909
+ id: string | number;
1910
+ /** Display name. */
1911
+ name: string;
1912
+ /** Email address. */
1913
+ email: string;
1914
+ /** Optional job title or role. */
1915
+ title?: string;
1916
+ /** Whether this option is disabled. */
1917
+ disabled?: boolean;
1918
+ /** Reason the option is disabled, shown as tooltip. */
1919
+ disabledReason?: string;
1920
+ }
1921
+ interface MultiUserSearchProps {
1922
+ /** Label for the search input. */
1923
+ label?: string;
1924
+ /** Placeholder text. */
1925
+ placeholder?: string;
1926
+ /** Options to display when search matches or is empty. */
1927
+ options: MultiUserSearchOption[];
1928
+ /** Currently selected user IDs. */
1929
+ selectedIds: (string | number)[];
1930
+ /** Called when user types in the search input. Debounce in the host if needed. */
1931
+ onSearch?: (query: string) => void;
1932
+ /** Called when selection changes. */
1933
+ onSelectionChange: (ids: (string | number)[]) => void;
1934
+ /** Whether the host is loading search results. */
1935
+ loading?: boolean;
1936
+ /** Whether the component is disabled. */
1937
+ disabled?: boolean;
1938
+ /** Minimum characters before triggering search callback. */
1939
+ minSearchLength?: number;
1940
+ /** Helper text shown below the input. */
1941
+ helperText?: string;
1942
+ /** Error message to display. */
1943
+ error?: string;
1944
+ /** Additional CSS class. */
1945
+ className?: string;
1946
+ /** Test ID for automation. */
1947
+ 'data-test'?: string;
1948
+ }
1949
+ /**
1950
+ * Multi-select user search with typeahead dropdown.
1951
+ *
1952
+ * Features:
1953
+ * - Single search input that populates a dropdown of matching users
1954
+ * - Multi-select via checkboxes or clicking options
1955
+ * - Selected users shown as dismissible badges above the input
1956
+ * - Keyboard navigation (arrow keys, enter, escape)
1957
+ * - Loading state while searching
1958
+ */
1959
+ declare const MultiUserSearch: {
1960
+ ({ label, placeholder, options, selectedIds, onSearch, onSelectionChange, loading, disabled, minSearchLength, helperText, error, className, "data-test": dataTest, }: MultiUserSearchProps): React__default.JSX.Element;
1961
+ displayName: string;
1962
+ };
1963
+
666
1964
  type NavItemVariant = 'default' | 'pill';
667
1965
  type NavItemSize = 'sm' | 'md' | 'lg';
668
1966
  interface NavItemProps {
@@ -697,6 +1995,67 @@ interface NavItemProps {
697
1995
  }
698
1996
  declare const NavItem: React__default.FC<NavItemProps>;
699
1997
 
1998
+ interface PageHeaderProps {
1999
+ /** The page's heading. */
2000
+ title?: ReactNode;
2001
+ /** Smaller line above the title, naming the section the page sits in. */
2002
+ pretitle?: ReactNode;
2003
+ /** Content directly beneath the title — tabs, a summary line, filters. */
2004
+ after?: ReactNode;
2005
+ /**
2006
+ * Slot for a back control, rendered to the left of the title. Takes a node
2007
+ * so the host supplies its own router link and icon, keeping this component
2008
+ * independent of any router.
2009
+ */
2010
+ back?: ReactNode;
2011
+ /** Additional CSS class */
2012
+ className?: string;
2013
+ }
2014
+ /**
2015
+ * Standard page heading: an optional back control, a pretitle, the title, and
2016
+ * a slot beneath for anything that belongs with it.
2017
+ *
2018
+ * The header keeps its height while `title` is empty and fades in once one
2019
+ * arrives, so pages do not jump as their data loads.
2020
+ */
2021
+ declare const PageHeader: React__default.FC<PageHeaderProps>;
2022
+
2023
+ /** A rendered slot in the page list: either a page number or a truncation gap. */
2024
+ type PaginationItem = number | 'ellipsis';
2025
+ interface PaginationProps {
2026
+ /** Current page, 1-based. */
2027
+ page: number;
2028
+ /** Rows shown per page. */
2029
+ pageSize: number;
2030
+ /** Total number of rows across every page. */
2031
+ totalItems: number;
2032
+ /** Number of page buttons rendered either side of the current page. */
2033
+ siblingCount?: number;
2034
+ /** Page-size choices; the size selector is hidden when this is empty. */
2035
+ pageSizeOptions?: number[];
2036
+ /** Hides the "Showing x–y of z" summary. */
2037
+ hideSummary?: boolean;
2038
+ /** Noun used in the summary text, e.g. "quotes". */
2039
+ itemLabel?: string;
2040
+ /** Accessible label for the surrounding nav landmark. */
2041
+ ariaLabel?: string;
2042
+ /** Fired with the new 1-based page number. */
2043
+ onPageChange?: (page: number) => void;
2044
+ /** Fired with the new page size; the size selector is hidden when omitted. */
2045
+ onPageSizeChange?: (pageSize: number) => void;
2046
+ /** Additional CSS class, appended last. */
2047
+ className?: string;
2048
+ }
2049
+ /**
2050
+ * Builds the page-button list for a paginator, collapsing long runs into
2051
+ * `'ellipsis'` markers. First and last pages are always present.
2052
+ */
2053
+ declare const buildPaginationItems: (page: number, pageCount: number, siblingCount?: number) => PaginationItem[];
2054
+ /** Page count for a given total/size, never below 1 so the control always renders a page. */
2055
+ declare const getPageCount: (totalItems: number, pageSize: number) => number;
2056
+ /** Paginator for list and table screens: page buttons, prev/next, and an optional page-size selector. */
2057
+ declare const Pagination: ({ page, pageSize, totalItems, siblingCount, pageSizeOptions, hideSummary, itemLabel, ariaLabel, onPageChange, onPageSizeChange, className, }: PaginationProps) => React.JSX.Element;
2058
+
700
2059
  type ProgressSize = 'xs' | 'sm' | 'md' | 'lg';
701
2060
  type ProgressVariant = 'primary' | 'success' | 'warning' | 'error';
702
2061
  interface ProgressBarProps {
@@ -726,6 +2085,11 @@ interface ProgressCircleProps {
726
2085
  showLabel?: boolean;
727
2086
  /** Additional CSS class */
728
2087
  className?: string;
2088
+ /**
2089
+ * Explicit diameter in pixels, for indicators smaller or larger than the
2090
+ * named ramp. The stroke scales with it.
2091
+ */
2092
+ diameter?: number;
729
2093
  }
730
2094
  declare const ProgressBar: React__default.FC<ProgressBarProps>;
731
2095
  declare const ProgressCircle: React__default.FC<ProgressCircleProps>;
@@ -927,6 +2291,8 @@ interface ServiceToggleListProps {
927
2291
  onClick?: (key: string) => void;
928
2292
  /** Additional CSS class */
929
2293
  className?: string;
2294
+ /** Disable every service toggle */
2295
+ disabled?: boolean;
930
2296
  }
931
2297
  /**
932
2298
  * ServiceToggle component for a single service item.
@@ -953,6 +2319,25 @@ interface SupplierTypeToggleProps {
953
2319
  }
954
2320
  declare const SupplierTypeToggle: ({ value, defaultValue, onChange, disabled, className, }: SupplierTypeToggleProps) => React.JSX.Element;
955
2321
 
2322
+ interface TeamCalendarHeaderProps {
2323
+ /** Short team abbreviation, e.g. "MBB". Always shown. */
2324
+ teamCode: string;
2325
+ /** Full team name, shown alongside the code once there is room for it. */
2326
+ teamFullName?: string;
2327
+ /** Content beneath the identity — trip counts, a next-trip date, actions. */
2328
+ children?: ReactNode;
2329
+ /** Additional CSS class */
2330
+ className?: string;
2331
+ }
2332
+ /**
2333
+ * The heading of a team's column in the travel calendar: the team's code, its
2334
+ * full name where space allows, and whatever summary belongs underneath.
2335
+ *
2336
+ * It sticks to the top of its column so the team stays identifiable while the
2337
+ * schedule scrolls.
2338
+ */
2339
+ declare const TeamCalendarHeader: React__default.FC<TeamCalendarHeaderProps>;
2340
+
956
2341
  interface TeamHeaderProps {
957
2342
  /** Fully composed title. Overrides teamCode/teamName when supplied. */
958
2343
  title?: ReactNode;
@@ -1066,6 +2451,229 @@ declare const GroundSegment: React__default.FC<GroundSegmentProps>;
1066
2451
  */
1067
2452
  declare const HotelSegment: React__default.FC<HotelSegmentProps>;
1068
2453
 
2454
+ /** One flown leg the carrier is pricing. */
2455
+ interface AcmiLeg {
2456
+ /** Stable id used as the React key and by the remove handler. */
2457
+ id: string;
2458
+ /** Departure airport, ICAO or IATA. */
2459
+ origin: string;
2460
+ /** Arrival airport, ICAO or IATA. */
2461
+ destination: string;
2462
+ /** Flight time in decimal hours; blank until it is calculated. */
2463
+ flightTime: string;
2464
+ /** Whether this is a passenger-carrying revenue leg or aircraft positioning. */
2465
+ type?: 'live' | 'ferry';
2466
+ }
2467
+ /** Aircraft a carrier can be quoted on, with the seat cap the calculator validates against. */
2468
+ interface AcmiAircraftOption {
2469
+ /** Value stored on the quote. */
2470
+ value: string;
2471
+ /** Label shown in the picker. */
2472
+ label: string;
2473
+ /** Maximum passengers the airframe is certified for. */
2474
+ seats: number;
2475
+ /** Optional carrier value used to keep the aircraft picker contract-valid. */
2476
+ carrier?: string;
2477
+ }
2478
+ /** Everything the calculator needs to price a trip. */
2479
+ interface AcmiQuoteInputs {
2480
+ /** Operating carrier. */
2481
+ carrier: string;
2482
+ /** Aircraft value from `aircraftOptions`. */
2483
+ aircraft: string;
2484
+ /** Travel party size. */
2485
+ passengers: string;
2486
+ /** Fuel price in dollars per gallon. */
2487
+ fuelPrice: string;
2488
+ /** Markup percentage applied to the operating subtotal. */
2489
+ markupPercent: string;
2490
+ /** Nights the crew stays away from base. */
2491
+ crewNights: string;
2492
+ /** Month of travel, 1–12, used for historic winds aloft. */
2493
+ tripMonth: string;
2494
+ /** Itinerary legs, in order. Automatic positioning mode restricts these to live legs. */
2495
+ legs: AcmiLeg[];
2496
+ }
2497
+ /** Controls whether positioning legs come from the user or the host pricing engine. */
2498
+ type AcmiPositioningMode = 'automatic' | 'explicit';
2499
+ /** The priced result the calculator renders once a quote is produced. */
2500
+ interface AcmiQuoteResult {
2501
+ /** Sum of every leg's operating cost before markup. */
2502
+ operatingSubtotal: number;
2503
+ /** Dollar value of the markup percentage. */
2504
+ markupAmount: number;
2505
+ /** Flat trip insurance. */
2506
+ insuranceAmount: number;
2507
+ /** Operating subtotal + markup + insurance. */
2508
+ preTaxTotal: number;
2509
+ /** Federal excise tax. */
2510
+ fet: number;
2511
+ /** Per-segment government fees. */
2512
+ segmentFees: number;
2513
+ /** What the carrier would quote the school. */
2514
+ finalPrice: number;
2515
+ /** Authoritative priced legs returned by the host pricing service. */
2516
+ legs?: Array<{
2517
+ id: string;
2518
+ origin: string;
2519
+ destination: string;
2520
+ type: 'live' | 'ferry';
2521
+ blockHours: number;
2522
+ total: number;
2523
+ }>;
2524
+ /** Backend pricing rules worth making explicit to a reviewer. */
2525
+ pricingDetails?: {
2526
+ /** Total backend-priced ferry block hours. */
2527
+ ferryBlockHours: number;
2528
+ /** Contractual minimum used for each estimated ferry leg, when applicable. */
2529
+ ferryMinimumHours?: number;
2530
+ /** Contractual fuel buffer as a decimal fraction, for example 0.1 for 10%. */
2531
+ fuelBufferPercent: number;
2532
+ /** Dollar value added by the fuel buffer. */
2533
+ fuelBufferAmount: number;
2534
+ /** Trip-level security screening charge. */
2535
+ screeningAmount: number;
2536
+ };
2537
+ }
2538
+ interface AcmiQuoteCalculatorProps {
2539
+ /** Carriers the user may quote for. */
2540
+ carrierOptions?: {
2541
+ value: string;
2542
+ label: string;
2543
+ }[];
2544
+ /** Aircraft available to the selected carrier. */
2545
+ aircraftOptions?: AcmiAircraftOption[];
2546
+ /** Starting values; the calculator owns the state from there. */
2547
+ defaultInputs?: Partial<AcmiQuoteInputs>;
2548
+ /**
2549
+ * `automatic` accepts live legs only because the host adds positioning.
2550
+ * `explicit` lets the user enter every live and ferry leg.
2551
+ */
2552
+ positioningMode?: AcmiPositioningMode;
2553
+ /** Flat per-trip insurance, quoted in the locked field. */
2554
+ insuranceFlat?: number;
2555
+ /** Fired with the complete inputs when Calculate Quote is pressed and the form is valid. */
2556
+ onCalculate?: (inputs: AcmiQuoteInputs) => void;
2557
+ /** Fired whenever an input changes so a host can invalidate a stale async result. */
2558
+ onInputsChange?: (inputs: AcmiQuoteInputs) => void;
2559
+ /** Priced result to display; omit to keep the results panel hidden. */
2560
+ result?: AcmiQuoteResult;
2561
+ /** Fired when Submit for Approval is pressed; the button is hidden without a `result`. */
2562
+ onSubmitForApproval?: (inputs: AcmiQuoteInputs) => void;
2563
+ /** BCP 47 locale used for currency formatting. */
2564
+ locale?: string;
2565
+ /** Shows a pending state while the host pricing service is working. */
2566
+ calculating?: boolean;
2567
+ /** Host pricing failure rendered alongside form validation. */
2568
+ calculationError?: string;
2569
+ /** Show the legacy historic-winds input when a pricing service supports it. */
2570
+ showTripMonth?: boolean;
2571
+ /** Additional CSS class, appended last. */
2572
+ className?: string;
2573
+ }
2574
+ /** Carriers STM currently holds ACMI agreements with. */
2575
+ declare const ACMI_CARRIER_OPTIONS: {
2576
+ value: string;
2577
+ label: string;
2578
+ }[];
2579
+ /** Aircraft the ACMI carriers operate, with certified seat counts. */
2580
+ declare const ACMI_AIRCRAFT_OPTIONS: AcmiAircraftOption[];
2581
+ /** Months of travel, used to pick the historic winds-aloft profile. */
2582
+ declare const TRIP_MONTH_OPTIONS: {
2583
+ value: string;
2584
+ label: string;
2585
+ }[];
2586
+ /** Flat trip insurance STM adds to every ACMI quote. */
2587
+ declare const ACMI_INSURANCE_FLAT = 350;
2588
+ /**
2589
+ * ACMI pricing calculator. ACMI carriers reach this from the bid response form, where
2590
+ * it is their default tab: they price the trip here rather than typing a total blind.
2591
+ */
2592
+ declare const AcmiQuoteCalculator: {
2593
+ ({ carrierOptions, aircraftOptions, defaultInputs, positioningMode, insuranceFlat, onCalculate, onInputsChange, result, onSubmitForApproval, locale, calculating, calculationError, showTripMonth, className, }: AcmiQuoteCalculatorProps): React.JSX.Element;
2594
+ displayName: string;
2595
+ };
2596
+
2597
+ type GroupTravelRequestSource = 'agent' | 'client';
2598
+ type GroupTravelDueField = 'confirmation' | 'deposit' | 'utilization' | 'names' | 'ticketing';
2599
+ interface GroupTravelDueStatus {
2600
+ /** ISO (yyyy-mm-dd) due date for this milestone, if one has been set. */
2601
+ dueDate?: string;
2602
+ /** Marked complete regardless of date. */
2603
+ complete: boolean;
2604
+ }
2605
+ interface GroupTravelPnr {
2606
+ id: string | number;
2607
+ /** Airline record locator, or the placeholder used before one has been issued. */
2608
+ recordLocator: string;
2609
+ complete: boolean;
2610
+ }
2611
+ interface AgentGroupTravelRequest {
2612
+ id: number;
2613
+ /** School/account this request belongs to — rows are grouped by this value. */
2614
+ accountName: string;
2615
+ /** Whether an agent or the client themselves submitted the request. */
2616
+ source: GroupTravelRequestSource;
2617
+ masterTripId?: number;
2618
+ /** Shown as a tooltip and highlights the ID when present. */
2619
+ notes?: string;
2620
+ /** ISO (yyyy-mm-dd) trip start date. */
2621
+ startDate: string;
2622
+ name: string;
2623
+ sport: string;
2624
+ /** Sport code used for the sport filter, e.g. "MBB". */
2625
+ sportCode: string;
2626
+ carrier?: string;
2627
+ air: boolean;
2628
+ charter: boolean;
2629
+ car: boolean;
2630
+ motorcoach: boolean;
2631
+ hotel: boolean;
2632
+ groupHotel: boolean;
2633
+ routing: string;
2634
+ /** ISO (yyyy-mm-dd) date submitted. */
2635
+ submittedDate?: string;
2636
+ /** ISO (yyyy-mm-dd) date the quote was sent. */
2637
+ quoteSentDate?: string;
2638
+ confirmation: GroupTravelDueStatus;
2639
+ deposit: GroupTravelDueStatus;
2640
+ utilization: GroupTravelDueStatus;
2641
+ names: GroupTravelDueStatus;
2642
+ ticketing: GroupTravelDueStatus;
2643
+ /** One entry per PNR in this group; more than one renders as an expandable "Multi" group. */
2644
+ pnrs: GroupTravelPnr[];
2645
+ }
2646
+ interface AgentGroupTravelRequestSportOption {
2647
+ code: string;
2648
+ label: string;
2649
+ }
2650
+ interface AgentGroupTravelRequestViewOption {
2651
+ id: string;
2652
+ label: string;
2653
+ /** Account names included in this saved view. */
2654
+ accountNames: string[];
2655
+ }
2656
+ interface AgentGroupTravelRequestsTableProps {
2657
+ requests: AgentGroupTravelRequest[];
2658
+ sports?: AgentGroupTravelRequestSportOption[];
2659
+ /** Saved account-group "views"; the view filter is hidden when none are supplied. */
2660
+ views?: AgentGroupTravelRequestViewOption[];
2661
+ /** ISO (yyyy-mm-dd) reference date for due-status coloring. Defaults to today; pass a fixed value in stories/tests for determinism. */
2662
+ today?: string;
2663
+ onOpenRequest?: (id: number) => void;
2664
+ onViewMasterTrip?: (masterTripId: number) => void;
2665
+ onDeleteRequest?: (id: number) => void;
2666
+ onCopyPnr?: (recordLocator: string) => void;
2667
+ onToggleDueStatus?: (id: number, field: GroupTravelDueField) => void;
2668
+ onSubmittedDateChange?: (id: number, value: string) => void;
2669
+ onQuoteSentDateChange?: (id: number, value: string) => void;
2670
+ className?: string;
2671
+ }
2672
+ /** Computes the short "A/C/B/H/GH/CA" travel-type codes shown in the Type column. */
2673
+ declare const computeTravelTypeCodes: (request: Pick<AgentGroupTravelRequest, "air" | "charter" | "car" | "motorcoach" | "hotel" | "groupHotel">) => string[];
2674
+ /** Hub's agent-facing list of open Group Travel Requests, grouped by school, one row per PNR group. */
2675
+ declare const AgentGroupTravelRequestsTable: ({ requests, sports, views, today, onOpenRequest, onViewMasterTrip, onDeleteRequest, onCopyPnr, onToggleDueStatus, onSubmittedDateChange, onQuoteSentDateChange, className, }: AgentGroupTravelRequestsTableProps) => React.JSX.Element;
2676
+
1069
2677
  interface SidenavItem {
1070
2678
  /** Unique key for the item */
1071
2679
  key: string;
@@ -1184,6 +2792,73 @@ interface CardFooterProps extends HTMLAttributes<HTMLDivElement> {
1184
2792
  }
1185
2793
  declare const CardFooter: React__default.FC<CardFooterProps>;
1186
2794
 
2795
+ /** The three notifications the Charter Sourcing backend currently sends. */
2796
+ type CharterSourcingEmailVariant = 'admin-review' | 'submitter-approved' | 'submitter-updated';
2797
+ /** One origin/destination pair included in the email's route summary. */
2798
+ interface CharterSourcingEmailLeg {
2799
+ origin: string;
2800
+ destination: string;
2801
+ }
2802
+ /** Contract-backed quote facts shared by all three notifications. */
2803
+ interface CharterSourcingEmailQuote {
2804
+ requestId: string;
2805
+ carrier: string;
2806
+ aircraft: string;
2807
+ passengers: string | number;
2808
+ legs: readonly CharterSourcingEmailLeg[];
2809
+ outboundDate: string;
2810
+ returnDate: string;
2811
+ submittedBy: string;
2812
+ /**
2813
+ * Preformatted amount without an assumed currency symbol. The backend only
2814
+ * supplies this when a legacy `flightQuote.lineItems` snapshot exists.
2815
+ */
2816
+ totalCost?: string;
2817
+ }
2818
+ /** One scalar value changed by an administrator. */
2819
+ interface CharterSourcingEmailChange {
2820
+ label: string;
2821
+ previousValue: string;
2822
+ updatedValue: string;
2823
+ }
2824
+ /** Hub only sends an update notification when at least one field changed. */
2825
+ type CharterSourcingEmailChanges = readonly [
2826
+ CharterSourcingEmailChange,
2827
+ ...CharterSourcingEmailChange[]
2828
+ ];
2829
+ interface CharterSourcingEmailPreviewBaseProps {
2830
+ quote: CharterSourcingEmailQuote;
2831
+ /**
2832
+ * Original production recipient shown when a non-production environment
2833
+ * diverts the message to its configured test inbox.
2834
+ */
2835
+ testServerOriginalRecipient?: string;
2836
+ className?: string;
2837
+ }
2838
+ /** Props mirror the three real sends; an update must contain at least one change. */
2839
+ type CharterSourcingEmailPreviewProps = CharterSourcingEmailPreviewBaseProps & ({
2840
+ variant: 'admin-review' | 'submitter-approved';
2841
+ changes?: never;
2842
+ } | {
2843
+ variant: 'submitter-updated';
2844
+ changes: CharterSourcingEmailChanges;
2845
+ });
2846
+ /** The exact comma-separated route label used by the backend subject and body. */
2847
+ declare const getCharterSourcingEmailRoute: (quote: CharterSourcingEmailQuote) => string;
2848
+ /** Build the production-aligned subject line for a preview. */
2849
+ declare const getCharterSourcingEmailSubject: (variant: CharterSourcingEmailVariant, quote: CharterSourcingEmailQuote) => string;
2850
+ /**
2851
+ * Table-based visual contract for Charter Sourcing's Postmark notifications.
2852
+ *
2853
+ * Layout tables use `role="presentation"`; quote facts and changed values stay
2854
+ * semantic data tables. Django must still render its own HTML and plain-text
2855
+ * templates, but it should preserve this table topology and literal styling.
2856
+ */
2857
+ declare const CharterSourcingEmailPreview: {
2858
+ (props: CharterSourcingEmailPreviewProps): React.JSX.Element;
2859
+ displayName: string;
2860
+ };
2861
+
1187
2862
  interface Contact {
1188
2863
  /** Contact ID */
1189
2864
  id: string | number;
@@ -1240,7 +2915,12 @@ interface DrawerProps {
1240
2915
  /** Position of the drawer */
1241
2916
  position?: DrawerPosition;
1242
2917
  /** Size of the drawer */
1243
- size?: DrawerSize;
2918
+ /**
2919
+ * One of the named sizes, or an explicit CSS length (e.g. '300px', '50%')
2920
+ * for panels the ramp does not carry. The length applies to width for a
2921
+ * left/right drawer and to height for top/bottom.
2922
+ */
2923
+ size?: DrawerSize | (string & {});
1244
2924
  /** Drawer content */
1245
2925
  children: React__default.ReactNode;
1246
2926
  /** Whether clicking backdrop closes drawer */
@@ -1298,6 +2978,8 @@ interface TravelDueDateItem {
1298
2978
  tripId: string;
1299
2979
  tripName: string;
1300
2980
  masterTripGUID?: string;
2981
+ /** Set by the API when the due date has passed; used by `overdueOnly`. */
2982
+ pastdue?: boolean;
1301
2983
  }
1302
2984
  type GroupedTravelDueDates = Record<string, TravelDueDateItem[]>;
1303
2985
  interface DueDatesDrawerProps {
@@ -1305,14 +2987,110 @@ interface DueDatesDrawerProps {
1305
2987
  dueDates: GroupedTravelDueDates;
1306
2988
  selectedDate?: string | null;
1307
2989
  selectedTrip?: string | null;
2990
+ /**
2991
+ * NG-702/NG-811: opened via the Overdue Actions card — only past-due,
2992
+ * incomplete items count toward that card's number, so the panel must match
2993
+ * rather than showing every due date.
2994
+ */
2995
+ overdueOnly?: boolean;
1308
2996
  onClose: () => void;
1309
2997
  onToggle?: (item: TravelDueDateItem) => void;
1310
2998
  onTaskClick?: (masterTripGUID: string) => void;
1311
2999
  className?: string;
1312
3000
  }
1313
3001
  declare const isTravelDueDateCompleted: (item: Pick<TravelDueDateItem, "status" | "completeddatetime">) => boolean;
3002
+ declare const isTravelDueDateOverdue: (item: Pick<TravelDueDateItem, "completeddatetime" | "pastdue">) => boolean;
1314
3003
  /** Hub's searchable, status-aware due-dates drawer. */
1315
- declare const DueDatesDrawer: ({ isOpen, dueDates, selectedDate, selectedTrip, onClose, onToggle, onTaskClick, className }: DueDatesDrawerProps) => React.JSX.Element;
3004
+ declare const DueDatesDrawer: ({ isOpen, dueDates, selectedDate, selectedTrip, overdueOnly, onClose, onToggle, onTaskClick, className }: DueDatesDrawerProps) => React.JSX.Element;
3005
+
3006
+ /** A row is any record; columns address it by key. */
3007
+ type GridRow = Record<string, unknown>;
3008
+ interface GridCellRenderProps<R> {
3009
+ /** The whole row, for renderers that need more than one field. */
3010
+ row: R;
3011
+ /** Position in the sorted data, for numbering or alternating output. */
3012
+ rowIndex: number;
3013
+ /** The column's key. */
3014
+ name?: string;
3015
+ }
3016
+ interface GridColumn<R = GridRow> {
3017
+ /** Key of the field this column shows. */
3018
+ name?: string;
3019
+ /** Column heading. */
3020
+ label?: ReactNode;
3021
+ /** Renders the heading from the column key, for headings that need state. */
3022
+ labelAs?: (props: {
3023
+ name?: string;
3024
+ }) => ReactNode;
3025
+ /** Icon shown before the heading. */
3026
+ icon?: ReactNode;
3027
+ /** Renders the cell instead of printing the field. */
3028
+ as?: (props: GridCellRenderProps<R>) => ReactNode;
3029
+ /** Formats the field for display. Return falsy to show an en dash. */
3030
+ format?: (value: never, row: R) => ReactNode;
3031
+ /** Whether the column can be sorted by clicking its heading. */
3032
+ sortable?: boolean;
3033
+ /** Orders two rows. Defaults to comparing the field directly. */
3034
+ sortComparator?: (a: R, b: R) => number;
3035
+ /** Class applied to the column's cells. */
3036
+ className?: string;
3037
+ /** Class applied to the column's heading. */
3038
+ labelClassName?: string;
3039
+ }
3040
+ interface GridTotalRow {
3041
+ /** Label shown in the first column of the total row. */
3042
+ label: string;
3043
+ /** Column whose values are summed. */
3044
+ columnName: string;
3045
+ }
3046
+ interface GridTableProps<R = GridRow> {
3047
+ /** Column definitions, left to right. */
3048
+ columns: GridColumn<R>[];
3049
+ /** Rows to show. */
3050
+ data: R[];
3051
+ /**
3052
+ * CSS grid template for the columns. Defaults to equal fractions, one per
3053
+ * column.
3054
+ */
3055
+ gridTemplateColumns?: string;
3056
+ /** Field whose value keys each row. Falls back to `id`, then the index. */
3057
+ rowKey?: string;
3058
+ /** Content above and below the heading row. */
3059
+ header?: {
3060
+ above?: ReactNode;
3061
+ below?: ReactNode;
3062
+ };
3063
+ /** Column sorted on first render. */
3064
+ initialSortColumn?: string;
3065
+ /** Whether that initial sort is ascending. */
3066
+ initialSortAscending?: boolean;
3067
+ /** Tie-breaker applied when the chosen column compares equal. */
3068
+ secondarySortComparator?: (a: R, b: R) => number;
3069
+ /** Draws a rule between rows. */
3070
+ bordered?: boolean;
3071
+ /** Shown in place of the rows when there are none. */
3072
+ emptyMessage?: ReactNode;
3073
+ /** Sums a column into a sticky footer row. */
3074
+ totalRow?: GridTotalRow;
3075
+ /** Additional CSS class */
3076
+ className?: string;
3077
+ }
3078
+ /**
3079
+ * A data table laid out with CSS grid rather than table markup, so a row can
3080
+ * be an arbitrary composition rather than a fixed set of cells.
3081
+ *
3082
+ * It reflows on narrow screens: the heading row is hidden and each row becomes
3083
+ * a card whose cells carry their own labels, which keeps wide datasets legible
3084
+ * on a phone.
3085
+ *
3086
+ * Sorting is held internally — click a sortable heading to sort by it, click
3087
+ * again to reverse — and an optional total row sums a column into a sticky
3088
+ * footer.
3089
+ */
3090
+ declare function GridTable<R = GridRow>({ columns, data, gridTemplateColumns, rowKey, header, initialSortColumn, initialSortAscending, secondarySortComparator, bordered, emptyMessage, totalRow, className, }: GridTableProps<R>): React__default.JSX.Element;
3091
+ declare namespace GridTable {
3092
+ var displayName: string;
3093
+ }
1316
3094
 
1317
3095
  interface HubNavigationItem {
1318
3096
  key: string;
@@ -1321,8 +3099,18 @@ interface HubNavigationItem {
1321
3099
  icon: ReactNode;
1322
3100
  }
1323
3101
  declare const HUB_INDIVIDUAL_TRAVEL_ITEM: HubNavigationItem;
3102
+ /** Canonical navigation identity for the carrier-facing STM Charters portal. */
3103
+ declare const HUB_STM_CHARTERS_ITEM: HubNavigationItem;
1324
3104
  declare const HUB_NAV_ITEMS: HubNavigationItem[];
1325
3105
  declare const HUB_ADMIN_ITEM: HubNavigationItem;
3106
+ declare const HUB_AGENTS_ITEM: HubNavigationItem;
3107
+ /**
3108
+ * Sourcing sits with the admin-gated footer items rather than in `HUB_NAV_ITEMS`: the
3109
+ * review queue is an ACMI-admin surface, so carriers and school users must not see it.
3110
+ */
3111
+ declare const HUB_SOURCING_ITEM: HubNavigationItem;
3112
+ /** Off-fleet quote review is an admin surface too, so it is gated the same way. */
3113
+ declare const HUB_OFF_FLEET_ITEM: HubNavigationItem;
1326
3114
  interface HubAppShellActions {
1327
3115
  isMobileNavOpen: boolean;
1328
3116
  toggleMobileNav: () => void;
@@ -1330,8 +3118,19 @@ interface HubAppShellActions {
1330
3118
  interface HubAppShellProps {
1331
3119
  children: ReactNode;
1332
3120
  navItems?: HubNavigationItem[];
1333
- individualTravelItem?: HubNavigationItem;
3121
+ /** Set to `null` when Individual Travel is not available to the current user or account. */
3122
+ individualTravelItem?: HubNavigationItem | null;
3123
+ agentsItem?: HubNavigationItem;
3124
+ /** ACMI sourcing entry, rendered in the footer and shown only when `isAdmin` is true. */
3125
+ sourcingItem?: HubNavigationItem;
3126
+ /** Off-fleet quote review entry, rendered in the footer and gated on `isAdmin`. */
3127
+ offFleetItem?: HubNavigationItem;
1334
3128
  adminItem?: HubNavigationItem;
3129
+ /**
3130
+ * Authoritative footer navigation. When provided (including an empty array),
3131
+ * it replaces the default admin-gated Sourcing, Off-Fleet, Agents, and Administration items.
3132
+ */
3133
+ footerNavItems?: HubNavigationItem[];
1335
3134
  activeNavKey?: string;
1336
3135
  onNavigate?: (item: HubNavigationItem) => void;
1337
3136
  onLogoClick?: () => void;
@@ -1347,13 +3146,237 @@ interface HubAppShellProps {
1347
3146
  loading?: boolean;
1348
3147
  contentDisabled?: boolean;
1349
3148
  showContent?: boolean;
3149
+ /** Logo for expanded sidebar state */
1350
3150
  logo?: ReactNode;
3151
+ /** Logo for collapsed sidebar state (icon only, no text) */
3152
+ collapsedLogo?: ReactNode;
1351
3153
  defaultExpanded?: boolean;
1352
3154
  betaLabel?: string;
1353
3155
  className?: string;
1354
3156
  }
1355
3157
  /** The shared application navigation and content shell used by Hub and its Storybook pages. */
1356
- declare const HubAppShell: ({ children, navItems, individualTravelItem, adminItem, activeNavKey, onNavigate, onLogoClick, onLegacyPortal, accountSelector, renderTopbarActions, renderMobileExtras, mobileFooter, profileMenu, userInitials, isAdmin, navigationDisabled, loading, contentDisabled, showContent, logo, defaultExpanded, betaLabel, className, }: HubAppShellProps) => React.JSX.Element;
3158
+ declare const HubAppShell: ({ children, navItems, individualTravelItem, agentsItem, sourcingItem, offFleetItem, adminItem, footerNavItems, activeNavKey, onNavigate, onLogoClick, onLegacyPortal, accountSelector, renderTopbarActions, renderMobileExtras, mobileFooter, profileMenu, userInitials, isAdmin, navigationDisabled, loading, contentDisabled, showContent, logo, collapsedLogo, defaultExpanded, betaLabel, className, }: HubAppShellProps) => React.JSX.Element;
3159
+
3160
+ /**
3161
+ * Parses an `YYYY-MM-DD` itinerary date into a *local* calendar date.
3162
+ *
3163
+ * `new Date('2026-11-12')` is parsed as UTC midnight, which renders as the
3164
+ * previous day everywhere west of Greenwich. Travel dates are calendar dates,
3165
+ * never instants, so they are built component-wise instead.
3166
+ */
3167
+ declare const parseItineraryDate: (isoDate: string) => Date | null;
3168
+ /** Formats an itinerary date as `Thu Nov 12` (short) or `Thursday, November 12, 2026` (long). */
3169
+ declare const formatItineraryDate: (isoDate: string, style?: "short" | "long") => string;
3170
+ /** Formats a trip's span the way the itinerary header shows it, collapsing repeated month/year. */
3171
+ declare const formatItineraryDateRange: (startIso: string, endIso: string) => string;
3172
+ /** Formats a segment or trip amount. Falls back to a plain number if the currency code is unknown. */
3173
+ declare const formatItineraryMoney: (amount: number, currency?: string) => string;
3174
+ /**
3175
+ * Booking state of a single segment.
3176
+ *
3177
+ * Mirrors the statuses the Portal itinerary prints today — `Holding Confirmed`
3178
+ * is shown to travelers as `Confirmed` — plus the ticketing states Hub's
3179
+ * individual travel list already uses.
3180
+ */
3181
+ type ItinerarySegmentStatus = 'confirmed' | 'ticketed' | 'not-ticketed' | 'itinerary' | 'pending' | 'cancelled';
3182
+ interface ItinerarySegmentBase {
3183
+ /** Stable identifier for the segment (used as a React key and in callbacks) */
3184
+ id: string;
3185
+ /** Booking state shown in the card header */
3186
+ status: ItinerarySegmentStatus;
3187
+ /** Supplier confirmation / record locator for this segment */
3188
+ confirmation?: string;
3189
+ /** Name the reservation is held under */
3190
+ reservationName?: string;
3191
+ /** Segment cost, used by the itinerary cost summary */
3192
+ cost?: number;
3193
+ /** ISO 4217 currency code for `cost` */
3194
+ currency?: string;
3195
+ }
3196
+ /** A flight. Fields follow Hub's `CommercialFlight` plus what the Portal itinerary prints. */
3197
+ interface ItineraryAirSegment extends ItinerarySegmentBase {
3198
+ type: 'air';
3199
+ /** Marketing carrier name, e.g. `Delta Air Lines` */
3200
+ carrier: string;
3201
+ /** IATA carrier code, e.g. `DL` — drives the carrier-coloured service icon */
3202
+ carrierCode?: string;
3203
+ /** Flight number without the carrier code, e.g. `1274` */
3204
+ flightNumber: string;
3205
+ /** Operating carrier when the flight is a codeshare */
3206
+ operatedBy?: string;
3207
+ /** Departure airport code, e.g. `DSM` */
3208
+ departureAirport: string;
3209
+ /** Departure city, e.g. `Des Moines, IA` */
3210
+ departureCity: string;
3211
+ /** Departure date as `YYYY-MM-DD` */
3212
+ departureDate: string;
3213
+ /** Departure clock time as shown to the traveler, e.g. `6:15 AM` */
3214
+ departureTime: string;
3215
+ /** Arrival airport code, e.g. `LAS` */
3216
+ arrivalAirport: string;
3217
+ /** Arrival city, e.g. `Las Vegas, NV` */
3218
+ arrivalCity: string;
3219
+ /** Arrival date as `YYYY-MM-DD`; when it differs from `departureDate` the card flags the day change */
3220
+ arrivalDate?: string;
3221
+ /** Arrival clock time, e.g. `9:57 AM` */
3222
+ arrivalTime: string;
3223
+ /** Elapsed flight time, e.g. `3h 42m` */
3224
+ elapsed?: string;
3225
+ /** Assigned seats */
3226
+ seats?: string[];
3227
+ /** Cabin / class of service, e.g. `Main Cabin` */
3228
+ cabin?: string;
3229
+ /** Shows the online check-in action (the Portal reveals it the day before departure) */
3230
+ checkInAvailable?: boolean;
3231
+ /** Live flight status note, e.g. `In air — scheduled to arrive on time` */
3232
+ flightStatus?: string;
3233
+ }
3234
+ /** A rental car. Fields follow Hub's `VehicleSegment` / `Vehicle` plus the Portal's car block. */
3235
+ interface ItineraryCarSegment extends ItinerarySegmentBase {
3236
+ type: 'car';
3237
+ /** Rental chain name, e.g. `Enterprise Rent-A-Car` */
3238
+ vendor: string;
3239
+ /** Vendor code, e.g. `ZE` */
3240
+ vendorCode?: string;
3241
+ /** Car type description, e.g. `Intermediate SUV` */
3242
+ carType: string;
3243
+ /** Car type code, e.g. `IFAR` */
3244
+ carTypeCode?: string;
3245
+ /** Number of cars on the reservation */
3246
+ carCount?: number;
3247
+ /** Pick-up date as `YYYY-MM-DD` */
3248
+ pickupDate: string;
3249
+ /** Pick-up clock time, e.g. `10:30 AM` */
3250
+ pickupTime?: string;
3251
+ /** Pick-up location, e.g. `Harry Reid Intl Airport (LAS)` */
3252
+ pickupLocation: string;
3253
+ /** Drop-off date as `YYYY-MM-DD` */
3254
+ dropoffDate: string;
3255
+ /** Drop-off clock time */
3256
+ dropoffTime?: string;
3257
+ /** Drop-off location */
3258
+ dropoffLocation: string;
3259
+ /** Rental counter phone number */
3260
+ phone?: string;
3261
+ /** Quoted rate per day */
3262
+ dailyRate?: number;
3263
+ }
3264
+ /** A hotel stay. Fields follow Hub's `AgencyHotelSegment` plus the Portal's hotel block. */
3265
+ interface ItineraryHotelSegment extends ItinerarySegmentBase {
3266
+ type: 'hotel';
3267
+ /** Property name, e.g. `Renaissance Las Vegas` */
3268
+ hotelName: string;
3269
+ /** Hotel chain, e.g. `Marriott` */
3270
+ chain?: string;
3271
+ /** Chain code, e.g. `MC` */
3272
+ chainCode?: string;
3273
+ /** Check-in date as `YYYY-MM-DD` */
3274
+ checkInDate: string;
3275
+ /** Check-in time, e.g. `4:00 PM` */
3276
+ checkInTime?: string;
3277
+ /** Check-out date as `YYYY-MM-DD` */
3278
+ checkOutDate: string;
3279
+ /** Check-out time, e.g. `11:00 AM` */
3280
+ checkOutTime?: string;
3281
+ /** Number of nights */
3282
+ nights?: number;
3283
+ /** Number of rooms held */
3284
+ rooms?: number;
3285
+ /** Room type, e.g. `2 Queen Beds` */
3286
+ roomType?: string;
3287
+ /** Nightly room rate */
3288
+ nightlyRate?: number;
3289
+ /** Street address lines */
3290
+ address?: string[];
3291
+ /** City, state and postal code line */
3292
+ cityLine?: string;
3293
+ /** Property phone number */
3294
+ phone?: string;
3295
+ }
3296
+ /** Any segment an itinerary can show. */
3297
+ type ItinerarySegment = ItineraryAirSegment | ItineraryCarSegment | ItineraryHotelSegment;
3298
+ /** The date a segment belongs to on the itinerary — departure, pick-up or check-in. */
3299
+ declare const getSegmentDate: (segment: ItinerarySegment) => string;
3300
+ /** Minutes since midnight for a `6:15 AM` clock time, or null when it cannot be read. */
3301
+ declare const parseClockTime: (time?: string) => number | null;
3302
+ /**
3303
+ * When a segment starts on its itinerary day, used to read a day in time order.
3304
+ *
3305
+ * Null when the booking carries no time — a hotel with no stated check-in, say.
3306
+ */
3307
+ declare const getSegmentStartMinutes: (segment: ItinerarySegment) => number | null;
3308
+ /** Traveler-facing name for a segment, used as the card heading and in the day summary. */
3309
+ declare const getSegmentTitle: (segment: ItinerarySegment) => string;
3310
+ interface ItinerarySegmentCardProps {
3311
+ /** The air, car or hotel booking to render */
3312
+ segment: ItinerarySegment;
3313
+ /** Heading level for the card title, so pages keep a sensible outline */
3314
+ headingLevel?: 2 | 3 | 4;
3315
+ /** Called when a traveler starts online check-in for a flight */
3316
+ onCheckIn?: (segment: ItineraryAirSegment) => void;
3317
+ /** Extra content rendered below the detail list (notes, agent remarks) */
3318
+ footer?: ReactNode;
3319
+ /** Additional CSS class */
3320
+ className?: string;
3321
+ }
3322
+ /**
3323
+ * ItinerarySegmentCard — one booked leg of a traveler's itinerary.
3324
+ *
3325
+ * Renders a flight, rental car or hotel stay with the same header, endpoint
3326
+ * pair and labelled detail list, so a traveler reads every segment the same
3327
+ * way. The business fields match what the legacy Portal itinerary prints.
3328
+ */
3329
+ declare const ItinerarySegmentCard: {
3330
+ ({ segment, headingLevel, onCheckIn, footer, className, }: ItinerarySegmentCardProps): React.JSX.Element;
3331
+ displayName: string;
3332
+ };
3333
+
3334
+ /** One travel day: the date and every segment starting on it. */
3335
+ interface ItineraryDay {
3336
+ /** Day the segments start on, as `YYYY-MM-DD` */
3337
+ date: string;
3338
+ /** Segments starting on this day, in the order they should be read */
3339
+ segments: ItinerarySegment[];
3340
+ }
3341
+ /**
3342
+ * Groups segments into travel days, ordered by date, and orders each day by time.
3343
+ *
3344
+ * Air, car and hotel bookings arrive from three separate systems, so a
3345
+ * traveler-facing itinerary has to interleave them rather than list them service
3346
+ * by service — and it cannot assume the caller merged them in any useful order.
3347
+ * Sorting here is what puts the 6:15 AM flight above the 4:00 PM hotel check-in,
3348
+ * and keeps the legs of a connection in the order they are flown.
3349
+ *
3350
+ * Day grouping keys off the plain `YYYY-MM-DD` string, so ordering never depends
3351
+ * on the reader's time zone. Segments with no stated time sort last, keeping the
3352
+ * order they were given.
3353
+ */
3354
+ declare const groupSegmentsByDay: (segments: ItinerarySegment[]) => ItineraryDay[];
3355
+ interface ItineraryTimelineProps {
3356
+ /** Every air, car and hotel booking on the trip, in any order */
3357
+ segments: ItinerarySegment[];
3358
+ /** Shows a loading placeholder instead of the timeline */
3359
+ loading?: boolean;
3360
+ /** Message shown in place of the timeline when the itinerary could not be loaded */
3361
+ error?: ReactNode;
3362
+ /** Message shown when the trip has no booked segments yet */
3363
+ emptyMessage?: ReactNode;
3364
+ /** Called when a traveler starts online check-in for a flight */
3365
+ onCheckIn?: (segment: ItineraryAirSegment) => void;
3366
+ /** Additional CSS class */
3367
+ className?: string;
3368
+ }
3369
+ /**
3370
+ * ItineraryTimeline — a trip's bookings read as a day-by-day itinerary.
3371
+ *
3372
+ * Interleaves air, car and hotel segments under a heading for each travel day,
3373
+ * and covers the loading, error and nothing-booked-yet states a real trip
3374
+ * passes through.
3375
+ */
3376
+ declare const ItineraryTimeline: {
3377
+ ({ segments, loading, error, emptyMessage, onCheckIn, className, }: ItineraryTimelineProps): React.JSX.Element;
3378
+ displayName: string;
3379
+ };
1357
3380
 
1358
3381
  interface MembershipProgram {
1359
3382
  /** Unique identifier */
@@ -1566,6 +3589,130 @@ declare const PreferencesPanel: {
1566
3589
  displayName: string;
1567
3590
  };
1568
3591
 
3592
+ /**
3593
+ * The fourteen ACMI quote line-item categories, matching the categories the ACMI
3594
+ * calculator and the Salesforce QuoteLineItem records use. Keeping the vocabulary
3595
+ * identical means a quote can move between the calculator, the queue, and Salesforce
3596
+ * without anything being re-mapped by hand.
3597
+ */
3598
+ type SourcingCostCategory = 'acmi-block-hours' | 'fuel' | 'ground-handling' | 'landing-fees' | 'security-screening' | 'catering' | 'additional-catering' | 'crew-hotac' | 'other' | 'segment-fee' | 'fet' | 'xy-immig' | 'pfcs' | 'insurance-provision';
3599
+ interface SourcingCostLineItem {
3600
+ id: string;
3601
+ /** Short name for the charge, e.g. "Block hours — outbound". */
3602
+ label: string;
3603
+ /** Optional supporting detail rendered under the label. */
3604
+ description?: string;
3605
+ /** Grouping band; defaults to "other". */
3606
+ category?: SourcingCostCategory;
3607
+ /** How many units the carrier is charging for. */
3608
+ quantity: number;
3609
+ /** Unit the quantity is measured in, e.g. "block hours", "legs", "pax". */
3610
+ unit: string;
3611
+ /** Price per unit in major currency units (dollars, not cents). */
3612
+ unitPrice: number;
3613
+ }
3614
+ interface SourcingCostAdjustment {
3615
+ id: string;
3616
+ /** Label for the adjustment, e.g. "Repeat-charter discount". */
3617
+ label: string;
3618
+ /** Signed amount in major currency units — negative for a discount. */
3619
+ amount: number;
3620
+ /** Optional supporting detail rendered under the label. */
3621
+ note?: string;
3622
+ }
3623
+ interface QuoteCostTotals {
3624
+ /** Sum of every line item. */
3625
+ subtotal: number;
3626
+ /** Signed sum of every adjustment. */
3627
+ adjustmentTotal: number;
3628
+ /** Subtotal plus adjustments — the number the carrier is asking for. */
3629
+ total: number;
3630
+ }
3631
+ interface QuoteCostBreakdownProps {
3632
+ /** Charges that make up the quote. */
3633
+ lineItems: SourcingCostLineItem[];
3634
+ /** Discounts and surcharges applied after the subtotal. */
3635
+ adjustments?: SourcingCostAdjustment[];
3636
+ /** ISO 4217 currency code used for formatting. */
3637
+ currency?: string;
3638
+ /** BCP 47 locale used for formatting; pinned so stories and tests stay deterministic. */
3639
+ locale?: string;
3640
+ /** Heading rendered above the table; pass an empty string to hide it. */
3641
+ title?: string;
3642
+ /** Traveller count — supplying it adds a per-passenger figure under the total. */
3643
+ passengerCount?: number;
3644
+ /** Additional CSS class, appended last. */
3645
+ className?: string;
3646
+ }
3647
+ /** Display label for each ACMI line-item category, in quote order. */
3648
+ declare const SOURCING_COST_CATEGORY_LABELS: Record<SourcingCostCategory, string>;
3649
+ /** Every ACMI line-item category, in the order a quote lists them. */
3650
+ declare const SOURCING_COST_CATEGORIES: SourcingCostCategory[];
3651
+ /** Extended amount for a single line: quantity multiplied by unit price. */
3652
+ declare const computeLineItemTotal: (lineItem: SourcingCostLineItem) => number;
3653
+ /** Subtotal, signed adjustment total, and grand total for a quote. */
3654
+ declare const computeQuoteTotals: (lineItems: SourcingCostLineItem[], adjustments?: SourcingCostAdjustment[]) => QuoteCostTotals;
3655
+ /** Itemised cost table for a carrier's sourcing quote: line items, adjustments, and the total. */
3656
+ declare const QuoteCostBreakdown: ({ lineItems, adjustments, currency, locale, title, passengerCount, className, }: QuoteCostBreakdownProps) => React.JSX.Element;
3657
+
3658
+ /** One field the admin changed while reviewing, kept as a before/after pair. */
3659
+ interface QuoteFieldChange {
3660
+ /** Machine name of the field, used as the React key. */
3661
+ field: string;
3662
+ /** Human label shown in the summary, e.g. "Passengers". */
3663
+ label: string;
3664
+ /** Value as the carrier submitted it, already formatted for display. */
3665
+ from: string;
3666
+ /** Value the admin is submitting instead, already formatted for display. */
3667
+ to: string;
3668
+ }
3669
+ interface QuoteReviewActionsProps {
3670
+ /** Quote the decision applies to; echoed back through both callbacks. */
3671
+ quoteId: string;
3672
+ /** Carrier name, used in the confirmation copy. */
3673
+ carrier: string;
3674
+ /** Quoted total, pre-formatted for display in the confirmation copy. */
3675
+ formattedTotal?: string;
3676
+ /**
3677
+ * Edits the admin has made to the quote. They are listed old → new in the approve
3678
+ * confirmation. Hub sends the submitter a separate update email when an admin edit
3679
+ * is persisted; the later approval email does not repeat the change list.
3680
+ */
3681
+ changes?: QuoteFieldChange[];
3682
+ /** Locks both actions — use once a decision has already been recorded. */
3683
+ disabled?: boolean;
3684
+ /**
3685
+ * Why the actions are unavailable. Rendered under the buttons whenever `disabled`
3686
+ * is true, so an expensive action is never greyed out without saying why.
3687
+ */
3688
+ disabledReason?: string;
3689
+ /** Shows the in-progress state on the approve confirmation. */
3690
+ loading?: boolean;
3691
+ /** Label for the approve button. */
3692
+ approveLabel?: string;
3693
+ /** Label for the reject button. */
3694
+ rejectLabel?: string;
3695
+ /** One-click reasons offered in the reject drawer. */
3696
+ rejectReasons?: string[];
3697
+ /** Fired once the admin confirms, with every edit the host must persist before approval. */
3698
+ onApprove?: (quoteId: string, changes: QuoteFieldChange[]) => void;
3699
+ /** Fired with the note explaining the rejection. */
3700
+ onReject?: (quoteId: string, note: string) => void;
3701
+ /** Additional CSS class, appended last. */
3702
+ className?: string;
3703
+ }
3704
+ /**
3705
+ * Decision surface for a sourcing quote. The admin corrects and records the quote in place,
3706
+ * so there is no request-changes round trip:
3707
+ * approving routes through a confirmation listing every edit old → new, because that
3708
+ * list is persisted before approval. Rejecting opens a drawer for the stored review note;
3709
+ * the current Hub workflow does not send a rejection email.
3710
+ */
3711
+ declare const QuoteReviewActions: {
3712
+ ({ quoteId, carrier, formattedTotal, changes, disabled, disabledReason, loading, approveLabel, rejectLabel, rejectReasons, onApprove, onReject, className, }: QuoteReviewActionsProps): React.JSX.Element;
3713
+ displayName: string;
3714
+ };
3715
+
1569
3716
  interface SummaryItem {
1570
3717
  /** Label for the field */
1571
3718
  label: string;
@@ -1606,6 +3753,8 @@ interface RequestSummaryProps {
1606
3753
  className?: string;
1607
3754
  /** Title for the summary panel */
1608
3755
  title?: string;
3756
+ /** Stable selector for integration and browser tests */
3757
+ dataTest?: string;
1609
3758
  }
1610
3759
  /**
1611
3760
  * SummarySection component for a group of related summary items.
@@ -1636,9 +3785,9 @@ interface RequestFormHeaderProps {
1636
3785
  }
1637
3786
  interface RequestFormFooterProps {
1638
3787
  /** Callback for cancel/previous button */
1639
- onPrevious: () => void;
3788
+ onPrevious?: () => void;
1640
3789
  /** Callback for next/submit button */
1641
- onNext: () => void;
3790
+ onNext?: () => void;
1642
3791
  /** Whether on first page */
1643
3792
  isFirstPage?: boolean;
1644
3793
  /** Whether on last page */
@@ -1649,6 +3798,10 @@ interface RequestFormFooterProps {
1649
3798
  previousText?: string;
1650
3799
  /** Custom next button text */
1651
3800
  nextText?: string;
3801
+ /** Test hook for the previous button */
3802
+ previousButtonDataTest?: string;
3803
+ /** Test hook for the next button */
3804
+ nextButtonDataTest?: string;
1652
3805
  /** Additional CSS class */
1653
3806
  className?: string;
1654
3807
  }
@@ -1669,19 +3822,228 @@ interface RequestFormLayoutProps {
1669
3822
  showSidebarOnMobile?: boolean;
1670
3823
  }
1671
3824
  /**
1672
- * RequestFormHeader component for the fixed header in travel request forms.
1673
- */
1674
- declare const RequestFormHeader: React__default.FC<RequestFormHeaderProps>;
1675
- /**
1676
- * RequestFormFooter component for the fixed footer with navigation buttons.
1677
- */
1678
- declare const RequestFormFooter: React__default.FC<RequestFormFooterProps>;
1679
- /**
1680
- * RequestFormLayout organism for travel request forms.
1681
- * Provides a three-column layout with fixed header and footer.
3825
+ * RequestFormHeader component for the fixed header in travel request forms.
3826
+ */
3827
+ declare const RequestFormHeader: React__default.FC<RequestFormHeaderProps>;
3828
+ /**
3829
+ * RequestFormFooter component for the fixed footer with navigation buttons.
3830
+ */
3831
+ declare const RequestFormFooter: React__default.FC<RequestFormFooterProps>;
3832
+ /**
3833
+ * RequestFormLayout organism for travel request forms.
3834
+ * Provides a three-column layout with fixed header and footer.
3835
+ */
3836
+ declare const RequestFormLayout: React__default.FC<RequestFormLayoutProps>;
3837
+
3838
+ /** The six Regular Season bid queues, in the order the legacy portal lists them. */
3839
+ type RegularSeasonBidType = 'Open' | 'Closed' | 'Awarded' | 'Declined' | 'Obsolete' | 'No Bid';
3840
+ /** Where a single trip's bid sits, mirroring the legacy `BidStatus` column. */
3841
+ type CharterTripBidStatus = 'Not Submitted' | 'Submitted' | 'No Bid';
3842
+ interface CharterTripBid {
3843
+ /** Salesforce Trip GUID — the row key and the value posted on submit. */
3844
+ tripGuid: string;
3845
+ /** Trip name shown in the expanded trip row. */
3846
+ tripName: string;
3847
+ /** Bid type for this trip, e.g. "Round Trip". */
3848
+ bidType: string;
3849
+ /** Travel party size requested by the team. */
3850
+ travelPartySize: number;
3851
+ /** Route summary as stored, e.g. "GSO-JAX-GSO". */
3852
+ route: string;
3853
+ /** Departure date, ISO `yyyy-mm-dd`. */
3854
+ departureDate: string;
3855
+ /** Bid expiration date, ISO `yyyy-mm-dd`. */
3856
+ expirationDate: string;
3857
+ /** Whether this carrier has already responded to this trip. */
3858
+ bidStatus: CharterTripBidStatus;
3859
+ /** Carrier union GUID posted alongside the trip on submit. */
3860
+ carrierUnionGuid: string;
3861
+ }
3862
+ interface CharterFlightProgramBid {
3863
+ /** Salesforce Flight Program GUID — the row key and the value posted on submit. */
3864
+ flightProgramGuid: string;
3865
+ /** Flight program name, the legacy `BidName` column. */
3866
+ bidName: string;
3867
+ /** True when the school's TMC implementation phase is "P7: Active". */
3868
+ isTmcClient: boolean;
3869
+ /** Sport for the program, used by the Sport filter. */
3870
+ sport: string;
3871
+ /** Season for the program, used by the Season filter. */
3872
+ season: string;
3873
+ /** Program year. */
3874
+ year: number;
3875
+ /** Bid due date, ISO `yyyy-mm-dd`. */
3876
+ dueDate: string;
3877
+ /** Team name, used by the Team filter. */
3878
+ team: string;
3879
+ /** Carrier union GUID posted alongside the program on submit. */
3880
+ carrierUnionGuid: string;
3881
+ /** Trips inside this flight program, shown when the row is expanded. */
3882
+ trips: CharterTripBid[];
3883
+ }
3884
+ /** Which level of the accordion a bid action came from. */
3885
+ type CharterBidLevel = 'flightProgram' | 'tripProgram';
3886
+ /** Identifies the row an action was fired from, at either level of the accordion. */
3887
+ interface CharterBidTarget {
3888
+ /** Whether the action came from a flight-program row or a trip row. */
3889
+ level: CharterBidLevel;
3890
+ /** Flight program GUID — always present. */
3891
+ flightProgramGuid: string;
3892
+ /** Trip GUID — present only for `tripProgram` actions. */
3893
+ tripGuid?: string;
3894
+ /** Carrier union GUID for the row. */
3895
+ carrierUnionGuid: string;
3896
+ }
3897
+ interface RegularSeasonBidsTableProps {
3898
+ /** Flight programs to list, each with its trips. */
3899
+ bids: CharterFlightProgramBid[];
3900
+ /** Which queue is being shown — drives the header text and the action columns. */
3901
+ bidType?: RegularSeasonBidType;
3902
+ /** ACMI carriers may re-bid, so Submit Bid stays available after submission. */
3903
+ acmiCarrier?: boolean;
3904
+ /** "Today" used to decide which rows are expiring soon; defaults to the current date. */
3905
+ today?: string;
3906
+ /** Flight program GUIDs expanded on first render. */
3907
+ defaultExpandedGuids?: string[];
3908
+ /** Fired when Submit Bid is pressed at either level. */
3909
+ onSubmitBid?: (target: CharterBidTarget) => void;
3910
+ /** Fired when View Bid is pressed at either level. */
3911
+ onViewBid?: (target: CharterBidTarget) => void;
3912
+ /** Fired when a single No Bid button is pressed. */
3913
+ onNoBid?: (target: CharterBidTarget) => void;
3914
+ /** Fired with every checked row when "Submit No Bid for Selected" is pressed. */
3915
+ onBulkNoBid?: (targets: CharterBidTarget[]) => void;
3916
+ /** Hides the Sport / Season / Team / Expiring Soon filter bar. */
3917
+ hideFilters?: boolean;
3918
+ /** Shows the loading row instead of data. */
3919
+ loading?: boolean;
3920
+ /** BCP 47 locale used for date formatting. */
3921
+ locale?: string;
3922
+ /** Additional CSS class, appended last. */
3923
+ className?: string;
3924
+ }
3925
+ /** Header copy for each queue, matching the legacy `cfswitch`. */
3926
+ declare const BID_TYPE_HEADINGS: Record<RegularSeasonBidType, string>;
3927
+ /** Every Regular Season queue, in legacy menu order. */
3928
+ declare const REGULAR_SEASON_BID_TYPES: RegularSeasonBidType[];
3929
+ /** A trip is expiring soon once "today" reaches two days before its expiration date. */
3930
+ declare const isExpiringSoon: (expirationDate: string, today: string) => boolean;
3931
+ /**
3932
+ * The legacy template reads `BidStatus` off whichever row CFML's grouped output
3933
+ * happened to leave current, which is unreliable. We derive it instead: a program
3934
+ * counts as submitted only when every trip under it is, and as No Bid only when
3935
+ * every trip under it is.
3936
+ */
3937
+ declare const deriveProgramBidStatus: (program: CharterFlightProgramBid) => CharterTripBidStatus;
3938
+ /** A program is biddable while at least one trip under it has not been declined. */
3939
+ declare const isProgramBiddable: (program: CharterFlightProgramBid) => boolean;
3940
+ /**
3941
+ * The Regular Season bid queue: a two-level flight-program → trip accordion with the
3942
+ * legacy Sport / Season / Team / Expiring Soon filters and the same Submit Bid,
3943
+ * No Bid, and View Bid gating at both levels.
3944
+ */
3945
+ declare const RegularSeasonBidsTable: {
3946
+ ({ bids, bidType, acmiCarrier, today, defaultExpandedGuids, onSubmitBid, onViewBid, onNoBid, onBulkNoBid, hideFilters, loading, locale, className, }: RegularSeasonBidsTableProps): React.JSX.Element;
3947
+ displayName: string;
3948
+ };
3949
+
3950
+ /**
3951
+ * Where a carrier's quote sits in the ACMI sourcing review workflow. The same four
3952
+ * values are used by the queue table, the status badges, and the detail page, so a
3953
+ * quote never reads as one status in one place and another somewhere else.
3954
+ */
3955
+ type SourcingQuoteStatus = 'pending' | 'in-review' | 'approved' | 'rejected';
3956
+ /** Whether a leg carries the travel party or repositions the aircraft. */
3957
+ type SourcingQuoteLegType = 'live' | 'ferry';
3958
+ interface SourcingQuoteLeg {
3959
+ id: string;
3960
+ /** Human label for the leg, e.g. "Outbound" or "Return". */
3961
+ label: string;
3962
+ /** Revenue leg or positioning leg; defaults to "live". */
3963
+ type?: SourcingQuoteLegType;
3964
+ /** Departure airport code. */
3965
+ origin: string;
3966
+ /** Arrival airport code. */
3967
+ destination: string;
3968
+ /** ISO 8601 local departure timestamp, when scheduling has supplied one. */
3969
+ departsAt?: string;
3970
+ /** ISO 8601 local arrival timestamp, when scheduling has supplied one. */
3971
+ arrivesAt?: string;
3972
+ /** Equipment the carrier is offering for this leg. */
3973
+ aircraft: string;
3974
+ /** Seats available on this leg. */
3975
+ seats: number;
3976
+ /** Scheduled block time in hours. */
3977
+ blockHours: number;
3978
+ }
3979
+ interface SourcingQuote {
3980
+ id: string;
3981
+ /** Carrier that submitted the quote. */
3982
+ carrier: string;
3983
+ /** Trip the quote is for. */
3984
+ tripName: string;
3985
+ /** School / account the trip belongs to. */
3986
+ accountName: string;
3987
+ /** Sport travelling. */
3988
+ sport: string;
3989
+ /** Current review status. */
3990
+ status: SourcingQuoteStatus;
3991
+ /** ISO (yyyy-mm-dd) date the carrier submitted the quote. */
3992
+ submittedDate: string;
3993
+ /** ISO (yyyy-mm-dd) first departure date. */
3994
+ departureDate: string;
3995
+ /** Travel-party size. */
3996
+ passengers: number;
3997
+ /**
3998
+ * Quoted total in major currency units. Always derive this from `lineItems` with
3999
+ * `computeQuoteTotals` rather than authoring it — a hand-written total can drift
4000
+ * away from the breakdown the carrier actually sent.
4001
+ */
4002
+ total: number;
4003
+ /** ISO 4217 currency code for `total`. */
4004
+ currency?: string;
4005
+ /** Flight legs the quote covers. */
4006
+ legs?: SourcingQuoteLeg[];
4007
+ /** Charges that make up the quoted total. */
4008
+ lineItems?: SourcingCostLineItem[];
4009
+ /** Free-text note the carrier attached to the submission. */
4010
+ carrierNote?: string;
4011
+ }
4012
+ interface SourcingReviewQueueTableProps {
4013
+ /** Quotes to list. */
4014
+ quotes: SourcingQuote[];
4015
+ /** Controlled selection of quote ids. Omit to let the table own the selection. */
4016
+ selectedQuoteIds?: string[];
4017
+ /** Fired whenever the selection changes. */
4018
+ onSelectionChange?: (selectedQuoteIds: string[]) => void;
4019
+ /** Fired when a quote row is opened for review. */
4020
+ onOpenQuote?: (quoteId: string) => void;
4021
+ /** Fired with every selected id when the bulk-approve button is pressed. */
4022
+ onBulkApprove?: (quoteIds: string[]) => void;
4023
+ /** Fired when the user clears an active search or status filter. */
4024
+ onFiltersCleared?: () => void;
4025
+ /** Rows shown per page. */
4026
+ pageSize?: number;
4027
+ /** Hides the search box and status filter. */
4028
+ hideFilters?: boolean;
4029
+ /** Shows the table's loading row instead of data. */
4030
+ loading?: boolean;
4031
+ /** BCP 47 locale used for currency and date formatting. */
4032
+ locale?: string;
4033
+ /** Additional CSS class, appended last. */
4034
+ className?: string;
4035
+ }
4036
+ /** Statuses an admin may still act on; approved and rejected quotes are locked out of bulk approve. */
4037
+ declare const isQuoteActionable: (quote: SourcingQuote) => boolean;
4038
+ /** Case-insensitive match across the fields an admin is likely to search by. */
4039
+ declare const matchesQuoteSearch: (quote: SourcingQuote, term: string) => boolean;
4040
+ /**
4041
+ * ACMI sourcing review queue — the list of carrier-submitted flight quotes awaiting
4042
+ * an admin decision, with row selection for bulk approve.
1682
4043
  */
1683
- declare const RequestFormLayout: React__default.FC<RequestFormLayoutProps>;
4044
+ declare const SourcingReviewQueueTable: ({ quotes, selectedQuoteIds, onSelectionChange, onOpenQuote, onBulkApprove, onFiltersCleared, pageSize: initialPageSize, hideFilters, loading, locale, className, }: SourcingReviewQueueTableProps) => React.JSX.Element;
1684
4045
 
4046
+ type TableRowKey = string | number;
1685
4047
  interface TableColumn<T = any> {
1686
4048
  /** Unique key for the column */
1687
4049
  key: string;
@@ -1715,12 +4077,28 @@ interface TableProps<T = any> {
1715
4077
  loading?: boolean;
1716
4078
  /** Empty state message */
1717
4079
  emptyMessage?: string;
4080
+ /** Rich empty state rendered instead of `emptyMessage` when there are no rows */
4081
+ emptyContent?: React__default.ReactNode;
4082
+ /** Adds a leading checkbox column for row selection */
4083
+ selectable?: boolean;
4084
+ /** Controlled selection — the row keys currently selected. Omit to let the table own the state. */
4085
+ selectedRowKeys?: TableRowKey[];
4086
+ /** Starting selection when the table owns the state */
4087
+ defaultSelectedRowKeys?: TableRowKey[];
4088
+ /** Fired with the next selection: the row keys plus the matching rows */
4089
+ onSelectionChange?: (selectedRowKeys: TableRowKey[], selectedRows: T[]) => void;
4090
+ /** Return false to lock a row out of selection */
4091
+ isRowSelectable?: (row: T, index: number) => boolean;
4092
+ /** Accessible label for an individual row checkbox */
4093
+ rowSelectionLabel?: (row: T, index: number) => string;
4094
+ /** Accessible label for the header select-all checkbox */
4095
+ selectAllLabel?: string;
1718
4096
  /** Row click handler */
1719
4097
  onRowClick?: (row: T, index: number) => void;
1720
4098
  /** Additional CSS class */
1721
4099
  className?: string;
1722
4100
  }
1723
- declare const Table: <T extends Record<string, any> = any>({ columns, data, rowKey, bordered, striped, hoverable, compact, loading, emptyMessage, onRowClick, className, }: TableProps<T>) => React__default.JSX.Element;
4101
+ declare const Table: <T extends Record<string, any> = any>({ columns, data, rowKey, bordered, striped, hoverable, compact, loading, emptyMessage, emptyContent, selectable, selectedRowKeys, defaultSelectedRowKeys, onSelectionChange, isRowSelectable, rowSelectionLabel, selectAllLabel, onRowClick, className, }: TableProps<T>) => React__default.JSX.Element;
1724
4102
 
1725
4103
  interface TeamOption {
1726
4104
  /** Team code (e.g., 'MBB', 'WBB') */
@@ -1814,21 +4192,72 @@ interface TeamScheduleActionsProps {
1814
4192
  /** Exact presentational counterpart of Hub's Team Schedule action controls. */
1815
4193
  declare const TeamScheduleActions: ({ isCompactView, tripCount, seasonLabel, seasonValue, seasonOptions, previousSeasonDisabled, exportDisabled, exporting, groupTravelDisabled, mergeDisabled, merging, onViewSchedule, onBack, onPreviousSeason, onNextSeason, onSeasonChange, onExport, onGroupTravelRequest, onMergeEvents, className, }: TeamScheduleActionsProps) => React.JSX.Element;
1816
4194
 
4195
+ /** @deprecated Legacy injected row. Prefer the structured `data` prop. */
1817
4196
  interface TeamScheduleCompactRow {
1818
4197
  id: string | number;
1819
4198
  trip: ReactNode;
1820
4199
  events: ReactNode;
1821
4200
  }
4201
+ interface TeamScheduleCompactEvent {
4202
+ id: string | number;
4203
+ opponent: string;
4204
+ title: string;
4205
+ date: string;
4206
+ time?: string;
4207
+ tbc?: string;
4208
+ location: string;
4209
+ homeAway: string;
4210
+ /** Leading 48px cell (e.g. checkbox or drag handle). */
4211
+ leading?: ReactNode;
4212
+ /** Trailing 116px cell (e.g. Edit action). */
4213
+ action?: ReactNode;
4214
+ }
4215
+ interface TeamScheduleCompactTrip {
4216
+ id: string | number;
4217
+ gtr?: ReactNode;
4218
+ travelStart: string;
4219
+ travelEnd: string;
4220
+ tripName: string;
4221
+ services?: ReactNode;
4222
+ /** Trailing 116px cell (e.g. Edit action). */
4223
+ action?: ReactNode;
4224
+ events: TeamScheduleCompactEvent[];
4225
+ }
1822
4226
  interface TeamScheduleCompactTableProps {
1823
- rows: TeamScheduleCompactRow[];
4227
+ /** Structured trips powering the TanStack-driven table features. */
4228
+ data?: TeamScheduleCompactTrip[];
4229
+ /**
4230
+ * @deprecated Legacy fully-injected rows. Rendered as-is; table features
4231
+ * (sorting, filtering, …) only apply to the structured `data` prop.
4232
+ */
4233
+ rows?: TeamScheduleCompactRow[];
4234
+ /** Header labels for legacy `rows` mode only. */
1824
4235
  tripHeaders?: ReactNode[];
1825
4236
  eventHeaders?: ReactNode[];
1826
4237
  onAddEvent?: () => void;
1827
4238
  addEventDisabled?: boolean;
1828
4239
  className?: string;
1829
- }
1830
- /** Hub's two-panel compact Team Schedule shell. Editable rows remain injectable. */
1831
- declare const TeamScheduleCompactTable: ({ rows, tripHeaders, eventHeaders, onAddEvent, addEventDisabled, className, }: TeamScheduleCompactTableProps) => React.JSX.Element;
4240
+ /** Click trip column headers to sort. */
4241
+ enableSorting?: boolean;
4242
+ /** Search box matching trip and event text. */
4243
+ enableGlobalFilter?: boolean;
4244
+ globalFilterPlaceholder?: string;
4245
+ /** Per-column text filters under the trip headers. */
4246
+ enableColumnFilters?: boolean;
4247
+ /** Page the trips with prev/next controls. */
4248
+ enablePagination?: boolean;
4249
+ pageSize?: number;
4250
+ /** Checkbox per trip plus a select-all header checkbox. */
4251
+ enableRowSelection?: boolean;
4252
+ /** Called with the selected trip ids whenever selection changes. */
4253
+ onRowSelectionChange?: (selectedIds: string[]) => void;
4254
+ /** "Columns" menu to show/hide trip columns. */
4255
+ enableColumnVisibility?: boolean;
4256
+ /** Chevron per trip to collapse its events panel. */
4257
+ enableExpanding?: boolean;
4258
+ }
4259
+ /** Hub's two-panel compact Team Schedule shell, powered by TanStack Table. */
4260
+ declare const TeamScheduleCompactTable: ({ data, rows, tripHeaders, eventHeaders, onAddEvent, addEventDisabled, className, enableSorting, enableGlobalFilter, globalFilterPlaceholder, enableColumnFilters, enablePagination, pageSize, enableRowSelection, onRowSelectionChange, enableColumnVisibility, enableExpanding, }: TeamScheduleCompactTableProps) => React.JSX.Element;
1832
4261
 
1833
4262
  interface TeamScheduleDueDate {
1834
4263
  id?: string | number;
@@ -2144,31 +4573,37 @@ declare const TravelerForm: {
2144
4573
  };
2145
4574
 
2146
4575
  interface TripData {
2147
- /** Unique trip identifier */
4576
+ /** Stable unique trip identifier supplied by the host */
2148
4577
  id: string;
2149
- /** PNR/Confirmation number */
4578
+ /** PNR/confirmation number used to load a booked itinerary */
2150
4579
  pnr?: string;
2151
- /** Request ID (for requested trips) */
4580
+ /** Request ID used to load a submitted request */
2152
4581
  reqId?: string;
2153
4582
  /** Traveler name(s) */
2154
4583
  travelers: string[];
2155
4584
  /** Sport code */
2156
4585
  sport?: string;
2157
- /** Vendor/Airline code */
4586
+ /** Vendor/airline code */
2158
4587
  vendor?: string;
2159
- /** Itinerary string (e.g., "ATL-RDU") */
4588
+ /** Itinerary string (for example, `ATL-RDU`) */
2160
4589
  itinerary?: string;
2161
4590
  /** Travel type codes */
2162
4591
  types: TravelType[];
2163
4592
  /** Multi-segment indicators */
2164
4593
  multiSegments?: TravelType[];
2165
- /** Travel date range */
4594
+ /** Human-readable travel date range */
2166
4595
  dates: string;
2167
- /** Trip status */
2168
- status: StatusBadgeVariant;
2169
- /** Requested by (for request trips) */
4596
+ /** ISO start date, used by the legacy local-filter mode when available */
4597
+ startDate?: string;
4598
+ /** ISO end date, used by the legacy local-filter mode when available */
4599
+ endDate?: string;
4600
+ /** Total trip cost, used by the legacy local-filter mode when available */
4601
+ totalCost?: number;
4602
+ /** Trip status. Backend labels such as `Invoiced` are normalized safely. */
4603
+ status: StatusBadgeVariant | string;
4604
+ /** Requested by (for requested trips) */
2170
4605
  requestedBy?: string;
2171
- /** Submitted date (for request trips) */
4606
+ /** Submitted date (for requested trips) */
2172
4607
  submitted?: string;
2173
4608
  }
2174
4609
  interface TripTableProps {
@@ -2182,7 +4617,12 @@ interface TripTableProps {
2182
4617
  vendorMode?: 'icon' | 'code';
2183
4618
  /** Use unified service column */
2184
4619
  useServiceColumn?: boolean;
2185
- /** Callback when viewing a trip */
4620
+ /** Preferred callback. Receives the stable, complete controlled row. */
4621
+ onSelectTrip?: (trip: TripData) => void;
4622
+ /**
4623
+ * Legacy callback. Receives the PNR/request ID when present, then `id`.
4624
+ * @deprecated Prefer `onSelectTrip` so identifiers are never ambiguous.
4625
+ */
2186
4626
  onViewTrip?: (id: string) => void;
2187
4627
  /** Show empty state */
2188
4628
  emptyMessage?: string;
@@ -2200,6 +4640,8 @@ interface AdministrationCard {
2200
4640
  }
2201
4641
  interface AdministrationPageProps {
2202
4642
  activeTab?: AdministrationTab;
4643
+ /** Authoritative tabs for the current viewer. An empty array renders no tab controls. */
4644
+ enabledTabs?: AdministrationTab[];
2203
4645
  onTabChange?: (tab: AdministrationTab) => void;
2204
4646
  cards?: AdministrationCard[];
2205
4647
  onCardClick?: (card: AdministrationCard) => void;
@@ -2207,7 +4649,354 @@ interface AdministrationPageProps {
2207
4649
  className?: string;
2208
4650
  }
2209
4651
  /** Hub administration shell and system-card index. */
2210
- declare const AdministrationPage: ({ activeTab, onTabChange, cards, onCardClick, children, className, }: AdministrationPageProps) => React.JSX.Element;
4652
+ declare const AdministrationPage: ({ activeTab, enabledTabs, onTabChange, cards, onCardClick, children, className, }: AdministrationPageProps) => React.JSX.Element;
4653
+
4654
+ interface AgentGroupTravelRequestsPageProps {
4655
+ /** Page title, shown above the request list. */
4656
+ title?: string;
4657
+ /** Open group travel requests to list, grouped by school. */
4658
+ requests: AgentGroupTravelRequest[];
4659
+ /** Options for the "Filter by sport" dropdown. */
4660
+ sports?: AgentGroupTravelRequestSportOption[];
4661
+ /** Saved account-group "views"; the view filter is hidden when none are supplied. */
4662
+ views?: AgentGroupTravelRequestViewOption[];
4663
+ /** ISO (yyyy-mm-dd) reference date for due-status coloring. */
4664
+ today?: string;
4665
+ /** Shows the STM-employee-only quick links (agent request form, CDS requests, actionable items, administer views). */
4666
+ isStmEmployee?: boolean;
4667
+ onBackToBookATrip?: () => void;
4668
+ onSubmitNewRequest?: () => void;
4669
+ onSubmitAgentRequest?: () => void;
4670
+ onSearchPastRequests?: () => void;
4671
+ onShowCdsRequests?: () => void;
4672
+ onShowActionableItems?: () => void;
4673
+ onAdministerViews?: () => void;
4674
+ onOpenRequest?: (id: number) => void;
4675
+ onViewMasterTrip?: (masterTripId: number) => void;
4676
+ onDeleteRequest?: (id: number) => void;
4677
+ onCopyPnr?: (recordLocator: string) => void;
4678
+ onToggleDueStatus?: (id: number, field: GroupTravelDueField) => void;
4679
+ onSubmittedDateChange?: (id: number, value: string) => void;
4680
+ onQuoteSentDateChange?: (id: number, value: string) => void;
4681
+ className?: string;
4682
+ }
4683
+ /** Hub's agent-facing Group Travel Request screen — the "Book a Trip" quick links plus the open-requests list. */
4684
+ declare const AgentGroupTravelRequestsPage: ({ title, requests, sports, views, today, isStmEmployee, onBackToBookATrip, onSubmitNewRequest, onSubmitAgentRequest, onSearchPastRequests, onShowCdsRequests, onShowActionableItems, onAdministerViews, onOpenRequest, onViewMasterTrip, onDeleteRequest, onCopyPnr, onToggleDueStatus, onSubmittedDateChange, onQuoteSentDateChange, className, }: AgentGroupTravelRequestsPageProps) => React.JSX.Element;
4685
+
4686
+ /** The three sections of the legacy My Profile menu. */
4687
+ type CarrierProfileTab = 'profile' | 'contacts' | 'aircraft';
4688
+ /** Default bid values used to pre-fill the bid response form. */
4689
+ interface CarrierProfilePreferences {
4690
+ /** Default seats offered. */
4691
+ availableSeats: string;
4692
+ /** Default max payload in pounds. */
4693
+ maxPayload: string;
4694
+ /** Default fuel base in dollars. */
4695
+ fuelBase: string;
4696
+ /** Default catering option. */
4697
+ cateringOptions: string;
4698
+ }
4699
+ /** A carrier contact on file with STM. */
4700
+ interface CarrierContact {
4701
+ /** Legacy `Contact_ID`, used as the row key. */
4702
+ contactId: string;
4703
+ /** Contact type name, e.g. "Sales". */
4704
+ contactType: string;
4705
+ /** Contact's full name. */
4706
+ name: string;
4707
+ /** Work phone. */
4708
+ workPhone: string;
4709
+ /** Email address. */
4710
+ email: string;
4711
+ /** Whether new bid notifications go to this contact. */
4712
+ bidContact: boolean;
4713
+ }
4714
+ /** An airframe the carrier can be quoted on. */
4715
+ interface CarrierAircraft {
4716
+ /** Legacy `Aircraft_ID`, used as the row key. */
4717
+ aircraftId: string;
4718
+ /** Model or name. */
4719
+ name: string;
4720
+ /** Certified seat count. */
4721
+ seatQty: number;
4722
+ /** Max payload in pounds. */
4723
+ maxPayload: number;
4724
+ /** Fuel base in dollars. */
4725
+ fuelBase: number;
4726
+ /** How many seat maps and documents are attached. */
4727
+ documentCount?: number;
4728
+ }
4729
+ interface CarrierProfilePageProps {
4730
+ /** Carrier account name, used in the Contacts heading. */
4731
+ carrierName: string;
4732
+ /** Default bid values. */
4733
+ preferences?: CarrierProfilePreferences;
4734
+ /** Catering options STM offers. */
4735
+ cateringOptions?: string[];
4736
+ /** Contacts on file. */
4737
+ contacts?: CarrierContact[];
4738
+ /** Contact types available in the picker. */
4739
+ contactTypes?: string[];
4740
+ /** Aircraft on file. */
4741
+ aircraft?: CarrierAircraft[];
4742
+ /** Controlled section selection; omit to let the page own it. */
4743
+ tab?: CarrierProfileTab;
4744
+ /** Section selected on first render when `tab` is omitted. */
4745
+ defaultTab?: CarrierProfileTab;
4746
+ /** Fired with the section the carrier switched to. */
4747
+ onTabChange?: (tab: CarrierProfileTab) => void;
4748
+ /** Fired with the saved preferences. */
4749
+ onSavePreferences?: (preferences: CarrierProfilePreferences) => void;
4750
+ /** Fired with the contact to edit. */
4751
+ onEditContact?: (contactId: string) => void;
4752
+ /** Fired with the contact to delete. */
4753
+ onDeleteContact?: (contactId: string) => void;
4754
+ /** Fired with the new contact's values. */
4755
+ onAddContact?: (contact: Omit<CarrierContact, 'contactId'>) => void;
4756
+ /** Fired with the aircraft to edit. */
4757
+ onEditAircraft?: (aircraftId: string) => void;
4758
+ /** Fired with the aircraft to delete. */
4759
+ onDeleteAircraft?: (aircraftId: string) => void;
4760
+ /** Fired when an aircraft's seat maps and documents are opened. */
4761
+ onOpenAircraftDocuments?: (aircraftId: string) => void;
4762
+ /** Renders profile data without mutation controls, even when callbacks are supplied. */
4763
+ readOnly?: boolean;
4764
+ /** Label for the back link above the header. */
4765
+ backLabel?: string;
4766
+ /** Fired when the back link is pressed. */
4767
+ onBack?: () => void;
4768
+ /** BCP 47 locale used for number formatting. */
4769
+ locale?: string;
4770
+ /** Additional CSS class, appended last. */
4771
+ className?: string;
4772
+ }
4773
+ /** Catering choices offered on the legacy preferences form. */
4774
+ declare const CARRIER_CATERING_OPTIONS: string[];
4775
+ /** Contact types the legacy portal offers. */
4776
+ declare const CARRIER_CONTACT_TYPES: string[];
4777
+ /**
4778
+ * My Profile — the legacy `profiles/` area, with its Profile · Contacts · Aircraft
4779
+ * split kept intact. Preferences pre-fill the bid response form; contacts decide who
4780
+ * is emailed about new bids; aircraft are what STM can quote the carrier on.
4781
+ */
4782
+ declare const CarrierProfilePage: {
4783
+ ({ carrierName, preferences: initialPreferences, cateringOptions, contacts, contactTypes, aircraft, tab: controlledTab, defaultTab, onTabChange, onSavePreferences, onEditContact, onDeleteContact, onAddContact, onEditAircraft, onDeleteAircraft, onOpenAircraftDocuments, readOnly, backLabel, onBack, locale, className, }: CarrierProfilePageProps): React.JSX.Element;
4784
+ displayName: string;
4785
+ };
4786
+
4787
+ /** Read-only carrier facts returned for one NCAA championship opportunity. */
4788
+ interface ChampionshipBidDetail {
4789
+ bidId: string;
4790
+ bidName: string;
4791
+ aircraftName?: string;
4792
+ seats?: number;
4793
+ totalCost?: number;
4794
+ cities?: string;
4795
+ restrictions?: string;
4796
+ comments?: string;
4797
+ noBid?: boolean;
4798
+ awarded?: boolean;
4799
+ confirmed?: boolean;
4800
+ contractFileName?: string;
4801
+ }
4802
+ interface ChampionshipBidDetailPageProps {
4803
+ /** Detail returned by Hub; omit while loading or when no record was found. */
4804
+ bid?: ChampionshipBidDetail;
4805
+ /** Shows the loading state instead of detail. */
4806
+ loading?: boolean;
4807
+ /** Label for the optional back navigation. */
4808
+ backLabel?: string;
4809
+ /** Fired only for navigation back to the championship queue. */
4810
+ onBack?: () => void;
4811
+ /** BCP 47 locale used to format seats and total cost. */
4812
+ locale?: string;
4813
+ className?: string;
4814
+ }
4815
+ /**
4816
+ * Read-only NCAA championship bid detail. Hub owns fetching, authorization, and every write;
4817
+ * this page deliberately exposes no bid, award, confirmation, contract, or editing actions.
4818
+ */
4819
+ declare const ChampionshipBidDetailPage: {
4820
+ ({ bid, loading, backLabel, onBack, locale, className, }: ChampionshipBidDetailPageProps): React.JSX.Element;
4821
+ displayName: string;
4822
+ };
4823
+
4824
+ /** The five NCAA Championship queues, in the order the legacy menu lists them. */
4825
+ type ChampionshipBidType = 'Open' | 'Awarded' | 'Closed' | 'Declined' | 'Withdrawn';
4826
+ /** One championship bid opportunity. */
4827
+ interface ChampionshipBid {
4828
+ /** Legacy `Bid_ID`, used as the row key. */
4829
+ bidId: string;
4830
+ /** Opportunity name. */
4831
+ bidName: string;
4832
+ /** Preferred itinerary, e.g. "OMA-DAY". */
4833
+ cityPairs: string;
4834
+ /** Travel party size. */
4835
+ travelParty: number;
4836
+ /** Departure date, ISO `yyyy-mm-dd`. */
4837
+ departDate: string;
4838
+ /** Bid expiration date, ISO `yyyy-mm-dd`. */
4839
+ expirationDate: string;
4840
+ /** Whether the carrier has already responded. */
4841
+ responded?: boolean;
4842
+ /** Whether the carrier declined this opportunity. */
4843
+ noBid?: boolean;
4844
+ /** Whether an awarded bid has been confirmed by the carrier. */
4845
+ confirmed?: boolean;
4846
+ /** File name of the signed contract, when one has been uploaded. */
4847
+ contractFile?: string;
4848
+ }
4849
+ interface ChampionshipBidsPageProps {
4850
+ /** Bids for the selected queue. */
4851
+ bids: ChampionshipBid[];
4852
+ /** Controlled queue selection; omit to let the page own it. */
4853
+ bidType?: ChampionshipBidType;
4854
+ /** Queue selected on first render when `bidType` is omitted. */
4855
+ defaultBidType?: ChampionshipBidType;
4856
+ /** Fired with the queue the carrier switched to. */
4857
+ onBidTypeChange?: (bidType: ChampionshipBidType) => void;
4858
+ /** Fired when a bid name is opened for read-only detail navigation. */
4859
+ onViewBid?: (bidId: string) => void;
4860
+ /**
4861
+ * Fired by the Bid and Bid anyway write-intent actions. Also serves as the
4862
+ * legacy fallback for bid-name navigation when `onViewBid` is omitted.
4863
+ */
4864
+ onOpenBid?: (bidId: string) => void;
4865
+ /** Fired when an awarded bid is confirmed. */
4866
+ onConfirmAward?: (bidId: string) => void;
4867
+ /** Fired when a signed contract is opened or uploaded. */
4868
+ onOpenContract?: (bidId: string) => void;
4869
+ /** Rows shown per page. */
4870
+ pageSize?: number;
4871
+ /** Label for the back link above the header. */
4872
+ backLabel?: string;
4873
+ /** Fired when the back link is pressed. */
4874
+ onBack?: () => void;
4875
+ /** Shows the table's loading row instead of data. */
4876
+ loading?: boolean;
4877
+ /** BCP 47 locale used for date formatting. */
4878
+ locale?: string;
4879
+ /** Additional CSS class, appended last. */
4880
+ className?: string;
4881
+ }
4882
+ /** Every NCAA Championship queue, in legacy menu order. */
4883
+ declare const CHAMPIONSHIP_BID_TYPES: ChampionshipBidType[];
4884
+ /** Header copy for each queue, matching the legacy `cfswitch`. */
4885
+ declare const CHAMPIONSHIP_HEADINGS: Record<ChampionshipBidType, string>;
4886
+ /**
4887
+ * NCAA Championship bid queues — the legacy `bids/index.cfm` list. Five status queues
4888
+ * and a flat table; the checkmark and delete GIFs become status pills, and the
4889
+ * confirm / contract image links become real buttons.
4890
+ */
4891
+ declare const ChampionshipBidsPage: {
4892
+ ({ bids, bidType: controlledBidType, defaultBidType, onBidTypeChange, onViewBid, onOpenBid, onConfirmAward, onOpenContract, pageSize: initialPageSize, backLabel, onBack, loading, locale, className, }: ChampionshipBidsPageProps): React.JSX.Element;
4893
+ displayName: string;
4894
+ };
4895
+
4896
+ /** What the carrier is submitting: a priced quote, or a decline. */
4897
+ interface CharterBidSubmission {
4898
+ /** The calculator inputs behind the quote; null when the carrier is declining. */
4899
+ inputs: AcmiQuoteInputs | null;
4900
+ /** True when the carrier is declining the opportunity. */
4901
+ noBid: boolean;
4902
+ }
4903
+ interface CharterBidResponsePageProps {
4904
+ /** Flight program the bid is against. */
4905
+ program: CharterFlightProgramBid;
4906
+ /** Trips covered by this response — one for a trip bid, all of them for a program bid. */
4907
+ trips: CharterTripBid[];
4908
+ /** School / account the trips belong to. */
4909
+ accountName: string;
4910
+ /** Trip-level bids are titled by trip name; program-level bids by program name. */
4911
+ tripLevel?: boolean;
4912
+ /** ACMI carriers additionally see the carrier STM requested for the trip. */
4913
+ acmiCarrier?: boolean;
4914
+ /** Carrier STM requested for this trip; shown to ACMI carriers only. */
4915
+ requestedCarrier?: string;
4916
+ /** Values the calculator opens with, typically the carrier's saved profile defaults. */
4917
+ defaultInputs?: Partial<AcmiQuoteInputs>;
4918
+ /** Priced result to show inside the calculator. */
4919
+ acmiResult?: AcmiQuoteResult;
4920
+ /** Fired when the calculator prices a quote. */
4921
+ onCalculateAcmi?: (inputs: AcmiQuoteInputs) => void;
4922
+ /** Fired with the quote — or the decline — when the bid is submitted. */
4923
+ onSubmitBid?: (submission: CharterBidSubmission) => void;
4924
+ /** Label for the back link above the header. */
4925
+ backLabel?: string;
4926
+ /** Fired when the back link is pressed. */
4927
+ onBack?: () => void;
4928
+ /** Disables the submit button and shows the in-progress label. */
4929
+ submitting?: boolean;
4930
+ /** BCP 47 locale used for date and currency formatting. */
4931
+ locale?: string;
4932
+ /** Additional CSS class, appended last. */
4933
+ className?: string;
4934
+ }
4935
+ /**
4936
+ * Bid response — the Submit Bid destination. The legacy screen offered four ways to
4937
+ * respond (a manual form, a pasted quote, a document upload, and for ACMI carriers a
4938
+ * calculator); the calculator is now the single submission method for everyone, so a
4939
+ * price is always built from the same inputs rather than typed in blind.
4940
+ */
4941
+ declare const CharterBidResponsePage: {
4942
+ ({ program, trips, accountName, tripLevel, acmiCarrier, requestedCarrier, defaultInputs, acmiResult, onCalculateAcmi, onSubmitBid, backLabel, onBack, submitting, locale, className, }: CharterBidResponsePageProps): React.JSX.Element;
4943
+ displayName: string;
4944
+ };
4945
+
4946
+ /** How the carrier submitted the bid STM is still parsing. */
4947
+ type CharterSubmissionType = 'form' | 'upload' | 'copyPaste';
4948
+ /** One submitted bid line as stored against the opportunity. */
4949
+ interface CharterSubmittedBid {
4950
+ /** Stable id used as the React key. */
4951
+ id: string;
4952
+ /** Seats offered. */
4953
+ seats: number;
4954
+ /** Max payload in pounds. */
4955
+ maxPayloadLbs: number;
4956
+ /** Fuel base price in dollars. */
4957
+ fuelBasePrice: number;
4958
+ /** Total cost in dollars. */
4959
+ totalCost: number;
4960
+ /** Catering included in the price. */
4961
+ cateringAvailable: string;
4962
+ /**
4963
+ * Operator notes. Salesforce stores these pipe-delimited in one field; pass the
4964
+ * already-split lines and each renders on its own row.
4965
+ */
4966
+ notesFromOperator?: string[];
4967
+ }
4968
+ interface CharterBidViewPageProps {
4969
+ /** Flight program the bid belongs to. */
4970
+ program: CharterFlightProgramBid;
4971
+ /** Trip the bid covers; omit for a program-level bid. */
4972
+ trip?: CharterTripBid;
4973
+ /** Bids submitted against this opportunity. Empty means nothing has parsed yet. */
4974
+ bids?: CharterSubmittedBid[];
4975
+ /**
4976
+ * Set when a submission exists but has not parsed into bid lines yet. The legacy page
4977
+ * told the carrier to refresh; this drives a real processing state instead.
4978
+ */
4979
+ processingSubmission?: CharterSubmissionType;
4980
+ /** Fired when the carrier asks to re-check a processing submission. */
4981
+ onRefresh?: () => void;
4982
+ /** Label for the back link above the header. */
4983
+ backLabel?: string;
4984
+ /** Fired when the back link is pressed. */
4985
+ onBack?: () => void;
4986
+ /** BCP 47 locale used for currency formatting. */
4987
+ locale?: string;
4988
+ /** Additional CSS class, appended last. */
4989
+ className?: string;
4990
+ }
4991
+ /**
4992
+ * View submitted bid — the legacy `dsp_viewBidResponse.cfm`. Shows every submitted bid
4993
+ * line, and replaces "please refresh the page" with a real processing state for bids
4994
+ * that arrived by upload or copy/paste and are still being parsed.
4995
+ */
4996
+ declare const CharterBidViewPage: {
4997
+ ({ program, trip, bids, processingSubmission, onRefresh, backLabel, onBack, locale, className, }: CharterBidViewPageProps): React.JSX.Element;
4998
+ displayName: string;
4999
+ };
2211
5000
 
2212
5001
  type ManifestSendState = 'none' | 'initial-sent' | 'final-sent';
2213
5002
  interface CharterManifestSegment {
@@ -2263,6 +5052,144 @@ interface CharterManifestPageProps {
2263
5052
  /** Stateless, service-free rendering of Hub's charter manifest page. */
2264
5053
  declare const CharterManifestPage: ({ tripName, travelStartDate, travelEndDate, seats, payloadLimit, passengerWeight, cargoWeight, carrierName, carrierNote, passengers, equipment, segments, locked, sendState, onBack, onGenerateFile, onChangeCarrier, onSplitSegments, onAddPassengers, onAddEquipment, onRemovePassenger, onRemoveEquipment, onSendInitial, onSendFinal, onUndoInitial, className, }: CharterManifestPageProps) => React.JSX.Element;
2265
5054
 
5055
+ type ChartersAccessRole = 'member' | 'admin';
5056
+ type ChartersAccessId = string | number;
5057
+ /** An account user who is eligible to receive STM Charters access. */
5058
+ interface ChartersAccountUser {
5059
+ accountUserId: ChartersAccessId;
5060
+ name: string;
5061
+ email: string;
5062
+ title?: string;
5063
+ }
5064
+ /** One account user's membership in the STM Charters workspace. */
5065
+ interface ChartersAccessMembership extends ChartersAccountUser {
5066
+ membershipId: ChartersAccessId;
5067
+ role: ChartersAccessRole;
5068
+ /** When present, the role control is disabled and this reason is shown. */
5069
+ roleChangeDisabledReason?: string;
5070
+ /** When present, the remove action is disabled and this reason is shown. */
5071
+ removeDisabledReason?: string;
5072
+ }
5073
+ interface ChartersAccessManagementPageProps {
5074
+ /** Account whose STM Charters membership is being managed. */
5075
+ accountName: string;
5076
+ /** Controlled access list. Successful callbacks must update this value in the host. */
5077
+ memberships: ChartersAccessMembership[];
5078
+ /** Existing account users who may be granted access. Existing members are filtered out. */
5079
+ availableAccountUsers: ChartersAccountUser[];
5080
+ /**
5081
+ * Optional debounced lookup for eligible account users. It is called after a trimmed query
5082
+ * reaches two characters; return the resulting candidates through availableAccountUsers.
5083
+ */
5084
+ onSearchAccountUsers?: (query: string) => void | Promise<void>;
5085
+ /** Whether the host is loading candidates requested through onSearchAccountUsers. */
5086
+ accountUserSearchLoading?: boolean;
5087
+ /** The signed-in account user, used only to display the "You" marker. */
5088
+ currentAccountUserId?: ChartersAccessId;
5089
+ /** Whether the viewer may manage access. False renders a deliberate read-only view. */
5090
+ canManageAccess: boolean;
5091
+ /** Explanation shown in the read-only state. */
5092
+ readOnlyMessage?: string;
5093
+ /** Initial page loading state. */
5094
+ loading?: boolean;
5095
+ /** Initial page error. */
5096
+ error?: string;
5097
+ /** Optional retry for the initial page error. */
5098
+ onRetry?: () => void;
5099
+ /** Return to the STM Charters landing page. */
5100
+ onBack?: () => void;
5101
+ /** Add an existing account user as a charter member or charter admin. */
5102
+ onAddAccess?: (accountUser: ChartersAccountUser, role: ChartersAccessRole) => void | Promise<void>;
5103
+ /** Promote or demote an existing charter member. */
5104
+ onChangeRole?: (membership: ChartersAccessMembership, role: ChartersAccessRole) => void | Promise<void>;
5105
+ /** Remove STM Charters access after the page confirmation. */
5106
+ onRemoveAccess?: (membership: ChartersAccessMembership) => void | Promise<void>;
5107
+ className?: string;
5108
+ }
5109
+ /**
5110
+ * Account-scoped access management for the STM Charters workspace.
5111
+ *
5112
+ * Features:
5113
+ * - Single search input with dropdown for finding and selecting multiple users
5114
+ * - Selected users shown as dismissible badges
5115
+ * - Role assignment before adding
5116
+ * - Bulk add support
5117
+ *
5118
+ * The page deliberately owns only interaction state. Memberships, authorization guards,
5119
+ * persistence, routing, and account/global-admin recovery remain controlled by the host.
5120
+ */
5121
+ declare const ChartersAccessManagementPage: {
5122
+ ({ accountName, memberships, availableAccountUsers, onSearchAccountUsers, accountUserSearchLoading, currentAccountUserId, canManageAccess, readOnlyMessage, loading, error, onRetry, onBack, onAddAccess, onChangeRole, onRemoveAccess, className, }: ChartersAccessManagementPageProps): React.JSX.Element;
5123
+ displayName: string;
5124
+ };
5125
+
5126
+ /** One of the destinations the Charters landing page fans out to. */
5127
+ interface CharterSectionCard {
5128
+ /** Stable key, also passed back through `onOpenSection`. */
5129
+ key: string;
5130
+ /** Card heading. */
5131
+ title: string;
5132
+ /** One-line explanation of what lives behind the card. */
5133
+ description: string;
5134
+ /** Number of items waiting in that section; omit to hide the count. */
5135
+ count?: number;
5136
+ /** Noun for the count, e.g. "open bids". */
5137
+ countLabel?: string;
5138
+ /** Optional icon override. Unknown keys otherwise use the standard plane icon. */
5139
+ icon?: ReactNode;
5140
+ /** Whether the count is still loading. When true, shows a spinner instead of count. */
5141
+ loading?: boolean;
5142
+ }
5143
+ /** A named STM contact for one of the two bid programs. */
5144
+ interface CharterContact {
5145
+ /** Contact's full name. */
5146
+ name: string;
5147
+ /** Their role, e.g. "Director of Charter Sales". */
5148
+ role?: string;
5149
+ /** Email address; rendered as a mailto link when present. */
5150
+ email?: string;
5151
+ /** Direct phone number. */
5152
+ phone?: string;
5153
+ }
5154
+ /** A contact group, matching the legacy Regular Season / NCAA Championship split. */
5155
+ interface CharterContactGroup {
5156
+ /** Group heading. */
5157
+ title: string;
5158
+ /** People to list under the heading. */
5159
+ contacts: CharterContact[];
5160
+ }
5161
+ interface ChartersHomePageProps {
5162
+ /** Page title. */
5163
+ title?: string;
5164
+ /** Introductory copy under the title. */
5165
+ description?: string;
5166
+ /** Section cards; defaults to the four legacy portal areas. */
5167
+ sections?: CharterSectionCard[];
5168
+ /** Contact groups shown below the cards. */
5169
+ contactGroups?: CharterContactGroup[];
5170
+ /** Label for the tutorial link. */
5171
+ tutorialLabel?: string;
5172
+ /** Fired when the tutorial link is pressed. */
5173
+ onOpenTutorial?: () => void;
5174
+ /** Fired with the card key when a section card is opened. */
5175
+ onOpenSection?: (key: string) => void;
5176
+ /** Additional CSS class, appended last. */
5177
+ className?: string;
5178
+ }
5179
+ /** The four areas the legacy carrier portal exposes, in menu order. */
5180
+ declare const CHARTER_SECTIONS: CharterSectionCard[];
5181
+ /** The STM contacts hardcoded into the legacy welcome screen. */
5182
+ declare const CHARTER_CONTACT_GROUPS: CharterContactGroup[];
5183
+ /**
5184
+ * Charters landing page — the entry point for carriers. The legacy screen was a bare
5185
+ * welcome paragraph and a PDF link; this keeps the same information architecture but
5186
+ * puts a real card into each section with the queue count already visible.
5187
+ */
5188
+ declare const ChartersHomePage: {
5189
+ ({ title, description, sections, contactGroups, tutorialLabel, onOpenTutorial, onOpenSection, className, }: ChartersHomePageProps): React.JSX.Element;
5190
+ displayName: string;
5191
+ };
5192
+
2266
5193
  interface ContactInfo {
2267
5194
  name?: string;
2268
5195
  email?: string;
@@ -2367,6 +5294,110 @@ interface DashboardPageProps {
2367
5294
  /** Exact, service-free rendering of Hub's personalized home page. */
2368
5295
  declare const DashboardPage: ({ greeting, firstName, accountName, widgets, systemBanners, alertBanners, syncStatus, onRefresh, onRemove, onResize, onReorder, onReset, onAddWidget, onTravelerRangeChange, onNavigate, className }: DashboardPageProps) => React.JSX.Element;
2369
5296
 
5297
+ type FeatureFlagIdentifier = string | number;
5298
+ type FeatureFlagTargetType = 'global' | 'account' | 'user' | 'userType' | 'role' | 'organizationalUnit' | 'organizationalUnitValue';
5299
+ type FeatureFlagRuleEffect = 'enable' | 'disable';
5300
+ /** Immutable feature metadata supplied by the host. */
5301
+ interface FeatureFlagDefinition {
5302
+ featureKey: string;
5303
+ name: string;
5304
+ description: string;
5305
+ parentFeatureKey?: string;
5306
+ defaultEnabled: boolean;
5307
+ /** Runtime definition kill switch. False means no targeting rule may enable the feature. */
5308
+ isActive?: boolean;
5309
+ }
5310
+ /** A host-owned selectable audience. IDs are opaque to the component. */
5311
+ interface FeatureFlagTargetOption {
5312
+ value: FeatureFlagIdentifier;
5313
+ label: string;
5314
+ accountId?: FeatureFlagIdentifier;
5315
+ /** Optional parent organizational-unit ID for a value option. */
5316
+ parentValue?: FeatureFlagIdentifier;
5317
+ disabled?: boolean;
5318
+ }
5319
+ interface FeatureFlagTargetOptions {
5320
+ accounts: FeatureFlagTargetOption[];
5321
+ users: FeatureFlagTargetOption[];
5322
+ userTypes: FeatureFlagTargetOption[];
5323
+ roles: FeatureFlagTargetOption[];
5324
+ organizationalUnits: FeatureFlagTargetOption[];
5325
+ organizationalUnitValues: FeatureFlagTargetOption[];
5326
+ }
5327
+ /** One persisted rule. `rowVersion` must be treated as an opaque concurrency token. */
5328
+ interface FeatureFlagRule {
5329
+ ruleId: FeatureFlagIdentifier;
5330
+ rowVersion: string;
5331
+ featureKey: string;
5332
+ targetType: FeatureFlagTargetType;
5333
+ accountId?: FeatureFlagIdentifier;
5334
+ accountLabel?: string;
5335
+ targetId?: FeatureFlagIdentifier;
5336
+ targetLabel: string;
5337
+ effect: FeatureFlagRuleEffect;
5338
+ priority: number;
5339
+ startsAt?: string | null;
5340
+ endsAt?: string | null;
5341
+ reason?: string | null;
5342
+ isActive: boolean;
5343
+ }
5344
+ interface FeatureFlagRuleFormValue {
5345
+ featureKey: string;
5346
+ targetType: FeatureFlagTargetType;
5347
+ accountId?: FeatureFlagIdentifier;
5348
+ targetId?: FeatureFlagIdentifier;
5349
+ effect: FeatureFlagRuleEffect;
5350
+ priority: number;
5351
+ startsAt?: string;
5352
+ endsAt?: string;
5353
+ reason: string;
5354
+ }
5355
+ interface FeatureFlagRuleEditRequest {
5356
+ ruleId: FeatureFlagIdentifier;
5357
+ rowVersion: string;
5358
+ value: FeatureFlagRuleFormValue;
5359
+ }
5360
+ interface FeatureFlagRuleDeactivateRequest {
5361
+ ruleId: FeatureFlagIdentifier;
5362
+ rowVersion: string;
5363
+ reason: string;
5364
+ }
5365
+ interface FeatureFlagManagementPageProps {
5366
+ /** Immutable feature catalog, including parent-child relationships. */
5367
+ definitions: FeatureFlagDefinition[];
5368
+ /** Controlled rule list. Successful mutations must be reflected by the host. */
5369
+ rules: FeatureFlagRule[];
5370
+ /** Controlled account and audience options. */
5371
+ targetOptions: FeatureFlagTargetOptions;
5372
+ loading?: boolean;
5373
+ error?: string;
5374
+ onRetry?: () => void;
5375
+ /** Host mutation state. It disables all mutation controls. */
5376
+ submitting?: boolean;
5377
+ /** Controlled user-search results are returned through `targetOptions.users`. */
5378
+ onSearchUsers?: (query: string, accountId?: FeatureFlagIdentifier) => void | Promise<void>;
5379
+ userSearchLoading?: boolean;
5380
+ userSearchError?: string;
5381
+ /** Called when an account selection needs account-scoped audience options from the host. */
5382
+ onAccountChange?: (accountId?: FeatureFlagIdentifier) => void | Promise<void>;
5383
+ audienceLoading?: boolean;
5384
+ audienceError?: string;
5385
+ onCreateRule?: (value: FeatureFlagRuleFormValue) => void | Promise<void>;
5386
+ onEditRule?: (request: FeatureFlagRuleEditRequest) => void | Promise<void>;
5387
+ onDeactivateRule?: (request: FeatureFlagRuleDeactivateRequest) => void | Promise<void>;
5388
+ className?: string;
5389
+ }
5390
+ /**
5391
+ * Presentation-only feature catalog and targeting-rule manager.
5392
+ *
5393
+ * The host owns authentication, authorization, persistence, effective-flag evaluation,
5394
+ * generated API types, and conversion to wire-level audience/effect values.
5395
+ */
5396
+ declare const FeatureFlagManagementPage: {
5397
+ ({ definitions, rules, targetOptions, loading, error, onRetry, submitting, onSearchUsers, userSearchLoading, userSearchError, onAccountChange, audienceLoading, audienceError, onCreateRule, onEditRule, onDeactivateRule, className, }: FeatureFlagManagementPageProps): React.JSX.Element;
5398
+ displayName: string;
5399
+ };
5400
+
2370
5401
  type GroupTravelRequestFieldValue = string | number | boolean | undefined;
2371
5402
  type GroupTravelRequestValues = Record<string, GroupTravelRequestFieldValue>;
2372
5403
  interface GroupTravelRequestContact {
@@ -2396,38 +5427,339 @@ declare const GroupTravelRequestPage: {
2396
5427
  };
2397
5428
 
2398
5429
  type TabKey = 'requested' | 'current' | 'past';
5430
+ interface IndividualTravelFilters {
5431
+ search: string;
5432
+ sport: string;
5433
+ traveler: string;
5434
+ travelDateFrom: string;
5435
+ travelDateTo: string;
5436
+ destination: string;
5437
+ vendor: string;
5438
+ confirmation: string;
5439
+ amountMin: string;
5440
+ amountMax: string;
5441
+ }
5442
+ interface IndividualTravelPagination {
5443
+ page: number;
5444
+ pageSize: number;
5445
+ totalCount: number;
5446
+ totalPages: number;
5447
+ }
5448
+ type IndividualTravelTabCounts = Partial<Record<TabKey, number>>;
5449
+ type IndividualTravelExportScope = 'all' | TabKey;
5450
+ interface IndividualTravelExportRequest {
5451
+ scope: IndividualTravelExportScope;
5452
+ activeTab: TabKey;
5453
+ filters: IndividualTravelFilters;
5454
+ }
2399
5455
  interface IndividualTravelPageProps {
2400
- /** Current trips data */
2401
- currentTrips: TripData[];
2402
- /** Past trips data */
2403
- pastTrips: TripData[];
2404
- /** Requested trips data */
2405
- requestedTrips: TripData[];
2406
- /** Sport options for filter */
5456
+ /**
5457
+ * Active server-provided page of rows. When supplied, filtering and paging are
5458
+ * delegated to the host through the controlled callbacks below.
5459
+ */
5460
+ trips?: TripData[];
5461
+ /** Counts for each enabled tab, independent from the current server page. */
5462
+ tabCounts?: IndividualTravelTabCounts;
5463
+ /** Enabled tabs. Defaults to the production-backed current and past views. */
5464
+ enabledTabs?: TabKey[];
5465
+ /** Controlled active tab. */
5466
+ activeTab?: TabKey;
5467
+ /** Called when the user selects a tab. */
5468
+ onTabChange?: (tab: TabKey) => void;
5469
+ /** Controlled server filters. */
5470
+ filters?: Partial<IndividualTravelFilters>;
5471
+ /** Initial filters for uncontrolled/legacy mode. */
5472
+ defaultFilters?: Partial<IndividualTravelFilters>;
5473
+ /** Called with the complete next filter set. Hosts normally debounce requests. */
5474
+ onFiltersChange?: (filters: IndividualTravelFilters) => void;
5475
+ /** Controlled server pagination. */
5476
+ pagination?: IndividualTravelPagination;
5477
+ /** Called when the user requests another page. */
5478
+ onPageChange?: (page: number) => void;
5479
+ /** Initial data load. */
5480
+ loading?: boolean;
5481
+ /** Background refresh while existing rows remain visible. */
5482
+ refreshing?: boolean;
5483
+ /** Load error displayed instead of the table. */
5484
+ error?: ReactNode;
5485
+ /** Optional retry action for a load error. */
5486
+ onRetry?: () => void;
5487
+ /** Host-controlled export state. */
5488
+ exporting?: boolean;
5489
+ /**
5490
+ * Preferred export callback. It receives the tab and filters needed to export
5491
+ * the same controlled view the user sees.
5492
+ */
5493
+ onExportFiltered?: (request: IndividualTravelExportRequest) => void | Promise<void>;
5494
+ /** Preferred booked-trip callback. Receives the stable controlled row. */
5495
+ onSelectTrip?: (trip: TripData) => void;
5496
+ /** Preferred requested-trip callback. Receives the stable controlled row. */
5497
+ onSelectRequest?: (trip: TripData) => void;
5498
+ /** Optional handoff to a real host-owned request route. Hidden when absent. */
5499
+ onCreateRequest?: () => void;
5500
+ /** Message used when the active, unfiltered source is empty. */
5501
+ emptyMessage?: string;
5502
+ /** Accessible label for the primary search field. */
5503
+ searchLabel?: string;
5504
+ /** Placeholder for the primary search field. */
5505
+ searchPlaceholder?: string;
5506
+ /** @deprecated Use `trips` with controlled tab/filter/pagination props. */
5507
+ currentTrips?: TripData[];
5508
+ /** @deprecated Use `trips` with controlled tab/filter/pagination props. */
5509
+ pastTrips?: TripData[];
5510
+ /**
5511
+ * @deprecated Use `trips` and explicitly enable `requested` only when a real
5512
+ * requested-trip source and detail handler exist.
5513
+ */
5514
+ requestedTrips?: TripData[];
5515
+ /** Sport options for the filter. `All Sports` is added automatically. */
2407
5516
  sportOptions?: FilterOption[];
2408
- /** Traveler options for filter */
5517
+ /** Traveler options for the filter. `All Travelers` is added automatically. */
2409
5518
  travelerOptions?: FilterOption[];
2410
- /** Initial active tab */
5519
+ /** @deprecated Prefer controlled `activeTab`. */
2411
5520
  initialTab?: TabKey;
2412
- /** Table density */
5521
+ /** Table density. */
2413
5522
  density?: 'comfortable' | 'compact';
2414
- /** Vendor display mode */
5523
+ /** Vendor display mode. */
2415
5524
  vendorMode?: 'icon' | 'code';
2416
- /** Use service column mode */
5525
+ /** Use a unified service column. */
2417
5526
  useServiceColumn?: boolean;
2418
- /** Callback when viewing a trip */
5527
+ /** @deprecated Prefer `onSelectTrip`. */
2419
5528
  onViewTrip?: (id: string) => void;
2420
- /** Callback when viewing a request */
5529
+ /** @deprecated Prefer `onSelectRequest`. */
2421
5530
  onViewRequest?: (id: string) => void;
2422
- /** Callback when exporting */
2423
- onExport?: (scope: 'all' | 'current' | 'past') => void;
2424
- /** Show traveler scope info for standard users */
5531
+ /**
5532
+ * Legacy export callback. It remains async-capable but cannot receive filters
5533
+ * or export the requested tab. Prefer `onExportFiltered`.
5534
+ * @deprecated
5535
+ */
5536
+ onExport?: (scope: 'all' | 'current' | 'past') => void | Promise<void>;
5537
+ /** Show traveler scope information for standard users. */
2425
5538
  showTravelerScopeInfo?: boolean;
2426
- /** Additional CSS class */
5539
+ /** Additional CSS class. */
2427
5540
  className?: string;
2428
5541
  }
2429
5542
  declare const IndividualTravelPage: React__default.FC<IndividualTravelPageProps>;
2430
5543
 
5544
+ /** Travel services represented by the legacy individual-request record. */
5545
+ type IndividualTravelRequestService = 'air' | 'hotel' | 'car' | 'bus';
5546
+ type IndividualTravelRequestTravelerType = 'self' | 'other';
5547
+ type IndividualTravelRequestAirTripType = 'one-way' | 'round-trip' | 'multi-leg';
5548
+ type IndividualTravelRequestQuestionType = 'text' | 'yes-no' | 'single-select';
5549
+ interface IndividualTravelRequestOption {
5550
+ value: string;
5551
+ label: string;
5552
+ }
5553
+ /**
5554
+ * Display-only identity for the authenticated traveler. The host remains
5555
+ * responsible for deriving the submitting user and self traveler from auth.
5556
+ */
5557
+ interface IndividualTravelRequestCurrentTraveler {
5558
+ displayName: string;
5559
+ email?: string;
5560
+ }
5561
+ interface IndividualTravelRequestTraveler {
5562
+ firstName: string;
5563
+ middleName?: string;
5564
+ lastName: string;
5565
+ dateOfBirth?: string;
5566
+ gender?: string;
5567
+ }
5568
+ interface IndividualTravelRequestQuestion {
5569
+ id: string;
5570
+ label: string;
5571
+ type: IndividualTravelRequestQuestionType;
5572
+ description?: string;
5573
+ required?: boolean;
5574
+ minLength?: number;
5575
+ maxLength?: number;
5576
+ options?: IndividualTravelRequestOption[];
5577
+ defaultValue?: string | boolean;
5578
+ }
5579
+ interface IndividualTravelRequestAirLeg {
5580
+ departureLocation: string;
5581
+ arrivalLocation: string;
5582
+ departureDate: string;
5583
+ departureTime: string;
5584
+ /** Used by a round-trip request. Multi-leg trips use another leg instead. */
5585
+ returnDate?: string;
5586
+ returnTime?: string;
5587
+ }
5588
+ interface IndividualTravelRequestAirRequest {
5589
+ tripType: IndividualTravelRequestAirTripType;
5590
+ legs: IndividualTravelRequestAirLeg[];
5591
+ details?: string;
5592
+ farePreference?: string;
5593
+ flightPreference?: string;
5594
+ preferredAirline?: string;
5595
+ priority?: string;
5596
+ }
5597
+ interface IndividualTravelRequestHotelLeg {
5598
+ city: string;
5599
+ checkInDate: string;
5600
+ checkOutDate: string;
5601
+ }
5602
+ interface IndividualTravelRequestHotelRequest {
5603
+ legs: IndividualTravelRequestHotelLeg[];
5604
+ bedPreference?: string;
5605
+ smokingPreference?: string;
5606
+ preferredHotel?: string;
5607
+ }
5608
+ interface IndividualTravelRequestCarLeg {
5609
+ pickupCity: string;
5610
+ pickupLocation?: string;
5611
+ pickupDate: string;
5612
+ /** Exact local time in 24-hour `HH:MM` form. */
5613
+ pickupTime: string;
5614
+ dropoffLocation?: string;
5615
+ dropoffDate: string;
5616
+ /** Exact local time in 24-hour `HH:MM` form. */
5617
+ dropoffTime: string;
5618
+ }
5619
+ interface IndividualTravelRequestCarRequest {
5620
+ legs: IndividualTravelRequestCarLeg[];
5621
+ vehicleType?: string;
5622
+ rentalCompany?: string;
5623
+ flightNumberOrTailNumber?: string;
5624
+ }
5625
+ interface IndividualTravelRequestBusRequest {
5626
+ pickupCity?: string;
5627
+ pickupLocation?: string;
5628
+ pickupDateTime?: string;
5629
+ dropoffCity?: string;
5630
+ dropoffLocation?: string;
5631
+ dropoffDateTime?: string;
5632
+ vehicleType?: string;
5633
+ specialRequests?: string;
5634
+ }
5635
+ type IndividualTravelRequestAnswerValue = string | boolean;
5636
+ /**
5637
+ * Host-submittable request values. Account and actor IDs are deliberately not
5638
+ * represented; the server must derive them from the authenticated context.
5639
+ */
5640
+ interface IndividualTravelRequestValues {
5641
+ travelerType: IndividualTravelRequestTravelerType;
5642
+ /** Empty for self; populated only when travelerType is `other`. */
5643
+ travelers: IndividualTravelRequestTraveler[];
5644
+ /** Comma-delimited when emitted. The form also accepts semicolon input. */
5645
+ additionalEmails?: string;
5646
+ organizationAnswers: Record<string, string>;
5647
+ billingAnswers: Record<string, IndividualTravelRequestAnswerValue>;
5648
+ airRequest?: IndividualTravelRequestAirRequest;
5649
+ hotelRequest?: IndividualTravelRequestHotelRequest;
5650
+ carRequest?: IndividualTravelRequestCarRequest;
5651
+ busRequest?: IndividualTravelRequestBusRequest;
5652
+ specialRequests?: string;
5653
+ }
5654
+ interface IndividualTravelRequestFormConfiguration {
5655
+ organizationQuestions?: IndividualTravelRequestQuestion[];
5656
+ billingQuestions?: IndividualTravelRequestQuestion[];
5657
+ airlineOptions?: IndividualTravelRequestOption[];
5658
+ timeOptions?: IndividualTravelRequestOption[];
5659
+ fareOptions?: IndividualTravelRequestOption[];
5660
+ flightPreferenceOptions?: IndividualTravelRequestOption[];
5661
+ airPriorityOptions?: IndividualTravelRequestOption[];
5662
+ hotelOptions?: IndividualTravelRequestOption[];
5663
+ bedOptions?: IndividualTravelRequestOption[];
5664
+ smokingOptions?: IndividualTravelRequestOption[];
5665
+ vehicleOptions?: IndividualTravelRequestOption[];
5666
+ rentalCompanyOptions?: IndividualTravelRequestOption[];
5667
+ busVehicleOptions?: IndividualTravelRequestOption[];
5668
+ genderOptions?: IndividualTravelRequestOption[];
5669
+ /** Defaults to the currently verified air, hotel, and car request UI. */
5670
+ enabledServices?: IndividualTravelRequestService[];
5671
+ /** The host must authorize this capability. Defaults to false. */
5672
+ allowOtherTravelers?: boolean;
5673
+ /** Capped at the legacy maximum of 10. */
5674
+ maxTravelers?: number;
5675
+ /** Capped at the legacy maximum of four per service. */
5676
+ maxSegments?: number;
5677
+ }
5678
+ interface IndividualTravelRequestLabeledAnswer {
5679
+ id: string;
5680
+ label: string;
5681
+ value: IndividualTravelRequestAnswerValue;
5682
+ }
5683
+ interface IndividualTravelRequestSubmitter {
5684
+ name: string;
5685
+ email?: string;
5686
+ phone?: string;
5687
+ }
5688
+ /** Read-only detail model; all identity values are display text, never IDs. */
5689
+ interface IndividualTravelRequestDetail {
5690
+ requestId: string;
5691
+ submittedAt: string;
5692
+ completedAt?: string;
5693
+ submittedBy?: IndividualTravelRequestSubmitter;
5694
+ travelerType: IndividualTravelRequestTravelerType;
5695
+ travelers: IndividualTravelRequestTraveler[];
5696
+ additionalEmails?: string;
5697
+ organizationAnswers?: IndividualTravelRequestLabeledAnswer[];
5698
+ billingAnswers?: IndividualTravelRequestLabeledAnswer[];
5699
+ airRequest?: IndividualTravelRequestAirRequest;
5700
+ hotelRequest?: IndividualTravelRequestHotelRequest;
5701
+ carRequest?: IndividualTravelRequestCarRequest;
5702
+ busRequest?: IndividualTravelRequestBusRequest;
5703
+ specialRequests?: string;
5704
+ }
5705
+
5706
+ interface IndividualTravelRequestFormPageProps {
5707
+ /** Authenticated traveler display data. The component never emits an actor ID. */
5708
+ currentTraveler: IndividualTravelRequestCurrentTraveler;
5709
+ /** Account-aware questions and options loaded by the host. */
5710
+ configuration: IndividualTravelRequestFormConfiguration;
5711
+ /** Controlled form values. */
5712
+ values?: IndividualTravelRequestValues;
5713
+ /** Initial values for uncontrolled use. */
5714
+ initialValues?: Partial<IndividualTravelRequestValues>;
5715
+ /** Called with the complete next form value in controlled or uncontrolled use. */
5716
+ onChange?: (values: IndividualTravelRequestValues) => void;
5717
+ /** Hidden when absent; the remaining form is disabled and clearly read-only. */
5718
+ onSubmit?: (values: IndividualTravelRequestValues) => void | Promise<void>;
5719
+ /** Optional host-owned return/cancel route. */
5720
+ onCancel?: () => void;
5721
+ /** Configuration or initial-page loading state. */
5722
+ loading?: boolean;
5723
+ /** Host-controlled submit state. */
5724
+ submitting?: boolean;
5725
+ /** Load or submit error from the host. */
5726
+ error?: ReactNode;
5727
+ /** Server validation errors keyed with the form paths documented by this page. */
5728
+ fieldErrors?: Record<string, string>;
5729
+ /** Optional retry for a failed host operation. */
5730
+ onRetry?: () => void;
5731
+ /** Optional account-specific fee or response-time notice. */
5732
+ notice?: ReactNode;
5733
+ submitLabel?: string;
5734
+ className?: string;
5735
+ }
5736
+ declare const IndividualTravelRequestFormPage: React__default.FC<IndividualTravelRequestFormPageProps>;
5737
+
5738
+ interface IndividualTravelRequestDetailPageProps {
5739
+ /** Authorized request detail supplied by the host. */
5740
+ request?: IndividualTravelRequestDetail;
5741
+ /** Replaces request facts while the host loads the authorized record. */
5742
+ loading?: boolean;
5743
+ /** Replaces request facts when the host could not load the record. */
5744
+ error?: ReactNode;
5745
+ /** Important host-owned context shown above a loaded request. */
5746
+ notice?: ReactNode;
5747
+ /** Optional host-owned return route. Hidden when absent. */
5748
+ onBack?: () => void;
5749
+ backLabel?: string;
5750
+ /** Optional retry for a failed host query. Hidden unless an error is present. */
5751
+ onRetry?: () => void;
5752
+ className?: string;
5753
+ }
5754
+ /**
5755
+ * Read-only presentation for an authorized individual-travel request.
5756
+ *
5757
+ * The component performs no routing or lookup and intentionally exposes no
5758
+ * approve, edit, cancel, or email actions. Authorization and tenant scope stay
5759
+ * with the host that supplies `request`.
5760
+ */
5761
+ declare const IndividualTravelRequestDetailPage: ({ request, loading, error, notice, onBack, backLabel, onRetry, className, }: IndividualTravelRequestDetailPageProps) => React.JSX.Element;
5762
+
2431
5763
  interface InfoCenterArticle {
2432
5764
  id: string;
2433
5765
  title: string;
@@ -2478,6 +5810,78 @@ interface InfoCenterPageProps {
2478
5810
  */
2479
5811
  declare const InfoCenterPage: ({ title, accountName, articles, state, isAdmin, onAddArticle, onEditArticle, onOpenExternal, className, showBreadcrumb, homeHref, initialArticleId, onInitialArticleOpen, }: InfoCenterPageProps) => React.JSX.Element;
2480
5812
 
5813
+ /** The travel team contact shown alongside the itinerary. */
5814
+ interface ItineraryAgent {
5815
+ /** Agent or team name */
5816
+ name: string;
5817
+ /** Role, e.g. `Travel Consultant` */
5818
+ role?: string;
5819
+ /** Contact phone number */
5820
+ phone?: string;
5821
+ /** Contact email address */
5822
+ email?: string;
5823
+ }
5824
+ interface ItineraryPageProps {
5825
+ /** Trip name, e.g. `Las Vegas Invitational` */
5826
+ tripName: string;
5827
+ /** Airline record locator / PNR for the trip */
5828
+ recordLocator: string;
5829
+ /** Travelers on the itinerary. A team name can be passed as a single entry. */
5830
+ travelers: string[];
5831
+ /** First travel date as `YYYY-MM-DD` */
5832
+ startDate: string;
5833
+ /** Last travel date as `YYYY-MM-DD` */
5834
+ endDate: string;
5835
+ /** Every air, car and hotel booking on the trip */
5836
+ segments: ItinerarySegment[];
5837
+ /** Overall booking state shown next to the trip name */
5838
+ status?: ItinerarySegmentStatus;
5839
+ /** Sport or program code, e.g. `MBB` */
5840
+ sportCode?: string;
5841
+ /** Total trip cost; when omitted the cost summary is hidden */
5842
+ totalCost?: number;
5843
+ /** ISO 4217 currency code for all amounts on the page */
5844
+ currency?: string;
5845
+ /** Travel team contact for the trip */
5846
+ agent?: ItineraryAgent;
5847
+ /** Shows the loading state in place of the timeline */
5848
+ loading?: boolean;
5849
+ /** Message shown in place of the timeline when the itinerary could not be loaded */
5850
+ error?: ReactNode;
5851
+ /** Important host-owned context shown above the timeline without replacing it */
5852
+ notice?: ReactNode;
5853
+ /** Called when the traveler retries a failed itinerary load */
5854
+ onRetry?: () => void;
5855
+ /** Called when the traveler returns to the individual-travel list */
5856
+ onBack?: () => void;
5857
+ /** Accessible text for the optional return action */
5858
+ backLabel?: string;
5859
+ /** Called when the traveler prints the itinerary */
5860
+ onPrint?: () => void;
5861
+ /** Called when the traveler emails the itinerary */
5862
+ onEmail?: () => void;
5863
+ /** Called when the traveler adds the trip to their calendar */
5864
+ onAddToCalendar?: () => void;
5865
+ /** Called when the traveler opens the PDF virtual invoice */
5866
+ onDownloadInvoice?: () => void;
5867
+ /** Called when a traveler starts online check-in for a flight */
5868
+ onCheckIn?: (segment: ItineraryAirSegment) => void;
5869
+ /** Additional CSS class */
5870
+ className?: string;
5871
+ }
5872
+ /**
5873
+ * ItineraryPage — the traveler-facing itinerary for a single trip.
5874
+ *
5875
+ * Shows who is travelling, when, and every flight, rental car and hotel stay in
5876
+ * day order, together with the actions the Portal itinerary offers today: print
5877
+ * it, email it, add it to a calendar, or open the PDF invoice. The page holds no
5878
+ * data of its own — everything arrives as props.
5879
+ */
5880
+ declare const ItineraryPage: {
5881
+ ({ tripName, recordLocator, travelers, startDate, endDate, segments, status, sportCode, totalCost, currency, agent, loading, error, notice, onRetry, onBack, backLabel, onPrint, onEmail, onAddToCalendar, onDownloadInvoice, onCheckIn, className, }: ItineraryPageProps): React.JSX.Element;
5882
+ displayName: string;
5883
+ };
5884
+
2481
5885
  interface NotFoundPageProps {
2482
5886
  /** Error code to display */
2483
5887
  errorCode?: string | number;
@@ -2506,6 +5910,262 @@ declare const NotFoundPage: {
2506
5910
  displayName: string;
2507
5911
  };
2508
5912
 
5913
+ /** One (raw text → corrected JSON) pair appended to future extraction prompts. */
5914
+ interface OffFleetLearnedExample {
5915
+ /** Stable id used as the React key. */
5916
+ id: string;
5917
+ /** Operator the example is scoped to — examples only apply to the same operator. */
5918
+ operator: string;
5919
+ /** File the correction came from. */
5920
+ sourceFileName: string;
5921
+ /** When the correction was reprocessed, e.g. "3d ago". */
5922
+ learnedLabel: string;
5923
+ /** The raw document text, rendered verbatim. */
5924
+ rawText: string;
5925
+ /** The corrected JSON, rendered verbatim. */
5926
+ correctedJson: string;
5927
+ }
5928
+ interface OffFleetLearnedExamplesPageProps {
5929
+ /** Examples in the corpus. An empty array is the expected starting state. */
5930
+ examples?: OffFleetLearnedExample[];
5931
+ /** Fired with the example id when one is opened in full. */
5932
+ onOpenExample?: (exampleId: string) => void;
5933
+ /** Additional CSS class, appended last. */
5934
+ className?: string;
5935
+ }
5936
+ /** What the corpus is for and which requirement it satisfies. */
5937
+ declare const OFF_FLEET_LEARNED_DESCRIPTION = "Every correction submitted through this site is saved as a (raw text \u2192 corrected JSON) pair and appended to future extraction prompts for the same operator. This is ITD-8195\u2019s fourth requirement \u2014 the mechanism that is supposed to stop the same document format coming back to review week after week.";
5938
+ /** Why the corpus is empty until the first correction is reprocessed. */
5939
+ declare const OFF_FLEET_LEARNED_EMPTY_COPY = "The corpus starts empty and only /api/Reprocess writes to it, so the first row appears after the first correction is reprocessed from this site. Until then every extraction runs on the base prompt alone.";
5940
+ /**
5941
+ * Learned examples — the corrections corpus. The empty state explains the mechanism
5942
+ * rather than apologising, because an empty corpus is the correct starting state.
5943
+ */
5944
+ declare const OffFleetLearnedExamplesPage: {
5945
+ ({ examples, onOpenExample, className, }: OffFleetLearnedExamplesPageProps): React.JSX.Element;
5946
+ displayName: string;
5947
+ };
5948
+
5949
+ /** Where an off-fleet submission sits in the parser pipeline. */
5950
+ type OffFleetSubmissionStatus = 'needs-review' | 'received' | 'processing' | 'parsed';
5951
+ /** One carrier quote the parser could not reconcile against a Trip quote record. */
5952
+ interface OffFleetSubmission {
5953
+ /** Submission UUID — the row key. */
5954
+ id: string;
5955
+ /** Original document file name. */
5956
+ fileName: string;
5957
+ /** Flight Program GUID the submission was filed against. */
5958
+ flightProgramGuid: string;
5959
+ /**
5960
+ * Why the parser could not finish. Rendered verbatim and in full — never truncated,
5961
+ * because the exact list of unmatched flights is what the reviewer acts on.
5962
+ */
5963
+ failureReason: string;
5964
+ /** Resolved carrier name, or undefined when only a GUID is known. */
5965
+ carrierName?: string;
5966
+ /** Carrier GUID, shown when the name could not be resolved. */
5967
+ carrierGuid?: string;
5968
+ /** Pipeline status. */
5969
+ status: OffFleetSubmissionStatus;
5970
+ /** True when the raw document text was captured. */
5971
+ hasRawText?: boolean;
5972
+ /** True when the model's extraction JSON was stored. */
5973
+ hasExtraction?: boolean;
5974
+ /** Human relative time since the last update, e.g. "16h ago". */
5975
+ updatedLabel: string;
5976
+ }
5977
+ interface OffFleetReviewQueuePageProps {
5978
+ /** Submissions to list. */
5979
+ submissions: OffFleetSubmission[];
5980
+ /** Counts for the stat tiles; derived from `submissions` when omitted. */
5981
+ counts?: Partial<Record<OffFleetSubmissionStatus | 'all', number>>;
5982
+ /** Fired with the submission id when Review is pressed. */
5983
+ onReview?: (submissionId: string) => void;
5984
+ /** Fired when the raw document text is opened. */
5985
+ onOpenRawText?: (submissionId: string) => void;
5986
+ /** Fired when the stored extraction JSON is opened. */
5987
+ onOpenExtraction?: (submissionId: string) => void;
5988
+ /** Shows the table's loading row instead of data. */
5989
+ loading?: boolean;
5990
+ /** Additional CSS class, appended last. */
5991
+ className?: string;
5992
+ }
5993
+ /** Copy explaining what lands in this queue and why nothing here dies silently. */
5994
+ declare const OFF_FLEET_QUEUE_DESCRIPTION = "Off-fleet carrier quotes the parser could not reconcile against existing Trip quote records. Each one keeps the raw document text and whatever the model extracted, so it can be corrected and reprocessed rather than dying silently.";
5995
+ /**
5996
+ * Off-fleet review queue. Failure reasons render in full inside the Submission cell —
5997
+ * a reviewer cannot decide what to correct from the word "Error".
5998
+ */
5999
+ declare const OffFleetReviewQueuePage: {
6000
+ ({ submissions, counts, onReview, onOpenRawText, onOpenExtraction, loading, className, }: OffFleetReviewQueuePageProps): React.JSX.Element;
6001
+ displayName: string;
6002
+ };
6003
+
6004
+ /** How the stated prices group onto legs. Changing this changes every per-leg price. */
6005
+ type OffFleetPriceBasis = 'per_segment' | 'per_round_trip' | 'trip_total';
6006
+ /** Whether a leg was matched to a Trip segment, and how. */
6007
+ type OffFleetLegMatch = 'unmatched' | 'ferry' | 'matched';
6008
+ /** A Trip segment the parser could have matched a leg against. */
6009
+ interface OffFleetTripSegment {
6010
+ /** Stable id used as the React key. */
6011
+ id: string;
6012
+ /** Departure date, ISO `yyyy-mm-dd`. */
6013
+ departs: string;
6014
+ /** Departure airport code. */
6015
+ origin: string;
6016
+ /** Arrival airport code. */
6017
+ destination: string;
6018
+ /** Trip GUID the segment belongs to. */
6019
+ tripGuid: string;
6020
+ }
6021
+ /** One leg of the quote — one takeoff, one landing. */
6022
+ interface OffFleetLeg {
6023
+ /** Stable id used as the React key. */
6024
+ id: string;
6025
+ /** How this leg matched a Trip segment. */
6026
+ match: OffFleetLegMatch;
6027
+ /** Flight date, ISO `yyyy-mm-dd`. */
6028
+ date: string;
6029
+ /** Departure airport code. */
6030
+ from: string;
6031
+ /** Arrival airport code. */
6032
+ to: string;
6033
+ /** Scheduled departure time, `HH:mm`. */
6034
+ etd: string;
6035
+ /** Scheduled arrival time, `HH:mm`. */
6036
+ eta: string;
6037
+ /** Equipment for this leg. */
6038
+ aircraft: string;
6039
+ /** Seats on this leg. */
6040
+ seats: string;
6041
+ /** Price as stated in the document, before normalization. */
6042
+ price: string;
6043
+ }
6044
+ /** The fields the parser maps onto the Salesforce Flight Quote. */
6045
+ interface OffFleetQuoteHeader {
6046
+ /** Operator as stated in the document. */
6047
+ operator: string;
6048
+ /** School or organisation, only when the document states it explicitly. */
6049
+ charterer: string;
6050
+ /** Date of the quote, not of a flight. ISO `yyyy-mm-dd`. */
6051
+ quoteDate: string;
6052
+ /** ISO 4217 currency code. */
6053
+ currency: string;
6054
+ /** Fuel base price, numeric with no currency symbol. */
6055
+ fuelBasePrice: string;
6056
+ /** Unit price, only when it is distinct from the leg table. */
6057
+ unitPrice: string;
6058
+ /** How the stated prices group onto legs. */
6059
+ priceBasis: OffFleetPriceBasis;
6060
+ /** Total the document states, checked to ±$1 after normalization. */
6061
+ statedTotal: string;
6062
+ }
6063
+ /** One row of the money reconciliation. */
6064
+ interface OffFleetPreflightRow {
6065
+ /** Leg label, e.g. "Leg 1". */
6066
+ leg: string;
6067
+ /** Price as stated in the document. */
6068
+ asStated: string;
6069
+ /** Price assigned to the leg once the price basis is applied. */
6070
+ perLegAfterNormalization: string;
6071
+ }
6072
+ /** Legs grouped by the Trip they will be billed against. */
6073
+ interface OffFleetTripGrouping {
6074
+ /** Trip GUID. */
6075
+ tripGuid: string;
6076
+ /** How many legs land on this Trip. */
6077
+ legCount: number;
6078
+ /** Total for this Trip, formatted. */
6079
+ total: string;
6080
+ }
6081
+ /** A per-leg problem the reviewer can jump to. */
6082
+ interface OffFleetLegDiagnostic {
6083
+ /** Id of the leg the message is about. */
6084
+ legId: string;
6085
+ /** The diagnostic, rendered in full. */
6086
+ message: string;
6087
+ }
6088
+ /** Everything the pre-flight check reports. */
6089
+ interface OffFleetPreflightCheck {
6090
+ /** Per-leg reconciliation rows. */
6091
+ rows: OffFleetPreflightRow[];
6092
+ /** Total across every row, formatted. */
6093
+ total: string;
6094
+ /** How many legs are still unmatched. */
6095
+ unmatchedCount: number;
6096
+ /** How many legs there are in total. */
6097
+ legCount: number;
6098
+ /** Legs grouped by Trip. */
6099
+ tripGroupings: OffFleetTripGrouping[];
6100
+ /** Per-leg problems, each with a jump target. */
6101
+ diagnostics?: OffFleetLegDiagnostic[];
6102
+ /** Warnings that do not block, e.g. ferry-leg matching. */
6103
+ warnings?: string[];
6104
+ }
6105
+ interface OffFleetSubmissionDetailPageProps {
6106
+ /** Submission UUID, shown as the subtitle. */
6107
+ submissionId: string;
6108
+ /** Original document file name, shown as the H1. */
6109
+ fileName: string;
6110
+ /** Status badge next to the back button. */
6111
+ statusLabel?: string;
6112
+ /** Why the submission needs review, rendered verbatim and in full. */
6113
+ failureReason: string;
6114
+ /** The raw text the parser read, OCR damage included. */
6115
+ rawText: string;
6116
+ /** Carrier name as resolved. */
6117
+ carrier: string;
6118
+ /** Carrier Union GUID. */
6119
+ carrierUnion: string;
6120
+ /** Flight Program GUID. */
6121
+ flightProgram: string;
6122
+ /** UTC timestamp the submission was received. */
6123
+ receivedAt: string;
6124
+ /** UTC timestamp of the last update. */
6125
+ updatedAt: string;
6126
+ /** Trip segments available for matching. */
6127
+ tripSegments?: OffFleetTripSegment[];
6128
+ /** The extraction JSON exactly as stored. */
6129
+ extractionJson?: string;
6130
+ /** Quote header values the reviewer can correct. */
6131
+ quoteHeader: OffFleetQuoteHeader;
6132
+ /** Flight legs the reviewer can correct. */
6133
+ legs: OffFleetLeg[];
6134
+ /** Free-text ambiguity reason. */
6135
+ ambiguityReason?: string;
6136
+ /** The money reconciliation panel. */
6137
+ preflight?: OffFleetPreflightCheck;
6138
+ /**
6139
+ * Why the expensive actions are unavailable. When set, both buttons are disabled and
6140
+ * the reason is shown — an action is never disabled without saying why.
6141
+ */
6142
+ blockedReason?: string;
6143
+ /** Fired with the corrected header, legs, and ambiguity reason. */
6144
+ onCheckCorrection?: (values: {
6145
+ quoteHeader: OffFleetQuoteHeader;
6146
+ legs: OffFleetLeg[];
6147
+ ambiguityReason: string;
6148
+ }) => void;
6149
+ /** Fired when the submission is reprocessed. */
6150
+ onReprocess?: () => void;
6151
+ /** Label for the back link. */
6152
+ backLabel?: string;
6153
+ /** Fired when the back link is pressed. */
6154
+ onBack?: () => void;
6155
+ /** Additional CSS class, appended last. */
6156
+ className?: string;
6157
+ }
6158
+ /**
6159
+ * The off-fleet reviewer. Three properties are load-bearing and deliberate: every input
6160
+ * carries helper text explaining what the field *means* rather than how to format it,
6161
+ * failure reasons and diagnostics render in full, and the expensive actions are disabled
6162
+ * with the reason stated rather than silently greyed out.
6163
+ */
6164
+ declare const OffFleetSubmissionDetailPage: {
6165
+ ({ submissionId, fileName, statusLabel, failureReason, rawText, carrier, carrierUnion, flightProgram, receivedAt, updatedAt, tripSegments, extractionJson, quoteHeader: initialHeader, legs: initialLegs, ambiguityReason: initialAmbiguity, preflight, blockedReason, onCheckCorrection, onReprocess, backLabel, onBack, className, }: OffFleetSubmissionDetailPageProps): React.JSX.Element;
6166
+ displayName: string;
6167
+ };
6168
+
2509
6169
  type RosterProgramNumberId = number | string;
2510
6170
  interface RosterProgramNumberRow {
2511
6171
  id: RosterProgramNumberId;
@@ -2527,6 +6187,47 @@ declare const RosterProgramNumbersPage: {
2527
6187
  displayName: string;
2528
6188
  };
2529
6189
 
6190
+ interface RegularSeasonBidsPageProps {
6191
+ /** Flight programs for the selected queue. */
6192
+ bids: CharterFlightProgramBid[];
6193
+ /** Controlled queue selection; omit to let the page own it. */
6194
+ bidType?: RegularSeasonBidType;
6195
+ /** Queue selected on first render when `bidType` is omitted. */
6196
+ defaultBidType?: RegularSeasonBidType;
6197
+ /** Fired with the queue the carrier switched to. */
6198
+ onBidTypeChange?: (bidType: RegularSeasonBidType) => void;
6199
+ /** ACMI carriers may re-bid, so Submit Bid stays available after submission. */
6200
+ acmiCarrier?: boolean;
6201
+ /** "Today" used to decide which rows are expiring soon. */
6202
+ today?: string;
6203
+ /** Label for the back link above the header. */
6204
+ backLabel?: string;
6205
+ /** Fired when the back link is pressed; the link is hidden without it. */
6206
+ onBack?: () => void;
6207
+ /** Fired when Submit Bid is pressed at either level. */
6208
+ onSubmitBid?: (target: CharterBidTarget) => void;
6209
+ /** Fired when View Bid is pressed at either level. */
6210
+ onViewBid?: (target: CharterBidTarget) => void;
6211
+ /** Fired when a single No Bid button is pressed. */
6212
+ onNoBid?: (target: CharterBidTarget) => void;
6213
+ /** Fired with every checked row when "Submit No Bid for Selected" is pressed. */
6214
+ onBulkNoBid?: (targets: CharterBidTarget[]) => void;
6215
+ /** Shows the table's loading row instead of data. */
6216
+ loading?: boolean;
6217
+ /** BCP 47 locale used for date formatting. */
6218
+ locale?: string;
6219
+ /** Additional CSS class, appended last. */
6220
+ className?: string;
6221
+ }
6222
+ /**
6223
+ * Regular Season bid queues — the legacy `RegularSeasonBids/index.cfm` list with its six
6224
+ * status tabs, filters, and two-level accordion, rebuilt as a real page.
6225
+ */
6226
+ declare const RegularSeasonBidsPage: {
6227
+ ({ bids, bidType: controlledBidType, defaultBidType, onBidTypeChange, acmiCarrier, today, backLabel, onBack, onSubmitBid, onViewBid, onNoBid, onBulkNoBid, loading, locale, className, }: RegularSeasonBidsPageProps): React.JSX.Element;
6228
+ displayName: string;
6229
+ };
6230
+
2530
6231
  interface RosterReportOption {
2531
6232
  id: string;
2532
6233
  title: string;
@@ -2543,6 +6244,77 @@ declare const RosterReportsPage: {
2543
6244
  displayName: string;
2544
6245
  };
2545
6246
 
6247
+ /** The quote fields an admin may correct in place before approving. */
6248
+ interface SourcingQuoteDraft {
6249
+ /** Operating carrier as it should read on the Flight Quote. */
6250
+ carrier: string;
6251
+ /** Travel party the quote must seat. */
6252
+ passengers: string;
6253
+ /** First revenue departure, ISO `yyyy-mm-dd`. */
6254
+ departureDate: string;
6255
+ /** Cost line items; the quoted total is always derived from these. */
6256
+ lineItems: SourcingCostLineItem[];
6257
+ }
6258
+ interface SourcingQuoteDetailPageProps {
6259
+ /** The quote under review. */
6260
+ quote: SourcingQuote;
6261
+ /** Label for the back link above the header. */
6262
+ backLabel?: string;
6263
+ /** Fired when the back link is pressed. */
6264
+ onBack?: () => void;
6265
+ /** Fired with the corrected quote and every edit that must be persisted before approval. */
6266
+ onApprove?: (quoteId: string, changes: QuoteFieldChange[], draft: SourcingQuoteDraft) => void;
6267
+ /** Fired with the note explaining an outright rejection. */
6268
+ onReject?: (quoteId: string, note: string) => void;
6269
+ /** Shows the in-progress state on the approve confirmation. */
6270
+ actionsLoading?: boolean;
6271
+ /** Allow admins to edit facts and line items before approval. */
6272
+ editable?: boolean;
6273
+ /** BCP 47 locale used for currency and date formatting. */
6274
+ locale?: string;
6275
+ /** Additional CSS class, appended last. */
6276
+ className?: string;
6277
+ }
6278
+ /**
6279
+ * Hub's single-quote sourcing review screen. The admin corrects and records the quote here;
6280
+ * there is no request-changes round trip back to the carrier, so
6281
+ * every field is editable, the total stays derived from the line items, and approving
6282
+ * lists each edit old → new so the host can persist the edit before recording approval.
6283
+ */
6284
+ declare const SourcingQuoteDetailPage: {
6285
+ ({ quote, backLabel, onBack, onApprove, onReject, actionsLoading, editable, locale, className, }: SourcingQuoteDetailPageProps): React.JSX.Element;
6286
+ displayName: string;
6287
+ };
6288
+
6289
+ interface SourcingReviewQueuePageProps {
6290
+ /** Page title shown above the queue. */
6291
+ title?: string;
6292
+ /** Supporting copy under the title. */
6293
+ description?: string;
6294
+ /** Carrier-submitted quotes to review. */
6295
+ quotes: SourcingQuote[];
6296
+ /** Controlled selection of quote ids. */
6297
+ selectedQuoteIds?: string[];
6298
+ /** Fired whenever the selection changes. */
6299
+ onSelectionChange?: (selectedQuoteIds: string[]) => void;
6300
+ /** Fired when a quote is opened for review. */
6301
+ onOpenQuote?: (quoteId: string) => void;
6302
+ /** Fired with every selected id when the bulk-approve button is pressed. */
6303
+ onBulkApprove?: (quoteIds: string[]) => void;
6304
+ /** Hides the summary metrics above the queue. */
6305
+ hideSummary?: boolean;
6306
+ /** Rows shown per page. */
6307
+ pageSize?: number;
6308
+ /** Shows the table's loading row instead of data. */
6309
+ loading?: boolean;
6310
+ /** BCP 47 locale used for currency and date formatting. */
6311
+ locale?: string;
6312
+ /** Additional CSS class, appended last. */
6313
+ className?: string;
6314
+ }
6315
+ /** Hub's ACMI sourcing review queue — every carrier quote waiting on an admin decision. */
6316
+ declare const SourcingReviewQueuePage: ({ title, description, quotes, selectedQuoteIds, onSelectionChange, onOpenQuote, onBulkApprove, hideSummary, pageSize, loading, locale, className, }: SourcingReviewQueuePageProps) => React.JSX.Element;
6317
+
2546
6318
  interface TeamManagementTab extends TeamSubMenuTab {
2547
6319
  /** Tab icon */
2548
6320
  icon?: ReactNode;
@@ -2726,5 +6498,5 @@ declare const TripDetailPage: {
2726
6498
  displayName: string;
2727
6499
  };
2728
6500
 
2729
- export { Accordion, AdministrationPage, AirSegment, Alert, AppLayout, ArrowDownLeftIcon, ArrowUpRightIcon, Avatar, AvatarGroup, Badge, BuildingIcon, BusIcon, Button, CalendarIcon, CalendarTypeSelector, CalendarViewSelector, CarIcon, Card, CardBody, CardFooter, CardHeader, CharterManifestPage, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CloseIcon, ConfirmModal, ContactList, ContactUsPage, CubeIcon, DashboardIcon, DashboardPage, Datepicker, DocumentIcon, DownloadIcon, Drawer, DrawerBody, DrawerFooter, DrawerHeader, Dropdown, DueDatesDrawer, EditIcon, EyeIcon, FilterChip, FilterIcon, FormField, FormRow, FormSection, FormStack, GridIcon, GroundSegment, GroupTravelRequestPage, HUB_ADMIN_ITEM, HUB_INDIVIDUAL_TRAVEL_ITEM, HUB_NAV_ITEMS, HomeIcon, HotelIcon, HotelSegment, HubAppShell, Icons, IndividualTravelPage, InfoCenterPage, InfoIcon, Input, LightbulbIcon, LimoIcon, LockIcon, LogoIcon, MailIcon, ManifestCapacityStats, ManifestViewToggle, MegaphoneIcon, MembershipPrograms, MenuIcon, Metric, MinusIcon, Modal, ModalFooter, Module, ModuleDivider, ModuleVerticalDivider, NavItem, NotFoundPage, PageBanners, PhoneIcon, PlaneIcon, PlusIcon, PreferencesPanel, PrinterIcon, Progress, ProgressBar, ProgressCircle, RailIcon, RefreshIcon, ReportIcon, RequestFormFooter, RequestFormHeader, RequestFormLayout, RequestSummary, RosterProgramNumbersPage, RosterReportsPage, RosterToolbar, SUPPLIER_TYPE_OPTIONS, SchoolContactForm, SearchField, SearchIcon, Segment, SegmentedSelector, Select, SelectFilter, ServiceToggle, ServiceToggleList, SettingsIcon, Sidenav, Spinner, StatusBadge, SummarySection, SupplierTypeToggle, Table, Tag, TeamCard, TeamContactsPanel, TeamEquipmentForm, TeamHeader, TeamImportForm, TeamManagementPage, TeamProgramForm, TeamRosterMemberForm, TeamScheduleActions, TeamScheduleCompactTable, TeamScheduleEditor, TeamScheduleExpandedTable, TeamSchedulePage, TeamSubMenu, TeamTravelCalendarCardView, TeamTravelCalendarListView, TeamTravelCalendarPage, TeamTravelCalendarToolbar, TeamTravelCalendarView, TeamUserAccessForm, Textarea, Timepicker, Title, Toggle, Tooltip, Topbar, TrashIcon, TravelServiceIcon, TravelSummaryMetrics, TravelerForm, TrendDownIcon, TrendUpIcon, TripDetailPage, TripSegment, TripTable, TypeIcon, UploadIcon, UserIcon, UsersIcon, WarningIcon, XIcon, formatCompactTripCost, formatTeamScheduleDueDate, formatTeamScheduleTravelDates, getTeamTravelCalendarPeriodLabel, isTravelDueDateCompleted, moveTeamTravelCalendarPeriod };
2730
- export type { AccordionProps, AccountInfo, AdministrationCard, AdministrationPageProps, AdministrationTab, AirSegmentProps, AlertProps, AlertVariant, AppLayoutProps, AvatarGroupProps, AvatarProps, AvatarSize, BadgeProps, BadgeSize, BadgeVariant, ButtonProps, ButtonSize, ButtonVariant, CalendarMetric, CalendarTypeSelectorProps, CalendarTypeValue, CalendarView, CalendarViewSelectorProps, CalendarViewValue, CardBodyProps, CardFooterProps, CardHeaderProps, CardPadding, CardProps, CardVariant, CharterManifestEquipment, CharterManifestPageProps, CharterManifestPassenger, CharterManifestSegment, CheckboxProps, ConfirmModalProps, Contact, ContactCardData, ContactInfo, ContactListProps, ContactPair, ContactUsData, ContactUsPageProps, DashboardPageProps, DatepickerProps, DatepickerSize, DrawerBodyProps, DrawerFooterProps, DrawerHeaderProps, DrawerPosition, DrawerProps, DrawerSize, DropdownAlignment, DropdownItemProps, DropdownProps, DueDatesDrawerProps, FilterChipProps, FilterOption, FlightData, FormFieldProps, FormRowProps, FormSectionProps, FormStackProps, GroundData, GroundSegmentProps, GroupTravelRequestContact, GroupTravelRequestFieldValue, GroupTravelRequestPageProps, GroupTravelRequestValues, GroupedTravelDueDates, HotelData, HotelSegmentProps, HubAppShellActions, HubAppShellProps, HubNavigationItem, IconName, IconProps, IndividualTravelPageProps, InfoCenterArticle, InfoCenterPageProps, InfoCenterPageState, InputProps, InputSize, ManifestCapacityStatsProps, ManifestSendState, ManifestView, ManifestViewToggleProps, MembershipProgram, MembershipProgramsProps, MetricProps, ModalFooterProps, ModalProps, ModalSize, ModuleProps, ModuleSize, NavItemProps, NavItemSize, NavItemVariant, NotFoundPageProps, PageBannersProps, PreferenceField, PreferenceSection, PreferencesPanelProps, ProgressBarProps, ProgressCircleProps, ProgressSize, ProgressVariant, RequestFormFooterProps, RequestFormHeaderProps, RequestFormLayoutProps, RequestSummaryProps, RosterProgramNumberId, RosterProgramNumberRow, RosterProgramNumbersPageProps, RosterReportOption, RosterReportsPageProps, RosterToolbarProps, ScheduleFilterOption, ScheduleMetric, SchoolContactFormProps, SearchFieldProps, SeasonOption, SegmentOption, SegmentProps, SegmentVariant, SegmentedSelectorOption, SegmentedSelectorProps, SelectFilterOption, SelectFilterProps, SelectOption, SelectOptionGroup, SelectProps, SelectSize, ServiceConfig, ServiceToggleListProps, ServiceToggleProps, SidenavItem, SidenavProps, SpinnerProps, SpinnerSize, StatusBadgeProps, StatusBadgeVariant, SummaryItem, SummarySectionConfig, SummarySegment, SupplierTypeToggleProps, SupplierTypeValue, SystemBanner, TabKey, TableColumn, TableProps, TagProps, TagSize, TagVariant, TeamCardProps, TeamContactId, TeamContactOption, TeamContactsLoadingState, TeamContactsPanelProps, TeamContactsValue, TeamEquipmentFormProps, TeamEquipmentValues, TeamFormMode, TeamHeaderProps, TeamImportFormProps, TeamImportKind, TeamManagementPageProps, TeamManagementTab, TeamNumericValue, TeamOption, TeamPortalUserOption, TeamProgramFormProps, TeamProgramType, TeamProgramValues, TeamRosterMemberFormProps, TeamRosterMemberValues, TeamScheduleActionsProps, TeamScheduleCompactRow, TeamScheduleCompactTableProps, TeamScheduleDueDate, TeamScheduleEditorEvent, TeamScheduleEditorProps, TeamScheduleEditorTrip, TeamScheduleExpandedRow, TeamScheduleExpandedTableProps, TeamScheduleHomeAway, TeamSchedulePageProps, TeamSubMenuProps, TeamSubMenuTab, TeamTravelCalendarCardViewProps, TeamTravelCalendarDueDate, TeamTravelCalendarDuration, TeamTravelCalendarEvent, TeamTravelCalendarItemType, TeamTravelCalendarListViewProps, TeamTravelCalendarPageProps, TeamTravelCalendarSportGroup, TeamTravelCalendarToolbarProps, TeamTravelCalendarTrip, TeamTravelCalendarViewProps, TeamUserAccessFormProps, TeamUserAccessValues, TextareaProps, TimepickerProps, TimepickerSize, TitleProps, TitleWeight, ToggleProps, ToggleSize, ToolbarAction, TooltipPosition, TooltipProps, TooltipVariant, TopbarProps, TravelAlertBanner, TravelDueDateItem, TravelServiceIconProps, TravelSummaryMetricsProps, TravelType, TravelerFormData, TravelerFormProps, TripData, TripDetailPageProps, TripSegmentProps, TripTableProps, TypeIconProps, VendorCode };
6501
+ export { ACMI_AIRCRAFT_OPTIONS, ACMI_CARRIER_OPTIONS, ACMI_INSURANCE_FLAT, Accordion, AcmiQuoteCalculator, AdministrationPage, AgentGroupTravelRequestsPage, AgentGroupTravelRequestsTable, AirSegment, Alert, AlertStyled, AppLayout, ArrowDownLeftIcon, ArrowUpRightIcon, Avatar, AvatarGroup, BID_TYPE_HEADINGS, Badge, BuildingIcon, BusIcon, Button, ButtonStyled, CARRIER_CATERING_OPTIONS, CARRIER_CONTACT_TYPES, CHAMPIONSHIP_BID_TYPES, CHAMPIONSHIP_HEADINGS, CHARTER_CONTACT_GROUPS, CHARTER_SECTIONS, CalendarIcon, CalendarTypeSelector, CalendarViewSelector, CarIcon, Card, CardBody, CardFooter, CardHeader, CarrierProfilePage, ChampionshipBidDetailPage, ChampionshipBidsPage, CharterBidResponsePage, CharterBidViewPage, CharterManifestPage, CharterSourcingEmailPreview, ChartersAccessManagementPage, ChartersHomePage, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CloseIcon, ConfirmModal, ContactCard, ContactList, ContactUsPage, CubeIcon, DOCUMENT_FILE_EXTENSIONS, DashboardIcon, DashboardPage, Datepicker, DetailList, DocumentIcon, DownloadIcon, Drawer, DrawerBody, DrawerFooter, DrawerHeader, Dropdown, DueDatesDrawer, EditIcon, EmptyState, EyeIcon, FeatureFlagManagementPage, FieldLayout, FileUploadButton, FilterChip, FilterIcon, FormField, FormRow, FormSection, FormStack, GridIcon, GridTable, GroundSegment, GroupTravelRequestPage, HUB_ADMIN_ITEM, HUB_AGENTS_ITEM, HUB_INDIVIDUAL_TRAVEL_ITEM, HUB_NAV_ITEMS, HUB_OFF_FLEET_ITEM, HUB_SOURCING_ITEM, HUB_STM_CHARTERS_ITEM, HeadsetIcon, HomeIcon, HotelIcon, HotelSegment, HubAppShell, Icons, IndividualTravelPage, IndividualTravelRequestDetailPage, IndividualTravelRequestFormPage, InfoCenterPage, InfoIcon, InfoTile, Input, ItineraryPage, ItinerarySegmentCard, ItineraryTimeline, LightbulbIcon, LimoIcon, LockIcon, LogoIcon, MailIcon, ManifestCapacityStats, ManifestViewToggle, MegaphoneIcon, MembershipPrograms, MenuIcon, Metric, MinusIcon, Modal, ModalFooter, Module, ModuleDivider, ModuleVerticalDivider, MultiUserSearch, NavItem, NotFoundPage, OFF_FLEET_LEARNED_DESCRIPTION, OFF_FLEET_LEARNED_EMPTY_COPY, OFF_FLEET_QUEUE_DESCRIPTION, OffFleetLearnedExamplesPage, OffFleetReviewQueuePage, OffFleetSubmissionDetailPage, PageBanners, PageHeader, Pagination, PhoneIcon, PlaneIcon, PlusIcon, PreferencesPanel, PrinterIcon, Progress, ProgressBar, ProgressCircle, QuoteCostBreakdown, QuoteReviewActions, REGULAR_SEASON_BID_TYPES, RailIcon, RefreshIcon, RegularSeasonBidsPage, RegularSeasonBidsTable, ReportIcon, RequestFormFooter, RequestFormHeader, RequestFormLayout, RequestSummary, RosterProgramNumbersPage, RosterReportsPage, RosterToolbar, SOURCING_COST_CATEGORIES, SOURCING_COST_CATEGORY_LABELS, SUPPLIER_TYPE_OPTIONS, SchoolContactForm, SearchField, SearchIcon, Segment, SegmentedSelector, Select, SelectFilter, ServiceToggle, ServiceToggleList, SettingsIcon, Sidenav, SourcingQuoteDetailPage, SourcingReviewQueuePage, SourcingReviewQueueTable, Spinner, StatusBadge, SummarySection, SupplierTypeToggle, TRIP_MONTH_OPTIONS, Table, Tag, TeamCalendarHeader, TeamCard, TeamContactsPanel, TeamEquipmentForm, TeamHeader, TeamImportForm, TeamManagementPage, TeamProgramForm, TeamRosterMemberForm, TeamScheduleActions, TeamScheduleCompactTable, TeamScheduleEditor, TeamScheduleExpandedTable, TeamSchedulePage, TeamSubMenu, TeamTravelCalendarCardView, TeamTravelCalendarListView, TeamTravelCalendarPage, TeamTravelCalendarToolbar, TeamTravelCalendarView, TeamUserAccessForm, Textarea, ThemeProvider, Timepicker, Title, Toggle, Tooltip, Topbar, TrashIcon, TravelServiceIcon, TravelSummaryMetrics, TravelerForm, TrendDownIcon, TrendUpIcon, TripDetailPage, TripSegment, TripTable, TypeIcon, UploadIcon, UserIcon, UsersIcon, WarningIcon, XIcon, absoluteFill, accentColors, alertTokens, boxShadow, brandColors, breakpoints, buildPaginationItems, buttonReset, computeLineItemTotal, computeQuoteTotals, computeTravelTypeCodes, css, darkTheme, lightTheme as defaultTheme, deriveProgramBidStatus, flexCenter, flexCol, flexRow, font, fontFamily, fontSize, fontWeight, formatCompactTripCost, formatItineraryDate, formatItineraryDateRange, formatItineraryMoney, formatTeamScheduleDueDate, formatTeamScheduleTravelDates, getCharterSourcingEmailRoute, getCharterSourcingEmailSubject, getPageCount, getSegmentDate, getSegmentStartMinutes, getSegmentTitle, getTeamTravelCalendarPeriodLabel, groupSegmentsByDay, isExpiringSoon, isProgramBiddable, isQuoteActionable, isTravelDueDateCompleted, isTravelDueDateOverdue, leading, lightTheme, lineClamp, lineHeight, matchesQuoteSearch, merge, moveTeamTravelCalendarPeriod, neutralColors, parseClockTime, parseItineraryDate, primaryColors, radius, rounded, semanticColors, shadow, size, space, spacing, srOnly, statusColors, styled, teamColors, textColors, toInlineStyle, trans, transition, truncate, useTheme, weight };
6502
+ export type { AccordionProps, AccountInfo, AcmiAircraftOption, AcmiLeg, AcmiPositioningMode, AcmiQuoteCalculatorProps, AcmiQuoteInputs, AcmiQuoteResult, AdministrationCard, AdministrationPageProps, AdministrationTab, AgentGroupTravelRequest, AgentGroupTravelRequestSportOption, AgentGroupTravelRequestViewOption, AgentGroupTravelRequestsPageProps, AirSegmentProps, AlertProps, AlertStyledProps, AlertVariant$1 as AlertVariant, AppLayoutProps, AvatarGroupProps, AvatarProps, AvatarSize, BadgeProps, BadgeSize, BadgeVariant, ButtonProps, ButtonSize$1 as ButtonSize, ButtonStyledProps, ButtonVariant$1 as ButtonVariant, CSSObject, CalendarMetric, CalendarTypeSelectorProps, CalendarTypeValue, CalendarView, CalendarViewSelectorProps, CalendarViewValue, CardBodyProps, CardFooterProps, CardHeaderProps, CardPadding, CardProps, CardVariant, CarrierAircraft, CarrierContact, CarrierProfilePageProps, CarrierProfilePreferences, CarrierProfileTab, ChampionshipBid, ChampionshipBidDetail, ChampionshipBidDetailPageProps, ChampionshipBidType, ChampionshipBidsPageProps, CharterBidLevel, CharterBidResponsePageProps, CharterBidSubmission, CharterBidTarget, CharterBidViewPageProps, CharterContact, CharterContactGroup, CharterFlightProgramBid, CharterManifestEquipment, CharterManifestPageProps, CharterManifestPassenger, CharterManifestSegment, CharterSectionCard, CharterSourcingEmailChange, CharterSourcingEmailChanges, CharterSourcingEmailLeg, CharterSourcingEmailPreviewProps, CharterSourcingEmailQuote, CharterSourcingEmailVariant, CharterSubmissionType, CharterSubmittedBid, CharterTripBid, CharterTripBidStatus, ChartersAccessId, ChartersAccessManagementPageProps, ChartersAccessMembership, ChartersAccessRole, ChartersAccountUser, ChartersHomePageProps, CheckboxProps, ConfirmModalProps, Contact, ContactCardData, ContactCardProps, ContactInfo, ContactListProps, ContactPair, ContactUsData, ContactUsPageProps, DashboardPageProps, DatepickerProps, DatepickerSize, DetailListItem, DetailListProps, DetailListVariant, DrawerBodyProps, DrawerFooterProps, DrawerHeaderProps, DrawerPosition, DrawerProps, DrawerSize, DropdownAlignment, DropdownItemProps, DropdownProps, DueDatesDrawerProps, EmptyStateProps, EmptyStateSize, FeatureFlagDefinition, FeatureFlagIdentifier, FeatureFlagManagementPageProps, FeatureFlagRule, FeatureFlagRuleDeactivateRequest, FeatureFlagRuleEditRequest, FeatureFlagRuleEffect, FeatureFlagRuleFormValue, FeatureFlagTargetOption, FeatureFlagTargetOptions, FeatureFlagTargetType, FieldLayoutProps, FieldLayoutRenderProps, FileUploadButtonProps, FilterChipProps, FilterOption, FlightData, FormFieldProps, FormRowProps, FormSectionProps, FormStackProps, GridCellRenderProps, GridColumn, GridRow, GridTableProps, GridTotalRow, GroundData, GroundSegmentProps, GroupTravelDueField, GroupTravelDueStatus, GroupTravelPnr, GroupTravelRequestContact, GroupTravelRequestFieldValue, GroupTravelRequestPageProps, GroupTravelRequestSource, GroupTravelRequestValues, GroupedTravelDueDates, HotelData, HotelSegmentProps, HubAppShellActions, HubAppShellProps, HubNavigationItem, IconName, IconProps, IndividualTravelExportRequest, IndividualTravelExportScope, IndividualTravelFilters, IndividualTravelPageProps, IndividualTravelPagination, IndividualTravelRequestAirLeg, IndividualTravelRequestAirRequest, IndividualTravelRequestAirTripType, IndividualTravelRequestAnswerValue, IndividualTravelRequestBusRequest, IndividualTravelRequestCarLeg, IndividualTravelRequestCarRequest, IndividualTravelRequestCurrentTraveler, IndividualTravelRequestDetail, IndividualTravelRequestDetailPageProps, IndividualTravelRequestFormConfiguration, IndividualTravelRequestFormPageProps, IndividualTravelRequestHotelLeg, IndividualTravelRequestHotelRequest, IndividualTravelRequestLabeledAnswer, IndividualTravelRequestOption, IndividualTravelRequestQuestion, IndividualTravelRequestQuestionType, IndividualTravelRequestService, IndividualTravelRequestSubmitter, IndividualTravelRequestTraveler, IndividualTravelRequestTravelerType, IndividualTravelRequestValues, IndividualTravelTabCounts, InfoCenterArticle, InfoCenterPageProps, InfoCenterPageState, InfoTileEdge, InfoTileProps, InputProps, InputSize, ItineraryAgent, ItineraryAirSegment, ItineraryCarSegment, ItineraryDay, ItineraryHotelSegment, ItineraryPageProps, ItinerarySegment, ItinerarySegmentCardProps, ItinerarySegmentStatus, ItineraryTimelineProps, ManifestCapacityStatsProps, ManifestSendState, ManifestView, ManifestViewToggleProps, MembershipProgram, MembershipProgramsProps, MetricProps, ModalFooterProps, ModalProps, ModalSize, ModuleProps, ModuleSize, MultiUserSearchOption, MultiUserSearchProps, NavItemProps, NavItemSize, NavItemVariant, NotFoundPageProps, OffFleetLearnedExample, OffFleetLearnedExamplesPageProps, OffFleetLeg, OffFleetLegDiagnostic, OffFleetLegMatch, OffFleetPreflightCheck, OffFleetPreflightRow, OffFleetPriceBasis, OffFleetQuoteHeader, OffFleetReviewQueuePageProps, OffFleetSubmission, OffFleetSubmissionDetailPageProps, OffFleetSubmissionStatus, OffFleetTripGrouping, OffFleetTripSegment, PageBannersProps, PageHeaderProps, PaginationItem, PaginationProps, PreferenceField, PreferenceSection, PreferencesPanelProps, ProgressBarProps, ProgressCircleProps, ProgressSize, ProgressVariant, QuoteCostBreakdownProps, QuoteCostTotals, QuoteFieldChange, QuoteReviewActionsProps, RegularSeasonBidType, RegularSeasonBidsPageProps, RegularSeasonBidsTableProps, RequestFormFooterProps, RequestFormHeaderProps, RequestFormLayoutProps, RequestSummaryProps, RosterProgramNumberId, RosterProgramNumberRow, RosterProgramNumbersPageProps, RosterReportOption, RosterReportsPageProps, RosterToolbarProps, ScheduleFilterOption, ScheduleMetric, SchoolContactFormProps, SearchFieldProps, SeasonOption, SegmentOption, SegmentProps, SegmentVariant, SegmentedSelectorOption, SegmentedSelectorProps, SelectFilterOption, SelectFilterProps, SelectOption, SelectOptionGroup, SelectProps, SelectSize, ServiceConfig, ServiceToggleListProps, ServiceToggleProps, SidenavItem, SidenavProps, SourcingCostAdjustment, SourcingCostCategory, SourcingCostLineItem, SourcingQuote, SourcingQuoteDetailPageProps, SourcingQuoteDraft, SourcingQuoteLeg, SourcingQuoteLegType, SourcingQuoteStatus, SourcingReviewQueuePageProps, SourcingReviewQueueTableProps, SpinnerProps, SpinnerSize, StatusBadgeProps, StatusBadgeVariant, StyleFunction, SummaryItem, SummarySectionConfig, SummarySegment, SupplierTypeToggleProps, SupplierTypeValue, SystemBanner, TabKey, TableColumn, TableProps, TableRowKey, TagProps, TagSize, TagVariant, TeamCalendarHeaderProps, TeamCardProps, TeamContactId, TeamContactOption, TeamContactsLoadingState, TeamContactsPanelProps, TeamContactsValue, TeamEquipmentFormProps, TeamEquipmentValues, TeamFormMode, TeamHeaderProps, TeamImportFormProps, TeamImportKind, TeamManagementPageProps, TeamManagementTab, TeamNumericValue, TeamOption, TeamPortalUserOption, TeamProgramFormProps, TeamProgramType, TeamProgramValues, TeamRosterMemberFormProps, TeamRosterMemberValues, TeamScheduleActionsProps, TeamScheduleCompactEvent, TeamScheduleCompactRow, TeamScheduleCompactTableProps, TeamScheduleCompactTrip, TeamScheduleDueDate, TeamScheduleEditorEvent, TeamScheduleEditorProps, TeamScheduleEditorTrip, TeamScheduleExpandedRow, TeamScheduleExpandedTableProps, TeamScheduleHomeAway, TeamSchedulePageProps, TeamSubMenuProps, TeamSubMenuTab, TeamTravelCalendarCardViewProps, TeamTravelCalendarDueDate, TeamTravelCalendarDuration, TeamTravelCalendarEvent, TeamTravelCalendarItemType, TeamTravelCalendarListViewProps, TeamTravelCalendarPageProps, TeamTravelCalendarSportGroup, TeamTravelCalendarToolbarProps, TeamTravelCalendarTrip, TeamTravelCalendarViewProps, TeamUserAccessFormProps, TeamUserAccessValues, TextareaProps, Theme, ThemeBreakpoint, ThemeColors, ThemeContextValue, ThemeMode, ThemeProviderProps, ThemeRadius, ThemeShadow, ThemeSpacing, ThemeTransition, ThemeTypography, TimepickerProps, TimepickerSize, TitleProps, TitleWeight, ToggleProps, ToggleSize, ToolbarAction, TooltipPosition, TooltipProps, TooltipVariant, TopbarProps, TravelAlertBanner, TravelDueDateItem, TravelServiceIconProps, TravelSummaryMetricsProps, TravelType, TravelerFormData, TravelerFormProps, TripData, TripDetailPageProps, TripSegmentProps, TripTableProps, TypeIconProps, VendorCode };