@giovchat/react-native 0.0.0-stage → 0.3.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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +390 -2
  3. package/dist/GiovChat.d.ts +135 -0
  4. package/dist/GiovChat.d.ts.map +1 -0
  5. package/dist/GiovChat.js +294 -0
  6. package/dist/GiovChat.js.map +1 -0
  7. package/dist/attachments.d.ts +121 -0
  8. package/dist/attachments.d.ts.map +1 -0
  9. package/dist/attachments.js +185 -0
  10. package/dist/attachments.js.map +1 -0
  11. package/dist/brand-assets.d.ts +6 -0
  12. package/dist/brand-assets.d.ts.map +1 -0
  13. package/dist/brand-assets.js +9 -0
  14. package/dist/brand-assets.js.map +1 -0
  15. package/dist/brandingStyle.d.ts +38 -0
  16. package/dist/brandingStyle.d.ts.map +1 -0
  17. package/dist/brandingStyle.js +71 -0
  18. package/dist/brandingStyle.js.map +1 -0
  19. package/dist/client.d.ts +226 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/client.js +891 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/color.d.ts +25 -0
  24. package/dist/color.d.ts.map +1 -0
  25. package/dist/color.js +78 -0
  26. package/dist/color.js.map +1 -0
  27. package/dist/components/Attachments.d.ts +13 -0
  28. package/dist/components/Attachments.d.ts.map +1 -0
  29. package/dist/components/Attachments.js +42 -0
  30. package/dist/components/Attachments.js.map +1 -0
  31. package/dist/components/Branding.d.ts +29 -0
  32. package/dist/components/Branding.d.ts.map +1 -0
  33. package/dist/components/Branding.js +71 -0
  34. package/dist/components/Branding.js.map +1 -0
  35. package/dist/components/ChatMarkdown.d.ts +15 -0
  36. package/dist/components/ChatMarkdown.d.ts.map +1 -0
  37. package/dist/components/ChatMarkdown.js +72 -0
  38. package/dist/components/ChatMarkdown.js.map +1 -0
  39. package/dist/components/GiovBotMark.d.ts +6 -0
  40. package/dist/components/GiovBotMark.d.ts.map +1 -0
  41. package/dist/components/GiovBotMark.js +11 -0
  42. package/dist/components/GiovBotMark.js.map +1 -0
  43. package/dist/components/GreetingBubble.d.ts +7 -0
  44. package/dist/components/GreetingBubble.d.ts.map +1 -0
  45. package/dist/components/GreetingBubble.js +12 -0
  46. package/dist/components/GreetingBubble.js.map +1 -0
  47. package/dist/components/Header.d.ts +18 -0
  48. package/dist/components/Header.d.ts.map +1 -0
  49. package/dist/components/Header.js +67 -0
  50. package/dist/components/Header.js.map +1 -0
  51. package/dist/components/MessageBubble.d.ts +23 -0
  52. package/dist/components/MessageBubble.d.ts.map +1 -0
  53. package/dist/components/MessageBubble.js +51 -0
  54. package/dist/components/MessageBubble.js.map +1 -0
  55. package/dist/components/PreChatForm.d.ts +11 -0
  56. package/dist/components/PreChatForm.d.ts.map +1 -0
  57. package/dist/components/PreChatForm.js +72 -0
  58. package/dist/components/PreChatForm.js.map +1 -0
  59. package/dist/components/RatingCard.d.ts +23 -0
  60. package/dist/components/RatingCard.d.ts.map +1 -0
  61. package/dist/components/RatingCard.js +107 -0
  62. package/dist/components/RatingCard.js.map +1 -0
  63. package/dist/components/TypingIndicator.d.ts +9 -0
  64. package/dist/components/TypingIndicator.d.ts.map +1 -0
  65. package/dist/components/TypingIndicator.js +18 -0
  66. package/dist/components/TypingIndicator.js.map +1 -0
  67. package/dist/components/WidgetStyles.d.ts +3 -0
  68. package/dist/components/WidgetStyles.d.ts.map +1 -0
  69. package/dist/components/WidgetStyles.js +9 -0
  70. package/dist/components/WidgetStyles.js.map +1 -0
  71. package/dist/components/bubbleStyles.d.ts +47 -0
  72. package/dist/components/bubbleStyles.d.ts.map +1 -0
  73. package/dist/components/bubbleStyles.js +19 -0
  74. package/dist/components/bubbleStyles.js.map +1 -0
  75. package/dist/components/index.d.ts +11 -0
  76. package/dist/components/index.d.ts.map +1 -0
  77. package/dist/components/index.js +14 -0
  78. package/dist/components/index.js.map +1 -0
  79. package/dist/errors.d.ts +20 -0
  80. package/dist/errors.d.ts.map +1 -0
  81. package/dist/errors.js +26 -0
  82. package/dist/errors.js.map +1 -0
  83. package/dist/i18n.d.ts +96 -0
  84. package/dist/i18n.d.ts.map +1 -0
  85. package/dist/i18n.js +392 -0
  86. package/dist/i18n.js.map +1 -0
  87. package/dist/identity.d.ts +41 -0
  88. package/dist/identity.d.ts.map +1 -0
  89. package/dist/identity.js +41 -0
  90. package/dist/identity.js.map +1 -0
  91. package/dist/index.d.ts +30 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +64 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/markdown.d.ts +56 -0
  96. package/dist/markdown.d.ts.map +1 -0
  97. package/dist/markdown.js +219 -0
  98. package/dist/markdown.js.map +1 -0
  99. package/dist/outbox.d.ts +68 -0
  100. package/dist/outbox.d.ts.map +1 -0
  101. package/dist/outbox.js +168 -0
  102. package/dist/outbox.js.map +1 -0
  103. package/dist/protocol.d.ts +9 -0
  104. package/dist/protocol.d.ts.map +1 -0
  105. package/dist/protocol.js +39 -0
  106. package/dist/protocol.js.map +1 -0
  107. package/dist/rating.d.ts +41 -0
  108. package/dist/rating.d.ts.map +1 -0
  109. package/dist/rating.js +165 -0
  110. package/dist/rating.js.map +1 -0
  111. package/dist/ratingStore.d.ts +36 -0
  112. package/dist/ratingStore.d.ts.map +1 -0
  113. package/dist/ratingStore.js +55 -0
  114. package/dist/ratingStore.js.map +1 -0
  115. package/dist/styleOverrides.d.ts +45 -0
  116. package/dist/styleOverrides.d.ts.map +1 -0
  117. package/dist/styleOverrides.js +63 -0
  118. package/dist/styleOverrides.js.map +1 -0
  119. package/dist/types.d.ts +156 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +3 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/unread.d.ts +9 -0
  124. package/dist/unread.d.ts.map +1 -0
  125. package/dist/unread.js +49 -0
  126. package/dist/unread.js.map +1 -0
  127. package/dist/useChatSession.d.ts +95 -0
  128. package/dist/useChatSession.d.ts.map +1 -0
  129. package/dist/useChatSession.js +965 -0
  130. package/dist/useChatSession.js.map +1 -0
  131. package/package.json +60 -4
  132. package/src/GiovChat.tsx +640 -0
  133. package/src/attachments.ts +218 -0
  134. package/src/brand-assets.ts +5 -0
  135. package/src/brandingStyle.ts +87 -0
  136. package/src/client.ts +848 -0
  137. package/src/color.ts +74 -0
  138. package/src/components/Attachments.tsx +75 -0
  139. package/src/components/Branding.tsx +94 -0
  140. package/src/components/ChatMarkdown.tsx +111 -0
  141. package/src/components/GiovBotMark.tsx +19 -0
  142. package/src/components/GreetingBubble.tsx +20 -0
  143. package/src/components/Header.tsx +131 -0
  144. package/src/components/MessageBubble.tsx +137 -0
  145. package/src/components/PreChatForm.tsx +183 -0
  146. package/src/components/RatingCard.tsx +219 -0
  147. package/src/components/TypingIndicator.tsx +34 -0
  148. package/src/components/WidgetStyles.tsx +5 -0
  149. package/src/components/bubbleStyles.ts +16 -0
  150. package/src/components/index.ts +14 -0
  151. package/src/errors.ts +33 -0
  152. package/src/i18n.ts +474 -0
  153. package/src/identity.ts +54 -0
  154. package/src/index.ts +85 -0
  155. package/src/markdown.ts +227 -0
  156. package/src/outbox.ts +175 -0
  157. package/src/protocol.ts +36 -0
  158. package/src/rating.ts +169 -0
  159. package/src/ratingStore.ts +65 -0
  160. package/src/styleOverrides.ts +98 -0
  161. package/src/types.ts +170 -0
  162. package/src/unread.ts +39 -0
  163. package/src/useChatSession.ts +841 -0
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ /**
3
+ * Attachments, as the web widget handles them (apps/widget-web/src/lib/attachment-policy.ts,
4
+ * attachment-preview.ts and attachment-access.ts): the agent's policy decides what a visitor may
5
+ * send, previews arrive from the network and are validated field by field, and downloads carry a
6
+ * narrow per-conversation access token. Pure: no React or native modules.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ATTACHMENT_ACCESS_MARGIN_MS = exports.MAX_IMAGE_HEIGHT = exports.MAX_IMAGE_WIDTH = exports.MAX_ATTACHED_FILES = exports.DEFAULT_ATTACHMENT_POLICY = exports.SUPPORTED_ATTACHMENT_TYPES = void 0;
10
+ exports.normalizeAttachmentPolicy = normalizeAttachmentPolicy;
11
+ exports.validateAttachments = validateAttachments;
12
+ exports.sanitizePreview = sanitizePreview;
13
+ exports.parseAttachments = parseAttachments;
14
+ exports.previewBoxSize = previewBoxSize;
15
+ exports.isImageAttachment = isImageAttachment;
16
+ exports.attachmentName = attachmentName;
17
+ exports.parseAttachmentAccess = parseAttachmentAccess;
18
+ exports.usableAttachmentToken = usableAttachmentToken;
19
+ exports.newerAttachmentAccess = newerAttachmentAccess;
20
+ exports.attachmentDisplayUrl = attachmentDisplayUrl;
21
+ exports.uploadPreview = uploadPreview;
22
+ exports.buildUploadForm = buildUploadForm;
23
+ // The visitor upload endpoint accepts this bounded set; a wildcard cannot enable other types.
24
+ exports.SUPPORTED_ATTACHMENT_TYPES = [
25
+ "image/jpeg", "image/png", "image/gif", "image/webp", "application/pdf", "text/plain", "text/csv",
26
+ "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
27
+ "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
28
+ "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation",
29
+ "audio/mpeg", "audio/mp4", "audio/ogg", "audio/webm", "audio/wav",
30
+ ];
31
+ const LEGACY_IMAGE_TYPES = exports.SUPPORTED_ATTACHMENT_TYPES.filter((type) => type.startsWith("image/"));
32
+ /** Without a published agent policy, visitors may send images (the widget's default). */
33
+ exports.DEFAULT_ATTACHMENT_POLICY = { enabled: true, allowedTypes: LEGACY_IMAGE_TYPES, maxSizeMb: 10 };
34
+ exports.MAX_ATTACHED_FILES = 5;
35
+ function normalizeAttachmentPolicy(value) {
36
+ if (!value || typeof value !== "object" || Array.isArray(value))
37
+ return undefined;
38
+ const raw = value;
39
+ const patterns = Array.isArray(raw.allowedTypes)
40
+ ? raw.allowedTypes.filter((type) => typeof type === "string").map((type) => type.toLowerCase())
41
+ : LEGACY_IMAGE_TYPES;
42
+ return {
43
+ enabled: raw.enabled !== false,
44
+ allowedTypes: exports.SUPPORTED_ATTACHMENT_TYPES.filter((type) => patterns.some((pattern) => pattern === "*" || pattern === type || (pattern.endsWith("/*") && type.startsWith(pattern.slice(0, -1))))),
45
+ maxSizeMb: typeof raw.maxSizeMb === "number" && Number.isFinite(raw.maxSizeMb)
46
+ ? Math.max(0.1, Math.min(10, raw.maxSizeMb)) : 10,
47
+ };
48
+ }
49
+ /** The picker's files checked against the policy; the server remains authoritative. */
50
+ function validateAttachments(files, existingCount = 0, policy = exports.DEFAULT_ATTACHMENT_POLICY) {
51
+ if (!policy.enabled)
52
+ return { accepted: [], problems: files.length ? [{ kind: "disabled" }] : [] };
53
+ const accepted = [];
54
+ const problems = [];
55
+ const capacity = Math.max(0, exports.MAX_ATTACHED_FILES - existingCount);
56
+ for (const file of files) {
57
+ if (!policy.allowedTypes.includes(String(file.type).toLowerCase()))
58
+ problems.push({ kind: "type", name: file.name });
59
+ else if (typeof file.size === "number" && file.size > policy.maxSizeMb * 1024 * 1024)
60
+ problems.push({ kind: "size", name: file.name, maxSizeMb: policy.maxSizeMb });
61
+ else if (accepted.length >= capacity) {
62
+ if (!problems.some((problem) => problem.kind === "count"))
63
+ problems.push({ kind: "count", max: exports.MAX_ATTACHED_FILES });
64
+ }
65
+ else
66
+ accepted.push(file);
67
+ }
68
+ return { accepted, problems };
69
+ }
70
+ const MAX_THUMB_LENGTH = 6000;
71
+ const THUMB_PATTERN = /^data:image\/(jpeg|webp);base64,[A-Za-z0-9+/=]+$/;
72
+ const dimension = (value) => typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
73
+ /** Keeps only the parts of an untrusted preview that are safe to render. */
74
+ function sanitizePreview(value) {
75
+ if (!value || typeof value !== "object")
76
+ return undefined;
77
+ const raw = value;
78
+ const preview = {};
79
+ if (typeof raw.thumb === "string" && raw.thumb.length <= MAX_THUMB_LENGTH && THUMB_PATTERN.test(raw.thumb))
80
+ preview.thumb = raw.thumb;
81
+ const width = dimension(raw.width), height = dimension(raw.height);
82
+ // An aspect ratio needs both sides, so a lone dimension is dropped.
83
+ if (width && height) {
84
+ preview.width = width;
85
+ preview.height = height;
86
+ }
87
+ return preview.thumb || preview.width ? preview : undefined;
88
+ }
89
+ /**
90
+ * `attachmentId` is a JSON-encoded array of URLs (the socket and history both send it that way).
91
+ * `previews` is a real array aligned with it by index; anything else means no previews.
92
+ */
93
+ function parseAttachments(attachmentId, previews) {
94
+ if (!attachmentId || typeof attachmentId !== "string")
95
+ return [];
96
+ try {
97
+ const urls = JSON.parse(attachmentId);
98
+ if (!Array.isArray(urls))
99
+ return [];
100
+ const list = Array.isArray(previews) ? previews : [];
101
+ return urls.filter((url) => typeof url === "string" && url.length > 0).map((url, index) => {
102
+ const preview = sanitizePreview(list[index]);
103
+ return preview ? { url, filename: "", preview } : { url, filename: "" };
104
+ });
105
+ }
106
+ catch {
107
+ return [];
108
+ }
109
+ }
110
+ /** Mirrors the widget's attachment image cap. */
111
+ exports.MAX_IMAGE_WIDTH = 200;
112
+ exports.MAX_IMAGE_HEIGHT = 150;
113
+ /** Display box for an image, scaled down (never up) to fit the cap. */
114
+ function previewBoxSize(preview, maxWidth = exports.MAX_IMAGE_WIDTH, maxHeight = exports.MAX_IMAGE_HEIGHT) {
115
+ if (!preview?.width || !preview.height)
116
+ return null;
117
+ const scale = Math.min(1, maxWidth / preview.width, maxHeight / preview.height);
118
+ return { width: Math.max(1, Math.round(preview.width * scale)), height: Math.max(1, Math.round(preview.height * scale)) };
119
+ }
120
+ const IMAGE_EXTENSION = /\.(jpe?g|png|gif|webp)$/i;
121
+ /** Images render inline; everything else is a file row. */
122
+ function isImageAttachment(attachment) {
123
+ if (attachment.contentType)
124
+ return attachment.contentType.startsWith("image/");
125
+ if (attachment.preview)
126
+ return true;
127
+ try {
128
+ return IMAGE_EXTENSION.test(decodeURIComponent(new URL(attachment.url).pathname));
129
+ }
130
+ catch {
131
+ return IMAGE_EXTENSION.test(attachment.url);
132
+ }
133
+ }
134
+ /** A readable name for a file row: the known filename, else the last path segment of the URL. */
135
+ function attachmentName(attachment) {
136
+ if (attachment.filename)
137
+ return attachment.filename;
138
+ try {
139
+ const last = decodeURIComponent(new URL(attachment.url).pathname).split("/").filter(Boolean).pop();
140
+ return last || "";
141
+ }
142
+ catch {
143
+ return "";
144
+ }
145
+ }
146
+ const ACCESS_TOKEN = /^[A-Za-z0-9._-]{16,256}$/;
147
+ /** Stop using a token this long before it expires, so a download never starts with a dying one. */
148
+ exports.ATTACHMENT_ACCESS_MARGIN_MS = 5 * 60 * 1000;
149
+ function parseAttachmentAccess(value) {
150
+ const { token, expiresAt } = (value ?? {});
151
+ return typeof token === "string" && ACCESS_TOKEN.test(token) && typeof expiresAt === "number" && Number.isFinite(expiresAt)
152
+ ? { token, expiresAt } : null;
153
+ }
154
+ function usableAttachmentToken(access, now) {
155
+ return access && access.expiresAt - now > exports.ATTACHMENT_ACCESS_MARGIN_MS ? access.token : undefined;
156
+ }
157
+ /** Keeps the stored value unless the response carried one that expires no earlier. */
158
+ function newerAttachmentAccess(current, incoming) {
159
+ return incoming && !(current && current.expiresAt > incoming.expiresAt) ? incoming : current;
160
+ }
161
+ /** Adds exactly one credential: `at` when an access token is usable, else the visitor token, else nothing. */
162
+ function attachmentDisplayUrl(url, accessToken, visitorToken) {
163
+ const credential = accessToken ? `at=${accessToken}` : visitorToken ? `token=${encodeURIComponent(visitorToken)}` : "";
164
+ return credential ? `${url}${url.includes("?") ? "&" : "?"}${credential}` : url;
165
+ }
166
+ /** The preview the upload can carry: all three fields or none, as the server requires. */
167
+ function uploadPreview(file) {
168
+ if (!file.type.startsWith("image/"))
169
+ return null;
170
+ const preview = sanitizePreview({ thumb: file.thumbnail, width: file.width, height: file.height });
171
+ return preview?.thumb && preview.width && preview.height ? { thumb: preview.thumb, width: preview.width, height: preview.height } : null;
172
+ }
173
+ /** React Native's FormData takes `{ uri, name, type }` for a file part; the preview fields are optional extras. */
174
+ function buildUploadForm(file) {
175
+ const form = new FormData();
176
+ form.append("file", { uri: file.uri, name: file.name || "file", type: file.type });
177
+ const preview = uploadPreview(file);
178
+ if (preview) {
179
+ form.append("thumbnail", preview.thumb);
180
+ form.append("width", String(Math.round(preview.width)));
181
+ form.append("height", String(Math.round(preview.height)));
182
+ }
183
+ return form;
184
+ }
185
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Native Image fallback, mechanically rendered at 64px from packages/brand/giovbot.svg.
2
+ * No native SVG dependency, extra requests, or remote branding assets are required.
3
+ */
4
+ export declare const giovBotMarkSvgSha256 = "10ce5835dfa47fb08d05cdb877187c38f960d1a76d8fd82ba49e59f72197311f";
5
+ export declare const giovBotMarkDataUri = "data:image/png;base64,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";
6
+ //# sourceMappingURL=brand-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-assets.d.ts","sourceRoot":"","sources":["../src/brand-assets.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,oBAAoB,qEAAqE,CAAC;AACvG,eAAO,MAAM,kBAAkB,+zLAA+zL,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.giovBotMarkDataUri = exports.giovBotMarkSvgSha256 = void 0;
4
+ /** Native Image fallback, mechanically rendered at 64px from packages/brand/giovbot.svg.
5
+ * No native SVG dependency, extra requests, or remote branding assets are required.
6
+ */
7
+ exports.giovBotMarkSvgSha256 = "10ce5835dfa47fb08d05cdb877187c38f960d1a76d8fd82ba49e59f72197311f";
8
+ exports.giovBotMarkDataUri = "data:image/png;base64,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";
9
+ //# sourceMappingURL=brand-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-assets.js","sourceRoot":"","sources":["../src/brand-assets.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,oBAAoB,GAAG,kEAAkE,CAAC;AAC1F,QAAA,kBAAkB,GAAG,4zLAA4zL,CAAC"}
@@ -0,0 +1,38 @@
1
+ /** The "Powered by GiovChat" footer's style slot. Layout, size and text stay SDK-controlled. */
2
+ export interface GiovChatBrandingStyle {
3
+ /** Font family of the footer. Defaults to the top-level `fontFamily`. */
4
+ fontFamily?: string;
5
+ /** Colour of "Powered by". Must reach 4.5:1 against the footer background. */
6
+ color?: string;
7
+ /** Colour of "GiovChat" (the link). Must reach 4.5:1 against the footer background. */
8
+ brandColor?: string;
9
+ /** Footer background. Opaque colours only. */
10
+ backgroundColor?: string;
11
+ }
12
+ /** WCAG AA for normal text. */
13
+ export declare const FOOTER_MIN_CONTRAST = 4.5;
14
+ export declare const FOOTER_DEFAULTS: {
15
+ readonly backgroundColor: "#ffffff";
16
+ readonly color: "#52525b";
17
+ readonly brandColor: "#7c3aed";
18
+ };
19
+ /** The footer text is never smaller than this, whatever the app's style. */
20
+ export declare const FOOTER_FONT_SIZE = 12;
21
+ export interface ResolvedFooterStyle {
22
+ fontFamily?: string;
23
+ color: string;
24
+ brandColor: string;
25
+ backgroundColor: string;
26
+ /** True when the app changed the background: the divider is then a neutral translucent grey. */
27
+ customBackground: boolean;
28
+ }
29
+ /** `parseColor`, but null for anything see-through: `transparent`, alpha below 1 (hex, rgba). */
30
+ export declare function parseOpaqueColor(value: unknown): [number, number, number] | null;
31
+ /**
32
+ * Applies the app's footer colours under the accessibility rules: an override that is see-through,
33
+ * unreadable (named colours), or below 4.5:1 against the effective background falls back to the
34
+ * SDK's default for that property (or, when the default fails too on the app's own background, to
35
+ * black or white). `warn` receives one message per rejected value.
36
+ */
37
+ export declare function resolveFooterStyle(slot: GiovChatBrandingStyle | undefined, warn?: (message: string) => void): ResolvedFooterStyle;
38
+ //# sourceMappingURL=brandingStyle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brandingStyle.d.ts","sourceRoot":"","sources":["../src/brandingStyle.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,+BAA+B;AAC/B,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,eAAe;;;;CAAmF,CAAC;AAChH,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,gGAAgG;IAChG,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,iGAAiG;AACjG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAchF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,qBAAqB,GAAG,SAAS,EACvC,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe,GACzC,mBAAmB,CA+BrB"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FOOTER_FONT_SIZE = exports.FOOTER_DEFAULTS = exports.FOOTER_MIN_CONTRAST = void 0;
4
+ exports.parseOpaqueColor = parseOpaqueColor;
5
+ exports.resolveFooterStyle = resolveFooterStyle;
6
+ const color_1 = require("./color");
7
+ /** WCAG AA for normal text. */
8
+ exports.FOOTER_MIN_CONTRAST = 4.5;
9
+ exports.FOOTER_DEFAULTS = { backgroundColor: "#ffffff", color: "#52525b", brandColor: "#7c3aed" };
10
+ /** The footer text is never smaller than this, whatever the app's style. */
11
+ exports.FOOTER_FONT_SIZE = 12;
12
+ /** `parseColor`, but null for anything see-through: `transparent`, alpha below 1 (hex, rgba). */
13
+ function parseOpaqueColor(value) {
14
+ if (typeof value !== "string")
15
+ return null;
16
+ const text = value.trim().toLowerCase();
17
+ const hex = /^#([0-9a-f]{4}|[0-9a-f]{8})$/.exec(text)?.[1];
18
+ if (hex) {
19
+ const alpha = hex.length === 4 ? hex[3] + hex[3] : hex.slice(6, 8);
20
+ if (parseInt(alpha, 16) !== 255)
21
+ return null;
22
+ }
23
+ const functional = /^rgba?\(\s*\d{1,3}\s*[, ]\s*\d{1,3}\s*[, ]\s*\d{1,3}\s*(?:[,/]\s*([\d.]+)(%?)\s*)?\)$/.exec(text);
24
+ if (functional?.[1] !== undefined) {
25
+ const alpha = Number(functional[1]) / (functional[2] ? 100 : 1);
26
+ if (!(alpha >= 1))
27
+ return null;
28
+ }
29
+ return (0, color_1.parseColor)(text);
30
+ }
31
+ /**
32
+ * Applies the app's footer colours under the accessibility rules: an override that is see-through,
33
+ * unreadable (named colours), or below 4.5:1 against the effective background falls back to the
34
+ * SDK's default for that property (or, when the default fails too on the app's own background, to
35
+ * black or white). `warn` receives one message per rejected value.
36
+ */
37
+ function resolveFooterStyle(slot, warn = () => { }) {
38
+ let background = exports.FOOTER_DEFAULTS.backgroundColor;
39
+ let customBackground = false;
40
+ if (slot?.backgroundColor !== undefined) {
41
+ if (parseOpaqueColor(slot.backgroundColor)) {
42
+ background = slot.backgroundColor;
43
+ customBackground = true;
44
+ }
45
+ else {
46
+ warn(`GiovChat: branding.backgroundColor "${slot.backgroundColor}" is ignored (use an opaque hex or rgb colour).`);
47
+ }
48
+ }
49
+ const backgroundRgb = (0, color_1.parseColor)(background);
50
+ const readable = (candidate) => {
51
+ const rgb = (0, color_1.parseColor)(candidate);
52
+ return rgb !== null && (0, color_1.contrastRatio)(rgb, backgroundRgb) >= exports.FOOTER_MIN_CONTRAST;
53
+ };
54
+ const pick = (name) => {
55
+ const wanted = slot?.[name];
56
+ if (wanted !== undefined) {
57
+ if (parseOpaqueColor(wanted) && readable(wanted))
58
+ return wanted;
59
+ warn(`GiovChat: branding.${name} "${wanted}" is ignored (an opaque colour with at least ${exports.FOOTER_MIN_CONTRAST}:1 contrast against the footer background is required).`);
60
+ }
61
+ return readable(exports.FOOTER_DEFAULTS[name]) ? exports.FOOTER_DEFAULTS[name] : (0, color_1.textOn)(background);
62
+ };
63
+ return {
64
+ ...(slot?.fontFamily ? { fontFamily: slot.fontFamily } : {}),
65
+ color: pick("color"),
66
+ brandColor: pick("brandColor"),
67
+ backgroundColor: background,
68
+ customBackground,
69
+ };
70
+ }
71
+ //# sourceMappingURL=brandingStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brandingStyle.js","sourceRoot":"","sources":["../src/brandingStyle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ import type { GiovChatContact, GiovChatSession, GiovFeedbackValue, GiovMessage, GiovRatingResult, GiovWidgetConfig, MessageHandler, StatusHandler } from "./types";
2
+ import { GiovChatError } from "./errors";
3
+ import { type GiovRatingFrame } from "./rating";
4
+ import { Outbox } from "./outbox";
5
+ import { type AttachmentAccess, type GiovAttachmentPreview, type GiovChatPickedFile } from "./attachments";
6
+ export declare const DEFAULT_BASE_URL = "https://api.giovchat.app";
7
+ /** Keep in step with package.json; sent so the dashboard can show where the chat is installed. */
8
+ export declare const SDK_VERSION = "0.3.0";
9
+ export declare const CLIENT_HEADER: {
10
+ "X-Giov-Client": string;
11
+ };
12
+ export declare function normalizeBaseUrl(value: string): string;
13
+ export declare function fetchWidgetConfig(baseUrl: string, tenantKey: string, signal?: AbortSignal): Promise<GiovWidgetConfig>;
14
+ /** Creates a credential-bearing visitor session. Resuming requires the entire session. */
15
+ export declare function createConversation(baseUrl: string, tenantKey: string, contact?: GiovChatContact, existingSession?: GiovChatSession, signal?: AbortSignal): Promise<GiovChatSession>;
16
+ export interface GiovConversationHistory {
17
+ messages: GiovMessage[];
18
+ closed: boolean;
19
+ /** The teammate who has the conversation, when one does; the header shows them. */
20
+ assignedAgentName?: string | null;
21
+ assignedAgentAvatar?: string | null;
22
+ attachmentAccess?: AttachmentAccess | null;
23
+ }
24
+ export declare function fetchConversationHistory(baseUrl: string, tenantKey: string, session: GiovChatSession, signal?: AbortSignal): Promise<GiovConversationHistory>;
25
+ export interface ChatClientOptions {
26
+ baseUrl?: string;
27
+ tenantKey: string;
28
+ /**
29
+ * Messages waiting for the server. Pass one that outlives this client (the chat UI does) so
30
+ * messages typed while reconnecting or in the background are sent once a socket is back.
31
+ */
32
+ outbox?: Outbox;
33
+ /**
34
+ * Send the outbox as soon as a socket opens (default). The chat UI turns this off and calls
35
+ * `flush()` after the history catch-up, in the protocol's order: open, history, merge, resend.
36
+ */
37
+ flushOnOpen?: boolean;
38
+ }
39
+ /** The `conversation_state` frame. */
40
+ export interface GiovConversationState {
41
+ status?: "open" | "closed";
42
+ handedOff?: boolean;
43
+ assignedAgentName?: string;
44
+ assignedAgentAvatar?: string;
45
+ }
46
+ /** A GiovBot reply arriving word by word: the whole text so far, then `end` once it is saved or dropped. */
47
+ export type GiovStreamEvent = {
48
+ streamId: string;
49
+ content: string;
50
+ end?: false;
51
+ } | {
52
+ streamId: string;
53
+ end: true;
54
+ };
55
+ export interface GiovUploadResult {
56
+ url: string;
57
+ filename: string;
58
+ preview?: GiovAttachmentPreview;
59
+ }
60
+ export type GiovPushPlatform = "ios" | "android";
61
+ /**
62
+ * `environment`: APNs only; "sandbox" for development builds (Xcode), "production" (the default) for
63
+ * TestFlight and the App Store. `appId`: the bundle id or package name. `locale`: the language of the
64
+ * generic notification text when the workspace hides message text (default: the device language).
65
+ */
66
+ export type GiovPushOptions = {
67
+ environment?: "sandbox" | "production";
68
+ appId?: string;
69
+ locale?: string;
70
+ };
71
+ export type GiovPushRegistration = {
72
+ registered: true;
73
+ } | {
74
+ registered: false;
75
+ reason: "unsupported" | "no_conversation" | "failed";
76
+ };
77
+ /**
78
+ * Visitor push registration (docs/protocol/README.md, "Push notifications"). Feature-detected: a
79
+ * server without it answers 404/405/501 and registration degrades to a no-op.
80
+ */
81
+ export declare const PUSH_TOKEN_PATH = "/push-token";
82
+ /** Connection timings from the visitor protocol (docs/protocol/README.md). */
83
+ export declare const OPEN_TIMEOUT_MS = 10000;
84
+ export declare const PING_INTERVAL_MS = 25000;
85
+ export declare const PONG_TIMEOUT_MS = 10000;
86
+ /** Retry waits: min(1500 × 2^attempt, 15000) ms plus a little jitter; reset after a successful connect. */
87
+ export declare function reconnectDelay(attempt: number, jitter?: number): number;
88
+ /** Transport only. Session credentials are never derived from contact information. */
89
+ export declare class ChatClient {
90
+ private readonly options;
91
+ private ws;
92
+ private messageCbs;
93
+ private statusCbs;
94
+ private typingCbs;
95
+ private errorCbs;
96
+ private ackCbs;
97
+ private streamCbs;
98
+ private accessCbs;
99
+ private ratingCbs;
100
+ private stateCbs;
101
+ private pending;
102
+ private timer;
103
+ private heartbeat;
104
+ private watchdog;
105
+ private resendTimers;
106
+ private controller;
107
+ private cancelHandshake;
108
+ private generation;
109
+ private desired;
110
+ private attempt;
111
+ private session;
112
+ private widgetToken;
113
+ private tokenRequest;
114
+ private pushUnsupported;
115
+ private ratingsUnsupportedFlag;
116
+ private readonly baseUrl;
117
+ readonly outbox: Outbox;
118
+ constructor(options: ChatClientOptions);
119
+ onMessage(cb: MessageHandler): () => void;
120
+ onStatusChange(cb: StatusHandler): () => void;
121
+ /** `isBot` is server-reported identity; undefined means an older/unknown sender. */
122
+ onTyping(cb: (typing: boolean, isBot?: boolean) => void): () => void;
123
+ onError(cb: (error: GiovChatError) => void): () => void;
124
+ /** The server saved a visitor message: the stored copy replaces the one shown while sending. */
125
+ onAck(cb: (clientMessageId: string, message: GiovMessage) => void): () => void;
126
+ onStream(cb: (event: GiovStreamEvent) => void): () => void;
127
+ /** A newer attachment download token arrived (with a visitor token). */
128
+ onAttachmentAccess(cb: (access: AttachmentAccess) => void): () => void;
129
+ /** A rating card was answered or changed (on any device), or replaced by a newer one. */
130
+ onRating(cb: (frame: GiovRatingFrame) => void): () => void;
131
+ /**
132
+ * The conversation was closed or reopened (`conversation_state` frame, sent on close and reopen) or handed
133
+ * to someone. `status` is absent on older servers: keep using the history's `status` there.
134
+ */
135
+ onConversationState(cb: (state: GiovConversationState) => void): () => void;
136
+ private emit;
137
+ connect(session: GiovChatSession): Promise<void>;
138
+ private token;
139
+ /** The current visitor token, for attachment downloads when no access token is usable. */
140
+ get visitorToken(): string | null;
141
+ /** When the current visitor token expires (milliseconds); 0 without one. */
142
+ get visitorTokenExpiresAt(): number;
143
+ /**
144
+ * Fetches a new visitor token (and with it, usually, a newer attachment access token), e.g. before
145
+ * attachment links that use the visitor token expire. Resolves false when it could not; never throws.
146
+ */
147
+ renewVisitorToken(): Promise<boolean>;
148
+ private open;
149
+ private receive;
150
+ /** Error frames: a save failure names its message; refusals and rate limits apply to what is on the socket. */
151
+ private serverError;
152
+ private later;
153
+ private settle;
154
+ private fail;
155
+ private reconnect;
156
+ /** Reconnect now instead of waiting for the backoff, e.g. when the app returns to the foreground. */
157
+ reconnectNow(): void;
158
+ /** Puts everything waiting in the outbox on the socket, oldest first. */
159
+ flush(): void;
160
+ /**
161
+ * Queues a visitor message and sends it as soon as a socket is open; returns its client message id
162
+ * at once. Delivery is tracked in `outbox` and confirmed through `onAck`.
163
+ */
164
+ send(text: string, attachments?: readonly string[]): string;
165
+ /**
166
+ * Sends one message and resolves with the stored copy once the server confirms it. While the
167
+ * connection is being restored it waits in the outbox instead of failing. Rejects only when the
168
+ * server refuses it or `disconnect()` is called first.
169
+ */
170
+ sendMessage(text: string): Promise<GiovMessage>;
171
+ /** Sends a message that failed again, in its original place in the queue. */
172
+ retryMessage(clientMessageId: string): boolean;
173
+ /** The visitor started typing (send once per burst) or stopped. */
174
+ sendTyping(): void;
175
+ sendTypingEnd(): void;
176
+ private sendFrame;
177
+ /**
178
+ * Uploads one file to this conversation and returns its URL for `send`. Reports progress (0–1)
179
+ * where XMLHttpRequest is available (React Native has it). Retries once with a new token on 401.
180
+ */
181
+ uploadAttachment(file: GiovChatPickedFile, onProgress?: (fraction: number) => void): Promise<GiovUploadResult>;
182
+ /**
183
+ * Registers this device for visitor push notifications about this conversation. Until the server
184
+ * supports visitor push it resolves `{ registered: false, reason: "unsupported" }` and never throws.
185
+ */
186
+ registerPushToken(token: string, platform: GiovPushPlatform, options?: GiovPushOptions): Promise<GiovPushRegistration>;
187
+ /**
188
+ * Stops push notifications about this conversation on this device (sign-out, notifications turned
189
+ * off). Resolves true when the server confirmed; never throws. Without a live connection, pass the
190
+ * stored `session`: a fresh visitor token is fetched for it.
191
+ */
192
+ unregisterPushToken(token: string, session?: GiovChatSession | null): Promise<boolean>;
193
+ /** One push-token request with the visitor token, renewed once on 401 (protocol "Tokens"). */
194
+ private pushRequest;
195
+ /** True once the server answered a rating or feedback route with 404: an older server, so the controls are hidden. */
196
+ get ratingsUnsupported(): boolean;
197
+ /**
198
+ * Answers the conversation's rating card (`POST /conversations/{id}/rating`). Omit `requestId` to answer the
199
+ * open card. The same answer again is a no-op; a different one replaces it until the card closes. Rejects with a
200
+ * `GiovChatError` whose code is `invalid_rating`, `request_not_found`, `request_replaced`, `rating_closed`,
201
+ * `too_many_changes`, `rate_limited` (with `retryAfterSeconds`), `unsupported` (an older server) or a transport code.
202
+ */
203
+ submitRating(score: number, options?: {
204
+ comment?: string;
205
+ requestId?: string;
206
+ }): Promise<GiovRatingResult>;
207
+ /** Thumbs up or down on a GiovBot answer (`POST /conversations/{id}/messages/{messageId}/feedback`); `none` takes the vote back. */
208
+ submitAnswerFeedback(messageId: string, value: GiovFeedbackValue, options?: {
209
+ reason?: string;
210
+ }): Promise<void>;
211
+ /** One visitor-token POST on this conversation, the token renewed once on 401 (protocol "Tokens"). */
212
+ private visitorPost;
213
+ private rejectPending;
214
+ /** Closes the connection. Unsent messages stay in the outbox; promises from sendMessage are rejected. */
215
+ disconnect(): void;
216
+ private teardown;
217
+ get isConnected(): boolean;
218
+ }
219
+ /**
220
+ * Stops push for a stored conversation without a connection (the chat is closed or hidden): a fresh
221
+ * visitor token from the session secret, then `DELETE /push-token`. Never throws.
222
+ */
223
+ export declare function unregisterPushToken(baseUrl: string, tenantKey: string, session: GiovChatSession, token: string): Promise<boolean>;
224
+ /** The whole upload, retry included, gives up after this long. */
225
+ export declare const UPLOAD_TIMEOUT_MS = 120000;
226
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EACpI,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAgC,MAAM,UAAU,CAAC;AAEvE,OAAO,EAA6F,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3I,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAE3D,kGAAkG;AAClG,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,aAAa;;CAAqD,CAAC;AAEhF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtD;AAuCD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsB3H;AAaD,0FAA0F;AAC1F,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,EAC7D,eAAe,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,WAAW,GACtD,OAAO,CAAC,eAAe,CAAC,CAY1B;AAiBD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC5C;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,WAAW,GACjF,OAAO,CAAC,uBAAuB,CAAC,CAyBlC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,4GAA4G;AAC5G,MAAM,MAAM,eAAe,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,SAAS,CAAC;AACjD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG;IAAE,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1G,MAAM,MAAM,oBAAoB,GAAG;IAAE,UAAU,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,GAAG,QAAQ,CAAA;CAAE,CAAC;AACtI;;;GAGG;AACH,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAM7C,8EAA8E;AAC9E,eAAO,MAAM,eAAe,QAAS,CAAC;AACtC,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC,eAAO,MAAM,eAAe,QAAS,CAAC;AACtC,2GAA2G;AAC3G,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAgB,GAAG,MAAM,CAE9E;AAED,sFAAsF;AACtF,qBAAa,UAAU;IA6BT,OAAO,CAAC,QAAQ,CAAC,OAAO;IA5BpC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,SAAS,CAAyD;IAC1E,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,MAAM,CAAsE;IACpF,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,SAAS,CAAiD;IAClE,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,QAAQ,CAAqD;IACrE,OAAO,CAAC,OAAO,CAAiH;IAChI,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEK,OAAO,EAAE,iBAAiB;IAKvD,SAAS,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,IAAI;IACzC,cAAc,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,IAAI;IAC7C,oFAAoF;IACpF,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IACpE,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IACvD,gGAAgG;IAChG,KAAK,CAAC,EAAE,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAC9E,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAC1D,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IACtE,yFAAyF;IACzF,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAC1D;;;OAGG;IACH,mBAAmB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI;IAC3E,OAAO,CAAC,IAAI;IAIN,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YASxC,KAAK;IAkBnB,0FAA0F;IAC1F,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAA4C;IAC7E,4EAA4E;IAC5E,IAAI,qBAAqB,IAAI,MAAM,CAA6C;IAEhF;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;YAK7B,IAAI;IAoFlB,OAAO,CAAC,OAAO;IAwDf,+GAA+G;IAC/G,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,SAAS;IAejB,qGAAqG;IACrG,YAAY,IAAI,IAAI;IAepB,yEAAyE;IACzE,KAAK,IAAI,IAAI;IAQb;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM;IAM/D;;;;OAIG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAYrD,6EAA6E;IAC7E,YAAY,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;IAM9C,mEAAmE;IACnE,UAAU,IAAI,IAAI;IAClB,aAAa,IAAI,IAAI;IACrB,OAAO,CAAC,SAAS;IAKjB;;;OAGG;IACG,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoBpH;;;OAGG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAoBhI;;;;OAIG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ5F,8FAA8F;YAChF,WAAW;IAMzB,sHAAsH;IACtH,IAAI,kBAAkB,IAAI,OAAO,CAAwC;IAEzE;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUpH,oIAAoI;IAC9H,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzH,sGAAsG;YACxF,WAAW;IA0BzB,OAAO,CAAC,aAAa;IAOrB,yGAAyG;IACzG,UAAU,IAAI,IAAI;IAKlB,OAAO,CAAC,QAAQ;IA6BhB,IAAI,WAAW,IAAI,OAAO,CAAsE;CACjG;AASD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvI;AAED,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,SAAU,CAAC"}