@explorer02/cfm-survey-sdk 0.3.6 → 0.3.8

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.
@@ -1,7 +1,7 @@
1
1
  import React, { useState } from 'react';
2
2
  import type { CsatQuestion, RatingMatrixQuestion, MatrixRowAnswers, ScaleColumn } from '@explorer02/cfm-survey-sdk';
3
3
  import { getEmojiForIndex, CsatStarIcons } from './surveyUiIcons';
4
- import { columnSubmitValue, nonNaScaleColumns, anchorLabelPercent } from './surveyUiScaleUtils';
4
+ import { columnSubmitValue, nonNaScaleColumns } from './surveyUiScaleUtils';
5
5
  import { CustomSliderTrack } from './CustomSliderTrack';
6
6
  import MatrixDropdown from './MatrixDropdown';
7
7
  import {
@@ -26,11 +26,8 @@ function anchorLabelStyle(question: CsatMatrixQuestion) {
26
26
  return question.type === 'RATING_MATRIX' ? ratingColumnLabelStyle() : csatColumnLabelStyle();
27
27
  }
28
28
 
29
- function columnHeaderLabelStyle(question: CsatMatrixQuestion) {
30
- if (question.type === 'RATING_MATRIX') {
31
- return { fontSize: '13px', fontWeight: 500, textAlign: 'center' as const, lineHeight: 1.2, color: '#4b5563' };
32
- }
33
- return { fontSize: '13px', fontWeight: 500, textAlign: 'center' as const, lineHeight: 1.2, ...csatColumnLabelStyle() };
29
+ function columnHeaderLabelStyle(_question: CsatMatrixQuestion) {
30
+ return { fontSize: '13px', fontWeight: 500, textAlign: 'center' as const, lineHeight: 1.2, color: '#4b5563' };
34
31
  }
35
32
 
36
33
  function GraphicsColumnLabelsRow({
@@ -41,9 +38,13 @@ function GraphicsColumnLabelsRow({
41
38
  question: CsatMatrixQuestion;
42
39
  }) {
43
40
  if (scaleColumns.length === 0) return null;
44
- const labelStyle = question.type === 'RATING_MATRIX'
45
- ? { fontSize: '12px', fontWeight: 500, lineHeight: 1.2, wordBreak: 'break-word' as const, color: '#4b5563' }
46
- : { fontSize: '12px', fontWeight: 500, lineHeight: 1.2, wordBreak: 'break-word' as const, ...csatColumnLabelStyle() };
41
+ const labelStyle = {
42
+ fontSize: '12px',
43
+ fontWeight: 500,
44
+ lineHeight: 1.2,
45
+ wordBreak: 'break-word' as const,
46
+ color: '#4b5563',
47
+ };
47
48
 
48
49
  return (
49
50
  <div style={{ flex: 1, padding: '0 24px' }}>
@@ -219,7 +220,9 @@ function CsatMatrixGrid({
219
220
  <div style={{ flex: 1, display: 'flex' }}>
220
221
  <div style={{ flex: 1, position: 'relative', height: '24px', ...(isGraphics ? { margin: '0 40px' } : {}) }}>
221
222
  {labels!.map((label, i) => {
222
- const percent = anchorLabelPercent(i, n, m, isGraphics);
223
+ const startPercent = isGraphics ? 0 : 0.5 / m;
224
+ const rangePercent = isGraphics ? 1 : (m - 1) / m;
225
+ const percent = n === 1 ? 50 : (startPercent + (i / (n - 1)) * rangePercent) * 100;
223
226
 
224
227
  return (
225
228
  <div key={i} style={{
@@ -361,11 +364,11 @@ function CsatMatrixGrid({
361
364
  ...(isSelected
362
365
  ? scaleCellSelectedStyle(true)
363
366
  : {
364
- border: '1px solid #d1d5db',
365
- backgroundColor: '#fff',
366
- color: '#111827',
367
- ...unselectedOpacityStyle(),
368
- }),
367
+ border: '1px solid #d1d5db',
368
+ backgroundColor: '#fff',
369
+ color: '#111827',
370
+ ...unselectedOpacityStyle(),
371
+ }),
369
372
  transition: 'all 0.15s',
370
373
  } : {
371
374
  padding: '8px',
@@ -458,7 +461,9 @@ function CsatMatrixCarousel({
458
461
  {labels!.map((label, i) => {
459
462
  const m = scaleColumns.length;
460
463
  const n = labels!.length;
461
- const percent = anchorLabelPercent(i, n, m, isGraphics);
464
+ const startPercent = isGraphics ? 0 : 0.5 / m;
465
+ const rangePercent = isGraphics ? 1 : (m - 1) / m;
466
+ const percent = n === 1 ? 50 : (startPercent + (i / (n - 1)) * rangePercent) * 100;
462
467
 
463
468
  return (
464
469
  <div key={i} style={{
@@ -527,21 +532,15 @@ function CsatMatrixCarousel({
527
532
  cursor: 'pointer', borderRadius: '6px', pointerEvents: 'none',
528
533
  ...(isEmoji ? {
529
534
  padding: '6px', transform: isSelected ? 'scale(1.1)' : isHovered ? 'scale(1.25)' : 'scale(1)',
530
- ...(isSelected ? { backgroundColor: 'rgba(252, 231, 243, 0.6)', boxShadow: '0 0 0 2px rgba(226, 0, 116, 0.3)', borderRadius: '50%' } : unselectedOpacityStyle()),
535
+ ...(isSelected ? { backgroundColor: 'rgba(252, 231, 243, 0.6)', boxShadow: '0 0 0 2px rgba(226, 0, 116, 0.3)', borderRadius: '50%' } : {}),
531
536
  } : isStar ? {
532
- padding: '4px', transform: isHovered ? 'scale(1.1)' : 'scale(1)', color: isSelected ? cellSelectedVar : focusRingVar,
533
- ...(isSelected ? {} : unselectedOpacityStyle()),
537
+ padding: '4px', transform: isHovered ? 'scale(1.1)' : 'scale(1)', opacity: isSelected ? 1 : isHovered ? 1 : 0.5,
534
538
  } : isNumbered ? {
535
539
  width: '40px', height: '40px', borderRadius: '8px', fontSize: '14px', fontWeight: 500,
536
540
  ...(isSelected
537
541
  ? scaleCellSelectedStyle(true)
538
- : {
539
- border: '1px solid #d1d5db',
540
- backgroundColor: '#fff',
541
- color: '#111827',
542
- ...unselectedOpacityStyle(),
543
- }),
544
- } : { padding: '8px', ...(isSelected ? {} : unselectedOpacityStyle()) }),
542
+ : { border: '1px solid #d1d5db', backgroundColor: '#fff', color: '#111827' }),
543
+ } : { padding: '8px' }),
545
544
  }}
546
545
  >
547
546
  {(EmojiNode ?? StarNode ?? (isNumbered ? (displayIdx + 1) : RadioNode)) as React.ReactNode}
@@ -76,12 +76,11 @@ export default function Header({ embedded = false }: HeaderProps) {
76
76
  {seedCompany}
77
77
  </span>
78
78
 
79
- {seedCompany ? (
79
+ {seedShowCompany && hasLogoFile && seedCompany ? (
80
80
  <span
81
81
  data-cfm-company
82
82
  className="font-semibold"
83
83
  style={{
84
- display: seedShowCompany && hasLogoFile ? undefined : 'none',
85
84
  color: 'var(--cfm-header-company-color, var(--cfm-text))',
86
85
  fontSize: 'var(--cfm-header-company-size, 18px)',
87
86
  fontWeight: 'var(--cfm-header-company-weight, 600)',
@@ -81,8 +81,7 @@ export function SliderMatrixScale({ question, selectedValue = {}, onSelect }: Sl
81
81
  display: 'flex',
82
82
  justifyContent: 'space-between',
83
83
  margin: '0 16px',
84
- marginBottom: tickValues.length > 0 ? '24px' : '8px',
85
- minHeight: '20px',
84
+ marginBottom: '16px',
86
85
  fontSize: '14px',
87
86
  fontWeight: 500,
88
87
  }}
@@ -101,11 +100,10 @@ export function SliderMatrixScale({ question, selectedValue = {}, onSelect }: Sl
101
100
  style={{
102
101
  position: 'relative',
103
102
  margin: '0 16px',
104
- marginTop: labels && labels.length > 0 ? '4px' : '0',
105
103
  marginBottom: '8px',
106
104
  fontSize: '14px',
107
105
  fontWeight: 400,
108
- height: '32px',
106
+ height: '28px',
109
107
  ...sliderTickLabelStyle(),
110
108
  }}
111
109
  >
@@ -96,20 +96,3 @@ export function columnAccentColor(column: { id: string; label: string }): string
96
96
  }
97
97
  return undefined;
98
98
  }
99
-
100
- /** Column-center anchor label positioning (m = option columns, n = anchor labels). */
101
- export function anchorLabelPercent(
102
- index: number,
103
- labelCount: number,
104
- columnCount: number,
105
- isGraphics = false,
106
- ): number {
107
- const m = columnCount;
108
- const n = labelCount;
109
- if (isGraphics) {
110
- return n === 1 ? 0 : (index / (n - 1)) * 100;
111
- }
112
- const startPercent = 0.5 / m;
113
- const rangePercent = (m - 1) / m;
114
- return n === 1 ? 50 : (startPercent + (index / (n - 1)) * rangePercent) * 100;
115
- }
@@ -76,35 +76,6 @@
76
76
  });
77
77
  }
78
78
 
79
- function ensureCompanySpan() {
80
- var brand = document.querySelector('.cfm-header-brand');
81
- if (!brand) return null;
82
- var el = brand.querySelector('[data-cfm-company]');
83
- if (el) return el;
84
- el = document.createElement('span');
85
- el.setAttribute('data-cfm-company', '');
86
- el.className = 'font-semibold';
87
- el.style.color = 'var(--cfm-header-company-color, var(--cfm-text))';
88
- el.style.fontSize = 'var(--cfm-header-company-size, 18px)';
89
- el.style.fontWeight = 'var(--cfm-header-company-weight, 600)';
90
- var logo = brand.querySelector('[data-cfm-logo]');
91
- if (logo && logo.parentNode === brand) {
92
- if (logo.nextSibling) brand.insertBefore(el, logo.nextSibling);
93
- else brand.appendChild(el);
94
- } else {
95
- brand.appendChild(el);
96
- }
97
- return el;
98
- }
99
-
100
- function companyNameVisible() {
101
- var root = document.documentElement;
102
- var attr = root.getAttribute('data-cfm-show-company-name');
103
- if (attr === '0') return false;
104
- if (attr === '1') return true;
105
- return readVar('--cfm-header-show-company', '1') !== '0';
106
- }
107
-
108
79
  function applyThemeSideEffects() {
109
80
  applyNumberBadgeColors();
110
81
  applyDropzoneStyle();
@@ -134,23 +105,15 @@
134
105
  });
135
106
  document.querySelectorAll('[data-cfm-company]').forEach(function (el) {
136
107
  if (patch.logoUrl) {
137
- var show = companyNameVisible() && el.textContent;
138
- el.style.display = show ? '' : 'none';
108
+ el.style.display = el.textContent ? '' : 'none';
139
109
  }
140
110
  });
141
111
  }
142
112
  if (patch.companyName !== undefined) {
143
113
  var name = patch.companyName || '';
144
- if (name && document.querySelectorAll('[data-cfm-company]').length === 0) {
145
- ensureCompanySpan();
146
- }
147
114
  document.querySelectorAll('[data-cfm-company]').forEach(function (el) {
148
115
  el.textContent = name;
149
- var logoImg = document.querySelector('[data-cfm-logo]');
150
- var logoVisible =
151
- logoImg && logoImg.style.display !== 'none' && logoImg.getAttribute('src');
152
- var show = name && logoVisible && companyNameVisible();
153
- el.style.display = show ? '' : 'none';
116
+ el.style.display = name ? '' : 'none';
154
117
  });
155
118
  document.querySelectorAll('[data-cfm-logo-text]').forEach(function (el) {
156
119
  var logoImg = document.querySelector('[data-cfm-logo]');
@@ -211,17 +174,7 @@
211
174
  if (patch.layoutFlags) {
212
175
  var flags = patch.layoutFlags;
213
176
  if (flags.showCompanyName !== undefined) {
214
- document.documentElement.setAttribute(
215
- 'data-cfm-show-company-name',
216
- flags.showCompanyName ? '1' : '0',
217
- );
218
- document.querySelectorAll('[data-cfm-company]').forEach(function (el) {
219
- var logoImg = document.querySelector('[data-cfm-logo]');
220
- var logoVisible =
221
- logoImg && logoImg.style.display !== 'none' && logoImg.getAttribute('src');
222
- var show = flags.showCompanyName && el.textContent && logoVisible;
223
- el.style.display = show ? '' : 'none';
224
- });
177
+ setDisplay('[data-cfm-company]', flags.showCompanyName);
225
178
  }
226
179
  if (flags.showHeader !== undefined) {
227
180
  setDisplay('.cfm-header, header.cfm-header', flags.showHeader);
@@ -242,16 +195,10 @@
242
195
  setDisplay('[data-cfm-btn-back]', flags.showBackButton);
243
196
  }
244
197
  if (flags.showQuestionNumbers !== undefined) {
245
- document.documentElement.setAttribute(
246
- 'data-cfm-show-question-numbers',
247
- flags.showQuestionNumbers ? '1' : '0',
248
- );
198
+ setDisplay('[data-cfm-question-number]', flags.showQuestionNumbers);
249
199
  }
250
200
  if (flags.showRequiredAsterisk !== undefined) {
251
- document.documentElement.setAttribute(
252
- 'data-cfm-show-required',
253
- flags.showRequiredAsterisk ? '1' : '0',
254
- );
201
+ setDisplay('[data-cfm-required]', flags.showRequiredAsterisk);
255
202
  }
256
203
  if (flags.showFooterLogo !== undefined) {
257
204
  setDisplay('[data-cfm-footer-logo]', flags.showFooterLogo);
@@ -71,14 +71,7 @@ export function PreviewConfigProvider({ children }: { children: ReactNode }) {
71
71
  if (!data?.type) return;
72
72
  if (data.type !== PREVIEW_BRIDGE_SNAPSHOT && data.type !== PREVIEW_BRIDGE_DELTA) return;
73
73
  if (data.contentPatch?.previewState) {
74
- setPreviewState((prev) => {
75
- const next = { ...prev, ...data.contentPatch.previewState };
76
- const changed = (Object.keys(data.contentPatch.previewState) as (keyof PreviewStatePatch)[]).some(
77
- (key) => prev[key] !== next[key],
78
- );
79
- if (changed) setConfigRevision((r) => r + 1);
80
- return next;
81
- });
74
+ setPreviewState((prev) => ({ ...prev, ...data.contentPatch.previewState }));
82
75
  }
83
76
  if (data.contentPatch?.domAttributes) {
84
77
  const root = document.documentElement;
@@ -92,6 +85,7 @@ export function PreviewConfigProvider({ children }: { children: ReactNode }) {
92
85
  root.style.setProperty(key, value as string);
93
86
  }
94
87
  }
88
+ setConfigRevision((r) => r + 1);
95
89
  applyThemeSideEffects();
96
90
  };
97
91
 
@@ -19,6 +19,19 @@ const LIKERT_COLUMNS = [
19
19
  { id: 'c5', label: 'Strongly Agree' },
20
20
  ];
21
21
 
22
+ const MATRIX_ANCHOR_LABELS = [
23
+ 'Strongly Disagree',
24
+ 'Disagree',
25
+ 'Neutral',
26
+ 'Agree',
27
+ 'Strongly Agree',
28
+ ];
29
+
30
+ const SCALE_COLUMNS_10 = Array.from({ length: 10 }, (_, i) => ({
31
+ id: `c${i}`,
32
+ label: String(i + 1),
33
+ }));
34
+
22
35
  const MATRIX_ROW_SINGLE = [{ id: 'r1', statementText: 'Statement Item 1' }];
23
36
 
24
37
  const MATRIX_ROWS_MULTI = [
@@ -209,8 +222,8 @@ export const FIXTURE_CSAT_EMOJI = base({
209
222
  displayStyle: 'emoji',
210
223
  gridLayout: 'standard',
211
224
  statementRows: MATRIX_ROW_SINGLE,
212
- scaleColumns: Array.from({ length: 10 }, (_, i) => ({ id: `c${i}`, label: String(i + 1) })),
213
- scaleAnchorLabels: ['Very unhappy', '', '', '', 'Very happy'],
225
+ scaleColumns: SCALE_COLUMNS_10,
226
+ scaleAnchorLabels: MATRIX_ANCHOR_LABELS,
214
227
  });
215
228
 
216
229
  export const FIXTURE_CSAT_STAR = base({
@@ -218,7 +231,8 @@ export const FIXTURE_CSAT_STAR = base({
218
231
  displayStyle: 'star',
219
232
  gridLayout: 'standard',
220
233
  statementRows: MATRIX_ROW_SINGLE,
221
- scaleColumns: Array.from({ length: 10 }, (_, i) => ({ id: `c${i}`, label: String(i + 1) })),
234
+ scaleColumns: SCALE_COLUMNS_10,
235
+ scaleAnchorLabels: MATRIX_ANCHOR_LABELS,
222
236
  });
223
237
 
224
238
  export const FIXTURE_CSAT_NUMBERED = base({
@@ -226,7 +240,8 @@ export const FIXTURE_CSAT_NUMBERED = base({
226
240
  displayStyle: 'numbered',
227
241
  gridLayout: 'standard',
228
242
  statementRows: MATRIX_ROWS_MULTI,
229
- scaleColumns: Array.from({ length: 10 }, (_, i) => ({ id: `c${i}`, label: String(i + 1) })),
243
+ scaleColumns: SCALE_COLUMNS_10,
244
+ scaleAnchorLabels: MATRIX_ANCHOR_LABELS,
230
245
  });
231
246
 
232
247
  export const FIXTURE_CSAT_GRAPHICS = base({
@@ -234,8 +249,8 @@ export const FIXTURE_CSAT_GRAPHICS = base({
234
249
  displayStyle: 'graphics',
235
250
  gridLayout: 'standard',
236
251
  statementRows: MATRIX_ROW_SINGLE,
237
- scaleColumns: Array.from({ length: 10 }, (_, i) => ({ id: `c${i}`, label: String(i + 1) })),
238
- scaleAnchorLabels: ['Label 1', 'Label 2'],
252
+ scaleColumns: SCALE_COLUMNS_10,
253
+ scaleAnchorLabels: MATRIX_ANCHOR_LABELS,
239
254
  });
240
255
 
241
256
  export const FIXTURE_CSAT_CAROUSEL = base({
@@ -265,7 +280,8 @@ export const FIXTURE_RATING_STAR = base({
265
280
  gridLayout: 'standard',
266
281
  showColumnHeaders: true,
267
282
  statementRows: MATRIX_ROWS_MULTI,
268
- scaleColumns: LIKERT_COLUMNS,
283
+ scaleColumns: SCALE_COLUMNS_10,
284
+ scaleAnchorLabels: MATRIX_ANCHOR_LABELS,
269
285
  });
270
286
 
271
287
  export const FIXTURE_RATING_NUMBERED = base({
@@ -273,7 +289,8 @@ export const FIXTURE_RATING_NUMBERED = base({
273
289
  displayStyle: 'numbered',
274
290
  gridLayout: 'standard',
275
291
  statementRows: MATRIX_ROWS_MULTI,
276
- scaleColumns: Array.from({ length: 10 }, (_, i) => ({ id: `c${i}`, label: String(i + 1) })),
292
+ scaleColumns: SCALE_COLUMNS_10,
293
+ scaleAnchorLabels: MATRIX_ANCHOR_LABELS,
277
294
  });
278
295
 
279
296
  export const FIXTURE_RATING_RADIO = base({
@@ -281,7 +298,8 @@ export const FIXTURE_RATING_RADIO = base({
281
298
  displayStyle: 'standard',
282
299
  gridLayout: 'standard',
283
300
  statementRows: MATRIX_ROW_SINGLE,
284
- scaleColumns: LIKERT_COLUMNS,
301
+ scaleColumns: SCALE_COLUMNS_10,
302
+ scaleAnchorLabels: MATRIX_ANCHOR_LABELS,
285
303
  });
286
304
 
287
305
  export const FIXTURE_RATING_EMOJI = base({
@@ -289,7 +307,8 @@ export const FIXTURE_RATING_EMOJI = base({
289
307
  displayStyle: 'emoji',
290
308
  gridLayout: 'standard',
291
309
  statementRows: MATRIX_ROW_SINGLE,
292
- scaleColumns: Array.from({ length: 10 }, (_, i) => ({ id: `c${i}`, label: String(i + 1) })),
310
+ scaleColumns: SCALE_COLUMNS_10,
311
+ scaleAnchorLabels: MATRIX_ANCHOR_LABELS,
293
312
  });
294
313
 
295
314
  export const FIXTURE_RATING_GRAPHICS = base({
@@ -297,8 +316,8 @@ export const FIXTURE_RATING_GRAPHICS = base({
297
316
  displayStyle: 'graphics',
298
317
  gridLayout: 'standard',
299
318
  statementRows: MATRIX_ROW_SINGLE,
300
- scaleColumns: Array.from({ length: 10 }, (_, i) => ({ id: `c${i}`, label: String(i + 1) })),
301
- scaleAnchorLabels: ['Label 1', 'Label 2', 'Label 3', 'Label 4', 'Label 5'],
319
+ scaleColumns: SCALE_COLUMNS_10,
320
+ scaleAnchorLabels: MATRIX_ANCHOR_LABELS,
302
321
  });
303
322
 
304
323
  export const FIXTURE_RATING_SLIDER = base({
@@ -287,18 +287,6 @@ body {
287
287
  border-style: solid;
288
288
  }
289
289
 
290
- html[data-cfm-show-company-name='0'] [data-cfm-company] {
291
- display: none !important;
292
- }
293
-
294
- html[data-cfm-show-question-numbers='0'] [data-cfm-question-number] {
295
- display: none !important;
296
- }
297
-
298
- html[data-cfm-show-required='0'] [data-cfm-required] {
299
- display: none !important;
300
- }
301
-
302
290
  .cfm-live-edit * {
303
291
  transition: none !important;
304
292
  }
@@ -1 +1 @@
1
- import{u as x,j as e}from"./index-Z7mePXvc.js";import{b as t}from"./vendor-BwkXDkd3.js";function p(d=150){const l=x(r=>r.config),[a,s]=t.useState(l);return t.useEffect(()=>{const r=window.setTimeout(()=>s(l),d);return()=>window.clearTimeout(r)},[l,d]),a}const h=t.memo(function(){const l=p(150),a=x(n=>n.logoPreviewDataUrl),{global:s}=l,{layout:r,colorScheme:o,buttons:c}=s,m=t.useMemo(()=>r.borderStyle==="sharp"?"rounded-none":r.borderStyle==="pill"?"rounded-[32px]":"rounded-2xl",[r.borderStyle]),i=t.useMemo(()=>r.fontStyle==="serif"?"Georgia, serif":r.fontStyle==="system"?"system-ui, sans-serif":"Inter, sans-serif",[r.fontStyle]),u=a??s.logo.url,f=t.useMemo(()=>({backgroundColor:o.background,color:o.text,borderColor:o.secondary,fontFamily:i}),[o,i]);return e.jsxs("div",{className:`overflow-hidden border shadow-md ${m}`,style:f,children:[r.showHeader&&e.jsxs("div",{className:"flex items-center gap-3 border-b px-5 py-4",style:{borderColor:o.secondary},children:[u&&e.jsx("img",{src:u,alt:"Logo",className:"max-h-6 w-auto object-contain",loading:"lazy"}),e.jsx("span",{className:"text-xs font-semibold tracking-wider",children:s.companyName})]}),e.jsxs("div",{className:"space-y-6 p-6",children:[r.showProgressBar&&e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex justify-between text-[10px] font-semibold text-slate-400",children:[e.jsx("span",{children:"Progress"}),e.jsx("span",{children:"35%"})]}),e.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-slate-100",children:e.jsx("div",{className:"h-full w-[35%] rounded-full",style:{backgroundColor:o.accent}})})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("h4",{className:"flex items-start gap-1.5 text-sm font-bold leading-snug",children:[r.showQuestionNumbers&&e.jsx("span",{className:"font-medium text-slate-400",children:"Q1."}),e.jsx("span",{children:s.surveyTitle}),r.showRequiredAsterisk&&e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsx("p",{className:"text-[11px] text-slate-400",children:"How would you rate your overall experience?"}),e.jsx("div",{className:"grid grid-cols-5 gap-2",children:[1,2,3,4,5].map(n=>e.jsx("div",{className:`flex h-9 items-center justify-center border text-xs font-semibold ${r.borderStyle==="pill"?"rounded-full":r.borderStyle==="sharp"?"rounded-none":"rounded-lg"}`,style:n===1?{backgroundColor:o.secondary,borderColor:o.primary,color:o.primary}:{backgroundColor:o.background,borderColor:o.secondary,color:o.text},children:n},n))})]})]}),e.jsxs("div",{className:"flex items-center justify-between border-t bg-slate-50/50 px-6 py-4",children:[r.showBackButton&&e.jsx("span",{className:`border px-3 py-1.5 text-[10px] font-semibold ${r.borderStyle==="pill"?"rounded-full":r.borderStyle==="sharp"?"rounded-none":"rounded-lg"}`,style:{borderColor:o.secondary,color:o.text},children:c.back}),e.jsx("div",{className:"flex-1"}),r.showNextButton&&e.jsx("span",{className:`px-4 py-1.5 text-[10px] font-bold ${r.borderStyle==="pill"?"rounded-full":r.borderStyle==="sharp"?"rounded-none":"rounded-lg"}`,style:{backgroundColor:o.primary,color:o.buttonText},children:c.next})]})]})});export{h as PreviewMock};
1
+ import{u as x,j as e}from"./index-hjm-fxWO.js";import{b as t}from"./vendor-BwkXDkd3.js";function p(d=150){const l=x(r=>r.config),[a,s]=t.useState(l);return t.useEffect(()=>{const r=window.setTimeout(()=>s(l),d);return()=>window.clearTimeout(r)},[l,d]),a}const h=t.memo(function(){const l=p(150),a=x(n=>n.logoPreviewDataUrl),{global:s}=l,{layout:r,colorScheme:o,buttons:c}=s,m=t.useMemo(()=>r.borderStyle==="sharp"?"rounded-none":r.borderStyle==="pill"?"rounded-[32px]":"rounded-2xl",[r.borderStyle]),i=t.useMemo(()=>r.fontStyle==="serif"?"Georgia, serif":r.fontStyle==="system"?"system-ui, sans-serif":"Inter, sans-serif",[r.fontStyle]),u=a??s.logo.url,f=t.useMemo(()=>({backgroundColor:o.background,color:o.text,borderColor:o.secondary,fontFamily:i}),[o,i]);return e.jsxs("div",{className:`overflow-hidden border shadow-md ${m}`,style:f,children:[r.showHeader&&e.jsxs("div",{className:"flex items-center gap-3 border-b px-5 py-4",style:{borderColor:o.secondary},children:[u&&e.jsx("img",{src:u,alt:"Logo",className:"max-h-6 w-auto object-contain",loading:"lazy"}),e.jsx("span",{className:"text-xs font-semibold tracking-wider",children:s.companyName})]}),e.jsxs("div",{className:"space-y-6 p-6",children:[r.showProgressBar&&e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex justify-between text-[10px] font-semibold text-slate-400",children:[e.jsx("span",{children:"Progress"}),e.jsx("span",{children:"35%"})]}),e.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-slate-100",children:e.jsx("div",{className:"h-full w-[35%] rounded-full",style:{backgroundColor:o.accent}})})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("h4",{className:"flex items-start gap-1.5 text-sm font-bold leading-snug",children:[r.showQuestionNumbers&&e.jsx("span",{className:"font-medium text-slate-400",children:"Q1."}),e.jsx("span",{children:s.surveyTitle}),r.showRequiredAsterisk&&e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsx("p",{className:"text-[11px] text-slate-400",children:"How would you rate your overall experience?"}),e.jsx("div",{className:"grid grid-cols-5 gap-2",children:[1,2,3,4,5].map(n=>e.jsx("div",{className:`flex h-9 items-center justify-center border text-xs font-semibold ${r.borderStyle==="pill"?"rounded-full":r.borderStyle==="sharp"?"rounded-none":"rounded-lg"}`,style:n===1?{backgroundColor:o.secondary,borderColor:o.primary,color:o.primary}:{backgroundColor:o.background,borderColor:o.secondary,color:o.text},children:n},n))})]})]}),e.jsxs("div",{className:"flex items-center justify-between border-t bg-slate-50/50 px-6 py-4",children:[r.showBackButton&&e.jsx("span",{className:`border px-3 py-1.5 text-[10px] font-semibold ${r.borderStyle==="pill"?"rounded-full":r.borderStyle==="sharp"?"rounded-none":"rounded-lg"}`,style:{borderColor:o.secondary,color:o.text},children:c.back}),e.jsx("div",{className:"flex-1"}),r.showNextButton&&e.jsx("span",{className:`px-4 py-1.5 text-[10px] font-bold ${r.borderStyle==="pill"?"rounded-full":r.borderStyle==="sharp"?"rounded-none":"rounded-lg"}`,style:{backgroundColor:o.primary,color:o.buttonText},children:c.next})]})]})});export{h as PreviewMock};
@@ -0,0 +1 @@
1
+ import{u as m,j as e,T as z,S as j,R as d,C as i,N as t,a as A,M as F}from"./index-hjm-fxWO.js";import"./vendor-BwkXDkd3.js";const N="Applies to the 5 anchor labels shared across all formats. First and last align with options 1 and 10; middle labels are spaced evenly. Numeric column headers (1–10) are plain text.";function b({values:o,onPatch:r}){return e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(i,{label:"Label text color",value:o.columnLabelColor,onChange:a=>r({columnLabelColor:a})}),e.jsx(i,{label:"Label background",value:o.columnLabelBgColor,onChange:a=>r({columnLabelBgColor:a})})]})}function T({values:o,onPatch:r}){return e.jsxs("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[e.jsxs("label",{className:"space-y-1 sm:col-span-2",children:[e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-wider text-slate-500",children:"Min hint label"}),e.jsx("input",{className:"w-full rounded-lg border border-white/10 bg-slate-950/50 px-3 py-2 text-sm text-white",value:o.hintMinText,onChange:a=>r({hintMinText:a.target.value})})]}),e.jsxs("label",{className:"space-y-1 sm:col-span-2",children:[e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-wider text-slate-500",children:"Max hint label"}),e.jsx("input",{className:"w-full rounded-lg border border-white/10 bg-slate-950/50 px-3 py-2 text-sm text-white",value:o.hintMaxText,onChange:a=>r({hintMaxText:a.target.value})})]}),e.jsx(i,{label:"Hint text color",value:o.hintLabelColor,onChange:a=>r({hintLabelColor:a})}),e.jsx(i,{label:"Hint label background",value:o.hintLabelBgColor,onChange:a=>r({hintLabelBgColor:a})})]})}function k({values:o,onPatch:r,count:a=11}){return e.jsxs("div",{className:"space-y-3",children:[e.jsx(j,{label:"Number label style",value:o.numberLabelMode,onChange:c=>r({numberLabelMode:c}),options:[{value:"traffic",label:"Traffic light (default)"},{value:"monochrome",label:"Monochrome (one color)"},{value:"individual",label:"Individual per number"}]}),o.numberLabelMode==="monochrome"&&e.jsx(i,{label:"Monochrome color",value:o.monochromeNumberColor,onChange:c=>r({monochromeNumberColor:c})}),o.numberLabelMode==="individual"&&e.jsx("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-3",children:Array.from({length:a},(c,x)=>e.jsx(i,{label:`#${x}`,value:o.individualNumberColors[x]??"#9CA3AF",onChange:C=>{const h=[...o.individualNumberColors];h[x]=C,r({individualNumberColors:h})}},x))})]})}function s({title:o,children:r}){return e.jsxs("div",{className:"space-y-3 rounded-xl border border-white/5 bg-slate-950/20 p-4",children:[e.jsx("h4",{className:"text-xs font-semibold uppercase tracking-wider text-slate-400",children:o}),r]})}function O({type:o,activeFormat:r}){const a=m(l=>l.config.questionTypes[o]),c=m(l=>l.updateQuestionType),x=m(l=>l.previewMultiStatementByType),C=m(l=>l.setPreviewMultiStatementForType),h=m(l=>l.heatmapPreviewPin);if(!a)return e.jsx("p",{className:"text-sm text-slate-500",children:"No configuration available for this type."});const n=l=>c(o,l),M=F.includes(o),y=!!x[o],u=r.includes("star"),g=r.includes("emoji"),f=r.includes("numbered"),v=r.includes("drag"),S=r.includes("dropdown"),B=r.includes("radio"),L=r==="CFM_bipolar",w=r.includes("graphics"),p=g||u||f||B,P=a.optionStyle??a.cardStyle??"outlined",R=a.buttonStyle??"numbered";return e.jsxs("div",{className:"space-y-4",children:[M&&e.jsx(z,{label:"Preview multiple statements",checked:y,onChange:l=>C(o,l)}),o==="MCQ"&&"optionGap"in a&&e.jsx(s,{title:"Option style",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(j,{label:"Option style",value:a.optionStyle??a.cardStyle??"outlined",onChange:l=>n({optionStyle:l}),options:[{value:"outlined",label:"Outlined"},{value:"filled",label:"Filled"},{value:"minimal",label:"Minimal"}]}),e.jsx(d,{label:"Option gap",value:a.optionGap,onChange:l=>n({optionGap:l}),min:0,max:32}),e.jsx(d,{label:"Border radius",value:a.borderRadius,onChange:l=>n({borderRadius:l}),min:0,max:24}),e.jsx(d,{label:"Option padding",value:a.optionPadding??12,onChange:l=>n({optionPadding:l}),min:4,max:24}),e.jsx(i,{label:"Hover border",value:a.hoverBorderColor,onChange:l=>n({hoverBorderColor:l})}),P==="filled"&&e.jsx(i,{label:"Unselected fill color",value:a.filledOptionBg??"#F9FAFB",onChange:l=>n({filledOptionBg:l})})]})}),o==="TEXTFIELD"&&"defaultPlaceholder"in a&&e.jsx(s,{title:"Text input",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("label",{className:"space-y-1 sm:col-span-2",children:[e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-wider text-slate-500",children:"Default placeholder"}),e.jsx("input",{className:"w-full rounded-lg border border-white/10 bg-slate-950/50 px-3 py-2 text-sm text-white",value:a.defaultPlaceholder,onChange:l=>n({defaultPlaceholder:l.target.value})})]}),e.jsx(t,{label:"Input radius (px)",value:a.inputRadius,onChange:l=>n({inputRadius:l}),min:0,max:24}),e.jsx(i,{label:"Border color",value:a.borderColor,onChange:l=>n({borderColor:l})}),e.jsx(i,{label:"Placeholder color",value:a.placeholderColor,onChange:l=>n({placeholderColor:l})}),e.jsx(t,{label:"Input height (px)",value:a.inputHeight,onChange:l=>n({inputHeight:l}),min:32,max:64}),e.jsx(t,{label:"Input padding (px)",value:a.inputPadding,onChange:l=>n({inputPadding:l}),min:8,max:24})]})}),o==="NPS_SCALE"&&"buttonStyle"in a&&e.jsxs(e.Fragment,{children:[e.jsxs(s,{title:"NPS buttons",children:[e.jsx(j,{label:"Button style",value:a.buttonStyle,onChange:l=>n({buttonStyle:l}),options:[{value:"standard",label:"Radio"},{value:"numbered",label:"Numbered badges"}]}),e.jsx("p",{className:"text-xs text-slate-500",children:"Selected cell and focus ring come from Theme → Question card."})]}),e.jsx(s,{title:"Hint labels",children:e.jsx(T,{values:a,onPatch:n})}),R==="numbered"&&e.jsx(s,{title:"Number labels",children:e.jsx(k,{values:a,onPatch:n})}),e.jsx(s,{title:"Track & cells",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(t,{label:"Cell size (px)",value:a.cellSize,onChange:l=>n({cellSize:l}),min:24,max:56}),e.jsx(t,{label:"Cell gap (px)",value:a.cellGap,onChange:l=>n({cellGap:l}),min:0,max:16}),e.jsx(i,{label:"Track bar",value:a.trackBarColor,onChange:l=>n({trackBarColor:l})}),e.jsx(i,{label:"Track highlight",value:a.trackHighlightColor,onChange:l=>n({trackHighlightColor:l})})]})})]}),o==="CFM_MATRIX"&&"rowLabelWidth"in a&&e.jsxs(e.Fragment,{children:[e.jsx(s,{title:"Matrix layout",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(t,{label:"Row label width (px)",value:a.rowLabelWidth,onChange:l=>n({rowLabelWidth:l}),min:120,max:280}),L&&e.jsx(t,{label:"Bipolar column width (%)",value:a.bipolarColumnWidthPercent,onChange:l=>n({bipolarColumnWidthPercent:l}),min:15,max:40}),e.jsx(t,{label:"Cell padding (px)",value:a.cellPadding,onChange:l=>n({cellPadding:l}),min:4,max:24})]})}),e.jsx(s,{title:"Label items",children:e.jsx(b,{values:a,onPatch:n})})]}),o==="CSAT_MATRIX"&&"emojiSize"in a&&e.jsxs(e.Fragment,{children:[(g||p||u)&&e.jsxs(s,{title:`${A.CSAT_MATRIX} — ${r.replace("CSAT_","")}`,children:[e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[g&&e.jsx(t,{label:"Emoji size (px)",value:a.emojiSize,onChange:l=>n({emojiSize:l}),min:16,max:40}),u&&e.jsx(i,{label:"Star color",value:a.accentColor,onChange:l=>n({accentColor:l})}),p&&e.jsx(d,{label:"Unselected opacity",value:Math.round(a.unselectedOpacity*100),onChange:l=>n({unselectedOpacity:l/100}),min:10,max:100})]}),e.jsx("p",{className:"text-xs text-slate-500",children:"Selected cell color and focus ring come from Theme → Question card."})]}),e.jsxs(s,{title:"Label items",children:[e.jsx("p",{className:"text-xs text-slate-500",children:N}),e.jsx(b,{values:a,onPatch:n})]}),w&&e.jsx(s,{title:"Graphics track",children:e.jsx(i,{label:"Track color",value:a.graphicsTrackColor,onChange:l=>n({graphicsTrackColor:l})})})]}),o==="RATING_MATRIX"&&"unselectedStarOpacity"in a&&e.jsxs(e.Fragment,{children:[(g||p||u)&&e.jsxs(s,{title:`Rating — ${r.replace("RATING_","")}`,children:[e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[g&&e.jsx(t,{label:"Emoji size (px)",value:a.emojiSize,onChange:l=>n({emojiSize:l}),min:16,max:40}),u&&e.jsx(i,{label:"Star color",value:a.starColor,onChange:l=>n({starColor:l})}),p&&e.jsx(d,{label:"Unselected opacity",value:Math.round(a.unselectedStarOpacity*100),onChange:l=>n({unselectedStarOpacity:l/100}),min:10,max:100})]}),e.jsx("p",{className:"text-xs text-slate-500",children:"Selected cell color and focus ring come from Theme → Question card."})]}),e.jsxs(s,{title:"Label items",children:[e.jsx("p",{className:"text-xs text-slate-500",children:N}),e.jsx(b,{values:a,onPatch:n})]}),w&&e.jsx(s,{title:"Graphics track",children:e.jsx(i,{label:"Track color",value:a.graphicsTrackColor,onChange:l=>n({graphicsTrackColor:l})})})]}),o==="SLIDER_MATRIX"&&"trackColor"in a&&e.jsxs(e.Fragment,{children:[e.jsx(s,{title:"Slider track",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(i,{label:"Track",value:a.trackColor,onChange:l=>n({trackColor:l})}),e.jsx(i,{label:"Thumb",value:a.thumbColor,onChange:l=>n({thumbColor:l})}),e.jsx(t,{label:"Row label width (px)",value:a.rowLabelWidth,onChange:l=>n({rowLabelWidth:l}),min:120,max:280}),e.jsx(i,{label:"Row band",value:a.rowBandColor,onChange:l=>n({rowBandColor:l})}),e.jsx(t,{label:"Tick badge size (px)",value:a.tickBadgeSize,onChange:l=>n({tickBadgeSize:l}),min:20,max:40})]})}),e.jsx(s,{title:"Anchor hint labels",children:e.jsx(T,{values:a,onPatch:n})}),e.jsx(s,{title:"Tick label items",children:e.jsx(b,{values:a,onPatch:n})}),e.jsx(s,{title:"Tick number labels",children:e.jsx(k,{values:a,onPatch:n,count:11})})]}),o==="FILE_UPLOAD"&&"dropzoneStyle"in a&&e.jsx(s,{title:"Dropzone",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(j,{label:"Dropzone border",value:a.dropzoneStyle,onChange:l=>n({dropzoneStyle:l}),options:[{value:"dashed",label:"Dashed"},{value:"solid",label:"Solid"}]}),e.jsx(i,{label:"Border color",value:a.borderColor??a.accentColor,onChange:l=>n({borderColor:l})}),e.jsx(i,{label:"Fill color",value:a.dropzoneFillColor,onChange:l=>n({dropzoneFillColor:l})}),e.jsx(t,{label:"Padding (px)",value:a.dropzonePadding,onChange:l=>n({dropzonePadding:l}),min:12,max:48})]})}),o==="TEXT_AND_MEDIA"&&"mediaMaxWidth"in a&&e.jsx(s,{title:"Text & media",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(d,{label:"Media max width (%)",value:a.mediaMaxWidth,onChange:l=>n({mediaMaxWidth:l}),min:50,max:100}),e.jsx(d,{label:"Media corner radius",value:a.mediaRadius,onChange:l=>n({mediaRadius:l}),min:0,max:24}),e.jsx(i,{label:"Caption color",value:a.captionColor,onChange:l=>n({captionColor:l})}),e.jsx(t,{label:"Caption size (px)",value:a.captionSize,onChange:l=>n({captionSize:l}),min:10,max:24})]})}),o==="HEATMAP"&&"pinColor"in a&&e.jsx(s,{title:"Heatmap pin",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(i,{label:"Pin color",value:a.pinColor,onChange:l=>n({pinColor:l})}),e.jsx(i,{label:"Pin border",value:a.pinBorderColor,onChange:l=>n({pinBorderColor:l})}),e.jsx(d,{label:"Pin size",value:a.pinSize,onChange:l=>n({pinSize:l}),min:8,max:32}),e.jsx(d,{label:"Overlay opacity",value:Math.round(a.overlayOpacity*100),onChange:l=>n({overlayOpacity:l/100}),min:0,max:80}),e.jsxs("p",{className:"text-xs text-slate-500 sm:col-span-2",children:["Click the heatmap image in the preview to place a pin and see styling update live. Pin preview position: ",Math.round(h.x*100),"%, ",Math.round(h.y*100),"%"]})]})}),o==="RANK_ORDER"&&"drag"in a&&e.jsx(s,{title:v?"Drag & drop":S?"Dropdown rank":"Rank order",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[v&&e.jsxs(e.Fragment,{children:[e.jsx(i,{label:"Item background",value:a.drag.itemBg,onChange:l=>n({drag:{...a.drag,itemBg:l}})}),e.jsx(i,{label:"Drag handle",value:a.drag.dragHandleColor,onChange:l=>n({drag:{...a.drag,dragHandleColor:l}})}),e.jsx(i,{label:"Rank badge",value:a.drag.rankBadgeColor,onChange:l=>n({drag:{...a.drag,rankBadgeColor:l}})})]}),S&&e.jsxs(e.Fragment,{children:[e.jsx(i,{label:"Item background",value:a.dropdown.itemBg,onChange:l=>n({dropdown:{...a.dropdown,itemBg:l}})}),e.jsx(i,{label:"List hover background",value:a.dropdown.itemHoverBg??"#F3F4F6",onChange:l=>n({dropdown:{...a.dropdown,itemHoverBg:l}})}),e.jsx(i,{label:"Select border",value:a.dropdown.selectBorderColor,onChange:l=>n({dropdown:{...a.dropdown,selectBorderColor:l}})}),e.jsx(i,{label:"Rank badge",value:a.dropdown.rankBadgeColor,onChange:l=>n({dropdown:{...a.dropdown,rankBadgeColor:l}})})]})]})})]})}export{O as TypePanel};