--- loncom/interface/loncommon.pm	2025/02/21 06:09:36	1.1461
+++ loncom/interface/loncommon.pm	2025/03/17 00:25:51	1.1470
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1461 2025/02/21 06:09:36 raeburn Exp $
+# $Id: loncommon.pm,v 1.1470 2025/03/17 00:25:51 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -966,7 +966,9 @@ ENDSCRT
 
 sub select_timezone {
    my ($name,$selected,$onchange,$includeempty,$id,$disabled)=@_;
-   my $output='<select name="'.$name.'" '.$id.$onchange.$disabled.'>'."\n";
+   my $labeltext = &HTML::Entities::encode(&mt('Select Time Zone'));
+   my $output='<select name="'.$name.'" '.$id.$onchange.$disabled.
+              ' aria-label="'.$labeltext.'">'."\n";
    if ($includeempty) {
        $output .= '<option value=""';
        if (($selected eq '') || ($selected eq 'local')) {
@@ -1351,7 +1353,7 @@ sub help_open_topic {
     }
     $template.=' <a'.$target.' href="'.$link.'" title="'.$title.'">'
               .'<img src="'.$helpicon.'" border="0"'
-              .' alt="'.&mt('Help: [_1]',$topic).'"'
+              .' alt="'.&mt('Help icon').'"'
               .' title="'.$title.'" style="vertical-align:middle;"'.$imgid 
               .' /></a>';
     if ($text ne "") {	
@@ -7359,6 +7361,10 @@ form, .inline {
   text-align:right;
 }
 
+.LC_left {
+  text-align:left;
+}
+
 .LC_center {
   text-align:center;
 }
@@ -7506,9 +7512,10 @@ div.LC_confirm_box .LC_success img {
   padding: 4px;
 }
 
-table.LC_pastsubmission {
+.LC_pastsubmission {
   border: 1px solid black;
   margin: 2px;
+  padding: 2px;
 }
 
 table#LC_menubuttons {
@@ -7762,6 +7769,12 @@ table.LC_nested tr.LC_empty_row td {
 table.LC_caption {
 }
 
+caption.LC_caption_prefs {
+  font-weight: normal;
+  text-align: left;
+  padding-bottom: 0.8em;
+}
+
 table.LC_nested tr.LC_empty_row td {
   padding: 4ex
 }
@@ -7932,6 +7945,10 @@ table.LC_data_table tr > td.LC_roles_sel
   border-right: 8px solid #11CC55;
 }
 
+table.LC_data_table tr.LC_prefs_row {
+   line-height: 250%;
+}
+
 span.LC_current_location {
   font-size:larger;
   background: $pgbg;
@@ -8296,12 +8313,27 @@ table.LC_prior_tries td {
   padding: 6px;
 }
 
-.LC_prob_status {
-  margin-top: 5px;
-  padding-top: 0;
-  padding-left: 0;
-  padding-bottom: 0;
-  padding-right: 5px;
+span.LC_prob_status {
+  margin: 5px 0 0 0;
+  padding: 0 5px 0 0;
+  vertical-align: middle;
+}
+
+div.LC_prob_status_outer {
+  display: inline-block;
+  margin: -5px 0 0 0;
+  padding: 0;
+}
+
+div.LC_prob_status_inner {
+  display: inline-block;
+  margin: 0 5px 0 0;
+  padding: 5px;
+}
+
+caption.LC_filesub_status {
+  text-align: left;
+  font-weight: bold;
 }
 
 .LC_mail_actions {
@@ -9360,13 +9392,39 @@ pre.LC_wordwrap {
 /*
   styles used for response display
 */
-div.LC_radiofoil, div.LC_rankfoil {
+div.LC_radiofoil, div.LC_rankfoil, div.LC_optionfoil, div.LC_matchfoil, div.LC_login_links {
   margin: .5em 0em .5em 0em;
 }
 table.LC_itemgroup {
   margin-top: 1em;
 }
 
+table.LC_itemgroup tr th {
+  font-weight: normal;
+}
+
+fieldset.LC_webbubbles {
+  margin: 2px 0 0 0;
+  padding: 0;
+  border: 0;
+}
+
+ul.LC_webbubbles {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+  text-align: left;
+  float: left;
+}
+
+ul.LC_webbubbles li {
+  line-height: 1.8em;
+  border: 1px solid black;
+  padding: 0 2px 0 5px;
+  margin: 0 0 0 -1px;
+  float: left;
+}
+
 /*
   styles used by TTH when "Default set of options to pass to tth/m
   when converting TeX" in course settings has been set
@@ -10863,6 +10921,11 @@ sub simple_error_page {
         return;
     }
 
+    sub set_data_table_count {
+        my ($count) = @_;
+        unshift(@row_count,$count);
+    }
+
     sub start_data_table {
 	my ($add_class,$id) = @_;
 	my $css_class = (join(' ','LC_data_table',$add_class));
@@ -10910,7 +10973,11 @@ sub simple_error_page {
     }
 
     sub start_data_table_header_row {
-	return  '<tr class="LC_header_row">'."\n";;
+	my ($add_class,$id) = @_;
+	my $css_class = 'LC_header_row';
+	$css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
+	$id = (' id="'.$id.'"') unless ($id eq '');
+	return '<tr class="'.$css_class.'"'.$id.'>'."\n";
     }
 
     sub end_data_table_header_row {
@@ -10918,8 +10985,8 @@ sub simple_error_page {
     }
 
     sub data_table_caption {
-        my $caption = shift;
-        return "<caption class=\"LC_caption\">$caption</caption>";
+        my ($caption,$css_class) = @_;
+        return "<caption class=\"LC_caption $css_class\">$caption</caption>";
     }
 }
 
@@ -19037,7 +19104,7 @@ Returns: HTML to display with informatio
 sub check_release_result {
     my ($switchwarning,$switchserver) = @_;
     my $output = &start_page('Selected course unavailable on this server').
-                 '<p class="LC_warning">';
+                 '<div class="LC_landmark" role="main"><p class="LC_warning">';
     if ($switchwarning) {
         $output .= $switchwarning.'<br /><a href="/adm/roles">';
         if (&show_course()) {
@@ -19053,7 +19120,7 @@ sub check_release_result {
                    &mt('Switch Server').
                    '</a>';
     }
-    $output .= '</p>'.&end_page();
+    $output .= '</p></div>'.&end_page();
     return $output;
 }
 
@@ -19670,7 +19737,7 @@ sub create_captcha {
             $output = '<input type="hidden" name="crypt" value="'.$md5sum.'" />'."\n".
                       '<span class="LC_nobreak">'.
                       '<label>'.&mt('Type in the letters/numbers shown below').'&nbsp;'.
-                      '<input type="text" size="5" name="code" value="" autocomplete="new-password" />'.
+                      '<input type="text" size="5" name="code" value="" autocomplete="new-password" aria-required="true" />'.
                       '</label></span><br />'.
                       '<img src="'.$captcha_params{'www_output_dir'}.'/'.$md5sum.'.png" alt="captcha" />';
             last;