@servicetitan/anvil2-ext-atlas 0.0.14 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/_commonjsHelpers-B85MJLTf.js +6 -0
  3. package/dist/_commonjsHelpers-B85MJLTf.js.map +1 -0
  4. package/dist/atlas-header-jdAIcEpa.js +23 -0
  5. package/dist/atlas-header-jdAIcEpa.js.map +1 -0
  6. package/dist/atlas-header.d.ts +2 -0
  7. package/dist/atlas-header.js +2 -0
  8. package/dist/atlas-header.js.map +1 -0
  9. package/dist/chat-composer-rich-BM5hoC1f.js +162 -0
  10. package/dist/chat-composer-rich-BM5hoC1f.js.map +1 -0
  11. package/dist/chat-composer-rich.css +119 -0
  12. package/dist/chat-composer-rich.d.ts +2 -0
  13. package/dist/chat-composer-rich.js +2 -0
  14. package/dist/chat-composer-rich.js.map +1 -0
  15. package/dist/chat-window-BEkLTYNg.js +76 -0
  16. package/dist/chat-window-BEkLTYNg.js.map +1 -0
  17. package/dist/chat-window.css +49 -0
  18. package/dist/chat.d.ts +2 -0
  19. package/dist/chat.js +2 -0
  20. package/dist/chat.js.map +1 -0
  21. package/dist/components/atlas-header/atlas-header.d.ts +21 -0
  22. package/dist/components/atlas-header/index.d.ts +2 -0
  23. package/dist/components/chat/chat-window.d.ts +13 -0
  24. package/dist/components/chat/index.d.ts +1 -0
  25. package/dist/components/chat-composer-rich/chat-composer-rich.d.ts +23 -0
  26. package/dist/components/chat-composer-rich/index.d.ts +2 -0
  27. package/dist/components/content/content.d.ts +7 -0
  28. package/dist/components/content/index.d.ts +1 -0
  29. package/dist/components/footer/footer.d.ts +16 -0
  30. package/dist/components/footer/index.d.ts +2 -0
  31. package/dist/components/header/header.d.ts +23 -0
  32. package/dist/components/header/index.d.ts +2 -0
  33. package/dist/components/index.d.ts +16 -1
  34. package/dist/components/infinite-content/hooks/use-infinite-scroll.d.ts +11 -0
  35. package/dist/components/infinite-content/hooks/use-scroll-callback.d.ts +11 -0
  36. package/dist/components/infinite-content/index.d.ts +2 -0
  37. package/dist/components/infinite-content/infinite-content.d.ts +17 -0
  38. package/dist/components/loader/index.d.ts +1 -0
  39. package/dist/components/loader/loader.d.ts +2 -0
  40. package/dist/components/markdown-text/index.d.ts +2 -0
  41. package/dist/components/markdown-text/markdown-text.d.ts +5 -0
  42. package/dist/components/messages/assistant-message.d.ts +10 -0
  43. package/dist/components/messages/error-message.d.ts +8 -0
  44. package/dist/components/messages/index.d.ts +6 -0
  45. package/dist/components/messages/markdown-message.d.ts +13 -0
  46. package/dist/components/messages/message-interface.d.ts +4 -0
  47. package/dist/components/messages/small-action.d.ts +13 -0
  48. package/dist/components/messages/system-message.d.ts +18 -0
  49. package/dist/components/messages/user-message.d.ts +13 -0
  50. package/dist/components/notification-card/index.d.ts +1 -0
  51. package/dist/components/notification-card/notification-card.d.ts +10 -0
  52. package/dist/components/recommendations/confirmation-card/confirmation-card.d.ts +10 -0
  53. package/dist/components/recommendations/confirmation-card/index.d.ts +1 -0
  54. package/dist/components/recommendations/index.d.ts +4 -0
  55. package/dist/components/recommendations/multiple-recommendation-card/index.d.ts +1 -0
  56. package/dist/components/recommendations/multiple-recommendation-card/multiple-recommendation-card.d.ts +7 -0
  57. package/dist/components/recommendations/shared-interfaces.d.ts +26 -0
  58. package/dist/components/recommendations/single-recommendation-card/index.d.ts +1 -0
  59. package/dist/components/recommendations/single-recommendation-card/single-recommendation-card.d.ts +7 -0
  60. package/dist/components/screens/index.d.ts +1 -0
  61. package/dist/components/screens/system-error.d.ts +10 -0
  62. package/dist/components/screens/welcome.d.ts +8 -0
  63. package/dist/components/spinner/index.d.ts +1 -0
  64. package/dist/components/spinner/spinner.d.ts +1 -0
  65. package/dist/components/suggestion/index.d.ts +1 -0
  66. package/dist/components/suggestion/suggestion.d.ts +11 -0
  67. package/dist/components/toolbox/index.d.ts +2 -0
  68. package/dist/components/toolbox/toolbox.d.ts +12 -0
  69. package/dist/components/toolbox/toolbox.enums.d.ts +5 -0
  70. package/dist/content-acT_RzNQ.js +55 -0
  71. package/dist/content-acT_RzNQ.js.map +1 -0
  72. package/dist/content.css +10 -0
  73. package/dist/content.d.ts +2 -0
  74. package/dist/content.js +2 -0
  75. package/dist/content.js.map +1 -0
  76. package/dist/footer-DezXey1O.js +86 -0
  77. package/dist/footer-DezXey1O.js.map +1 -0
  78. package/dist/footer.css +12 -0
  79. package/dist/footer.d.ts +2 -0
  80. package/dist/footer.js +2 -0
  81. package/dist/footer.js.map +1 -0
  82. package/dist/header-DgkrbsFN.js +171 -0
  83. package/dist/header-DgkrbsFN.js.map +1 -0
  84. package/dist/header.css +23 -0
  85. package/dist/header.d.ts +2 -0
  86. package/dist/header.js +2 -0
  87. package/dist/header.js.map +1 -0
  88. package/dist/hooks/index.d.ts +1 -0
  89. package/dist/hooks/use-draggable.d.ts +18 -0
  90. package/dist/index-DDXI3m_u.js +73 -0
  91. package/dist/index-DDXI3m_u.js.map +1 -0
  92. package/dist/index-DFEn2XpE.js +24643 -0
  93. package/dist/index-DFEn2XpE.js.map +1 -0
  94. package/dist/index.js +16 -1
  95. package/dist/index.js.map +1 -1
  96. package/dist/infinite-content-B4ojfnZH.js +144 -0
  97. package/dist/infinite-content-B4ojfnZH.js.map +1 -0
  98. package/dist/infinite-content.css +25 -0
  99. package/dist/infinite-content.d.ts +2 -0
  100. package/dist/infinite-content.js +2 -0
  101. package/dist/infinite-content.js.map +1 -0
  102. package/dist/loader-DYmcO1Y_.js +48 -0
  103. package/dist/loader-DYmcO1Y_.js.map +1 -0
  104. package/dist/loader.d.ts +2 -0
  105. package/dist/loader.js +2 -0
  106. package/dist/loader.js.map +1 -0
  107. package/dist/markdown-text-CKN0oo8R.js +13 -0
  108. package/dist/markdown-text-CKN0oo8R.js.map +1 -0
  109. package/dist/markdown-text.css +45 -0
  110. package/dist/markdown-text.d.ts +2 -0
  111. package/dist/markdown-text.js +2 -0
  112. package/dist/markdown-text.js.map +1 -0
  113. package/dist/messages.d.ts +2 -0
  114. package/dist/messages.js +2 -0
  115. package/dist/messages.js.map +1 -0
  116. package/dist/notification-card-B38ZC7k4.js +59 -0
  117. package/dist/notification-card-B38ZC7k4.js.map +1 -0
  118. package/dist/notification-card.d.ts +2 -0
  119. package/dist/notification-card.js +2 -0
  120. package/dist/notification-card.js.map +1 -0
  121. package/dist/proxy-B3m3ViIw.js +9928 -0
  122. package/dist/proxy-B3m3ViIw.js.map +1 -0
  123. package/dist/recommendations.d.ts +2 -0
  124. package/dist/recommendations.js +2 -0
  125. package/dist/recommendations.js.map +1 -0
  126. package/dist/screens.d.ts +2 -0
  127. package/dist/screens.js +2 -0
  128. package/dist/screens.js.map +1 -0
  129. package/dist/single-recommendation-card-G78KiWnb.js +199 -0
  130. package/dist/single-recommendation-card-G78KiWnb.js.map +1 -0
  131. package/dist/spinner-QnlThoJs.js +23 -0
  132. package/dist/spinner-QnlThoJs.js.map +1 -0
  133. package/dist/spinner.css +21 -0
  134. package/dist/spinner.d.ts +2 -0
  135. package/dist/spinner.js +2 -0
  136. package/dist/spinner.js.map +1 -0
  137. package/dist/suggestion-pJLJZyjg.js +33 -0
  138. package/dist/suggestion-pJLJZyjg.js.map +1 -0
  139. package/dist/suggestion.d.ts +2 -0
  140. package/dist/suggestion.js +2 -0
  141. package/dist/suggestion.js.map +1 -0
  142. package/dist/toolbox-B-mWIaVL.js +272 -0
  143. package/dist/toolbox-B-mWIaVL.js.map +1 -0
  144. package/dist/toolbox.d.ts +2 -0
  145. package/dist/toolbox.js +2 -0
  146. package/dist/toolbox.js.map +1 -0
  147. package/dist/user-message-DCOP95qA.js +247 -0
  148. package/dist/user-message-DCOP95qA.js.map +1 -0
  149. package/dist/user-message.css +170 -0
  150. package/dist/welcome-BY6k2z0K.js +57 -0
  151. package/dist/welcome-BY6k2z0K.js.map +1 -0
  152. package/dist/welcome.css +23 -0
  153. package/package.json +19 -7
  154. package/dist/DummyComponent-ac_BQfhC.js +0 -8
  155. package/dist/DummyComponent-ac_BQfhC.js.map +0 -1
  156. package/dist/DummyComponent.d.ts +0 -2
  157. package/dist/DummyComponent.js +0 -2
  158. package/dist/DummyComponent.js.map +0 -1
  159. package/dist/components/DummyComponent/DummyComponent.d.ts +0 -1
  160. package/dist/components/DummyComponent/index.d.ts +0 -1
@@ -0,0 +1,2 @@
1
+ export * from './components/recommendations/index'
2
+ export {}
@@ -0,0 +1,2 @@
1
+ export { C as ConfirmationCard, M as MultipleRecommendationCard, S as SingleRecommendationCard } from './single-recommendation-card-G78KiWnb.js';
2
+ //# sourceMappingURL=recommendations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendations.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from './components/screens/index'
2
+ export {}
@@ -0,0 +1,2 @@
1
+ export { W as Welcome } from './welcome-BY6k2z0K.js';
2
+ //# sourceMappingURL=screens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screens.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,199 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useMemo, useState } from 'react';
3
+ import { Flex, Text, Card, Button, Link, Checkbox, Overflow, RadioGroup, Radio } from '@servicetitan/anvil2';
4
+ import { A as AtlasHeader } from './atlas-header-jdAIcEpa.js';
5
+
6
+ const ConfirmationCard = ({
7
+ recommendationId,
8
+ actions,
9
+ message,
10
+ onSubmit,
11
+ description,
12
+ className,
13
+ submitted
14
+ }) => {
15
+ const { buttonActions, linkActions } = useMemo(() => {
16
+ const buttons = [];
17
+ const links = [];
18
+ actions.forEach((action) => {
19
+ if (action.type?.toLowerCase() === "link") {
20
+ links.push(action);
21
+ } else {
22
+ buttons.push(action);
23
+ }
24
+ });
25
+ return { buttonActions: buttons, linkActions: links };
26
+ }, [actions]);
27
+ const handleSubmit = (action) => {
28
+ onSubmit({
29
+ sourceMessageId: recommendationId,
30
+ optionIds: [],
31
+ actionId: action.id,
32
+ parameters: {
33
+ url: action.url
34
+ }
35
+ });
36
+ };
37
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", className, children: [
38
+ /* @__PURE__ */ jsx(AtlasHeader, {}),
39
+ /* @__PURE__ */ jsx(Text, { size: "medium", children: message }),
40
+ /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 3, children: [
41
+ description && /* @__PURE__ */ jsx(Text, { size: "small", children: description }),
42
+ /* @__PURE__ */ jsxs(Flex, { alignItems: "flex-start", gap: 1, children: [
43
+ buttonActions.map((action) => /* @__PURE__ */ jsx(
44
+ Button,
45
+ {
46
+ size: "medium",
47
+ appearance: action.type?.toLowerCase() ?? "primary",
48
+ onClick: () => handleSubmit(action),
49
+ disabled: submitted,
50
+ children: action.name
51
+ },
52
+ action.id
53
+ )),
54
+ linkActions.map((action) => /* @__PURE__ */ jsx(
55
+ Link,
56
+ {
57
+ quiet: true,
58
+ appearance: "primary",
59
+ onClick: () => handleSubmit(action),
60
+ children: action.name
61
+ },
62
+ action.id
63
+ ))
64
+ ] })
65
+ ] }) })
66
+ ] });
67
+ };
68
+
69
+ const MultipleRecommendationCard = ({
70
+ recommendationId,
71
+ message,
72
+ options,
73
+ actions,
74
+ onSubmit,
75
+ submitted,
76
+ selected
77
+ }) => {
78
+ const [localSelectedValues, setLocalSelectedValues] = useState([]);
79
+ const handleCheckboxChange = (value, checked) => {
80
+ if (checked) {
81
+ setLocalSelectedValues((prev) => [...prev, value]);
82
+ } else {
83
+ setLocalSelectedValues((prev) => prev.filter((v) => v !== value));
84
+ }
85
+ };
86
+ const handleSubmit = (id) => {
87
+ onSubmit({
88
+ sourceMessageId: recommendationId,
89
+ optionIds: localSelectedValues,
90
+ actionId: id
91
+ });
92
+ };
93
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
94
+ /* @__PURE__ */ jsx(AtlasHeader, {}),
95
+ /* @__PURE__ */ jsx(Text, { size: "medium", children: message }),
96
+ /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
97
+ options?.map((option) => /* @__PURE__ */ jsx(
98
+ Checkbox,
99
+ {
100
+ disabled: submitted,
101
+ name: "action",
102
+ value: option.id,
103
+ checked: !submitted ? localSelectedValues.includes(option.id ?? "") : selected?.includes(option.id),
104
+ onChange: (e) => handleCheckboxChange(
105
+ option.id ?? "",
106
+ e?.target?.checked ?? false
107
+ ),
108
+ label: option.label,
109
+ description: option.description ? /* @__PURE__ */ jsx(
110
+ Overflow.Text,
111
+ {
112
+ rows: 2,
113
+ expandable: true,
114
+ expandText: "Show more...",
115
+ collapseText: "Show less...",
116
+ children: option.description && /* @__PURE__ */ jsx(Text, { subdued: true, size: "small", children: option.description })
117
+ }
118
+ ) : void 0
119
+ },
120
+ option.id
121
+ )),
122
+ /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-start", gap: 2, children: actions?.map((action) => /* @__PURE__ */ jsx(
123
+ Button,
124
+ {
125
+ size: "medium",
126
+ appearance: action.type?.toLowerCase() ?? "primary",
127
+ onClick: () => handleSubmit(action.id),
128
+ disabled: submitted,
129
+ children: action.name
130
+ },
131
+ action.id
132
+ )) })
133
+ ] }) })
134
+ ] });
135
+ };
136
+
137
+ const SingleRecommendationCard = ({
138
+ recommendationId,
139
+ message,
140
+ options,
141
+ actions,
142
+ onSubmit,
143
+ submitted = false,
144
+ selected
145
+ }) => {
146
+ const [localSelectedValue, setLocalSelectedValue] = useState("");
147
+ const handleRadioChange = (value) => {
148
+ setLocalSelectedValue(value);
149
+ };
150
+ const handleSubmit = (id) => {
151
+ onSubmit({
152
+ sourceMessageId: recommendationId,
153
+ optionIds: localSelectedValue ? [localSelectedValue] : [],
154
+ actionId: id
155
+ });
156
+ };
157
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
158
+ /* @__PURE__ */ jsx(AtlasHeader, {}),
159
+ /* @__PURE__ */ jsx(Text, { size: "medium", children: message }),
160
+ /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
161
+ /* @__PURE__ */ jsx(RadioGroup, { children: options?.map((option) => /* @__PURE__ */ jsx(
162
+ Radio,
163
+ {
164
+ disabled: submitted,
165
+ name: "action",
166
+ value: option.id,
167
+ checked: !submitted ? localSelectedValue === option.id : selected?.includes(option.id ?? ""),
168
+ onChange: () => handleRadioChange(option.id),
169
+ label: option.label,
170
+ description: option.description ? /* @__PURE__ */ jsx(
171
+ Overflow.Text,
172
+ {
173
+ rows: 2,
174
+ expandable: true,
175
+ expandText: "Show more...",
176
+ collapseText: "Show less...",
177
+ children: option.description && /* @__PURE__ */ jsx(Text, { subdued: true, size: "small", children: option.description })
178
+ }
179
+ ) : void 0
180
+ },
181
+ option.id
182
+ )) }),
183
+ /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-start", gap: 2, children: actions?.map((action) => /* @__PURE__ */ jsx(
184
+ Button,
185
+ {
186
+ size: "medium",
187
+ appearance: action.type?.toLowerCase() ?? "primary",
188
+ onClick: () => handleSubmit(action.id),
189
+ disabled: submitted || !localSelectedValue,
190
+ children: action.name
191
+ },
192
+ action.id
193
+ )) })
194
+ ] }) })
195
+ ] });
196
+ };
197
+
198
+ export { ConfirmationCard as C, MultipleRecommendationCard as M, SingleRecommendationCard as S };
199
+ //# sourceMappingURL=single-recommendation-card-G78KiWnb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-recommendation-card-G78KiWnb.js","sources":["../src/components/recommendations/confirmation-card/confirmation-card.tsx","../src/components/recommendations/multiple-recommendation-card/multiple-recommendation-card.tsx","../src/components/recommendations/single-recommendation-card/single-recommendation-card.tsx"],"sourcesContent":["import { FC, useMemo } from \"react\";\nimport {\n Button,\n ButtonAppearance,\n Card,\n Flex,\n Link,\n Text,\n} from \"@servicetitan/anvil2\";\n\nimport {\n BaseRecommendationProps,\n ConfirmationResponse,\n RecommendationAction,\n} from \"../shared-interfaces\";\nimport { AtlasHeader } from \"../../atlas-header\";\n\nexport interface ConfirmationRecommendationProps extends BaseRecommendationProps {\n recommendationId?: string;\n message: string;\n description?: string;\n onSubmit: (confirmationResponse: ConfirmationResponse) => void;\n className?: string;\n}\n\nexport const ConfirmationCard: FC<ConfirmationRecommendationProps> = ({\n recommendationId,\n actions,\n message,\n onSubmit,\n description,\n className,\n submitted,\n}) => {\n const { buttonActions, linkActions } = useMemo(() => {\n const buttons: RecommendationAction[] = [];\n const links: RecommendationAction[] = [];\n\n actions.forEach((action) => {\n if (action.type?.toLowerCase() === \"link\") {\n links.push(action);\n } else {\n buttons.push(action);\n }\n });\n\n return { buttonActions: buttons, linkActions: links };\n }, [actions]);\n\n const handleSubmit = (action: RecommendationAction) => {\n onSubmit({\n sourceMessageId: recommendationId,\n optionIds: [],\n actionId: action.id,\n parameters: {\n url: action.url,\n },\n });\n };\n\n return (\n <Flex direction=\"column\" className={className}>\n <AtlasHeader />\n <Text size=\"medium\">{message}</Text>\n <Card>\n <Flex direction=\"column\" gap={3}>\n {description && <Text size=\"small\">{description}</Text>}\n <Flex alignItems=\"flex-start\" gap={1}>\n {buttonActions.map((action) => (\n <Button\n size=\"medium\"\n key={action.id}\n appearance={\n (action.type?.toLowerCase() as ButtonAppearance) ?? \"primary\"\n }\n onClick={() => handleSubmit(action)}\n disabled={submitted}\n >\n {action.name}\n </Button>\n ))}\n {linkActions.map((action) => (\n <Link\n quiet\n appearance=\"primary\"\n key={action.id}\n onClick={() => handleSubmit(action)}\n >\n {action.name}\n </Link>\n ))}\n </Flex>\n </Flex>\n </Card>\n </Flex>\n );\n};\n","import { FC, useState } from \"react\";\nimport {\n Button,\n ButtonAppearance,\n Card,\n Checkbox,\n Flex,\n Overflow,\n Text,\n} from \"@servicetitan/anvil2\";\n\nimport { BaseRecommendationProps, Options } from \"../shared-interfaces\";\nimport { AtlasHeader } from \"../../atlas-header\";\ninterface MultipleRecommendationProps extends BaseRecommendationProps {\n options: Options[];\n}\n\nexport const MultipleRecommendationCard: FC<MultipleRecommendationProps> = ({\n recommendationId,\n message,\n options,\n actions,\n onSubmit,\n submitted,\n selected,\n}) => {\n const [localSelectedValues, setLocalSelectedValues] = useState<string[]>([]);\n\n const handleCheckboxChange = (value: string, checked: boolean) => {\n if (checked) {\n setLocalSelectedValues((prev) => [...prev, value]);\n } else {\n setLocalSelectedValues((prev) => prev.filter((v) => v !== value));\n }\n };\n\n const handleSubmit = (id: string) => {\n onSubmit({\n sourceMessageId: recommendationId,\n optionIds: localSelectedValues,\n actionId: id,\n });\n };\n\n return (\n <Flex direction=\"column\">\n <AtlasHeader />\n <Text size=\"medium\">{message}</Text>\n <Card>\n <Flex direction=\"column\" gap={2}>\n {options?.map((option) => (\n <Checkbox\n disabled={submitted}\n name=\"action\"\n key={option.id}\n value={option.id}\n checked={\n !submitted\n ? localSelectedValues.includes(option.id ?? \"\")\n : selected?.includes(option.id)\n }\n onChange={(e) =>\n handleCheckboxChange(\n option.id ?? \"\",\n e?.target?.checked ?? false,\n )\n }\n label={option.label}\n description={\n option.description ? (\n <Overflow.Text\n rows={2}\n expandable\n expandText=\"Show more...\"\n collapseText=\"Show less...\"\n >\n {option.description && (\n <Text subdued size=\"small\">\n {option.description}\n </Text>\n )}\n </Overflow.Text>\n ) : undefined\n }\n />\n ))}\n <Flex justifyContent=\"flex-start\" gap={2}>\n {actions?.map((action) => (\n <Button\n size=\"medium\"\n key={action.id}\n appearance={\n (action.type?.toLowerCase() as ButtonAppearance) ?? \"primary\"\n }\n onClick={() => handleSubmit(action.id!)}\n disabled={submitted}\n >\n {action.name}\n </Button>\n ))}\n </Flex>\n </Flex>\n </Card>\n </Flex>\n );\n};\n","import { FC, useState } from \"react\";\nimport {\n Button,\n ButtonAppearance,\n Card,\n Flex,\n Overflow,\n Radio,\n RadioGroup,\n Text,\n} from \"@servicetitan/anvil2\";\n\nimport { BaseRecommendationProps, Options } from \"../shared-interfaces\";\nimport { AtlasHeader } from \"../../atlas-header\";\ninterface SingleRecommendationProps extends BaseRecommendationProps {\n options: Options[];\n}\n\nexport const SingleRecommendationCard: FC<SingleRecommendationProps> = ({\n recommendationId,\n message,\n options,\n actions,\n onSubmit,\n submitted = false,\n selected,\n}) => {\n const [localSelectedValue, setLocalSelectedValue] = useState<string>(\"\");\n\n const handleRadioChange = (value: string) => {\n setLocalSelectedValue(value);\n };\n\n const handleSubmit = (id: string) => {\n onSubmit({\n sourceMessageId: recommendationId,\n optionIds: localSelectedValue ? [localSelectedValue] : [],\n actionId: id,\n });\n };\n\n return (\n <Flex direction=\"column\">\n <AtlasHeader />\n <Text size=\"medium\">{message}</Text>\n <Card>\n <Flex direction=\"column\" gap={2}>\n <RadioGroup>\n {options?.map((option) => (\n <Radio\n disabled={submitted}\n key={option.id}\n name=\"action\"\n value={option.id}\n checked={\n !submitted\n ? localSelectedValue === option.id\n : selected?.includes(option.id ?? \"\")\n }\n onChange={() => handleRadioChange(option.id!)}\n label={option.label}\n description={\n option.description ? (\n <Overflow.Text\n rows={2}\n expandable\n expandText=\"Show more...\"\n collapseText=\"Show less...\"\n >\n {option.description && (\n <Text subdued size=\"small\">\n {option.description}\n </Text>\n )}\n </Overflow.Text>\n ) : undefined\n }\n />\n ))}\n </RadioGroup>\n <Flex justifyContent=\"flex-start\" gap={2}>\n {actions?.map((action) => (\n <Button\n size=\"medium\"\n key={action.id}\n appearance={\n (action.type?.toLowerCase() as ButtonAppearance) ?? \"primary\"\n }\n onClick={() => handleSubmit(action.id!)}\n disabled={submitted || !localSelectedValue}\n >\n {action.name}\n </Button>\n ))}\n </Flex>\n </Flex>\n </Card>\n </Flex>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Flex } from '@servicetitan/anvil2';
3
+
4
+ import './spinner.css';const loader = "_loader_yk7zm_1";
5
+ const styles = {
6
+ loader: loader};
7
+
8
+ const Spinner = () => {
9
+ return /* @__PURE__ */ jsx(
10
+ Flex,
11
+ {
12
+ role: "status",
13
+ "aria-label": "Loading content",
14
+ alignItems: "center",
15
+ justifyContent: "center",
16
+ grow: 1,
17
+ children: /* @__PURE__ */ jsx("span", { className: styles["loader"] })
18
+ }
19
+ );
20
+ };
21
+
22
+ export { Spinner as S };
23
+ //# sourceMappingURL=spinner-QnlThoJs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-QnlThoJs.js","sources":["../src/components/spinner/spinner.tsx"],"sourcesContent":["import { Flex } from \"@servicetitan/anvil2\";\n\nimport styles from \"./spinner.module.scss\";\n\nexport const Spinner = () => {\n return (\n <Flex\n role=\"status\"\n aria-label=\"Loading content\"\n alignItems=\"center\"\n justifyContent=\"center\"\n grow={1}\n >\n <span className={styles[\"loader\"]} />\n </Flex>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAIO,MAAM,UAAU,MAAM;AAC3B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,iBAAA;AAAA,MACX,UAAA,EAAW,QAAA;AAAA,MACX,cAAA,EAAe,QAAA;AAAA,MACf,IAAA,EAAM,CAAA;AAAA,MAEN,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,EAAG;AAAA;AAAA,GACrC;AAEJ;;;;"}
@@ -0,0 +1,21 @@
1
+ @layer starter, reset, base, state, application;
2
+
3
+ ._loader_yk7zm_1 {
4
+ width: 48px;
5
+ height: 48px;
6
+ border: 5px solid var(--color-cyan-400);
7
+ border-bottom-color: transparent;
8
+ border-radius: var(--border-radius-circular);
9
+ display: inline-block;
10
+ box-sizing: border-box;
11
+ animation: _rotation_yk7zm_1 1s linear infinite;
12
+ }
13
+
14
+ @keyframes _rotation_yk7zm_1 {
15
+ 0% {
16
+ transform: rotate(0deg);
17
+ }
18
+ 100% {
19
+ transform: rotate(360deg);
20
+ }
21
+ }
@@ -0,0 +1,2 @@
1
+ export * from './components/spinner/index'
2
+ export {}
@@ -0,0 +1,2 @@
1
+ export { S as Spinner } from './spinner-QnlThoJs.js';
2
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { ButtonCompound, Card, Text, Flex } from '@servicetitan/anvil2';
3
+
4
+ const Suggestion = ({ text, onClick }) => {
5
+ return /* @__PURE__ */ jsx(ButtonCompound, { onClick: () => onClick(text), children: /* @__PURE__ */ jsx(Card, { padding: "small", children: /* @__PURE__ */ jsx(Text, { variant: "body", size: "small", children: text }) }) });
6
+ };
7
+ const SuggestionList = ({ suggestions, onSelect }) => {
8
+ if (suggestions?.length === 0) {
9
+ return null;
10
+ }
11
+ return /* @__PURE__ */ jsx(
12
+ Flex,
13
+ {
14
+ gap: 1,
15
+ style: {
16
+ flexWrap: "wrap",
17
+ paddingInline: "var(--size-4)",
18
+ paddingBlockStart: "var(--size-1)"
19
+ },
20
+ children: suggestions.map((suggestion) => /* @__PURE__ */ jsx(
21
+ Suggestion,
22
+ {
23
+ text: suggestion,
24
+ onClick: () => onSelect(suggestion)
25
+ },
26
+ suggestion
27
+ ))
28
+ }
29
+ );
30
+ };
31
+
32
+ export { Suggestion as S, SuggestionList as a };
33
+ //# sourceMappingURL=suggestion-pJLJZyjg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestion-pJLJZyjg.js","sources":["../src/components/suggestion/suggestion.tsx"],"sourcesContent":["import { FC } from \"react\";\nimport { ButtonCompound, Card, Flex, Text } from \"@servicetitan/anvil2\";\n\ninterface SuggestionProps {\n text: string;\n onClick: (suggestion: string) => void;\n}\n\nexport const Suggestion: FC<SuggestionProps> = ({ text, onClick }) => {\n return (\n <ButtonCompound onClick={() => onClick(text)}>\n <Card padding=\"small\">\n <Text variant=\"body\" size=\"small\">\n {text}\n </Text>\n </Card>\n </ButtonCompound>\n );\n};\n\nexport const SuggestionList: FC<{\n suggestions: string[];\n onSelect: (text: string) => void;\n}> = ({ suggestions, onSelect }) => {\n if (suggestions?.length === 0) {\n return null;\n }\n\n return (\n <Flex\n gap={1}\n style={{\n flexWrap: \"wrap\",\n paddingInline: \"var(--size-4)\",\n paddingBlockStart: \"var(--size-1)\",\n }}\n >\n {suggestions.map((suggestion) => (\n <Suggestion\n key={suggestion}\n text={suggestion}\n onClick={() => onSelect(suggestion)}\n />\n ))}\n </Flex>\n );\n};\n"],"names":[],"mappings":";;;AAQO,MAAM,UAAA,GAAkC,CAAC,EAAE,IAAA,EAAM,SAAQ,KAAM;AACpE,EAAA,2BACG,cAAA,EAAA,EAAe,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,GACzC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAQ,OAAA,EACZ,QAAA,kBAAA,GAAA,CAAC,QAAK,OAAA,EAAQ,MAAA,EAAO,MAAK,OAAA,EACvB,QAAA,EAAA,IAAA,EACH,GACF,CAAA,EACF,CAAA;AAEJ;AAEO,MAAM,cAAA,GAGR,CAAC,EAAE,WAAA,EAAa,UAAS,KAAM;AAClC,EAAA,IAAI,WAAA,EAAa,WAAW,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAA;AAAA,MACL,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,MAAA;AAAA,QACV,aAAA,EAAe,eAAA;AAAA,QACf,iBAAA,EAAmB;AAAA,OACrB;AAAA,MAEC,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,qBAChB,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAM,UAAA;AAAA,UACN,OAAA,EAAS,MAAM,QAAA,CAAS,UAAU;AAAA,SAAA;AAAA,QAF7B;AAAA,OAIR;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -0,0 +1,2 @@
1
+ export * from './components/suggestion/index'
2
+ export {}
@@ -0,0 +1,2 @@
1
+ export { S as Suggestion, a as SuggestionList } from './suggestion-pJLJZyjg.js';
2
+ //# sourceMappingURL=suggestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestion.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,272 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { useState, useCallback } from 'react';
4
+ import { Flex, Tooltip, Button, Text } from '@servicetitan/anvil2';
5
+
6
+ const SvgRefresh = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M17.65 6.35a7.95 7.95 0 0 0-6.48-2.31c-3.67.37-6.69 3.35-7.1 7.02C3.52 15.91 7.27 20 12 20a7.98 7.98 0 0 0 7.21-4.56c.32-.67-.16-1.44-.9-1.44-.37 0-.72.2-.88.53a5.994 5.994 0 0 1-6.8 3.31c-2.22-.49-4.01-2.3-4.48-4.52A6.002 6.002 0 0 1 12 6c1.66 0 3.14.69 4.22 1.78l-1.51 1.51c-.63.63-.19 1.71.7 1.71H19c.55 0 1-.45 1-1V6.41c0-.89-1.08-1.34-1.71-.71l-.64.65z" }));
7
+
8
+ const SvgCheck = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M9 16.17 5.53 12.7a.996.996 0 1 0-1.41 1.41l4.18 4.18c.39.39 1.02.39 1.41 0L20.29 7.71a.996.996 0 1 0-1.41-1.41L9 16.17z" }));
9
+
10
+ const SvgContentCopy = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M15 20H5V7c0-.55-.45-1-1-1s-1 .45-1 1v13c0 1.1.9 2 2 2h10c.55 0 1-.45 1-1s-.45-1-1-1zm5-4V4c0-1.1-.9-2-2-2H9c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h9c1.1 0 2-.9 2-2zm-2 0H9V4h9v12z" }));
11
+
12
+ const SvgError = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 11c-.55 0-1-.45-1-1V8c0-.55.45-1 1-1s1 .45 1 1v4c0 .55-.45 1-1 1zm1 4h-2v-2h2v2z" }));
13
+
14
+ const SvgOutlinedFlag = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "m14 6-.72-1.45c-.17-.34-.52-.55-.9-.55H6c-.55 0-1 .45-1 1v15c0 .55.45 1 1 1s1-.45 1-1v-6h5l.72 1.45a1 1 0 0 0 .89.55H19c.55 0 1-.45 1-1V7c0-.55-.45-1-1-1h-5zm4 8h-4l-1-2H7V6h5l1 2h5v6z" }));
15
+
16
+ const SvgStopCircle = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm3 14H9c-.55 0-1-.45-1-1V9c0-.55.45-1 1-1h6c.55 0 1 .45 1 1v6c0 .55-.45 1-1 1z" }));
17
+
18
+ const SvgVolumeDown = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M18.5 12A4.5 4.5 0 0 0 16 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 10v4c0 .55.45 1 1 1h3l3.29 3.29c.63.63 1.71.18 1.71-.71V6.41c0-.89-1.08-1.34-1.71-.71L9 9H6c-.55 0-1 .45-1 1z" }));
19
+
20
+ const SvgResponseDislike = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M14.99 4.62H6c-.8 0-1.52.48-1.83 1.21L.91 13.44c-.85 1.98.6 4.18 2.75 4.18h5.65l-.95 4.58c-.1.5.05 1.01.41 1.37.29.29.67.43 1.05.43s.77-.15 1.06-.44l5.53-5.54c.37-.37.58-.88.58-1.41V6.62c0-1.1-.9-2-2-2m-4.33 16.33.61-2.92.5-2.41H3.66c-.47 0-.72-.28-.83-.45a.97.97 0 0 1-.08-.95L6 6.62h8.99v9.99zm8.285-15.184.02-.206a1.013 1.013 0 0 1 1.984 0l.02.206v10.492a1.012 1.012 0 1 1-2.024 0z" }));
21
+
22
+ const SvgResponseDisliked = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M14.99 4.62H6c-.8 0-1.52.48-1.83 1.21L.91 13.44c-.85 1.98.6 4.18 2.75 4.18h5.65l-.95 4.58c-.1.5.05 1.01.41 1.37.29.29.67.43 1.05.43s.77-.15 1.06-.44l5.53-5.54c.37-.37.58-.88.58-1.41V6.62c0-1.1-.9-2-2-2m3.955 1.146.02-.206a1.013 1.013 0 0 1 1.984 0l.02.206v10.492a1.012 1.012 0 1 1-2.024 0z" }));
23
+
24
+ const SvgResponseLike = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M6.753 21.684h8.99c.8 0 1.52-.48 1.83-1.21l3.26-7.61c.85-1.98-.6-4.18-2.75-4.18h-5.65l.95-4.58c.1-.5-.05-1.01-.41-1.37-.29-.29-.67-.43-1.05-.43s-.77.15-1.06.44l-5.53 5.54c-.37.37-.58.88-.58 1.41v9.99c0 1.1.9 2 2 2m4.33-16.33-.61 2.92-.5 2.41h8.11c.47 0 .72.28.83.45a.97.97 0 0 1 .08.95l-3.25 7.6h-8.99v-9.99zM2.799 20.682l-.02.205a1.013 1.013 0 0 1-1.984 0l-.02-.205V10.19a1.012 1.012 0 1 1 2.024 0z" }));
25
+
26
+ const SvgResponseLiked = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M6.753 21.684h8.99c.8 0 1.52-.48 1.83-1.21l3.26-7.61c.85-1.98-.6-4.18-2.75-4.18h-5.65l.95-4.58c.1-.5-.05-1.01-.41-1.37-.29-.29-.67-.43-1.05-.43s-.77.15-1.06.44l-5.53 5.54c-.37.37-.58.88-.58 1.41v9.99c0 1.1.9 2 2 2m-3.954-1.002-.02.205a1.013 1.013 0 0 1-1.984 0l-.02-.205V10.19a1.012 1.012 0 1 1 2.024 0z" }));
27
+
28
+ var UserFeedback = /* @__PURE__ */ ((UserFeedback2) => {
29
+ UserFeedback2["None"] = "None";
30
+ UserFeedback2["Positive"] = "Positive";
31
+ UserFeedback2["Negative"] = "Negative";
32
+ return UserFeedback2;
33
+ })(UserFeedback || {});
34
+
35
+ const copy = {
36
+ icons: {
37
+ [0 /* None */]: SvgContentCopy,
38
+ [1 /* Loading */]: SvgContentCopy,
39
+ [2 /* Success */]: SvgCheck,
40
+ [3 /* Error */]: SvgError
41
+ },
42
+ tooltips: {
43
+ [0 /* None */]: "Copy response",
44
+ [1 /* Loading */]: "Copying...",
45
+ [2 /* Success */]: "Response copied",
46
+ [3 /* Error */]: "Copy failed"
47
+ }
48
+ };
49
+ const play = {
50
+ icons: {
51
+ [0 /* None */]: SvgVolumeDown,
52
+ [1 /* Loading */]: SvgVolumeDown,
53
+ [2 /* Success */]: SvgStopCircle,
54
+ [3 /* Error */]: SvgError
55
+ },
56
+ tooltips: {
57
+ [0 /* None */]: "Play response",
58
+ [1 /* Loading */]: "Starting playback...",
59
+ [2 /* Success */]: "Stop playing",
60
+ [3 /* Error */]: "Error playing response"
61
+ }
62
+ };
63
+ const retry = {
64
+ icons: {
65
+ [0 /* None */]: SvgRefresh,
66
+ [1 /* Loading */]: SvgRefresh,
67
+ [2 /* Success */]: SvgRefresh,
68
+ [3 /* Error */]: SvgRefresh
69
+ },
70
+ tooltips: {
71
+ [0 /* None */]: "Retry response",
72
+ [1 /* Loading */]: "Retrying...",
73
+ [2 /* Success */]: "Retry successful",
74
+ [3 /* Error */]: "Retry failed"
75
+ }
76
+ };
77
+ const flag = {
78
+ icons: {
79
+ [0 /* None */]: SvgOutlinedFlag,
80
+ [1 /* Loading */]: SvgOutlinedFlag,
81
+ [2 /* Success */]: SvgOutlinedFlag,
82
+ [3 /* Error */]: SvgOutlinedFlag
83
+ },
84
+ tooltips: {
85
+ [0 /* None */]: "Flag response",
86
+ [1 /* Loading */]: "Flagging...",
87
+ [2 /* Success */]: "Flagged successfully",
88
+ [3 /* Error */]: "Flag failed"
89
+ }
90
+ };
91
+ const Toolbox = ({
92
+ text,
93
+ onRetry,
94
+ onLike,
95
+ onDislike,
96
+ onFlag,
97
+ onPlay,
98
+ currentFeedback
99
+ }) => {
100
+ const [isCopied, setIsCopied] = useState(0 /* None */);
101
+ const [isSpeaking, setIsSpeaking] = useState(0 /* None */);
102
+ const [isRetrying, setIsRetrying] = useState(0 /* None */);
103
+ const [isFlagging, setIsFlagging] = useState(0 /* None */);
104
+ const handleCopy = useCallback(async () => {
105
+ if (!text) {
106
+ return;
107
+ }
108
+ try {
109
+ setIsCopied(1 /* Loading */);
110
+ await window.navigator.clipboard.writeText(text);
111
+ setIsCopied(2 /* Success */);
112
+ } catch {
113
+ setIsCopied(3 /* Error */);
114
+ } finally {
115
+ setTimeout(() => {
116
+ setIsCopied(0 /* None */);
117
+ }, 3e3);
118
+ }
119
+ }, [text]);
120
+ const handlePlay = useCallback(async () => {
121
+ if (!onPlay) {
122
+ return;
123
+ }
124
+ try {
125
+ setIsSpeaking(1 /* Loading */);
126
+ await onPlay();
127
+ setIsSpeaking(2 /* Success */);
128
+ setTimeout(() => {
129
+ setIsSpeaking(0 /* None */);
130
+ }, 1e3);
131
+ } catch {
132
+ setIsSpeaking(3 /* Error */);
133
+ setTimeout(() => {
134
+ setIsSpeaking(0 /* None */);
135
+ }, 3e3);
136
+ }
137
+ }, [onPlay]);
138
+ const handleRetry = useCallback(async () => {
139
+ if (!onRetry) {
140
+ return;
141
+ }
142
+ try {
143
+ setIsRetrying(1 /* Loading */);
144
+ await onRetry();
145
+ setIsRetrying(2 /* Success */);
146
+ } catch {
147
+ setIsRetrying(3 /* Error */);
148
+ }
149
+ }, [onRetry]);
150
+ const handleLike = useCallback(async () => {
151
+ if (!onLike) {
152
+ return;
153
+ }
154
+ try {
155
+ await onLike();
156
+ } catch {
157
+ }
158
+ }, [onLike]);
159
+ const handleDislike = useCallback(async () => {
160
+ if (!onDislike) {
161
+ return;
162
+ }
163
+ try {
164
+ await onDislike();
165
+ } catch {
166
+ }
167
+ }, [onDislike]);
168
+ const handleFlag = useCallback(async () => {
169
+ if (!onFlag) {
170
+ return;
171
+ }
172
+ try {
173
+ setIsFlagging(1 /* Loading */);
174
+ await onFlag();
175
+ setIsFlagging(2 /* Success */);
176
+ setTimeout(() => {
177
+ setIsFlagging(0 /* None */);
178
+ }, 3e3);
179
+ } catch {
180
+ setIsFlagging(3 /* Error */);
181
+ setTimeout(() => {
182
+ setIsFlagging(0 /* None */);
183
+ }, 3e3);
184
+ }
185
+ }, [onFlag]);
186
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
187
+ /* @__PURE__ */ jsxs(Flex, { children: [
188
+ /* @__PURE__ */ jsxs(Tooltip, { children: [
189
+ /* @__PURE__ */ jsx(Tooltip.Trigger, { children: /* @__PURE__ */ jsx(
190
+ Button,
191
+ {
192
+ icon: copy.icons[isCopied],
193
+ size: "small",
194
+ appearance: "ghost",
195
+ onClick: handleCopy,
196
+ disabled: !text
197
+ }
198
+ ) }),
199
+ /* @__PURE__ */ jsx(Tooltip.Content, { children: copy.tooltips[isCopied] })
200
+ ] }),
201
+ onPlay && /* @__PURE__ */ jsxs(Tooltip, { children: [
202
+ /* @__PURE__ */ jsx(Tooltip.Trigger, { children: /* @__PURE__ */ jsx(
203
+ Button,
204
+ {
205
+ size: "small",
206
+ appearance: "ghost",
207
+ icon: play.icons[isSpeaking],
208
+ onClick: handlePlay,
209
+ disabled: !onPlay
210
+ }
211
+ ) }),
212
+ /* @__PURE__ */ jsx(Tooltip.Content, { children: play.tooltips[isSpeaking] })
213
+ ] }),
214
+ onRetry && /* @__PURE__ */ jsxs(Tooltip, { children: [
215
+ /* @__PURE__ */ jsx(Tooltip.Trigger, { children: /* @__PURE__ */ jsx(
216
+ Button,
217
+ {
218
+ icon: retry.icons[isRetrying],
219
+ size: "small",
220
+ appearance: "ghost",
221
+ onClick: handleRetry,
222
+ disabled: !onRetry
223
+ }
224
+ ) }),
225
+ /* @__PURE__ */ jsx(Tooltip.Content, { children: retry.tooltips[isRetrying] })
226
+ ] }),
227
+ currentFeedback !== UserFeedback.Negative && /* @__PURE__ */ jsxs(Tooltip, { children: [
228
+ /* @__PURE__ */ jsx(Tooltip.Trigger, { children: /* @__PURE__ */ jsx(
229
+ Button,
230
+ {
231
+ icon: currentFeedback === UserFeedback.Positive ? SvgResponseLiked : SvgResponseLike,
232
+ size: "small",
233
+ appearance: "ghost",
234
+ onClick: handleLike,
235
+ disabled: !onLike
236
+ }
237
+ ) }),
238
+ /* @__PURE__ */ jsx(Tooltip.Content, { children: currentFeedback === UserFeedback.Positive ? "Remove like" : "Like response" })
239
+ ] }),
240
+ currentFeedback !== UserFeedback.Positive && /* @__PURE__ */ jsxs(Tooltip, { children: [
241
+ /* @__PURE__ */ jsx(Tooltip.Trigger, { children: /* @__PURE__ */ jsx(
242
+ Button,
243
+ {
244
+ icon: currentFeedback === UserFeedback.Negative ? SvgResponseDisliked : SvgResponseDislike,
245
+ size: "small",
246
+ appearance: "ghost",
247
+ onClick: handleDislike,
248
+ disabled: !onDislike
249
+ }
250
+ ) }),
251
+ /* @__PURE__ */ jsx(Tooltip.Content, { children: currentFeedback === UserFeedback.Negative ? "Remove dislike" : "Dislike response" })
252
+ ] }),
253
+ onFlag && /* @__PURE__ */ jsxs(Tooltip, { children: [
254
+ /* @__PURE__ */ jsx(Tooltip.Trigger, { children: /* @__PURE__ */ jsx(
255
+ Button,
256
+ {
257
+ icon: flag.icons[isFlagging],
258
+ size: "small",
259
+ appearance: "ghost",
260
+ onClick: handleFlag,
261
+ disabled: !onFlag
262
+ }
263
+ ) }),
264
+ /* @__PURE__ */ jsx(Tooltip.Content, { children: flag.tooltips[isFlagging] })
265
+ ] })
266
+ ] }),
267
+ currentFeedback !== UserFeedback.None && /* @__PURE__ */ jsx(Text, { subdued: true, size: "small", children: "Thank you for your feedback!" })
268
+ ] });
269
+ };
270
+
271
+ export { SvgRefresh as S, Toolbox as T, UserFeedback as U };
272
+ //# sourceMappingURL=toolbox-B-mWIaVL.js.map