[LON-CAPA-cvs] cvs: loncom /interface loncommon.pm lonhtmlcommon.pm lonparmset.pm

raeburn raeburn at source.lon-capa.org
Mon Apr 27 22:36:03 EDT 2026


raeburn		Tue Apr 28 02:36:03 2026 EDT

  Modified files:              
    /loncom/interface	lonparmset.pm loncommon.pm lonhtmlcommon.pm 
  Log:
  - WCAG 2.2 compliance
    - Include labels for form elements.
    - Satisfy minimum spacing between touch targets.
    - Use <th> tags for column headings and row headings in data table
      with scope="row" attribute for latter.
    - For form elements in data table cells use aria-labelledby to reference 
      appropriate column and row headers.
    - Group form elements in fieldset with legend for screenreaders.
    - Contrast ratio of at least 4.5:1 for normal text.
    - Replace use of <table> with <div> for layout.
    - Sequential headings.
  
  
-------------- next part --------------
Index: loncom/interface/lonparmset.pm
diff -u loncom/interface/lonparmset.pm:1.635 loncom/interface/lonparmset.pm:1.636
--- loncom/interface/lonparmset.pm:1.635	Mon Apr 27 03:56:16 2026
+++ loncom/interface/lonparmset.pm	Tue Apr 28 02:36:03 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set parameters for assessments
 #
-# $Id: lonparmset.pm,v 1.635 2026/04/27 03:56:16 raeburn Exp $
+# $Id: lonparmset.pm,v 1.636 2026/04/28 02:36:03 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -686,20 +686,23 @@
 # @param {integer} $checkdate - the date to check.
 # @returns {string} - HTML possibly containing a localized warning message.
 sub date_sanity_info {
-   my $checkdate=shift;
+   my ($checkdate,$css_class) = @_;
    unless ($checkdate) { return ''; }
    my $result='';
+   if ($css_class eq '') {
+       $css_class = 'LC_warning';
+   }
    my $crsprefix='course.'.$env{'request.course.id'}.'.';
    if ($env{$crsprefix.'default_enrollment_end_date'}) {
       if ($checkdate>$env{$crsprefix.'default_enrollment_end_date'}) {
-         $result.='<div class="LC_warning">'
+         $result.='<div class="'.$css_class.'" style="margin-bottom: 0;">'
                  .&mt('After course enrollment end!')
                  .'</div>';
       }
    }
    if ($env{$crsprefix.'default_enrollment_start_date'}) {
       if ($checkdate<$env{$crsprefix.'default_enrollment_start_date'}) {
-         $result.='<div class="LC_warning">'
+         $result.='<div class="'.$css_class.'" style="margin-bottom: 0;">'
                  .&mt('Before course enrollment start!')
                  .'</div>';
       }
@@ -971,25 +974,58 @@
 }
 
 
-# Returns HTML with the value of the given parameter,
-# using a readable format for dates, and
-# a warning if there is a problem with a date.
+# Returns either a scalar, or an array when called in array context.
+#
+# In an array first element contains HTML with the value of the given parameter,
+# using a readable format for dates, and the second element contains HTML for a
+# warning if there is a problem with a date.
+#
+# In scalar context, the two pieces of HTML (value and warning) are concatenated
+# into a single string, which is then returned.
+#
 # Used by table mode.
 # Returns HTML for the editmap.png image if no value is defined and $editable is true.
 #
 # @param {string} $value - the parameter value
 # @param {string} $type - the parameter type
-# @param {boolean} $editable - Set to true to get an icon when no value is defined.
+# @param {boolean} $editable - Set to true to get an icon when no value is defined
+# @param {string} $parmname - short name of parameter (optional)
+# @param {string} $parmlev - numerical parameter level between 1 and 18 (optional)
+# @param {string} $alertclass - CSS class for warning included when
+# there is a problem with a date (optional).
 sub valout {
-    my ($value,$type,$editable)=@_;
+    my ($value,$type,$editable,$parmname,$parmlev,$alertclass)=@_;
     my $result = '';
+    my $alert = '';
     # Values of zero are valid.
     if (! $value && $value ne '0') {
         if ($editable) {
+            my %levels = &Apache::lonlocal::texthash (
+                18 => 'General course',
+                17 => 'Map or Folder level in course (recursive)',
+                16 => 'Map or Folder level in course (non-recursive)',
+                15 => 'Resource default',
+                14 => 'Map default',
+                13 => 'Resource level in course',
+                12 => 'General for section',
+                11 => 'Map or Folder level for section (recursive)',
+                10 => 'Map or Folder level for section (non-recursive)',
+                9  => 'Resource level in section',
+                8  => 'General for group',
+                7  => 'Map or Folder level for group (recursive)',
+                6  => 'Map or Folder level for group (non-recursive)',
+                5  => 'Resource level in group',
+                4  => 'General for specific student',
+                3  => 'Map or Folder level for specific student (recursive)',
+                2  => 'Map or Folder level for specific student (non-recursive)',
+                1  => 'Resource level for specific student',
+            );
             $result =
                 '<img src="/res/adm/pages/editmap.png"'
                .' alt="'.&mt('Change').'"'
-               .' title="'.&mt('Change').'" style="border:0;" />';
+               .' title="'
+               .&mt('Set \'[_1]\' -- [_2]',$parmname,$levels{$parmlev})
+               .'" style="border:0;" />';
         } else {
             $result=' ';
         }
@@ -1037,15 +1073,19 @@
                 }
             }
         } elsif (&isdateparm($type)) {
-            $result = &Apache::lonlocal::locallocaltime($value).
-                &date_sanity_info($value);
+            $result = &Apache::lonlocal::locallocaltime($value);
+            $alert = &date_sanity_info($value,$alertclass);
         } else {
             $result = $value;
             $result=~s/\,/\, /gs;
             $result = &HTML::Entities::encode($result,'"<>&');
         }
     }
-    return $result;
+    if (wantarray) {
+        return ($result,$alert);
+    } else {
+        return $result.$alert;
+    }
 }
 
 sub interval_to_humanstr {
@@ -1133,21 +1173,30 @@
         }
     }
     my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
+    my @extra;
+    if ($value eq '') {
+        my $parmlev = (split(/\&/,$marker))[2];
+        @extra = ($parmname,$parmlev);
+    }
     my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
     unless (defined($winvalue)) { $winvalue=$val; }
-    my $valout = &valout($value,$type,1);
+    my ($valout,$alert) = &valout($value,$type,1, at extra);
     my $unencmarker = $marker;
     foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
               \$hour, \$min, \$sec, \$extra) {
         $$item = &HTML::Entities::encode($$item,'"<>&');
         $$item =~ s/\'/\\\'/g;
     }
-    return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.
-    '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
-        .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."','".$extra."'".');">'.
-        $valout.'</a></td></tr>'.($recursive?'<tr><td align="center" class="LC_parm_recursive">'.
-                                              &mt('recursive').'</td></tr>' : '').'</table>';
-
+    my $valsty;
+    unless ($alert || $recursive) {
+        $valsty = ' style="line-height: 180%;"';
+    }
+    return '<span'.$valsty.'><a name="'.$unencmarker.'" />'
+          .'<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
+          .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."','".$extra."'".');">'
+          .$valout.'</a></span>'.$alert.($recursive?'<br style="line-height: 50%;"/>'
+          .'<span class="LC_parm_recursive">'
+          .&mt('recursive').'</span>' : '');
 }
 
 # Javascript for table mode.
@@ -1958,7 +2007,7 @@
                 $advice = &mt('Use Resource Assembly Tool to set this.');
             }
         }
-        $parm .= '<br /><span class="LC_fontsize_small LC_cusr_emph">'.$advice.'</span>';
+        $parm .= '<br /><span class="LC_fontsize_medium LC_cusr_emph">'.$advice.'</span>';
     }
     $r->print('<td>'.$parm.'</td>');
 
@@ -2154,8 +2203,8 @@
         }
         my ($parmname)=($thismarker=~/\_([^\_]+)$/);
         $effective_parm = &valout($recursinfo->[0],$recursinfo->[1]);
-        $r->print('<td style="background-color:#CCCCFF;" align="center">'.$effective_parm.
-                  '<br /><span class="LC_parm_recursive">'.$rectitle.' '.
+        $r->print('<td style="background-color:#D6D6FF;" align="center">'.$effective_parm.
+                  '<br style="line-height: 50%;" /><span class="LC_parm_recursive">'.$rectitle.' '.
                   $effparm_level.'</span></td>');
     } else {
         if ($result) {
@@ -2164,9 +2213,10 @@
         if ($eff_groupparm) {
             $effective_parm = $eff_groupparm;
         }
-        $r->print('<td style="background-color:#CCCCFF;" align="center">'.$effective_parm.
-                  ($effparm_rec?'<br /><span class="LC_parm_recursive">'.&mt('recursive').
-                                '</span>':'').'</td>');
+        $r->print('<td style="background-color:#D6D6FF;" align="center">'.$effective_parm.
+                  ($effparm_rec?'<br style="line-height: 50%;" />'
+                               .'<span class="LC_parm_recursive">'.&mt('recursive')
+                               .'</span>':'').'</td>');
     }
     if ($parmlev eq 'full') {
         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
@@ -2175,8 +2225,8 @@
         if (!defined($sessionvaltype)) {
             $sessionvaltype=$$defaulttype{$which};
         }
-        $r->print('<td style="background-color:#999999;" align="center"><font color="#FFFFFF">'.
-                  &valout($sessionval,$sessionvaltype).' '.
+        $r->print('<td style="background-color:#707070;" align="center"><font color="#FFFFFF">'.
+                  &valout($sessionval,$sessionvaltype,'','','','LC_session_parm_alert').' '.
                   '</font></td>');
     }
     $r->print('</tr>');
@@ -2254,7 +2304,6 @@
         }
     }
     if ($nolink) {
-        my ($parmname)=((split(/\&/,$mprefix))[1]=~/\_([^\_]+)$/);
         $r->print(&valout($currval,$currtype));
     } else {
         $r->print(&plink($currtype,
@@ -2796,8 +2845,8 @@
     foreach my $key (sort { $category_order{$a} <=> $category_order{$b} } keys(%categoryList)) {
         next if (@{$categoryList{$key}} == 0);
         next if ($key eq '');
-        $r->print('<div class="LC_Box LC_400Box">'
-                 .'<h4 class="LC_hcell">'.&mt($categories{$key}).'</h4>'."\n");
+        $r->print('<div class="LC_Box LC_400Box" style="line-height: 185%;">'
+                 .'<h3 class="LC_hcell LC_heading_3">'.&mt($categories{$key}).'</h3>'."\n");
         foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {
             next if ($tempkey eq '');
             $r->print('<span class="LC_nobreak">'
@@ -2864,7 +2913,7 @@
         $selsize = 8;
     }
 
-    $r->print('<select multiple="multiple" name="psprt" size="'.$selsize.'">');
+    $r->print('<select multiple="multiple" name="psprt" size="'.$selsize.'" id="psprt">');
     $r->print('<option value="all"');
     $r->print(' selected="selected"') unless (@{$psprt}); # useless, the array is never empty
     $r->print('>'.&mt('All Parts').'</option>');
@@ -2898,7 +2947,7 @@
 # @param {string} $pssymb - resource symb (when a single resource is selected)
 sub usermenu {
     my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups,$pssymb)=@_;
-    my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
+    my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom','','','','','','','udom').' '.
                   &Apache::loncommon::selectstudent_link('parmform','uname','udom','condition').
                   &Apache::lonhtmlcommon::scripttag(<<ENDJS);
 function setCourseadv(form,caller) {
@@ -2924,12 +2973,17 @@
     } else {
         $stuonly = &mt('student only');
     }
-    $chooseopt .= '<br /><span class="LC_cusr_subheading">'.
-                  &mt("User's role").': '.
+    $chooseopt .= '<br />'.
+                  '<fieldset class="LC_borderless" style="margin-top: 6px;">'.
+                  '<legend class="LC_visually_hidden">'.&mt("User's role").'</legend>'.
+                  '<span class="LC_cusr_subheading">'.
+                  '<span aria-hidden="true">'.
+                  &mt("User's role").': </span>'.
                   '<label><input type="radio" name="userroles" value="st"'.$chkroles{'st'}.' onclick="setCourseadv(this.form,this);" />'.
                   $stuonly.'</label>  '.
                   '<label><input type="radio" name="userroles" value="any"'.$chkroles{'any'}.' onclick="setCourseadv(this.form,this);" />'.
-                  &mt('any role').'</label><input type="hidden" id="courseadv" name="courseadv" value="'.$courseadv.'" /></span>';
+                  &mt('any role').'</label><input type="hidden" id="courseadv" name="courseadv" value="'.$courseadv.'" /></span>'.
+                  '</fieldset>';
     my $sections='';
     my %sectionhash = &Apache::loncommon::get_sections();
 
@@ -2951,7 +3005,7 @@
             $sections .= ';'.(' ' x2);
         }
     } elsif (%sectionhash && $currsec eq '') {
-        $sections=&mt('Section:').' <select name="csec"';
+        $sections='<label>'.&mt('Section:').' <select name="csec"';
         if (%grouphash && $parmlev ne 'full') {
             $sections .= qq| onchange="group_or_section('csec')" |;
         }
@@ -2961,7 +3015,7 @@
         ($section eq $csec?'selected="selected"':'').'>'.$section.
                                                               '</option>';
         }
-        $sections.='</select>';
+        $sections.='</select></label>';
     }
 
     if (%sectionhash && %grouphash && $parmlev ne 'full' && $currsec eq '') {
@@ -2996,7 +3050,7 @@
     }
 
     if (%grouphash) {
-        $groups=&mt('Group').': <select name="cgroup"';
+        $groups='<label>'.&mt('Group').': <select name="cgroup"';
         if (%sectionhash && $env{'form.action'} eq 'settable' && $currsec eq '') {
             $groups .= qq| onchange="group_or_section('cgroup')" |;
         }
@@ -3016,7 +3070,7 @@
             }
             $groups .= '>'.$grp.'</option>';
         }
-        $groups.='</select>';
+        $groups.='</select></label>';
     }
 
     if (%sectionhash || %grouphash) {
@@ -3028,10 +3082,12 @@
     }
 
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('User')));
-    $r->print(&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'
-                 ,'<input type="text" value="'.$uname.'" size="12" name="uname" />'
-                 ,'<input type="text" value="'.$id.'" size="12" name="id" /> '
-                 ,$chooseopt));
+    $r->print(&mt('For [_1]User [_2] or [_1]Student/Employee ID [_3] at [_4]Domain [_5]'
+                 ,'<label>',
+                 ,'<input type="text" value="'.$uname.'" size="12" name="uname" /></label>'
+                 ,'<input type="text" value="'.$id.'" size="12" name="id" /></label> '
+                 ,'<label for="udom">'
+                 ,'</label>'.$chooseopt));
 }
 
 # Prints HTML to select parameters from a list of all parameters.
@@ -3138,7 +3194,14 @@
         );
 
         $r->print(&Apache::loncommon::start_scrollbox('700px','680px','400px','mapmenuscroll'));
+        $r->print('<fieldset class="LC_borderless">'
+                 .'<legend class="LC_visually_hidden">'
+                 .&mt('Select Enclosing Map or Folder')
+                 .'</legend>');
         $r->print(&Apache::loncommon::start_data_table(undef,'mapmenuinner'));
+        $r->print(&Apache::loncommon::start_data_table_header_row('LC_visually_hidden')
+                 .'<th>'.&mt('Folders').'</th>'
+                 .&Apache::loncommon::end_data_table_header_row()."\n");
 
         # Display row: "All Maps or Folders"
         $r->print(
@@ -3194,12 +3257,12 @@
             $r->print(
                 &Apache::loncommon::start_data_table_row()
                .'<td>'
-               .'<label>'
             );
             # Only offer radio button for folders/maps which can be parameterized
             if ($allmaps_inverted{$symb_name}) {
                 $r->print(
-                    '<input type ="radio" name="pschp"'
+                    '<label>'
+                   .'<input type ="radio" name="pschp"'
                    .' value="'.$allmaps_inverted{$symb_name}.'"'
                 );
                 $r->print(' checked="checked"') if ($allmaps_inverted{$symb_name} eq $pschp);
@@ -3210,15 +3273,19 @@
             $r->print(
                 $indent.$icon.' '
                .$treeinfo->{$id}->{name}
-               .($$allmaps{$mapid}!~/^uploaded/?' ['.$$allmaps{$mapid}.']':'')
-               .'</label>'
-               .'</td>'
+               .($$allmaps{$mapid}!~/^uploaded/?' ['.$$allmaps{$mapid}.']':''));
+            if ($allmaps_inverted{$symb_name}) {
+                $r->print('</label>');
+            }
+            $r->print(
+                '</td>'
                .&Apache::loncommon::end_data_table_row()
             );
         }
 
         $r->print(&Apache::loncommon::end_data_table().
-                  '<br style="line-height:2px;" />'.
+                  '</fieldset>'.
+                  '<br style="line-height: 2px;" />'.
                   &Apache::loncommon::end_scrollbox());
     }
 }
@@ -3232,7 +3299,7 @@
 sub levelmenu {
     my ($r,$alllevs,$parmlev)=@_;
 
-    $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').
+    $r->print(&Apache::lonhtmlcommon::row_title('<label for="parmlev">'.&mt('Select Parameter Level').'</label>'.
                                                 &Apache::loncommon::help_open_topic('Course_Parameter_Levels')));
     $r->print('<select id="parmlev" name="parmlev" onchange="showHide_courseContent()">');
     foreach my $lev (reverse(sort(keys(%{$alllevs})))) {
@@ -3264,7 +3331,7 @@
     } else {
         @possibles = ('all',sort(keys(%sectionhash)));
     }
-    my $output = '<select name="Section" multiple="multiple" size="8"'.$disabled.'>';
+    my $output = '<select name="Section" id="Section" multiple="multiple" size="8"'.$disabled.'>';
     foreach my $s (@possibles) {
         $output .= '    <option value="'.$s.'"';
         if ((@{$selectedsections}) && (grep(/^\Q$s\E$/,@{$selectedsections}))) {  
@@ -3291,7 +3358,7 @@
     }
     return '' if (!%grouphash);
 
-    my $output = '<select name="Group" multiple="multiple" size="8">';
+    my $output = '<select name="Group" id="Group" multiple="multiple" size="8">';
     foreach my $group (sort(keys(%grouphash))) {
         $output .= '    <option value="'.$group.'"';
         if ((@{$selectedgroups}) && (grep(/^\Q$group\E$/,\@{$selectedgroups}))) {
@@ -3386,10 +3453,15 @@
         $sortchecked{'studentrealm'} = $sortchecked{'realmstudent'};
         $sortchecked{'realmstudent'} = '';
     }
+    $r->print('<fieldset class="LC_wcag" style="line-height: 185%"><legend>'.&mt('Sort order').'</legend>');
     foreach my $sorttype ('realmstudent','studentrealm') {
-        $r->print('<br /><label><input type="radio" name="sortorder" value="'.$sorttype.'"'.$sortchecked{$sorttype}.' />'.
+        $r->print('<label><input type="radio" name="sortorder" value="'.$sorttype.'"'.$sortchecked{$sorttype}.' />'.
                   $text{$sorttype}.'</label>');
+        if ($sorttype eq 'realmstudent') {
+            $r->print('<br />');
+        }
     }
+    $r->print('</fieldset>');
 }
 
 # Returns a hash parameter key -> order (integer) giving the order for some parameters.
@@ -3974,7 +4046,7 @@
         }
 
         # Step 1
-        $r->print(&Apache::lonhtmlcommon::topic_bar(1,&mt('Resource Specification'),'parmstep1'));
+        $r->print(&Apache::lonhtmlcommon::topic_bar(1,&mt('Resource Specification'),'parmstep1','h2','LC_heading_3'));
         $r->print('
 <script type="text/javascript">
 // <![CDATA['.
@@ -3987,17 +4059,17 @@
         $r->print(&Apache::lonhtmlcommon::row_closure());
         &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
         $r->print(&Apache::lonhtmlcommon::row_closure());
-        $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
+        $r->print(&Apache::lonhtmlcommon::row_title('<label for="psprt">'.&mt('Select Parts to View').'</label>'));
         &partmenu($r,\%allparts,\@psprt);
         $r->print(&Apache::lonhtmlcommon::row_closure(1));
         $r->print(&Apache::lonhtmlcommon::end_pick_box());
 
         # Step 2
-        $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));
+        $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2','h2','LC_heading_3'));
         &displaymenu($r,\%allparms,\@pscat,\%keyorder,'parmmenuscroll');
 
         # Step 3
-        $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));
+        $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3','h2','LC_heading_3'));
         $r->print(&Apache::lonhtmlcommon::start_pick_box());
         &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb);
         $r->print(&Apache::lonhtmlcommon::row_closure(1));
@@ -4044,7 +4116,7 @@
                          $title,'<span class="LC_filename">'.$resource.'</span>').
                 '<input type="hidden" value="'.$pssymb.'" name="symb" />'.
                   '<br />');
-        $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)')));
+        $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)'),'','h2','LC_heading_3'));
         $r->print(&Apache::lonhtmlcommon::start_pick_box());
         foreach my $item (keys(%allparts)) {
             if ($item =~ /_/) {
@@ -4068,6 +4140,9 @@
         }
         if (keys(%respids) > 0) {
             $r->print(&Apache::lonhtmlcommon::row_title(&mt('Show Parameters for Response(s)?')).
+                      '<fieldset class="LC_borderless">'.
+                      '<legend class="LC_visually_hidden">'.
+                      &mt('Include response-specific row(s)?').'</legend>'.
                       '<label>'.
                       '<input type="radio" name="psresp" value="all"'.$allrespson.' />'.
                       &mt('Yes').
@@ -4076,6 +4151,7 @@
                       '<input type="radio" name="psresp" value="0"'.$allrespsoff.' />'.
                       &mt('No').
                       '</label>'.
+                      '</fieldset>'.
                       &Apache::lonhtmlcommon::row_closure());
         }
         &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb);
@@ -4419,29 +4495,29 @@
                 my $tmp="";
                 if ($uname) {
                     my $person=&Apache::loncommon::plainname($uname,$udom);
-                    $tmp.=&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
+                    $tmp.=&mt("User")." <span class=\"LC_parm_scope_all\"><i>$uname \($person\) </i></span> ".
                         &mt('in')." \n";
                 } else {
-                    $tmp.="<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n";
+                    $tmp.="<span class=\"LC_parm_scope_all\"><i>".&mt('all').'</i></span> '.&mt('users in')." \n";
                 }
                 if ($cgroup) {
-                    $tmp.=&mt("Group")." <font color=\"red\"><i>$cgroup".
-                              "</i></font> ".&mt('of')." \n";
+                    $tmp.=&mt("Group")." <span class=\"LC_parm_scope_all\"><i>$cgroup".
+                              "</i></span> ".&mt('of')." \n";
                     $csec = '';
                 } elsif ($csec) {
-                    $tmp.=&mt("Section")." <font color=\"red\"><i>$csec".
-                              "</i></font> ".&mt('of')." \n";
+                    $tmp.=&mt("Section")." <span class=\"LC_parm_scope_all\"><i>$csec".
+                              "</i></span> ".&mt('of')." \n";
                 }
-                $r->print('<div align="center"><h4>'
+                $r->print('<div align="center"><h2 class="LC_heading_3">'
                          .&mt('Set Defaults for All Resources in [_1]Specifically for [_2][_3]'
-                             ,$foldermap.'<br /><font color="red"><i>'.$showtitle.'</i></font><br />'
+                             ,$foldermap.'<br /><span class="LC_parm_scope_all"><i>'.$showtitle.'</i></span><br />'
                              ,$tmp
-                             ,'<font color="red"><i>'.$coursename.'</i></font>'
+                             ,'<span class="LC_parm_scope_all"><i>'.$coursename.'</i></span>'
                              )
-                         ."<br /></h4>\n"
+                         ."<br /></h2>\n"
                 );
 #---------------------------------------------------------------- print table
-                $r->print('<p>'.&Apache::loncommon::start_data_table()
+                $r->print(&Apache::loncommon::start_data_table()
                          .&Apache::loncommon::start_data_table_header_row()
                          .'<th>'.&mt('Parameter Name').'</th>'
                          .'<th>'.&mt('Value').'</th>'
@@ -4467,8 +4543,8 @@
                            $readonly,\@recurseup,\%maptitles,\%allmaps_inverted,
                            \$numreclinks);
                 }
-                $r->print(&Apache::loncommon::end_data_table().'</p>'
-                         .'</div>'
+                $r->print(&Apache::loncommon::end_data_table()
+                         .'</div><br />'
                 );
             } # end each map
         } # end of $parmlev eq map
@@ -4605,19 +4681,19 @@
 # @param {boolean} $readonly - true if values cannot be edited (otherwise more columns are added)
 # @returns {string}
 sub tablestart {
-    my ($readonly,$is_map) = @_;
+    my ($readonly,$is_map,$colidnum) = @_;
     if ($tableopen) {
         return '';
     } else {
         $tableopen=1;
-        my $output = &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th>';
+        my $output = &Apache::loncommon::start_data_table('LC_paramDefault').'<tr><th>'.&mt('Parameter').'</th>';
         if ($readonly) {
             $output .= '<th>'.&mt('Current value').'</th>';
         } else {
-            $output .= '<th>'.&mt('Delete').'</th>'.
-                       '<th>'.&mt('Set to ...').'</th>';
+            $output .= '<th id="del'.$colidnum.'">'.&mt('Delete').'</th>'.
+                       '<th id="set'.$colidnum.'">'.&mt('Set to ...').'</th>';
             if ($is_map) {
-                $output .= '<th>'.&mt('Recursive?').'</th>';
+                $output .= '<th id="rec'.$colidnum.'">'.&mt('Recursive?').'</th>';
             }
         }
         $output .= '</tr>';
@@ -5122,6 +5198,8 @@
     my $pointer=0;
     $tableopen=0;
     my $foundkeys=0;
+    my $colcounter=0;
+    my %cols;
     my %keyorder=&standardkeyorder();
     my $readonlyall = $readonly;
 
@@ -5228,6 +5306,17 @@
                 ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/);
             my $section=&mt('All Students');
             $readonly = $readonlyall;
+            my $colidnum;
+            my $colsuffix = $thiskey;
+            $colsuffix =~ s/.\Q$name\E$//;
+            $colsuffix =~ s/\Q___(rec)\E.\Q$part\E$/___(all).$part/;
+            if (exists($cols{$colsuffix})) {
+                $colidnum = $cols{$colsuffix};
+            } else {
+                $colidnum = $colcounter;
+                $cols{$colsuffix} = $colidnum;
+                $colcounter ++;
+            }
             my $userscope;
             my $showval = $$resourcedata{$thiskey}; 
             if ($middle=~/^\[(.*)\]/) {
@@ -5312,23 +5401,23 @@
             }
             if ($sortorder eq 'realmstudent') {
                 if ($realm ne $oldrealm) {
-                    $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
+                    $r->print(&tableend()."\n<hr /><h2>$realm</h2>");
                     $oldrealm=$realm;
                     $oldsection='';
                 }
                 if ($section ne $oldsection) {
-                    $r->print(&tableend()."\n<h2>$section</h2>");
+                    $r->print(&tableend()."\n<h3>$section</h3>");
                     $oldsection=$section;
                     $oldpart='';
                 }
             } else {
                 if ($section ne $oldsection) {
-                    $r->print(&tableend()."\n<hr /><h1>$section</h1>");
+                    $r->print(&tableend()."\n<hr /><h2>$section</h2>");
                     $oldsection=$section;
                     $oldrealm='';
                 }
                 if ($realm ne $oldrealm) {
-                    $r->print(&tableend()."\n<h2>$realm</h2>");
+                    $r->print(&tableend()."\n<h3>$realm</h3>");
                     $oldrealm=$realm;
                     $oldpart='';
                 }
@@ -5351,11 +5440,13 @@
                 }
                 $advice = '<br /><span class="LC_fontsize_small LC_cusr_emph">'.$advice.'</span>';
             }
-            $r->print(&tablestart($readonly,$is_map).
-                &Apache::loncommon::start_data_table_row().
-                '<td><b>'.&mt($parmitem).
-                '</b>'.$advice.'</td>');
-            unless ($readonly) {
+            $r->print(&tablestart($readonly,$is_map,$colidnum).
+                &Apache::loncommon::start_data_table_row());
+            if ($readonly) {
+                $r->print('<td><b>'.&mt($parmitem).'</b>'.$advice.'</td>');
+            } else {
+                $r->print('<th scope="row" class="LC_rowheader" id="row'.$foundkeys.'"><b>'.
+                          &mt($parmitem).'</b>'.$advice.'</th>');
                 my $disabled;
                 if (($name eq 'availablestudent') &&
                     (($showval eq '') || ($userscope))) {
@@ -5364,10 +5455,9 @@
                     $disabled = ' disabled="disabled"';
                 }
                 $r->print('<td><input type="checkbox" name="del_'.
-                        $thiskey.'"'.$disabled.' /></td>');
+                        $thiskey.'"'.$disabled.' aria-labelledby="row'.$foundkeys.' del'.$colidnum.'" /></td>');
             }
             $r->print('<td>');
-            $foundkeys++;
             if (&isdateparm($thistype)) {
                 my $jskey='key_'.$pointer;
                 my $state;
@@ -5383,7 +5473,7 @@
                 unless  ($readonly) {
                     $r->print(
     '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
-    (($showval!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$showval.'">'.
+    (($showval!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?action=dateshift1&timebase='.$showval.'">'.
     &mt('Shift all dates based on this date').'</a></span>':'').
     &date_sanity_info($showval)
                     );
@@ -5398,9 +5488,9 @@
                     $readonly = 1;
                 }
                 $r->print(&string_selector($thistype,$thiskey,
-                          $showval,$name,$readonly));
+                          $showval,$name,$readonly,$colidnum,$foundkeys));
             } else {
-                $r->print(&default_selector($thiskey,$showval,$readonly));
+                $r->print(&default_selector($thiskey,$showval,$readonly,$colidnum,$foundkeys));
             }
             unless ($readonly) {
                 $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
@@ -5409,7 +5499,7 @@
             $r->print('</td>');
             if ($is_map) {
                 if (($name eq 'encrypturl') || ($name eq 'hiddenresource')) {
-                    $r->print('<td><table><tr><td>'.&mt('Yes').'</td></tr></table></td>');
+                    $r->print('<td>'.&mt('Yes').'</td>');
                 } else {
                     my ($disabled,$recon,$recoff);
                     if ($readonly) {
@@ -5420,11 +5510,14 @@
                     } else {
                         $recoff = ' checked="checked"';
                     }
-                    $r->print('<td><table><tr><td><label><input type="radio" name="rec_'.$thiskey.'" value="1"'.$recon.$disabled.' />'.&mt('Yes').'</label>'.
-                              '</td><td><label><input type="radio" name="rec_'.$thiskey.'" value="0"'.$recoff.$disabled.' />'.&mt('No').'</label></td></tr></table></td>');
+                    $r->print('<td><fieldset class="LC_borderless">'.
+                              '<legend class="LC_visually_hidden">'.&mt('Recursive?').'</legend>'.
+                              '<span class="LC_nobreak"><label><input type="radio" name="rec_'.$thiskey.'" value="1"'.$recon.$disabled.' />'.&mt('Yes').'</label>'.
+                              '  <label><input type="radio" name="rec_'.$thiskey.'" value="0"'.$recoff.$disabled.' />'.&mt('No').'</label></span></fieldset></td>');
                 }
             }
             $r->print(&Apache::loncommon::end_data_table_row());
+            $foundkeys ++;
         }
     }
     return $foundkeys;
@@ -5477,14 +5570,16 @@
 # @param {string} $thiskey - parameter key
 # @param {string} $showval - the current value
 # @param {boolean} $readonly - true if the field should not be made editable
+# @param {integer} $colidnum - column number for current column
+# @param {integer} $foundkeys - row number for current row
 # @returns {string}
 sub default_selector {
-    my ($thiskey, $showval, $readonly) = @_;
+    my ($thiskey, $showval, $readonly, $colidnum, $foundkeys) = @_;
     my $disabled;
     if ($readonly) {
         $disabled = ' disabled="disabled"';
     }
-    return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'"'.$disabled.' />';
+    return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'"'.$disabled.' aria-labelledby="set'.$colidnum.' row'.$foundkeys.'" />';
 }
 
 # Returns HTML to enter allow/deny rules related to IP addresses.
@@ -5492,9 +5587,11 @@
 # @param {string} $thiskey - parameter key
 # @param {string} $showval - the current value
 # @param {boolean} $readonly - true if the fields should not be made editable
+# @param {integer} $colidnum - column number for current column
+# @param {integer} $foundkeys - row number for current row
 # @returns {string}
 sub string_ip_selector {
-    my ($thiskey, $showval, $readonly) = @_;
+    my ($thiskey, $showval, $readonly, $colidnum, $foundkeys) = @_;
     my %access = (
                    allow => [],
                    deny  => [],
@@ -5527,7 +5624,7 @@
         $addmore = "\n".'<button class="LC_add_ipacc_button">'.&mt('Add more').'</button>';
     }
     my $output = '<input type="hidden" name="set_'.$thiskey.'" />
-<table><tr><th>'.&mt('Allow from').'</th><th>'.&mt('Deny from').'</th></tr><tr>';
+<table><tr><th id="allow'.$colidnum.'">'.&mt('Allow from').'</th><th id="deny'.$colidnum.'">'.&mt('Deny from').'</th></tr><tr>';
     foreach my $acctype ('allow','deny') {
         $output .= '
 <td valign="top">
@@ -5535,7 +5632,7 @@
   <div class="LC_string_ipacc_inner">'."\n";
         my $num = 0;
         foreach my $curr (@{$access{$acctype}}) {
-            $output .= '<div><input type="text" name="setip'.$acctype.'_'.$thiskey.'" value="'.$curr.'"'.$disabled.' />';
+            $output .= '<div><input type="text" name="setip'.$acctype.'_'.$thiskey.'" value="'.$curr.'"'.$disabled.' aria-labelledby="row'.$foundkeys.' '.$acctype.$colidnum.'" />';
             if ($num > 0) {
                 $output .= '<a href="#" class="LC_remove_ipacc">'.&mt('Remove').'</a>'; 
             }
@@ -5806,7 +5903,7 @@
 }
 
 sub string_grace_selector {
-    my ($thiskey, $showval, $readonly) = @_;
+    my ($thiskey, $showval, $readonly, $foundkeys) = @_;
     my $addmore;
     unless ($readonly) {
         $addmore = "\n".'<button class="LC_add_grace_button">'.&mt('Add more').'</button>';
@@ -5821,7 +5918,7 @@
         } else {
             @current = ($showval);
         }
-        my $num = scalar(@current);	
+        my $num = 0;
         foreach my $item (@current) {
             my ($delta,$fraction,$gradational) = split(/:/,$item);
             if (($delta =~ /^\d+$/) && ($fraction =~ /^(0|1)\.?\d*$/) && 
@@ -5831,18 +5928,19 @@
                     $gradchk = ' checked="checked"';
                 }
                 $output .= &grace_form($thiskey,$delta,$fraction,$gradchk,
-                                       $readonly);
+                                       $readonly,$foundkeys,$num);
+                $num ++;
             }
         }
     } elsif (!$readonly) {
-        $output .= &grace_form($thiskey,'','','',$readonly);
+        $output .= &grace_form($thiskey,'','','',$readonly,$foundkeys,0);
     }
     $output .= '</div>'.$addmore.'</div>';
     return $output;
 }
 
 sub grace_form {
-    my ($thiskey,$delta,$fraction,$gradchkon,$readonly) = @_;
+    my ($thiskey,$delta,$fraction,$gradchkon,$readonly,$foundkeys,$counter) = @_;
     my $disabled;
     if ($readonly) {
         $disabled = ' disabled="disabled"';
@@ -5866,13 +5964,13 @@
             $amount = int($delta/$factor);
             $delta %= $factor;
         }
-        $output .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
+        $output .= '<label>'.&Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
                                                    \%select,'',$readonly);
-        $output .= ' '.$lt{$name}.'   ';
+        $output .= ' '.$lt{$name}.'</label>   ';
     }
     $output .= '</fieldset>'.
-               '<fieldset class="LC_grace"><legend>'.$lt{'pcr'}.'</legend>'.
-               '<input type="text" size="3" name="frac_'.$thiskey.'" value="'.$fraction.'"'.$disabled.' />'.
+               '<fieldset class="LC_grace"><legend><label for="frac_'.$foundkeys.'.'.$counter.'">'.$lt{'pcr'}.'</label></legend>'.
+               '<input type="text" size="3" name="frac_'.$thiskey.'" id="frac_'.$foundkeys.'.'.$counter.'" value="'.$fraction.'"'.$disabled.' />'.
                '  <label><input type="checkbox" value="1" name="grad_'.$thiskey.'"'.$gradchkon.$disabled.' />'.
                $lt{'grad'}.'</label></fieldset>';
     unless ($readonly) {
@@ -6008,10 +6106,10 @@
 # @param {boolean} $readonly - true if the values should not be made editable
 # @returns {string}
 sub string_selector {
-    my ($thistype, $thiskey, $showval, $name, $readonly) = @_;
+    my ($thistype, $thiskey, $showval, $name, $readonly, $colidnum, $foundkeys) = @_;
 
     if (!exists($strings{$thistype})) {
-        return &default_selector($thiskey,$showval,$readonly);
+        return &default_selector($thiskey,$showval,$readonly,$colidnum,$foundkeys);
     }
 
     my %skiptype;
@@ -6059,9 +6157,9 @@
     }
 
     if ($thistype eq 'string_ip') {
-        return &string_ip_selector($thiskey,$showval,$readonly);
+        return &string_ip_selector($thiskey,$showval,$readonly,$colidnum,$foundkeys);
     } elsif ($thistype eq 'string_grace') {
-        return &string_grace_selector($thiskey,$showval,$readonly);
+        return &string_grace_selector($thiskey,$showval,$readonly,$foundkeys);
     } elsif ($thistype eq 'string_deeplink') {
         return &string_deeplink_selector($thiskey,$showval,$readonly);
     }
@@ -6089,20 +6187,9 @@
             $rem = $i%($numinrow);
             if ($rem == 0) {
                 if ($i > 0) {
-                    $result .= '</tr>';
-                }
-                $result .= '<tr>';
-            }
-            my $colspan;
-            if ($i == @{ $strings{$thistype} }-1) {
-                $rem = @{ $strings{$thistype} }%($numinrow);
-                if ($rem) {
-                    my $colsleft = $numinrow - $rem;
-                    if ($colsleft) {
-                        $colspan = $colsleft+1;
-                        $colspan = ' colspan="'.$colspan.'"';
-                    }
+                    $result .= '</div>';
                 }
+                $result .= '<div role="row" class="LC_grid_row">';
             }
             my ($add,$onchange,$css_class);
             if ($thistype eq 'string_lenient') {
@@ -6133,9 +6220,9 @@
                     $add = ' <div id="LC_parmtext_'.$thiskey.'" style="display:'.$display.'"><table>'.
                            '<tr><th colspan="2">'.&mt("Foil's submission status").'</th><th>'.&mt('Points').'</th></tr>';  
                     foreach my $reltype ('corrchkd','corrunchkd','incorrchkd','incorrunchkd') {
-                        $add .= '<tr><td> </td><td>'.$relatives{$reltype}.'</td>'."\n".
+                        $add .= '<tr><td> </td><td><label for="settext_'.$reltype.'_'.$thiskey.'">'.$relatives{$reltype}.'</label></td>'."\n".
                                 '<td><input type="text" name="settext_'.$thiskey.'"'.
-                                ' value="'.$textval{$reltype}.'" size="3"'.$disabled.' />'.
+                                ' id="settext_'.$reltype.'_'.$thiskey.'" value="'.$textval{$reltype}.'" size="3"'.$disabled.' />'.
                                 '</td></tr>';
                     }
                     $add .= '</table></div>'."\n";
@@ -6143,20 +6230,23 @@
                 $onchange = ' onclick="javascript:toggleParmTextbox(this.form,'."'$thiskey'".');"';
                 $css_class = ' class="LC_lenient_radio"';
             }
-            $result .= '<td class="LC_left_item"'.$colspan.'>'.
+            $result .= '<div role="gridcell" class="LC_grid_cell">'.
                        '<span class="LC_nobreak"><label>'.
                        '<input type="radio" name="set_'.$thiskey.
                        '" value="'.$name.'"'.$onchange.$css_class.$disabled;
             if ($showval eq $name) {
                 $result .= ' checked="checked"';
             }
-            $result .= ' />'.&mt($description).'</label>'.$add.'</span></td>';
+            $result .= ' />'.&mt($description).'</label>'.$add.'</span></div>';
             $i++;
         }
-        $result .= '</tr>';
+        $result .= '</div>';
     }
     if ($result) {
-        $result = '<table border="0">'.$result.'</table>';
+        $result = '<fieldset class="LC_borderless">'.
+                  '<legend class="LC_visually_hidden">'.$name.'</legend>'.
+                  '<div role="grid" class="LC_grid" style="margin: 0;">'.$result.'</div>'.
+                  '</fieldset>';
     }
     return $result;
 }
@@ -6278,9 +6368,9 @@
             $select{''} = '';
             $amount = '';
         }
-        $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
+        $result .= '<label>'.&Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
                             \%select,'',$readonly);
-        $result .= ' '.&mt($name);
+        $result .= ' '.&mt($name).'</label>';
     }
     if ($name eq 'interval') {
         unless ($skipval{'done'}) {
@@ -6314,7 +6404,8 @@
             if ($readonly) {
                 $disabled = ' disabled="disabled"';
             }
-            $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').
+            $result .= '<br /><span class="LC_nobreak">'.
+                       '<fieldset class="LC_grace" style="line-height: 170%;"><legend>'.&mt('Include "done" button').'</legend>'.
                        '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.$disabled.' />'.
                        &mt('No').'</label>'.(' 'x2).
                        '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.$disabled.' />'.
@@ -6323,9 +6414,9 @@
                        &mt('Yes, with proctor key').'</label>'.
                        '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.
                        'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'"'.$disabled.' /></span><br />'.
-                       '<span class="LC_nobreak">'.&mt('Button text').': '.
+                       '<span class="LC_nobreak"><label>'.&mt('Button text').': '.
                        '<input type="text" name="done_'.$thiskey.'_buttontext" id="done_'.$thiskey.'_buttontext" value="'.
-                       &HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></span>';
+                       &HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></label></span></fieldset>';
         }
     }
     unless ($readonly) {
@@ -6575,52 +6666,56 @@
     }
 # Menu to select levels, etc
 
-    $r->print('<div class="LC_Box">');
-    #$r->print('<h2 class="LC_hcell">Step 1</h2>');
-    $r->print('<div>');
+    $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Resource Specification'),'','h2','LC_heading_3'));
     $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
     &levelmenu($r,\%alllevs,$parmlev);
     $r->print(&Apache::lonhtmlcommon::row_closure());
     &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
     $r->print(&Apache::lonhtmlcommon::row_closure(1));
     $r->print(&Apache::lonhtmlcommon::end_pick_box());
-    $r->print('</div></div>');
 
-    $r->print('<div class="LC_Box">');
-    $r->print('<div>');
+    $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Parameter Specification'),'','h2','LC_heading_3'));
     &displaymenu($r,\%allparms,\@pscat,\%keyorder);
+
+    $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Granularity'),'','h2','LC_heading_3'));
     $r->print(&Apache::lonhtmlcommon::start_pick_box());
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
     my $sectionselector = &sectionmenu(\@selected_sections);
     my $groupselector = &groupmenu(\@selected_groups);
-    $r->print('<table>'.
-              '<tr><th>'.&mt('Parts').'</th>');
+    $r->print('<div role="grid" class="LC_grid" style="margin: 0;">'
+             .'<div role="row" class="LC_grid_row">'
+             .'<div role="gridcell" class="LC_grid_cell">'
+             .'<b><label for="psprt">'.&mt('Parts').'</label></b></div>');
     if ($sectionselector) {
-        $r->print('<th>'.&mt('Section(s)').'</th>');
+        $r->print('<div role="gridcell" class="LC_grid_cell">'
+                 .'<b><label for="Section">'.&mt('Section(s)').'</label></b></div>');
     }
     if ($groupselector) {
-        $r->print('<th>'.&mt('Group(s)').'</th>');
+        $r->print('<div role="gridcell" class="LC_grid_cell">'
+                 .'<b><label for="Group">'.&mt('Group(s)').'</label></b></div>');
     }
-    $r->print('</tr><tr><td>');
+    $r->print('</div><div role="row" class="LC_grid_row">'
+             .'<div role="gridcell" class="LC_grid_cell">');
     &partmenu($r,\%allparts,\@psprt);
-    $r->print('</td>');
-    if ($sectionselector) { 
-        $r->print('<td>'.$sectionselector.'</td>');
+    $r->print('</div>');
+    if ($sectionselector) {
+        $r->print('<div role="gridcell" class="LC_grid_cell">'
+                 .$sectionselector
+                 .'</div>');
     }
     if ($groupselector) {
-        $r->print('<td>'.$groupselector.'</td>');
+        $r->print('<div role="gridcell" class="LC_grid_cell">'
+                 .$groupselector
+                 .'</div>');
     }
-    $r->print('</tr></table>');
+    $r->print('</div></div>');
     $r->print(&Apache::lonhtmlcommon::row_closure(1));
     $r->print(&Apache::lonhtmlcommon::end_pick_box());
-    $r->print('</div></div>');
+    $r->print('</div>');
 
-    $r->print('<div class="LC_Box">');
-    $r->print('<div>');
     my $sortorder=$env{'form.sortorder'};
     unless ($sortorder) { $sortorder='realmstudent'; }
     &sortmenu($r,$sortorder,'newoverview');
-    $r->print('</div></div>');
 
     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" id="newoverviewdis" /></p>');
 
@@ -6835,7 +6930,7 @@
 # List data
 
     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist,$readonly);
-    $r->print(&tableend().'<p>');
+    $r->print(&tableend());
     if ($foundkeys) {
         unless ($readonly) {
             $r->print('<p>'.$submitbutton.'</p>');
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.1518 loncom/interface/loncommon.pm:1.1519
--- loncom/interface/loncommon.pm:1.1518	Mon Apr 27 19:13:12 2026
+++ loncom/interface/loncommon.pm	Tue Apr 28 02:36:03 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1518 2026/04/27 19:13:12 raeburn Exp $
+# $Id: loncommon.pm,v 1.1519 2026/04/28 02:36:03 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -8327,26 +8327,30 @@
 }
 
 span.LC_parm_scope_all {
-  color: red;
+  color: $error;
 }
 
 span.LC_parm_scope_folder {
-  color: green;
+  color: $info;
 }
 
 span.LC_parm_scope_resource {
-  color: orange;
+  color: $warning;
 }
 
 span.LC_parm_part {
   color: blue;
 }
 
+div.LC_session_parm_alert {
+  color: #FFFC52;
+}
+
 span.LC_parm_folder,
 span.LC_parm_symb {
-  font-size: x-small;
+  font-size: small;
   font-family: $mono;
-  color: #AAAAAA;
+  color: #636363;
 }
 
 ul.LC_parm_parmlist li {
@@ -8573,7 +8577,7 @@
 }
 
 .LC_topic_bar span {
-  left: 0.5em;
+  left: 1.0em;
   position: absolute;
   vertical-align: middle;
   font-size: 1.2em;
Index: loncom/interface/lonhtmlcommon.pm
diff -u loncom/interface/lonhtmlcommon.pm:1.429 loncom/interface/lonhtmlcommon.pm:1.430
--- loncom/interface/lonhtmlcommon.pm:1.429	Tue Jan 20 18:45:04 2026
+++ loncom/interface/lonhtmlcommon.pm	Tue Apr 28 02:36:03 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common html routines
 #
-# $Id: lonhtmlcommon.pm,v 1.429 2026/01/20 18:45:04 raeburn Exp $
+# $Id: lonhtmlcommon.pm,v 1.430 2026/04/28 02:36:03 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2905,10 +2905,12 @@
 #    If input for number is empty only the title will be displayed. 
 # 2. title text to display.
 # 3. optional id for the <div>
+# 4. optional heading tag: h1, h2, h3, h4, h5 or h6.
+# 5. optional CSS class for heading tag.
 # Outputs - a scalar containing html mark-up for the div.
 
 sub topic_bar {
-    my ($num,$title,$id) = @_;
+    my ($num,$title,$id,$hlevel,$hclass) = @_;
     my $number = '';
     if ($num ne '') {
         $number = '<span>'.$num.'</span>';
@@ -2916,7 +2918,16 @@
     if ($id ne '') {
         $id = 'id="'.$id.'"';
     }
-    return '<div class="LC_topic_bar" '.$id.'>'.$number.$title.'</div>';
+    my ($hopen,$hclose);
+    if ($hlevel =~ /^h[1-6]$/) {
+        if ($hclass ne '') {
+            $hopen = '<'.$hlevel.' class="'.$hclass.'">';
+        } else {
+            '<'.$hlevel.'>';
+        }
+        $hclose = '</'.$hlevel.'>';
+    }
+    return '<div class="LC_topic_bar" '.$id.'>'.$hopen.$number.$title.$hclose.'</div>';
 }
 
 ##############################################


More information about the LON-CAPA-cvs mailing list