@admin-layout/ai-chat-ext-browser 12.2.5-alpha.2 → 12.2.5-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/lib/components/MessageWidgets/MessageFlights.d.ts +27 -4
  2. package/lib/components/MessageWidgets/MessageFlights.d.ts.map +1 -1
  3. package/lib/components/MessageWidgets/MessageFlights.js +200 -65
  4. package/lib/components/MessageWidgets/MessageFlights.js.map +1 -1
  5. package/lib/components/MessageWidgets/MessageMedia.d.ts.map +1 -1
  6. package/lib/components/MessageWidgets/MessageMedia.js +4 -4
  7. package/lib/components/MessageWidgets/MessageMedia.js.map +1 -1
  8. package/lib/components/MessageWidgets/MessageResults.d.ts +54 -0
  9. package/lib/components/MessageWidgets/MessageResults.d.ts.map +1 -0
  10. package/lib/components/MessageWidgets/MessageResults.js +163 -0
  11. package/lib/components/MessageWidgets/MessageResults.js.map +1 -0
  12. package/lib/components/MessageWidgets/MessageTravel.d.ts +2 -0
  13. package/lib/components/MessageWidgets/MessageTravel.d.ts.map +1 -1
  14. package/lib/components/MessageWidgets/MessageTravel.js +15 -3
  15. package/lib/components/MessageWidgets/MessageTravel.js.map +1 -1
  16. package/lib/components/MessageWidgets/ResultCards.d.ts +19 -0
  17. package/lib/components/MessageWidgets/ResultCards.d.ts.map +1 -0
  18. package/lib/components/MessageWidgets/ResultCards.js +543 -0
  19. package/lib/components/MessageWidgets/ResultCards.js.map +1 -0
  20. package/lib/components/MessageWidgets/ResultRow.d.ts +57 -0
  21. package/lib/components/MessageWidgets/ResultRow.d.ts.map +1 -0
  22. package/lib/components/MessageWidgets/ResultRow.js +216 -0
  23. package/lib/components/MessageWidgets/ResultRow.js.map +1 -0
  24. package/lib/components/MessageWidgets/index.d.ts +6 -2
  25. package/lib/components/MessageWidgets/index.d.ts.map +1 -1
  26. package/lib/components/MessageWidgets/mediaUtils.d.ts.map +1 -1
  27. package/lib/components/MessageWidgets/mediaUtils.js +3 -10
  28. package/lib/components/MessageWidgets/mediaUtils.js.map +1 -1
  29. package/lib/components/index.d.ts +1 -1
  30. package/lib/components/index.d.ts.map +1 -1
  31. package/lib/index.d.ts +6 -2
  32. package/lib/index.d.ts.map +1 -1
  33. package/lib/index.js +1 -1
  34. package/lib/module.d.ts.map +1 -1
  35. package/lib/module.js +13 -1
  36. package/lib/module.js.map +1 -1
  37. package/lib/slot-fill/chat-settings-fill.js +1 -1
  38. package/lib/slot-fill/chat-settings-fill.js.map +1 -1
  39. package/lib/slot-fill/index.d.ts +4 -0
  40. package/lib/slot-fill/index.d.ts.map +1 -1
  41. package/lib/slot-fill/message-ai-assistant-fill.js +1 -1
  42. package/lib/slot-fill/message-ai-assistant-fill.js.map +1 -1
  43. package/lib/slot-fill/message-codeblock-fill.js +1 -1
  44. package/lib/slot-fill/message-codeblock-fill.js.map +1 -1
  45. package/lib/slot-fill/message-connector-fill.js +1 -1
  46. package/lib/slot-fill/message-connector-fill.js.map +1 -1
  47. package/lib/slot-fill/message-generic-fill.js +1 -1
  48. package/lib/slot-fill/message-generic-fill.js.map +1 -1
  49. package/lib/slot-fill/message-jobs-fill.d.ts +4 -0
  50. package/lib/slot-fill/message-jobs-fill.d.ts.map +1 -0
  51. package/lib/slot-fill/message-jobs-fill.js +6 -0
  52. package/lib/slot-fill/message-jobs-fill.js.map +1 -0
  53. package/lib/slot-fill/message-media-fill.js +1 -1
  54. package/lib/slot-fill/message-media-fill.js.map +1 -1
  55. package/lib/slot-fill/message-movies-fill.d.ts +4 -0
  56. package/lib/slot-fill/message-movies-fill.d.ts.map +1 -0
  57. package/lib/slot-fill/message-movies-fill.js +6 -0
  58. package/lib/slot-fill/message-movies-fill.js.map +1 -0
  59. package/lib/slot-fill/message-resume-fill.d.ts +4 -0
  60. package/lib/slot-fill/message-resume-fill.d.ts.map +1 -0
  61. package/lib/slot-fill/message-resume-fill.js +6 -0
  62. package/lib/slot-fill/message-resume-fill.js.map +1 -0
  63. package/lib/slot-fill/message-service-fill.js +1 -1
  64. package/lib/slot-fill/message-service-fill.js.map +1 -1
  65. package/lib/slot-fill/message-shopping-fill.d.ts +4 -0
  66. package/lib/slot-fill/message-shopping-fill.d.ts.map +1 -0
  67. package/lib/slot-fill/message-shopping-fill.js +6 -0
  68. package/lib/slot-fill/message-shopping-fill.js.map +1 -0
  69. package/lib/slot-fill/message-thinking-fill.js +1 -1
  70. package/lib/slot-fill/message-thinking-fill.js.map +1 -1
  71. package/lib/slot-fill/message-tooluse-fill.js +1 -1
  72. package/lib/slot-fill/message-tooluse-fill.js.map +1 -1
  73. package/lib/slot-fill/message-travel-fill.js +1 -1
  74. package/lib/slot-fill/message-travel-fill.js.map +1 -1
  75. package/lib/slot-fill/message-workflow-fill.js +1 -1
  76. package/lib/slot-fill/message-workflow-fill.js.map +1 -1
  77. package/lib/utils/mediaAttachment.d.ts +46 -0
  78. package/lib/utils/mediaAttachment.d.ts.map +1 -0
  79. package/lib/utils/mediaAttachment.js +135 -0
  80. package/lib/utils/mediaAttachment.js.map +1 -0
  81. package/lib/utils/parseWidgetPost.d.ts.map +1 -1
  82. package/lib/utils/parseWidgetPost.js +20 -10
  83. package/lib/utils/parseWidgetPost.js.map +1 -1
  84. package/package.json +3 -3
  85. package/lib/utils/parseWidgetPost.spec.d.ts +0 -2
  86. package/lib/utils/parseWidgetPost.spec.d.ts.map +0 -1
@@ -1,24 +1,47 @@
1
1
  import React from 'react';
2
2
  import { IPost } from 'common';
3
3
  import { TravelAttachmentsInterface } from '../../interfaces';
4
+ import { FlightCardView, FlightSliceView, FlightSort } from '@admin-layout/client';
4
5
  export interface IMessageFlightsProps {
5
6
  message: IPost;
6
7
  attachment: TravelAttachmentsInterface;
7
8
  /** Opens the full result set in the travel side panel. */
8
9
  onMessageClick?: (ref: IPost) => void;
9
10
  }
11
+ /** Soft monogram tile colours, indexed by `airlineTone`; shared by every result card. */
12
+ export declare const TONES: string[];
13
+ /**
14
+ * The route between the two times: duration above, a line with one amber dot
15
+ * per stop and the plane at the arrival end, stops below.
16
+ */
17
+ export declare const RouteLine: ({ slice }: {
18
+ slice: FlightSliceView;
19
+ }) => React.JSX.Element;
20
+ export interface IFlightCardProps {
21
+ card: FlightCardView;
22
+ onOpen?: () => void;
23
+ fullWidth?: boolean;
24
+ /** Show the departure date on the card (offers on different dates, or a round trip). */
25
+ showDate?: boolean;
26
+ /** Briefly outlined, e.g. after a quick-pick chip jumped to it. */
27
+ highlighted?: boolean;
28
+ }
29
+ export declare const FlightCard: ({ card, onOpen, fullWidth, showDate, highlighted, }: IFlightCardProps) => React.JSX.Element;
10
30
  export interface IFlightCardListProps {
11
31
  attachment: TravelAttachmentsInterface;
12
32
  /** Fired by a card with no seller link; omit it to render such cards as plain content. */
13
33
  onOpen?: () => void;
34
+ /** Ordering; `recommended` (default) keeps the agent's order. */
35
+ sort?: FlightSort;
14
36
  }
15
37
  /** Every flight as a full-width vertical list, for a side panel or a results page. */
16
- export declare const FlightCardList: ({ attachment, onOpen }: IFlightCardListProps) => React.JSX.Element;
38
+ export declare const FlightCardList: ({ attachment, onOpen, sort }: IFlightCardListProps) => React.JSX.Element;
17
39
  /**
18
40
  * Flight results as a swipeable row of cards: one card per offer, the next
19
- * one peeking in so the row reads as scrollable. Touch swipes and snaps; a
20
- * pointer gets arrow buttons, since sideways scrolling is awkward with a
21
- * mouse.
41
+ * one peeking in so the row reads as scrollable. Above it, the route and date
42
+ * once, and quick picks (cheapest, fastest, best value) that jump to their
43
+ * card. Touch swipes and snaps; a pointer gets arrow buttons, since sideways
44
+ * scrolling is awkward with a mouse.
22
45
  */
23
46
  export declare const MessageFlights: ({ message, attachment, onMessageClick }: IMessageFlightsProps) => React.JSX.Element;
24
47
  //# sourceMappingURL=MessageFlights.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageFlights.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageFlights.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAIxE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAG9D,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,UAAU,EAAE,0BAA0B,CAAC;IACvC,0DAA0D;IAC1D,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AA2HD,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,0BAA0B,CAAC;IACvC,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,sFAAsF;AACtF,eAAO,MAAM,cAAc,GAAI,wBAAwB,oBAAoB,sBAY1E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,yCAAyC,oBAAoB,sBAoF3F,CAAC"}
1
+ {"version":3,"file":"MessageFlights.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageFlights.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAKjF,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAEH,cAAc,EACd,eAAe,EACf,UAAU,EAIb,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,UAAU,EAAE,0BAA0B,CAAC;IACvC,0DAA0D;IAC1D,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAED,yFAAyF;AACzF,eAAO,MAAM,KAAK,UASjB,CAAC;AA4BF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,WAAW;IAAE,KAAK,EAAE,eAAe,CAAA;CAAE,sBAiC9D,CAAC;AAwCF,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,UAAU,GAAI,qDAMxB,gBAAgB,sBAmHlB,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,0BAA0B,CAAC;IACvC,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,sFAAsF;AACtF,eAAO,MAAM,cAAc,GAAI,8BAA8C,oBAAoB,sBAchG,CAAC;AAIF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,yCAAyC,oBAAoB,sBA8J3F,CAAC"}
@@ -1,62 +1,134 @@
1
- import React,{useRef,useState,useCallback,useEffect}from'react';import {FaPlane}from'@react-icons/all-files/fa/FaPlane.js';import {FiChevronLeft}from'@react-icons/all-files/fi/FiChevronLeft.js';import {FiChevronRight}from'@react-icons/all-files/fi/FiChevronRight.js';import {toFlightCards}from'@admin-layout/client';const SliceRow = ({
1
+ import React,{useMemo,useRef,useState,useCallback,useEffect}from'react';import {FaPlane}from'@react-icons/all-files/fa/FaPlane.js';import {FiChevronLeft}from'@react-icons/all-files/fi/FiChevronLeft.js';import {FiChevronRight}from'@react-icons/all-files/fi/FiChevronRight.js';import {FiExternalLink}from'@react-icons/all-files/fi/FiExternalLink.js';import {toFlightCards,flightResultSummary,sortFlightCards}from'@admin-layout/client';/** Soft monogram tile colours, indexed by `airlineTone`; shared by every result card. */
2
+ const TONES = ['bg-sky-100 text-sky-700 dark:bg-sky-500/20 dark:text-sky-300', 'bg-violet-100 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300', 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300', 'bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300', 'bg-rose-100 text-rose-700 dark:bg-rose-500/20 dark:text-rose-300', 'bg-indigo-100 text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-300', 'bg-teal-100 text-teal-700 dark:bg-teal-500/20 dark:text-teal-300', 'bg-orange-100 text-orange-700 dark:bg-orange-500/20 dark:text-orange-300'];
3
+ const BADGE = {
4
+ cheapest: {
5
+ label: 'Cheapest',
6
+ pill: 'bg-emerald-50 text-emerald-700 ring-emerald-200 dark:bg-emerald-500/15 dark:text-emerald-300 dark:ring-emerald-500/30',
7
+ text: 'text-emerald-600 dark:text-emerald-400'
8
+ },
9
+ fastest: {
10
+ label: 'Fastest',
11
+ pill: 'bg-violet-50 text-violet-700 ring-violet-200 dark:bg-violet-500/15 dark:text-violet-300 dark:ring-violet-500/30',
12
+ text: 'text-violet-600 dark:text-violet-400'
13
+ },
14
+ best: {
15
+ label: 'Best value',
16
+ pill: 'bg-blue-50 text-blue-700 ring-blue-200 dark:bg-blue-500/15 dark:text-blue-300 dark:ring-blue-500/30',
17
+ text: 'text-blue-600 dark:text-blue-400'
18
+ }
19
+ };
20
+ const BadgePill = ({
21
+ badge
22
+ }) => React.createElement("span", {
23
+ className: `inline-flex shrink-0 items-center rounded-full px-2 py-0.5 text-[11px] font-semibold leading-4 ring-1 ring-inset ${BADGE[badge].pill}`
24
+ }, BADGE[badge].label);
25
+ /**
26
+ * The route between the two times: duration above, a line with one amber dot
27
+ * per stop and the plane at the arrival end, stops below.
28
+ */
29
+ const RouteLine = ({
2
30
  slice
3
31
  }) => {
32
+ const stops = slice.stopCount ?? 0;
4
33
  return React.createElement("div", {
5
- className: "grid grid-cols-[auto_1fr_auto] items-center gap-3"
6
- }, React.createElement("div", null, React.createElement("p", {
7
- className: "text-2xl font-bold leading-none tracking-tight tabular-nums text-gray-900 dark:text-gray-50"
8
- }, slice.departTime ?? '--:--'), React.createElement("p", {
9
- className: "mt-1.5 text-sm text-gray-500 dark:text-gray-400"
10
- }, slice.origin)), React.createElement("div", {
11
- className: "flex min-w-0 flex-col items-center",
34
+ className: "flex min-w-0 flex-col items-center self-center px-1",
12
35
  "aria-hidden": "true"
13
- }, React.createElement("div", {
14
- className: "flex w-full items-center gap-1.5"
36
+ }, React.createElement("p", {
37
+ className: "text-[11px] font-medium leading-4 text-gray-500 dark:text-gray-400"
38
+ }, slice.duration ?? ' '), React.createElement("div", {
39
+ className: "my-1 flex w-full items-center"
15
40
  }, React.createElement("span", {
16
- className: "h-px flex-1 border-t border-dashed border-gray-300 dark:border-gray-600"
17
- }), React.createElement(FaPlane, {
18
- className: "h-3.5 w-3.5 shrink-0 text-blue-500"
41
+ className: "h-1.5 w-1.5 shrink-0 rounded-full border border-gray-400 bg-white dark:border-gray-500 dark:bg-gray-800"
19
42
  }), React.createElement("span", {
20
- className: "h-px flex-1 border-t border-dashed border-gray-300 dark:border-gray-600"
21
- })), slice.meta ? React.createElement("p", {
22
- className: "mt-1 truncate text-[11px] leading-tight text-gray-400 dark:text-gray-500"
23
- }, slice.meta) : null), React.createElement("div", {
24
- className: "text-right"
25
- }, React.createElement("p", {
26
- className: "text-2xl font-bold leading-none tracking-tight tabular-nums text-gray-900 dark:text-gray-50"
27
- }, slice.arriveTime ?? '--:--', slice.dayOffset ? React.createElement("sup", {
28
- className: "ml-0.5 text-[11px] font-semibold text-amber-600 dark:text-amber-400"
29
- }, slice.dayOffset) : null), React.createElement("p", {
30
- className: "mt-1.5 text-sm text-gray-500 dark:text-gray-400"
31
- }, slice.destination)));
43
+ className: "relative h-px flex-1 bg-gray-300 dark:bg-gray-600"
44
+ }, Array.from({
45
+ length: stops
46
+ }, (_, i) => React.createElement("span", {
47
+ key: i,
48
+ className: "absolute top-1/2 h-1.5 w-1.5 -translate-x-1/2 -translate-y-1/2 rounded-full bg-amber-400 ring-2 ring-white dark:ring-gray-800",
49
+ style: {
50
+ left: `${(i + 1) / (stops + 1) * 100}%`
51
+ }
52
+ }))), React.createElement(FaPlane, {
53
+ className: "ml-0.5 h-3 w-3 shrink-0 text-blue-500 dark:text-blue-400"
54
+ })), React.createElement("p", {
55
+ className: `text-[11px] font-medium leading-4 ${stops === 0 && slice.stops ? 'text-emerald-600 dark:text-emerald-400' : stops > 0 ? 'text-amber-600 dark:text-amber-400' : 'text-gray-400'}`
56
+ }, slice.stops ?? ' '));
32
57
  };
33
- const CARD_CLASS = 'group/card flex flex-col rounded-2xl border border-gray-200 bg-white p-4 text-left shadow-sm transition ' + 'hover:border-blue-300 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 ' + 'dark:border-gray-700 dark:bg-gray-800 dark:hover:border-blue-500/60';
34
- const IN_ROW = 'w-[min(19rem,85%)] shrink-0 snap-start';
58
+ const SliceRow = ({
59
+ slice,
60
+ caption
61
+ }) => React.createElement("div", null, caption ? React.createElement("p", {
62
+ className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500"
63
+ }, caption) : null, React.createElement("div", {
64
+ className: "grid grid-cols-[auto_1fr_auto] items-center gap-2"
65
+ }, React.createElement("div", null, React.createElement("p", {
66
+ className: "text-[22px] font-bold leading-none tracking-tight tabular-nums text-gray-900 dark:text-gray-50"
67
+ }, slice.departTime ?? '--:--'), React.createElement("p", {
68
+ className: "mt-1.5 text-xs font-medium text-gray-500 dark:text-gray-400"
69
+ }, slice.origin)), React.createElement(RouteLine, {
70
+ slice: slice
71
+ }), React.createElement("div", {
72
+ className: "text-right"
73
+ }, React.createElement("p", {
74
+ className: "text-[22px] font-bold leading-none tracking-tight tabular-nums text-gray-900 dark:text-gray-50"
75
+ }, slice.arriveTime ?? '--:--', slice.dayOffset ? React.createElement("sup", {
76
+ className: "ml-0.5 text-[11px] font-semibold text-amber-600 dark:text-amber-400"
77
+ }, slice.dayOffset) : null), React.createElement("p", {
78
+ className: "mt-1.5 text-xs font-medium text-gray-500 dark:text-gray-400"
79
+ }, slice.destination))));
80
+ const CARD_CLASS = 'group/card relative flex flex-col rounded-2xl border bg-white p-4 text-left shadow-sm transition-all duration-200 ' + 'hover:-translate-y-0.5 hover:border-blue-300 hover:shadow-lg hover:shadow-blue-500/10 ' + 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 ' + 'dark:bg-gray-800 dark:hover:border-blue-500/60 dark:hover:shadow-black/30 dark:focus-visible:ring-offset-gray-900';
81
+ const IN_ROW = 'w-[min(20rem,85%)] shrink-0 snap-start';
35
82
  const FlightCard = ({
36
83
  card,
37
84
  onOpen,
38
- fullWidth = false
85
+ fullWidth = false,
86
+ showDate = false,
87
+ highlighted = false
39
88
  }) => {
40
- const className = `${CARD_CLASS} ${fullWidth ? 'w-full' : IN_ROW}`;
89
+ const className = `${CARD_CLASS} ${fullWidth ? 'w-full' : IN_ROW} ${highlighted ? 'border-blue-400 ring-2 ring-blue-500/40 dark:border-blue-400' : 'border-gray-200 dark:border-gray-700'}`;
90
+ const subtitle = [card.flightNumber, card.cabin].filter(Boolean).join(' · ') || (card.roundTrip ? 'Round trip' : 'One way');
91
+ const captionFor = (s, i) => {
92
+ if (card.roundTrip) return [i === 0 ? 'Outbound' : 'Return', s.date].filter(Boolean).join(' · ');
93
+ return showDate ? s.date : undefined;
94
+ };
41
95
  const body = React.createElement(React.Fragment, null, React.createElement("div", {
42
- className: "flex items-center gap-2"
43
- }, card.sellerInitial ? React.createElement("span", {
96
+ className: "flex items-center gap-2.5"
97
+ }, React.createElement("span", {
44
98
  "aria-hidden": "true",
45
- className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-md bg-blue-500 text-[11px] font-bold text-white"
46
- }, card.sellerInitial) : null, React.createElement("p", {
47
- className: "truncate text-sm text-gray-500 dark:text-gray-400"
48
- }, card.header)), React.createElement("div", {
49
- className: "mb-4 mt-4 space-y-4"
99
+ className: `flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-[11px] font-bold tracking-wide ${TONES[card.airlineTone % TONES.length]}`
100
+ }, card.airlineCode), React.createElement("div", {
101
+ className: "min-w-0 flex-1"
102
+ }, React.createElement("p", {
103
+ className: "truncate text-sm font-semibold leading-5 text-gray-900 dark:text-gray-50"
104
+ }, card.airline ?? card.footer), React.createElement("p", {
105
+ className: "truncate text-xs leading-4 text-gray-500 dark:text-gray-400"
106
+ }, subtitle)), card.badges[0] ? React.createElement(BadgePill, {
107
+ badge: card.badges[0]
108
+ }) : null), React.createElement("div", {
109
+ className: "my-4 space-y-4"
50
110
  }, card.slices.map((s, i) => React.createElement(SliceRow, {
51
111
  key: i,
52
- slice: s
53
- }))), React.createElement("div", {
112
+ slice: s,
113
+ caption: captionFor(s, i)
114
+ }))), card.fareLine ? React.createElement("p", {
115
+ className: "-mt-1 mb-3 line-clamp-2 text-[11px] leading-4 text-gray-500 dark:text-gray-400",
116
+ "data-fare-line": ""
117
+ }, card.fareLine.split(' · ').map((part, i, parts) => React.createElement("span", {
118
+ key: i
119
+ }, React.createElement("span", {
120
+ className: "whitespace-nowrap"
121
+ }, part, i < parts.length - 1 ? ' ·' : ''), i < parts.length - 1 ? ' ' : ''))) : null, React.createElement("div", {
54
122
  className: "mt-auto flex items-center justify-between gap-3 border-t border-gray-100 pt-3 dark:border-gray-700"
55
123
  }, React.createElement("p", {
56
- className: "min-w-0 truncate text-sm text-gray-600 dark:text-gray-300"
57
- }, card.footer), card.price ? React.createElement("p", {
58
- className: "shrink-0 text-lg font-bold tabular-nums text-blue-600 dark:text-blue-400"
59
- }, card.price) : null));
124
+ className: "min-w-0 truncate text-xs text-gray-500 dark:text-gray-400"
125
+ }, card.seller ? `via ${card.seller}` : card.roundTrip ? 'Round trip' : card.slices[0].stops ?? ''), React.createElement("span", {
126
+ className: "flex shrink-0 items-center gap-1.5"
127
+ }, card.price ? React.createElement("span", {
128
+ className: "text-lg font-bold leading-none tabular-nums text-gray-900 dark:text-white"
129
+ }, card.price) : null, card.url ? React.createElement(FiExternalLink, {
130
+ className: "h-3.5 w-3.5 text-gray-400 transition-colors group-hover/card:text-blue-500"
131
+ }) : null)));
60
132
  // A bookable offer goes straight to the seller; without a link the card
61
133
  // opens the full results in the side panel instead.
62
134
  if (card.url) {
@@ -66,7 +138,8 @@ const FlightCard = ({
66
138
  rel: "noopener noreferrer",
67
139
  "aria-label": card.accessibleLabel,
68
140
  className: className,
69
- "data-flight-card": ""
141
+ "data-flight-card": "",
142
+ "data-flight-key": card.key
70
143
  }, body);
71
144
  }
72
145
  if (!onOpen) {
@@ -75,7 +148,8 @@ const FlightCard = ({
75
148
  role: "group",
76
149
  "aria-label": card.accessibleLabel,
77
150
  className: className,
78
- "data-flight-card": ""
151
+ "data-flight-card": "",
152
+ "data-flight-key": card.key
79
153
  }, body);
80
154
  }
81
155
  return React.createElement("button", {
@@ -83,44 +157,53 @@ const FlightCard = ({
83
157
  onClick: onOpen,
84
158
  "aria-label": card.accessibleLabel,
85
159
  className: className,
86
- "data-flight-card": ""
160
+ "data-flight-card": "",
161
+ "data-flight-key": card.key
87
162
  }, body);
88
163
  };
89
164
  /** Every flight as a full-width vertical list, for a side panel or a results page. */
90
165
  const FlightCardList = ({
91
166
  attachment,
92
- onOpen
167
+ onOpen,
168
+ sort = 'recommended'
93
169
  }) => {
94
- const cards = toFlightCards(attachment);
170
+ const cards = useMemo(() => toFlightCards(attachment), [attachment]);
171
+ const summary = useMemo(() => flightResultSummary(attachment, cards), [attachment, cards]);
172
+ const ordered = useMemo(() => sortFlightCards(cards, sort), [cards, sort]);
95
173
  if (cards.length === 0) return null;
96
174
  return React.createElement("ul", {
97
175
  className: "space-y-3",
98
176
  "aria-label": attachment.title || 'Flight options'
99
- }, cards.map(c => React.createElement("li", {
177
+ }, ordered.map(c => React.createElement("li", {
100
178
  key: c.key
101
179
  }, React.createElement(FlightCard, {
102
180
  card: c,
103
181
  onOpen: onOpen,
104
- fullWidth: true
182
+ fullWidth: true,
183
+ showDate: !summary.sameDate
105
184
  }))));
106
185
  };
186
+ const HIGHLIGHT_MS = 1600;
107
187
  /**
108
188
  * Flight results as a swipeable row of cards: one card per offer, the next
109
- * one peeking in so the row reads as scrollable. Touch swipes and snaps; a
110
- * pointer gets arrow buttons, since sideways scrolling is awkward with a
111
- * mouse.
189
+ * one peeking in so the row reads as scrollable. Above it, the route and date
190
+ * once, and quick picks (cheapest, fastest, best value) that jump to their
191
+ * card. Touch swipes and snaps; a pointer gets arrow buttons, since sideways
192
+ * scrolling is awkward with a mouse.
112
193
  */
113
194
  const MessageFlights = ({
114
195
  message,
115
196
  attachment,
116
197
  onMessageClick
117
198
  }) => {
118
- const cards = toFlightCards(attachment);
199
+ const cards = useMemo(() => toFlightCards(attachment), [attachment]);
200
+ const summary = useMemo(() => flightResultSummary(attachment, cards), [attachment, cards]);
119
201
  const rowRef = useRef(null);
120
202
  const [edges, setEdges] = useState({
121
203
  atStart: true,
122
204
  atEnd: true
123
205
  });
206
+ const [highlighted, setHighlighted] = useState(null);
124
207
  const measure = useCallback(() => {
125
208
  const el = rowRef.current;
126
209
  if (!el) return;
@@ -137,6 +220,11 @@ const MessageFlights = ({
137
220
  ro.observe(el);
138
221
  return () => ro.disconnect();
139
222
  }, [measure, cards.length]);
223
+ useEffect(() => {
224
+ if (!highlighted) return undefined;
225
+ const t = setTimeout(() => setHighlighted(null), HIGHLIGHT_MS);
226
+ return () => clearTimeout(t);
227
+ }, [highlighted]);
140
228
  if (cards.length === 0) return null;
141
229
  const step = dir => {
142
230
  const el = rowRef.current;
@@ -147,15 +235,66 @@ const MessageFlights = ({
147
235
  behavior: 'smooth'
148
236
  });
149
237
  };
238
+ const jumpTo = key => {
239
+ const el = rowRef.current;
240
+ const card = el?.querySelector(`[data-flight-key="${CSS.escape(key)}"]`);
241
+ if (!el || !card) return;
242
+ // 8px: the row's px-2, so the card lands where the first one sits.
243
+ el.scrollTo({
244
+ left: card.offsetLeft - 8,
245
+ behavior: 'smooth'
246
+ });
247
+ setHighlighted(key);
248
+ };
150
249
  const open = () => onMessageClick?.(message);
151
- const count = attachment.totalCount ?? attachment.properties.length;
152
- const arrow = 'absolute top-1/2 z-10 hidden h-9 w-9 -translate-y-1/2 items-center justify-center rounded-full border border-gray-200 bg-white/95 text-gray-700 shadow-md transition hover:bg-white ' + 'disabled:pointer-events-none disabled:opacity-0 [@media(pointer:fine)]:flex dark:border-gray-600 dark:bg-gray-800/95 dark:text-gray-200';
250
+ const count = summary.count;
251
+ const title = summary.route ?? attachment.title ?? 'Flights';
252
+ const subtitle = [summary.date, `${count} ${count === 1 ? 'flight' : 'flights'}`, summary.fromPrice ? `from ${summary.fromPrice}` : undefined, summary.seller].filter(Boolean).join(' · ');
253
+ const picks = cards.length > 2 ? summary.picks : [];
254
+ // Arrows sit over the first and last visible card, so they show on hover or
255
+ // keyboard focus only; the next card peeking in already says the row scrolls.
256
+ const arrow = 'absolute top-1/2 z-10 hidden h-9 w-9 -translate-y-1/2 items-center justify-center rounded-full border border-gray-200 bg-white/95 text-gray-700 shadow-md transition hover:bg-white ' + 'opacity-0 group-hover/row:opacity-100 focus-visible:opacity-100 disabled:pointer-events-none disabled:!opacity-0 [@media(pointer:fine)]:flex ' + 'dark:border-gray-600 dark:bg-gray-800/95 dark:text-gray-200';
153
257
  return React.createElement("div", {
154
258
  className: "my-2 w-full",
155
259
  role: "group",
156
260
  "aria-label": attachment.title || 'Flight options'
157
261
  }, React.createElement("div", {
158
- className: "relative"
262
+ className: "mx-2 mb-2 flex items-center justify-between gap-3"
263
+ }, React.createElement("div", {
264
+ className: "flex min-w-0 items-center gap-2.5"
265
+ }, React.createElement("span", {
266
+ "aria-hidden": "true",
267
+ className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-blue-50 text-blue-600 dark:bg-blue-500/15 dark:text-blue-300"
268
+ }, React.createElement(FaPlane, {
269
+ className: "h-4 w-4"
270
+ })), React.createElement("div", {
271
+ className: "min-w-0"
272
+ }, React.createElement("p", {
273
+ className: "truncate text-sm font-semibold leading-5 text-gray-900 dark:text-gray-50"
274
+ }, title), React.createElement("p", {
275
+ className: "truncate text-xs leading-4 text-gray-500 dark:text-gray-400"
276
+ }, subtitle))), onMessageClick && count > 1 ? React.createElement("button", {
277
+ type: "button",
278
+ onClick: open,
279
+ className: "inline-flex shrink-0 items-center gap-0.5 rounded-full px-2.5 py-1 text-xs font-semibold text-blue-600 transition hover:bg-blue-50 dark:text-blue-400 dark:hover:bg-blue-500/10"
280
+ }, "View all ", count, React.createElement(FiChevronRight, {
281
+ className: "h-3.5 w-3.5"
282
+ })) : null), picks.length > 0 ? React.createElement("div", {
283
+ className: "mx-2 mb-2 flex flex-wrap gap-1.5",
284
+ "aria-label": "Quick picks"
285
+ }, picks.map(p => React.createElement("button", {
286
+ key: p.badge,
287
+ type: "button",
288
+ onClick: () => jumpTo(p.key),
289
+ className: "inline-flex items-center gap-1.5 rounded-full border border-gray-200 bg-white px-2.5 py-1 text-xs transition hover:border-blue-300 hover:bg-blue-50/60 dark:border-gray-700 dark:bg-gray-800 dark:hover:border-blue-500/60 dark:hover:bg-blue-500/10"
290
+ }, React.createElement("span", {
291
+ className: `font-semibold ${BADGE[p.badge].text}`
292
+ }, p.label), React.createElement("span", {
293
+ className: "font-semibold tabular-nums text-gray-900 dark:text-gray-50"
294
+ }, p.badge === 'fastest' ? p.duration ?? p.price : p.price), p.airline ? React.createElement("span", {
295
+ className: "truncate text-gray-500 dark:text-gray-400"
296
+ }, "\u00B7 ", p.airline) : null))) : null, React.createElement("div", {
297
+ className: "group/row relative"
159
298
  }, React.createElement("div", {
160
299
  ref: rowRef,
161
300
  onScroll: measure,
@@ -166,7 +305,9 @@ const MessageFlights = ({
166
305
  }, cards.map(c => React.createElement(FlightCard, {
167
306
  key: c.key,
168
307
  card: c,
169
- onOpen: open
308
+ onOpen: open,
309
+ showDate: !summary.sameDate,
310
+ highlighted: highlighted === c.key
170
311
  }))), React.createElement("button", {
171
312
  type: "button",
172
313
  "aria-label": "Previous flights",
@@ -183,11 +324,5 @@ const MessageFlights = ({
183
324
  className: `${arrow} right-0`
184
325
  }, React.createElement(FiChevronRight, {
185
326
  className: "h-5 w-5"
186
- }))), onMessageClick && count > cards.length ? React.createElement("button", {
187
- type: "button",
188
- onClick: open,
189
- className: "mx-2 mt-1 inline-flex items-center gap-1 text-sm font-medium text-blue-600 hover:underline dark:text-blue-400"
190
- }, attachment.actionLabel || `View all ${count} flights`, React.createElement(FiChevronRight, {
191
- className: "h-4 w-4"
192
- })) : null);
193
- };export{FlightCardList,MessageFlights};//# sourceMappingURL=MessageFlights.js.map
327
+ }))));
328
+ };export{FlightCard,FlightCardList,MessageFlights,RouteLine,TONES};//# sourceMappingURL=MessageFlights.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageFlights.js","sources":["../../../src/components/MessageWidgets/MessageFlights.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageFlights.js","sources":["../../../src/components/MessageWidgets/MessageFlights.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MessageMedia.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageMedia.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAa/B,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAaD;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,kBAAkB,sBAyIrD,CAAC"}
1
+ {"version":3,"file":"MessageMedia.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageMedia.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAc/B,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAaD;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,kBAAkB,sBA2IrD,CAAC"}
@@ -1,4 +1,4 @@
1
- import React,{useState}from'react';import {FiImage}from'@react-icons/all-files/fi/FiImage.js';import {FiVideo}from'@react-icons/all-files/fi/FiVideo.js';import {FiMusic}from'@react-icons/all-files/fi/FiMusic.js';import {FiDownload}from'@react-icons/all-files/fi/FiDownload.js';import {FiExternalLink}from'@react-icons/all-files/fi/FiExternalLink.js';import {FiCopy}from'@react-icons/all-files/fi/FiCopy.js';import {FiCheck}from'@react-icons/all-files/fi/FiCheck.js';import {MediaAsset}from'@admin-layout/connector-widgets-browser';import {deriveMediaItems,MEDIA_KIND_LABEL,formatAttribution,formatDimensions,formatDuration,formatMediaFormat}from'./mediaUtils.js';const KIND_ICON = {
1
+ import React,{useState}from'react';import {FiImage}from'@react-icons/all-files/fi/FiImage.js';import {FiVideo}from'@react-icons/all-files/fi/FiVideo.js';import {FiMusic}from'@react-icons/all-files/fi/FiMusic.js';import {FiDownload}from'@react-icons/all-files/fi/FiDownload.js';import {FiExternalLink}from'@react-icons/all-files/fi/FiExternalLink.js';import {FiCopy}from'@react-icons/all-files/fi/FiCopy.js';import {FiCheck}from'@react-icons/all-files/fi/FiCheck.js';import {MediaAsset}from'@admin-layout/connector-widgets-browser';import {mediaContentsAttachment}from'../../utils/mediaAttachment.js';import {deriveMediaItems,MEDIA_KIND_LABEL,formatAttribution,formatDimensions,formatDuration,formatMediaFormat}from'./mediaUtils.js';const KIND_ICON = {
2
2
  image: React.createElement(FiImage, {
3
3
  className: "w-3.5 h-3.5"
4
4
  }),
@@ -30,9 +30,9 @@ const MessageMedia = props => {
30
30
  index,
31
31
  onMessageClick
32
32
  } = props;
33
- const {
34
- attachment
35
- } = message.propsConfiguration?.contents ?? {};
33
+ // `contents.attachment`, or a result the agent wrote straight into `contents` (gated on an
34
+ // http(s) url), with `kind` filled in from `mediaType` / `type` / the file ending.
35
+ const attachment = mediaContentsAttachment(message.propsConfiguration?.contents);
36
36
  const [assetMeta, setAssetMeta] = useState({});
37
37
  const [copied, setCopied] = useState(false);
38
38
  if (!attachment || !attachment.url) return null;
@@ -1 +1 @@
1
- {"version":3,"file":"MessageMedia.js","sources":["../../../src/components/MessageWidgets/MessageMedia.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageMedia.js","sources":["../../../src/components/MessageWidgets/MessageMedia.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import React, { ComponentType, ReactNode } from 'react';
2
+ import { IPost } from 'common';
3
+ import { ResultCardBase, ResultSetLike, ResultSort, ResultSummary } from '@admin-layout/client';
4
+ import { IResultCardProps } from './ResultCards';
5
+ /**
6
+ * Every list-shaped result vertical, described once: how to turn the
7
+ * attachment into cards, how to summarise it, which card draws one, and
8
+ * which icon names it. The chat row and the side-panel list both read this.
9
+ */
10
+ export type ResultVertical = 'stays' | 'cars' | 'ground' | 'shopping' | 'movies' | 'jobs';
11
+ interface VerticalSpec {
12
+ toCards: (a: ResultSetLike) => ResultCardBase[];
13
+ summary: (a: ResultSetLike, cards: ResultCardBase[]) => ResultSummary;
14
+ Card: ComponentType<IResultCardProps<any>>;
15
+ icon: (a: ResultSetLike, cards: ResultCardBase[]) => ReactNode;
16
+ sorts: ResultSort[];
17
+ }
18
+ export declare const VERTICALS: Record<ResultVertical, VerticalSpec>;
19
+ /** Which vertical a travel attachment that is not flights belongs to. */
20
+ export declare const travelVertical: (a?: ResultSetLike) => ResultVertical;
21
+ export declare const RESULT_SORT_LABELS: Record<ResultSort, string>;
22
+ export interface IMessageResultsProps {
23
+ message: IPost;
24
+ vertical: ResultVertical;
25
+ /** Defaults to the message's own attachment. */
26
+ attachment?: ResultSetLike;
27
+ /** Opens the full result set (the side rail or the vertical's page). */
28
+ onMessageClick?: (ref: IPost) => void;
29
+ }
30
+ /** The chat row for one result vertical. */
31
+ export declare const MessageResults: ({ message, vertical, attachment, onMessageClick }: IMessageResultsProps) => React.JSX.Element;
32
+ export interface IResultCardListProps {
33
+ vertical: ResultVertical;
34
+ attachment: ResultSetLike;
35
+ sort?: ResultSort;
36
+ onOpen?: () => void;
37
+ }
38
+ /** Every result as a full-width vertical list, for a side panel or a results page. */
39
+ export declare const ResultCardList: ({ vertical, attachment, sort, onOpen }: IResultCardListProps) => React.JSX.Element;
40
+ /** The header strip for a side panel: the same summary the chat row shows. */
41
+ export declare const resultSummaryOf: (vertical: ResultVertical, attachment: ResultSetLike) => ResultSummary;
42
+ export declare const resultIconOf: (vertical: ResultVertical, attachment: ResultSetLike) => ReactNode;
43
+ export interface IMessageVerticalProps {
44
+ message: IPost;
45
+ index?: number;
46
+ onMessageClick?: (ref: IPost) => void;
47
+ }
48
+ export declare const MessageShopping: (props: IMessageVerticalProps) => React.JSX.Element;
49
+ export declare const MessageMovies: (props: IMessageVerticalProps) => React.JSX.Element;
50
+ export declare const MessageJobs: (props: IMessageVerticalProps) => React.JSX.Element;
51
+ /** The resume document card: one artifact, opened in the studio or downloaded. */
52
+ export declare const MessageResume: ({ message, onMessageClick }: IMessageVerticalProps) => React.JSX.Element;
53
+ export {};
54
+ //# sourceMappingURL=MessageResults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageResults.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageResults.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,SAAS,EAAW,MAAM,OAAO,CAAC;AAQjE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EACH,cAAc,EACd,aAAa,EACb,UAAU,EACV,aAAa,EAgBhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGH,gBAAgB,EAMnB,MAAM,eAAe,CAAC;AAGvB;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1F,UAAU,YAAY;IAClB,OAAO,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,cAAc,EAAE,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,aAAa,CAAC;IACtE,IAAI,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,SAAS,CAAC;IAC/D,KAAK,EAAE,UAAU,EAAE,CAAC;CACvB;AAID,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,YAAY,CA2C1D,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,cAAc,GAAI,IAAI,aAAa,KAAG,cAGlD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAOzD,CAAC;AAKF,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,gDAAgD;IAChD,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,wEAAwE;IACxE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAED,4CAA4C;AAC5C,eAAO,MAAM,cAAc,GAAI,mDAAmD,oBAAoB,sBAuBrG,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,sFAAsF;AACtF,eAAO,MAAM,cAAc,GAAI,wCAAwD,oBAAoB,sBAe1G,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,eAAe,GAAI,UAAU,cAAc,EAAE,YAAY,aAAa,KAAG,aAGrF,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,UAAU,cAAc,EAAE,YAAY,aAAa,KAAG,SAGlF,CAAC;AAIF,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,qBAAqB,sBAAsD,CAAC;AACnH,eAAO,MAAM,aAAa,GAAI,OAAO,qBAAqB,sBAAoD,CAAC;AAC/G,eAAO,MAAM,WAAW,GAAI,OAAO,qBAAqB,sBAAkD,CAAC;AAE3G,kFAAkF;AAClF,eAAO,MAAM,aAAa,GAAI,6BAA6B,qBAAqB,sBAM/E,CAAC"}