feat: custom answer option on all radio groups — text + voice mic

This commit is contained in:
wasrusgen 2026-05-29 16:33:22 +03:00
parent d3b0b47af3
commit b0cc480b06

View File

@ -430,6 +430,18 @@ body{font-family:'Inter',sans-serif;background:var(--body-bg);color:var(--text);
.qa-submit-txt .qs-title{font-size:14px;font-weight:700;color:#fff;margin-bottom:2px} .qa-submit-txt .qs-title{font-size:14px;font-weight:700;color:#fff;margin-bottom:2px}
.qa-submit-txt .qs-sub{font-size:12px;color:rgba(255,255,255,.5)} .qa-submit-txt .qs-sub{font-size:12px;color:rgba(255,255,255,.5)}
.qa-sep{height:1px;background:var(--border);margin:12px 0} .qa-sep{height:1px;background:var(--border);margin:12px 0}
/* Custom answer option */
.qa-custom-btn{display:inline-flex;align-items:center;gap:5px;padding:6px 11px;border:1.5px dashed #CBD5E1;border-radius:8px;font-size:12px;font-weight:600;color:#9CA3AF;cursor:pointer;background:transparent;font-family:'Inter',sans-serif;transition:all .15s;margin-top:2px}
.qa-custom-btn:hover{border-color:var(--primary);color:var(--primary)}
.qa-custom-btn.open{border-color:var(--primary);color:var(--primary);background:var(--light)}
.qa-custom-expand{display:none;align-items:center;gap:7px;margin-top:8px}
.qa-custom-expand.show{display:flex}
.qa-custom-inp{flex:1;border:1.5px solid var(--border);border-radius:8px;padding:8px 12px;font-size:13px;font-family:'Inter',sans-serif;color:var(--text);background:var(--white);outline:none}
.qa-custom-inp:focus{border-color:var(--mid);box-shadow:0 0 0 3px rgba(16,185,129,.08)}
.qa-custom-inp::placeholder{color:#9CA3AF}
.qa-custom-mic{width:34px;height:34px;border-radius:8px;background:var(--light);border:1.5px solid rgba(4,120,87,.2);display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:all .15s}
.qa-custom-mic:hover{background:#D1FAE5}
.qa-custom-mic.rec{background:#FEF2F2;border-color:#FECACA;animation:recPulse 1.4s ease-in-out infinite}
/* Voice input in questionnaire */ /* Voice input in questionnaire */
.qa-voice-row{display:flex;align-items:center;gap:8px;margin-top:8px} .qa-voice-row{display:flex;align-items:center;gap:8px;margin-top:8px}
.qa-mic-btn{display:flex;align-items:center;gap:7px;padding:7px 12px;border:1.5px solid var(--border);border-radius:8px;background:var(--white);cursor:pointer;font-size:12px;font-weight:600;color:var(--muted);font-family:'Inter',sans-serif;transition:all .15s} .qa-mic-btn{display:flex;align-items:center;gap:7px;padding:7px 12px;border:1.5px solid var(--border);border-radius:8px;background:var(--white);cursor:pointer;font-size:12px;font-weight:600;color:var(--muted);font-family:'Inter',sans-serif;transition:all .15s}
@ -1605,6 +1617,28 @@ function toggleDoc(row){
if(!isOpen) panel.classList.add('open'); if(!isOpen) panel.classList.add('open');
} }
// Inject "custom answer" option into every radio group
document.querySelectorAll('.qa-radios').forEach((grp,i)=>{
const uid='cust'+i;
const btn=document.createElement('button');
btn.className='qa-custom-btn';
btn.innerHTML='<svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg> Свой вариант';
btn.onclick=()=>{
btn.classList.toggle('open');
exp.classList.toggle('show');
if(exp.classList.contains('show')) inp.focus();
};
const exp=document.createElement('div');
exp.className='qa-custom-expand';
exp.innerHTML=`<input class="qa-custom-inp" placeholder="Опишите свой вариант...">
<button class="qa-custom-mic" onclick="this.classList.toggle('rec')" title="Надиктовать">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="${'#047857'}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><line x1="12" y1="19" x2="12" y2="23"/><line x1="8" y1="23" x2="16" y2="23"/></svg>
</button>`;
const inp=exp.querySelector('input');
grp.after(btn);
btn.after(exp);
});
function qsel(el){ function qsel(el){
const grp=el.closest('.qa-radios'); const grp=el.closest('.qa-radios');
grp.querySelectorAll('.qa-radio').forEach(r=>r.classList.remove('sel')); grp.querySelectorAll('.qa-radio').forEach(r=>r.classList.remove('sel'));