SurveyVista/Web/Areas/Admin/Views/UserResponse/ViewResponse.cshtml
2026-03-07 02:37:33 +01:00

609 lines
29 KiB
Text

@model Response
@{
ViewData["Title"] = "Response Details";
}
@section Styles {
<style>
@@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap');
:root {
--neon-blue: #60a5fa;
--neon-purple: #c084fc;
--neon-green: #34d399;
--neon-pink: #f472b6;
--neon-yellow: #fbbf24;
--neon-red: #f87171;
--neon-cyan: #22d3ee;
--neon-teal: #33b3ae;
--dark-900: #0f172a;
--dark-800: #1e293b;
--dark-700: #334155;
--dark-600: #475569;
--dark-500: #64748b;
--dark-400: #94a3b8;
--dark-300: #cbd5e1;
--dark-200: #e2e8f0;
--glass-bg: rgba(255, 255, 255, 0.05);
--glass-border: rgba(255, 255, 255, 0.1);
--glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
--font-main: 'Space Grotesk', sans-serif;
--font-mono: 'JetBrains Mono', monospace;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: var(--font-main);
background: var(--dark-900);
color: #e2e8f0;
overflow-x: hidden;
}
.nexgen-vr {
min-height: 100vh;
position: relative;
}
/* ===== DYNAMIC BACKGROUND ===== */
.bg-pattern {
position: fixed; top: 0; left: 0;
width: 100vw; height: 100vh;
z-index: -1; overflow: hidden;
}
.grid-overlay {
position: absolute; inset: 0;
background-image:
linear-gradient(rgba(96, 165, 250, 0.1) 1px, transparent 1px),
linear-gradient(90deg, rgba(96, 165, 250, 0.1) 1px, transparent 1px);
background-size: 60px 60px;
animation: gridMove 20s linear infinite;
}
.gradient-mesh {
position: absolute; inset: 0;
background:
radial-gradient(circle at 20% 20%, rgba(96, 165, 250, 0.15) 0%, transparent 50%),
radial-gradient(circle at 80% 60%, rgba(192, 132, 252, 0.15) 0%, transparent 50%),
radial-gradient(circle at 40% 80%, rgba(52, 211, 153, 0.15) 0%, transparent 50%);
animation: meshShift 15s ease-in-out infinite;
}
@@keyframes gridMove { 0% { transform: translate(0,0); } 100% { transform: translate(60px,60px); } }
@@keyframes meshShift { 0%,100% { filter: hue-rotate(0deg); transform: scale(1); } 50% { filter: hue-rotate(30deg); transform: scale(1.05); } }
@@keyframes fadeInUp { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: translateY(0); } }
/* ===== TOP NAV ===== */
.top-nav {
position: sticky; top: 0; z-index: 100;
background: rgba(15, 23, 42, 0.85);
backdrop-filter: blur(20px);
border-bottom: 1px solid rgba(96, 165, 250, 0.15);
padding: 0.8rem 2rem;
}
.nav-container {
max-width: 860px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between; gap: 1rem;
}
.nav-brand { display: flex; align-items: center; gap: 0.8rem; }
.brand-icon {
width: 36px; height: 36px; border-radius: 10px;
background: linear-gradient(135deg, var(--neon-teal), var(--neon-blue));
display: flex; align-items: center; justify-content: center;
font-size: 16px; color: #fff;
box-shadow: 0 4px 16px rgba(51,179,174,0.3);
}
.brand-text { display: flex; flex-direction: column; }
.brand-name { font-family: var(--font-mono); font-size: 0.72rem; font-weight: 700; color: #fff; letter-spacing: 0.1em; }
.brand-version { font-family: var(--font-mono); font-size: 0.58rem; color: var(--dark-500); }
.breadcrumb-nex {
display: flex; align-items: center; gap: 0.6rem;
font-family: var(--font-mono); font-size: 0.7rem;
}
.breadcrumb-nex .crumb { color: var(--dark-400); text-decoration: none; transition: color 0.2s; }
.breadcrumb-nex .crumb:hover { color: var(--neon-blue); }
.breadcrumb-nex .crumb.active { color: var(--neon-teal); }
.breadcrumb-nex i.sep { font-size: 0.5rem; color: var(--dark-600); }
.nav-btn {
display: inline-flex; align-items: center; gap: 0.5rem;
padding: 0.5rem 1.2rem;
background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.15);
border-radius: 8px; color: var(--dark-300);
font-family: var(--font-mono); font-size: 0.7rem; font-weight: 600;
cursor: pointer; transition: all 0.2s; text-decoration: none;
}
.nav-btn:hover { background: rgba(255,255,255,0.1); border-color: rgba(96,165,250,0.3); color: #fff; text-decoration: none; }
/* ===== MAIN ===== */
.vr-content { max-width: 860px; margin: 0 auto; padding: 2rem; }
/* ===== RESPONDENT HERO ===== */
.vr-hero {
background: var(--glass-bg); backdrop-filter: blur(20px);
border: 1px solid var(--glass-border); border-radius: 20px;
overflow: hidden; box-shadow: var(--glass-shadow);
margin-bottom: 2rem; position: relative;
animation: fadeInUp 0.5s ease both;
}
.vr-hero::before {
content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px;
background: linear-gradient(90deg, var(--neon-teal), var(--neon-blue), var(--neon-purple));
}
.vr-hero-body {
padding: 1.8rem 2rem;
display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;
}
.vr-avatar {
width: 58px; height: 58px; border-radius: 14px;
background: linear-gradient(135deg, var(--neon-blue), var(--neon-purple));
display: flex; align-items: center; justify-content: center;
font-size: 24px; font-weight: 700; color: #fff; flex-shrink: 0;
box-shadow: 0 8px 24px rgba(96,165,250,0.25);
}
.vr-hero-info { flex: 1; min-width: 180px; }
.vr-hero-name { font-size: 1.3rem; font-weight: 700; color: #fff; margin-bottom: 0.2rem; }
.vr-hero-email { font-size: 0.82rem; color: var(--dark-400); }
.vr-pills { display: flex; gap: 0.5rem; flex-wrap: wrap; }
.vr-pill {
display: inline-flex; align-items: center; gap: 0.35rem;
padding: 0.35rem 0.8rem; border-radius: 100px;
font-family: var(--font-mono); font-size: 0.68rem; font-weight: 600;
border: 1px solid;
}
.vr-pill.p-id { color: var(--neon-teal); background: rgba(51,179,174,0.1); border-color: rgba(51,179,174,0.3); }
.vr-pill.p-date { color: var(--neon-yellow); background: rgba(251,191,36,0.1); border-color: rgba(251,191,36,0.3); }
.vr-pill.p-survey { color: var(--neon-purple); background: rgba(192,132,252,0.1); border-color: rgba(192,132,252,0.3); }
/* ===== QUESTION CARDS ===== */
.q-list { display: flex; flex-direction: column; gap: 1rem; }
.q-card {
background: var(--glass-bg); backdrop-filter: blur(20px);
border: 1px solid var(--glass-border); border-radius: 16px;
overflow: hidden; box-shadow: var(--glass-shadow);
transition: all 0.3s ease; animation: fadeInUp 0.5s ease both;
}
.q-card:nth-child(1) { animation-delay: .1s; }
.q-card:nth-child(2) { animation-delay: .14s; }
.q-card:nth-child(3) { animation-delay: .18s; }
.q-card:nth-child(4) { animation-delay: .22s; }
.q-card:nth-child(5) { animation-delay: .26s; }
.q-card:nth-child(n+6) { animation-delay: .28s; }
.q-card:hover { border-color: rgba(96,165,250,0.2); box-shadow: 0 12px 48px rgba(0,0,0,0.2); transform: translateY(-2px); }
.q-head {
display: flex; align-items: flex-start; gap: 1rem;
padding: 1.3rem 1.5rem;
border-bottom: 1px solid rgba(255,255,255,0.06);
background: rgba(255,255,255,0.02);
}
.q-num {
width: 32px; height: 32px; border-radius: 9px;
background: linear-gradient(135deg, var(--neon-teal), var(--neon-blue));
display: flex; align-items: center; justify-content: center;
font-family: var(--font-mono); font-size: 0.78rem; font-weight: 700;
color: #fff; flex-shrink: 0;
box-shadow: 0 4px 12px rgba(51,179,174,0.25);
}
.q-title { flex: 1; min-width: 0; }
.q-text { font-size: 0.92rem; font-weight: 600; color: #fff; line-height: 1.5; margin-bottom: 0.4rem; }
.q-type-pill {
display: inline-flex; align-items: center; gap: 0.3rem;
font-family: var(--font-mono); font-size: 0.62rem; font-weight: 700;
color: var(--neon-blue); background: rgba(96,165,250,0.1);
border: 1px solid rgba(96,165,250,0.25);
padding: 0.18rem 0.65rem; border-radius: 100px;
letter-spacing: 0.04em; text-transform: uppercase;
}
.q-body { padding: 1.3rem 1.5rem; }
/* ===== TEXT RESPONSE ===== */
.vr-text-resp {
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.08);
border-left: 3px solid var(--neon-teal);
border-radius: 0 10px 10px 0;
padding: 1rem 1.3rem;
font-size: 0.88rem; color: var(--dark-200); line-height: 1.7;
}
/* ===== CHOICES ===== */
.vr-choices { display: flex; flex-direction: column; gap: 0.45rem; }
.vr-choice {
display: flex; align-items: center; gap: 0.8rem;
padding: 0.75rem 1.1rem; border-radius: 10px;
font-size: 0.86rem; font-weight: 500;
border: 1px solid transparent; transition: all 0.2s;
}
.vr-choice.selected { background: rgba(52,211,153,0.08); border-color: rgba(52,211,153,0.25); color: var(--dark-200); }
.vr-choice:not(.selected) { color: var(--dark-600); }
.vr-dot {
width: 20px; height: 20px; border-radius: 5px;
border: 2px solid var(--dark-600);
display: flex; align-items: center; justify-content: center;
flex-shrink: 0; font-size: 0.6rem; transition: all 0.2s;
}
.vr-dot.radio { border-radius: 50%; }
.vr-dot.checked { background: var(--neon-green); border-color: var(--neon-green); color: #fff; }
.vr-dot.checked::after { content: '✓'; font-size: 0.6rem; font-weight: 700; }
.vr-other-text {
margin-top: 0.3rem; margin-left: 28px;
background: rgba(251,191,36,0.06);
border: 1px dashed rgba(251,191,36,0.25);
border-radius: 8px; padding: 0.5rem 0.9rem;
font-size: 0.78rem; color: var(--dark-300); font-style: italic;
}
.vr-other-text::before { content: '"'; color: var(--neon-yellow); }
.vr-other-text::after { content: '"'; color: var(--neon-yellow); }
/* ===== RATING ===== */
.vr-rating { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.vr-rating-item {
display: flex; flex-direction: column; align-items: center; gap: 0.25rem;
padding: 0.6rem 1rem;
background: rgba(255,255,255,0.03);
border: 1.5px solid rgba(255,255,255,0.08);
border-radius: 10px; font-size: 0.75rem; color: var(--dark-500);
transition: all 0.2s;
}
.vr-rating-item .r-star { font-size: 1.3rem; color: var(--dark-600); }
.vr-rating-item.selected { border-color: rgba(251,191,36,0.35); background: rgba(251,191,36,0.08); }
.vr-rating-item.selected .r-star { color: var(--neon-yellow); }
.vr-rating-item.selected .r-label { color: var(--dark-200); font-weight: 600; }
/* ===== LIKERT ===== */
.vr-likert { display: flex; flex-wrap: wrap; gap: 0.4rem; }
.vr-likert-chip {
flex: 1; min-width: 80px; text-align: center;
padding: 0.7rem 0.5rem;
background: rgba(255,255,255,0.03);
border: 1.5px solid rgba(255,255,255,0.08);
border-radius: 10px; font-size: 0.78rem; color: var(--dark-500);
font-weight: 500; transition: all 0.2s;
}
.vr-likert-chip.selected {
border-color: rgba(52,211,153,0.35); background: rgba(52,211,153,0.08);
color: var(--neon-green); font-weight: 600;
}
/* ===== MATRIX ===== */
.vr-matrix { overflow-x: auto; border-radius: 10px; border: 1px solid rgba(255,255,255,0.08); }
.vr-matrix table { width: 100%; border-collapse: collapse; }
.vr-matrix th, .vr-matrix td {
padding: 0.7rem 1rem; border: 1px solid rgba(255,255,255,0.06);
font-size: 0.8rem; text-align: center;
}
.vr-matrix th { background: rgba(255,255,255,0.04); color: var(--dark-400); font-weight: 600; }
.vr-matrix td { color: var(--dark-500); }
.vr-matrix td.selected { color: var(--neon-green); font-weight: 600; }
/* ===== RANKING ===== */
.vr-rank-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 0.8rem; }
.vr-rank-section {
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 10px; padding: 0.8rem;
}
.vr-rank-title {
font-family: var(--font-mono); font-size: 0.65rem; font-weight: 700;
color: var(--dark-500); text-transform: uppercase;
letter-spacing: 0.05em; margin-bottom: 0.5rem;
display: flex; align-items: center; gap: 0.4rem;
}
.vr-rank-list { display: flex; flex-direction: column; gap: 0.3rem; }
.vr-rank-item {
display: flex; align-items: center; gap: 0.6rem;
padding: 0.45rem 0.6rem;
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.06);
border-radius: 8px; font-size: 0.8rem; color: var(--dark-300);
}
.vr-rank-num {
width: 22px; height: 22px; border-radius: 6px;
background: linear-gradient(135deg, var(--neon-blue), var(--neon-purple));
display: flex; align-items: center; justify-content: center;
font-family: var(--font-mono); font-size: 0.65rem; font-weight: 700;
color: #fff; flex-shrink: 0;
}
/* ===== IMAGES ===== */
.vr-images { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 0.6rem; }
.vr-img-card {
border: 2px solid rgba(255,255,255,0.08); border-radius: 10px;
overflow: hidden; position: relative; transition: all 0.3s;
}
.vr-img-card img { width: 100%; height: 85px; object-fit: cover; display: block; }
.vr-img-card.selected { border-color: rgba(52,211,153,0.5); box-shadow: 0 0 20px rgba(52,211,153,0.15); }
.vr-img-card.unselected { opacity: 0.3; filter: grayscale(80%); }
.vr-img-check {
position: absolute; top: 6px; right: 6px;
width: 22px; height: 22px; border-radius: 50%;
background: var(--neon-green);
display: flex; align-items: center; justify-content: center;
color: #fff; font-size: 0.65rem;
box-shadow: 0 2px 8px rgba(52,211,153,0.4);
}
.vr-img-placeholder {
height: 85px; display: flex; align-items: center; justify-content: center;
background: rgba(255,255,255,0.03);
font-size: 0.72rem; font-weight: 600; color: var(--dark-400);
}
/* ===== SLIDER ===== */
.vr-slider-wrap {
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 10px; padding: 1rem 1.2rem;
}
.vr-slider-bar {
width: 100%; height: 6px; border-radius: 100px;
background: var(--dark-700);
-webkit-appearance: none; appearance: none;
}
.vr-slider-bar::-webkit-slider-thumb {
-webkit-appearance: none;
width: 18px; height: 18px;
background: linear-gradient(135deg, var(--neon-teal), var(--neon-blue));
border-radius: 50%;
box-shadow: 0 2px 8px rgba(51,179,174,0.4);
}
.vr-slider-val {
display: inline-block; margin-top: 0.5rem;
padding: 0.25rem 0.8rem;
background: rgba(51,179,174,0.1); border: 1px solid rgba(51,179,174,0.3);
border-radius: 100px;
font-family: var(--font-mono); font-size: 0.78rem; font-weight: 700;
color: var(--neon-teal);
}
/* ===== UNSUPPORTED ===== */
.vr-unsupported {
color: var(--dark-600); font-size: 0.85rem; font-style: italic; padding: 0.5rem 0;
}
/* ===== RESPONSIVE ===== */
@@media (max-width: 768px) {
.vr-content { padding: 1rem; }
.vr-hero-body { flex-direction: column; align-items: flex-start; padding: 1.3rem; }
.vr-pills { flex-direction: column; }
.nav-container { flex-wrap: wrap; }
.breadcrumb-nex { order: 3; flex-basis: 100%; }
.vr-rank-cols { grid-template-columns: 1fr; }
.vr-likert { flex-direction: column; }
.vr-images { grid-template-columns: repeat(2, 1fr); }
}
@@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
@@media print {
.bg-pattern, .top-nav { display: none !important; }
.q-card, .vr-hero { background: white; color: black; border: 1px solid #ccc; backdrop-filter: none; }
}
</style>
}
@{ int qNum = 0; }
<div class="nexgen-vr">
<!-- Dynamic Background -->
<div class="bg-pattern">
<div class="grid-overlay"></div>
<div class="gradient-mesh"></div>
</div>
<!-- Top Navigation -->
<nav class="top-nav">
<div class="nav-container">
<div class="nav-brand">
<div class="brand-icon"><i class="bi bi-eye"></i></div>
<div class="brand-text">
<span class="brand-name">RESPONSE VIEWER</span>
<span class="brand-version">v1.0</span>
</div>
</div>
<nav class="breadcrumb-nex">
<a asp-action="Index" asp-controller="UserResponse" class="crumb">
<i class="bi bi-clipboard-data"></i> RESPONSES
</a>
<i class="bi bi-chevron-right sep"></i>
<span class="crumb active">RESPONSE #@Model.Id</span>
</nav>
<a asp-action="Index" asp-controller="UserResponse" class="nav-btn">
<i class="bi bi-arrow-left"></i> <span>Back to List</span>
</a>
</div>
</nav>
<!-- Main Content -->
<div class="vr-content">
<!-- Respondent Hero -->
<div class="vr-hero">
<div class="vr-hero-body">
<div class="vr-avatar">@(Model.UserName?.Substring(0, 1).ToUpper() ?? "U")</div>
<div class="vr-hero-info">
<h2 class="vr-hero-name">@Model.UserName</h2>
<div class="vr-hero-email">@Model.UserEmail</div>
</div>
<div class="vr-pills">
<span class="vr-pill p-id"><i class="bi bi-hash"></i> ID: @Model.Id</span>
<span class="vr-pill p-date"><i class="bi bi-calendar3"></i> <span id="localTime">@Model.SubmissionDate.ToString("yyyy-MM-ddTHH:mm:ss")</span></span>
@if (Model.Questionnaire != null)
{
<span class="vr-pill p-survey"><i class="bi bi-file-text"></i> @Model.Questionnaire.Title</span>
}
</div>
</div>
</div>
<!-- Questions -->
<div class="q-list">
@foreach (var detail in Model.ResponseDetails)
{
qNum++;
<div class="q-card">
<div class="q-head">
<span class="q-num">@qNum</span>
<div class="q-title">
<p class="q-text">@detail.Question.Text</p>
<span class="q-type-pill"><i class="bi bi-tag"></i> @detail.QuestionType.ToString().Replace("_", " ")</span>
</div>
</div>
<div class="q-body">
@switch (detail.QuestionType)
{
case QuestionType.Text:
case QuestionType.Open_ended:
<div class="vr-text-resp">@(detail.TextResponse ?? "—")</div>
break;
case QuestionType.Multiple_choice:
case QuestionType.CheckBox:
case QuestionType.TrueFalse:
case QuestionType.Demographic:
<div class="vr-choices">
@foreach (var answer in detail.Question.Answers)
{
var isSelected = detail.ResponseAnswers.Any(ra => ra.AnswerId == answer.Id);
var isRadio = detail.QuestionType == QuestionType.TrueFalse;
<div class="vr-choice @(isSelected ? "selected" : "")">
<span class="vr-dot @(isRadio ? "radio" : "") @(isSelected ? "checked" : "")"></span>
<span>@answer.Text</span>
</div>
@if (isSelected && answer.IsOtherOption && !string.IsNullOrEmpty(detail.OtherText))
{
<div class="vr-other-text">@detail.OtherText</div>
}
}
</div>
break;
case QuestionType.Rating:
<div class="vr-rating">
@foreach (var answer in detail.Question.Answers.OrderBy(a => a.Id))
{
var isSelected = detail.ResponseAnswers.Any(ra => ra.AnswerId == answer.Id);
<div class="vr-rating-item @(isSelected ? "selected" : "")">
<i class="bi bi-star-fill r-star"></i>
<span class="r-label">@answer.Text</span>
</div>
}
</div>
break;
case QuestionType.Likert:
<div class="vr-likert">
@foreach (var answer in detail.Question.Answers.OrderBy(a => a.Id))
{
var isSelected = detail.ResponseAnswers.Any(ra => ra.AnswerId == answer.Id);
<div class="vr-likert-chip @(isSelected ? "selected" : "")">@answer.Text</div>
}
</div>
break;
case QuestionType.Matrix:
<div class="vr-matrix">
<table>
<thead><tr><th style="text-align:left;">Option</th><th style="width:80px;">Selected</th></tr></thead>
<tbody>
@foreach (var answer in detail.Question.Answers)
{
var isSelected = detail.ResponseAnswers.Any(ra => ra.AnswerId == answer.Id);
<tr>
<td style="text-align:left;" class="@(isSelected ? "selected" : "")">@answer.Text</td>
<td>@if (isSelected) { <i class="bi bi-check-circle-fill" style="color:var(--neon-green);"></i> } else { <i class="bi bi-circle" style="color:var(--dark-600);"></i> }</td>
</tr>
}
</tbody>
</table>
</div>
break;
case QuestionType.Ranking:
<div class="vr-rank-cols">
<div class="vr-rank-section">
<div class="vr-rank-title"><i class="bi bi-list-ol"></i> Original Order</div>
<div class="vr-rank-list">
@foreach (var answer in detail.Question.Answers)
{
var userIdx = detail.ResponseAnswers.FindIndex(ra => ra.AnswerId == answer.Id) + 1;
<div class="vr-rank-item"><span class="vr-rank-num">@userIdx</span><span>@answer.Text</span></div>
}
</div>
</div>
<div class="vr-rank-section">
<div class="vr-rank-title"><i class="bi bi-arrow-down-up"></i> User Ranking</div>
<div class="vr-rank-list">
@for (int i = 0; i < detail.ResponseAnswers.Count; i++)
{
var ra = detail.ResponseAnswers[i];
var answer = detail.Question.Answers.FirstOrDefault(a => a.Id == ra.AnswerId);
<div class="vr-rank-item"><span class="vr-rank-num">@(i + 1)</span><span>@answer?.Text</span></div>
}
</div>
</div>
</div>
break;
case QuestionType.Image:
<div class="vr-images">
@foreach (var answer in detail.Question.Answers)
{
var isSelected = detail.ResponseAnswers.Any(ra => ra.AnswerId == answer.Id);
<div class="vr-img-card @(isSelected ? "selected" : "unselected")">
@if (answer.IsOtherOption)
{
<div class="vr-img-placeholder">@answer.Text</div>
}
else
{
<img src="@answer.Text" alt="Option" />
}
@if (isSelected) { <span class="vr-img-check"><i class="bi bi-check"></i></span> }
</div>
@if (isSelected && answer.IsOtherOption && !string.IsNullOrEmpty(detail.OtherText))
{
<div class="vr-other-text" style="grid-column:1/-1;">@detail.OtherText</div>
}
}
</div>
break;
case QuestionType.Slider:
<div class="vr-slider-wrap">
@{ int sv = 0; Int32.TryParse(detail.TextResponse, out sv); }
<input type="range" min="0" max="100" value="@sv" class="vr-slider-bar" disabled />
<span class="vr-slider-val">@sv / 100</span>
</div>
break;
default:
<div class="vr-unsupported">Unsupported question type.</div>
break;
}
</div>
</div>
}
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
var el = document.getElementById('localTime');
if (el) { var d = new Date(el.innerText + 'Z'); el.innerText = d.toLocaleString(); }
});
</script>