diff --git a/public/css/styles.css b/public/css/styles.css index 350df3d..e06af83 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -661,9 +661,10 @@ body{font-family:'Inter',system-ui,sans-serif;background:var(--g50);color:var(-- } /* ── Quill editor overrides ───────────────────────────────── */ -.cms-quill-body{border:1px solid var(--g300);border-radius:8px;overflow:hidden;background:white;} -.cms-quill-body .ql-toolbar{border:none;border-bottom:1px solid var(--g200);background:var(--g50);border-radius:0;padding:8px;} -.cms-quill-body .ql-container{border:none;font-family:'Inter',system-ui,sans-serif;font-size:14px;} +/* No overflow:hidden on wrappers — tooltip must be able to escape the container */ +.cms-quill-body{border:1px solid var(--g300);border-radius:8px;background:white;position:relative;} +.cms-quill-body .ql-toolbar{border:none;border-bottom:1px solid var(--g200);background:var(--g50);border-radius:8px 8px 0 0;padding:8px;} +.cms-quill-body .ql-container{border:none;font-family:'Inter',system-ui,sans-serif;font-size:14px;border-radius:0 0 8px 8px;} .cms-quill-body .ql-editor{min-height:280px;padding:16px;} .cms-quill-body .ql-editor p{margin-bottom:8px;} .cms-quill-body .ql-editor h2{font-size:20px;font-weight:700;margin:16px 0 8px;} @@ -671,13 +672,16 @@ body{font-family:'Inter',system-ui,sans-serif;background:var(--g50);color:var(-- .cms-quill-body .ql-editor blockquote{border-left:4px solid var(--blue);padding-left:12px;color:var(--g600);margin:10px 0;} .cms-quill-body .ql-editor pre{background:var(--g900);color:#e5e7eb;padding:12px;border-radius:6px;font-size:13px;overflow-x:auto;} +/* Quill tooltip is moved to document.body by JS — just needs z-index */ +.ql-tooltip{z-index:10000 !important;} + /* Mini quill on questions/options */ -.lh-q-richtext-wrap{border:1.5px solid var(--g300);border-radius:8px;overflow:hidden;margin-bottom:8px;} -.lh-q-richtext-wrap .ql-toolbar{border:none;border-bottom:1px solid var(--g200);background:var(--g50);padding:4px 6px;} +.lh-q-richtext-wrap{border:1.5px solid var(--g300);border-radius:8px;margin-bottom:8px;position:relative;} +.lh-q-richtext-wrap .ql-toolbar{border:none;border-bottom:1px solid var(--g200);background:var(--g50);padding:4px 6px;border-radius:8px 8px 0 0;} .lh-q-richtext-wrap .ql-container{border:none;font-size:14px;font-family:'Inter',system-ui,sans-serif;} .lh-q-richtext-wrap .ql-editor{min-height:60px;padding:10px;} -.lh-opt-richtext-wrap{border:1.5px solid var(--g300);border-radius:6px;overflow:hidden;flex:2;} -.lh-opt-richtext-wrap .ql-toolbar{border:none;border-bottom:1px solid var(--g200);background:var(--g50);padding:2px 4px;} +.lh-opt-richtext-wrap{border:1.5px solid var(--g300);border-radius:6px;flex:2;position:relative;} +.lh-opt-richtext-wrap .ql-toolbar{border:none;border-bottom:1px solid var(--g200);background:var(--g50);padding:2px 4px;border-radius:6px 6px 0 0;} .lh-opt-richtext-wrap .ql-container{border:none;font-size:13px;font-family:'Inter',system-ui,sans-serif;} .lh-opt-richtext-wrap .ql-editor{min-height:40px;padding:6px 8px;} diff --git a/public/index.html b/public/index.html index 2ac6583..75a2df4 100644 --- a/public/index.html +++ b/public/index.html @@ -53,7 +53,7 @@
diff --git a/public/js/auth.js b/public/js/auth.js index e29a26f..fee9823 100644 --- a/public/js/auth.js +++ b/public/js/auth.js @@ -414,13 +414,13 @@ document.addEventListener('DOMContentLoaded', function() { // Expose globally so app.js tabChanged handler can call it window.load2FAStatus = load2FAStatus; - // Check registration status + // Check registration status — link is hidden by default, shown only when enabled fetch('/api/auth/registration-status') .then(function(r) { return r.json(); }) .then(function(data) { - if (!data.registrationEnabled) { + if (data.registrationEnabled) { var link = document.getElementById('show-register'); - if (link) link.style.display = 'none'; + if (link) link.style.display = ''; } }) .catch(function() {}); diff --git a/public/js/learningHub.js b/public/js/learningHub.js index 782e096..b5398e2 100644 --- a/public/js/learningHub.js +++ b/public/js/learningHub.js @@ -581,6 +581,37 @@ renderCmsContentList(filtered); } + // ── Quill tooltip fix ───────────────────────────────────── + // Moves the tooltip element to document.body so overflow:hidden on + // ancestor containers cannot clip it. Recalculates position to + // viewport (fixed) coordinates on every show. + function patchQuillTooltip(q) { + var tooltip = q && q.theme && q.theme.tooltip; + if (!tooltip || !tooltip.root) return; + var el = tooltip.root; + document.body.appendChild(el); + el.style.position = 'fixed'; + el.style.zIndex = '10000'; + + var origPosition = tooltip.position.bind(tooltip); + tooltip.position = function(reference) { + origPosition(reference); + // Quill sets left/top as container-relative; convert to viewport coords + var rect = q.container.getBoundingClientRect(); + var l = rect.left + parseFloat(el.style.left || 0); + var t = rect.top + parseFloat(el.style.top || 0); + // Clamp to viewport + var tw = el.offsetWidth || 200; + var th = el.offsetHeight || 40; + if (l + tw > window.innerWidth - 8) l = window.innerWidth - tw - 8; + if (l < 8) l = 8; + if (t + th > window.innerHeight - 8) t = rect.top + parseFloat(el.style.top || 0) - th - 8; + if (t < 8) t = 8; + el.style.left = l + 'px'; + el.style.top = t + 'px'; + }; + } + // ── Quill body editor ───────────────────────────────────── function initBodyEditor() { var container = document.getElementById('lh-body-editor'); @@ -599,6 +630,7 @@ ] } }); + patchQuillTooltip(_bodyQuill); } // Mini Quill for question text or option text @@ -610,6 +642,7 @@ theme: 'snow', modules: { toolbar: toolbar } }); + patchQuillTooltip(q); if (existingHtml) q.clipboard.dangerouslyPasteHTML(existingHtml); return q; }