[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