@explorer02/cfm-survey-sdk 0.3.5 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@explorer02/cfm-survey-sdk",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -26,11 +26,25 @@ function anchorLabelStyle(question: CsatMatrixQuestion) {
26
26
  return question.type === 'RATING_MATRIX' ? ratingColumnLabelStyle() : csatColumnLabelStyle();
27
27
  }
28
28
 
29
- function columnHeaderLabelStyle(question: CsatMatrixQuestion) {
29
+ function columnHeaderLabelStyle(_question: CsatMatrixQuestion) {
30
+ return { fontSize: '13px', fontWeight: 500, textAlign: 'center' as const, lineHeight: 1.2, color: '#4b5563' };
31
+ }
32
+
33
+ function anchorLabelPercent(
34
+ question: CsatMatrixQuestion,
35
+ i: number,
36
+ n: number,
37
+ m: number,
38
+ isGraphics: boolean,
39
+ ): number {
30
40
  if (question.type === 'RATING_MATRIX') {
31
- return { fontSize: '13px', fontWeight: 500, textAlign: 'center' as const, lineHeight: 1.2, color: '#4b5563' };
41
+ const firstCenter = (0.5 / m) * 100;
42
+ const lastCenter = ((m - 0.5) / m) * 100;
43
+ return n === 1 ? 50 : firstCenter + (i / (n - 1)) * (lastCenter - firstCenter);
32
44
  }
33
- return { fontSize: '13px', fontWeight: 500, textAlign: 'center' as const, lineHeight: 1.2, ...csatColumnLabelStyle() };
45
+ const startPercent = isGraphics ? 0 : 0.5 / m;
46
+ const rangePercent = isGraphics ? 1 : (m - 1) / m;
47
+ return n === 1 ? 50 : (startPercent + (i / (n - 1)) * rangePercent) * 100;
34
48
  }
35
49
 
36
50
  function GraphicsColumnLabelsRow({
@@ -219,9 +233,7 @@ function CsatMatrixGrid({
219
233
  <div style={{ flex: 1, display: 'flex' }}>
220
234
  <div style={{ flex: 1, position: 'relative', height: '24px', ...(isGraphics ? { margin: '0 40px' } : {}) }}>
221
235
  {labels!.map((label, i) => {
222
- const startPercent = isGraphics ? 0 : 0.5 / m;
223
- const rangePercent = isGraphics ? 1 : (m - 1) / m;
224
- const percent = n === 1 ? 50 : (startPercent + (i / (n - 1)) * rangePercent) * 100;
236
+ const percent = anchorLabelPercent(question, i, n, m, isGraphics);
225
237
 
226
238
  return (
227
239
  <div key={i} style={{
@@ -362,9 +374,9 @@ function CsatMatrixGrid({
362
374
  fontSize: '14px', fontWeight: 500,
363
375
  ...(isSelected
364
376
  ? scaleCellSelectedStyle(true)
365
- : { border: '1px solid #d1d5db', backgroundColor: '#fff', color: '#111827' }),
377
+ : { border: '1px solid #d1d5db', backgroundColor: '#fff', color: '#111827', ...unselectedOpacityStyle() }),
366
378
  transition: 'all 0.15s',
367
- } : { padding: '8px' }),
379
+ } : { padding: '8px', ...(!isSelected ? unselectedOpacityStyle() : {}) }),
368
380
  }}
369
381
  >
370
382
  {(EmojiNode ?? StarNode ?? (isNumbered ? (displayIdx + 1) : RadioNode)) as React.ReactNode}
@@ -452,9 +464,7 @@ function CsatMatrixCarousel({
452
464
  {labels!.map((label, i) => {
453
465
  const m = scaleColumns.length;
454
466
  const n = labels!.length;
455
- const startPercent = isGraphics ? 0 : 0.5 / m;
456
- const rangePercent = isGraphics ? 1 : (m - 1) / m;
457
- const percent = n === 1 ? 50 : (startPercent + (i / (n - 1)) * rangePercent) * 100;
467
+ const percent = anchorLabelPercent(question, i, n, m, isGraphics);
458
468
 
459
469
  return (
460
470
  <div key={i} style={{
@@ -523,15 +533,17 @@ function CsatMatrixCarousel({
523
533
  cursor: 'pointer', borderRadius: '6px', pointerEvents: 'none',
524
534
  ...(isEmoji ? {
525
535
  padding: '6px', transform: isSelected ? 'scale(1.1)' : isHovered ? 'scale(1.25)' : 'scale(1)',
526
- ...(isSelected ? { backgroundColor: 'rgba(252, 231, 243, 0.6)', boxShadow: '0 0 0 2px rgba(226, 0, 116, 0.3)', borderRadius: '50%' } : {}),
536
+ ...(isSelected ? { backgroundColor: 'rgba(252, 231, 243, 0.6)', boxShadow: '0 0 0 2px rgba(226, 0, 116, 0.3)', borderRadius: '50%' } : unselectedOpacityStyle()),
527
537
  } : isStar ? {
528
- padding: '4px', transform: isHovered ? 'scale(1.1)' : 'scale(1)', opacity: isSelected ? 1 : isHovered ? 1 : 0.5,
538
+ padding: '4px', transform: isHovered ? 'scale(1.1)' : 'scale(1)',
539
+ color: isSelected ? cellSelectedVar : focusRingVar,
540
+ ...(isSelected ? {} : unselectedOpacityStyle()),
529
541
  } : isNumbered ? {
530
542
  width: '40px', height: '40px', borderRadius: '8px', fontSize: '14px', fontWeight: 500,
531
543
  ...(isSelected
532
544
  ? scaleCellSelectedStyle(true)
533
- : { border: '1px solid #d1d5db', backgroundColor: '#fff', color: '#111827' }),
534
- } : { padding: '8px' }),
545
+ : { border: '1px solid #d1d5db', backgroundColor: '#fff', color: '#111827', ...unselectedOpacityStyle() }),
546
+ } : { padding: '8px', ...(!isSelected ? unselectedOpacityStyle() : {}) }),
535
547
  }}
536
548
  >
537
549
  {(EmojiNode ?? StarNode ?? (isNumbered ? (displayIdx + 1) : RadioNode)) as React.ReactNode}
@@ -76,19 +76,18 @@ export default function Header({ embedded = false }: HeaderProps) {
76
76
  {seedCompany}
77
77
  </span>
78
78
 
79
- {seedShowCompany && hasLogoFile && seedCompany ? (
80
- <span
81
- data-cfm-company
82
- className="font-semibold"
83
- style={{
84
- color: 'var(--cfm-header-company-color, var(--cfm-text))',
85
- fontSize: 'var(--cfm-header-company-size, 18px)',
86
- fontWeight: 'var(--cfm-header-company-weight, 600)',
87
- }}
88
- >
89
- {seedCompany}
90
- </span>
91
- ) : null}
79
+ <span
80
+ data-cfm-company
81
+ className="font-semibold"
82
+ style={{
83
+ display: seedShowCompany && seedCompany ? '' : 'none',
84
+ color: 'var(--cfm-header-company-color, var(--cfm-text))',
85
+ fontSize: 'var(--cfm-header-company-size, 18px)',
86
+ fontWeight: 'var(--cfm-header-company-weight, 600)',
87
+ }}
88
+ >
89
+ {seedCompany}
90
+ </span>
92
91
  </div>
93
92
  </div>
94
93
  </header>
@@ -81,7 +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: '16px',
84
+ marginBottom: labels && labels.length > 0 ? '24px' : '16px',
85
85
  fontSize: '14px',
86
86
  fontWeight: 500,
87
87
  }}
@@ -100,6 +100,7 @@ export function SliderMatrixScale({ question, selectedValue = {}, onSelect }: Sl
100
100
  style={{
101
101
  position: 'relative',
102
102
  margin: '0 16px',
103
+ marginTop: labels && labels.length > 0 ? '4px' : 0,
103
104
  marginBottom: '8px',
104
105
  fontSize: '14px',
105
106
  fontWeight: 400,
@@ -81,6 +81,31 @@
81
81
  applyDropzoneStyle();
82
82
  }
83
83
 
84
+ function ensureCompanySpan() {
85
+ if (document.querySelector('[data-cfm-company]')) return;
86
+ var brand = document.querySelector('.cfm-header-brand');
87
+ if (!brand) return;
88
+ var span = document.createElement('span');
89
+ span.setAttribute('data-cfm-company', '');
90
+ span.className = 'font-semibold';
91
+ brand.appendChild(span);
92
+ }
93
+
94
+ function showCompanyNameAllowed() {
95
+ var attr = document.documentElement.getAttribute('data-cfm-show-company-name');
96
+ if (attr === '0') return false;
97
+ return true;
98
+ }
99
+
100
+ function updateCompanyVisibility(name) {
101
+ ensureCompanySpan();
102
+ var visible = showCompanyNameAllowed() && Boolean(name);
103
+ document.querySelectorAll('[data-cfm-company]').forEach(function (el) {
104
+ if (name) el.textContent = name;
105
+ el.style.display = visible ? '' : 'none';
106
+ });
107
+ }
108
+
84
109
  function applyContent(patch) {
85
110
  if (!patch) return;
86
111
  if (patch.logoUrl !== undefined) {
@@ -105,16 +130,14 @@
105
130
  });
106
131
  document.querySelectorAll('[data-cfm-company]').forEach(function (el) {
107
132
  if (patch.logoUrl) {
108
- el.style.display = el.textContent ? '' : 'none';
133
+ ensureCompanySpan();
134
+ updateCompanyVisibility(el.textContent || '');
109
135
  }
110
136
  });
111
137
  }
112
138
  if (patch.companyName !== undefined) {
113
139
  var name = patch.companyName || '';
114
- document.querySelectorAll('[data-cfm-company]').forEach(function (el) {
115
- el.textContent = name;
116
- el.style.display = name ? '' : 'none';
117
- });
140
+ updateCompanyVisibility(name);
118
141
  document.querySelectorAll('[data-cfm-logo-text]').forEach(function (el) {
119
142
  var logoImg = document.querySelector('[data-cfm-logo]');
120
143
  var logoVisible =
@@ -174,7 +197,12 @@
174
197
  if (patch.layoutFlags) {
175
198
  var flags = patch.layoutFlags;
176
199
  if (flags.showCompanyName !== undefined) {
177
- setDisplay('[data-cfm-company]', flags.showCompanyName);
200
+ document.documentElement.setAttribute(
201
+ 'data-cfm-show-company-name',
202
+ flags.showCompanyName ? '1' : '0',
203
+ );
204
+ var companyEl = document.querySelector('[data-cfm-company]');
205
+ updateCompanyVisibility(companyEl ? companyEl.textContent : patch.companyName || '');
178
206
  }
179
207
  if (flags.showHeader !== undefined) {
180
208
  setDisplay('.cfm-header, header.cfm-header', flags.showHeader);
@@ -72,6 +72,7 @@ export function PreviewConfigProvider({ children }: { children: ReactNode }) {
72
72
  if (data.type !== PREVIEW_BRIDGE_SNAPSHOT && data.type !== PREVIEW_BRIDGE_DELTA) return;
73
73
  if (data.contentPatch?.previewState) {
74
74
  setPreviewState((prev) => ({ ...prev, ...data.contentPatch.previewState }));
75
+ setConfigRevision((r) => r + 1);
75
76
  }
76
77
  if (data.contentPatch?.domAttributes) {
77
78
  const root = document.documentElement;
@@ -85,7 +86,6 @@ export function PreviewConfigProvider({ children }: { children: ReactNode }) {
85
86
  root.style.setProperty(key, value as string);
86
87
  }
87
88
  }
88
- setConfigRevision((r) => r + 1);
89
89
  applyThemeSideEffects();
90
90
  };
91
91
 
@@ -19,6 +19,8 @@ const LIKERT_COLUMNS = [
19
19
  { id: 'c5', label: 'Strongly Agree' },
20
20
  ];
21
21
 
22
+ const MATRIX_ANCHOR_LABELS = LIKERT_COLUMNS.map((c) => c.label);
23
+
22
24
  const MATRIX_ROW_SINGLE = [{ id: 'r1', statementText: 'Statement Item 1' }];
23
25
 
24
26
  const MATRIX_ROWS_MULTI = [
@@ -210,7 +212,7 @@ export const FIXTURE_CSAT_EMOJI = base({
210
212
  gridLayout: 'standard',
211
213
  statementRows: MATRIX_ROW_SINGLE,
212
214
  scaleColumns: Array.from({ length: 10 }, (_, i) => ({ id: `c${i}`, label: String(i + 1) })),
213
- scaleAnchorLabels: ['Very unhappy', '', '', '', 'Very happy'],
215
+ scaleAnchorLabels: [...MATRIX_ANCHOR_LABELS],
214
216
  });
215
217
 
216
218
  export const FIXTURE_CSAT_STAR = base({
@@ -235,7 +237,7 @@ export const FIXTURE_CSAT_GRAPHICS = base({
235
237
  gridLayout: 'standard',
236
238
  statementRows: MATRIX_ROW_SINGLE,
237
239
  scaleColumns: Array.from({ length: 10 }, (_, i) => ({ id: `c${i}`, label: String(i + 1) })),
238
- scaleAnchorLabels: ['Label 1', 'Label 2'],
240
+ scaleAnchorLabels: [MATRIX_ANCHOR_LABELS[0], MATRIX_ANCHOR_LABELS[4]],
239
241
  });
240
242
 
241
243
  export const FIXTURE_CSAT_CAROUSEL = base({
@@ -298,7 +300,7 @@ export const FIXTURE_RATING_GRAPHICS = base({
298
300
  gridLayout: 'standard',
299
301
  statementRows: MATRIX_ROW_SINGLE,
300
302
  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'],
303
+ scaleAnchorLabels: [...MATRIX_ANCHOR_LABELS],
302
304
  });
303
305
 
304
306
  export const FIXTURE_RATING_SLIDER = base({
@@ -290,3 +290,15 @@ body {
290
290
  .cfm-live-edit * {
291
291
  transition: none !important;
292
292
  }
293
+
294
+ html[data-cfm-show-company-name='0'] [data-cfm-company] {
295
+ display: none !important;
296
+ }
297
+
298
+ html[data-cfm-show-question-numbers='0'] [data-cfm-question-number] {
299
+ display: none !important;
300
+ }
301
+
302
+ html[data-cfm-show-required='0'] [data-cfm-required] {
303
+ display: none !important;
304
+ }
@@ -1 +1 @@
1
- import{u as x,j as e}from"./index-DWWkuRUU.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-BDaoM71z.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 p,j as e,T as R,S as b,R as d,C as i,N as t,a as z,M as A}from"./index-BDaoM71z.js";import"./vendor-BwkXDkd3.js";function j({values:n,onPatch:r}){return e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(i,{label:"Label text color",value:n.columnLabelColor,onChange:a=>r({columnLabelColor:a})}),e.jsx(i,{label:"Label background",value:n.columnLabelBgColor,onChange:a=>r({columnLabelBgColor:a})})]})}function N({values:n,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:n.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:n.hintMaxText,onChange:a=>r({hintMaxText:a.target.value})})]}),e.jsx(i,{label:"Hint text color",value:n.hintLabelColor,onChange:a=>r({hintLabelColor:a})}),e.jsx(i,{label:"Hint label background",value:n.hintLabelBgColor,onChange:a=>r({hintLabelBgColor:a})})]})}function T({values:n,onPatch:r,count:a=11}){return e.jsxs("div",{className:"space-y-3",children:[e.jsx(b,{label:"Number label style",value:n.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"}]}),n.numberLabelMode==="monochrome"&&e.jsx(i,{label:"Monochrome color",value:n.monochromeNumberColor,onChange:c=>r({monochromeNumberColor:c})}),n.numberLabelMode==="individual"&&e.jsx("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-3",children:Array.from({length:a},(c,h)=>e.jsx(i,{label:`#${h}`,value:n.individualNumberColors[h]??"#9CA3AF",onChange:C=>{const x=[...n.individualNumberColors];x[h]=C,r({individualNumberColors:x})}},h))})]})}function s({title:n,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:n}),r]})}function O({type:n,activeFormat:r}){const a=p(l=>l.config.questionTypes[n]),c=p(l=>l.updateQuestionType),h=p(l=>l.previewMultiStatementByType),C=p(l=>l.setPreviewMultiStatementForType),x=p(l=>l.heatmapPreviewPin);if(!a)return e.jsx("p",{className:"text-sm text-slate-500",children:"No configuration available for this type."});const o=l=>c(n,l),k=A.includes(n),y=!!h[n],u=r.includes("star"),g=r.includes("emoji"),M=r.includes("numbered"),v=r.includes("drag"),w=r.includes("dropdown"),f=r.includes("radio"),B=r==="CFM_bipolar",S=r.includes("graphics"),m=g||u||M||f,L=a.optionStyle??a.cardStyle??"outlined",P=a.buttonStyle??"numbered";return e.jsxs("div",{className:"space-y-4",children:[k&&e.jsx(R,{label:"Preview multiple statements",checked:y,onChange:l=>C(n,l)}),n==="MCQ"&&"optionGap"in a&&e.jsx(s,{title:"Option style",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(b,{label:"Option style",value:a.optionStyle??a.cardStyle??"outlined",onChange:l=>o({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=>o({optionGap:l}),min:0,max:32}),e.jsx(d,{label:"Border radius",value:a.borderRadius,onChange:l=>o({borderRadius:l}),min:0,max:24}),e.jsx(d,{label:"Option padding",value:a.optionPadding??12,onChange:l=>o({optionPadding:l}),min:4,max:24}),e.jsx(i,{label:"Hover border",value:a.hoverBorderColor,onChange:l=>o({hoverBorderColor:l})}),L==="filled"&&e.jsx(i,{label:"Unselected fill color",value:a.filledOptionBg??"#F9FAFB",onChange:l=>o({filledOptionBg:l})})]})}),n==="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=>o({defaultPlaceholder:l.target.value})})]}),e.jsx(t,{label:"Input radius (px)",value:a.inputRadius,onChange:l=>o({inputRadius:l}),min:0,max:24}),e.jsx(i,{label:"Border color",value:a.borderColor,onChange:l=>o({borderColor:l})}),e.jsx(i,{label:"Placeholder color",value:a.placeholderColor,onChange:l=>o({placeholderColor:l})}),e.jsx(t,{label:"Input height (px)",value:a.inputHeight,onChange:l=>o({inputHeight:l}),min:32,max:64}),e.jsx(t,{label:"Input padding (px)",value:a.inputPadding,onChange:l=>o({inputPadding:l}),min:8,max:24})]})}),n==="NPS_SCALE"&&"buttonStyle"in a&&e.jsxs(e.Fragment,{children:[e.jsxs(s,{title:"NPS buttons",children:[e.jsx(b,{label:"Button style",value:a.buttonStyle,onChange:l=>o({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(N,{values:a,onPatch:o})}),P==="numbered"&&e.jsx(s,{title:"Number labels",children:e.jsx(T,{values:a,onPatch:o})}),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=>o({cellSize:l}),min:24,max:56}),e.jsx(t,{label:"Cell gap (px)",value:a.cellGap,onChange:l=>o({cellGap:l}),min:0,max:16}),e.jsx(i,{label:"Track bar",value:a.trackBarColor,onChange:l=>o({trackBarColor:l})}),e.jsx(i,{label:"Track highlight",value:a.trackHighlightColor,onChange:l=>o({trackHighlightColor:l})})]})})]}),n==="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=>o({rowLabelWidth:l}),min:120,max:280}),B&&e.jsx(t,{label:"Bipolar column width (%)",value:a.bipolarColumnWidthPercent,onChange:l=>o({bipolarColumnWidthPercent:l}),min:15,max:40}),e.jsx(t,{label:"Cell padding (px)",value:a.cellPadding,onChange:l=>o({cellPadding:l}),min:4,max:24})]})}),e.jsx(s,{title:"Label items",children:e.jsx(j,{values:a,onPatch:o})})]}),n==="CSAT_MATRIX"&&"emojiSize"in a&&e.jsxs(e.Fragment,{children:[(g||m||u)&&e.jsxs(s,{title:`${z.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=>o({emojiSize:l}),min:16,max:40}),u&&e.jsx(i,{label:"Star color",value:a.accentColor,onChange:l=>o({accentColor:l})}),m&&e.jsx(d,{label:"Unselected opacity",value:Math.round(a.unselectedOpacity*100),onChange:l=>o({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. Column labels appear above stars in the star format preview."})]}),e.jsxs(s,{title:"Label items",children:[e.jsx("p",{className:"text-xs text-slate-500",children:"Applies to anchor label pills where the preview already shows them — not numeric column headers."}),e.jsx(j,{values:a,onPatch:o})]}),S&&e.jsx(s,{title:"Graphics track",children:e.jsx(i,{label:"Track color",value:a.graphicsTrackColor,onChange:l=>o({graphicsTrackColor:l})})})]}),n==="RATING_MATRIX"&&"unselectedStarOpacity"in a&&e.jsxs(e.Fragment,{children:[(g||m||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=>o({emojiSize:l}),min:16,max:40}),u&&e.jsx(i,{label:"Star color",value:a.starColor,onChange:l=>o({starColor:l})}),m&&e.jsx(d,{label:"Unselected opacity",value:Math.round(a.unselectedStarOpacity*100),onChange:l=>o({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:"Applies to anchor label pills where the preview already shows them — not numeric column headers."}),e.jsx(j,{values:a,onPatch:o})]}),S&&e.jsx(s,{title:"Graphics track",children:e.jsx(i,{label:"Track color",value:a.graphicsTrackColor,onChange:l=>o({graphicsTrackColor:l})})})]}),n==="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=>o({trackColor:l})}),e.jsx(i,{label:"Thumb",value:a.thumbColor,onChange:l=>o({thumbColor:l})}),e.jsx(t,{label:"Row label width (px)",value:a.rowLabelWidth,onChange:l=>o({rowLabelWidth:l}),min:120,max:280}),e.jsx(i,{label:"Row band",value:a.rowBandColor,onChange:l=>o({rowBandColor:l})}),e.jsx(t,{label:"Tick badge size (px)",value:a.tickBadgeSize,onChange:l=>o({tickBadgeSize:l}),min:20,max:40})]})}),e.jsx(s,{title:"Anchor hint labels",children:e.jsx(N,{values:a,onPatch:o})}),e.jsx(s,{title:"Tick number labels",children:e.jsx(T,{values:a,onPatch:o,count:11})})]}),n==="FILE_UPLOAD"&&"dropzoneStyle"in a&&e.jsx(s,{title:"Dropzone",children:e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(b,{label:"Dropzone border",value:a.dropzoneStyle,onChange:l=>o({dropzoneStyle:l}),options:[{value:"dashed",label:"Dashed"},{value:"solid",label:"Solid"}]}),e.jsx(i,{label:"Border color",value:a.borderColor??a.accentColor,onChange:l=>o({borderColor:l})}),e.jsx(i,{label:"Fill color",value:a.dropzoneFillColor,onChange:l=>o({dropzoneFillColor:l})}),e.jsx(t,{label:"Padding (px)",value:a.dropzonePadding,onChange:l=>o({dropzonePadding:l}),min:12,max:48})]})}),n==="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=>o({mediaMaxWidth:l}),min:50,max:100}),e.jsx(d,{label:"Media corner radius",value:a.mediaRadius,onChange:l=>o({mediaRadius:l}),min:0,max:24}),e.jsx(i,{label:"Caption color",value:a.captionColor,onChange:l=>o({captionColor:l})}),e.jsx(t,{label:"Caption size (px)",value:a.captionSize,onChange:l=>o({captionSize:l}),min:10,max:24})]})}),n==="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=>o({pinColor:l})}),e.jsx(i,{label:"Pin border",value:a.pinBorderColor,onChange:l=>o({pinBorderColor:l})}),e.jsx(d,{label:"Pin size",value:a.pinSize,onChange:l=>o({pinSize:l}),min:8,max:32}),e.jsx(d,{label:"Overlay opacity",value:Math.round(a.overlayOpacity*100),onChange:l=>o({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(x.x*100),"%, ",Math.round(x.y*100),"%"]})]})}),n==="RANK_ORDER"&&"drag"in a&&e.jsx(s,{title:v?"Drag & drop":w?"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=>o({drag:{...a.drag,itemBg:l}})}),e.jsx(i,{label:"Drag handle",value:a.drag.dragHandleColor,onChange:l=>o({drag:{...a.drag,dragHandleColor:l}})}),e.jsx(i,{label:"Rank badge",value:a.drag.rankBadgeColor,onChange:l=>o({drag:{...a.drag,rankBadgeColor:l}})})]}),w&&e.jsxs(e.Fragment,{children:[e.jsx(i,{label:"Item background",value:a.dropdown.itemBg,onChange:l=>o({dropdown:{...a.dropdown,itemBg:l}})}),e.jsx(i,{label:"List hover background",value:a.dropdown.itemHoverBg??"#F3F4F6",onChange:l=>o({dropdown:{...a.dropdown,itemHoverBg:l}})}),e.jsx(i,{label:"Select border",value:a.dropdown.selectBorderColor,onChange:l=>o({dropdown:{...a.dropdown,selectBorderColor:l}})}),e.jsx(i,{label:"Rank badge",value:a.dropdown.rankBadgeColor,onChange:l=>o({dropdown:{...a.dropdown,rankBadgeColor:l}})})]})]})})]})}export{O as TypePanel};