@admin-layout/ai-chat-ext-browser 12.2.5-alpha.2 → 12.2.5-alpha.21
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/lib/components/MessageWidgets/MessageFlights.d.ts +27 -4
- package/lib/components/MessageWidgets/MessageFlights.d.ts.map +1 -1
- package/lib/components/MessageWidgets/MessageFlights.js +200 -65
- package/lib/components/MessageWidgets/MessageFlights.js.map +1 -1
- package/lib/components/MessageWidgets/MessageMedia.d.ts.map +1 -1
- package/lib/components/MessageWidgets/MessageMedia.js +4 -4
- package/lib/components/MessageWidgets/MessageMedia.js.map +1 -1
- package/lib/components/MessageWidgets/MessageResults.d.ts +54 -0
- package/lib/components/MessageWidgets/MessageResults.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageResults.js +163 -0
- package/lib/components/MessageWidgets/MessageResults.js.map +1 -0
- package/lib/components/MessageWidgets/MessageTravel.d.ts +2 -0
- package/lib/components/MessageWidgets/MessageTravel.d.ts.map +1 -1
- package/lib/components/MessageWidgets/MessageTravel.js +15 -3
- package/lib/components/MessageWidgets/MessageTravel.js.map +1 -1
- package/lib/components/MessageWidgets/ResultCards.d.ts +19 -0
- package/lib/components/MessageWidgets/ResultCards.d.ts.map +1 -0
- package/lib/components/MessageWidgets/ResultCards.js +543 -0
- package/lib/components/MessageWidgets/ResultCards.js.map +1 -0
- package/lib/components/MessageWidgets/ResultRow.d.ts +57 -0
- package/lib/components/MessageWidgets/ResultRow.d.ts.map +1 -0
- package/lib/components/MessageWidgets/ResultRow.js +216 -0
- package/lib/components/MessageWidgets/ResultRow.js.map +1 -0
- package/lib/components/MessageWidgets/index.d.ts +6 -2
- package/lib/components/MessageWidgets/index.d.ts.map +1 -1
- package/lib/components/MessageWidgets/mediaUtils.d.ts.map +1 -1
- package/lib/components/MessageWidgets/mediaUtils.js +3 -10
- package/lib/components/MessageWidgets/mediaUtils.js.map +1 -1
- package/lib/components/index.d.ts +1 -1
- package/lib/components/index.d.ts.map +1 -1
- package/lib/index.d.ts +6 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/module.d.ts.map +1 -1
- package/lib/module.js +13 -1
- package/lib/module.js.map +1 -1
- package/lib/slot-fill/chat-settings-fill.js +1 -1
- package/lib/slot-fill/chat-settings-fill.js.map +1 -1
- package/lib/slot-fill/index.d.ts +4 -0
- package/lib/slot-fill/index.d.ts.map +1 -1
- package/lib/slot-fill/message-ai-assistant-fill.js +1 -1
- package/lib/slot-fill/message-ai-assistant-fill.js.map +1 -1
- package/lib/slot-fill/message-codeblock-fill.js +1 -1
- package/lib/slot-fill/message-codeblock-fill.js.map +1 -1
- package/lib/slot-fill/message-connector-fill.js +1 -1
- package/lib/slot-fill/message-connector-fill.js.map +1 -1
- package/lib/slot-fill/message-generic-fill.js +1 -1
- package/lib/slot-fill/message-generic-fill.js.map +1 -1
- package/lib/slot-fill/message-jobs-fill.d.ts +4 -0
- package/lib/slot-fill/message-jobs-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-jobs-fill.js +6 -0
- package/lib/slot-fill/message-jobs-fill.js.map +1 -0
- package/lib/slot-fill/message-media-fill.js +1 -1
- package/lib/slot-fill/message-media-fill.js.map +1 -1
- package/lib/slot-fill/message-movies-fill.d.ts +4 -0
- package/lib/slot-fill/message-movies-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-movies-fill.js +6 -0
- package/lib/slot-fill/message-movies-fill.js.map +1 -0
- package/lib/slot-fill/message-resume-fill.d.ts +4 -0
- package/lib/slot-fill/message-resume-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-resume-fill.js +6 -0
- package/lib/slot-fill/message-resume-fill.js.map +1 -0
- package/lib/slot-fill/message-service-fill.js +1 -1
- package/lib/slot-fill/message-service-fill.js.map +1 -1
- package/lib/slot-fill/message-shopping-fill.d.ts +4 -0
- package/lib/slot-fill/message-shopping-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-shopping-fill.js +6 -0
- package/lib/slot-fill/message-shopping-fill.js.map +1 -0
- package/lib/slot-fill/message-thinking-fill.js +1 -1
- package/lib/slot-fill/message-thinking-fill.js.map +1 -1
- package/lib/slot-fill/message-tooluse-fill.js +1 -1
- package/lib/slot-fill/message-tooluse-fill.js.map +1 -1
- package/lib/slot-fill/message-travel-fill.js +1 -1
- package/lib/slot-fill/message-travel-fill.js.map +1 -1
- package/lib/slot-fill/message-workflow-fill.js +1 -1
- package/lib/slot-fill/message-workflow-fill.js.map +1 -1
- package/lib/utils/mediaAttachment.d.ts +46 -0
- package/lib/utils/mediaAttachment.d.ts.map +1 -0
- package/lib/utils/mediaAttachment.js +135 -0
- package/lib/utils/mediaAttachment.js.map +1 -0
- package/lib/utils/parseWidgetPost.d.ts.map +1 -1
- package/lib/utils/parseWidgetPost.js +20 -10
- package/lib/utils/parseWidgetPost.js.map +1 -1
- package/package.json +3 -3
- package/lib/utils/parseWidgetPost.spec.d.ts +0 -2
- 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.
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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,
|
|
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'
|
|
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: "
|
|
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("
|
|
14
|
-
className: "
|
|
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-
|
|
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
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
className: "
|
|
31
|
-
},
|
|
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
|
|
34
|
-
|
|
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
|
-
},
|
|
96
|
+
className: "flex items-center gap-2.5"
|
|
97
|
+
}, React.createElement("span", {
|
|
44
98
|
"aria-hidden": "true",
|
|
45
|
-
className:
|
|
46
|
-
}, card.
|
|
47
|
-
className: "
|
|
48
|
-
},
|
|
49
|
-
className: "
|
|
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
|
-
|
|
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-
|
|
57
|
-
}, card.
|
|
58
|
-
className: "shrink-0
|
|
59
|
-
}, card.price
|
|
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
|
-
},
|
|
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.
|
|
110
|
-
*
|
|
111
|
-
*
|
|
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 =
|
|
152
|
-
const
|
|
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: "
|
|
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
|
-
})))
|
|
187
|
-
|
|
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":"
|
|
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;
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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":"
|
|
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"}
|