[LON-CAPA-cvs] cvs: loncom /html/adm/lonDomColors default.tab /interface domainprefs.pm loncommon.pm lonpreferences.pm
raeburn
raeburn at source.lon-capa.org
Wed Apr 15 12:36:59 EDT 2026
raeburn Wed Apr 15 16:36:59 2026 EDT
Modified files:
/loncom/interface loncommon.pm domainprefs.pm lonpreferences.pm
/loncom/html/adm/lonDomColors default.tab
Log:
- WCAG 2 compliance: contrast ratio between text and background.
- Default colors for CSS classes: LC_error, LC_warning, LC_info and
LC_success now darker (compliant with white or light gray background)
- Colors can be set in domain configuration for coordinator, author, admin
or student role.
- User can override domain defaults using Preferences > Color Scheme.
-------------- next part --------------
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.1511 loncom/interface/loncommon.pm:1.1512
--- loncom/interface/loncommon.pm:1.1511 Sat Mar 28 18:10:32 2026
+++ loncom/interface/loncommon.pm Wed Apr 15 16:36:58 2026
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.1511 2026/03/28 18:10:32 raeburn Exp $
+# $Id: loncommon.pm,v 1.1512 2026/04/15 16:36:58 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -7486,6 +7486,10 @@
my $alink = &designparm($function.'.alink', $domain);
my $vlink = &designparm($function.'.vlink', $domain);
my $link = &designparm($function.'.link', $domain);
+ my $error = &designparm($function.'.error', $domain);
+ my $warning= &designparm($function.'.warning', $domain);
+ my $success= &designparm($function.'.success', $domain);
+ my $info = &designparm($function.'.info', $domain);
my $sans = 'Verdana,Arial,Helvetica,sans-serif';
my $mono = 'monospace';
@@ -7668,21 +7672,27 @@
}
.LC_error {
- color: red;
+ color: $error;
}
.LC_warning {
- color: darkorange;
+ color: $warning;
}
.LC_diff_removed {
- color: red;
+ color: #800020;
}
-.LC_info,
-.LC_success,
.LC_diff_added {
- color: green;
+ color: #006400;
+}
+
+.LC_info {
+ color: $info;
+}
+
+.LC_success {
+ color: $success;
}
div.LC_confirm_box {
Index: loncom/interface/domainprefs.pm
diff -u loncom/interface/domainprefs.pm:1.457 loncom/interface/domainprefs.pm:1.458
--- loncom/interface/domainprefs.pm:1.457 Sat Mar 28 18:10:32 2026
+++ loncom/interface/domainprefs.pm Wed Apr 15 16:36:58 2026
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set domain-wide configuration settings
#
-# $Id: domainprefs.pm,v 1.457 2026/03/28 18:10:32 raeburn Exp $
+# $Id: domainprefs.pm,v 1.458 2026/04/15 16:36:58 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -2022,12 +2022,13 @@
my %choices = &color_font_choices();
my @bgs = ('pgbg','tabbg','sidebg');
my @links = ('link','alink','vlink');
+ my @alerts = ('error','warning','info','success');
my @images = ();
my %alt_text = &Apache::lonlocal::texthash(img => "Banner for $role role");
my %designhash = &Apache::loncommon::get_domainconf($dom);
my %defaultdesign = %Apache::loncommon::defaultdesign;
my (%is_custom,%designs);
- my %defaults = &role_defaults($role,\@bgs,\@links,\@images);
+ my %defaults = &role_defaults($role,\@bgs,\@links,\@images,\@alerts);
if (ref($settings) eq 'HASH') {
if (ref($settings->{$role}) eq 'HASH') {
if ($settings->{$role}->{'font'} ne '') {
@@ -2050,6 +2051,12 @@
$is_custom{$item} = 1;
}
}
+ foreach my $item (@alerts) {
+ if ($settings->{$role}->{$item} ne '') {
+ $designs{'alerts'}{$item} = $settings->{$role}->{$item};
+ $is_custom{$item} = 1;
+ }
+ }
}
} else {
if ($designhash{$dom.'.'.$role.'.fontmenu'} ne '') {
@@ -2064,7 +2071,6 @@
if ($designhash{$dom.'.'.$role.'.'.$item} ne '') {
$designs{'bgs'}{$item} = $designhash{$dom.'.'.$role.'.'.$item};
$is_custom{$item} = 1;
-
}
}
foreach my $item (@links) {
@@ -2073,15 +2079,21 @@
$is_custom{$item} = 1;
}
}
+ foreach my $item (@alerts) {
+ if ($designhash{$dom.'.'.$role.'.'.$item} ne '') {
+ $designs{'alerts'}{$item} = $designhash{$dom.'.'.$role.'.'.$item};
+ $is_custom{$item} = 1;
+ }
+ }
}
my $itemcount = 1;
- my $datatable = &display_color_options($dom,$confname,$phase,$role,$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal);
+ my $datatable = &display_color_options($dom,$confname,$phase,$role,$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,'',\@alerts);
$datatable .= '</tr></table></td></tr>';
return $datatable;
}
sub role_defaults {
- my ($role,$bgs,$links,$images,$logintext) = @_;
+ my ($role,$bgs,$links,$images,$alerts,$logintext) = @_;
my %defaults;
unless ((ref($bgs) eq 'ARRAY') && (ref($links) eq 'ARRAY') && (ref($images) eq 'ARRAY')) {
return %defaults;
@@ -2104,6 +2116,11 @@
font => $defaultdesign{$role.'.font'},
fontmenu => $defaultdesign{$role.'.fontmenu'},
);
+ if (ref($alerts) eq 'ARRAY') {
+ foreach my $item (@{$alerts}) {
+ $defaults{'alerts'}{$item} = $defaultdesign{$role.'.'.$item};
+ }
+ }
}
foreach my $item (@{$bgs}) {
$defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};
@@ -2119,7 +2136,7 @@
sub display_color_options {
my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,
- $images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_;
+ $images,$bgs,$links,$alt_text,$rowtotal,$logintext,$alerts) = @_;
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
my $css_class = $itemcount%2?' class="LC_odd_row"':'';
my $datatable = '<tr'.$css_class.'>'.
@@ -2324,6 +2341,34 @@
$datatable .= '<br /><input type="text" size="8" class="colorchooser" name="'.$role.'_'.$item.'" value="'.$color.
'" /></td>';
}
+ $datatable .= '</tr></table></td></tr>';
+ $itemcount ++;
+ $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ $datatable .= '<tr'.$css_class.'>'.
+ '<td>'.$choices->{'alerts'}.'</td>';
+ my $alerts_def;
+ foreach my $item (@{$alerts}) {
+ if (!$is_custom->{$item}) {
+ $alerts_def .= '<td>'.$choices->{$item}.'<br /><span class="css_default_'.$role.'_'.$item.'" style="color: '.$defaults->{'alerts'}{$item}.';">'.$defaults->{'alerts'}{$item}.'</span></td>';
+ }
+ }
+ if ($alerts_def) {
+ $datatable .= '<td>'.&mt('Default(s) in use:').'<br /><table border="0"><tr>'.$alerts_def.'</tr></table></td>';
+ } else {
+ $datatable .= '<td> </td>';
+ }
+ $datatable .= '<td class="LC_right_item">'.
+ '<table border="0"><tr>';
+ foreach my $item (@{$alerts}) {
+ my $color = $designs->{'alerts'}{$item} ? $designs->{'alerts'}{$item} : $defaults->{'alerts'}{$item};
+ $datatable .= '<td style="text-align: center">'.$choices->{$item}."\n";
+ if ($designs->{'alerts'}{$item}) {
+ $datatable.=' ';
+ }
+ $datatable .= '<br /><input type="text" size="8" class="colorchooser" name="'.$role.'_'.$item.'" value="'.$color.
+ '" /></td>';
+ }
+ $itemcount ++;
$$rowtotal += $itemcount;
return $datatable;
}
@@ -13194,6 +13239,7 @@
bgs => "Background colors",
links => "Link colors",
images => "Images",
+ alerts => "Alerts",
font => "Font color",
fontmenu => "Font menu",
pgbg => "Page",
@@ -13202,6 +13248,10 @@
link => "Link",
alink => "Active link",
vlink => "Visited link",
+ info => "Info",
+ warning => "Warning",
+ error => "Error",
+ success => "Success",
);
return %choices;
}
@@ -13768,10 +13818,8 @@
sub modify_colors {
my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_;
my (%changes,%choices);
- my @bgs;
+ my (@bgs, at logintext, at images, at alerts);
my @links = ('link','alink','vlink');
- my @logintext;
- my @images;
my $servadm = $r->dir_config('lonAdmEMail');
my $errors;
my %defaults;
@@ -13779,17 +13827,16 @@
if ($role eq 'login') {
%choices = &login_choices();
@logintext = ('textcol','bgcol');
- } else {
- %choices = &color_font_choices();
- }
- if ($role eq 'login') {
@images = ('img','logo','domlogo','login');
@bgs = ('pgbg','mainbg','sidebg');
+ @alerts = ();
} else {
+ %choices = &color_font_choices();
@images = ();
@bgs = ('pgbg','tabbg','sidebg');
+ @alerts = ('error','warning','info','success');
}
- my %defaults = &role_defaults($role,\@bgs,\@links,\@images,\@logintext);
+ my %defaults = &role_defaults($role,\@bgs,\@links,\@images,\@alerts,\@logintext);
$env{'form.'.$role.'_font'} = lc($env{'form.'.$role.'_font'});
if ($env{'form.'.$role.'_font'} =~ /^\w+/) {
$env{'form.'.$role.'_font'} = '#'.$env{'form.'.$role.'_font'};
@@ -13834,6 +13881,15 @@
$confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
}
}
+ foreach my $item (@alerts) {
+ $env{'form.'.$role.'_'.$item} = lc($env{'form.'.$role.'_'.$item});
+ if ($env{'form.'.$role.'_'.$item} =~ /^\w+/) {
+ $env{'form.'.$role.'_'.$item} = '#'.$env{'form.'.$role.'_'.$item};
+ }
+ unless ($env{'form.'.$role.'_'.$item} eq lc($defaults{'alerts'}{$item})) {
+ $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
+ }
+ }
my ($configuserok,$author_ok,$switchserver) =
&config_check($dom,$confname,$servadm);
my ($width,$height) = &thumb_dimensions();
@@ -13979,6 +14035,17 @@
$changes{$role}{'fontmenu'} = 1;
}
}
+ foreach my $item (@alerts) {
+ if ($domconfig->{$role}{$item} ne '') {
+ if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {
+ $changes{$role}{'alerts'}{$item} = 1;
+ }
+ } else {
+ if ($confhash->{$role}{$item}) {
+ $changes{$role}{'alerts'}{$item} = 1;
+ }
+ }
+ }
}
foreach my $item (@bgs) {
if ($domconfig->{$role}{$item} ne '') {
@@ -14015,11 +14082,11 @@
}
} else {
&default_change_checker($role,\@images,\@links,\@bgs,
- \@logintext,$confhash,\%changes);
+ \@logintext,\@alerts,$confhash,\%changes);
}
} else {
&default_change_checker($role,\@images,\@links,\@bgs,
- \@logintext,$confhash,\%changes);
+ \@logintext,\@alerts,$confhash,\%changes);
}
}
return ($errors,%changes);
@@ -14041,7 +14108,7 @@
}
sub default_change_checker {
- my ($role,$images,$links,$bgs,$logintext,$confhash,$changes) = @_;
+ my ($role,$images,$links,$bgs,$logintext,$alerts,$confhash,$changes) = @_;
foreach my $item (@{$links}) {
if ($confhash->{$role}{$item}) {
$changes->{$role}{'links'}{$item} = 1;
Index: loncom/interface/lonpreferences.pm
diff -u loncom/interface/lonpreferences.pm:1.252 loncom/interface/lonpreferences.pm:1.253
--- loncom/interface/lonpreferences.pm:1.252 Wed Apr 15 03:51:50 2026
+++ loncom/interface/lonpreferences.pm Wed Apr 15 16:36:58 2026
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Preferences
#
-# $Id: lonpreferences.pm,v 1.252 2026/04/15 03:51:50 raeburn Exp $
+# $Id: lonpreferences.pm,v 1.253 2026/04/15 16:36:58 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -1217,23 +1217,15 @@
# figure out colors
my $function=&Apache::loncommon::get_users_function();
my $domain=&Apache::loncommon::determinedomain();
- my %colortypes=&Apache::lonlocal::texthash(
- 'pgbg' => 'Page Background Color',
- 'tabbg' => 'Header Background Color',
- 'sidebg' => 'Header Border Color',
- 'font' => 'Font Color',
- 'fontmenu' => 'Font Menu Color',
- 'link' => 'Un-Visited Link Color',
- 'vlink' => 'Visited Link Color',
- 'alink' => 'Active Link Color',
- );
+ my %colortypes=&colortypes();
+ my @order = qw( pgbg tabbg sidebg font link vlink alink error warning info success );
my $start_data_table = &Apache::loncommon::start_data_table().
&Apache::loncommon::data_table_caption(&mt('Colors for LON-CAPA pages')).
&Apache::loncommon::start_data_table_header_row().
'<th>'.&mt('Page Element').'</th><th>'.&mt('Color').'</th>'.
&Apache::loncommon::end_data_table_header_row();
my $chtable='';
- foreach my $item (sort(keys(%colortypes))) {
+ foreach my $item (@order) {
my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain);
$chtable.=&Apache::loncommon::start_data_table_row().
'<td><label for="'.$item.'">'.$colortypes{$item}.'</label></td>'.
@@ -1280,19 +1272,11 @@
# figure out colors
my $function=&Apache::loncommon::get_users_function();
my $domain=&Apache::loncommon::determinedomain();
- my %colortypes=&Apache::lonlocal::texthash(
- 'pgbg' => 'Page Background Color',
- 'tabbg' => 'Header Background Color',
- 'sidebg' => 'Header Border Color',
- 'font' => 'Font Color',
- 'fontmenu' => 'Font Menu Color',
- 'link' => 'Un-Visited Link Color',
- 'vlink' => 'Visited Link Color',
- 'alink' => 'Active Link Color',
- );
+ my %colortypes=&colortypes();
my $message='';
- foreach my $item (keys(%colortypes)) {
+ my @order = qw( pgbg tabbg sidebg font link vlink alink error warning info success );
+ foreach my $item (@order) {
my $color=$env{'form.'.$item};
if (!($color =~ /^#/)) {
$color = '#' . $color;
@@ -1319,6 +1303,23 @@
&print_main_menu($r, $message);
}
+sub colortypes {
+ return &Apache::lonlocal::texthash(
+ 'pgbg' => 'Page Background Color',
+ 'tabbg' => 'Header Background Color',
+ 'sidebg' => 'Header Border Color',
+ 'font' => 'Font Color',
+ 'fontmenu' => 'Font Menu Color',
+ 'link' => 'Un-Visited Link Color',
+ 'vlink' => 'Visited Link Color',
+ 'alink' => 'Active Link Color',
+ 'error' => 'Color for Error Message',
+ 'warning' => 'Color for Warning Message',
+ 'info' => 'Color for Informational Message',
+ 'success' => 'Color for Successful Action Message',
+ );
+}
+
######################################################
# password handler subroutines #
######################################################
Index: loncom/html/adm/lonDomColors/default.tab
diff -u loncom/html/adm/lonDomColors/default.tab:1.20 loncom/html/adm/lonDomColors/default.tab:1.21
--- loncom/html/adm/lonDomColors/default.tab:1.20 Fri May 21 15:54:39 2010
+++ loncom/html/adm/lonDomColors/default.tab Wed Apr 15 16:36:59 2026
@@ -19,6 +19,10 @@
admin.link=#663300
admin.vlink=#666600
admin.alink=#CC0000
+admin.error=#C30000
+admin.warning=#8F4F00
+admin.info=#1A6B1A
+admin.success=#336B05
coordinator.img=/adm/lonInterFace/coordinator.jpg
coordinator.pgbg=#FFFFFF
coordinator.tabbg=#A1D676
@@ -28,6 +32,10 @@
coordinator.link=#003333
coordinator.vlink=#3b6f33
coordinator.alink=#CC0000
+coordinator.error=#C30000
+coordinator.warning=#8F4F00
+coordinator.info=#1A6B1A
+coordinator.success=#336B05
author.img=/adm/lonInterFace/author.jpg
author.pgbg=#FFFFFF
author.tabbg=#B8E5B8
@@ -37,6 +45,10 @@
author.link=#003333
author.vlink=#006666
author.alink=#CC0000
+author.error=#C30000
+author.warning=#8F4F00
+author.info=#1A6B1A
+author.success=#336B05
student.img=/adm/lonInterFace/student.jpg
student.pgbg=#FFFFFF
student.tabbg=#77B7F8
@@ -46,6 +58,10 @@
student.link=#003366
student.vlink=#2D5896
student.alink=#CC0000
+student.error=#C30000
+student.warning=#8F4F00
+student.info=#1A6B1A
+student.success=#336B05
norole.img=/adm/lonInterFace/student.jpg
norole.pgbg=#FFFFFF
norole.tabbg=#DAE0E5
@@ -55,3 +71,7 @@
norole.link=#993300
norole.vlink=#996600
norole.alink=#CC0000
+norole.error=#C30000
+norole.warning=#8F4F00
+norole.info=#1A6B1A
+norole.success=#336B05
More information about the LON-CAPA-cvs
mailing list