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

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 (74) 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 +192 -64
  4. package/lib/components/MessageWidgets/MessageFlights.js.map +1 -1
  5. package/lib/components/MessageWidgets/MessageResults.d.ts +54 -0
  6. package/lib/components/MessageWidgets/MessageResults.d.ts.map +1 -0
  7. package/lib/components/MessageWidgets/MessageResults.js +163 -0
  8. package/lib/components/MessageWidgets/MessageResults.js.map +1 -0
  9. package/lib/components/MessageWidgets/MessageTravel.d.ts +2 -0
  10. package/lib/components/MessageWidgets/MessageTravel.d.ts.map +1 -1
  11. package/lib/components/MessageWidgets/MessageTravel.js +15 -3
  12. package/lib/components/MessageWidgets/MessageTravel.js.map +1 -1
  13. package/lib/components/MessageWidgets/ResultCards.d.ts +19 -0
  14. package/lib/components/MessageWidgets/ResultCards.d.ts.map +1 -0
  15. package/lib/components/MessageWidgets/ResultCards.js +543 -0
  16. package/lib/components/MessageWidgets/ResultCards.js.map +1 -0
  17. package/lib/components/MessageWidgets/ResultRow.d.ts +57 -0
  18. package/lib/components/MessageWidgets/ResultRow.d.ts.map +1 -0
  19. package/lib/components/MessageWidgets/ResultRow.js +216 -0
  20. package/lib/components/MessageWidgets/ResultRow.js.map +1 -0
  21. package/lib/components/MessageWidgets/index.d.ts +6 -2
  22. package/lib/components/MessageWidgets/index.d.ts.map +1 -1
  23. package/lib/components/index.d.ts +1 -1
  24. package/lib/components/index.d.ts.map +1 -1
  25. package/lib/index.d.ts +6 -2
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/index.js +1 -1
  28. package/lib/module.d.ts.map +1 -1
  29. package/lib/module.js +13 -1
  30. package/lib/module.js.map +1 -1
  31. package/lib/slot-fill/chat-settings-fill.js +1 -1
  32. package/lib/slot-fill/chat-settings-fill.js.map +1 -1
  33. package/lib/slot-fill/index.d.ts +4 -0
  34. package/lib/slot-fill/index.d.ts.map +1 -1
  35. package/lib/slot-fill/message-ai-assistant-fill.js +1 -1
  36. package/lib/slot-fill/message-ai-assistant-fill.js.map +1 -1
  37. package/lib/slot-fill/message-codeblock-fill.js +1 -1
  38. package/lib/slot-fill/message-codeblock-fill.js.map +1 -1
  39. package/lib/slot-fill/message-connector-fill.js +1 -1
  40. package/lib/slot-fill/message-connector-fill.js.map +1 -1
  41. package/lib/slot-fill/message-generic-fill.js +1 -1
  42. package/lib/slot-fill/message-generic-fill.js.map +1 -1
  43. package/lib/slot-fill/message-jobs-fill.d.ts +4 -0
  44. package/lib/slot-fill/message-jobs-fill.d.ts.map +1 -0
  45. package/lib/slot-fill/message-jobs-fill.js +6 -0
  46. package/lib/slot-fill/message-jobs-fill.js.map +1 -0
  47. package/lib/slot-fill/message-media-fill.js +1 -1
  48. package/lib/slot-fill/message-media-fill.js.map +1 -1
  49. package/lib/slot-fill/message-movies-fill.d.ts +4 -0
  50. package/lib/slot-fill/message-movies-fill.d.ts.map +1 -0
  51. package/lib/slot-fill/message-movies-fill.js +6 -0
  52. package/lib/slot-fill/message-movies-fill.js.map +1 -0
  53. package/lib/slot-fill/message-resume-fill.d.ts +4 -0
  54. package/lib/slot-fill/message-resume-fill.d.ts.map +1 -0
  55. package/lib/slot-fill/message-resume-fill.js +6 -0
  56. package/lib/slot-fill/message-resume-fill.js.map +1 -0
  57. package/lib/slot-fill/message-service-fill.js +1 -1
  58. package/lib/slot-fill/message-service-fill.js.map +1 -1
  59. package/lib/slot-fill/message-shopping-fill.d.ts +4 -0
  60. package/lib/slot-fill/message-shopping-fill.d.ts.map +1 -0
  61. package/lib/slot-fill/message-shopping-fill.js +6 -0
  62. package/lib/slot-fill/message-shopping-fill.js.map +1 -0
  63. package/lib/slot-fill/message-thinking-fill.js +1 -1
  64. package/lib/slot-fill/message-thinking-fill.js.map +1 -1
  65. package/lib/slot-fill/message-tooluse-fill.js +1 -1
  66. package/lib/slot-fill/message-tooluse-fill.js.map +1 -1
  67. package/lib/slot-fill/message-travel-fill.js +1 -1
  68. package/lib/slot-fill/message-travel-fill.js.map +1 -1
  69. package/lib/slot-fill/message-workflow-fill.js +1 -1
  70. package/lib/slot-fill/message-workflow-fill.js.map +1 -1
  71. package/lib/utils/parseWidgetPost.d.ts.map +1 -1
  72. package/lib/utils/parseWidgetPost.js +1 -1
  73. package/lib/utils/parseWidgetPost.js.map +1 -1
  74. package/package.json +3 -3
@@ -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,sBAoGlB,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,127 @@
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
112
+ slice: s,
113
+ caption: captionFor(s, i)
53
114
  }))), React.createElement("div", {
54
115
  className: "mt-auto flex items-center justify-between gap-3 border-t border-gray-100 pt-3 dark:border-gray-700"
55
116
  }, 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));
117
+ className: "min-w-0 truncate text-xs text-gray-500 dark:text-gray-400"
118
+ }, card.seller ? `via ${card.seller}` : card.roundTrip ? 'Round trip' : card.slices[0].stops ?? ''), React.createElement("span", {
119
+ className: "flex shrink-0 items-center gap-1.5"
120
+ }, card.price ? React.createElement("span", {
121
+ className: "text-lg font-bold leading-none tabular-nums text-gray-900 dark:text-white"
122
+ }, card.price) : null, card.url ? React.createElement(FiExternalLink, {
123
+ className: "h-3.5 w-3.5 text-gray-400 transition-colors group-hover/card:text-blue-500"
124
+ }) : null)));
60
125
  // A bookable offer goes straight to the seller; without a link the card
61
126
  // opens the full results in the side panel instead.
62
127
  if (card.url) {
@@ -66,7 +131,8 @@ const FlightCard = ({
66
131
  rel: "noopener noreferrer",
67
132
  "aria-label": card.accessibleLabel,
68
133
  className: className,
69
- "data-flight-card": ""
134
+ "data-flight-card": "",
135
+ "data-flight-key": card.key
70
136
  }, body);
71
137
  }
72
138
  if (!onOpen) {
@@ -75,7 +141,8 @@ const FlightCard = ({
75
141
  role: "group",
76
142
  "aria-label": card.accessibleLabel,
77
143
  className: className,
78
- "data-flight-card": ""
144
+ "data-flight-card": "",
145
+ "data-flight-key": card.key
79
146
  }, body);
80
147
  }
81
148
  return React.createElement("button", {
@@ -83,44 +150,53 @@ const FlightCard = ({
83
150
  onClick: onOpen,
84
151
  "aria-label": card.accessibleLabel,
85
152
  className: className,
86
- "data-flight-card": ""
153
+ "data-flight-card": "",
154
+ "data-flight-key": card.key
87
155
  }, body);
88
156
  };
89
157
  /** Every flight as a full-width vertical list, for a side panel or a results page. */
90
158
  const FlightCardList = ({
91
159
  attachment,
92
- onOpen
160
+ onOpen,
161
+ sort = 'recommended'
93
162
  }) => {
94
- const cards = toFlightCards(attachment);
163
+ const cards = useMemo(() => toFlightCards(attachment), [attachment]);
164
+ const summary = useMemo(() => flightResultSummary(attachment, cards), [attachment, cards]);
165
+ const ordered = useMemo(() => sortFlightCards(cards, sort), [cards, sort]);
95
166
  if (cards.length === 0) return null;
96
167
  return React.createElement("ul", {
97
168
  className: "space-y-3",
98
169
  "aria-label": attachment.title || 'Flight options'
99
- }, cards.map(c => React.createElement("li", {
170
+ }, ordered.map(c => React.createElement("li", {
100
171
  key: c.key
101
172
  }, React.createElement(FlightCard, {
102
173
  card: c,
103
174
  onOpen: onOpen,
104
- fullWidth: true
175
+ fullWidth: true,
176
+ showDate: !summary.sameDate
105
177
  }))));
106
178
  };
179
+ const HIGHLIGHT_MS = 1600;
107
180
  /**
108
181
  * 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.
182
+ * one peeking in so the row reads as scrollable. Above it, the route and date
183
+ * once, and quick picks (cheapest, fastest, best value) that jump to their
184
+ * card. Touch swipes and snaps; a pointer gets arrow buttons, since sideways
185
+ * scrolling is awkward with a mouse.
112
186
  */
113
187
  const MessageFlights = ({
114
188
  message,
115
189
  attachment,
116
190
  onMessageClick
117
191
  }) => {
118
- const cards = toFlightCards(attachment);
192
+ const cards = useMemo(() => toFlightCards(attachment), [attachment]);
193
+ const summary = useMemo(() => flightResultSummary(attachment, cards), [attachment, cards]);
119
194
  const rowRef = useRef(null);
120
195
  const [edges, setEdges] = useState({
121
196
  atStart: true,
122
197
  atEnd: true
123
198
  });
199
+ const [highlighted, setHighlighted] = useState(null);
124
200
  const measure = useCallback(() => {
125
201
  const el = rowRef.current;
126
202
  if (!el) return;
@@ -137,6 +213,11 @@ const MessageFlights = ({
137
213
  ro.observe(el);
138
214
  return () => ro.disconnect();
139
215
  }, [measure, cards.length]);
216
+ useEffect(() => {
217
+ if (!highlighted) return undefined;
218
+ const t = setTimeout(() => setHighlighted(null), HIGHLIGHT_MS);
219
+ return () => clearTimeout(t);
220
+ }, [highlighted]);
140
221
  if (cards.length === 0) return null;
141
222
  const step = dir => {
142
223
  const el = rowRef.current;
@@ -147,15 +228,66 @@ const MessageFlights = ({
147
228
  behavior: 'smooth'
148
229
  });
149
230
  };
231
+ const jumpTo = key => {
232
+ const el = rowRef.current;
233
+ const card = el?.querySelector(`[data-flight-key="${CSS.escape(key)}"]`);
234
+ if (!el || !card) return;
235
+ // 8px: the row's px-2, so the card lands where the first one sits.
236
+ el.scrollTo({
237
+ left: card.offsetLeft - 8,
238
+ behavior: 'smooth'
239
+ });
240
+ setHighlighted(key);
241
+ };
150
242
  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';
243
+ const count = summary.count;
244
+ const title = summary.route ?? attachment.title ?? 'Flights';
245
+ const subtitle = [summary.date, `${count} ${count === 1 ? 'flight' : 'flights'}`, summary.fromPrice ? `from ${summary.fromPrice}` : undefined, summary.seller].filter(Boolean).join(' · ');
246
+ const picks = cards.length > 2 ? summary.picks : [];
247
+ // Arrows sit over the first and last visible card, so they show on hover or
248
+ // keyboard focus only; the next card peeking in already says the row scrolls.
249
+ 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
250
  return React.createElement("div", {
154
251
  className: "my-2 w-full",
155
252
  role: "group",
156
253
  "aria-label": attachment.title || 'Flight options'
157
254
  }, React.createElement("div", {
158
- className: "relative"
255
+ className: "mx-2 mb-2 flex items-center justify-between gap-3"
256
+ }, React.createElement("div", {
257
+ className: "flex min-w-0 items-center gap-2.5"
258
+ }, React.createElement("span", {
259
+ "aria-hidden": "true",
260
+ 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"
261
+ }, React.createElement(FaPlane, {
262
+ className: "h-4 w-4"
263
+ })), React.createElement("div", {
264
+ className: "min-w-0"
265
+ }, React.createElement("p", {
266
+ className: "truncate text-sm font-semibold leading-5 text-gray-900 dark:text-gray-50"
267
+ }, title), React.createElement("p", {
268
+ className: "truncate text-xs leading-4 text-gray-500 dark:text-gray-400"
269
+ }, subtitle))), onMessageClick && count > 1 ? React.createElement("button", {
270
+ type: "button",
271
+ onClick: open,
272
+ 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"
273
+ }, "View all ", count, React.createElement(FiChevronRight, {
274
+ className: "h-3.5 w-3.5"
275
+ })) : null), picks.length > 0 ? React.createElement("div", {
276
+ className: "mx-2 mb-2 flex flex-wrap gap-1.5",
277
+ "aria-label": "Quick picks"
278
+ }, picks.map(p => React.createElement("button", {
279
+ key: p.badge,
280
+ type: "button",
281
+ onClick: () => jumpTo(p.key),
282
+ 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"
283
+ }, React.createElement("span", {
284
+ className: `font-semibold ${BADGE[p.badge].text}`
285
+ }, p.label), React.createElement("span", {
286
+ className: "font-semibold tabular-nums text-gray-900 dark:text-gray-50"
287
+ }, p.badge === 'fastest' ? p.duration ?? p.price : p.price), p.airline ? React.createElement("span", {
288
+ className: "truncate text-gray-500 dark:text-gray-400"
289
+ }, "\u00B7 ", p.airline) : null))) : null, React.createElement("div", {
290
+ className: "group/row relative"
159
291
  }, React.createElement("div", {
160
292
  ref: rowRef,
161
293
  onScroll: measure,
@@ -166,7 +298,9 @@ const MessageFlights = ({
166
298
  }, cards.map(c => React.createElement(FlightCard, {
167
299
  key: c.key,
168
300
  card: c,
169
- onOpen: open
301
+ onOpen: open,
302
+ showDate: !summary.sameDate,
303
+ highlighted: highlighted === c.key
170
304
  }))), React.createElement("button", {
171
305
  type: "button",
172
306
  "aria-label": "Previous flights",
@@ -183,11 +317,5 @@ const MessageFlights = ({
183
317
  className: `${arrow} right-0`
184
318
  }, React.createElement(FiChevronRight, {
185
319
  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
320
+ }))));
321
+ };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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"}
@@ -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"}