<style>

.hours-table {
    border: 0;
    border-collapse: separate; /* collapse breaks top borders on rowspan cells in most browsers */
    border-spacing: 0;
    width: 100%;
}
.hours-table td,
.hours-table th {
    padding: 6px 8px;
}
/* Label cell styling — any td with rowspan is treated as a group label */
.hours-table td[rowspan] {
    font-weight: bold;
    font-size: 1.05em;
    background: #ffffff;
    vertical-align: middle !important;
}
/* Divider line above each new group (i.e. each row that starts with a
   rowspan cell), except the very first row of the table. border-spacing:0
   with separate borders means every td in the row paints its own top edge
   independently, so the line reaches all the way across, including under
   a rowspanning label cell from the row above. */
.hours-table tbody tr:has(td[rowspan]):not(:first-child) > td {
    border-top: 2px solid #6c0633;
}
/* Closing line under the Days/Hours columns of the physically last row */
.hours-table tbody tr:last-child > td {
    border-bottom: 2px solid #6c0633;
}
/* Closing line under the last group's label column specifically — its
   rowspan may carry it up into an earlier <tr> than the one above, so it
   needs its own rule rather than relying on the table's outer border
   (which some CMS resets strip even with !important). This matches the
   row that starts a group where no later row also starts a group. */
.hours-table tbody tr:has(td[rowspan]):not(:has(~ tr td[rowspan])) > td[rowspan] {
    border-bottom: 2px solid #6c0633;
}

</style>