minigame 1 question 1.1

This commit is contained in:
2026-05-02 06:21:45 +00:00
parent 306637996e
commit e55dadf41c
46 changed files with 1021 additions and 66 deletions
+134
View File
@@ -188,6 +188,11 @@
var bMs = data.betweenMs != null ? data.betweenMs : 3500;
el('quiz-between-sec').value = String(Math.max(0, Math.round(bMs / 1000)));
renderQuizAdminQuestions(data.questions);
if (data.quizMapPanelTheme && typeof data.quizMapPanelTheme === 'object') {
quizTfFillFormFromTheme(data.quizMapPanelTheme);
} else {
quizTfFillFormFromTheme({});
}
setMsg('quiz-settings-msg', '', '');
}).catch(function (e) {
setMsg('quiz-settings-msg', e.message || 'โหลดไม่ได้', 'error');
@@ -219,6 +224,7 @@
answerMs: ansS * 1000,
betweenMs: betS * 1000,
questions: questions,
quizMapPanelTheme: quizTfBuildThemeForSave(),
}).then(function () {
setMsg('quiz-settings-msg', 'บันทึกแล้ว', 'ok');
}).catch(function (e) {
@@ -226,6 +232,134 @@
});
}
function quizTfThemeHiddenId(kind) {
if (kind === 'bg') return 'quiz-tf-theme-bg';
if (kind === 'border') return 'quiz-tf-theme-border';
return 'quiz-tf-theme-text';
}
function quizTfRowPrefix(kind) {
return 'quiz-tf-theme-' + kind;
}
function quizTfSetPickersFromColorString(kind, cssStr) {
var fb = QUIZ_CARRY_THEME_DEFAULTS[kind];
var o = quizCarryParseCssColor(cssStr, fb);
var pref = quizTfRowPrefix(kind);
var sw = el(pref + '-swatch');
var ra = el(pref + '-alpha');
var out = el(pref + '-alpha-out');
var hi = el(quizTfThemeHiddenId(kind));
var pr = el(pref + '-preview');
if (!sw || !ra || !hi) return;
sw.value = quizCarryHexFromRgb(o.r, o.g, o.b);
var pct = Math.max(0, Math.min(100, Math.round(Number(o.a) * 100)));
ra.value = String(pct);
if (out) out.textContent = pct + '%';
hi.value = quizCarryRgbToRgbaString(o);
if (pr) pr.textContent = hi.value;
}
function quizTfComposeFromPickers(kind) {
var pref = quizTfRowPrefix(kind);
var sw = el(pref + '-swatch');
var ra = el(pref + '-alpha');
if (!sw || !ra) return '';
var pr = quizCarryParseHexToRgb(sw.value);
if (!pr) return '';
var pct = parseInt(String(ra.value), 10);
if (!Number.isFinite(pct)) pct = 100;
pct = Math.max(0, Math.min(100, pct));
return quizCarryRgbToRgbaString({ r: pr.r, g: pr.g, b: pr.b, a: pct / 100 });
}
function quizTfSyncRowOutput(kind) {
var s = quizTfComposeFromPickers(kind);
var hi = el(quizTfThemeHiddenId(kind));
var pref = quizTfRowPrefix(kind);
var ra = el(pref + '-alpha');
var out = el(pref + '-alpha-out');
var pr = el(pref + '-preview');
if (hi) hi.value = s;
if (out && ra) out.textContent = String(Math.max(0, Math.min(100, parseInt(ra.value, 10) || 0))) + '%';
if (pr && hi) pr.textContent = hi.value;
}
function quizTfBindThemePickersOnce() {
if (quizTfBindThemePickersOnce._done) return;
['bg', 'border', 'text'].forEach(function (kind) {
var pref = quizTfRowPrefix(kind);
var sw = el(pref + '-swatch');
var ra = el(pref + '-alpha');
if (!sw || !ra) return;
if (ra.getAttribute('data-tf-bound') === '1') return;
ra.setAttribute('data-tf-bound', '1');
function sync() {
quizTfSyncRowOutput(kind);
}
sw.addEventListener('input', sync);
sw.addEventListener('change', sync);
ra.addEventListener('input', sync);
ra.addEventListener('change', sync);
});
quizTfBindThemePickersOnce._done = true;
}
function quizTfBuildThemeForSave() {
quizTfBindThemePickersOnce();
['bg', 'border', 'text'].forEach(function (k) {
quizTfSyncRowOutput(k);
});
var fbBg = QUIZ_CARRY_THEME_DEFAULTS.bg;
var fbBr = QUIZ_CARRY_THEME_DEFAULTS.border;
var fbTx = QUIZ_CARRY_THEME_DEFAULTS.text;
var sBg = quizTfComposeFromPickers('bg');
var sBr = quizTfComposeFromPickers('border');
var sTx = quizTfComposeFromPickers('text');
var bwEl = el('quiz-tf-theme-border-w');
var bw = bwEl ? parseInt(String(bwEl.value || '2'), 10) : 2;
if (!Number.isFinite(bw)) bw = 2;
bw = Math.max(0, Math.min(12, Math.round(bw)));
var qfMinEl = el('quiz-tf-theme-qfont-min');
var qfMaxEl = el('quiz-tf-theme-qfont-max');
var qMin = qfMinEl ? parseInt(String(qfMinEl.value || '10'), 10) : 10;
var qMax = qfMaxEl ? parseInt(String(qfMaxEl.value || '24'), 10) : 24;
if (!Number.isFinite(qMin)) qMin = 10;
if (!Number.isFinite(qMax)) qMax = 24;
qMin = Math.max(10, Math.min(40, Math.round(qMin)));
qMax = Math.max(14, Math.min(56, Math.round(qMax)));
if (qMax < qMin) {
var swap = qMin;
qMin = qMax;
qMax = swap;
}
return {
panelBg: (sBg && sBg.trim()) ? sBg.trim().slice(0, 120) : quizCarryRgbToRgbaString(fbBg),
panelBorder: (sBr && sBr.trim()) ? sBr.trim().slice(0, 120) : quizCarryRgbToRgbaString(fbBr),
textColor: (sTx && sTx.trim()) ? sTx.trim().slice(0, 120) : quizCarryRgbToRgbaString(fbTx),
borderWidthPx: bw,
questionFontMinPx: qMin,
questionFontMaxPx: qMax,
};
}
function quizTfFillFormFromTheme(th) {
quizTfBindThemePickersOnce();
var t = th && typeof th === 'object' ? th : {};
quizTfSetPickersFromColorString('bg', t.panelBg);
quizTfSetPickersFromColorString('border', t.panelBorder);
quizTfSetPickersFromColorString('text', t.textColor);
var bwEl = el('quiz-tf-theme-border-w');
var bw = parseInt(String(t.borderWidthPx), 10);
if (bwEl) bwEl.value = String(Number.isFinite(bw) && bw >= 0 ? Math.min(12, bw) : 2);
var qfMinEl = el('quiz-tf-theme-qfont-min');
var qfMaxEl = el('quiz-tf-theme-qfont-max');
var qMin = parseInt(String(t.questionFontMinPx), 10);
var qMax = parseInt(String(t.questionFontMaxPx), 10);
if (qfMinEl) qfMinEl.value = String(Number.isFinite(qMin) ? Math.max(10, Math.min(40, qMin)) : 10);
if (qfMaxEl) qfMaxEl.value = String(Number.isFinite(qMax) ? Math.max(14, Math.min(56, qMax)) : 24);
}
var QUIZ_CARRY_MAX_SLOTS = 16;
function rebuildQuizCarryCorrectSelect(row) {