@bikdotai/bik-component-library 0.0.868-beta.6 → 0.0.868-beta.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 (209) hide show
  1. package/README.md +3 -0
  2. package/dist/cjs/components/chip-selector/ChipSelector.js +2 -0
  3. package/dist/cjs/components/chip-selector/ChipSelector.js.map +1 -0
  4. package/dist/cjs/components/chip-selector/ChipSelector.styled.js +36 -0
  5. package/dist/cjs/components/chip-selector/ChipSelector.styled.js.map +1 -0
  6. package/dist/cjs/components/chip-selector/ChipSelectorGroup.js +2 -0
  7. package/dist/cjs/components/chip-selector/ChipSelectorGroup.js.map +1 -0
  8. package/dist/cjs/components/combo-box/ComboBox.js +2 -0
  9. package/dist/cjs/components/combo-box/ComboBox.js.map +1 -0
  10. package/dist/cjs/components/combo-box/ComboBox.styled.js +33 -0
  11. package/dist/cjs/components/combo-box/ComboBox.styled.js.map +1 -0
  12. package/dist/cjs/components/datePicker/DatePickerWrapper.js +1 -1
  13. package/dist/cjs/components/datePicker/DatePickerWrapper.js.map +1 -1
  14. package/dist/cjs/components/schedule-builder/RefreshSegmentToggle.js +2 -0
  15. package/dist/cjs/components/schedule-builder/RefreshSegmentToggle.js.map +1 -0
  16. package/dist/cjs/components/schedule-builder/ScheduleBuilder.js +2 -0
  17. package/dist/cjs/components/schedule-builder/ScheduleBuilder.js.map +1 -0
  18. package/dist/cjs/components/schedule-builder/ScheduleBuilder.styled.js +138 -0
  19. package/dist/cjs/components/schedule-builder/ScheduleBuilder.styled.js.map +1 -0
  20. package/dist/cjs/components/schedule-builder/ScheduleEndPicker.js +2 -0
  21. package/dist/cjs/components/schedule-builder/ScheduleEndPicker.js.map +1 -0
  22. package/dist/cjs/components/schedule-builder/ScheduleFrequencyPicker.js +2 -0
  23. package/dist/cjs/components/schedule-builder/ScheduleFrequencyPicker.js.map +1 -0
  24. package/dist/cjs/components/schedule-builder/ScheduleHelper.js +2 -0
  25. package/dist/cjs/components/schedule-builder/ScheduleHelper.js.map +1 -0
  26. package/dist/cjs/components/schedule-builder/SendModeSelector.js +2 -0
  27. package/dist/cjs/components/schedule-builder/SendModeSelector.js.map +1 -0
  28. package/dist/cjs/components/schedule-builder/StartDateTimePicker.js +2 -0
  29. package/dist/cjs/components/schedule-builder/StartDateTimePicker.js.map +1 -0
  30. package/dist/cjs/components/schedule-builder/UpcomingRunsPreview.js +2 -0
  31. package/dist/cjs/components/schedule-builder/UpcomingRunsPreview.js.map +1 -0
  32. package/dist/cjs/components/schedule-builder/model.js +2 -0
  33. package/dist/cjs/components/schedule-builder/model.js.map +1 -0
  34. package/dist/cjs/index.js +1 -1
  35. package/dist/esm/components/chip-selector/ChipSelector.d.ts +9 -0
  36. package/dist/esm/components/chip-selector/ChipSelector.js +27 -0
  37. package/dist/esm/components/chip-selector/ChipSelector.js.map +1 -0
  38. package/dist/esm/components/chip-selector/ChipSelector.styled.d.ts +10 -0
  39. package/dist/esm/components/chip-selector/ChipSelector.styled.js +48 -0
  40. package/dist/esm/components/chip-selector/ChipSelector.styled.js.map +1 -0
  41. package/dist/esm/components/chip-selector/ChipSelectorGroup.d.ts +10 -0
  42. package/dist/esm/components/chip-selector/ChipSelectorGroup.js +48 -0
  43. package/dist/esm/components/chip-selector/ChipSelectorGroup.js.map +1 -0
  44. package/dist/esm/components/chip-selector/index.d.ts +4 -0
  45. package/dist/esm/components/chip-selector/model.d.ts +106 -0
  46. package/dist/esm/components/combo-box/ComboBox.d.ts +15 -0
  47. package/dist/esm/components/combo-box/ComboBox.js +118 -0
  48. package/dist/esm/components/combo-box/ComboBox.js.map +1 -0
  49. package/dist/esm/components/combo-box/ComboBox.styled.d.ts +12 -0
  50. package/dist/esm/components/combo-box/ComboBox.styled.js +40 -0
  51. package/dist/esm/components/combo-box/ComboBox.styled.js.map +1 -0
  52. package/dist/esm/components/combo-box/index.d.ts +3 -0
  53. package/dist/esm/components/combo-box/model.d.ts +55 -0
  54. package/dist/esm/components/datePicker/DatePickerWrapper.d.ts +7 -0
  55. package/dist/esm/components/datePicker/DatePickerWrapper.js +66 -64
  56. package/dist/esm/components/datePicker/DatePickerWrapper.js.map +1 -1
  57. package/dist/esm/components/datePicker/index.d.ts +1 -0
  58. package/dist/esm/components/schedule-builder/RefreshSegmentToggle.d.ts +22 -0
  59. package/dist/esm/components/schedule-builder/RefreshSegmentToggle.js +31 -0
  60. package/dist/esm/components/schedule-builder/RefreshSegmentToggle.js.map +1 -0
  61. package/dist/esm/components/schedule-builder/ScheduleBuilder.d.ts +88 -0
  62. package/dist/esm/components/schedule-builder/ScheduleBuilder.js +105 -0
  63. package/dist/esm/components/schedule-builder/ScheduleBuilder.js.map +1 -0
  64. package/dist/esm/components/schedule-builder/ScheduleBuilder.styled.d.ts +81 -0
  65. package/dist/esm/components/schedule-builder/ScheduleBuilder.styled.js +168 -0
  66. package/dist/esm/components/schedule-builder/ScheduleBuilder.styled.js.map +1 -0
  67. package/dist/esm/components/schedule-builder/ScheduleEndPicker.d.ts +17 -0
  68. package/dist/esm/components/schedule-builder/ScheduleEndPicker.js +105 -0
  69. package/dist/esm/components/schedule-builder/ScheduleEndPicker.js.map +1 -0
  70. package/dist/esm/components/schedule-builder/ScheduleFrequencyPicker.d.ts +21 -0
  71. package/dist/esm/components/schedule-builder/ScheduleFrequencyPicker.js +136 -0
  72. package/dist/esm/components/schedule-builder/ScheduleFrequencyPicker.js.map +1 -0
  73. package/dist/esm/components/schedule-builder/ScheduleHelper.d.ts +110 -0
  74. package/dist/esm/components/schedule-builder/ScheduleHelper.js +196 -0
  75. package/dist/esm/components/schedule-builder/ScheduleHelper.js.map +1 -0
  76. package/dist/esm/components/schedule-builder/SendModeSelector.d.ts +29 -0
  77. package/dist/esm/components/schedule-builder/SendModeSelector.js +41 -0
  78. package/dist/esm/components/schedule-builder/SendModeSelector.js.map +1 -0
  79. package/dist/esm/components/schedule-builder/StartDateTimePicker.d.ts +44 -0
  80. package/dist/esm/components/schedule-builder/StartDateTimePicker.js +119 -0
  81. package/dist/esm/components/schedule-builder/StartDateTimePicker.js.map +1 -0
  82. package/dist/esm/components/schedule-builder/UpcomingRunsPreview.d.ts +19 -0
  83. package/dist/esm/components/schedule-builder/UpcomingRunsPreview.js +44 -0
  84. package/dist/esm/components/schedule-builder/UpcomingRunsPreview.js.map +1 -0
  85. package/dist/esm/components/schedule-builder/index.d.ts +17 -0
  86. package/dist/esm/components/schedule-builder/model.d.ts +69 -0
  87. package/dist/esm/components/schedule-builder/model.js +8 -0
  88. package/dist/esm/components/schedule-builder/model.js.map +1 -0
  89. package/dist/esm/index.d.ts +3 -1
  90. package/dist/esm/index.js +809 -827
  91. package/dist/esm/index.js.map +1 -1
  92. package/package.json +1 -1
  93. package/dist/cjs/components/bik-copilot/BIKCopilot.js +0 -2
  94. package/dist/cjs/components/bik-copilot/BIKCopilot.js.map +0 -1
  95. package/dist/cjs/components/bik-copilot/ControlledCopilot.js +0 -2
  96. package/dist/cjs/components/bik-copilot/ControlledCopilot.js.map +0 -1
  97. package/dist/cjs/components/bik-copilot/ControlledCopilot.styled.js +0 -27
  98. package/dist/cjs/components/bik-copilot/ControlledCopilot.styled.js.map +0 -1
  99. package/dist/cjs/components/bik-copilot/CopilotBall.js +0 -2
  100. package/dist/cjs/components/bik-copilot/CopilotBall.js.map +0 -1
  101. package/dist/cjs/components/bik-copilot/CopilotBall.styled.js +0 -42
  102. package/dist/cjs/components/bik-copilot/CopilotBall.styled.js.map +0 -1
  103. package/dist/cjs/components/bik-copilot/CopilotFeedbackModal.js +0 -2
  104. package/dist/cjs/components/bik-copilot/CopilotFeedbackModal.js.map +0 -1
  105. package/dist/cjs/components/bik-copilot/CopilotFeedbackModal.styled.js +0 -108
  106. package/dist/cjs/components/bik-copilot/CopilotFeedbackModal.styled.js.map +0 -1
  107. package/dist/cjs/components/bik-copilot/CopilotPanel.js +0 -2
  108. package/dist/cjs/components/bik-copilot/CopilotPanel.js.map +0 -1
  109. package/dist/cjs/components/bik-copilot/CopilotPanel.styled.js +0 -534
  110. package/dist/cjs/components/bik-copilot/CopilotPanel.styled.js.map +0 -1
  111. package/dist/cjs/components/bik-copilot/copilotPlacement.js +0 -2
  112. package/dist/cjs/components/bik-copilot/copilotPlacement.js.map +0 -1
  113. package/dist/cjs/components/bik-copilot/copilotRegenerate.js +0 -2
  114. package/dist/cjs/components/bik-copilot/copilotRegenerate.js.map +0 -1
  115. package/dist/cjs/components/bik-copilot/services/copilotDb.js +0 -2
  116. package/dist/cjs/components/bik-copilot/services/copilotDb.js.map +0 -1
  117. package/dist/cjs/components/bik-copilot/services/copilotFeedbackClient.js +0 -2
  118. package/dist/cjs/components/bik-copilot/services/copilotFeedbackClient.js.map +0 -1
  119. package/dist/cjs/components/bik-copilot/services/copilotIcebreakersClient.js +0 -2
  120. package/dist/cjs/components/bik-copilot/services/copilotIcebreakersClient.js.map +0 -1
  121. package/dist/cjs/components/bik-copilot/services/copilotMessagesClient.js +0 -2
  122. package/dist/cjs/components/bik-copilot/services/copilotMessagesClient.js.map +0 -1
  123. package/dist/cjs/components/bik-copilot/services/copilotPageSession.js +0 -2
  124. package/dist/cjs/components/bik-copilot/services/copilotPageSession.js.map +0 -1
  125. package/dist/cjs/components/bik-copilot/services/copilotSseParser.js +0 -7
  126. package/dist/cjs/components/bik-copilot/services/copilotSseParser.js.map +0 -1
  127. package/dist/cjs/components/bik-copilot/services/copilotStreamClient.js +0 -2
  128. package/dist/cjs/components/bik-copilot/services/copilotStreamClient.js.map +0 -1
  129. package/dist/cjs/components/bik-copilot/useCopilotIcebreakers.js +0 -2
  130. package/dist/cjs/components/bik-copilot/useCopilotIcebreakers.js.map +0 -1
  131. package/dist/cjs/components/bik-copilot/useCopilotStreamChat.js +0 -2
  132. package/dist/cjs/components/bik-copilot/useCopilotStreamChat.js.map +0 -1
  133. package/dist/cjs/components/bik-copilot/useDraggableFloater.js +0 -2
  134. package/dist/cjs/components/bik-copilot/useDraggableFloater.js.map +0 -1
  135. package/dist/cjs/components/bik-copilot/utils/markdown.js +0 -4
  136. package/dist/cjs/components/bik-copilot/utils/markdown.js.map +0 -1
  137. package/dist/cjs/components/bik-copilot/utils/toolCtas.js +0 -2
  138. package/dist/cjs/components/bik-copilot/utils/toolCtas.js.map +0 -1
  139. package/dist/esm/components/bik-copilot/BIKCopilot.d.ts +0 -31
  140. package/dist/esm/components/bik-copilot/BIKCopilot.js +0 -118
  141. package/dist/esm/components/bik-copilot/BIKCopilot.js.map +0 -1
  142. package/dist/esm/components/bik-copilot/ControlledCopilot.d.ts +0 -14
  143. package/dist/esm/components/bik-copilot/ControlledCopilot.js +0 -174
  144. package/dist/esm/components/bik-copilot/ControlledCopilot.js.map +0 -1
  145. package/dist/esm/components/bik-copilot/ControlledCopilot.styled.d.ts +0 -7
  146. package/dist/esm/components/bik-copilot/ControlledCopilot.styled.js +0 -31
  147. package/dist/esm/components/bik-copilot/ControlledCopilot.styled.js.map +0 -1
  148. package/dist/esm/components/bik-copilot/CopilotBall.d.ts +0 -13
  149. package/dist/esm/components/bik-copilot/CopilotBall.js +0 -50
  150. package/dist/esm/components/bik-copilot/CopilotBall.js.map +0 -1
  151. package/dist/esm/components/bik-copilot/CopilotBall.styled.d.ts +0 -9
  152. package/dist/esm/components/bik-copilot/CopilotBall.styled.js +0 -46
  153. package/dist/esm/components/bik-copilot/CopilotBall.styled.js.map +0 -1
  154. package/dist/esm/components/bik-copilot/CopilotFeedbackModal.d.ts +0 -29
  155. package/dist/esm/components/bik-copilot/CopilotFeedbackModal.js +0 -73
  156. package/dist/esm/components/bik-copilot/CopilotFeedbackModal.js.map +0 -1
  157. package/dist/esm/components/bik-copilot/CopilotFeedbackModal.styled.d.ts +0 -12
  158. package/dist/esm/components/bik-copilot/CopilotFeedbackModal.styled.js +0 -122
  159. package/dist/esm/components/bik-copilot/CopilotFeedbackModal.styled.js.map +0 -1
  160. package/dist/esm/components/bik-copilot/CopilotPanel.d.ts +0 -9
  161. package/dist/esm/components/bik-copilot/CopilotPanel.js +0 -536
  162. package/dist/esm/components/bik-copilot/CopilotPanel.js.map +0 -1
  163. package/dist/esm/components/bik-copilot/CopilotPanel.styled.d.ts +0 -67
  164. package/dist/esm/components/bik-copilot/CopilotPanel.styled.js +0 -573
  165. package/dist/esm/components/bik-copilot/CopilotPanel.styled.js.map +0 -1
  166. package/dist/esm/components/bik-copilot/copilotPlacement.d.ts +0 -24
  167. package/dist/esm/components/bik-copilot/copilotPlacement.js +0 -38
  168. package/dist/esm/components/bik-copilot/copilotPlacement.js.map +0 -1
  169. package/dist/esm/components/bik-copilot/copilotRegenerate.d.ts +0 -22
  170. package/dist/esm/components/bik-copilot/copilotRegenerate.js +0 -6
  171. package/dist/esm/components/bik-copilot/copilotRegenerate.js.map +0 -1
  172. package/dist/esm/components/bik-copilot/index.d.ts +0 -19
  173. package/dist/esm/components/bik-copilot/model.d.ts +0 -804
  174. package/dist/esm/components/bik-copilot/services/copilotDb.d.ts +0 -90
  175. package/dist/esm/components/bik-copilot/services/copilotDb.js +0 -96
  176. package/dist/esm/components/bik-copilot/services/copilotDb.js.map +0 -1
  177. package/dist/esm/components/bik-copilot/services/copilotFeedbackClient.d.ts +0 -15
  178. package/dist/esm/components/bik-copilot/services/copilotFeedbackClient.js +0 -55
  179. package/dist/esm/components/bik-copilot/services/copilotFeedbackClient.js.map +0 -1
  180. package/dist/esm/components/bik-copilot/services/copilotIcebreakersClient.d.ts +0 -11
  181. package/dist/esm/components/bik-copilot/services/copilotIcebreakersClient.js +0 -54
  182. package/dist/esm/components/bik-copilot/services/copilotIcebreakersClient.js.map +0 -1
  183. package/dist/esm/components/bik-copilot/services/copilotMessagesClient.d.ts +0 -23
  184. package/dist/esm/components/bik-copilot/services/copilotMessagesClient.js +0 -78
  185. package/dist/esm/components/bik-copilot/services/copilotMessagesClient.js.map +0 -1
  186. package/dist/esm/components/bik-copilot/services/copilotPageSession.d.ts +0 -37
  187. package/dist/esm/components/bik-copilot/services/copilotPageSession.js +0 -35
  188. package/dist/esm/components/bik-copilot/services/copilotPageSession.js.map +0 -1
  189. package/dist/esm/components/bik-copilot/services/copilotSseParser.d.ts +0 -22
  190. package/dist/esm/components/bik-copilot/services/copilotSseParser.js +0 -52
  191. package/dist/esm/components/bik-copilot/services/copilotSseParser.js.map +0 -1
  192. package/dist/esm/components/bik-copilot/services/copilotStreamClient.d.ts +0 -35
  193. package/dist/esm/components/bik-copilot/services/copilotStreamClient.js +0 -110
  194. package/dist/esm/components/bik-copilot/services/copilotStreamClient.js.map +0 -1
  195. package/dist/esm/components/bik-copilot/useCopilotIcebreakers.d.ts +0 -17
  196. package/dist/esm/components/bik-copilot/useCopilotIcebreakers.js +0 -60
  197. package/dist/esm/components/bik-copilot/useCopilotIcebreakers.js.map +0 -1
  198. package/dist/esm/components/bik-copilot/useCopilotStreamChat.d.ts +0 -20
  199. package/dist/esm/components/bik-copilot/useCopilotStreamChat.js +0 -377
  200. package/dist/esm/components/bik-copilot/useCopilotStreamChat.js.map +0 -1
  201. package/dist/esm/components/bik-copilot/useDraggableFloater.d.ts +0 -9
  202. package/dist/esm/components/bik-copilot/useDraggableFloater.js +0 -118
  203. package/dist/esm/components/bik-copilot/useDraggableFloater.js.map +0 -1
  204. package/dist/esm/components/bik-copilot/utils/markdown.d.ts +0 -1
  205. package/dist/esm/components/bik-copilot/utils/markdown.js +0 -48
  206. package/dist/esm/components/bik-copilot/utils/markdown.js.map +0 -1
  207. package/dist/esm/components/bik-copilot/utils/toolCtas.d.ts +0 -6
  208. package/dist/esm/components/bik-copilot/utils/toolCtas.js +0 -27
  209. package/dist/esm/components/bik-copilot/utils/toolCtas.js.map +0 -1
@@ -1,534 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("styled-components"),e=require("../../constants/Theme.js"),a=n=>n&&typeof n=="object"&&"default"in n?n:{default:n},t=a(r),i="#F9F9F9",o=12,s=8,d=t.default.div`
2
- display: flex;
3
- flex-direction: column;
4
- min-height: 0;
5
- overflow: hidden;
6
- background: ${e.COLORS.surface.standard};
7
- border: 1px solid ${e.COLORS.stroke.primary};
8
- border-radius: 16px;
9
- box-shadow: 0 16px 48px rgba(40, 3, 78, 0.18);
10
- `,l=t.default.div`
11
- display: flex;
12
- align-items: center;
13
- gap: 10px;
14
- padding: 16px;
15
- border-bottom: 1px solid ${e.COLORS.stroke.primary};
16
- flex-shrink: 0;
17
- `,p=t.default.div`
18
- width: 36px;
19
- height: 36px;
20
- flex-shrink: 0;
21
- border-radius: 8px;
22
- background: ${e.COLORS.background.base};
23
- display: flex;
24
- align-items: center;
25
- justify-content: center;
26
- color: ${e.COLORS.content.brand};
27
- overflow: hidden;
28
- `,c=t.default.div`
29
- display: flex;
30
- flex-direction: column;
31
- gap: 2px;
32
- min-width: 0;
33
- flex: 1;
34
- `,x=t.default.div`
35
- display: flex;
36
- align-items: center;
37
- gap: 6px;
38
- `,g=t.default.span`
39
- padding: 1px 6px;
40
- border-radius: 4px;
41
- background: ${e.COLORS.background.brandLight};
42
- color: ${e.COLORS.content.brand};
43
- font-size: 10px;
44
- font-weight: 600;
45
- line-height: 16px;
46
- white-space: nowrap;
47
- `,u=t.default.div`
48
- display: flex;
49
- align-items: center;
50
- gap: 2px;
51
- flex-shrink: 0;
52
- `,f=t.default.button`
53
- width: 28px;
54
- height: 28px;
55
- display: flex;
56
- align-items: center;
57
- justify-content: center;
58
- padding: 0;
59
- border: none;
60
- border-radius: 6px;
61
- background: transparent;
62
- color: ${e.COLORS.content.secondary};
63
- cursor: pointer;
64
- transition: background 0.15s ease, color 0.15s ease;
65
-
66
- &:hover {
67
- background: ${e.COLORS.surface.hovered};
68
- color: ${e.COLORS.content.primary};
69
- }
70
-
71
- &:focus-visible {
72
- outline: 2px solid ${e.COLORS.stroke.brand};
73
- outline-offset: 1px;
74
- }
75
- `,b=t.default.div`
76
- position: relative;
77
- flex: 1;
78
- min-height: 0;
79
- display: flex;
80
- flex-direction: column;
81
- `,O=t.default.div`
82
- flex: 1;
83
- min-height: 0;
84
- overflow-y: auto;
85
- padding: 16px;
86
- display: flex;
87
- flex-direction: column;
88
- gap: ${o}px;
89
-
90
- &::-webkit-scrollbar {
91
- width: 6px;
92
- }
93
-
94
- &::-webkit-scrollbar-thumb {
95
- background: ${e.COLORS.background.inactive};
96
- border-radius: 3px;
97
- }
98
- `,h=t.default.div`
99
- position: absolute;
100
- left: 0;
101
- right: 0;
102
- bottom: 0;
103
- height: 40px;
104
- pointer-events: none;
105
- opacity: ${n=>n.$visible?1:0};
106
- transition: opacity 0.2s ease;
107
- background: linear-gradient(
108
- to bottom,
109
- ${e.COLORS.surface.standard}00 0%,
110
- ${e.COLORS.surface.standard}99 60%,
111
- ${e.COLORS.surface.standard} 100%
112
- );
113
-
114
- &::after {
115
- content: '';
116
- position: absolute;
117
- inset: 0;
118
- backdrop-filter: blur(1px);
119
- -webkit-backdrop-filter: blur(1px);
120
- mask-image: linear-gradient(to bottom, transparent 0%, #000 75%);
121
- -webkit-mask-image: linear-gradient(to bottom, transparent 0%, #000 75%);
122
- }
123
- `,m=t.default.button`
124
- position: absolute;
125
- left: 50%;
126
- bottom: 12px;
127
- transform: translateX(-50%)
128
- translateY(${n=>n.$visible?"0":"6px"});
129
- width: 32px;
130
- height: 32px;
131
- display: flex;
132
- align-items: center;
133
- justify-content: center;
134
- padding: 0;
135
- border: none;
136
- border-radius: 999px;
137
- background: ${e.COLORS.background.inverse};
138
- color: ${e.COLORS.content.primaryInverse};
139
- box-shadow: 0 2px 8px rgba(40, 3, 78, 0.16);
140
- cursor: pointer;
141
- opacity: ${n=>n.$visible?1:0};
142
- /* Hidden to the pointer and to focus order while it is faded out. */
143
- visibility: ${n=>n.$visible?"visible":"hidden"};
144
- transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease,
145
- background 0.15s ease, color 0.15s ease;
146
-
147
- &:hover {
148
- background: ${e.COLORS.background.brandHovered};
149
- }
150
-
151
- &:focus-visible {
152
- outline: 2px solid ${e.COLORS.stroke.brand};
153
- outline-offset: 1px;
154
- }
155
- `,k=t.default.div`
156
- flex: 1;
157
- display: flex;
158
- flex-direction: column;
159
- align-items: center;
160
- justify-content: center;
161
- gap: 8px;
162
- text-align: center;
163
- padding: 8px 4px;
164
- `,y=t.default.div`
165
- color: ${e.COLORS.content.brand};
166
- display: flex;
167
- align-items: center;
168
- justify-content: center;
169
- margin-bottom: 4px;
170
- `,L=t.default.div`
171
- display: flex;
172
- flex-direction: column;
173
- align-items: center;
174
- gap: 8px;
175
- margin-top: 12px;
176
- width: 100%;
177
- `,S=t.default.button`
178
- display: inline-flex;
179
- align-items: center;
180
- gap: 6px;
181
- max-width: 100%;
182
- padding: 8px 14px;
183
- border: 1px solid ${e.COLORS.stroke.primary};
184
- border-radius: 999px;
185
- background: ${e.COLORS.surface.standard};
186
- color: ${e.COLORS.content.primary};
187
- font-family: Inter;
188
- font-size: 13px;
189
- line-height: 18px;
190
- text-align: left;
191
- cursor: pointer;
192
- transition: border-color 0.15s ease, background 0.15s ease;
193
-
194
- svg {
195
- flex-shrink: 0;
196
- color: ${e.COLORS.content.brand};
197
- }
198
-
199
- &:hover:not(:disabled) {
200
- border-color: ${e.COLORS.stroke.brand};
201
- background: ${e.COLORS.background.brandVeryLight};
202
- }
203
-
204
- &:disabled {
205
- cursor: not-allowed;
206
- opacity: 0.5;
207
- }
208
- `,$=t.default.div`
209
- font-family: Inter;
210
- font-size: 14px;
211
- line-height: 20px;
212
- word-break: break-word;
213
- overflow-wrap: break-word;
214
-
215
- ${n=>n.$role==="user"?`
216
- align-self: flex-end;
217
- margin-left: 32px;
218
- padding: 10px 14px;
219
- border-radius: 12px;
220
- background: ${i};
221
- color: ${e.COLORS.content.primary};
222
- `:n.$role==="system"?`
223
- align-self: center;
224
- max-width: 90%;
225
- padding: 6px 10px;
226
- border-radius: 8px;
227
- background: ${e.COLORS.surface.grey};
228
- color: ${e.COLORS.content.secondary};
229
- font-size: 12px;
230
- text-align: center;
231
- `:`
232
- align-self: stretch;
233
- padding: 0;
234
- background: transparent;
235
- color: ${e.COLORS.content.primary};
236
- `}
237
-
238
- /* Markdown emitted by renderCopilotMarkdown */
239
- h1,
240
- h2,
241
- h3,
242
- h4 {
243
- font-size: 14px;
244
- font-weight: 600;
245
- margin: 4px 0;
246
- }
247
-
248
- pre {
249
- background: ${e.COLORS.background.base};
250
- border-radius: 6px;
251
- padding: 8px;
252
- margin: 6px 0;
253
- overflow-x: auto;
254
- font-size: 12px;
255
- }
256
-
257
- a {
258
- color: ${e.COLORS.content.brand};
259
- }
260
-
261
- ul,
262
- ol {
263
- margin: 4px 0;
264
- padding-left: 20px;
265
- }
266
-
267
- li {
268
- margin: 2px 0;
269
- }
270
-
271
- code {
272
- background: ${e.COLORS.background.base};
273
- border-radius: 4px;
274
- padding: 1px 4px;
275
- font-size: 12px;
276
- }
277
- `,C=t.default.div`
278
- align-self: flex-start;
279
- display: inline-flex;
280
- align-items: center;
281
- gap: 8px;
282
- padding: 12px 14px;
283
- border-radius: 12px;
284
- border-bottom-left-radius: 4px;
285
- background: ${e.COLORS.surface.grey};
286
- border: 1px solid ${e.COLORS.stroke.primary};
287
- `,v=t.default.div`
288
- align-self: center;
289
- display: inline-flex;
290
- align-items: center;
291
- gap: 8px;
292
- padding: 4px 0;
293
- font-family: Inter;
294
- font-size: 11px;
295
- line-height: 16px;
296
- color: ${e.COLORS.content.placeholder};
297
- `,R=t.default.div`
298
- display: flex;
299
- flex-direction: column;
300
- align-items: stretch;
301
- gap: 8px;
302
- margin-top: 4px;
303
- `,w=t.default.div`
304
- font-family: Inter;
305
- font-size: 11px;
306
- line-height: 16px;
307
- color: ${e.COLORS.content.placeholder};
308
- `,I=t.default.div`
309
- display: flex;
310
- flex-wrap: wrap;
311
- gap: 8px;
312
- margin-top: 8px;
313
- `,A=t.default.a`
314
- display: inline-flex;
315
- align-items: center;
316
- gap: 6px;
317
- padding: 8px 14px;
318
- border: 1px solid ${e.COLORS.stroke.brand};
319
- border-radius: 10px;
320
- background: ${e.COLORS.background.brandVeryLight};
321
- color: ${e.COLORS.content.brand};
322
- font-family: Inter;
323
- font-size: 13px;
324
- font-weight: 500;
325
- line-height: 18px;
326
- text-decoration: none;
327
- cursor: pointer;
328
- transition: background 0.15s ease, border-color 0.15s ease;
329
-
330
- &:hover {
331
- background: ${e.COLORS.background.brandLight};
332
- }
333
-
334
- &:focus-visible {
335
- outline: 2px solid ${e.COLORS.stroke.brand};
336
- outline-offset: 2px;
337
- }
338
- `,z=t.default.button`
339
- display: flex;
340
- align-items: center;
341
- gap: 8px;
342
- width: 100%;
343
- padding: 10px 14px;
344
- border: 1px solid ${e.COLORS.stroke.primary};
345
- border-radius: 10px;
346
- background: ${e.COLORS.surface.standard};
347
- color: ${e.COLORS.content.primary};
348
- font-family: Inter;
349
- font-size: 13px;
350
- line-height: 18px;
351
- text-align: left;
352
- cursor: pointer;
353
- transition: border-color 0.15s ease, background 0.15s ease;
354
-
355
- svg {
356
- flex-shrink: 0;
357
- color: ${e.COLORS.content.secondary};
358
- }
359
-
360
- &:hover:not(:disabled) {
361
- border-color: ${e.COLORS.stroke.brand};
362
- background: ${e.COLORS.background.brandVeryLight};
363
- }
364
-
365
- &:disabled {
366
- cursor: not-allowed;
367
- opacity: 0.5;
368
- }
369
- `,M=t.default.div`
370
- align-self: flex-start;
371
- display: inline-flex;
372
- align-items: center;
373
- gap: 6px;
374
- font-family: Inter;
375
- font-size: 12px;
376
- line-height: 18px;
377
- color: ${e.COLORS.content.secondary};
378
-
379
- svg {
380
- flex-shrink: 0;
381
- color: ${e.COLORS.content.inactive};
382
- }
383
- `,T=t.default.div`
384
- align-self: flex-end;
385
- margin-top: -6px;
386
- font-family: Inter;
387
- font-size: 11px;
388
- line-height: 16px;
389
- color: ${e.COLORS.content.placeholder};
390
- `,H=t.default.div`
391
- align-self: flex-start;
392
- display: flex;
393
- align-items: center;
394
- gap: 2px;
395
- /* Pulls back out of the scroller's row gap to land on 8px. */
396
- margin-top: ${s-o}px;
397
- `,B=t.default.button`
398
- display: inline-flex;
399
- align-items: center;
400
- justify-content: center;
401
- gap: 4px;
402
- width: 28px;
403
- height: 28px;
404
- padding: 0;
405
- border: none;
406
- border-radius: 4px;
407
- background: transparent;
408
- color: ${e.COLORS.content.placeholder};
409
- font-family: Inter;
410
- font-size: 11px;
411
- line-height: 16px;
412
- cursor: pointer;
413
- transition: background 0.15s ease, color 0.15s ease;
414
-
415
- svg {
416
- flex-shrink: 0;
417
- }
418
-
419
- &:hover:not(:disabled) {
420
- background: ${e.COLORS.surface.hovered};
421
- color: ${e.COLORS.content.secondary};
422
- }
423
-
424
- &:focus-visible {
425
- outline: 2px solid ${e.COLORS.stroke.brand};
426
- outline-offset: 1px;
427
- }
428
-
429
- &:disabled {
430
- cursor: not-allowed;
431
- opacity: 0.5;
432
- }
433
-
434
- /* Confirmation reads as success, not as another affordance. */
435
- &[data-copied='true'],
436
- &[data-copied='true']:hover {
437
- color: ${e.COLORS.content.positive};
438
- }
439
-
440
- /* A cast vote holds the brand colour, so it stays legible as chosen once the
441
- pointer moves away. */
442
- &[data-selected='true'],
443
- &[data-selected='true']:hover {
444
- color: ${e.COLORS.content.brand};
445
- }
446
- `,E=t.default.span`
447
- font-family: Inter;
448
- font-size: 13px;
449
- line-height: 20px;
450
- color: ${e.COLORS.content.secondary};
451
- `,F=t.default.div`
452
- margin: 0 16px;
453
- padding: 8px 10px;
454
- border-radius: 8px;
455
- background: ${e.COLORS.background.negative.light};
456
- color: ${e.COLORS.content.negative};
457
- font-family: Inter;
458
- font-size: 12px;
459
- line-height: 18px;
460
- flex-shrink: 0;
461
- `,P=t.default.div`
462
- padding: 16px 16px 4px;
463
- flex-shrink: 0;
464
- `,_=t.default.div`
465
- box-sizing: border-box;
466
- min-height: 48px;
467
- display: flex;
468
- align-items: flex-end;
469
- gap: 8px;
470
- padding: 12px;
471
- box-shadow: inset 0 0 0 1px
472
- ${n=>n.$focused?e.COLORS.stroke.brand:e.COLORS.stroke.primary};
473
- border-radius: 12px;
474
- background: ${e.COLORS.surface.standard};
475
- transition: box-shadow 0.15s ease;
476
-
477
- &:hover {
478
- box-shadow: inset 0 0 0 1px
479
- ${n=>n.$focused?e.COLORS.stroke.brand:e.COLORS.content.inactive};
480
- }
481
- `,j=t.default.textarea`
482
- flex: 1;
483
- border: none;
484
- outline: none;
485
- resize: none;
486
- background: transparent;
487
- font-family: Inter;
488
- font-size: 13px;
489
- line-height: 24px;
490
- color: ${e.COLORS.content.primary};
491
- max-height: 96px;
492
- min-height: 24px;
493
- padding: 0;
494
-
495
- &::placeholder {
496
- color: ${e.COLORS.content.placeholder};
497
- }
498
-
499
- &:disabled {
500
- cursor: not-allowed;
501
- }
502
- `,U=t.default.button`
503
- width: 24px;
504
- height: 24px;
505
- flex-shrink: 0;
506
- display: flex;
507
- align-items: center;
508
- justify-content: center;
509
- padding: 0;
510
- border: none;
511
- border-radius: 6px;
512
- background: ${n=>n.$active?e.COLORS.background.brand:e.COLORS.background.inactive};
513
- color: ${e.COLORS.content.primaryInverse};
514
- cursor: ${n=>n.$active?"pointer":"not-allowed"};
515
- transition: background 0.15s ease;
516
-
517
- &:hover:not(:disabled) {
518
- background: ${e.COLORS.background.brandHovered};
519
- }
520
-
521
- &:focus-visible {
522
- outline: 2px solid ${e.COLORS.stroke.brand};
523
- outline-offset: 1px;
524
- }
525
- `,G=t.default.div`
526
- padding: 4px 16px 16px;
527
- text-align: center;
528
- font-family: Inter;
529
- font-size: 11px;
530
- line-height: 16px;
531
- color: ${e.COLORS.content.placeholder};
532
- flex-shrink: 0;
533
- `;exports.Disclaimer=G;exports.EmptyState=k;exports.EmptyStateIcon=y;exports.ErrorBanner=F;exports.FollowUpChip=z;exports.FollowUpList=R;exports.FollowUpsLabel=w;exports.HeaderActions=u;exports.HeaderAvatar=p;exports.HeaderBadge=g;exports.HeaderText=c;exports.HeaderTitleRow=x;exports.HistoryLoader=v;exports.IconAction=f;exports.InputArea=P;exports.InputWrapper=_;exports.InterruptedNote=M;exports.JumpToLatestButton=m;exports.MessageAction=B;exports.MessageActions=H;exports.MessageBubble=$;exports.MessageInput=j;exports.MessageTimestamp=T;exports.MessagesArea=O;exports.MessagesViewport=b;exports.PanelContainer=d;exports.PanelHeader=l;exports.ScrollFade=h;exports.SendButton=U;exports.SuggestionChip=S;exports.SuggestionList=L;exports.ThinkingBubble=C;exports.ThinkingLabel=E;exports.ToolCtaLink=A;exports.ToolCtaList=I;
534
- //# sourceMappingURL=CopilotPanel.styled.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CopilotPanel.styled.js","sources":["../../../../src/components/bik-copilot/CopilotPanel.styled.ts"],"sourcesContent":["import styled from 'styled-components';\nimport { COLORS } from '@src/constants/Theme';\n\nconst USER_BUBBLE_BACKGROUND = '#F9F9F9';\n\nconst MESSAGE_GAP_PX = 12;\n\nconst MESSAGE_ACTIONS_GAP_PX = 8;\n\nexport const PanelContainer = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-height: 0;\n\toverflow: hidden;\n\tbackground: ${COLORS.surface.standard};\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tborder-radius: 16px;\n\tbox-shadow: 0 16px 48px rgba(40, 3, 78, 0.18);\n`;\n\nexport const PanelHeader = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 16px;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n\tflex-shrink: 0;\n`;\n\nexport const HeaderAvatar = styled.div`\n\twidth: 36px;\n\theight: 36px;\n\tflex-shrink: 0;\n\tborder-radius: 8px;\n\tbackground: ${COLORS.background.base};\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcolor: ${COLORS.content.brand};\n\toverflow: hidden;\n`;\n\nexport const HeaderText = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n\tflex: 1;\n`;\n\nexport const HeaderTitleRow = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n`;\n\nexport const HeaderBadge = styled.span`\n\tpadding: 1px 6px;\n\tborder-radius: 4px;\n\tbackground: ${COLORS.background.brandLight};\n\tcolor: ${COLORS.content.brand};\n\tfont-size: 10px;\n\tfont-weight: 600;\n\tline-height: 16px;\n\twhite-space: nowrap;\n`;\n\nexport const HeaderActions = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 2px;\n\tflex-shrink: 0;\n`;\n\nexport const IconAction = styled.button`\n\twidth: 28px;\n\theight: 28px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: 6px;\n\tbackground: transparent;\n\tcolor: ${COLORS.content.secondary};\n\tcursor: pointer;\n\ttransition: background 0.15s ease, color 0.15s ease;\n\n\t&:hover {\n\t\tbackground: ${COLORS.surface.hovered};\n\t\tcolor: ${COLORS.content.primary};\n\t}\n\n\t&:focus-visible {\n\t\toutline: 2px solid ${COLORS.stroke.brand};\n\t\toutline-offset: 1px;\n\t}\n`;\n\n/**\n * Wraps the scroller so the bottom fade and the jump-to-latest button can be\n * absolutely positioned over it.\n */\nexport const MessagesViewport = styled.div`\n\tposition: relative;\n\tflex: 1;\n\tmin-height: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n`;\n\nexport const MessagesArea = styled.div`\n\tflex: 1;\n\tmin-height: 0;\n\toverflow-y: auto;\n\tpadding: 16px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: ${MESSAGE_GAP_PX}px;\n\n\t&::-webkit-scrollbar {\n\t\twidth: 6px;\n\t}\n\n\t&::-webkit-scrollbar-thumb {\n\t\tbackground: ${COLORS.background.inactive};\n\t\tborder-radius: 3px;\n\t}\n`;\n\n/**\n * Softens the cut-off edge of a long answer the reader has scrolled up from, so\n * the clipped line reads as continuing rather than as the end of the message.\n *\n * Two layers, because one element cannot ramp a gradient and a blur\n * independently: the element itself whitens the text out, and `::after` lays a\n * masked blur over it that strengthens towards the bottom. Browsers without\n * `backdrop-filter` still get the fade.\n */\nexport const ScrollFade = styled.div<{ $visible: boolean }>`\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\theight: 40px;\n\tpointer-events: none;\n\topacity: ${(props) => (props.$visible ? 1 : 0)};\n\ttransition: opacity 0.2s ease;\n\tbackground: linear-gradient(\n\t\tto bottom,\n\t\t${COLORS.surface.standard}00 0%,\n\t\t${COLORS.surface.standard}99 60%,\n\t\t${COLORS.surface.standard} 100%\n\t);\n\n\t&::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\tbackdrop-filter: blur(1px);\n\t\t-webkit-backdrop-filter: blur(1px);\n\t\tmask-image: linear-gradient(to bottom, transparent 0%, #000 75%);\n\t\t-webkit-mask-image: linear-gradient(to bottom, transparent 0%, #000 75%);\n\t}\n`;\n\nexport const JumpToLatestButton = styled.button<{ $visible: boolean }>`\n\tposition: absolute;\n\tleft: 50%;\n\tbottom: 12px;\n\ttransform: translateX(-50%)\n\t\ttranslateY(${(props) => (props.$visible ? '0' : '6px')});\n\twidth: 32px;\n\theight: 32px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: 999px;\n\tbackground: ${COLORS.background.inverse};\n\tcolor: ${COLORS.content.primaryInverse};\n\tbox-shadow: 0 2px 8px rgba(40, 3, 78, 0.16);\n\tcursor: pointer;\n\topacity: ${(props) => (props.$visible ? 1 : 0)};\n\t/* Hidden to the pointer and to focus order while it is faded out. */\n\tvisibility: ${(props) => (props.$visible ? 'visible' : 'hidden')};\n\ttransition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease,\n\t\tbackground 0.15s ease, color 0.15s ease;\n\n\t&:hover {\n\t\tbackground: ${COLORS.background.brandHovered};\n\t}\n\n\t&:focus-visible {\n\t\toutline: 2px solid ${COLORS.stroke.brand};\n\t\toutline-offset: 1px;\n\t}\n`;\n\nexport const EmptyState = styled.div`\n\tflex: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: 8px;\n\ttext-align: center;\n\tpadding: 8px 4px;\n`;\n\nexport const EmptyStateIcon = styled.div`\n\tcolor: ${COLORS.content.brand};\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-bottom: 4px;\n`;\n\nexport const SuggestionList = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: 8px;\n\tmargin-top: 12px;\n\twidth: 100%;\n`;\n\nexport const SuggestionChip = styled.button`\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tmax-width: 100%;\n\tpadding: 8px 14px;\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tborder-radius: 999px;\n\tbackground: ${COLORS.surface.standard};\n\tcolor: ${COLORS.content.primary};\n\tfont-family: Inter;\n\tfont-size: 13px;\n\tline-height: 18px;\n\ttext-align: left;\n\tcursor: pointer;\n\ttransition: border-color 0.15s ease, background 0.15s ease;\n\n\tsvg {\n\t\tflex-shrink: 0;\n\t\tcolor: ${COLORS.content.brand};\n\t}\n\n\t&:hover:not(:disabled) {\n\t\tborder-color: ${COLORS.stroke.brand};\n\t\tbackground: ${COLORS.background.brandVeryLight};\n\t}\n\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t}\n`;\n\nexport const MessageBubble = styled.div<{\n\t$role: 'user' | 'assistant' | 'system';\n}>`\n\tfont-family: Inter;\n\tfont-size: 14px;\n\tline-height: 20px;\n\tword-break: break-word;\n\toverflow-wrap: break-word;\n\n\t${(props) => {\n\t\tif (props.$role === 'user') {\n\t\t\treturn `\n\t\t\t\talign-self: flex-end;\n\t\t\t\tmargin-left: 32px;\n\t\t\t\tpadding: 10px 14px;\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tbackground: ${USER_BUBBLE_BACKGROUND};\n\t\t\t\tcolor: ${COLORS.content.primary};\n\t\t\t`;\n\t\t}\n\t\tif (props.$role === 'system') {\n\t\t\treturn `\n\t\t\t\talign-self: center;\n\t\t\t\tmax-width: 90%;\n\t\t\t\tpadding: 6px 10px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tbackground: ${COLORS.surface.grey};\n\t\t\t\tcolor: ${COLORS.content.secondary};\n\t\t\t\tfont-size: 12px;\n\t\t\t\ttext-align: center;\n\t\t\t`;\n\t\t}\n\t\treturn `\n\t\t\talign-self: stretch;\n\t\t\tpadding: 0;\n\t\t\tbackground: transparent;\n\t\t\tcolor: ${COLORS.content.primary};\n\t\t`;\n\t}}\n\n\t/* Markdown emitted by renderCopilotMarkdown */\n\th1,\n\th2,\n\th3,\n\th4 {\n\t\tfont-size: 14px;\n\t\tfont-weight: 600;\n\t\tmargin: 4px 0;\n\t}\n\n\tpre {\n\t\tbackground: ${COLORS.background.base};\n\t\tborder-radius: 6px;\n\t\tpadding: 8px;\n\t\tmargin: 6px 0;\n\t\toverflow-x: auto;\n\t\tfont-size: 12px;\n\t}\n\n\ta {\n\t\tcolor: ${COLORS.content.brand};\n\t}\n\n\tul,\n\tol {\n\t\tmargin: 4px 0;\n\t\tpadding-left: 20px;\n\t}\n\n\tli {\n\t\tmargin: 2px 0;\n\t}\n\n\tcode {\n\t\tbackground: ${COLORS.background.base};\n\t\tborder-radius: 4px;\n\t\tpadding: 1px 4px;\n\t\tfont-size: 12px;\n\t}\n`;\n\nexport const ThinkingBubble = styled.div`\n\talign-self: flex-start;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 12px 14px;\n\tborder-radius: 12px;\n\tborder-bottom-left-radius: 4px;\n\tbackground: ${COLORS.surface.grey};\n\tborder: 1px solid ${COLORS.stroke.primary};\n`;\n\n/** Sits above the oldest message while the page before it is fetched. */\nexport const HistoryLoader = styled.div`\n\talign-self: center;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 4px 0;\n\tfont-family: Inter;\n\tfont-size: 11px;\n\tline-height: 16px;\n\tcolor: ${COLORS.content.placeholder};\n`;\n\nexport const FollowUpList = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: stretch;\n\tgap: 8px;\n\tmargin-top: 4px;\n`;\n\nexport const FollowUpsLabel = styled.div`\n\tfont-family: Inter;\n\tfont-size: 11px;\n\tline-height: 16px;\n\tcolor: ${COLORS.content.placeholder};\n`;\n\nexport const ToolCtaList = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px;\n\tmargin-top: 8px;\n`;\n\n// An anchor rather than a button: a real link so the browser handles the new\n// tab, middle-click and copy-link-address the way merchants expect.\nexport const ToolCtaLink = styled.a`\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 8px 14px;\n\tborder: 1px solid ${COLORS.stroke.brand};\n\tborder-radius: 10px;\n\tbackground: ${COLORS.background.brandVeryLight};\n\tcolor: ${COLORS.content.brand};\n\tfont-family: Inter;\n\tfont-size: 13px;\n\tfont-weight: 500;\n\tline-height: 18px;\n\ttext-decoration: none;\n\tcursor: pointer;\n\ttransition: background 0.15s ease, border-color 0.15s ease;\n\n\t&:hover {\n\t\tbackground: ${COLORS.background.brandLight};\n\t}\n\n\t&:focus-visible {\n\t\toutline: 2px solid ${COLORS.stroke.brand};\n\t\toutline-offset: 2px;\n\t}\n`;\n\nexport const FollowUpChip = styled.button`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 10px 14px;\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tborder-radius: 10px;\n\tbackground: ${COLORS.surface.standard};\n\tcolor: ${COLORS.content.primary};\n\tfont-family: Inter;\n\tfont-size: 13px;\n\tline-height: 18px;\n\ttext-align: left;\n\tcursor: pointer;\n\ttransition: border-color 0.15s ease, background 0.15s ease;\n\n\tsvg {\n\t\tflex-shrink: 0;\n\t\tcolor: ${COLORS.content.secondary};\n\t}\n\n\t&:hover:not(:disabled) {\n\t\tborder-color: ${COLORS.stroke.brand};\n\t\tbackground: ${COLORS.background.brandVeryLight};\n\t}\n\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t}\n`;\n\n/**\n * Bubble-less on purpose: a stopped reply is a note about the transcript, not a\n * message in it.\n */\nexport const InterruptedNote = styled.div`\n\talign-self: flex-start;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-family: Inter;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: ${COLORS.content.secondary};\n\n\tsvg {\n\t\tflex-shrink: 0;\n\t\tcolor: ${COLORS.content.inactive};\n\t}\n`;\n\nexport const MessageTimestamp = styled.div`\n\talign-self: flex-end;\n\tmargin-top: -6px;\n\tfont-family: Inter;\n\tfont-size: 11px;\n\tline-height: 16px;\n\tcolor: ${COLORS.content.placeholder};\n`;\n\n/**\n * Actions under a finished assistant reply. Kept low-contrast so a row of icons\n * under every message does not compete with the answer itself.\n */\nexport const MessageActions = styled.div`\n\talign-self: flex-start;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 2px;\n\t/* Pulls back out of the scroller's row gap to land on 8px. */\n\tmargin-top: ${MESSAGE_ACTIONS_GAP_PX - MESSAGE_GAP_PX}px;\n`;\n\nexport const MessageAction = styled.button`\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: 4px;\n\twidth: 28px;\n\theight: 28px;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcolor: ${COLORS.content.placeholder};\n\tfont-family: Inter;\n\tfont-size: 11px;\n\tline-height: 16px;\n\tcursor: pointer;\n\ttransition: background 0.15s ease, color 0.15s ease;\n\n\tsvg {\n\t\tflex-shrink: 0;\n\t}\n\n\t&:hover:not(:disabled) {\n\t\tbackground: ${COLORS.surface.hovered};\n\t\tcolor: ${COLORS.content.secondary};\n\t}\n\n\t&:focus-visible {\n\t\toutline: 2px solid ${COLORS.stroke.brand};\n\t\toutline-offset: 1px;\n\t}\n\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t}\n\n\t/* Confirmation reads as success, not as another affordance. */\n\t&[data-copied='true'],\n\t&[data-copied='true']:hover {\n\t\tcolor: ${COLORS.content.positive};\n\t}\n\n\t/* A cast vote holds the brand colour, so it stays legible as chosen once the\n\t pointer moves away. */\n\t&[data-selected='true'],\n\t&[data-selected='true']:hover {\n\t\tcolor: ${COLORS.content.brand};\n\t}\n`;\n\nexport const ThinkingLabel = styled.span`\n\tfont-family: Inter;\n\tfont-size: 13px;\n\tline-height: 20px;\n\tcolor: ${COLORS.content.secondary};\n`;\n\nexport const ErrorBanner = styled.div`\n\tmargin: 0 16px;\n\tpadding: 8px 10px;\n\tborder-radius: 8px;\n\tbackground: ${COLORS.background.negative.light};\n\tcolor: ${COLORS.content.negative};\n\tfont-family: Inter;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tflex-shrink: 0;\n`;\n\nexport const InputArea = styled.div`\n\tpadding: 16px 16px 4px;\n\tflex-shrink: 0;\n`;\n\nexport const InputWrapper = styled.div<{ $focused: boolean }>`\n\tbox-sizing: border-box;\n\tmin-height: 48px;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: 8px;\n\tpadding: 12px;\n\tbox-shadow: inset 0 0 0 1px\n\t\t${(props) => (props.$focused ? COLORS.stroke.brand : COLORS.stroke.primary)};\n\tborder-radius: 12px;\n\tbackground: ${COLORS.surface.standard};\n\ttransition: box-shadow 0.15s ease;\n\n\t&:hover {\n\t\tbox-shadow: inset 0 0 0 1px\n\t\t\t${(props) =>\n\t\t\t\tprops.$focused ? COLORS.stroke.brand : COLORS.content.inactive};\n\t}\n`;\n\nexport const MessageInput = styled.textarea`\n\tflex: 1;\n\tborder: none;\n\toutline: none;\n\tresize: none;\n\tbackground: transparent;\n\tfont-family: Inter;\n\tfont-size: 13px;\n\tline-height: 24px;\n\tcolor: ${COLORS.content.primary};\n\tmax-height: 96px;\n\tmin-height: 24px;\n\tpadding: 0;\n\n\t&::placeholder {\n\t\tcolor: ${COLORS.content.placeholder};\n\t}\n\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t}\n`;\n\nexport const SendButton = styled.button<{ $active: boolean }>`\n\twidth: 24px;\n\theight: 24px;\n\tflex-shrink: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: 6px;\n\tbackground: ${(props) =>\n\t\tprops.$active ? COLORS.background.brand : COLORS.background.inactive};\n\tcolor: ${COLORS.content.primaryInverse};\n\tcursor: ${(props) => (props.$active ? 'pointer' : 'not-allowed')};\n\ttransition: background 0.15s ease;\n\n\t&:hover:not(:disabled) {\n\t\tbackground: ${COLORS.background.brandHovered};\n\t}\n\n\t&:focus-visible {\n\t\toutline: 2px solid ${COLORS.stroke.brand};\n\t\toutline-offset: 1px;\n\t}\n`;\n\nexport const Disclaimer = styled.div`\n\tpadding: 4px 16px 16px;\n\ttext-align: center;\n\tfont-family: Inter;\n\tfont-size: 11px;\n\tline-height: 16px;\n\tcolor: ${COLORS.content.placeholder};\n\tflex-shrink: 0;\n`;\n"],"names":["USER_BUBBLE_BACKGROUND","MESSAGE_GAP_PX","MESSAGE_ACTIONS_GAP_PX","PanelContainer","styled","COLORS","PanelHeader","HeaderAvatar","HeaderText","HeaderTitleRow","HeaderBadge","HeaderActions","IconAction","MessagesViewport","MessagesArea","ScrollFade","props","JumpToLatestButton","EmptyState","EmptyStateIcon","SuggestionList","SuggestionChip","MessageBubble","ThinkingBubble","HistoryLoader","FollowUpList","FollowUpsLabel","ToolCtaList","ToolCtaLink","FollowUpChip","InterruptedNote","MessageTimestamp","MessageActions","MessageAction","ThinkingLabel","ErrorBanner","InputArea","InputWrapper","MessageInput","SendButton","Disclaimer"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=8,g=(t,n,c)=>Math.min(Math.max(t,n),Math.max(n,c)),y=({ballPosition:t,ballSize:n,panelWidth:c,panelHeight:r,gap:f,viewport:e})=>{if(!e.width||!e.height)return{left:h,top:h,width:c,height:r};const s=Math.min(c,e.width-h*2),d=Math.min(r,e.height-h*2),m=t.x+n/2,a=t.y+n/2,o=m>e.width/2,M=a>e.height/2,u=o?t.x+n-s:t.x,x=M?t.y-f-d:t.y+n+f;return{left:g(u,h,e.width-s-h),top:g(x,h,e.height-d-h),width:s,height:d}};exports.getCopilotPanelPlacement=y;
2
- //# sourceMappingURL=copilotPlacement.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"copilotPlacement.js","sources":["../../../../src/components/bik-copilot/copilotPlacement.ts"],"sourcesContent":["import { CopilotBallPosition, CopilotViewport } from './model';\n\n/** Smallest gap kept between the panel and the viewport edges. */\nconst VIEWPORT_MARGIN_PX = 8;\n\nexport interface CopilotPanelPlacementOptions {\n\tballPosition: CopilotBallPosition;\n\tballSize: number;\n\tpanelWidth: number;\n\tpanelHeight: number;\n\tgap: number;\n\tviewport: CopilotViewport;\n}\n\nexport interface CopilotPanelPlacement {\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n}\n\nconst clamp = (value: number, min: number, max: number) =>\n\tMath.min(Math.max(value, min), Math.max(min, max));\n\n/**\n * Places the panel next to the ball, on whichever side has room.\n *\n * The panel opens towards the middle of the screen: a ball parked bottom-right\n * gets a panel above and to its left, a ball parked top-left gets one below and\n * to its right. The result is always clamped inside the viewport, and the panel\n * shrinks on viewports too small to hold it at full size.\n */\nexport const getCopilotPanelPlacement = ({\n\tballPosition,\n\tballSize,\n\tpanelWidth,\n\tpanelHeight,\n\tgap,\n\tviewport,\n}: CopilotPanelPlacementOptions): CopilotPanelPlacement => {\n\tif (!viewport.width || !viewport.height) {\n\t\treturn {\n\t\t\tleft: VIEWPORT_MARGIN_PX,\n\t\t\ttop: VIEWPORT_MARGIN_PX,\n\t\t\twidth: panelWidth,\n\t\t\theight: panelHeight,\n\t\t};\n\t}\n\n\tconst width = Math.min(panelWidth, viewport.width - VIEWPORT_MARGIN_PX * 2);\n\tconst height = Math.min(\n\t\tpanelHeight,\n\t\tviewport.height - VIEWPORT_MARGIN_PX * 2,\n\t);\n\n\tconst ballCenterX = ballPosition.x + ballSize / 2;\n\tconst ballCenterY = ballPosition.y + ballSize / 2;\n\tconst opensLeftwards = ballCenterX > viewport.width / 2;\n\tconst opensUpwards = ballCenterY > viewport.height / 2;\n\n\t// Align the panel's near edge with the ball's, then push it towards the\n\t// screen centre.\n\tconst preferredLeft = opensLeftwards\n\t\t? ballPosition.x + ballSize - width\n\t\t: ballPosition.x;\n\tconst preferredTop = opensUpwards\n\t\t? ballPosition.y - gap - height\n\t\t: ballPosition.y + ballSize + gap;\n\n\treturn {\n\t\tleft: clamp(\n\t\t\tpreferredLeft,\n\t\t\tVIEWPORT_MARGIN_PX,\n\t\t\tviewport.width - width - VIEWPORT_MARGIN_PX,\n\t\t),\n\t\ttop: clamp(\n\t\t\tpreferredTop,\n\t\t\tVIEWPORT_MARGIN_PX,\n\t\t\tviewport.height - height - VIEWPORT_MARGIN_PX,\n\t\t),\n\t\twidth,\n\t\theight,\n\t};\n};\n"],"names":["VIEWPORT_MARGIN_PX","clamp","value","min","max","getCopilotPanelPlacement","ballPosition","ballSize","panelWidth","panelHeight","gap","viewport","width","height","ballCenterX","ballCenterY","opensLeftwards","opensUpwards","preferredLeft","preferredTop"],"mappings":"gFAGA,MAAMA,EAAqB,EAkBrBC,EAAQ,CAACC,EAAeC,EAAaC,IAC1C,KAAK,IAAI,KAAK,IAAIF,EAAOC,CAAG,EAAG,KAAK,IAAIA,EAAKC,CAAG,CAAC,EAUrCC,EAA2B,CAAC,CACxC,aAAAC,EACA,SAAAC,EACA,WAAAC,EACA,YAAAC,EACA,IAAAC,EACA,SAAAC,CACD,IAA2D,CAC1D,GAAI,CAACA,EAAS,OAAS,CAACA,EAAS,OAChC,MAAO,CACN,KAAMX,EACN,IAAKA,EACL,MAAOQ,EACP,OAAQC,CAAA,EAIV,MAAMG,EAAQ,KAAK,IAAIJ,EAAYG,EAAS,MAAQX,EAAqB,CAAC,EACpEa,EAAS,KAAK,IACnBJ,EACAE,EAAS,OAASX,EAAqB,CAAA,EAGlCc,EAAcR,EAAa,EAAIC,EAAW,EAC1CQ,EAAcT,EAAa,EAAIC,EAAW,EAC1CS,EAAiBF,EAAcH,EAAS,MAAQ,EAChDM,EAAeF,EAAcJ,EAAS,OAAS,EAI/CO,EAAgBF,EACnBV,EAAa,EAAIC,EAAWK,EAC5BN,EAAa,EACVa,EAAeF,EAClBX,EAAa,EAAII,EAAMG,EACvBP,EAAa,EAAIC,EAAWG,EAE/B,MAAO,CACN,KAAMT,EACLiB,EACAlB,EACAW,EAAS,MAAQC,EAAQZ,CAAA,EAE1B,IAAKC,EACJkB,EACAnB,EACAW,EAAS,OAASE,EAASb,CAAA,EAE5B,MAAAY,EACA,OAAAC,CAAA,CAEF"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e="Please answer my previous question again — give a fresh, reworded response, not the same text as before.",o=t=>t.trim()===e;exports.COPILOT_REGENERATE_PROMPT=e;exports.isCopilotRegeneratePrompt=o;
2
- //# sourceMappingURL=copilotRegenerate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"copilotRegenerate.js","sources":["../../../../src/components/bik-copilot/copilotRegenerate.ts"],"sourcesContent":["/**\n * The prompt a regenerate sends in place of the reader's own words.\n *\n * Regenerating is an ordinary `/bik-ai/copilot-bikchatbot` turn — the endpoint\n * needs a prompt on every call — so it carries this sentinel instead. It is sent\n * with `previous_response_id`, so the model already has the question and the last\n * answer in context; the wording asks it to answer again *differently* rather\n * than replay the same text. It is stored like any other turn, both by the\n * backend and in IndexedDB, and the transcript hides it when rendering rather\n * than trying to keep it out of storage — one filter covers the live turn, a\n * restored session and a page fetched from history.\n */\nexport const COPILOT_REGENERATE_PROMPT =\n\t'Please answer my previous question again — give a fresh, reworded response, ' +\n\t'not the same text as before.';\n\n/**\n * Whether a message is a regenerate request rather than something a reader\n * typed, and so must not be rendered.\n *\n * Matched on content alone, without checking the role: history rows are mapped\n * onto a role by pattern-matching the backend's `owner`, so a regenerate row\n * that lands on the wrong side must still stay hidden.\n */\nexport const isCopilotRegeneratePrompt = (content: string): boolean =>\n\tcontent.trim() === COPILOT_REGENERATE_PROMPT;\n"],"names":["COPILOT_REGENERATE_PROMPT","isCopilotRegeneratePrompt","content"],"mappings":"gFAYO,MAAMA,EACZ,2GAWYC,EAA6BC,GACzCA,EAAQ,SAAWF"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("idb-keyval"),_=require("./copilotMessagesClient.js"),a=i.createStore("bik-copilot","sessions"),p=1440*60*1e3,f=_.COPILOT_HISTORY_PAGE_SIZE,d=(t,e)=>`${e}:${t}`,r=async(t,e)=>{try{return await t()}catch{return e}},m=()=>typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`copilot-${Date.now()}-${Math.floor(Math.random()*1e6)}`,w=(t,e,n={})=>{const o=Date.now();return{sessionId:e,route:t,createdAt:o,updatedAt:o,expiresAt:o+p,messages:[],...n}},S=(t,e=Date.now())=>(t.expiresAt??t.updatedAt+p)<=e,I=(t,e)=>r(async()=>{const n=d(t,e),o=await i.get(n,a);return o?S(o)?(await i.del(n,a),null):o:null},null),A=t=>r(()=>i.set(d(t.route??"",t.sessionId),t,a),void 0),g=(t,e)=>r(()=>i.del(d(t,e),a),void 0),y=()=>r(async()=>(await i.keys(a)).filter(e=>typeof e=="string"),[]),O=t=>r(async()=>{const e=Date.now(),n=await y();await Promise.all(n.map(async o=>{const l=await i.get(o,a);if(!l)return;(t===void 0?S(l,e):l.updatedAt+t<=e)&&await i.del(o,a)}))},void 0),D=({route:t,storeId:e})=>r(async()=>{const n=`:${t}`,o=await y();return(await Promise.all(o.filter(s=>s.endsWith(n)).map(s=>i.get(s,a)))).filter(s=>!!s).filter(s=>!e||!s.storeId||s.storeId===e).filter(s=>!S(s)).sort((s,c)=>c.updatedAt-s.updatedAt)[0]?.sessionId??null},null),K=async({route:t,sessionId:e,messages:n,previousResponseId:o,storeId:l,agent:u})=>{const s=await I(t,e),c=Date.now(),E={...s??w(t,e),sessionId:e,route:t,updatedAt:c,expiresAt:c+p,messages:n.slice(-f).map(T=>{const C={...T};return delete C.isStreaming,C}),previousResponseId:o,storeId:l,agent:u};await A(E)};exports.COPILOT_SESSION_TTL_MS=p;exports.MAX_PERSISTED_MESSAGES=f;exports.copilotSessionKey=d;exports.createCopilotSession=w;exports.createCopilotSessionId=m;exports.deleteCopilotSession=g;exports.findLatestCopilotSessionId=D;exports.isCopilotSessionExpired=S;exports.listCopilotSessionKeys=y;exports.loadCopilotSession=I;exports.persistCopilotTurn=K;exports.pruneCopilotSessions=O;exports.saveCopilotSession=A;
2
- //# sourceMappingURL=copilotDb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"copilotDb.js","sources":["../../../../../src/components/bik-copilot/services/copilotDb.ts"],"sourcesContent":["import { createStore, del, get, keys, set } from 'idb-keyval';\nimport { CopilotMessage, CopilotSessionRecord } from '../model';\nimport { COPILOT_HISTORY_PAGE_SIZE } from './copilotMessagesClient';\n\n/**\n * Dedicated IndexedDB store. The chatbot's `db.ts` writes `ai-session:` keys\n * into idb-keyval's default store; the copilot keeps its own database so the two\n * transcripts can never overwrite each other and this schema can evolve freely.\n */\nconst copilotStore = createStore('bik-copilot', 'sessions');\n\n/**\n * How long a conversation outlives its last message.\n *\n * Enforced twice on purpose: `expiresAt` is stamped on every write so a reader\n * can tell a stale record from a live one on its own, and `pruneCopilotSessions`\n * sweeps the expired ones out. Without the stamp, a record would stay readable\n * until a sweep happened to run.\n */\nexport const COPILOT_SESSION_TTL_MS = 24 * 60 * 60 * 1000;\n\n/**\n * Newest messages kept per conversation. Older ones are dropped on write — the\n * backend is the archive, and `/bik-ai/copilot-messages` serves them back a page\n * at a time when the reader scrolls up.\n *\n * Deliberately equal to the endpoint's page size: the cache then holds exactly\n * what page 1 would return, so the first scroll-up asks for page 2 with no gap\n * and no duplicates.\n */\nexport const MAX_PERSISTED_MESSAGES = COPILOT_HISTORY_PAGE_SIZE;\n\n/**\n * Key of one conversation: `{sessionId}:{route}`.\n *\n * Both halves are the identity. The route is in it because a conversation\n * belongs to the page it was started on — coming back to that page continues it,\n * while a different page gets its own. The session id leads because it is what\n * the backend keys `/bik-ai/copilot-messages` by, so a key reads as \"this\n * conversation, on this page\".\n *\n * The separator is `:` rather than `_`, which routes themselves can contain.\n */\nexport const copilotSessionKey = (route: string, sessionId: string): string =>\n\t`${sessionId}:${route}`;\n\n/**\n * Every idb call is wrapped: IndexedDB is unavailable in SSR, in private-mode\n * Safari and when the browser evicts the database. Chat must keep working in\n * memory when persistence fails, so a rejection is swallowed and reported as\n * \"nothing stored\".\n */\nconst safely = async <T>(\n\toperation: () => Promise<T>,\n\tfallback: T,\n): Promise<T> => {\n\ttry {\n\t\treturn await operation();\n\t} catch {\n\t\treturn fallback;\n\t}\n};\n\nexport const createCopilotSessionId = (): string => {\n\tif (\n\t\ttypeof crypto !== 'undefined' &&\n\t\ttypeof crypto.randomUUID === 'function'\n\t) {\n\t\treturn crypto.randomUUID();\n\t}\n\treturn `copilot-${Date.now()}-${Math.floor(Math.random() * 1_000_000)}`;\n};\n\nexport const createCopilotSession = (\n\troute: string,\n\tsessionId: string,\n\tseed: Partial<CopilotSessionRecord> = {},\n): CopilotSessionRecord => {\n\tconst now = Date.now();\n\treturn {\n\t\tsessionId,\n\t\troute,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t\texpiresAt: now + COPILOT_SESSION_TTL_MS,\n\t\tmessages: [],\n\t\t...seed,\n\t};\n};\n\n/**\n * Whether a record has outlived its TTL.\n *\n * Records written before `expiresAt` existed fall back to their last write plus\n * the TTL, so an upgrade does not resurrect conversations that should be gone.\n */\nexport const isCopilotSessionExpired = (\n\trecord: CopilotSessionRecord,\n\tnow: number = Date.now(),\n): boolean =>\n\t(record.expiresAt ?? record.updatedAt + COPILOT_SESSION_TTL_MS) <= now;\n\n/**\n * Reads one conversation back, treating an expired record as absent — and\n * deleting it on the way past, so the sweep is not the only thing keeping the\n * store from growing.\n */\nexport const loadCopilotSession = (\n\troute: string,\n\tsessionId: string,\n): Promise<CopilotSessionRecord | null> =>\n\tsafely(async () => {\n\t\tconst key = copilotSessionKey(route, sessionId);\n\t\tconst record = await get<CopilotSessionRecord>(key, copilotStore);\n\t\tif (!record) {\n\t\t\treturn null;\n\t\t}\n\t\tif (isCopilotSessionExpired(record)) {\n\t\t\tawait del(key, copilotStore);\n\t\t\treturn null;\n\t\t}\n\t\treturn record;\n\t}, null);\n\nexport const saveCopilotSession = (\n\trecord: CopilotSessionRecord,\n): Promise<void> =>\n\tsafely(\n\t\t() =>\n\t\t\tset(\n\t\t\t\tcopilotSessionKey(record.route ?? '', record.sessionId),\n\t\t\t\trecord,\n\t\t\t\tcopilotStore,\n\t\t\t),\n\t\tundefined,\n\t);\n\nexport const deleteCopilotSession = (\n\troute: string,\n\tsessionId: string,\n): Promise<void> =>\n\tsafely(\n\t\t() => del(copilotSessionKey(route, sessionId), copilotStore),\n\t\tundefined,\n\t);\n\nexport const listCopilotSessionKeys = (): Promise<string[]> =>\n\tsafely(async () => {\n\t\tconst allKeys = await keys(copilotStore);\n\t\treturn allKeys.filter((key): key is string => typeof key === 'string');\n\t}, []);\n\n/**\n * Drops conversations whose TTL has run out.\n *\n * Without this the store keeps every conversation the merchant ever started, on\n * every route. Expiring by last write rather than by page load keeps a second\n * tab's live conversations intact.\n *\n * `maxAgeMs` overrides the stamped TTL, for callers that want a shorter sweep.\n */\nexport const pruneCopilotSessions = (maxAgeMs?: number): Promise<void> =>\n\tsafely(async () => {\n\t\tconst now = Date.now();\n\t\tconst allKeys = await listCopilotSessionKeys();\n\t\tawait Promise.all(\n\t\t\tallKeys.map(async (key) => {\n\t\t\t\tconst record = await get<CopilotSessionRecord>(key, copilotStore);\n\t\t\t\tif (!record) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst expired =\n\t\t\t\t\tmaxAgeMs === undefined\n\t\t\t\t\t\t? isCopilotSessionExpired(record, now)\n\t\t\t\t\t\t: record.updatedAt + maxAgeMs <= now;\n\t\t\t\tif (expired) {\n\t\t\t\t\tawait del(key, copilotStore);\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t}, undefined);\n\n/**\n * The session id of the most recently used conversation on a route, or `null`\n * when that route has none stored.\n *\n * This is what lets a refresh resume rather than start over: the ids themselves\n * only live in memory, so after a reload the stored records are the only place\n * left that knows which conversation the reader was in. Most recent by\n * `updatedAt` wins, which also means a conversation the reader reset — written\n * empty with a fresh stamp — is the one that comes back, not the one they\n * cleared.\n *\n * Scoped by store as well as route: two stores on the same route are two\n * conversations, and resuming the wrong one would show another store's history.\n */\nexport const findLatestCopilotSessionId = ({\n\troute,\n\tstoreId,\n}: {\n\troute: string;\n\tstoreId?: string;\n}): Promise<string | null> =>\n\tsafely(async () => {\n\t\t// The route is the tail of `{sessionId}:{route}`.\n\t\tconst suffix = `:${route}`;\n\t\tconst allKeys = await listCopilotSessionKeys();\n\t\tconst candidates = await Promise.all(\n\t\t\tallKeys\n\t\t\t\t.filter((key) => key.endsWith(suffix))\n\t\t\t\t.map((key) => get<CopilotSessionRecord>(key, copilotStore)),\n\t\t);\n\n\t\tconst newest = candidates\n\t\t\t.filter((record): record is CopilotSessionRecord => Boolean(record))\n\t\t\t// A record written before storeId was tracked has none; only reject on a\n\t\t\t// mismatch, so those stay resumable.\n\t\t\t.filter(\n\t\t\t\t(record) => !storeId || !record.storeId || record.storeId === storeId,\n\t\t\t)\n\t\t\t// An expired conversation must not be resumed, or a reader coming back\n\t\t\t// after a day would land in a session the sweep is about to delete.\n\t\t\t.filter((record) => !isCopilotSessionExpired(record))\n\t\t\t.sort((left, right) => right.updatedAt - left.updatedAt)[0];\n\n\t\treturn newest?.sessionId ?? null;\n\t}, null);\n\n/**\n * Persists one turn's worth of state. Called after every message and after each\n * completed stream, so navigating away mid-conversation loses nothing.\n */\nexport const persistCopilotTurn = async ({\n\troute,\n\tsessionId,\n\tmessages,\n\tpreviousResponseId,\n\tstoreId,\n\tagent,\n}: {\n\troute: string;\n\tsessionId: string;\n\tmessages: CopilotMessage[];\n\tpreviousResponseId?: string;\n\tstoreId?: string;\n\tagent?: string;\n}): Promise<void> => {\n\tconst existing = await loadCopilotSession(route, sessionId);\n\tconst now = Date.now();\n\tconst record: CopilotSessionRecord = {\n\t\t...(existing ?? createCopilotSession(route, sessionId)),\n\t\tsessionId,\n\t\troute,\n\t\tupdatedAt: now,\n\t\t// Restamped every write, so a conversation stays alive as long as it is\n\t\t// being used and starts its 24h only from the last message.\n\t\texpiresAt: now + COPILOT_SESSION_TTL_MS,\n\t\t// Streaming placeholders must not be restored as half-finished bubbles.\n\t\t// Only the newest page survives; anything older is the backend's to serve.\n\t\tmessages: messages.slice(-MAX_PERSISTED_MESSAGES).map((message) => {\n\t\t\tconst stored: CopilotMessage = { ...message };\n\t\t\tdelete stored.isStreaming;\n\t\t\treturn stored;\n\t\t}),\n\t\tpreviousResponseId,\n\t\tstoreId,\n\t\tagent,\n\t};\n\tawait saveCopilotSession(record);\n};\n"],"names":["copilotStore","createStore","COPILOT_SESSION_TTL_MS","MAX_PERSISTED_MESSAGES","COPILOT_HISTORY_PAGE_SIZE","copilotSessionKey","route","sessionId","safely","operation","fallback","createCopilotSessionId","createCopilotSession","seed","now","isCopilotSessionExpired","record","loadCopilotSession","key","get","del","saveCopilotSession","set","deleteCopilotSession","listCopilotSessionKeys","keys","pruneCopilotSessions","maxAgeMs","allKeys","findLatestCopilotSessionId","storeId","suffix","left","right","persistCopilotTurn","messages","previousResponseId","agent","existing","message","stored"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f="/bik-ai/copilot-feedback",y=t=>t==="like"?"LIKE":"DISLIKE",F=async({baseUrl:t,endpointPath:h=f,headers:b,authToken:p,getAuthToken:o,fetchImpl:k,storeId:w,sessionId:C,messageId:E,feedback:O,route:a,reply:c,user:s,reasons:i,comment:n,signal:P})=>{const u=`${t.replace(/\/$/,"")}${h}`,d=o?await o():p,e=await(k??fetch)(u,{method:"POST",headers:{"Content-Type":"application/json",...d?{authorization:d}:{},...b},body:JSON.stringify({storeId:w,sessionId:C,messageId:E,feedback:y(O),...a?{route:a}:{},...c?{reply:c}:{},...s?{user:s}:{},...i?.length?{reasons:i}:{},...n?{comment:n}:{}}),signal:P});if(!e.ok){const l=await e.text().catch(()=>"");throw new Error(`Copilot feedback request failed with ${e.status}${l?`: ${l}`:""}`)}const r=await e.json();if(r.success===!1)throw new Error(r.errors?.[0]?.message||"Could not record the feedback")};exports.COPILOT_FEEDBACK_PATH=f;exports.sendCopilotFeedback=F;
2
- //# sourceMappingURL=copilotFeedbackClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"copilotFeedbackClient.js","sources":["../../../../../src/components/bik-copilot/services/copilotFeedbackClient.ts"],"sourcesContent":["import { SendCopilotFeedbackOptions } from '../model';\n\n/** Default path of the feedback endpoint. */\nexport const COPILOT_FEEDBACK_PATH = '/bik-ai/copilot-feedback';\n\n/** The `ApiResponse<T>` envelope every non-streaming BIK AI endpoint returns. */\ninterface ApiEnvelope<T> {\n\tsuccess?: boolean;\n\tdata?: T;\n\terrors?: { code?: string; message?: string }[];\n}\n\ninterface FeedbackPayload {\n\tmessage_id?: string;\n\tmessageId?: string;\n\tfeedback?: string;\n}\n\n/** The vote as the backend spells it. */\nconst votePayload = (vote: 'like' | 'dislike'): 'LIKE' | 'DISLIKE' =>\n\tvote === 'like' ? 'LIKE' : 'DISLIKE';\n\n/**\n * Records a thumbs-up or thumbs-down on one reply.\n *\n * The rating is a side note to the conversation, not part of it: the transcript\n * does not change and nothing is rendered from the response, so a caller can\n * fire this and ignore the result. It still rejects on a failed call, so a host\n * that wants to surface or retry a lost vote can.\n *\n * `reply` and `route` are sent so the rating is readable on its own — whoever\n * reads the feedback sees what was rated without looking the message up.\n */\nexport const sendCopilotFeedback = async ({\n\tbaseUrl,\n\tendpointPath = COPILOT_FEEDBACK_PATH,\n\theaders,\n\tauthToken,\n\tgetAuthToken,\n\tfetchImpl,\n\tstoreId,\n\tsessionId,\n\tmessageId,\n\tfeedback,\n\troute,\n\treply,\n\tuser,\n\treasons,\n\tcomment,\n\tsignal,\n}: SendCopilotFeedbackOptions): Promise<void> => {\n\tconst url = `${baseUrl.replace(/\\/$/, '')}${endpointPath}`;\n\tconst token = getAuthToken ? await getAuthToken() : authToken;\n\tconst doFetch = fetchImpl ?? fetch;\n\n\tconst response = await doFetch(url, {\n\t\tmethod: 'POST',\n\t\theaders: {\n\t\t\t'Content-Type': 'application/json',\n\t\t\t...(token ? { authorization: token } : {}),\n\t\t\t...headers,\n\t\t},\n\t\tbody: JSON.stringify({\n\t\t\tstoreId,\n\t\t\tsessionId,\n\t\t\tmessageId,\n\t\t\tfeedback: votePayload(feedback),\n\t\t\t...(route ? { route } : {}),\n\t\t\t...(reply ? { reply } : {}),\n\t\t\t...(user ? { user } : {}),\n\t\t\t...(reasons?.length ? { reasons } : {}),\n\t\t\t...(comment ? { comment } : {}),\n\t\t}),\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst detail = await response.text().catch(() => '');\n\t\tthrow new Error(\n\t\t\t`Copilot feedback request failed with ${response.status}${\n\t\t\t\tdetail ? `: ${detail}` : ''\n\t\t\t}`,\n\t\t);\n\t}\n\n\tconst envelope = (await response.json()) as ApiEnvelope<FeedbackPayload>;\n\tif (envelope.success === false) {\n\t\tthrow new Error(\n\t\t\tenvelope.errors?.[0]?.message || 'Could not record the feedback',\n\t\t);\n\t}\n};\n"],"names":["COPILOT_FEEDBACK_PATH","votePayload","vote","sendCopilotFeedback","baseUrl","endpointPath","headers","authToken","getAuthToken","fetchImpl","storeId","sessionId","messageId","feedback","route","reply","user","reasons","comment","signal","url","token","response","detail","envelope"],"mappings":"gFAGO,MAAMA,EAAwB,2BAgB/BC,EAAeC,GACpBA,IAAS,OAAS,OAAS,UAafC,EAAsB,MAAO,CACzC,QAAAC,EACA,aAAAC,EAAeL,EACf,QAAAM,EACA,UAAAC,EACA,aAAAC,EACA,UAAAC,EACA,QAAAC,EACA,UAAAC,EACA,UAAAC,EACA,SAAAC,EACA,MAAAC,EACA,MAAAC,EACA,KAAAC,EACA,QAAAC,EACA,QAAAC,EACA,OAAAC,CACD,IAAiD,CAChD,MAAMC,EAAM,GAAGhB,EAAQ,QAAQ,MAAO,EAAE,CAAC,GAAGC,CAAY,GAClDgB,EAAQb,EAAe,MAAMA,EAAA,EAAiBD,EAG9Ce,EAAW,MAFDb,GAAa,OAEEW,EAAK,CACnC,OAAQ,OACR,QAAS,CACR,eAAgB,mBAChB,GAAIC,EAAQ,CAAE,cAAeA,CAAA,EAAU,CAAA,EACvC,GAAGf,CAAA,EAEJ,KAAM,KAAK,UAAU,CACpB,QAAAI,EACA,UAAAC,EACA,UAAAC,EACA,SAAUX,EAAYY,CAAQ,EAC9B,GAAIC,EAAQ,CAAE,MAAAA,CAAA,EAAU,CAAA,EACxB,GAAIC,EAAQ,CAAE,MAAAA,CAAA,EAAU,CAAA,EACxB,GAAIC,EAAO,CAAE,KAAAA,CAAA,EAAS,CAAA,EACtB,GAAIC,GAAS,OAAS,CAAE,QAAAA,CAAA,EAAY,CAAA,EACpC,GAAIC,EAAU,CAAE,QAAAA,GAAY,CAAA,CAAC,CAC7B,EACD,OAAAC,CAAA,CACA,EAED,GAAI,CAACG,EAAS,GAAI,CACjB,MAAMC,EAAS,MAAMD,EAAS,OAAO,MAAM,IAAM,EAAE,EACnD,MAAM,IAAI,MACT,wCAAwCA,EAAS,MAAM,GACtDC,EAAS,KAAKA,CAAM,GAAK,EAC1B,EAAA,CAEF,CAEA,MAAMC,EAAY,MAAMF,EAAS,KAAA,EACjC,GAAIE,EAAS,UAAY,GACxB,MAAM,IAAI,MACTA,EAAS,SAAS,CAAC,GAAG,SAAW,+BAAA,CAGpC"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l="/bik-ai/copilot-icebreakers",w=async({baseUrl:p,endpointPath:d=l,headers:b,authToken:f,getAuthToken:a,fetchImpl:h,agent:s,route:i,storeId:c,signal:u})=>{const k=`${p.replace(/\/$/,"")}${d}`,n=a?await a():f,o=await(h??fetch)(k,{method:"POST",headers:{"Content-Type":"application/json",...n?{authorization:n}:{},...b},body:JSON.stringify({agent:s,route:i,...c?{store_id:c}:{}}),signal:u});if(!o.ok){const t=await o.text().catch(()=>"");throw new Error(`Ice-breaker request failed with ${o.status}${t?`: ${t}`:""}`)}const r=await o.json();if(r.success===!1)throw new Error(r.errors?.[0]?.message||"Could not resolve icebreakers");const e=r.data??{};return{agent:e.agent??s,route:e.route??i,pageName:e.page_name??e.pageName??void 0,icebreakers:(e.icebreakers??[]).filter(t=>typeof t=="string"&&t.trim()!=="")}};exports.COPILOT_ICEBREAKERS_PATH=l;exports.fetchCopilotIcebreakers=w;
2
- //# sourceMappingURL=copilotIcebreakersClient.js.map