react-feedback-surveys 1.8.0 → 1.9.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.
- package/README.md +141 -12
- package/dist/index.css +1 -1
- package/dist/index.d.ts +76 -1
- package/dist/index.js +1371 -1107
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -35,6 +35,8 @@ Check out [feedback.tools](https://feedback.tools) — built by the same team.
|
|
|
35
35
|
* [Surface](#surface)
|
|
36
36
|
- [Props](#props)
|
|
37
37
|
* [Shared Props](#shared-props)
|
|
38
|
+
* [Accessibility Labels](#accessibility-labels)
|
|
39
|
+
* [Attachments](#attachments)
|
|
38
40
|
* [Format Props](#format-props)
|
|
39
41
|
* [Scale Style Options](#scale-style-options)
|
|
40
42
|
- [Styling](#styling)
|
|
@@ -59,17 +61,19 @@ Check out [feedback.tools](https://feedback.tools) — built by the same team.
|
|
|
59
61
|
- **Flexible placement** – embed inline or display as popup overlay
|
|
60
62
|
- **Follow-up feedback** – optional text input or multiple choice responses
|
|
61
63
|
- **Optional email collection** – close the loop by capturing a respondent's email when no user identity is known
|
|
64
|
+
- **Optional screenshot attachments** – let respondents attach a screenshot, captured by a function you provide
|
|
62
65
|
- **Fully customizable** – CSS variables and custom class names
|
|
63
66
|
- **Zero dependencies**
|
|
64
67
|
- **TypeScript support**
|
|
65
68
|
|
|
66
69
|
## Survey Types
|
|
67
70
|
|
|
68
|
-
`Survey` covers
|
|
71
|
+
`Survey` covers four feedback methodologies, selected with the `type` prop. `CSAT` is the only one with a variable scale length, set via `points`:
|
|
69
72
|
|
|
70
73
|
- **CSAT (Customer Satisfaction Score):** `type="csat"`, 2-point or 5-point scale (`points={2}` or `points={5}`)
|
|
71
74
|
- **NPS (Net Promoter Score):** `type="nps"`, fixed 0–10 scale
|
|
72
75
|
- **CES (Customer Effort Score):** `type="ces"`, fixed 7-point scale
|
|
76
|
+
- **General (text feedback only):** `type="general"`, no rating scale — see [General](#general-text-feedback-only)
|
|
73
77
|
|
|
74
78
|
## Installation
|
|
75
79
|
|
|
@@ -211,6 +215,31 @@ import 'react-feedback-surveys/index.css';
|
|
|
211
215
|
|
|
212
216
|
`scaleStyle`: `numbers`.
|
|
213
217
|
|
|
218
|
+
### General (text feedback only)
|
|
219
|
+
|
|
220
|
+
No rating scale — just text feedback and an optional screenshot. The text feedback step is shown immediately and is the whole survey; there's no `points`/`scaleStyle`/`minLabel`/`maxLabel`/`question` to set.
|
|
221
|
+
|
|
222
|
+
**Example use cases:**
|
|
223
|
+
- A general "Send feedback" or "Report a problem" trigger with no methodology attached.
|
|
224
|
+
- Contexts where a numeric rating doesn't make sense.
|
|
225
|
+
|
|
226
|
+
<img alt="General" src="docs/assets/general.png" width="368" />
|
|
227
|
+
|
|
228
|
+
```tsx
|
|
229
|
+
import { Survey } from 'react-feedback-surveys';
|
|
230
|
+
import 'react-feedback-surveys/index.css';
|
|
231
|
+
|
|
232
|
+
<Survey
|
|
233
|
+
type="general"
|
|
234
|
+
textQuestion="Got feedback? We'd love to hear it"
|
|
235
|
+
textButtonSendLabel="Send"
|
|
236
|
+
thankYouMessage="Thank you for your feedback!"
|
|
237
|
+
onFeedbackSubmit={({ text }) => {/* ... */}}
|
|
238
|
+
/>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
`responseType` defaults to `'text'` (also accepts `'choices'`) — it can't be unset, since the text feedback step is the only content the survey has. The step is mandatory: there's no Skip button (`textButtonSkipLabel` is ignored for `type="general"`), and Submit stays disabled until there's something to send.
|
|
242
|
+
|
|
214
243
|
## Layout Components
|
|
215
244
|
|
|
216
245
|
### Popup
|
|
@@ -254,10 +283,14 @@ import 'react-feedback-surveys/index.css';
|
|
|
254
283
|
| `className` | `string` | - | - | Additional CSS class name for the popup container. |
|
|
255
284
|
| `classNames` | `{ base?: string; content?: string; close?: string }` | - | - | Optional class names for internal popup elements. |
|
|
256
285
|
| `children` | `React.ReactNode` | - | - | Content to render inside the popup (typically a survey component). |
|
|
286
|
+
| `closeLabel` | `string` | - | `'Close survey'` | Close button label, used for both its `aria-label` and `title`. |
|
|
257
287
|
| `onClose` | `() => void` | - | - | Callback fired when the close button is clicked. |
|
|
258
288
|
|
|
259
289
|
For more examples, check out the Storybook stories under `widgets/Survey` (grouped by CSAT/NPS/CES in the sidebar).
|
|
260
290
|
|
|
291
|
+
> **Note**
|
|
292
|
+
> If the survey inside uses `dir="rtl"` on a page that's otherwise LTR (or vice versa), pass the same `dir` to `Popup` too — the close button's position resolves against the document direction, while the survey head's reserved offset resolves against the survey's own `dir`. Passing both keeps them aligned.
|
|
293
|
+
|
|
261
294
|
### Surface
|
|
262
295
|
|
|
263
296
|
The `<Surface>` component is a basic container wrapper that provides consistent styling for survey content. It's used internally by the Popup component and can be used standalone to display surveys with a card-like appearance.
|
|
@@ -303,14 +336,17 @@ Most props are shared across every survey format. `type` (and `points`, for CSAT
|
|
|
303
336
|
|--------------------|-------------------------------|----------|------------------------------------------------------------------------------|
|
|
304
337
|
| `classNames` | `ClassNamesConfig` (see below)| - | Optional class names to target internal parts. |
|
|
305
338
|
| `dir` | `'ltr' \| 'rtl' \| 'auto'` | - | Text direction for RTL/LTR language support. |
|
|
306
|
-
| `
|
|
307
|
-
| `
|
|
308
|
-
| `
|
|
309
|
-
| `
|
|
339
|
+
| `strings` | `SurveyStrings` (see below) | - | Overrides for the library's own aria-labels and other screen-reader-only text. See [Accessibility Labels](#accessibility-labels). |
|
|
340
|
+
| `question` | `string` | required (not used for `type="general"`) | Main survey question displayed on the first screen. |
|
|
341
|
+
| `minLabel` | `string` | - | Left label for the scale. Not used for `type="general"`. |
|
|
342
|
+
| `maxLabel` | `string` | - | Right label for the scale. Not used for `type="general"`. |
|
|
343
|
+
| `getScoreLabelSuffix` | `(label: string) => string` | - | Builds the visible text appended after the first/last numbered scale button when it carries `minLabel`/`maxLabel`. Default `` (label) => ` - ${label}` ``. Applies to the `numbers` scale style (CSAT5, CES, NPS). |
|
|
344
|
+
| `responseType` | `null \| 'text' \| 'choices'` (`'text' \| 'choices'` for `type="general"`, defaults to `'text'`) | - | Enables optional follow-up feedback. |
|
|
310
345
|
| `textQuestion` | `string` | - | Follow-up question displayed when `responseType` is defined. |
|
|
311
346
|
| `textButtonSendLabel` | `string` | - | Submit label for the feedback screen. |
|
|
312
347
|
| `textButtonSkipLabel` | `string` | - | Skip label for the feedback screen. |
|
|
313
348
|
| `choiceOptions` | `string[] \| null` | - | Predefined choices (when `responseType === 'choices'`). |
|
|
349
|
+
| `otherPlaceholder` | `string` | - | Placeholder for the free-text input next to choice checkboxes. Default `'Other'`. |
|
|
314
350
|
| `thankYouMessage` | `string` | required | Message shown after submission. |
|
|
315
351
|
| `collectContact` | `boolean` | - | Enables an optional email collection step before the success screen. |
|
|
316
352
|
| `userId` | `string` | - | Existing user identity. When provided, the email collection step is skipped. |
|
|
@@ -318,6 +354,43 @@ Most props are shared across every survey format. `type` (and `points`, for CSAT
|
|
|
318
354
|
| `contactSubtext` | `string` | - | Descriptive text shown above the email input. |
|
|
319
355
|
| `contactButtonSendLabel` | `string` | - | Submit label for the email collection screen. |
|
|
320
356
|
| `contactButtonSkipLabel` | `string` | - | Skip label for the email collection screen. |
|
|
357
|
+
| `onCaptureScreenshot` | `() => string \| Blob \| Promise<string \| Blob>` | - | Enables an optional screenshot-attachment control on the feedback step. Hidden unless provided — see [Attachments](#attachments). |
|
|
358
|
+
| `screenshotButtonLabel` | `string` | - | Label for the screenshot-attachment control. |
|
|
359
|
+
| `screenshotErrorMessage` | `string` | - | Shown to the respondent when `onCaptureScreenshot` fails. Default `'Failed to capture screenshot'`. |
|
|
360
|
+
| `maxAttachments` | `number` | - | Maximum number of attachments a respondent may confirm. Default `1`. See [Attachments](#attachments). |
|
|
361
|
+
| `attachmentCaption` | `string` | - | Visible caption under an attachment thumbnail, also used as its image alt text. Default `'Screenshot'`. |
|
|
362
|
+
|
|
363
|
+
### Accessibility Labels
|
|
364
|
+
|
|
365
|
+
A handful of internal aria-labels ship with an English default. These are never visible UI copy (that's `question`, `thankYouMessage`, `otherPlaceholder`, `attachmentCaption`, etc., always authored by you, listed alongside the rest of the shared props above) — every key in `strings` is announced to assistive tech only, useful to override if you're localizing a survey for a non-English audience.
|
|
366
|
+
|
|
367
|
+
Pass a `strings` object with only the keys you want to change — each one merges over its own English default, so there's no need to repeat the rest:
|
|
368
|
+
|
|
369
|
+
```tsx
|
|
370
|
+
<Survey
|
|
371
|
+
/* ... */
|
|
372
|
+
strings={{
|
|
373
|
+
emailLabel: 'Adresse e-mail',
|
|
374
|
+
getScoreLabel: (score) => `Score ${score}`
|
|
375
|
+
}}
|
|
376
|
+
/>
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
#### SurveyStrings Type
|
|
380
|
+
|
|
381
|
+
| Key | Type | Default |
|
|
382
|
+
|-----|------|---------|
|
|
383
|
+
| `feedbackFormLabel` | `string` | `'Feedback form'` |
|
|
384
|
+
| `additionalFeedbackLabel` | `string` | `'Additional feedback'` |
|
|
385
|
+
| `yourFeedbackLabel` | `string` | `'Your feedback'` |
|
|
386
|
+
| `contactFormLabel` | `string` | `'Contact form'` |
|
|
387
|
+
| `emailLabel` | `string` | `'Email address'` |
|
|
388
|
+
| `attachmentOpenLabel` | `string` | `'Open screenshot in a new tab'` |
|
|
389
|
+
| `attachmentRemoveLabel` | `string` | `'Remove screenshot'` |
|
|
390
|
+
| `getScoreLabel` | `(score: number) => string` | `(score) => \`Score ${score}\`` |
|
|
391
|
+
| `getStarsLabel` | `(score: number) => string` | `(score) => \`${score} ${score > 1 ? 'stars' : 'star'}\`` |
|
|
392
|
+
|
|
393
|
+
`getScoreLabel` applies to the `numbers` scale style (CSAT5, CES, NPS); `getStarsLabel` applies to CSAT5's `stars` style. Both are callbacks rather than templates so you can apply correct pluralization for your target language. `Popup`'s close button label lives on `Popup` itself, not in `strings` — see its own `closeLabel` prop in [Popup Props](#props).
|
|
321
394
|
|
|
322
395
|
#### ClassNamesConfig Type
|
|
323
396
|
|
|
@@ -357,10 +430,13 @@ interface ClassNamesConfig {
|
|
|
357
430
|
|
|
358
431
|
```typescript
|
|
359
432
|
type ScorePayload = { value: number };
|
|
360
|
-
type FeedbackPayload = { value
|
|
433
|
+
type FeedbackPayload = { value?: number; text?: string | string[]; attachments?: Attachment[] };
|
|
361
434
|
type ContactPayload = { value?: number; text?: string | string[]; email: string };
|
|
435
|
+
type Attachment = { kind: 'screenshot'; data: string | Blob; name?: string; mimeType?: string; size?: number };
|
|
362
436
|
```
|
|
363
437
|
|
|
438
|
+
> See [Attachments](#attachments).
|
|
439
|
+
|
|
364
440
|
> **Event behavior**
|
|
365
441
|
|
|
366
442
|
#### `onScoreSubmit`
|
|
@@ -379,13 +455,14 @@ The actual `value` returned depends on the survey type:
|
|
|
379
455
|
Invoked when the user completes the follow-up step and submits their feedback (only applies when `responseType` is `text` or `choices`).
|
|
380
456
|
This callback provides both the original score and the user's input.
|
|
381
457
|
|
|
382
|
-
|
|
458
|
+
For surveys with a rating step, the feedback step is optional: respondents can submit feedback or skip it via the `textButtonSkipLabel` button (or by submitting with empty input), and either action advances to the next screen. For `type="general"`, the feedback step **is** the survey, so there's no Skip button — Submit stays disabled until there's something to send. `onFeedbackSubmit` only fires when feedback text or choices are actually submitted; it is **not** called when a rating-survey's step is skipped.
|
|
383
459
|
|
|
384
460
|
**Arguments:**
|
|
385
|
-
- `value
|
|
461
|
+
- `value?: number` — the same score previously passed to `onScoreSubmit`; `undefined` for `type="general"`, which has no rating step
|
|
386
462
|
- `text: string | string[]` — depends on `responseType`:
|
|
387
|
-
- `text`: a single text
|
|
388
|
-
- `choices`: an array of selected options (may include
|
|
463
|
+
- `text`: a single text feedback string
|
|
464
|
+
- `choices`: an array of selected options (may include free-text feedback if enabled)
|
|
465
|
+
- `attachments?: Attachment[]` — present when the respondent confirmed a screenshot; see [Attachments](#attachments)
|
|
389
466
|
|
|
390
467
|
> **Important**
|
|
391
468
|
You should listen to **both** `onScoreSubmit` and `onFeedbackSubmit`.
|
|
@@ -425,11 +502,59 @@ When `collectContact` is `true` and no `userId` is provided, an optional email c
|
|
|
425
502
|
/>
|
|
426
503
|
```
|
|
427
504
|
|
|
505
|
+
### Attachments
|
|
506
|
+
|
|
507
|
+
Respondents can attach a screenshot to their feedback, surfaced on submit as `attachments?: Attachment[]` (see the event payload types above). Each attachment renders as a thumbnail in the feedback step, with a caption and size underneath, click to open it in a new tab, click the "x" to remove it. Submit is disabled for the brief moment a capture is still in flight, so it can't be confirmed before the attachment actually lands in the list.
|
|
508
|
+
|
|
509
|
+
Once an attachment is confirmed, the Skip button is disabled — an attached screenshot is never silently discarded. Remove the attachment to re-enable Skip, or fill in feedback and submit to keep it. An attachment on its own is never sufficient to submit, either: for `responseType="text"`, submitting with an attachment but no text flags the textarea instead of sending; for `responseType="choices"`, Submit stays disabled until a choice is picked or text is entered.
|
|
510
|
+
|
|
511
|
+
By default a respondent can confirm a single attachment: once one is attached, the add control hides. Pass `maxAttachments` to raise (or lower) that cap. The add control stays visible (below the existing thumbnails) until the cap is reached:
|
|
512
|
+
|
|
513
|
+
```tsx
|
|
514
|
+
<Survey
|
|
515
|
+
/* ... */
|
|
516
|
+
onCaptureScreenshot={() => domToDataUrl(document.body)}
|
|
517
|
+
maxAttachments={3}
|
|
518
|
+
/>
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
Pass `onCaptureScreenshot` to add an "Capture screenshot" control to the feedback step. Clicking it calls your function and attaches the result immediately. The control is off by default: it doesn't render at all unless `onCaptureScreenshot` is provided.
|
|
522
|
+
|
|
523
|
+
Capturing a screenshot needs an actual DOM-to-image library (or a native bridge in a hybrid app) — real, non-trivial code that most consumers of this package won't want to pay for in bundle size if they don't use the feature. So react-feedback-surveys deliberately doesn't ship a capture implementation itself: bring your own function that returns the captured image (as a data URL string, a `Blob`, or a `Promise` of either). A drop-in recipe using [modern-screenshot](https://github.com/qq15725/modern-screenshot):
|
|
524
|
+
|
|
525
|
+
```shell
|
|
526
|
+
npm i modern-screenshot
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
```tsx
|
|
530
|
+
import { Survey } from 'react-feedback-surveys';
|
|
531
|
+
import { domToDataUrl } from 'modern-screenshot';
|
|
532
|
+
import 'react-feedback-surveys/index.css';
|
|
533
|
+
|
|
534
|
+
<Survey
|
|
535
|
+
type="csat"
|
|
536
|
+
points={5}
|
|
537
|
+
scaleStyle="numbers"
|
|
538
|
+
question="How would you rate your satisfaction with our product?"
|
|
539
|
+
responseType="text"
|
|
540
|
+
textQuestion="We'd love to hear your thoughts — what can we improve?"
|
|
541
|
+
thankYouMessage="Thanks for your feedback!"
|
|
542
|
+
onCaptureScreenshot={() => domToDataUrl(document.body)}
|
|
543
|
+
onScoreSubmit={({ value }) => {/* ... */}}
|
|
544
|
+
onFeedbackSubmit={({ value, text, attachments }) => {/* attachments?.[0]?.data holds the attached screenshot */}}
|
|
545
|
+
/>
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
In a hybrid app, `onCaptureScreenshot` can just as well call into a native bridge (e.g. `WKWebView.takeSnapshot` on iOS) instead of a DOM-to-image library.
|
|
549
|
+
|
|
550
|
+
> **Note**
|
|
551
|
+
> DOM-to-image capture is best-effort — fonts, cross-origin images, and some CSS effects may not render identically on every browser (particularly Safari/iOS). The respondent can open the attached thumbnail in a new tab to check it, and remove it with one click if the capture came out wrong.
|
|
552
|
+
|
|
428
553
|
### Format Props
|
|
429
554
|
|
|
430
555
|
| Prop | Type | Required | Description |
|
|
431
556
|
|------|------|----------|--------------|
|
|
432
|
-
| `type` | `'csat'` \| `'nps'` \| `'ces'` | required | Survey methodology. Determines the scale range and which `scaleStyle`/`points` combinations are valid. |
|
|
557
|
+
| `type` | `'csat'` \| `'nps'` \| `'ces'` \| `'general'` | required | Survey methodology. Determines the scale range and which `scaleStyle`/`points` combinations are valid. `'general'` has no scale at all — see [General](#general-text-feedback-only). |
|
|
433
558
|
| `points` | `2` \| `5` | required for `type="csat"`; not used otherwise | Number of points on the scale. `nps` is a fixed 0–10 scale and `ces` a fixed 1–7 scale, so neither takes `points`. |
|
|
434
559
|
|
|
435
560
|
### Scale Style Options
|
|
@@ -471,6 +596,9 @@ You can override colors and fonts via CSS variables:
|
|
|
471
596
|
/* Error color for validation messages */
|
|
472
597
|
--ft-color-error: 32 95% 44%;
|
|
473
598
|
|
|
599
|
+
/* Error text color (attachment capture errors) — darker than --ft-color-error, tuned for text contrast rather than borders/outlines */
|
|
600
|
+
--ft-color-error-text: 32 95% 32%;
|
|
601
|
+
|
|
474
602
|
/* Border color for inputs and containers */
|
|
475
603
|
--ft-color-border: 214 14% 83%;
|
|
476
604
|
|
|
@@ -492,7 +620,7 @@ You can override colors and fonts via CSS variables:
|
|
|
492
620
|
--ft-popup-head-offset: 0;
|
|
493
621
|
|
|
494
622
|
/* Padding for Surface component container (desktop) */
|
|
495
|
-
--ft-surface-padding:
|
|
623
|
+
--ft-surface-padding: 20px;
|
|
496
624
|
|
|
497
625
|
/* Padding for Surface component container on mobile devices (max-width: 400px) */
|
|
498
626
|
--ft-surface-padding-mobile: 20px;
|
|
@@ -522,6 +650,7 @@ Here's an example of dark theme colors that work well with the survey components
|
|
|
522
650
|
--ft-color-bg: 220 13% 13%;
|
|
523
651
|
--ft-color-muted: 214 10% 60%;
|
|
524
652
|
--ft-color-error: 14 90% 62%;
|
|
653
|
+
--ft-color-error-text: 14 85% 72%;
|
|
525
654
|
--ft-color-border: 217 10% 28%;
|
|
526
655
|
--ft-color-outline: 216 12% 45%;
|
|
527
656
|
--ft-color-shadow: 0 0% 0%;
|
package/dist/index.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
:root,:host{--_color-text:var(--ft-color-text,30 8% 14%);--_color-bg:var(--ft-color-bg,0 0% 100%);--_color-muted:var(--ft-color-muted,222 11% 46%);--_color-error:var(--ft-color-error,32 95% 44%);--_color-border:var(--ft-color-border,214 14% 83%);--_color-outline:var(--ft-color-outline,218 14% 65%);--_color-shadow:var(--ft-color-shadow,0 0% 0%);--_color-control:var(--ft-color-control,214 20% 96%);--_popup-z-index:var(--ft-popup-z-index,49);--_popup-head-offset:var(--ft-popup-head-offset,0);--_surface-padding:var(--ft-surface-padding,24px);--_surface-padding-mobile:var(--ft-surface-padding-mobile,20px);--_surface-radius:var(--ft-surface-radius,8px);--_font-family:var(--ft-font-family,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);font-family:var(--_font-family)}input,textarea,select{font:inherit}._base_d5qlz_1{padding:var(--_surface-padding);background-color:hsl(var(--_color-bg)/100%);border-radius:var(--_surface-radius);box-shadow:0 0 10px hsl(var(--_color-shadow)/20%);display:block;position:relative;overflow:auto}@media (width<=399px){._base_d5qlz_1{padding:var(--_surface-padding-mobile)}}._base_1vr2h_1{--_popup-head-offset:32px;z-index:var(--_popup-z-index);box-sizing:border-box;max-width:calc(100vw - var(--_surface-padding) * 2);max-height:calc(100vh - var(--_surface-padding) * 2);transform-origin:50% 100%;margin:0;display:flex;position:fixed}@media (width<=399px){._base_1vr2h_1{max-width:calc(100vw - var(--_surface-padding-mobile) * 2);max-height:calc(100vh - var(--_surface-padding-mobile) * 2)}}._animated_1vr2h_19{opacity:0;animation:.12s ease-in-out forwards _fadeForward_1vr2h_1}@keyframes _fadeForward_1vr2h_1{0%{opacity:0;transform:translateY(8px)scale(.92)}to{opacity:1;transform:translateY(0)scale(1)}}._topLeft_1vr2h_34{top:var(--_surface-padding);left:var(--_surface-padding)}@media (width<=399px){._topLeft_1vr2h_34{top:var(--_surface-padding-mobile);left:var(--_surface-padding-mobile)}}._topRight_1vr2h_45{top:var(--_surface-padding);right:var(--_surface-padding)}@media (width<=399px){._topRight_1vr2h_45{top:var(--_surface-padding-mobile);right:var(--_surface-padding-mobile)}}._bottomRight_1vr2h_56{right:var(--_surface-padding);bottom:var(--_surface-padding)}@media (width<=399px){._bottomRight_1vr2h_56{right:var(--_surface-padding-mobile);bottom:var(--_surface-padding-mobile)}}._bottomLeft_1vr2h_67{bottom:var(--_surface-padding);left:var(--_surface-padding)}@media (width<=399px){._bottomLeft_1vr2h_67{bottom:var(--_surface-padding-mobile);left:var(--_surface-padding-mobile)}}._close_1vr2h_78{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._close_1vr2h_78:disabled{cursor:default}._close_1vr2h_78{top:var(--_surface-padding);width:24px;height:24px;color:hsl(var(--_color-outline)/100%);transition:color .15s;position:absolute;inset-inline-end:var(--_surface-padding)}._close_1vr2h_78:hover{color:hsl(var(--_color-text)/100%)}._close_1vr2h_78:before,._close_1vr2h_78:after{content:"";background-color:currentColor;border-radius:1px;position:absolute;top:50%;left:50%;transform:rotate(45deg)}._close_1vr2h_78:before{width:16px;height:2px;margin:-1px 0 0 -8px}._close_1vr2h_78:after{width:2px;height:16px;margin:-8px 0 0 -1px}@media (width<=399px){._close_1vr2h_78{top:var(--_surface-padding-mobile);inset-inline-end:var(--_surface-padding-mobile)}}._sr_clg7k_1{white-space:nowrap;clip-path:inset(50%);border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._subtext_clg7k_13{margin:0 0 16px;line-height:1.25}._input_clg7k_18{box-sizing:border-box;width:100%;color:hsl(var(--_color-text)/100%);background-color:hsl(var(--_color-bg)/100%);border:1px solid hsl(var(--_color-border)/100%);border-radius:var(--_surface-radius);outline:0 solid hsl(var(--_color-outline)/14%);padding:4px 12px;font-family:inherit;font-size:16px;line-height:1.5;transition:background-color .15s,border-color .15s,outline-width .2s}._input_clg7k_18:focus{outline:4px solid hsl(var(--_color-outline)/14%)}._input_clg7k_18._invalid_clg7k_35{border-color:hsl(var(--_color-error)/100%)}._input_clg7k_18._invalid_clg7k_35:focus{outline-color:hsl(var(--_color-error)/14%)}._submit_clg7k_42{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._submit_clg7k_42:disabled{cursor:default}._submit_clg7k_42{text-align:center;color:hsl(var(--_color-bg)/100%);background-color:hsl(var(--_color-text)/100%);border-radius:var(--_surface-radius);padding:8px 32px;font-size:16px;font-weight:400;transition:opacity .2s}._submit_clg7k_42:hover{opacity:.85}._submit_clg7k_42{width:100%;margin-top:16px}._skip_clg7k_74{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._skip_clg7k_74:disabled{cursor:default}._skip_clg7k_74{text-align:center;width:100%;color:hsl(var(--_color-muted)/100%);cursor:pointer;margin-top:8px;padding:4px;font-size:16px;font-weight:500;line-height:1.5;display:block}._skip_clg7k_74:hover{color:hsl(var(--_color-text)/100%)}._choices_nhux3_1{margin:0 0 12px}._choice_nhux3_1{display:flex}._choice_nhux3_1+._choice_nhux3_1{margin-top:12px}._label_nhux3_12{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:flex-start;gap:8px;display:inline-flex;position:relative}._sr_nhux3_21{white-space:nowrap;clip-path:inset(50%);border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._checkbox_nhux3_33{white-space:nowrap;clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}._check_nhux3_33{border:1px solid hsl(var(--_color-border)/100%);border-radius:4px;min-width:20px;height:20px}._label_nhux3_12:hover ._check_nhux3_33{border-color:hsl(var(--_color-text)/100%)}._checkbox_nhux3_33:focus-visible+._check_nhux3_33{outline:4px solid hsl(var(--_color-outline)/14%)}._checkbox_nhux3_33:checked+._check_nhux3_33{background-color:hsl(var(--_color-text)/100%);border-color:hsl(var(--_color-text)/100%);position:relative}._checkbox_nhux3_33:checked+._check_nhux3_33:after{content:"";border:2px solid;border-color:transparent transparent hsl(var(--_color-bg)/100%) hsl(var(--_color-bg)/100%);pointer-events:none;width:10px;height:4px;position:absolute;top:50%;left:50%;transform:translate(-45%,-75%)rotate(-45deg)}._input_nhux3_74{margin-top:8px;padding:4px 12px}._textarea_nhux3_79{height:120px;padding:8px 12px}._input_nhux3_74,._textarea_nhux3_79{box-sizing:border-box;width:100%;color:hsl(var(--_color-text)/100%);background-color:hsl(var(--_color-bg)/100%);border:1px solid hsl(var(--_color-border)/100%);border-radius:var(--_surface-radius);outline:0 solid hsl(var(--_color-outline)/14%);resize:none;font-family:inherit;font-size:16px;line-height:1.5;transition:background-color .15s,border-color .15s,outline-width .2s}._input_nhux3_74:focus,._textarea_nhux3_79:focus{outline:4px solid hsl(var(--_color-outline)/14%)}._submit_nhux3_104{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._submit_nhux3_104:disabled{cursor:default}._submit_nhux3_104{text-align:center;color:hsl(var(--_color-bg)/100%);background-color:hsl(var(--_color-text)/100%);border-radius:var(--_surface-radius);padding:8px 32px;font-size:16px;font-weight:400;transition:opacity .2s}._submit_nhux3_104:hover{opacity:.85}._submit_nhux3_104{width:100%;margin-top:16px}._skip_nhux3_136{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._skip_nhux3_136:disabled{cursor:default}._skip_nhux3_136{text-align:center;width:100%;color:hsl(var(--_color-muted)/100%);cursor:pointer;margin-top:8px;padding:4px;font-size:16px;font-weight:500;line-height:1.5;display:block}._skip_nhux3_136:hover{color:hsl(var(--_color-text)/100%)}._success_nhux3_166{text-align:center;padding:16px 0 32px;font-size:16px;font-weight:600;line-height:1.5}._base_1ilpx_1{text-align:center;padding:0 24px}._icon_1ilpx_6{display:inline-block}._base_1xpqq_1{color:hsl(var(--_color-text)/100%);padding:0;font-family:Helvetica Neue,Arial Nova,Helvetica,Arial,sans-serif}._head_1xpqq_7{padding-block:0 20px;padding-inline:0 var(--_popup-head-offset);gap:8px;display:flex}._title_1xpqq_14{flex:1 0;font-family:inherit;font-size:16px;font-style:normal;font-weight:500;line-height:1.4}._base_nswpf_1{margin:12px 0 0;display:flex}._label_nswpf_6{box-sizing:border-box;max-width:50%;color:hsl(var(--_color-muted)/100%);flex:0 0 50%;font-size:14px;line-height:1.4286}._between_nswpf_15{justify-content:space-between}._between_nswpf_15 ._label_nswpf_6{flex:0 0 50%;max-width:50%}._between_nswpf_15 ._label_nswpf_6:first-child{text-align:start}._between_nswpf_15 ._label_nswpf_6:last-child{text-align:end}._center_nswpf_29 ._label_nswpf_6{flex:0 0 50%;max-width:50%}._center_nswpf_29 ._label_nswpf_6:first-child{text-align:end;padding-right:8px}._center_nswpf_29 ._label_nswpf_6:last-child{text-align:start;padding-left:8px}._center_nswpf_29 ._text_nswpf_41{text-align:center;min-width:56px;display:inline-block}@media (width<=599px){._center_nswpf_29 ._text_nswpf_41{min-width:48px}}._list_1vfe4_1{justify-content:space-between;display:flex}._icon_1vfe4_6{transition:transform .12s;transform:scale(1)}._button_1vfe4_11{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_1vfe4_11:disabled{cursor:default}._button_1vfe4_11{background-color:hsl(var(--_color-control)/100%);border-radius:50%;justify-content:center;align-items:center;width:56px;height:56px;display:flex}._button_1vfe4_11:hover ._icon_1vfe4_6{transform:scale(1.15)}._button_1vfe4_11:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}@media (width<=399px){._button_1vfe4_11{width:48px;height:48px}}._list_16sag_1{justify-content:space-between;display:flex}._button_16sag_6{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_16sag_6:disabled{cursor:default}._button_16sag_6{width:40px;height:40px;color:hsl(var(--_color-muted)/100%);background-color:hsl(var(--_color-control)/100%);box-shadow:0 0 0 0 hsl(var(--_color-control)/100%);border-radius:50%;justify-content:center;align-items:center;font-size:18px;font-weight:700;transition:color .12s,box-shadow .12s;display:flex}._button_16sag_6:hover{color:hsl(var(--_color-text)/100%);box-shadow:0 0 0 2px hsl(var(--_color-control)/100%)}._button_16sag_6:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._list_1kpxu_1{justify-content:space-between;display:flex}._icon_1kpxu_6{transition:transform .12s;transform:scale(1)}._button_1kpxu_11{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_1kpxu_11:disabled{cursor:default}._button_1kpxu_11{justify-content:center;align-items:center;width:40px;height:40px;display:flex}._button_1kpxu_11:hover ._icon_1kpxu_6{transform:scale(1.1)}._button_1kpxu_11:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._list_grany_1{justify-content:center;gap:16px;display:flex}._icon_grany_7{transition:transform .12s;transform:scale(1)}._button_grany_12{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_grany_12:disabled{cursor:default}._button_grany_12{background-color:hsl(var(--_color-control)/100%);border-radius:50%;justify-content:center;align-items:center;width:56px;height:56px;display:flex}._button_grany_12:hover ._icon_grany_7{transform:scale(1.15)}._button_grany_12:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}@media (width<=399px){._button_grany_12{width:48px;height:48px}}._list_1yzyr_1{justify-content:center;gap:16px;display:flex}._icon_1yzyr_7{transition:transform .12s;transform:scale(1)}._button_1yzyr_12{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_1yzyr_12:disabled{cursor:default}._button_1yzyr_12{background-color:hsl(var(--_color-control)/100%);border-radius:50%;justify-content:center;align-items:center;width:56px;height:56px;display:flex}._button_1yzyr_12:hover ._icon_1yzyr_7{transform:scale(1.15)}._button_1yzyr_12:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._list_whbas_1{justify-content:space-between;gap:6px;display:flex}@media (width<=599px){._list_whbas_1{flex-direction:column-reverse;gap:4px}}._button_whbas_13{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_whbas_13:disabled{cursor:default}._button_whbas_13{text-align:center;width:40px;height:40px;color:hsl(var(--_color-muted)/100%);background-color:hsl(var(--_color-control)/100%);box-shadow:0 0 0 0 hsl(var(--_color-control)/100%);border-radius:50%;font-size:18px;font-weight:700;transition:color .12s,box-shadow .12s;display:inline-block}._button_whbas_13:hover{color:hsl(var(--_color-text)/100%);box-shadow:0 0 0 2px hsl(var(--_color-control)/100%)}@media (width<=599px){._button_whbas_13:hover{box-shadow:none}}._button_whbas_13:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._button_whbas_13 ._score_whbas_52{display:inline}._button_whbas_13 ._label_whbas_55{display:none}@media (width<=599px){._button_whbas_13 ._label_whbas_55{display:inline}._button_whbas_13{border-radius:6px;width:100%;height:auto;padding:6px;font-size:14px;line-height:20px}._labels_whbas_75{display:none}}._list_divjm_1{justify-content:space-between;gap:6px;display:flex}@media (width<=599px){._list_divjm_1{flex-direction:column-reverse;gap:4px}}._button_divjm_13{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_divjm_13:disabled{cursor:default}._button_divjm_13{text-align:center;width:40px;height:40px;color:hsl(var(--_color-muted)/100%);background-color:hsl(var(--_color-control)/100%);box-shadow:0 0 0 0 hsl(var(--_color-control)/100%);border-radius:50%;font-size:18px;font-weight:700;transition:color .12s,box-shadow .12s;display:block}._button_divjm_13:hover{color:hsl(var(--_color-text)/100%);box-shadow:0 0 0 2px hsl(var(--_color-control)/100%)}@media (width<=599px){._button_divjm_13:hover{box-shadow:none}}._button_divjm_13:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._button_divjm_13 ._score_divjm_52{display:inline}._button_divjm_13 ._label_divjm_55{display:none}@media (width<=599px){._button_divjm_13 ._label_divjm_55{display:inline}._button_divjm_13{border-radius:6px;width:100%;height:auto;padding:6px;font-size:14px;line-height:20px}._labels_divjm_75{display:none}}._base_umzkr_1{max-width:100%}._ratingCsat5_umzkr_5,._feedbackCsat5_umzkr_6,._contactCsat5_umzkr_7,._successCsat5_umzkr_8{width:320px}@media (width<=399px){._ratingCsat5_umzkr_5,._feedbackCsat5_umzkr_6,._contactCsat5_umzkr_7,._successCsat5_umzkr_8{width:100%}}._ratingCsat2_umzkr_20,._feedbackCsat2_umzkr_21,._contactCsat2_umzkr_22,._successCsat2_umzkr_23{width:280px}@media (width<=399px){._ratingCsat2_umzkr_20,._feedbackCsat2_umzkr_21,._contactCsat2_umzkr_22,._successCsat2_umzkr_23{width:100%}}._ratingCes_umzkr_35{width:340px}@media (width<=599px){._ratingCes_umzkr_35{width:280px}}@media (width<=399px){._ratingCes_umzkr_35{width:100%}}._feedbackCes_umzkr_49,._contactCes_umzkr_50,._successCes_umzkr_51{width:280px}@media (width<=599px){._feedbackCes_umzkr_49,._contactCes_umzkr_50,._successCes_umzkr_51{width:100%}}._ratingNps_umzkr_62{width:520px}@media (width<=599px){._ratingNps_umzkr_62{width:320px}}@media (width<=399px){._ratingNps_umzkr_62{width:100%}}._feedbackNps_umzkr_76,._contactNps_umzkr_77,._successNps_umzkr_78{width:280px}@media (width<=599px){._feedbackNps_umzkr_76,._contactNps_umzkr_77,._successNps_umzkr_78{width:100%}}
|
|
1
|
+
:root,:host{--_color-text:var(--ft-color-text,30 8% 14%);--_color-bg:var(--ft-color-bg,0 0% 100%);--_color-muted:var(--ft-color-muted,222 11% 46%);--_color-error:var(--ft-color-error,32 95% 44%);--_color-error-text:var(--ft-color-error-text,32 95% 32%);--_color-border:var(--ft-color-border,214 14% 83%);--_color-outline:var(--ft-color-outline,218 14% 65%);--_color-shadow:var(--ft-color-shadow,0 0% 0%);--_color-control:var(--ft-color-control,214 20% 96%);--_popup-z-index:var(--ft-popup-z-index,49);--_popup-head-offset:var(--ft-popup-head-offset,0);--_surface-padding:var(--ft-surface-padding,20px);--_surface-padding-mobile:var(--ft-surface-padding-mobile,20px);--_surface-radius:var(--ft-surface-radius,8px);--_font-family:var(--ft-font-family,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);font-family:var(--_font-family)}input,textarea,select{font:inherit}._base_d5qlz_1{padding:var(--_surface-padding);background-color:hsl(var(--_color-bg)/100%);border-radius:var(--_surface-radius);box-shadow:0 0 10px hsl(var(--_color-shadow)/20%);display:block;position:relative;overflow:auto}@media (width<=399px){._base_d5qlz_1{padding:var(--_surface-padding-mobile)}}._base_1vr2h_1{--_popup-head-offset:32px;z-index:var(--_popup-z-index);box-sizing:border-box;max-width:calc(100vw - var(--_surface-padding) * 2);max-height:calc(100vh - var(--_surface-padding) * 2);transform-origin:50% 100%;margin:0;display:flex;position:fixed}@media (width<=399px){._base_1vr2h_1{max-width:calc(100vw - var(--_surface-padding-mobile) * 2);max-height:calc(100vh - var(--_surface-padding-mobile) * 2)}}._animated_1vr2h_19{opacity:0;animation:.12s ease-in-out forwards _fadeForward_1vr2h_1}@keyframes _fadeForward_1vr2h_1{0%{opacity:0;transform:translateY(8px)scale(.92)}to{opacity:1;transform:translateY(0)scale(1)}}._topLeft_1vr2h_34{top:var(--_surface-padding);left:var(--_surface-padding)}@media (width<=399px){._topLeft_1vr2h_34{top:var(--_surface-padding-mobile);left:var(--_surface-padding-mobile)}}._topRight_1vr2h_45{top:var(--_surface-padding);right:var(--_surface-padding)}@media (width<=399px){._topRight_1vr2h_45{top:var(--_surface-padding-mobile);right:var(--_surface-padding-mobile)}}._bottomRight_1vr2h_56{right:var(--_surface-padding);bottom:var(--_surface-padding)}@media (width<=399px){._bottomRight_1vr2h_56{right:var(--_surface-padding-mobile);bottom:var(--_surface-padding-mobile)}}._bottomLeft_1vr2h_67{bottom:var(--_surface-padding);left:var(--_surface-padding)}@media (width<=399px){._bottomLeft_1vr2h_67{bottom:var(--_surface-padding-mobile);left:var(--_surface-padding-mobile)}}._close_1vr2h_78{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._close_1vr2h_78:disabled{cursor:default}._close_1vr2h_78{top:var(--_surface-padding);width:24px;height:24px;color:hsl(var(--_color-outline)/100%);transition:color .15s;position:absolute;inset-inline-end:var(--_surface-padding)}._close_1vr2h_78:hover{color:hsl(var(--_color-text)/100%)}._close_1vr2h_78:before,._close_1vr2h_78:after{content:"";background-color:currentColor;border-radius:1px;position:absolute;top:50%;left:50%;transform:rotate(45deg)}._close_1vr2h_78:before{width:16px;height:2px;margin:-1px 0 0 -8px}._close_1vr2h_78:after{width:2px;height:16px;margin:-8px 0 0 -1px}@media (width<=399px){._close_1vr2h_78{top:var(--_surface-padding-mobile);inset-inline-end:var(--_surface-padding-mobile)}}._sr_1t62n_1{white-space:nowrap;clip-path:inset(50%);border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._subtext_1t62n_13{margin:0 0 16px;line-height:1.25}._input_1t62n_18{box-sizing:border-box;width:100%;color:hsl(var(--_color-text)/100%);background-color:hsl(var(--_color-bg)/100%);border:1px solid hsl(var(--_color-border)/100%);border-radius:var(--_surface-radius);outline:0 solid hsl(var(--_color-outline)/14%);padding:8px 12px;font-family:inherit;font-size:16px;line-height:1.5;transition:background-color .15s,border-color .15s,outline-width .2s}._input_1t62n_18:focus{outline:4px solid hsl(var(--_color-outline)/14%)}._input_1t62n_18._invalid_1t62n_35{border-color:hsl(var(--_color-error)/100%)}._input_1t62n_18._invalid_1t62n_35:focus{outline-color:hsl(var(--_color-error)/14%)}._actions_1t62n_42{gap:8px;margin-top:16px;display:flex}._submit_1t62n_48{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._submit_1t62n_48:disabled{cursor:default}._submit_1t62n_48{text-align:center;color:hsl(var(--_color-bg)/100%);background-color:hsl(var(--_color-text)/100%);border-radius:var(--_surface-radius);padding:8px 32px;font-size:14px;font-weight:400;transition:opacity .2s}._submit_1t62n_48:hover:not(:disabled){opacity:.85}._submit_1t62n_48:disabled{opacity:.6}._submit_1t62n_48{flex:1}._skip_1t62n_82{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._skip_1t62n_82:disabled{cursor:default}._skip_1t62n_82{background-color:hsl(var(--_color-control)/100%);transition:background-color .15s}._skip_1t62n_82:hover:not(:disabled){background-color:hsl(var(--_color-border)/50%)}._skip_1t62n_82:disabled{opacity:.6}._skip_1t62n_82{text-align:center;color:hsl(var(--_color-text)/100%);border-radius:var(--_surface-radius);flex:1;padding:8px 32px;font-size:14px;font-weight:500}._attachment_5p8tj_1{align-items:center;column-gap:8px;width:100%;display:flex}._attachmentPreview_5p8tj_8{flex:1;align-items:center;column-gap:8px;min-width:0;text-decoration:none;display:flex}._attachmentThumbnail_5p8tj_17{box-sizing:border-box;object-fit:cover;border:1px solid hsl(var(--_color-border)/100%);border-radius:4px;flex-shrink:0;width:32px;height:32px;display:block}._attachmentCaption_5p8tj_28{flex-direction:column;min-width:0;display:flex}._attachmentName_5p8tj_34,._attachmentSize_5p8tj_35{text-overflow:ellipsis;white-space:nowrap;line-height:1.15;display:block;overflow:hidden}._attachmentName_5p8tj_34{color:hsl(var(--_color-text)/100%);font-size:13px}._attachmentSize_5p8tj_35{color:hsl(var(--_color-muted)/100%);font-size:11px}._attachmentRemove_5p8tj_53{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._attachmentRemove_5p8tj_53:disabled{cursor:default}._attachmentRemove_5p8tj_53{background-color:hsl(var(--_color-control)/100%);transition:background-color .15s}._attachmentRemove_5p8tj_53:hover:not(:disabled){background-color:hsl(var(--_color-border)/50%)}._attachmentRemove_5p8tj_53:disabled{opacity:.6}._attachmentRemove_5p8tj_53{width:24px;height:24px;color:hsl(var(--_color-text)/100%);border-radius:50%;flex-shrink:0;position:relative}._attachmentRemove_5p8tj_53:before,._attachmentRemove_5p8tj_53:after{content:"";background-color:currentColor;border-radius:1px;position:absolute;top:50%;left:50%;transform:rotate(45deg)}._attachmentRemove_5p8tj_53:before{width:12px;height:1.5px;margin:-1px 0 0 -6px}._attachmentRemove_5p8tj_53:after{width:1.5px;height:12px;margin:-6px 0 0 -1px}._choices_iatib_1{margin:0 0 12px}._choice_iatib_1{display:flex}._choice_iatib_1+._choice_iatib_1{margin-top:12px}._label_iatib_12{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:flex-start;gap:8px;display:inline-flex;position:relative}._sr_iatib_21{white-space:nowrap;clip-path:inset(50%);border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._checkbox_iatib_33{white-space:nowrap;clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}._check_iatib_33{border:1px solid hsl(var(--_color-border)/100%);border-radius:4px;min-width:20px;height:20px}._label_iatib_12:hover ._check_iatib_33{border-color:hsl(var(--_color-text)/100%)}._checkbox_iatib_33:focus-visible+._check_iatib_33{outline:4px solid hsl(var(--_color-outline)/14%)}._checkbox_iatib_33:checked+._check_iatib_33{background-color:hsl(var(--_color-text)/100%);border-color:hsl(var(--_color-text)/100%);position:relative}._checkbox_iatib_33:checked+._check_iatib_33:after{content:"";border:2px solid;border-color:transparent transparent hsl(var(--_color-bg)/100%) hsl(var(--_color-bg)/100%);pointer-events:none;width:10px;height:4px;position:absolute;top:50%;left:50%;transform:translate(-45%,-75%)rotate(-45deg)}._fieldWrapper_iatib_74{display:flex;position:relative}._input_iatib_79{margin-top:8px;padding:8px 12px}._textarea_iatib_84{height:120px;padding:8px 12px 40px}._input_iatib_79,._textarea_iatib_84{box-sizing:border-box;width:100%;color:hsl(var(--_color-text)/100%);background-color:hsl(var(--_color-bg)/100%);border:1px solid hsl(var(--_color-border)/100%);border-radius:var(--_surface-radius);outline:0 solid hsl(var(--_color-outline)/14%);resize:none;font-family:inherit;font-size:16px;line-height:1.5;transition:background-color .15s,border-color .15s,outline-width .2s}._input_iatib_79:focus,._textarea_iatib_84:focus{outline:4px solid hsl(var(--_color-outline)/14%)}._input_iatib_79._invalid_iatib_108,._textarea_iatib_84._invalid_iatib_108{border-color:hsl(var(--_color-error)/100%)}._input_iatib_79._invalid_iatib_108:focus,._textarea_iatib_84._invalid_iatib_108:focus{outline-color:hsl(var(--_color-error)/14%)}._attachTriggers_iatib_117{gap:6px;display:flex;position:absolute;bottom:8px;right:8px}._attachTrigger_iatib_117{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._attachTrigger_iatib_117:disabled{cursor:default}._attachTrigger_iatib_117{background-color:hsl(var(--_color-control)/100%);transition:background-color .15s}._attachTrigger_iatib_117:hover:not(:disabled){background-color:hsl(var(--_color-border)/50%)}._attachTrigger_iatib_117:disabled{opacity:.6}._attachTrigger_iatib_117{box-sizing:border-box;width:28px;height:28px;color:hsl(var(--_color-muted)/100%);border-radius:var(--_surface-radius);justify-content:center;align-items:center;transition:color .15s,background-color .15s;display:flex}._attachTrigger_iatib_117:hover:not(:disabled){color:hsl(var(--_color-text)/100%)}._attachments_iatib_164{flex-direction:column;gap:12px;margin-top:12px;display:flex}._attachmentList_iatib_171{flex-direction:column;gap:8px;display:flex}._attachmentError_iatib_177{color:hsl(var(--_color-error-text)/100%);font-size:14px}._actions_iatib_182{gap:8px;margin-top:12px;display:flex}._submit_iatib_188{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._submit_iatib_188:disabled{cursor:default}._submit_iatib_188{text-align:center;color:hsl(var(--_color-bg)/100%);background-color:hsl(var(--_color-text)/100%);border-radius:var(--_surface-radius);padding:8px 32px;font-size:14px;font-weight:400;transition:opacity .2s}._submit_iatib_188:hover:not(:disabled){opacity:.85}._submit_iatib_188:disabled{opacity:.6}._submit_iatib_188{flex:1}._skip_iatib_222{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._skip_iatib_222:disabled{cursor:default}._skip_iatib_222{background-color:hsl(var(--_color-control)/100%);transition:background-color .15s}._skip_iatib_222:hover:not(:disabled){background-color:hsl(var(--_color-border)/50%)}._skip_iatib_222:disabled{opacity:.6}._skip_iatib_222{text-align:center;color:hsl(var(--_color-text)/100%);border-radius:var(--_surface-radius);flex:1;padding:8px 32px;font-size:14px;font-weight:500}._base_1ilpx_1{text-align:center;padding:0 24px}._icon_1ilpx_6{display:inline-block}._base_onxlf_1{color:hsl(var(--_color-text)/100%);padding:0;font-family:Helvetica Neue,Arial Nova,Helvetica,Arial,sans-serif}._head_onxlf_7{padding-block:0 12px;padding-inline:0 var(--_popup-head-offset);gap:8px;display:flex}._title_onxlf_14{flex:1 0;font-family:inherit;font-size:16px;font-style:normal;font-weight:500;line-height:1.4}._base_nswpf_1{margin:12px 0 0;display:flex}._label_nswpf_6{box-sizing:border-box;max-width:50%;color:hsl(var(--_color-muted)/100%);flex:0 0 50%;font-size:14px;line-height:1.4286}._between_nswpf_15{justify-content:space-between}._between_nswpf_15 ._label_nswpf_6{flex:0 0 50%;max-width:50%}._between_nswpf_15 ._label_nswpf_6:first-child{text-align:start}._between_nswpf_15 ._label_nswpf_6:last-child{text-align:end}._center_nswpf_29 ._label_nswpf_6{flex:0 0 50%;max-width:50%}._center_nswpf_29 ._label_nswpf_6:first-child{text-align:end;padding-right:8px}._center_nswpf_29 ._label_nswpf_6:last-child{text-align:start;padding-left:8px}._center_nswpf_29 ._text_nswpf_41{text-align:center;min-width:56px;display:inline-block}@media (width<=599px){._center_nswpf_29 ._text_nswpf_41{min-width:48px}}._list_1vfe4_1{justify-content:space-between;display:flex}._icon_1vfe4_6{transition:transform .12s;transform:scale(1)}._button_1vfe4_11{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_1vfe4_11:disabled{cursor:default}._button_1vfe4_11{background-color:hsl(var(--_color-control)/100%);border-radius:50%;justify-content:center;align-items:center;width:56px;height:56px;display:flex}._button_1vfe4_11:hover ._icon_1vfe4_6{transform:scale(1.15)}._button_1vfe4_11:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}@media (width<=399px){._button_1vfe4_11{width:48px;height:48px}}._list_16sag_1{justify-content:space-between;display:flex}._button_16sag_6{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_16sag_6:disabled{cursor:default}._button_16sag_6{width:40px;height:40px;color:hsl(var(--_color-muted)/100%);background-color:hsl(var(--_color-control)/100%);box-shadow:0 0 0 0 hsl(var(--_color-control)/100%);border-radius:50%;justify-content:center;align-items:center;font-size:18px;font-weight:700;transition:color .12s,box-shadow .12s;display:flex}._button_16sag_6:hover{color:hsl(var(--_color-text)/100%);box-shadow:0 0 0 2px hsl(var(--_color-control)/100%)}._button_16sag_6:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._list_1kpxu_1{justify-content:space-between;display:flex}._icon_1kpxu_6{transition:transform .12s;transform:scale(1)}._button_1kpxu_11{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_1kpxu_11:disabled{cursor:default}._button_1kpxu_11{justify-content:center;align-items:center;width:40px;height:40px;display:flex}._button_1kpxu_11:hover ._icon_1kpxu_6{transform:scale(1.1)}._button_1kpxu_11:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._list_grany_1{justify-content:center;gap:16px;display:flex}._icon_grany_7{transition:transform .12s;transform:scale(1)}._button_grany_12{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_grany_12:disabled{cursor:default}._button_grany_12{background-color:hsl(var(--_color-control)/100%);border-radius:50%;justify-content:center;align-items:center;width:56px;height:56px;display:flex}._button_grany_12:hover ._icon_grany_7{transform:scale(1.15)}._button_grany_12:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}@media (width<=399px){._button_grany_12{width:48px;height:48px}}._list_1yzyr_1{justify-content:center;gap:16px;display:flex}._icon_1yzyr_7{transition:transform .12s;transform:scale(1)}._button_1yzyr_12{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_1yzyr_12:disabled{cursor:default}._button_1yzyr_12{background-color:hsl(var(--_color-control)/100%);border-radius:50%;justify-content:center;align-items:center;width:56px;height:56px;display:flex}._button_1yzyr_12:hover ._icon_1yzyr_7{transform:scale(1.15)}._button_1yzyr_12:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._list_whbas_1{justify-content:space-between;gap:6px;display:flex}@media (width<=599px){._list_whbas_1{flex-direction:column-reverse;gap:4px}}._button_whbas_13{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_whbas_13:disabled{cursor:default}._button_whbas_13{text-align:center;width:40px;height:40px;color:hsl(var(--_color-muted)/100%);background-color:hsl(var(--_color-control)/100%);box-shadow:0 0 0 0 hsl(var(--_color-control)/100%);border-radius:50%;font-size:18px;font-weight:700;transition:color .12s,box-shadow .12s;display:inline-block}._button_whbas_13:hover{color:hsl(var(--_color-text)/100%);box-shadow:0 0 0 2px hsl(var(--_color-control)/100%)}@media (width<=599px){._button_whbas_13:hover{box-shadow:none}}._button_whbas_13:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._button_whbas_13 ._score_whbas_52{display:inline}._button_whbas_13 ._label_whbas_55{display:none}@media (width<=599px){._button_whbas_13 ._label_whbas_55{display:inline}._button_whbas_13{border-radius:6px;width:100%;height:auto;padding:6px;font-size:14px;line-height:20px}._labels_whbas_75{display:none}}._list_divjm_1{justify-content:space-between;gap:6px;display:flex}@media (width<=599px){._list_divjm_1{flex-direction:column-reverse;gap:4px}}._button_divjm_13{appearance:none;text-align:center;box-shadow:none;cursor:pointer;background-color:#0000;border:none;margin:0;padding:0;font-family:inherit}._button_divjm_13:disabled{cursor:default}._button_divjm_13{text-align:center;width:40px;height:40px;color:hsl(var(--_color-muted)/100%);background-color:hsl(var(--_color-control)/100%);box-shadow:0 0 0 0 hsl(var(--_color-control)/100%);border-radius:50%;font-size:18px;font-weight:700;transition:color .12s,box-shadow .12s;display:block}._button_divjm_13:hover{color:hsl(var(--_color-text)/100%);box-shadow:0 0 0 2px hsl(var(--_color-control)/100%)}@media (width<=599px){._button_divjm_13:hover{box-shadow:none}}._button_divjm_13:focus-visible{outline:2px solid hsl(var(--_color-outline)/100%)}._button_divjm_13 ._score_divjm_52{display:inline}._button_divjm_13 ._label_divjm_55{display:none}@media (width<=599px){._button_divjm_13 ._label_divjm_55{display:inline}._button_divjm_13{border-radius:6px;width:100%;height:auto;padding:6px;font-size:14px;line-height:20px}._labels_divjm_75{display:none}}._base_171s9_1{max-width:100%}._ratingCsat5_171s9_5,._feedbackCsat5_171s9_6,._contactCsat5_171s9_7,._successCsat5_171s9_8{width:320px}@media (width<=399px){._ratingCsat5_171s9_5,._feedbackCsat5_171s9_6,._contactCsat5_171s9_7,._successCsat5_171s9_8{width:100%}}._ratingCsat2_171s9_20,._feedbackCsat2_171s9_21,._contactCsat2_171s9_22,._successCsat2_171s9_23{width:280px}@media (width<=399px){._ratingCsat2_171s9_20,._feedbackCsat2_171s9_21,._contactCsat2_171s9_22,._successCsat2_171s9_23{width:100%}}._ratingCes_171s9_35{width:340px}@media (width<=599px){._ratingCes_171s9_35{width:280px}}@media (width<=399px){._ratingCes_171s9_35{width:100%}}._feedbackCes_171s9_49,._contactCes_171s9_50,._successCes_171s9_51{width:280px}@media (width<=599px){._feedbackCes_171s9_49,._contactCes_171s9_50,._successCes_171s9_51{width:100%}}._ratingNps_171s9_62{width:520px}@media (width<=599px){._ratingNps_171s9_62{width:320px}}@media (width<=399px){._ratingNps_171s9_62{width:100%}}._feedbackNps_171s9_76,._contactNps_171s9_77,._successNps_171s9_78{width:280px}@media (width<=599px){._feedbackNps_171s9_76,._contactNps_171s9_77,._successNps_171s9_78{width:100%}}._feedbackGeneral_171s9_89,._contactGeneral_171s9_90,._successGeneral_171s9_91{width:280px}@media (width<=599px){._feedbackGeneral_171s9_89,._contactGeneral_171s9_90,._successGeneral_171s9_91{width:100%}}
|
|
2
2
|
/*$vite$:1*/
|
package/dist/index.d.ts
CHANGED
|
@@ -47,6 +47,16 @@ export declare interface CsatSurveyProps5 extends SharedSurveyProps {
|
|
|
47
47
|
scaleStyle: 'emoji' | 'numbers' | 'stars';
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
/** General feedback survey — no rating scale, collects text feedback and an optional screenshot */
|
|
51
|
+
export declare interface GeneralSurveyProps extends Omit<SharedSurveyProps, 'question' | 'responseType'> {
|
|
52
|
+
/** Survey methodology */
|
|
53
|
+
type: 'general';
|
|
54
|
+
/** Unused — general surveys have no rating screen to show it on */
|
|
55
|
+
question?: string;
|
|
56
|
+
/** Type of feedback collection. The text feedback step is the whole survey, so it's never skippable. @default 'text' */
|
|
57
|
+
responseType?: 'text' | 'choices';
|
|
58
|
+
}
|
|
59
|
+
|
|
50
60
|
/** Net Promoter Score survey, rated on a fixed 0–10 scale */
|
|
51
61
|
export declare interface NpsSurveyProps extends SharedSurveyProps {
|
|
52
62
|
/** Survey methodology */
|
|
@@ -65,6 +75,8 @@ export declare interface PopupProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
65
75
|
close?: string;
|
|
66
76
|
};
|
|
67
77
|
placement?: 'topLeft' | 'topRight' | 'bottomRight' | 'bottomLeft';
|
|
78
|
+
/** Close button label, used for both its aria-label and title. @default 'Close survey' */
|
|
79
|
+
closeLabel?: string;
|
|
68
80
|
onClose?: () => void;
|
|
69
81
|
}
|
|
70
82
|
|
|
@@ -121,12 +133,16 @@ export declare interface SharedSurveyProps {
|
|
|
121
133
|
};
|
|
122
134
|
/** Text direction for RTL/LTR support */
|
|
123
135
|
dir?: 'ltr' | 'rtl' | 'auto';
|
|
136
|
+
/** Overrides for the library's own aria-labels and other screen-reader-only text. See `SurveyStrings`. */
|
|
137
|
+
strings?: SurveyStrings;
|
|
124
138
|
/** Main survey question (screen 1) */
|
|
125
139
|
question: string;
|
|
126
140
|
/** Left label for the rating scale */
|
|
127
141
|
minLabel?: string;
|
|
128
142
|
/** Right label for the rating scale */
|
|
129
143
|
maxLabel?: string;
|
|
144
|
+
/** Builds the visible text appended after the first/last numbered scale button when it carries `minLabel`/`maxLabel`. @default (label) => ` - ${label}` */
|
|
145
|
+
getScoreLabelSuffix?: (label: string) => string;
|
|
130
146
|
/** Type of feedback collection */
|
|
131
147
|
responseType?: null | 'text' | 'choices';
|
|
132
148
|
/** Follow-up feedback question (screen 2) */
|
|
@@ -137,6 +153,16 @@ export declare interface SharedSurveyProps {
|
|
|
137
153
|
textButtonSkipLabel?: string;
|
|
138
154
|
/** Optional predefined choices for feedback */
|
|
139
155
|
choiceOptions?: string[] | null;
|
|
156
|
+
/** Placeholder for the free-text input next to choice checkboxes. @default 'Other' */
|
|
157
|
+
otherPlaceholder?: string;
|
|
158
|
+
/** Label for the screenshot-attachment control */
|
|
159
|
+
screenshotButtonLabel?: string;
|
|
160
|
+
/** Shown to the respondent when `onCaptureScreenshot` fails. @default 'Failed to capture screenshot' */
|
|
161
|
+
screenshotErrorMessage?: string;
|
|
162
|
+
/** Maximum number of attachments a respondent may confirm, across every attachment source. @default 1 */
|
|
163
|
+
maxAttachments?: number;
|
|
164
|
+
/** Visible caption under an attachment thumbnail, also used as its image alt text. @default 'Screenshot' */
|
|
165
|
+
attachmentCaption?: string;
|
|
140
166
|
/** Success message text */
|
|
141
167
|
thankYouMessage: string;
|
|
142
168
|
/** Enables an optional email collection step before the success screen. Skipped when `userId` is already provided */
|
|
@@ -155,6 +181,8 @@ export declare interface SharedSurveyProps {
|
|
|
155
181
|
onScoreSubmit?: SurveyCallback;
|
|
156
182
|
/** Callback when survey data is submitted */
|
|
157
183
|
onFeedbackSubmit?: SurveyCallback;
|
|
184
|
+
/** Enables an optional screenshot-attachment control on the feedback step. Hidden unless provided — bring your own capture function, see README */
|
|
185
|
+
onCaptureScreenshot?: () => string | Blob | Promise<string | Blob>;
|
|
158
186
|
/** Callback when contact is submitted */
|
|
159
187
|
onContactSubmit?: ContactCallback;
|
|
160
188
|
}
|
|
@@ -165,6 +193,22 @@ export declare type SurfaceProps = React.HTMLAttributes<HTMLDivElement>;
|
|
|
165
193
|
|
|
166
194
|
export declare const Survey: default_2.FC<SurveyProps>;
|
|
167
195
|
|
|
196
|
+
/**
|
|
197
|
+
* A single attachment confirmed by the respondent
|
|
198
|
+
*/
|
|
199
|
+
export declare interface SurveyAttachment {
|
|
200
|
+
/** Discriminates the source that produced this attachment (not its content type — use `mimeType` for that) */
|
|
201
|
+
kind: 'screenshot';
|
|
202
|
+
/** Raw attachment data, as returned by the source */
|
|
203
|
+
data: string | Blob;
|
|
204
|
+
/** Original filename, when known (e.g. from a native `File`) */
|
|
205
|
+
name?: string;
|
|
206
|
+
/** MIME type, when known and not already carried by a `File`'s own `.type` */
|
|
207
|
+
mimeType?: string;
|
|
208
|
+
/** Size in bytes, when known (unavailable when `data` is an already-hosted URL string) */
|
|
209
|
+
size?: number;
|
|
210
|
+
}
|
|
211
|
+
|
|
168
212
|
/**
|
|
169
213
|
* Callback function for survey submission
|
|
170
214
|
* @param payload - The survey data to submit
|
|
@@ -172,7 +216,7 @@ export declare const Survey: default_2.FC<SurveyProps>;
|
|
|
172
216
|
*/
|
|
173
217
|
export declare type SurveyCallback = (payload: SurveySubmitPayload) => void | Promise<void>;
|
|
174
218
|
|
|
175
|
-
export declare type SurveyProps = CsatSurveyProps5 | CsatSurveyProps2 | CesSurveyProps | NpsSurveyProps;
|
|
219
|
+
export declare type SurveyProps = CsatSurveyProps5 | CsatSurveyProps2 | CesSurveyProps | NpsSurveyProps | GeneralSurveyProps;
|
|
176
220
|
|
|
177
221
|
/**
|
|
178
222
|
* Available screens in survey flow
|
|
@@ -187,6 +231,35 @@ export declare type SurveyScreen =
|
|
|
187
231
|
/** Final "thanks" message screen */
|
|
188
232
|
| 'success';
|
|
189
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Overrides for the library's own aria-labels and other screen-reader-only text. Never visible
|
|
236
|
+
* UI copy — that's `question`, `thankYouMessage`, `otherPlaceholder`, `attachmentCaption`, etc.,
|
|
237
|
+
* always authored by you alongside the rest of the survey content, sitting directly on
|
|
238
|
+
* `SharedSurveyProps`. Every key here is announced to assistive tech only, useful to override
|
|
239
|
+
* e.g. when localizing a survey for a non-English audience. Each key merges over its English
|
|
240
|
+
* default; omit a key to keep that default.
|
|
241
|
+
*/
|
|
242
|
+
export declare interface SurveyStrings {
|
|
243
|
+
/** aria-label for the feedback step's form/region. @default 'Feedback form' */
|
|
244
|
+
feedbackFormLabel?: string;
|
|
245
|
+
/** Label for the free-text input shown alongside choice checkboxes. @default 'Additional feedback' */
|
|
246
|
+
additionalFeedbackLabel?: string;
|
|
247
|
+
/** Label for the open-ended feedback textarea shown when there are no predefined choices. @default 'Your feedback' */
|
|
248
|
+
yourFeedbackLabel?: string;
|
|
249
|
+
/** aria-label for the contact step's form/region. @default 'Contact form' */
|
|
250
|
+
contactFormLabel?: string;
|
|
251
|
+
/** Label for the email input on the contact collection screen. @default 'Email address' */
|
|
252
|
+
emailLabel?: string;
|
|
253
|
+
/** aria-label for opening an attachment thumbnail in a new tab. @default 'Open screenshot in a new tab' */
|
|
254
|
+
attachmentOpenLabel?: string;
|
|
255
|
+
/** aria-label/title for removing an attachment. @default 'Remove screenshot' */
|
|
256
|
+
attachmentRemoveLabel?: string;
|
|
257
|
+
/** Builds the aria-label for a numbered scale button. @default (score) => `Score ${score}` */
|
|
258
|
+
getScoreLabel?: (score: number) => string;
|
|
259
|
+
/** Builds the aria-label for a star rating button. @default (score) => `${score} ${score > 1 ? 'stars' : 'star'}` */
|
|
260
|
+
getStarsLabel?: (score: number) => string;
|
|
261
|
+
}
|
|
262
|
+
|
|
190
263
|
/**
|
|
191
264
|
* Payload sent when submitting survey data
|
|
192
265
|
*/
|
|
@@ -195,6 +268,8 @@ export declare interface SurveySubmitPayload {
|
|
|
195
268
|
value?: number;
|
|
196
269
|
/** Optional text or array of selected choices */
|
|
197
270
|
text?: string | string[];
|
|
271
|
+
/** Attachments (e.g. a screenshot) confirmed by the respondent */
|
|
272
|
+
attachments?: SurveyAttachment[];
|
|
198
273
|
}
|
|
199
274
|
|
|
200
275
|
export { }
|