Skip to content

Commit 6a78df0

Browse files
Merge pull request #247 from OpenScience-Collective/develop
Release: widget footer improvements and AI disclaimer
2 parents 71a2511 + 0d70be0 commit 6a78df0

File tree

1 file changed

+68
-29
lines changed

1 file changed

+68
-29
lines changed

frontend/osa-chat-widget.js

Lines changed: 68 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@
5151
pageContextDefaultEnabled: true, // Default state of checkbox
5252
pageContextStorageKey: 'osa-page-context-enabled',
5353
pageContextLabel: 'Share page URL to help answer questions',
54+
// AI disclaimer shown above the footer
55+
disclaimerEnabled: true,
56+
disclaimerText: 'This is a multi-agent AI assistant and may make mistakes. Please verify responses.',
57+
disclaimerColor: '#9a3412',
58+
disclaimerBackground: '#fff7ed',
5459
// Fullscreen mode (for pop-out windows)
5560
fullscreen: false,
5661
// Streaming responses - enable progressive text display for better UX
@@ -696,23 +701,6 @@
696701
40% { transform: scale(1); }
697702
}
698703
699-
.osa-chat-footer {
700-
padding: 8px 16px;
701-
border-top: 1px solid var(--osa-border);
702-
text-align: center;
703-
font-size: 11px;
704-
color: var(--osa-text-light);
705-
}
706-
707-
.osa-chat-footer a {
708-
color: var(--osa-text-light);
709-
text-decoration: none;
710-
}
711-
712-
.osa-chat-footer a:hover {
713-
color: var(--osa-primary);
714-
text-decoration: underline;
715-
}
716704
717705
.osa-turnstile-container {
718706
padding: 12px 16px;
@@ -758,28 +746,69 @@
758746
border-top: 2px solid rgba(0,0,0,0.2);
759747
}
760748
761-
.osa-page-context-toggle {
749+
.osa-ai-disclaimer {
750+
padding: 4px 16px;
751+
font-size: 10px;
752+
text-align: center;
753+
border-top: 1px solid var(--osa-border);
754+
color: var(--osa-disclaimer-color, #9a3412);
755+
background: var(--osa-disclaimer-bg, #fff7ed);
756+
}
757+
758+
.osa-combined-footer {
762759
padding: 6px 16px;
763760
font-size: 11px;
764761
color: var(--osa-text-light);
765762
display: flex;
766763
align-items: center;
767-
gap: 6px;
764+
justify-content: space-between;
765+
border-top: 1px solid var(--osa-border);
766+
gap: 8px;
767+
}
768+
769+
.osa-combined-footer .osa-page-context-toggle {
770+
display: flex;
771+
align-items: center;
772+
gap: 5px;
773+
flex-shrink: 0;
774+
}
775+
776+
.osa-combined-footer .osa-page-context-toggle::after {
777+
content: '|';
778+
color: var(--osa-text-light);
779+
opacity: 0.5;
780+
margin-left: 3px;
768781
}
769782
770-
.osa-page-context-toggle input[type="checkbox"] {
783+
.osa-combined-footer input[type="checkbox"] {
771784
width: 11px;
772785
height: 11px;
773786
margin: 0;
774787
cursor: pointer;
775788
accent-color: var(--osa-primary);
776789
}
777790
778-
.osa-page-context-toggle label {
791+
.osa-combined-footer label {
779792
cursor: pointer;
780793
user-select: none;
781794
}
782795
796+
.osa-combined-footer .osa-footer-powered {
797+
text-align: right;
798+
white-space: nowrap;
799+
}
800+
801+
.osa-combined-footer .osa-footer-powered a {
802+
color: var(--osa-text-light);
803+
text-decoration: none;
804+
font-weight: 600;
805+
}
806+
807+
.osa-combined-footer .osa-footer-powered a:hover {
808+
color: var(--osa-primary);
809+
text-decoration: underline;
810+
}
811+
783812
/* Settings modal - contained within chat window to avoid z-index conflicts
784813
and ensure modal is properly scoped to the widget's stacking context */
785814
.osa-settings-overlay {
@@ -1552,6 +1581,15 @@
15521581
container.style.setProperty('--osa-primary-dark', darker);
15531582
}
15541583

1584+
// Apply disclaimer colors if configured (must be valid CSS color: hex, named, rgb, hsl)
1585+
const cssColorPattern = /^(#[0-9a-fA-F]{3,8}|[a-zA-Z]+|rgba?\([^)]+\)|hsla?\([^)]+\))$/;
1586+
if (CONFIG.disclaimerColor && cssColorPattern.test(CONFIG.disclaimerColor.trim())) {
1587+
container.style.setProperty('--osa-disclaimer-color', CONFIG.disclaimerColor.trim());
1588+
}
1589+
if (CONFIG.disclaimerBackground && cssColorPattern.test(CONFIG.disclaimerBackground.trim())) {
1590+
container.style.setProperty('--osa-disclaimer-bg', CONFIG.disclaimerBackground.trim());
1591+
}
1592+
15551593
// Update header title
15561594
const titleEl = container.querySelector('.osa-chat-title');
15571595
if (titleEl) {
@@ -1919,14 +1957,15 @@
19191957
${ICONS.send}
19201958
</button>
19211959
</div>
1922-
<div class="osa-page-context-toggle" style="display: ${CONFIG.allowPageContext ? 'flex' : 'none'}">
1923-
<input type="checkbox" id="osa-page-context-checkbox" ${pageContextEnabled ? 'checked' : ''} />
1924-
<label for="osa-page-context-checkbox">${escapeHtml(CONFIG.pageContextLabel)}</label>
1925-
</div>
1926-
<div class="osa-chat-footer">
1927-
<a href="${escapeHtml(CONFIG.repoUrl)}" target="_blank" rel="noopener noreferrer">
1928-
Powered by ${escapeHtml(CONFIG.repoName)} (osc.earth/osa)<span class="osa-version"></span>
1929-
</a>
1960+
<div class="osa-ai-disclaimer" style="display: ${CONFIG.disclaimerEnabled ? 'block' : 'none'}">${escapeHtml(CONFIG.disclaimerText || '')}</div>
1961+
<div class="osa-combined-footer">
1962+
<div class="osa-page-context-toggle" style="display: ${CONFIG.allowPageContext ? 'flex' : 'none'}">
1963+
<input type="checkbox" id="osa-page-context-checkbox" ${pageContextEnabled ? 'checked' : ''} />
1964+
<label for="osa-page-context-checkbox">${escapeHtml(CONFIG.pageContextLabel)}</label>
1965+
</div>
1966+
<div class="osa-footer-powered">
1967+
Powered by <a href="${escapeHtml(CONFIG.repoUrl)}" target="_blank" rel="noopener noreferrer">OSA</a><span class="osa-version"></span>
1968+
</div>
19301969
</div>
19311970
<div class="osa-settings-overlay">
19321971
<div class="osa-settings-modal">

0 commit comments

Comments
 (0)