.ct-section {
width:100%;
background-size:cover;
background-repeat:repeat;
}
.ct-section>.ct-section-inner-wrap {
display:flex;
flex-direction:column;
align-items:flex-start;
}
.ct-div-block {
display:flex;
flex-wrap:nowrap;
flex-direction:column;
align-items:flex-start;
}
.ct-new-columns {
display:flex;
width:100%;
flex-direction:row;
align-items:stretch;
justify-content:center;
flex-wrap:wrap;
}
.ct-link-text {
display:inline-block;
}
.ct-link {
display:flex;
flex-wrap:wrap;
text-align:center;
text-decoration:none;
flex-direction:column;
align-items:center;
justify-content:center;
}
.ct-link-button {
display:inline-block;
text-align:center;
text-decoration:none;
}
.ct-link-button {
background-color: #1e73be;
border: 1px solid #1e73be;
color: #ffffff;
padding: 10px 16px;
}
.ct-image {
max-width:100%;
}
.ct-fancy-icon>svg {
width:55px;height:55px;}
.ct-inner-content {
width:100%;
}
.ct-slide {
display:flex;
flex-wrap:wrap;
text-align:center;
flex-direction:column;
align-items:center;
justify-content:center;
}
.ct-nestable-shortcode {
display:flex;
flex-wrap:nowrap;
flex-direction:column;
align-items:flex-start;
}
.oxy-comments {
width:100%;
text-align:left;
}
.oxy-comment-form {
width:100%;
}
.oxy-login-form {
width:100%;
}
.oxy-search-form {
width:100%;
}
.oxy-tabs-contents {
display:flex;
width:100%;
flex-wrap:nowrap;
flex-direction:column;
align-items:flex-start;
}
.oxy-tab {
display:flex;
flex-wrap:nowrap;
flex-direction:column;
align-items:flex-start;
}
.oxy-tab-content {
display:flex;
width:100%;
flex-wrap:nowrap;
flex-direction:column;
align-items:flex-start;
}
.oxy-testimonial {
width:100%;
}
.oxy-icon-box {
width:100%;
}
.oxy-pricing-box {
width:100%;
}
.oxy-posts-grid {
width:100%;
}
.oxy-gallery {
width:100%;
}
.ct-slider {
width:100%;
}
.oxy-tabs {
display:flex;
flex-wrap:nowrap;
flex-direction:row;
align-items:stretch;
}
.ct-modal {
flex-direction:column;
align-items:flex-start;
}
.ct-span {
display:inline-block;
text-decoration:inherit;
}
.ct-widget {
width:100%;
}
.oxy-dynamic-list {
width:100%;
}
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
			.ct-div-block,
			.oxy-post-content,
			.ct-text-block,
			.ct-headline,
			.oxy-rich-text,
			.ct-link-text { max-width: 100%; }
			img { flex-shrink: 0; }
			body * { min-height: 1px; }
		}            .oxy-testimonial {
                flex-direction: row;
                align-items: center;
            }
                        .oxy-testimonial .oxy-testimonial-photo-wrap {
                order: 1;
            }
            
                        .oxy-testimonial .oxy-testimonial-photo {
                width: 125px;                height: 125px;                margin-right: 20px;
            }
            
                        .oxy-testimonial .oxy-testimonial-photo-wrap, 
            .oxy-testimonial .oxy-testimonial-author-wrap, 
            .oxy-testimonial .oxy-testimonial-content-wrap {
                align-items: flex-start;                text-align: left;            }
            
                                                            .oxy-testimonial .oxy-testimonial-text {
                margin-bottom:8px;font-size: 21px;
line-height: 1.4;
-webkit-font-smoothing: subpixel-antialiased;
            }
            
                                    .oxy-testimonial .oxy-testimonial-author {
                font-size: 18px;
-webkit-font-smoothing: subpixel-antialiased;
            }
                            

                                                .oxy-testimonial .oxy-testimonial-author-info {
                font-size: 12px;
-webkit-font-smoothing: subpixel-antialiased;
            }
            
             
            
                        .oxy-icon-box {
                text-align: left;                flex-direction: column;            }
            
                        .oxy-icon-box .oxy-icon-box-icon {
                margin-bottom: 12px;
                align-self: flex-start;            }
            
                                                                        .oxy-icon-box .oxy-icon-box-heading {
                font-size: 21px;
margin-bottom: 12px;            }
            
                                                                                    .oxy-icon-box .oxy-icon-box-text {
                font-size: 16px;
margin-bottom: 12px;align-self: flex-start;            }
            
                        .oxy-icon-box .oxy-icon-box-link {
                margin-top: 20px;                            }
            
            
            /* GLOBALS */

                                                            .oxy-pricing-box .oxy-pricing-box-section {
                padding-top: 20px;
padding-left: 20px;
padding-right: 20px;
padding-bottom: 20px;
text-align: center;            }
                        
                        .oxy-pricing-box .oxy-pricing-box-section.oxy-pricing-box-price {
                justify-content: center;            }
            
            /* IMAGE */
                                                                                    .oxy-pricing-box .oxy-pricing-box-section.oxy-pricing-box-graphic {
                justify-content: center;            }
            
            /* TITLE */
                                                            
                                    .oxy-pricing-box .oxy-pricing-box-title-title {
                font-size: 48px;
            }
            
                                    .oxy-pricing-box .oxy-pricing-box-title-subtitle {
                font-size: 24px;
            }
            

            /* PRICE */
                                                .oxy-pricing-box .oxy-pricing-box-section.oxy-pricing-box-price {
                                                flex-direction: row;                                            }
            
                                    .oxy-pricing-box .oxy-pricing-box-currency {
                font-size: 28px;
            }
            
                                    .oxy-pricing-box .oxy-pricing-box-amount-main {
                font-size: 80px;
line-height: 0.7;
            }
            
                                    .oxy-pricing-box .oxy-pricing-box-amount-decimal {
                font-size: 13px;
            }
                        
                                    .oxy-pricing-box .oxy-pricing-box-term {
                font-size: 16px;
            }
            
                                    .oxy-pricing-box .oxy-pricing-box-sale-price {
                font-size: 12px;
color: rgba(0,0,0,0.5);
                margin-bottom: 20px;            }
            
            /* CONTENT */

                                                                        .oxy-pricing-box .oxy-pricing-box-section.oxy-pricing-box-content {
                font-size: 16px;
color: rgba(0,0,0,0.5);
            }
            
            /* CTA */

                                                                        .oxy-pricing-box .oxy-pricing-box-section.oxy-pricing-box-cta {
                justify-content: center;            }
            
        
                                .oxy-progress-bar .oxy-progress-bar-background {
            background-color: #000000;            background-image: linear-gradient(-45deg,rgba(255,255,255,.12) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.12) 50%,rgba(255,255,255,.12) 75%,transparent 75%,transparent);            animation: none 0s paused;        }
                
                .oxy-progress-bar .oxy-progress-bar-progress-wrap {
            width: 85%;        }
        
                                                        .oxy-progress-bar .oxy-progress-bar-progress {
            background-color: #66aaff;padding: 40px;animation: none 0s paused, none 0s paused;            background-image: linear-gradient(-45deg,rgba(255,255,255,.12) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.12) 50%,rgba(255,255,255,.12) 75%,transparent 75%,transparent);        
        }
                
                        .oxy-progress-bar .oxy-progress-bar-overlay-text {
            font-size: 30px;
font-weight: 900;
-webkit-font-smoothing: subpixel-antialiased;
        }
        
                        .oxy-progress-bar .oxy-progress-bar-overlay-percent {
            font-size: 12px;
        }
        
        .ct-slider .unslider-nav ol li {border-color: #ffffff; }.ct-slider .unslider-nav ol li.unslider-active {background-color: #ffffff; }.ct-slider .ct-slide {
				padding: 0px;			}
		
                        .oxy-superbox .oxy-superbox-secondary, 
            .oxy-superbox .oxy-superbox-primary {
                transition-duration: 0.5s;            }
            
            
            
            
            
        
        
        
        
            .oxy-shape-divider {
                width: 0px;
                height: 0px;
                
            }
            
            .oxy_shape_divider svg {
                width: 100%;
            }
            

/*---------Font Smoothing---------*/
.woocommerce {
  -webkit-font-smoothing: antialiased;
}

/*------Rating Stars--------*/
.woocommerce .star-rating::before,
.woocommerce .stars:not(.selected) span a,
.woocommerce .stars.selected span a.active ~ a {
  color: #d3d3d3;
}
.woocommerce .star-rating,
.woocommerce .stars.selected span a {
  color: #65bec2;
}

/*-----Product Images------*/
.woocommerce div.flex-viewport,
.woocommerce-product-gallery__wrapper,
.woocommerce div.product div.images .flex-control-thumbs li,
.woocommerce ul.products li.product a img,
.woocommerce-cart table.cart img {
  min-width: 64px;
  min-height: 64px;
  border: 1px solid #d3ced2;
  overflow: hidden;
}

.flex-viewport .woocommerce-product-gallery__wrapper {
  border: none; /* Remove duplicated borders */
  border-radius: 0 !important; /* Fix duplicated radius */
  margin: 0 !important; /* Fix duplicated margin */
}

/*----------Secondary Buttons-------------*/
.woocommerce button.button.alt,
.woocommerce a.button,
.woocommerce ul.products li.product .button,
.woocommerce #review_form #respond .form-submit input,
.woocommerce a.button.alt,
.woocommerce button.button {
  background: #666666;
  border: 1px solid #666666;
  font-size: 12px;
  border-radius: 0px;
  letter-spacing: 1px;
  text-transform: uppercase;
  color: #ffffff;
  line-height: 1.2;
  text-align: center;
  padding: 16px 24px;
  outline: none;
  font-family: inherit;
  border-radius: 4px;
  display: flex;
  flex-direction: row;
  justify-content: center;
}

/*----------Secondary Hovered-------------*/
.woocommerce button.button.alt:hover,
.woocommerce a.button:hover,
.woocommerce ul.products li.product .button:hover,
.woocommerce #review_form #respond .form-submit input:hover,
.woocommerce a.button.alt:hover,
.woocommerce button.button:hover {
  background: #999999;
  border: 1px solid #999999;
  color: #ffffff;
}
/*----------Tertiary Buttons-------------*/
.woocommerce button.button:disabled,
.woocommerce button.button:disabled[disabled],
.woocommerce .widget_shopping_cart .buttons a,
.woocommerce.widget_shopping_cart .buttons a,
.woocommerce .widget_price_filter .price_slider_amount .button,
.woocommerce a.added_to_cart,
.woocommerce .cart .button,
.woocommerce .cart input.button,
.woocommerce table.my_account_orders .button,
td a.woocommerce-MyAccount-downloads-file.button.alt {
  line-height: 1.2;
  text-align: center;
  text-transform: uppercase;
  letter-spacing: 1px;
  font-weight: 700;
  font-size: 12px;
  background: #ffffff;
  border: 1px solid #65bec2;
  color: #65bec2;
  padding: 16px 24px;
  outline: none;
  font-family: inherit;
  border-radius: 4px;
}

/*----------Tertiary Buttons Hovered-------------*/
.woocommerce button.button:disabled:hover,
.woocommerce button.button:disabled[disabled]:hover,
.woocommerce .widget_shopping_cart .buttons a:hover,
.woocommerce.widget_shopping_cart .buttons a:hover,
.woocommerce a.added_to_cart:hover,
.woocommerce .cart .button:hover,
.woocommerce .cart input.button:hover,
.woocommerce table.my_account_orders .button:hover,
td a.woocommerce-MyAccount-downloads-file.button.alt:hover {
  background: #ffffff;
  border: 1px solid #6799b2;
  color: #6799b2;
}

/*---Disabled Buttons---*/
.woocommerce #respond input#submit.disabled,
.woocommerce #respond input#submit:disabled,
.woocommerce #respond input#submit:disabled[disabled],
.woocommerce a.button.disabled, .woocommerce a.button:disabled,
.woocommerce a.button:disabled[disabled],
.woocommerce button.button.disabled,
.woocommerce button.button:disabled,
.woocommerce button.button:disabled[disabled],
.woocommerce input.button.disabled,
.woocommerce input.button:disabled,
.woocommerce input.button:disabled[disabled] {
  filter: grayscale(100%);
}

/*----------Links-------------*/
.woocommerce a.wcppec-checkout-buttons__button,
.woocommerce ul.product_list_widget li a,
.woocommerce ul.product-categories a,
.woocommerce .widget_layered_nav_filters ul li a,
.woocommerce .woocommerce-widget-layered-nav-list__item a,
.woocommerce .wc-layered-nav-rating a,
.woocommerce div.tagcloud a,
.woocommerce ul.products li.product .woocommerce-loop-category__title,
.woocommerce ul.products li.product .woocommerce-loop-product__title,
h2.woocommerce-loop-category__title,
.comment-form-rating a,
.woocommerce .download-product a,
a.woocommerce-remove-coupon,
.woocommerce a.shipping-calculator-button,
.woocommerce a.remove,
.woocommerce a.reset_variations,
.woocommerce .product-name a,
.woocommerce-info a,
.woocommerce-error a,
.woocommerce-message a,
.woocommerce-checkout-payment a,
.woocommerce-LostPassword a,
.woocommerce-Address-title a,
.woocommerce-MyAccount-navigation-link a,
.woocommerce-MyAccount-content a,
a.woocommerce-review-link,
.posted_in a,
.tagged_as a,
.woocommerce .woocommerce-breadcrumb a {
  color: #6799b2;
  font-weight: 400;
  font-family: inherit;
  text-decoration: none;
}

/*----------Links Hovered-------------*/
.woocommerce a.wcppec-checkout-buttons__button:hover,
.woocommerce ul.product_list_widget li a:hover,
.woocommerce ul.product-categories a:hover,
.woocommerce .widget_layered_nav_filters ul li a:hover,
.woocommerce .woocommerce-widget-layered-nav-list__item a:hover,
.woocommerce div.tagcloud a:hover,
.comment-form-rating a:hover,
.woocommerce .download-product a:hover,
a.woocommerce-remove-coupon:hover,
.woocommerce a.shipping-calculator-button:hover,
.woocommerce a.remove:hover,
a.reset_variations:hover .product-name a:hover,
.woocommerce .product-name a:hover,
.woocommerce-info a:hover,
.woocommerce-error a:hover,
.woocommerce-message a:hover,
.woocommerce-checkout-payment a:hover,
.woocommerce-LostPassword a:hover,
.woocommerce-Address-title a:hover,
.woocommerce-MyAccount-navigation-link a:hover,
.woocommerce-MyAccount-content a:hover,
a.woocommerce-review-link:hover,
.posted_in a:hover,
.tagged_as a:hover,
.woocommerce .woocommerce-breadcrumb a:hover {
  color: #65bec2;
  text-decoration: underline;
}

/*-----------Labels----------------*/
.woocommerce div.product form.cart .variations label,
.woocommerce form label {
  font-size: 12px;
  color: #666666;
  margin-top: 8px;
  font-weight: 400;
  font-style: normal;
}

/*---------------Placeholders----------------*/
.woocommerce input[type="search"]::placeholder,
.woocommerce-page table.cart td.actions .input-text::placeholder,
.woocommerce form .form-row .input-text::placeholder,
.woocommerce-page form .form-row .input-text::placeholder {
  color: #d3ced2;
  font-family: inherit;
}

/*---------------Dropdowns----------------*/
.select2-container--default .select2-selection--single,
.woocommerce div.product form.cart .variations select {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  color: #000000;
  background: #ffffff;
  font-family: inherit;
  box-sizing: border-box;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  border-radius: 4px;
}

.select2-container--default .select2-results__option--highlighted[aria-selected],
.select2-container--default .select2-results__option--highlighted[data-selected] {
  background: #6799b2;
  color: #ffffff;
  outline: none;
}

.select2-container--default .select2-results__option[data-selected=true] {
  background: #65bec2;
  color: #ffffff;
  outline: none;
}

.select2-results__option {
  padding: 8px 12px;
  font-size: 14px;
  -webkit-font-smoothing: antialiased;
}

.select2-dropdown {
  border-radius: 0;
}

.woocommerce .select2-container--default .select2-selection--single .select2-selection__rendered {
  line-height: 1.6;
  color: #000000;
  padding: 0;
  min-height: 20px;
  padding-left: 0;
  outline: none;
}
.select2-container--open .select2-dropdown--below {
  padding: 0;
}

.woocommerce .select2-container--default .select2-selection--single .select2-selection__arrow {
  background: url(https://collegesa.co.za/wp-content/plugins/oxygen-woocommerce/elements/assets/chevron-down.svg);
  background-size: 6px;
  background-repeat: no-repeat;
  background-position: 4px center;
  height: 100%;
}

.woocommerce .select2-container--default .select2-selection--single .select2-selection__clear {
    display: none;
    pointer-events: none;
}

.woocommerce .select2-container--default .select2-selection--single .select2-selection__arrow b {
  display: none;
}

/*---------------Headings----------------*/
.woocommerce .oxy-product-info h2,
.woocommerce .widget_recent_reviews h2,
.woocommerce .widget_top_rated_products h2,
.woocommerce .widget_shopping_cart h2,
.woocommerce .widget_products h2,
.woocommerce .widget_product_categories h2,
.woocommerce .widget_layered_nav_filters h2,
.woocommerce .woocommerce-widget-layered-nav h2,
.woocommerce .widget_rating_filter h2,
.woocommerce .widget_price_filter h2,
.woocommerce div.widget_product_tag_cloud h2,
.woocommerce h1.page-title,
.woocommerce h1.product_title,
.woocommerce section.related.products h2,
.oxy-product-upsells > :is(h1, h2, h3, h4, h5, h6),
.woocommerce h2.woocommerce-Reviews-title,
.woocommerce span.comment-reply-title,
.woocommerce-Tabs-panel h2,
h2.woocommerce-order-downloads__title,
.woocommerce-orders article header h1,
.woocommerce-account article header h1,
.woocommerce-downloads article header h1,
.woocommerce-edit-address article header h1,
.woocommerce-account h2,
.woocommerce-Address-title h3,
.woocommerce-MyAccount-content h3,
.woocommerce-EditAccountForm legend,
h1.oxy-woo-archive-title,
h2.woocommerce-column__title,
h2.woocommerce-order-downloads__title,
h2.woocommerce-order-details__title,
.woocommerce-billing-fields h3,
.woocommerce-checkout h3,
.woocommerce .cart_totals h2,
.woocommerce .cross-sells h2 {
  color: #000000;
  font-weight: 700;
  line-height: 1.2;
  margin-bottom: 8px;
}

/*--------Prices and Quantity------------*/
.woocommerce .price_label .from,
.woocommerce .price_label .to,
.woocommerce ul.products li.product .price,
.product-quantity,
.woocommerce .price ins,
.woocommerce-Price-amount,
.woocommerce-loop-category__title .count,
.woocommerce .price {
  color: #000000;
  font-weight: 700;
  font-size: 16px;
  background: transparent;
  text-decoration: none;
}

/*----Sale Price-----*/
.woocommerce .product_list_widget del span.woocommerce-Price-amount,
.woocommerce ul.products li.product .price del,
.woocommerce .price del,
.woocommerce .price del .woocommerce-Price-amount {
  font-size: 12px;
  font-weight: 200;
  color: #666666;
}

.woocommerce div.product p.price,
.woocommerce div.product span.price,
.woocommerce div.product span.price ins {
  color: #000000;
  font-weight: 700;
  font-size: inherit;
}

.woocommerce div.product p.price {
  font-size: 16px;
}

.woocommerce div.product p.price ins,
.woocommerce .oxy-woo-element .price ins {
  text-decoration: none;
}

.woocommerce div.product p.price del,
.woocommerce div.product span.price del,
.woocommerce p.price del,
.woocommerce ul.products li.product .price del {
  opacity: 1;
  display: block;
}

/*--------------Table Headings----------------*/
.woocommerce-cart table.cart th,
.woocommerce-cart .cart-collaterals .cart_totals table th,
.woocommerce table.shop_table th,
.woocommerce table.shop_table tfoot th {
  font-weight: 400;
  color: #666666;
  font-size: 10px;
  text-align: left;
  text-transform: uppercase;
  letter-spacing: 1px;
}

/*-------------------Texts---------------------*/
.woocommerce .woocommerce-mini-cart__total strong,
.woocommerce .woocommerce-mini-cart span.quantity,
.woocommerce .widget_product_categories span.count,
.woocommerce .woocommerce-widget-layered-nav-list__item span,
.woocommerce-product-attributes-item__value p,
.woocommerce-error,
.woocommerce-table--order-downloads,
.woocommerce-Address address,
.woocommerce-orders-table,
.woocommerce-table,
ul.woocommerce-shipping-methods,
p.woocommerce-shipping-destination,
.woocommerce-column--shipping-address address,
.woocommerce-column--billing-address address,
.woocommerce-order p,
.woocommerce .product-name,
.woocommerce .product-total,
.oxy-product-stock p,
.oxy-product-description p,
.woocommerce-Reviews .comment-text p,
.product .summary .product_meta,
.woocommerce-Tabs-panel,
.woocommerce-product-details__short-description p,
.woocommerce-form-track-order p,
.woocommerce-checkout-payment p,
.checkout_coupon p,
.woocommerce-ResetPassword p,
.woocommerce-info,
.woocommerce-error,
.woocommerce-message,
.woocommerce-MyAccount-content p,
.woocommerce-breadcrumb,
p.woocommerce-result-count {
  color: #666666;
  font-weight: 400;
  line-height: 1.6;
  font-size: 16px;
  font-style: normal;
}

/*------------Bold Texts---------------*/
.woocommerce-product-attributes-item__label,
.woocommerce-error strong,
.woocommerce-MyAccount-content strong,
.woocommerce-shipping-destination strong,
.woocommerce p.order-info mark,
.woocommerce-MyAccount-content mark.order-number,
.woocommerce-MyAccount-content mark.order-date,
.woocommerce-MyAccount-content mark.order-status,
.woocommerce-order-overview strong {
  color: #000000;
  font-weight: 700;
  font-family: inherit;
  background: transparent;
}

/*--------------------Badges---------------------*/
.woocommerce ul.products li.product .onsale,
.woocommerce span.onsale {
  background: #65bec2;
  font-size: 12px;
  padding: 6px 12px;
  line-height: 1.2;
  border-radius: 20px;
  min-width: 0;
  min-height: 0;
  margin: 0;
  top: 12px;
  left: 12px;
  right: auto;
  position: absolute;
}

/* ----------------- */


/*-------------Product Tabs(description, addtl info, reviews) - single product--------------*/

.woocommerce div.product .oxy-woo-element .woocommerce-tabs .panel,
.woocommerce .oxy-woo-element div.product .woocommerce-tabs .panel {
  margin-bottom: 0;
  padding: 20px 0;
}
.woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs,
.woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs {
  padding-left: 5px;
  display: flex;
  text-align: center;
  margin-bottom: 0;
  flex-shrink: 0;
}

.woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs li,
.woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs li {
  border-radius: 0;
  padding: 0;
  margin: 0 5px;
  display: flex;
  align-items: center;
}
.woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs li::before,
.woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs li::before {
  display: none;
}
.woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs li::after,
.woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs li::after {
  display: none;
}
.woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs li a,
.woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs li a {
  width: 100%;
  color: #999;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 1px;
  outline: none;
  padding: 16px 48px;
  z-index: 1000;
  font-weight: 400;
  border-radius: 0;
  word-break: break-word;
}
.woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs li a:hover,
.woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs li a:hover {
  color: #65bec2;
}
.woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs li.active,
.woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs li.active {
  background: white;
  border-bottom-color: white;
}
.woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs li.active a,
.woocommerce
  div.product
  .oxy-woo-element
  .woocommerce-tabs
  ul.tabs
  li.active
  a {
  color: #000000;
}

@media (max-width: 640px) {
  .woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs,
  .woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs {
    flex-direction: column;
    padding: 0;
    margin-bottom: 5px;
  }
  .woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs li,
  .woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs li {
    margin: 5px 0;
  }
  .woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs::before,
  .woocommerce div.product .oxy-woo-element .woocommerce-tabs ul.tabs::before {
    border-bottom: none;
  }
  .woocommerce .oxy-woo-element div.product .woocommerce-tabs ul.tabs li.active,
  .woocommerce
    div.product
    .oxy-woo-element
    .woocommerce-tabs
    ul.tabs
    li.active {
    border-bottom-color: #d3ced2;
  }
}

/* tabs panel content (single product, any tab content) */

.woocommerce .oxy-woo-element table.shop_attributes th,
.woocommerce .oxy-woo-element table.shop_attributes td {
  border-top: 1px solid #d3ced2;
  padding: 8px;
}

/* single product - add to cart */

.woocommerce .oxy-product-cart-button,
.woocommerce .oxy-woo-element div.product form.cart {
  width: 100%;
  max-width: 360px;
}

.woocommerce .oxy-woo-element div.product .single_add_to_cart_button,
.woocommerce .single_add_to_cart_button {
  align-self: stretch;
  flex-grow: 1;
  border-radius: 0;
}

.woocommerce .oxy-woo-element div.product form.cart,
.woocommerce .oxy-product-cart-button form.cart,
.woocommerce div.product form.cart {
  display: flex;
  flex-wrap: wrap;
}

.woocommerce .oxy-woo-element div.product form.variations_form.cart,
.woocommerce .oxy-product-cart-button form.variations_form.cart {
  display: flex;
  flex-direction: column;
  align-items: stretch;
}

.woocommerce .oxy-woo-element div.product form.cart td.value,
.woocommerce .oxy-product-cart-button td.value {
  padding: 0;
}

.woocommerce .oxy-woo-element div.product .woocommerce-variation-add-to-cart,
.woocommerce .woocommerce-variation-add-to-cart {
  display: flex;
  width: 100%;
}

/* Primary Buttons */
.woocommerce .widget_shopping_cart .buttons a.checkout.wc-forward,
.woocommerce button[type=submit],
.woocommerce button[name=woocommerce-form-login__submit],
.woocommerce button[name=save_account_details],
.woocommerce button[name=save_address],
.woocommerce .oxy-woo-element div.product form.cart button.button.alt,
.woocommerce .oxy-product-cart-button button.button.alt,
.woocommerce div.product form.cart .button {
  background-color: #65bec2;
  color: #ffffff;
  border-radius: 0;
  letter-spacing: 1px;
  text-transform: uppercase;
  padding: 16px 24px;
  font-size: 12px;
  text-align: center;
  border: 1px solid #65bec2;
  border-radius: 4px;
  line-height: 1.2;
  font-weight: 700;
  font-family: inherit;
  outline: none;
  cursor: pointer;
}
.woocommerce button[type=submit]:hover,
.woocommerce button[name=woocommerce-form-login__submit]:hover,
.woocommerce button[name=save_account_details]:hover,
.woocommerce button[name=save_address]:hover,
.woocommerce .oxy-woo-element div.product form.cart button.button.alt:hover,
.woocommerce .oxy-product-cart-button button.button.alt:hover,
.woocommerce div.product form.cart .button:hover {
  background-color: #6799b2;
  border: 1px solid #6799b2;
}

.woocommerce .oxy-woo-element div.product form.cart button.button.alt.disabled,
.woocommerce button.button.alt.disabled {
  background: #cccccc !important;
  border: 1px solid #cccccc !important;
  opacity: 1;
}

.woocommerce .quantity .qty {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  min-width: 56px;
  padding: 8px 9px;
  margin-right: 12px;
  background: url(https://collegesa.co.za/wp-content/plugins/oxygen-woocommerce/elements/assets/chevron-down.svg),
    url(https://collegesa.co.za/wp-content/plugins/oxygen-woocommerce/elements/assets/chevron-up.svg), #ffffff;
  background-size: 6px, 6px;
  background-repeat: no-repeat, no-repeat;
  background-position: right 0.8em bottom calc(50% - 5px), right 0.8em top calc(50% - 5px);
  height: 100%;
}

.woocommerce table.variations tr {
  border-top: none;
}

.woocommerce .oxy-woo-element div.product form.cart .variations,
.woocommerce div.product .oxy-product-cart-button form.cart .variations {
  margin-bottom: 0;
}

.woocommerce .oxy-woo-element div.product form.cart table.variations tr,
.woocommerce table.variations tr {
  display: flex;
  flex-direction: column;
}

.woocommerce
  .oxy-woo-element
  div.product
  form.cart
  table.variations
  tr
  td
  label,
.woocommerce .oxy-product-cart-button table.variations tr td label {
  font-size: 12px;
  margin-right: 12px;
}

.woocommerce .oxy-woo-element div.product form.cart table.variations tr td a,
.woocommerce .oxy-product-cart-button table.variations tr td a {
  font-size: 12px;
}

.woocommerce .oxy-woo-element div.product form.cart a.reset_variations:before,
.woocommerce .oxy-product-cart-button table.variations tr td a:before {
  content: "× ";
}

.woocommerce .oxy-woo-element div.product form.cart .variations,
.woocommerce .oxy-product-cart-button div.product form.cart .variations {
  margin-bottom: 0;
}

.woocommerce .woocommerce-ordering select,
.woocommerce .oxy-woo-element div.product form.cart .variations select,
.woocommerce div.product .oxy-product-cart-button form.cart .variations select,
.woocommerce div.product form.cart .variations select,
.woocommerce form.cart .variations select {
  appearance: none;
  -moz-appearance: none;
  -webkit-appearance: none;
  line-height: 1.2;
  cursor: pointer;
  width: 100%;
  position: relative;
  background: url(https://collegesa.co.za/wp-content/plugins/oxygen-woocommerce/elements/assets/chevron-down.svg), #ffffff;
  background-size: 6px;
  padding-right: 24px;
  background-repeat: no-repeat;
  background-position: right 0.8em center;
}

.woocommerce input[type="number"]::-webkit-inner-spin-button,
.woocommerce input[type="number"]::-webkit-outer-spin-button {
  margin-right: -9px;
  opacity: 0.01;
  width: 24px;
  height:48px;
  cursor: pointer;
}

/* single product - rating below title / rating element */

.woocommerce .oxy-woo-element div.product .woocommerce-product-rating,
.woocommerce .oxy-product-rating .woocommerce-product-rating,
.woocommerce div.product .oxy-product-rating .woocommerce-product-rating {
  display: flex;
  align-items: center;
  margin-bottom: 8px;
}

.woocommerce
  .oxy-woo-element
  div.product
  .woocommerce-product-rating
  .star-rating::before,
.woocommerce .oxy-product-rating .star-rating::before {
  position: relative;
  color: #d3d3d3;
}

.woocommerce
  .oxy-woo-element
  div.product
  .woocommerce-product-rating
  .star-rating,
.woocommerce .oxy-product-rating .woocommerce-product-rating .star-rating {
  width: auto;
  letter-spacing: 2px;
  margin: 0 0 0 0;
}

.woocommerce
  .oxy-woo-element
  div.product
  .woocommerce-product-rating
  a.woocommerce-review-link,
.woocommerce .oxy-product-rating a.woocommerce-review-link {
  font-size: 12px;
}
.woocommerce
  .oxy-woo-element
  div.product
  .woocommerce-product-rating
  .star-rating
  span,
.woocommerce .oxy-product-rating .woocommerce .star-rating span {
  color: #65bec2;
}

/* Transitions */
.woocommerce .flex-control-thumbs li,
.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item,
.select2-search--dropdown .select2-search__field,
.woocommerce
  label.woocommerce-form__label.woocommerce-form__label-for-checkbox
  span::before,
.woocommerce ul.tabs li,
.woocommerce .woocommerce-product-gallery__trigger:after,
.woocommerce .woocommerce-product-gallery__trigger:before,
.woocommerce img:not(.zoomImg):not(.pswp__img),
.woocommerce textarea,
.woocommerce .checkbox,
.woocommerce .select2-selection,
.woocommerce input,
.woocommerce button,
.woocommerce select,
.woocommerce a {
  transition: all ease 0.2s;
}
/* End of Transitions */

/* Input Styles */
.woocommerce-cart table.cart td.actions .coupon .input-text,
.select2-container--default .select2-search--dropdown .select2-search__field,
.woocommerce textarea,
.select2-dropdown,
.woocommerce .select2-selection,
.woocommerce input[type="search"],
.woocommerce input[type="text"],
.woocommerce input[type="number"],
.woocommerce input[type="tel"],
.woocommerce input[type="email"],
.woocommerce input[type="password"],
.woocommerce select {
  height: auto;
  font-size: 14px;
  border: 1px solid #d3ced2;
  background: #ffffff;
  color: #000000;
  outline: none;
  font-family: inherit;
  padding: 8px 12px;
  border-radius: 4px;
  resize: none;
}
/* Focus State */
.woocommerce-cart table.cart td.actions .coupon .input-text:focus,
.select2-container--default .select2-search--dropdown .select2-search__field:focus,
.woocommerce form .form-row textarea:focus,
.woocommerce textarea:focus,
.select2-dropdown:focus,
.woocommerce .select2-selection:focus,
.woocommerce input[type="search"]:focus,
.woocommerce input[type="text"]:focus,
.woocommerce input[type="number"]:focus,
.woocommerce input[type="tel"]:focus,
.woocommerce input[type="email"]:focus,
.woocommerce input[type="password"]:focus,
.woocommerce select:focus {
  border: 1px solid #65bec2;
  box-shadow: 0 0 5px #65bec2;
}
/* End of Inputs */

/* Custom Checkbox */
.woocommerce-form-login input[type="checkbox"],
.oxy-woo-checkout input[type="checkbox"] {
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  opacity: 0.01;
  display: none !important;
}
.woocommerce-form-login
  label.woocommerce-form__label.woocommerce-form__label-for-checkbox.woocommerce-form-login__rememberme,
.oxy-woo-checkout
  label.woocommerce-form__label.woocommerce-form__label-for-checkbox {
  position: relative;
  cursor: pointer;
  padding-left: 16px;
  margin-top: 0;
}
.woocommerce-form-login
  label.woocommerce-form__label.woocommerce-form__label-for-checkbox.woocommerce-form-login__rememberme span,
.oxy-woo-checkout
  label.woocommerce-form__label.woocommerce-form__label-for-checkbox span{
    margin-left: 18px;
}
.woocommerce-form-login
  label.woocommerce-form__label.woocommerce-form__label-for-checkbox.woocommerce-form-login__rememberme
  span::before,
.oxy-woo-checkout
  label.woocommerce-form__label.woocommerce-form__label-for-checkbox
  span::before {
  width: 24px;
  height: 24px;
  border: 1px solid #d3ced2;
  background-color: #ffffff;
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  background-size: 50%;
  border-radius: 4px;
  background-repeat: no-repeat;
  background-position: center center;
}
input[type="checkbox"]:checked ~ span::before,
input[type="checkbox"]:checked ~ label span::before {
  background: url(https://collegesa.co.za/wp-content/plugins/oxygen-woocommerce/elements/assets/check-mark.svg), #ffffff;
}
.woocommerce-form-login
  label.woocommerce-form__label.woocommerce-form__label-for-checkbox.woocommerce-form-login__rememberme {
  margin-top: 34px;
}
.oxy-woo-checkout
  label.woocommerce-form__label.woocommerce-form__label-for-checkbox
  span::before {
  margin-top: -4px;
}
/* End of Custom Checkbox */

/* Product Column Fix */
.woocommerce-page.columns-1 ul.products li.product,
.woocommerce.columns-1 ul.products li.product {
  width: 100%;
}
.woocommerce-page.columns-2 ul.products li.product,
.woocommerce.columns-2 ul.products li.product {
  margin: 0;
  width: 50%;
}
.woocommerce-page.columns-3 ul.products li.product,
.woocommerce.columns-3 ul.products li.product {
  margin: 0;
  width: 33.33%;
}
.woocommerce ul.products li.product,
.woocommerce-page ul.products li.product {
  width: 25%;
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 20px;
}
.woocommerce-page.columns-5 ul.products li.product,
.woocommerce.columns-5 ul.products li.product {
  margin: 0;
  width: 20%;
}
.woocommerce-page.columns-6 ul.products li.product,
.woocommerce.columns-6 ul.products li.product {
  margin: 0;
  width: 16.6%;
}
/* End of Product Column Fix */

/*--- Radio Buttons Style ---*/
.woocommerce input[type=radio] {
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  width: 24px;
  height: 24px;
  background: #ffffff;
  border: 1px solid #d3ced2;
  border-radius: 100%;
  outline: none;
  cursor: pointer;
}

/* WooCommerce Payments plugin compatibility */
.woocommerce input[type=radio].woocommerce-SavedPaymentMethods-tokenInput {
  width: 20px !important;
  height: 20px !important;
  margin: 6px 8px 0 0 !important;
}

.woocommerce input[type=radio]:hover {
  border: 1px solid #65bec2;
  box-shadow: 0 0 5px #65bec2;
}

.woocommerce input[type=radio]:checked {
  background: #000000;
  box-shadow: inset 0 0 0 8px #ffffff;
}

/* WooCommerce Payments plugin compatibility */
.woocommerce input[type=radio].woocommerce-SavedPaymentMethods-tokenInput:checked {
  box-shadow: inset 0 0 0 4px #ffffff;
}

.woocommerce input[type=radio]:checked:hover {
  box-shadow: inset 0 0 0 8px #ffffff, 0 0 5px #65bec2;
}

/*--------------------Tables and Forms Style-------------------------*/
.oxy-woo-order-tracking form,
.woocommerce form.woocommerce-ResetPassword.lost_reset_password,
.woocommerce .woocommerce-EditAccountForm,
.woocommerce .woocommerce-address-fields,
.woocommerce-cart .cart-collaterals .cart_totals table,
.woocommerce .col2-set,
.woocommerce-form-coupon,
.woocommerce #reviews #comments ol.commentlist li .comment-text,
ul.woocommerce-order-overview,
.woocommerce form.login,
.woocommerce form.register,
.woocommerce form.checkout_coupon,
.woocommerce table.shop_table {
  border: 1px solid #d3ced2;
  border-top: 3px solid #65bec2;
  border-radius: 0;
  background: #ffffff;
  padding: 20px;
  border-collapse: collapse;
  box-shadow: var(--box-shadow) 0 10px 20px;
}
fieldset {
  background: transparent;
}
.woocommerce table tr {
  border-top: 1px solid #d3ced2;
}
.woocommerce table.shop_table td,
.woocommerce table.shop_table tfoot td,
.woocommerce table.shop_table tfoot th,
.woocommerce table.shop_table th {
  border: none;
  padding: 12px 20px;
  font-weight: 400;
  color: #666666;
}
/* End of Tables and Forms Styles */



/* Notification Styles */
.woocommerce-info, .woocommerce-error, .woocommerce-message {
  padding-right: 20px;
  border-bottom: 1px solid #d3ced2;
  border-left: 1px solid #d3ced2;
  border-right: 1px solid #d3ced2;
  border-radius: 0;
  background: #ffffff;
  border-collapse: collapse;
  box-shadow: var(--box-shadow) 0 10px 20px;
}
/* Info */
.woocommerce-info::before {
  color: #00adef;
}
.woocommerce-info {
  border-top-color: #00adef;
}
/* Error */
.woocommerce-error::before {
  color: #e96199;
}
.woocommerce-error {
  border-top-color: #e96199;
}
/* Message */
.woocommerce-message::before {
  color: #65bec2;
}
.woocommerce-message {
  border-top-color: #65bec2;
}
/* End of Notification Sytles */


/* Shop, Uppsells, Related Product Shared Styles Styles */
.woocommerce ul.products {
  display: flex;
  flex-wrap: wrap;
  margin: -10px -20px 20px;
}
.woocommerce ul.products li.product .button {
  margin-top: auto;
}
.woocommerce a.added_to_cart {
  margin-top: 12px;
}
.woocommerce-loop-product__link {
  display: flex;
  flex-direction: column;
}

/* Product Info Shared Styles */

.woocommerce .oxy-product-info,
.woocommerce .oxy-product-tabs {
  width: 100%;
}

.woocommerce table.shop_attributes {
  border-top: 1px solid #d3ced2;
  border-collapse: collapse;
}

.woocommerce table.shop_attributes tr:nth-child(even) td,
.woocommerce table.shop_attributes tr:nth-child(even) th {
  background: transparent;
}

.woocommerce table.shop_attributes th,
.woocommerce table.shop_attributes td {
  border-bottom: 1px solid #d3ced2;
  text-align: left;
}


/* Widgets Headings */
.ct-widget .widget.woocommerce .widgettitle {
  font-size: px;
  font-weight: ;
  font-family: ;
}
/* End of Widgets Headings */


/* Search Products Widget */
.woocommerce form.woocommerce-product-search {
  width: 100%;
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
}
.woocommerce input.search-field {
  flex-grow: 1;
  margin-right: 8px;
  min-width: 120px;
}
/* End of Widget */



/* Product Tags Cloud Widget */
.woocommerce div.tagcloud {
  line-height: 1.2;
}
/* End of Widget */



/* Filter by Price Widget */
.woocommerce .widget_price_filter .ui-slider {
  margin: 20px 0;
}
.woocommerce .widget_price_filter .price_slider_wrapper .ui-widget-content {
  background-color: #d3ced2;
}
.woocommerce .widget_price_filter .ui-slider .ui-slider-handle {
  width: 24px;
  height: 24px;
  background-color: #65bec2;
  top: -8px;
}
.woocommerce .widget_price_filter .ui-slider .ui-slider-range {
  background-color: #65bec2;
}
.woocommerce .widget_price_filter .price_slider_amount {
  display: flex;
  flex-direction: row;
  align-items: center;
}
.woocommerce .widget_price_filter .price_slider_amount .button {
  margin-right: 12px;
}
.woocommerce .price_label {
  text-align: left;
  line-height: 1.6;
}
/* End of Widget */



/* Rating Filter Widget */
.woocommerce .widget_rating_filter ul li a {
  display: flex;
  float: left;
  align-items: center;
}
.woocommerce .widget_rating_filter ul li.chosen a::before {
  color: #d3ced2;
  position: relative;
  content: '×';
  margin-right: 4px;
  top: -1px;
}
.woocommerce .widget_rating_filter ul li.chosen:hover a::before {
  color: #65bec2;
}
/* End of Widget */



/* Attributes Filter Widget */
.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item--chosen a::before {
  color: #d3ced2;
  position: relative;
  content: '×';
  margin-right: 4px;
  top: -1px;
}
.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item--chosen:hover a::before {
  color: #65bec2;
}
/* End of Widget */



/* Active Filters Widget */
.woocommerce .widget_layered_nav_filters ul li a::before {
  color: #d3ced2;
  position: relative;
  content: '×';
  margin-right: 4px;
  top: -1px;
}
.woocommerce .widget_layered_nav_filters ul li:hover a::before {
  color: #65bec2;
}
.woocommerce .widget_layered_nav_filters ul li:hover span.woocommerce-Price-amount {
  color: #65bec2;
}
/* End of Widget */



/* Product Categories Widget */
.woocommerce .widget_product_categories ul {
  padding-left: 20px;
  list-style: none;
}
.woocommerce .widget_product_categories ul li::before {
  color: #d3ced2;
  content: '•';
  position: relative;
  margin-right: 8px;
  margin-left: -20px;
}
.woocommerce .widget_product_categories ul.product-categories {
  margin-top: 0;
}
.woocommerce .widget_product_categories .select2-container .select2-selection--single {
  height: auto;
  border-color: #d3ced2;
  background: url(https://collegesa.co.za/wp-content/plugins/oxygen-woocommerce/elements/assets/chevron-down.svg), #ffffff;
  background-size: 6px;
  background-repeat: no-repeat;
  background-position: right 0.8em center;
}
.woocommerce .widget_product_categories .select2-container .select2-selection--single:focus {
  border-color: #65bec2;
}
.woocommerce .widget_product_categories .select2-container--default .select2-selection--single .select2-selection__arrow {
  display: none;
}
.woocommerce .select2-container--open .select2-dropdown--below {
  border-color: #d3ced2
}
.woocommerce .select2-container--open .select2-dropdown--above {
  padding: 0;
  border-color: #d3ced2;
}
.woocommerce .select2-container--default .select2-search--dropdown .select2-search__field {
  border-color: #d3ced2;
}
.woocommerce .select2-container--default .select2-search--dropdown .select2-search__field:focus {
  border-color: #65bec2;
}
.woocommerce .select2-container--default .select2-selection--single .select2-selection__clear {
  font-weight: 300;
  color: #d3ced2;
  font-size: 24px;
  line-height: 1;
}
.woocommerce .select2-container--default .select2-selection--single:hover .select2-selection__clear {
  color: #65bec2;
}
/* End of Widget */



/* Products, Cart Widgets */
.woocommerce .product_list_widget ins {
  text-decoration: none;
}
.woocommerce .product_list_widget del {
  color: #666666;
}
.woocommerce ul.product_list_widget li img {
  border: 1px solid #d3ced2;
  width: 40px;
  float: left;
  margin-bottom: 16px;
  margin-right: 12px;
  margin-left: 0;
  margin-top: 4px;
}
.woocommerce ul.product_list_widget li {
  border-bottom: 1px solid #d3ced2;
  margin-bottom: 4px;
  padding-bottom: 8px;
}
.woocommerce .product_list_widget .reviewer {
  font-size: 12px;
  color: #666666;
}
.woocommerce .widget_shopping_cart .cart_list li a.remove, .woocommerce.widget_shopping_cart .cart_list li a.remove {
  right: 0;
  left: auto;
  color: #d3ced2 !important;
  font-weight: 300;
}
.woocommerce .widget_shopping_cart .cart_list li a.remove:hover, .woocommerce.widget_shopping_cart .cart_list li a.remove:hover {
  color: #65bec2 !important;
  background: none;
  text-decoration: none;
}
.woocommerce .widget_shopping_cart .cart_list li, .woocommerce.widget_shopping_cart .cart_list li {
  padding-left: 0;
}
.woocommerce .widget_shopping_cart .buttons a,
.woocommerce.widget_shopping_cart .buttons a {
  margin-right: 0;
}
/* End of Widget */

/*---Safari Row Hotfix---*/
.woocommerce .products ul::after,
.woocommerce .products ul::before,
.woocommerce ul.products::after,
.woocommerce ul.products::before {
  width: 100%;
}

/*---Product Title Hotfix (Must be in product-title.css)---*/
.woocommerce h1.product_title.oxy-product-title {
  margin: 0;
}

/*---Fix for shopping cart duplication issue on AJAX update---*/
.ct-modal .woocommerce-cart-form:not(:nth-child(2)) {
  display: none;
}

.ct-modal .cart-collaterals > .cart_totals:not(:nth-child(1)) {
  display: none;
}

/*---Fix for WooCommerce Payments credit card images on checkout---*/
.woocommerce label[for="payment_method_woocommerce_payments"],
.woocommerce label[for="payment_method_bacs"],
.woocommerce label[for="payment_method_cod"] {
  display: flex;
  flex-direction: row;
}

.woocommerce label[for="payment_method_woocommerce_payments"] img,
.woocommerce label[for="payment_method_bacs"] img,
.woocommerce label[for="payment_method_cod"] img {
  width: 32px;
}
.oxy-pro-menu .oxy-pro-menu-container:not(.oxy-pro-menu-open-container):not(.oxy-pro-menu-off-canvas-container) .sub-menu{
box-shadow:px px px px ;}

.oxy-pro-menu .oxy-pro-menu-show-dropdown .oxy-pro-menu-list .menu-item-has-children > a svg{
transition-duration:0.4s;
}

.oxy-pro-menu .oxy-pro-menu-show-dropdown .oxy-pro-menu-list .menu-item-has-children > a div{
margin-left:0px;
}

.oxy-pro-menu .oxy-pro-menu-mobile-open-icon svg{
width:30px;
height:30px;
}

.oxy-pro-menu .oxy-pro-menu-mobile-open-icon{
padding-top:15px;
padding-right:15px;
padding-bottom:15px;
padding-left:15px;
}

.oxy-pro-menu .oxy-pro-menu-mobile-open-icon, .oxy-pro-menu .oxy-pro-menu-mobile-open-icon svg{
transition-duration:0.4s;
}

.oxy-pro-menu .oxy-pro-menu-mobile-close-icon{
top:20px;
left:20px;
}

.oxy-pro-menu .oxy-pro-menu-mobile-close-icon svg{
width:24px;
height:24px;
}

.oxy-pro-menu .oxy-pro-menu-mobile-close-icon, .oxy-pro-menu .oxy-pro-menu-mobile-close-icon svg{
transition-duration:0.4s;
}

.oxy-pro-menu .oxy-pro-menu-container.oxy-pro-menu-off-canvas-container, .oxy-pro-menu .oxy-pro-menu-container.oxy-pro-menu-open-container{
background-color:#ffffff;
}

.oxy-pro-menu .oxy-pro-menu-off-canvas-container, .oxy-pro-menu .oxy-pro-menu-open-container{
background-image:url();
}

.oxy-pro-menu .oxy-pro-menu-off-canvas-container .oxy-pro-menu-list .menu-item-has-children > a svg, .oxy-pro-menu .oxy-pro-menu-open-container .oxy-pro-menu-list .menu-item-has-children > a svg{
font-size:24px;
}

.oxy-pro-menu .oxy-pro-menu-dropdown-links-toggle.oxy-pro-menu-open-container .menu-item-has-children ul, .oxy-pro-menu .oxy-pro-menu-dropdown-links-toggle.oxy-pro-menu-off-canvas-container .menu-item-has-children ul{
background-color:rgba(0,0,0,0.2);
border-top-style:solid;
}

.oxy-pro-menu .oxy-pro-menu-container:not(.oxy-pro-menu-open-container):not(.oxy-pro-menu-off-canvas-container) .oxy-pro-menu-list{
                    flex-direction: row;
               }
.oxy-pro-menu .oxy-pro-menu-container .menu-item a{
                    text-align: left;
                    justify-content: flex-start;
                }
.oxy-pro-menu .oxy-pro-menu-container.oxy-pro-menu-open-container .menu-item, .oxy-pro-menu .oxy-pro-menu-container.oxy-pro-menu-off-canvas-container .menu-item{
                    align-items: flex-start;
                }

            .oxy-pro-menu .oxy-pro-menu-off-canvas-container{
                    top: 0;
                    bottom: 0;
                    right: auto;
                    left: 0;
               }
.oxy-pro-menu .oxy-pro-menu-container.oxy-pro-menu-open-container .oxy-pro-menu-list .menu-item a, .oxy-pro-menu .oxy-pro-menu-container.oxy-pro-menu-off-canvas-container .oxy-pro-menu-list .menu-item a{
                    text-align: left;
                    justify-content: flex-start;
                }

            .oxy-site-navigation {
--oxynav-brand-color:#4831B0;
--oxynav-neutral-color:#FFFFFF;
--oxynav-activehover-color:#EFEDF4;
--oxynav-background-color:#4831B0;
--oxynav-border-radius:0px;
--oxynav-other-spacing:8px;
--oxynav-transition-duration:0.3s;
--oxynav-transition-timing-function:cubic-bezier(.84,.05,.31,.93);
}

.oxy-site-navigation .oxy-site-navigation__mobile-close-wrapper{
text-align:left;
}

.oxy-site-navigation > ul{ left: 0; }
.oxy-site-navigation {
                        --oxynav-animation-name: none; 
                    }

                .oxy-site-navigation > ul:not(.open) > li[data-cta='true']:nth-last-child(1){ 
                    background-color: var(--oxynav-brand-color);
                    transition: var(--oxynav-transition-duration);
                    margin-left: var(--oxynav-other-spacing);
                    border: none;
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true']:nth-last-child(2){ 
                    background: transparent;
                    border: 1px solid currentColor;
                    transition: var(--oxynav-transition-duration);
                    margin-left: var(--oxynav-other-spacing);
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true']:nth-last-child(2):not(:hover) > img{
                    filter: invert(0) !important;
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true']:hover{
                    background-color: var(--oxynav-activehover-color);
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true']:nth-last-child(1) > a{
                    color: var(--oxynav-neutral-color);
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true']:nth-last-child(2) > a{
                    color: var(--oxynav-brand-color);
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true']:hover > a{
                    color: var(--oxynav-brand-color);
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true']:nth-last-child(1) > a::after{
                    color: var(--oxynav-neutral-color);   
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true']:nth-last-child(2) > a::after{
                    color: var(--oxynav-brand-color);   
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true']:hover > a::after{
                    color: var(--oxynav-brand-color);   
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true'] > ul{
                    display: none;
                }
.oxy-site-navigation > ul:not(.open) > li[data-cta='true'] > button, .oxy-site-navigation > ul:not(.open) > li[data-cta='true'] > ul{
                    display: none;
                }

                .ct-section-inner-wrap, .oxy-header-container{
  max-width: 1300px;
}
body {font-family: 'Poppins';}body {line-height: 1.6;font-size: 16px;font-weight: 400;color: #414042;}.oxy-nav-menu-hamburger-line {background-color: #414042;}h1, h2, h3, h4, h5, h6 {font-family: 'Poppins';font-size: 52px;font-weight: 700;color: #0d2651;}h2, h3, h4, h5, h6{font-size: 32px;color: #0d2651;}h3, h4, h5, h6{font-size: 22px;color: #0d2651;}h4, h5, h6{font-size: 20px;}h5, h6{font-size: 20px;}h6{font-size: 16px;}a {color: #ff3364;text-decoration: none;}.ct-link-text {text-decoration: ;}.ct-link {text-decoration: ;}.ct-link-button {border-radius: 3px;}.ct-section-inner-wrap {
padding-top: 75px;
padding-right: 20px;
padding-bottom: 75px;
padding-left: 20px;
}.ct-new-columns > .ct-div-block {
padding-top: 20px;
padding-right: 20px;
padding-bottom: 20px;
padding-left: 20px;
}.oxy-header-container {
padding-right: 20px;
padding-left: 20px;
}@media (max-width: 992px) {
				.ct-columns-inner-wrap {
					display: block !important;
				}
				.ct-columns-inner-wrap:after {
					display: table;
					clear: both;
					content: "";
				}
				.ct-column {
					width: 100% !important;
					margin: 0 !important;
				}
				.ct-columns-inner-wrap {
					margin: 0 !important;
				}
			}
.csa-support-contact__label {
 font-size:16px;
 line-height:1.5;
}
.csa-support-contact {
 gap:8px;
}
.csa-support-contact:not(.ct-section):not(.oxy-easy-posts),
.csa-support-contact.oxy-easy-posts .oxy-posts,
.csa-support-contact.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
gap:8px;
}
.csa-support-contact__item {
 text-align:left;
 gap:10px;
 text-decoration:none;
 color:#0d2651;
}
.csa-support-contact__item:not(.ct-section):not(.oxy-easy-posts),
.csa-support-contact__item.oxy-easy-posts .oxy-posts,
.csa-support-contact__item.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:nowrap;
align-items:center;
justify-content:flex-start;
gap:10px;
}
.csa-support-contact__icon {
 font-size:18px;
 line-height:0;
}
.csa-support-contact__icon:not(.ct-section):not(.oxy-easy-posts),
.csa-support-contact__icon.oxy-easy-posts .oxy-posts,
.csa-support-contact__icon.ct-section .ct-section-inner-wrap{
display:flex;
align-items:center;
}
.csa-icon-slot {
}
.csa-course-card__cta:hover{
 background-color:#e8005f;
}
.csa-course-card__cta {
 padding-left:20px;
 border-radius:50px;
 gap:12px;
 padding-right:20px;
 padding-top:6px;
 background-color:#ff3364;
 align-self:flex-end;
 margin-top:24px;
 padding-bottom:6px;
 transition-duration:0.3s;
}
.csa-course-card__cta:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__cta.oxy-easy-posts .oxy-posts,
.csa-course-card__cta.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
justify-content:center;
gap:12px;
}
@media (max-width: 767px) {
.csa-course-card__cta {
 padding-left:20px;
 padding-top:10px;
 padding-right:20px;
 flex-shrink:0;
 align-self:center;
 margin-top:0px;
 padding-bottom:10px;
 gap:8px;
}
.csa-course-card__cta:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__cta.oxy-easy-posts .oxy-posts,
.csa-course-card__cta.ct-section .ct-section-inner-wrap{
gap:8px;
}
}

.csa-course-card__cta-label {
 font-size:15px;
 color:#ffffff;
 line-height:1.6;
 font-weight:600;
}
@media (max-width: 767px) {
.csa-course-card__cta-label {
 font-size:13px;
}
}

.csa-course-card__cta-icon {
 font-size:13px;
 color:#ffffff;
 line-height:0;
}
.csa-product-tabs {
 background-color:#ffffff;
}
.csa-product-tabs:not(.ct-section):not(.oxy-easy-posts),
.csa-product-tabs.oxy-easy-posts .oxy-posts,
.csa-product-tabs.ct-section .ct-section-inner-wrap{
display:flex;
justify-content:center;
}
.csa-product-tabs__inner {
 width:100%;
 padding-top:8px;
 max-width:1300px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:72px;
}
.csa-product-tabs__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-product-tabs__inner.oxy-easy-posts .oxy-posts,
.csa-product-tabs__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:stretch;
}
@media (max-width: 767px) {
.csa-product-tabs__inner {
 padding-bottom:48px;
}
}

.tabs-7215-tab {
}
.tabs-7215-tab-active {
}
.csa-ptab {
 font-size:14px;
 color:#0d2651;
 line-height:1.4;
 font-weight:700;
 padding-bottom:10px;
}
@media (max-width: 767px) {
.csa-ptab {
}
}

.csa-ptab--enquire {
}
.tabs-contents-7215-tab {
 padding-left:0px;
 padding-right:0px;
}
.csa-ptab__panel {
 padding-top:8px;
 gap:12px;
 width:100%;
}
.csa-ptab__panel:not(.ct-section):not(.oxy-easy-posts),
.csa-ptab__panel.oxy-easy-posts .oxy-posts,
.csa-ptab__panel.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:12px;
}
@media (max-width: 767px) {
.csa-ptab__panel {
 padding-top:20px;
}
}

.csa-ptab__body {
 line-height:1.6;
}
.csa-product-head {
 background-color:#ffffff;
}
.csa-product-head:not(.ct-section):not(.oxy-easy-posts),
.csa-product-head.oxy-easy-posts .oxy-posts,
.csa-product-head.ct-section .ct-section-inner-wrap{
display:flex;
justify-content:center;
}
.csa-product-head__inner {
 width:100%;
 padding-top:48px;
 max-width:1300px;
 gap:64px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:56px;
}
.csa-product-head__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-product-head__inner.oxy-easy-posts .oxy-posts,
.csa-product-head__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:flex-start;
gap:64px;
}
@media (max-width: 991px) {
.csa-product-head__inner {
 padding-bottom:40px;
 padding-top:32px;
 gap:32px;
}
.csa-product-head__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-product-head__inner.oxy-easy-posts .oxy-posts,
.csa-product-head__inner.ct-section .ct-section-inner-wrap{
flex-direction:column-reverse;
gap:32px;
}
}

.csa-product-head__copy {
 flex-shrink:1;
 gap:20px;
 width:100%;
}
.csa-product-head__copy:not(.ct-section):not(.oxy-easy-posts),
.csa-product-head__copy.oxy-easy-posts .oxy-posts,
.csa-product-head__copy.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
gap:20px;
}
.csa-product-head__crumbs {
 font-size:13px;
 color:#808285;
 line-height:1.5;
}
.csa-product-head__title {
 font-size:32px;
 color:#0d2651;
 line-height:1.25;
 font-weight:700;
}
@media (max-width: 991px) {
.csa-product-head__title {
 font-size:28px;
}
}

@media (max-width: 767px) {
.csa-product-head__title {
 font-size:24px;
}
}

.csa-product-head__terms {
 gap:8px;
}
.csa-product-head__terms:not(.ct-section):not(.oxy-easy-posts),
.csa-product-head__terms.oxy-easy-posts .oxy-posts,
.csa-product-head__terms.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:wrap;
gap:8px;
}
.csa-product-term {
 font-size:12px;
 line-height:1.5;
 border-radius:50px;
 padding-top:5px;
 background-color:#e6f9ff;
 color:#0d2651;
 padding-bottom:5px;
 padding-left:14px;
 padding-right:14px;
 font-weight:500;
}
.csa-product-term:not(.ct-section):not(.oxy-easy-posts),
.csa-product-term.oxy-easy-posts .oxy-posts,
.csa-product-term.ct-section .ct-section-inner-wrap{
display:inline-flex;
align-items:center;
}
.csa-product-head__price {
 font-size:24px;
 color:#ff3364;
 line-height:1.3;
 font-weight:700;
}
@media (max-width: 767px) {
.csa-product-head__price {
 font-size:22px;
}
}

.csa-product-head__deposit {
 font-size:14px;
 color:#414042;
 line-height:1.6;
}
.csa-product-head__excerpt {
 line-height:1.6;
}
.csa-product-head__actions {
 gap:12px;
}
.csa-product-head__actions:not(.ct-section):not(.oxy-easy-posts),
.csa-product-head__actions.oxy-easy-posts .oxy-posts,
.csa-product-head__actions.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:wrap;
gap:12px;
}
.csa-product-cta {
 height:42px;
 border-radius:50px;
 background-color:#ff3364;
 gap:8px;
 padding-right:24px;
 padding-left:24px;
}
.csa-product-cta:not(.ct-section):not(.oxy-easy-posts),
.csa-product-cta.oxy-easy-posts .oxy-posts,
.csa-product-cta.ct-section .ct-section-inner-wrap{
display:inline-flex;
flex-direction:row;
align-items:center;
justify-content:center;
gap:8px;
}
.csa-product-cta__label {
 font-size:14px;
 color:#ffffff;
 line-height:1;
 font-weight:500;
}
.csa-product-head__media {
 width:80%;
 flex-shrink:1;
}
@media (max-width: 991px) {
.csa-product-head__media {
 width:100%;
}
}

.csa-product-head__image {
 object-fit:cover;
 width:100%;
 border-radius:16px;
}
.csa-product-head__image:not(.ct-section):not(.oxy-easy-posts),
.csa-product-head__image.oxy-easy-posts .oxy-posts,
.csa-product-head__image.ct-section .ct-section-inner-wrap{
display:block;
}
.csa-result__body {
 width:100%;
 padding-top:15px;
 padding-right:17px;
 padding-bottom:17px;
 padding-left:19px;
 flex-grow:1;
}
.csa-result__body:not(.ct-section):not(.oxy-easy-posts),
.csa-result__body.oxy-easy-posts .oxy-posts,
.csa-result__body.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:stretch;
}
.csa-result__excerpt {
 font-size:13px;
 color:#868686;
 margin-top:12px;
 line-height:1.385;
}
.csa-results__head {
 margin-bottom:48px;
 gap:12px;
}
.csa-results__head:not(.ct-section):not(.oxy-easy-posts),
.csa-results__head.oxy-easy-posts .oxy-posts,
.csa-results__head.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:12px;
}
@media (max-width: 767px) {
.csa-results__head {
 margin-bottom:32px;
}
}

.csa-result__image {
 width:100%;
 height:100%;
 position:absolute;
 left:0px;
 object-fit:cover;
 top:0px;
}
.csa-result__image:not(.ct-section):not(.oxy-easy-posts),
.csa-result__image.oxy-easy-posts .oxy-posts,
.csa-result__image.ct-section .ct-section-inner-wrap{
display:block;
}
.csa-results__title {
 margin-bottom:0px;
 color:#0d2651;
 margin-top:0px;
}
.csa-results__list {
 gap:34px;
}
.csa-results__list:not(.ct-section):not(.oxy-easy-posts),
.csa-results__list.oxy-easy-posts .oxy-posts,
.csa-results__list.ct-section .ct-section-inner-wrap{
gap:34px;
}
@media (max-width: 991px) {
.csa-results__list {
 gap:24px;
}
.csa-results__list:not(.ct-section):not(.oxy-easy-posts),
.csa-results__list.oxy-easy-posts .oxy-posts,
.csa-results__list.ct-section .ct-section-inner-wrap{
gap:24px;
}
}

.csa-result__foot {
 gap:12px;
 padding-top:16px;
 margin-top:auto;
}
.csa-result__foot:not(.ct-section):not(.oxy-easy-posts),
.csa-result__foot.oxy-easy-posts .oxy-posts,
.csa-result__foot.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:nowrap;
align-items:center;
justify-content:space-between;
gap:12px;
}
.csa-result__badge {
 position:absolute;
 left:11px;
 z-index:1;
 top:9px;
 line-height:0;
}
.csa-result__cta {
 padding-bottom:2px;
 border-left-color:#000000;
 border-right-width:1px;
 padding-top:2px;
 border-width:1;
 border-top-color:#000000;
 border-top-width:1px;
 background-color:#ffffff;
 border-bottom-style:solid;
 line-height:1.571;
 border-bottom-width:1px;
 padding-left:18px;
 text-decoration:none;
 border-color:#000000;
 border-top-style:solid;
 flex-shrink:0;
 border-bottom-color:#000000;
 border-right-style:solid;
 font-weight:600;
 font-size:14px;
 text-align:center;
 border-left-style:solid;
 padding-right:18px;
 color:#0d2651;
 border-radius:15px;
 border-left-width:1px;
 border-style:solid;
 border-right-color:#000000;
}
.csa-result__cta:not(.ct-section):not(.oxy-easy-posts),
.csa-result__cta.oxy-easy-posts .oxy-posts,
.csa-result__cta.ct-section .ct-section-inner-wrap{
display:inline-block;
}
.csa-result__media {
 flex-shrink:0;
 position:relative;
}
.csa-results__filters {
 margin-bottom:48px;
}
@media (max-width: 767px) {
.csa-results__filters {
 margin-bottom:32px;
}
}

.csa-results__empty {
 font-size:16px;
 color:#0d2651;
}
.csa-result {
 border-bottom-style:solid;
 border-top-width:1px;
 border-right-color:#868686;
 border-color:#868686;
 border-right-style:solid;
 border-left-style:solid;
 border-radius:15px;
 position:relative;
 border-bottom-width:1px;
 border-top-color:#868686;
 border-bottom-color:#868686;
 border-right-width:1px;
 border-left-color:#868686;
 border-left-width:1px;
 border-style:solid;
 min-height:211px;
 background-color:#ffffff;
 border-width:1;
 border-top-style:solid;
 overflow:hidden;
}
.csa-result:not(.ct-section):not(.oxy-easy-posts),
.csa-result.oxy-easy-posts .oxy-posts,
.csa-result.ct-section .ct-section-inner-wrap{
display:flex;
align-items:stretch;
}
.csa-results {
 background-color:#f7f8fc;
}
.csa-results:not(.ct-section):not(.oxy-easy-posts),
.csa-results.oxy-easy-posts .oxy-posts,
.csa-results.ct-section .ct-section-inner-wrap{
display:flex;
justify-content:center;
}
.csa-results__inner {
 width:100%;
 padding-top:48px;
 max-width:1300px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:64px;
}
.csa-results__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-results__inner.oxy-easy-posts .oxy-posts,
.csa-results__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:stretch;
}
@media (max-width: 767px) {
.csa-results__inner {
 padding-top:32px;
 padding-bottom:48px;
}
}

.csa-result__title {
 font-size:16px;
 color:#0d2651;
 margin-top:0px;
 margin-bottom:0px;
 line-height:1.375;
 font-weight:700;
}
.csa-result__price {
 font-size:14px;
 color:#0d2651;
 font-weight:500;
}
.csa-slider--four-up {
 padding-left:24px;
 padding-right:32px;
}
@media (max-width: 767px) {
.csa-slider--four-up {
 margin-right:auto;
 margin-left:auto;
}
}

.csa-trend {
 background-color:#fff5fb;
}
@media (max-width: 991px) {
.csa-trend {
}
.csa-trend:not(.ct-section):not(.oxy-easy-posts),
.csa-trend.oxy-easy-posts .oxy-posts,
.csa-trend.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:center;
}
}

.csa-trend-card__price {
 font-size:16px;
 color:#0d2651;
 line-height:1.4;
 flex-shrink:0;
 font-weight:700;
}
.csa-trend__heading {
 font-weight:700;
 color:#0d2651;
 margin-bottom:32px;
}
@media (max-width: 767px) {
.csa-trend__heading {
 margin-bottom:24px;
}
}

.csa-trend__btn-slot {
 font-size:0px;
 line-height:0;
}
.csa-trend-card__badge {
 margin-top:auto;
}
.csa-trend-card__meta {
 gap:6px;
 width:100%;
}
.csa-trend-card__meta:not(.ct-section):not(.oxy-easy-posts),
.csa-trend-card__meta.oxy-easy-posts .oxy-posts,
.csa-trend-card__meta.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:nowrap;
align-items:center;
justify-content:space-between;
gap:6px;
}
@media (max-width: 479px) {
.csa-trend-card__meta {
}
.csa-trend-card__meta:not(.ct-section):not(.oxy-easy-posts),
.csa-trend-card__meta.oxy-easy-posts .oxy-posts,
.csa-trend-card__meta.ct-section .ct-section-inner-wrap{
flex-direction:column;
align-items:flex-start;
}
}

.csa-trend-card__title {
 font-size:16px;
 color:#0d2651;
 line-height:1.45;
 font-weight:500;
}
.csa-trend-card {
 padding-left:10px;
 border-radius:14px;
 gap:12px;
 padding-right:10px;
 text-decoration:none;
 padding-top:10px;
 text-align:left;
 padding-bottom:16px;
 background-color:#ffffff;
 box-shadow:4px 6px 9px rgba(0,0,0,0.08);
}
.csa-trend-card:not(.ct-section):not(.oxy-easy-posts),
.csa-trend-card.oxy-easy-posts .oxy-posts,
.csa-trend-card.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
flex-wrap:nowrap;
align-items:stretch;
justify-content:flex-start;
gap:12px;
}
.csa-trend-card__image {
 object-fit:cover;
 width:100%;
 border-radius:10px;
 height:170px;
}
.csa-trend-card__image:not(.ct-section):not(.oxy-easy-posts),
.csa-trend-card__image.oxy-easy-posts .oxy-posts,
.csa-trend-card__image.ct-section .ct-section-inner-wrap{
display:block;
}
.csa-trend-card__body {
 gap:10px;
 width:100%;
 flex-grow:1;
}
.csa-trend-card__body:not(.ct-section):not(.oxy-easy-posts),
.csa-trend-card__body.oxy-easy-posts .oxy-posts,
.csa-trend-card__body.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
gap:10px;
}
.csa-trend__track {
 padding-top:4px;
 padding-left:6px;
 padding-bottom:18px;
 padding-right:14px;
}
@media (max-width: 991px) {
.csa-trend__track {
 margin-right:0px;
 margin-left:0px;
}
}

.csa-trend-card__duration {
 padding-top:4px;
 border-left-width:1px;
 border-color:#eef0f5;
 border-style:solid;
 background-color:#ffffff;
 color:#414042;
 border-bottom-width:1px;
 border-radius:50px;
 padding-left:8px;
 font-size:12px;
 line-height:1.4;
 padding-right:8px;
 border-top-width:1px;
 padding-bottom:4px;
 border-right-width:1px;
 flex-shrink:0;
 border-width:1;
}
.oxel_dynamicslider {
 width:100%;
}
.swiper-container {
}
.oxel_dynamicslider__container {
 height:400px;
}
.swiper-wrapper {
}
.swiper-slide {
}
.csa-quotes-head {
 padding-bottom:40px;
 background-color:#ffffff;
 padding-top:64px;
}
.csa-eyebrow-heading-container {
 gap:8px;
}
.csa-eyebrow-heading-container:not(.ct-section):not(.oxy-easy-posts),
.csa-eyebrow-heading-container.oxy-easy-posts .oxy-posts,
.csa-eyebrow-heading-container.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:8px;
}
@media (max-width: 767px) {
.csa-eyebrow-heading-container {
}
}

.csa-eyebrow {
 font-size:16px;
 font-weight:500;
 text-transform:uppercase;
 letter-spacing:0.5px;
 color:#ff3364;
}
.csa-quotes-lead {
 font-size:16px;
 color:#414042;
 max-width:640px;
 line-height:1.5;
}
.csa-quotes {
 padding-bottom:0px;
 background-color:#ff94cc;
 padding-left:0px;
 padding-top:0px;
 padding-right:0px;
}
.csa-slider {
}
.csa-slider--always {
}
.csa-slider--on-dark {
}
.csa-slider__track {
 width:100%;
 gap:20px;
}
.csa-slider__track:not(.ct-section):not(.oxy-easy-posts),
.csa-slider__track.oxy-easy-posts .oxy-posts,
.csa-slider__track.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:stretch;
gap:20px;
}
@media (max-width: 767px) {
.csa-slider__track {
 gap:16px;
}
.csa-slider__track:not(.ct-section):not(.oxy-easy-posts),
.csa-slider__track.oxy-easy-posts .oxy-posts,
.csa-slider__track.ct-section .ct-section-inner-wrap{
gap:16px;
}
}

.csa-quotes__track {
}
.csa-quote-slot {
}
.csa-quote-slot--c1 {
 background-color:#c792ff;
}
.csa-quote-card {
}
.csa-quote-card:not(.ct-section):not(.oxy-easy-posts),
.csa-quote-card.oxy-easy-posts .oxy-posts,
.csa-quote-card.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:stretch;
justify-content:space-between;
}
.csa-quote-card--r4 {
}
.csa-quote-card__art {
}
.csa-quote-card__quote {
}
.csa-quote-card__meta {
 gap:0px;
}
.csa-quote-card__meta:not(.ct-section):not(.oxy-easy-posts),
.csa-quote-card__meta.oxy-easy-posts .oxy-posts,
.csa-quote-card__meta.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
gap:0px;
}
.csa-quote-card__name {
}
.csa-quote-card__role {
}
.csa-quote-card__stars {
}
.csa-quote-slot--c2 {
 background-color:#a17bff;
}
.csa-quote-slot--c3 {
 background-color:#ff94cc;
}
.csa-slider__dots {
}
.csa-twocol__rows {
 gap:64px;
}
.csa-twocol__rows:not(.ct-section):not(.oxy-easy-posts),
.csa-twocol__rows.oxy-easy-posts .oxy-posts,
.csa-twocol__rows.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:64px;
}
@media (max-width: 767px) {
.csa-twocol__rows {
 gap:48px;
}
.csa-twocol__rows:not(.ct-section):not(.oxy-easy-posts),
.csa-twocol__rows.oxy-easy-posts .oxy-posts,
.csa-twocol__rows.ct-section .ct-section-inner-wrap{
gap:48px;
}
}

.csa-twocol__row {
 gap:32px;
}
.csa-twocol__row:not(.ct-section):not(.oxy-easy-posts),
.csa-twocol__row.oxy-easy-posts .oxy-posts,
.csa-twocol__row.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
gap:32px;
}
@media (max-width: 767px) {
.csa-twocol__row {
 gap:24px;
}
.csa-twocol__row:not(.ct-section):not(.oxy-easy-posts),
.csa-twocol__row.oxy-easy-posts .oxy-posts,
.csa-twocol__row.ct-section .ct-section-inner-wrap{
flex-direction:column;
align-items:flex-start;
gap:24px;
}
}

.csa-twocol__body {
 flex-shrink:1;
 gap:16px;
 width:100%;
}
.csa-twocol__body:not(.ct-section):not(.oxy-easy-posts),
.csa-twocol__body.oxy-easy-posts .oxy-posts,
.csa-twocol__body.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
gap:16px;
}
.csa-twocol__heading {
 font-weight:700;
 color:#0d2651;
 line-height:1.5;
}
.csa-form-wrap {
 background-color:#ffffff;
 padding-top:32px;
 padding-right:32px;
 padding-bottom:32px;
 padding-left:32px;
 border-radius:16px;
 gap:8px;
}
.csa-form-wrap:not(.ct-section):not(.oxy-easy-posts),
.csa-form-wrap.oxy-easy-posts .oxy-posts,
.csa-form-wrap.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:center;
gap:8px;
}
.csa-heading-h1 {
 color:#ffffff;
 font-size:42px;
}
@media (max-width: 991px) {
.csa-heading-h1 {
 font-size:38px;
}
}

@media (max-width: 767px) {
.csa-heading-h1 {
 font-size:36px;
}
}

.csa-btn {
}
.csa-btn--primary {
 border-radius:8px;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
 border-top-color:#ff3364;
 border-right-color:#ff3364;
 border-bottom-color:#ff3364;
 border-left-color:#ff3364;
 border-top-style:solid;
 border-right-style:solid;
 border-bottom-style:solid;
 border-left-style:solid;
}
.csa-twocol__btn-label {
 font-size:13px;
 color:#ffffff;
 line-height:1.7;
 font-weight:500;
}
.csa-twocol__media {
 line-height:0;
 width:100%;
 flex-shrink:1;
 border-radius:24px;
 object-fit:cover;
}
.csa-support-head {
 margin-bottom:10px;
}
.csa-support-text {
 margin-bottom:25px;
}
.csa-btn-courses:hover{
 background-color:#f7f8fc;
}
.csa-btn-courses {
 background-color:#ffffff;
 padding-left:16px;
 padding-right:16px;
 padding-top:11px;
 padding-bottom:11px;
 border-radius:8px;
 color:#0d2651;
 transition-duration:0.3s;
 box-shadow:1px 1px 4px rgba(0,0,0,0.1);
}
.csa-catalogue__eyebrow {
 font-size:14px;
 color:#ff3364;
 letter-spacing:1.2px;
 text-transform:uppercase;
 line-height:1.4;
 font-weight:700;
 margin-bottom:16px;
}
.csa-catalogue__title {
 font-weight:700;
 color:#0d2651;
 margin-bottom:16px;
 line-height:1.2;
}
.csa-catalogue__title-rest {
 font-weight:500;
}
.csa-catalogue__title-rest:not(.ct-section):not(.oxy-easy-posts),
.csa-catalogue__title-rest.oxy-easy-posts .oxy-posts,
.csa-catalogue__title-rest.ct-section .ct-section-inner-wrap{
display:inline;
}
@media (max-width: 479px) {
.csa-catalogue__title-rest {
}
}

.csa-catalogue__intro {
 margin-bottom:24px;
 color:#414042;
 max-width:780px;
}
.csa-page-hero__cta-icon {
 color:#ff3364;
 font-size:13px;
 line-height:0;
}
.csa-page-hero {
 background-color:#0d2651;
 background-position:0% 50%;
}
.csa-page-hero:not(.ct-section):not(.oxy-easy-posts),
.csa-page-hero.oxy-easy-posts .oxy-posts,
.csa-page-hero.ct-section .ct-section-inner-wrap{
display:flex;
justify-content:center;
}
@media (max-width: 991px) {
.csa-page-hero {
 background-position:40% 0%;
}
}

@media (max-width: 767px) {
.csa-page-hero {
 background-position:50% 80%;
}
}

.csa-page-hero__inner {
 width:100%;
 max-width:1208px;
 padding-top:48px;
 padding-bottom:48px;
 padding-left:24px;
 padding-right:24px;
}
.csa-page-hero__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-page-hero__inner.oxy-easy-posts .oxy-posts,
.csa-page-hero__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
}
@media (max-width: 767px) {
.csa-page-hero__inner {
 padding-top:30px;
 padding-bottom:27%;
}
.csa-page-hero__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-page-hero__inner.oxy-easy-posts .oxy-posts,
.csa-page-hero__inner.ct-section .ct-section-inner-wrap{
align-items:center;
}
}

.csa-page-hero__content {
 max-width:600px;
 text-align:left;
}
.csa-page-hero__content:not(.ct-section):not(.oxy-easy-posts),
.csa-page-hero__content.oxy-easy-posts .oxy-posts,
.csa-page-hero__content.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
}
@media (max-width: 991px) {
.csa-page-hero__content {
 max-width:460px;
}
}

@media (max-width: 767px) {
.csa-page-hero__content {
 text-align:center;
}
.csa-page-hero__content:not(.ct-section):not(.oxy-easy-posts),
.csa-page-hero__content.oxy-easy-posts .oxy-posts,
.csa-page-hero__content.ct-section .ct-section-inner-wrap{
align-items:center;
}
}

.csa-page-hero__title {
 color:#ffffff;
 font-weight:700;
 line-height:1.1;
}
.csa-page-hero__accent {
 color:#ff3364;
 line-height:1;
}
.csa-page-hero__accent:not(.ct-section):not(.oxy-easy-posts),
.csa-page-hero__accent.oxy-easy-posts .oxy-posts,
.csa-page-hero__accent.ct-section .ct-section-inner-wrap{
display:inline;
}
.csa-page-hero__intro {
 color:#ffffff;
}
.csa-page-hero__cta {
 gap:12px;
 background-color:#ffffff;
 border-radius:50px;
 padding-top:16px;
 padding-bottom:16px;
 padding-left:32px;
 padding-right:32px;
}
.csa-page-hero__cta:not(.ct-section):not(.oxy-easy-posts),
.csa-page-hero__cta.oxy-easy-posts .oxy-posts,
.csa-page-hero__cta.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
justify-content:center;
gap:12px;
}
.csa-page-hero__cta-label {
 color:#ff3364;
 font-size:16px;
 font-weight:600;
 line-height:1;
}
.csa-catalogue {
 background-color:#f7f8fc;
}
.csa-catalogue__inner {
 width:100%;
 padding-top:0px;
 max-width:1300px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:96px;
}
.csa-catalogue__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-catalogue__inner.oxy-easy-posts .oxy-posts,
.csa-catalogue__inner.ct-section .ct-section-inner-wrap{
align-items:flex-start;
}
@media (max-width: 991px) {
.csa-catalogue__inner {
}
}

@media (max-width: 767px) {
.csa-catalogue__inner {
 padding-bottom:64px;
 text-align:left;
}
.csa-catalogue__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-catalogue__inner.oxy-easy-posts .oxy-posts,
.csa-catalogue__inner.ct-section .ct-section-inner-wrap{
align-items:center;
}
}

.csa-subhero__inner {
 width:100%;
 padding-top:96px;
 max-width:1260px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:32px;
 text-align:left;
}
.csa-subhero__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-subhero__inner.oxy-easy-posts .oxy-posts,
.csa-subhero__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
}
@media (max-width: 767px) {
.csa-subhero__inner {
 padding-bottom:24px;
 padding-top:48px;
 text-align:center;
}
.csa-subhero__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-subhero__inner.oxy-easy-posts .oxy-posts,
.csa-subhero__inner.ct-section .ct-section-inner-wrap{
align-items:center;
}
}

.csa-subhero__title {
 font-weight:700;
 color:#0d2651;
 line-height:1.2;
}
.csa-subhero__title-rest {
 font-weight:500;
}
.csa-subhero__intro {
 color:#414042;
 margin-top:24px;
}
.tabs-5192-tab {
}
.tabs-5192-tab-active {
}
.csa-chip {
 line-height:1.4;
 border-radius:50px;
 padding-top:10px;
 padding-bottom:10px;
 border-color:#eef0f5;
 padding-left:16px;
 border-width:1;
 color:#5a6a82;
 gap:8px;
 font-weight:600;
 background-color:#f9f9f9;
 font-size:14px;
 padding-right:16px;
 border-style:solid;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
}
.csa-chip:not(.ct-section):not(.oxy-easy-posts),
.csa-chip.oxy-easy-posts .oxy-posts,
.csa-chip.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
gap:8px;
}
.csa-chip__icon {
 width:20px;
}
.csa-chip__label {
}
.csa-chip__count {
 padding-left:8px;
 font-size:12px;
 border-radius:50px;
 color:#5a6a82;
 font-weight:600;
 background-color:#dbdfe7;
 line-height:1.5;
 padding-right:8px;
}
.tabs-contents-5192-tab {
 padding-left:0px;
 padding-right:0px;
}
.csa-catalogue__panel {
}
.csa-cat-intro {
 width:100%;
 margin-bottom:64px;
 padding-top:24px;
 background-color:#0d2651;
 padding-right:32px;
 border-radius:12px;
 padding-bottom:24px;
 padding-left:32px;
}
@media (max-width: 767px) {
.csa-cat-intro {
 margin-bottom:32px;
 padding-left:20px;
 text-align:left;
 padding-right:20px;
}
}

.csa-cat-intro__title {
 font-weight:700;
 color:#ffffff;
 margin-bottom:8px;
 line-height:1.4;
}
.csa-cat-intro__body {
 line-height:1.6;
 color:#ffffff;
}
.csa-cards {
 gap:24px;
 width:100%;
}
.csa-cards:not(.ct-section):not(.oxy-easy-posts),
.csa-cards.oxy-easy-posts .oxy-posts,
.csa-cards.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:nowrap;
align-items:stretch;
gap:24px;
}
@media (max-width: 991px) {
.csa-cards {
}
.csa-cards:not(.ct-section):not(.oxy-easy-posts),
.csa-cards.oxy-easy-posts .oxy-posts,
.csa-cards.ct-section .ct-section-inner-wrap{
flex-direction:column;
}
}

.csa-course-card {
 padding-left:0px;
 border-radius:12px;
 flex-shrink:1;
 padding-top:24px;
 padding-right:0px;
 width:100%;
 text-align:left;
 flex-grow:1;
 background-color:#e1f3ff;
 padding-bottom:24px;
}
.csa-course-card:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card.oxy-easy-posts .oxy-posts,
.csa-course-card.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
.csa-course-card__head {
 padding-bottom:8px;
 padding-left:32px;
 padding-right:32px;
}
@media (max-width: 767px) {
.csa-course-card__head {
 padding-left:20px;
 padding-right:20px;
}
}

.csa-course-card__title {
 font-size:22px;
 color:#130038;
 line-height:1.3;
 font-weight:700;
}
.csa-course-card__subtitle {
 font-size:18px;
 color:#130038;
 line-height:1.4;
 font-weight:400;
}
.csa-course-card__badges {
 gap:8px;
 margin-top:16px;
}
.csa-course-card__badges:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__badges.oxy-easy-posts .oxy-posts,
.csa-course-card__badges.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:wrap;
align-items:center;
gap:8px;
}
.csa-badge {
 line-height:1.4;
 font-size:12px;
 padding-top:4px;
 color:#ffffff;
 letter-spacing:0.5px;
 padding-right:12px;
 border-radius:50px;
 padding-bottom:4px;
 padding-left:12px;
 font-weight:700;
}
.csa-badge--level {
 background-color:#ff3364;
}
.csa-badge--partner {
 background-color:#ff94cc;
}
.csa-course-card__blurb {
 font-size:15px;
 color:#130038;
 margin-top:24px;
 line-height:1.6;
}
.csa-course-card__tiles {
}
.csa-course-card__tiles:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__tiles.oxy-easy-posts .oxy-posts,
.csa-course-card__tiles.ct-section .ct-section-inner-wrap{
display:none;
}
@media (max-width: 767px) {
.csa-course-card__tiles {
 width:100%;
 margin-top:24px;
 gap:16px;
 padding-right:20px;
 padding-left:20px;
}
.csa-course-card__tiles:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__tiles.oxy-easy-posts .oxy-posts,
.csa-course-card__tiles.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:stretch;
gap:16px;
}
}

.csa-course-card__tile {
 padding-left:14px;
 border-radius:10px;
 width:100%;
 padding-top:10px;
 padding-right:14px;
 padding-bottom:10px;
 flex-shrink:1;
 flex-grow:1;
 border-width:1;
 background-color:#ffffff;
 gap:2px;
 border-style:solid;
 border-color:#c7d4e4;
}
.csa-course-card__tile:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__tile.oxy-easy-posts .oxy-posts,
.csa-course-card__tile.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:2px;
}
@media (max-width: 767px) {
.csa-course-card__tile {
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
}
}

.csa-course-card__tile-label {
 font-size:13px;
 color:#64748b;
 line-height:1.4;
 font-weight:400;
}
.csa-course-card__tile-value {
 font-size:16px;
 color:#0d2651;
 line-height:1.4;
 font-weight:700;
}
.csa-spec {
 width:100%;
}
.csa-spec:not(.ct-section):not(.oxy-easy-posts),
.csa-spec.oxy-easy-posts .oxy-posts,
.csa-spec.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:stretch;
}
@media (max-width: 767px) {
.csa-spec {
 padding-left:20px;
 margin-top:24px;
 padding-right:20px;
 margin-bottom:24px;
}
}

.csa-spec__item {
 width:100%;
}
.csa-spec__item:not(.ct-section):not(.oxy-easy-posts),
.csa-spec__item.oxy-easy-posts .oxy-posts,
.csa-spec__item.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:stretch;
}
@media (max-width: 767px) {
.csa-spec__item {
 border-style:solid;
 border-radius:10px;
 border-color:#869bb9;
 border-width:1;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
}
}

.csa-spec__bar {
 padding-left:22px;
 border-radius:10px;
 width:100%;
 gap:12px;
 padding-right:22px;
 padding-top:18px;
 background-color:#d7eaff;
 padding-bottom:18px;
 min-height:60px;
}
.csa-spec__bar:not(.ct-section):not(.oxy-easy-posts),
.csa-spec__bar.oxy-easy-posts .oxy-posts,
.csa-spec__bar.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
justify-content:space-between;
gap:12px;
}
@media (max-width: 479px) {
.csa-spec__bar {
 padding-left:16px;
 padding-right:16px;
}
}

.csa-spec__label {
 font-size:15px;
 color:#0d2651;
 line-height:1.4;
 font-weight:600;
 text-align:left;
}
@media (max-width: 767px) {
.csa-spec__label {
 font-size:15px;
}
}

@media (max-width: 479px) {
.csa-spec__label {
 font-size:15px;
}
}

.csa-spec__icon {
 font-size:16px;
 line-height:0;
}
.csa-spec__panel {
 width:100%;
}
@media (max-width: 767px) {
.csa-spec__panel {
 background-color:#d7eaff;
}
}

.csa-spec__panel-inner {
 width:100%;
}
.csa-course-card__rows {
 width:100%;
 margin-top:16px;
}
.csa-course-card__row {
 width:100%;
 padding-top:12px;
 gap:16px;
 padding-right:32px;
 padding-bottom:12px;
 padding-left:32px;
}
.csa-course-card__row:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__row.oxy-easy-posts .oxy-posts,
.csa-course-card__row.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:flex-start;
justify-content:space-between;
gap:16px;
}
@media (max-width: 767px) {
.csa-course-card__row {
 padding-right:20px;
 gap:2px;
 padding-left:20px;
 padding-bottom:10px;
 padding-top:10px;
}
.csa-course-card__row:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__row.oxy-easy-posts .oxy-posts,
.csa-course-card__row.ct-section .ct-section-inner-wrap{
flex-direction:column;
align-items:flex-start;
gap:2px;
}
}

@media (max-width: 479px) {
.csa-course-card__row {
 gap:4px;
 padding-right:16px;
 padding-left:16px;
}
.csa-course-card__row:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__row.oxy-easy-posts .oxy-posts,
.csa-course-card__row.ct-section .ct-section-inner-wrap{
flex-direction:column;
align-items:flex-start;
gap:4px;
}
}

.csa-course-card__label {
 font-size:14px;
 color:#130038;
 line-height:1.4;
 flex-shrink:0;
 font-weight:400;
}
@media (max-width: 767px) {
.csa-course-card__label {
 font-weight:700;
 color:#0d2651;
 font-size:14px;
}
}

.csa-course-card__value {
 font-size:14px;
 color:#130038;
 line-height:1.4;
 font-weight:600;
 text-align:right;
}
@media (max-width: 767px) {
.csa-course-card__value {
 font-weight:400;
 color:#45566e;
 text-align:left;
 font-size:13px;
}
}

.csa-course-card__row--tiled {
}
@media (max-width: 767px) {
.csa-course-card__row--tiled {
}
.csa-course-card__row--tiled:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__row--tiled.oxy-easy-posts .oxy-posts,
.csa-course-card__row--tiled.ct-section .ct-section-inner-wrap{
display:none;
}
}

.csa-course-card__foot {
 padding-right:32px;
 width:100%;
 padding-left:32px;
 padding-top:16px;
 margin-top:auto;
}
.csa-course-card__foot:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__foot.oxy-easy-posts .oxy-posts,
.csa-course-card__foot.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
@media (max-width: 767px) {
.csa-course-card__foot {
 margin-top:24auto;
 padding-top:24px;
 gap:12px;
 padding-right:20px;
 padding-left:20px;
 border-top-color:#c2d4e4;
 border-top-width:1px;
 border-top-style:solid;
}
.csa-course-card__foot:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__foot.oxy-easy-posts .oxy-posts,
.csa-course-card__foot.ct-section .ct-section-inner-wrap{
flex-direction:row;
align-items:center;
justify-content:space-between;
gap:12px;
}
}

.csa-course-card__price-row {
 width:100%;
 padding-top:24px;
 gap:16px;
 border-top-color:#ddc5ff;
 border-top-width:1px;
 border-top-style:solid;
}
.csa-course-card__price-row:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__price-row.oxy-easy-posts .oxy-posts,
.csa-course-card__price-row.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
justify-content:space-between;
gap:16px;
}
@media (max-width: 767px) {
.csa-course-card__price-row {
 padding-top:0px;
 gap:0px;
 border-top-width:0px;
 flex-grow:1;
 width:50%;
}
.csa-course-card__price-row:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__price-row.oxy-easy-posts .oxy-posts,
.csa-course-card__price-row.ct-section .ct-section-inner-wrap{
flex-direction:column;
align-items:flex-start;
gap:0px;
}
}

.csa-course-card__price-label {
 font-size:18px;
 color:#130038;
 line-height:1.4;
 font-weight:700;
}
.csa-course-card__price-group {
 gap:4px;
}
.csa-course-card__price-group:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__price-group.oxy-easy-posts .oxy-posts,
.csa-course-card__price-group.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:baseline;
justify-content:flex-end;
gap:4px;
}
@media (max-width: 767px) {
.csa-course-card__price-group {
 gap:0px;
}
.csa-course-card__price-group:not(.ct-section):not(.oxy-easy-posts),
.csa-course-card__price-group.oxy-easy-posts .oxy-posts,
.csa-course-card__price-group.ct-section .ct-section-inner-wrap{
flex-direction:column;
align-items:flex-start;
justify-content:flex-start;
gap:0px;
}
}

.csa-course-card__price {
 font-size:16px;
 color:#130038;
 line-height:1.4;
 font-weight:500;
 text-align:right;
}
.csa-course-card__price-term {
 font-size:16px;
 color:#130038;
 line-height:1.4;
 font-weight:500;
}
@media (max-width: 767px) {
.csa-course-card__price-term {
 font-size:14px;
}
}

.csa-accordion {
}
@media (max-width: 991px) {
.csa-accordion {
}
.csa-accordion:not(.ct-section):not(.oxy-easy-posts),
.csa-accordion.oxy-easy-posts .oxy-posts,
.csa-accordion.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
}
}

@media (max-width: 767px) {
.csa-accordion {
}
.csa-accordion:not(.ct-section):not(.oxy-easy-posts),
.csa-accordion.oxy-easy-posts .oxy-posts,
.csa-accordion.ct-section .ct-section-inner-wrap{
display:flex;
}
}

.csa-accordion__label {
}
.csa-accordion__panel {
}
.csa-accordion__panel-inner {
}
.csa-accordion__q {
 padding-top:16px;
 padding-right:24px;
 padding-bottom:16px;
 padding-left:24px;
}
.csa-accordion__q:not(.ct-section):not(.oxy-easy-posts),
.csa-accordion__q.oxy-easy-posts .oxy-posts,
.csa-accordion__q.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
}
.csa-accordion__item {
}
.csa-accordion__col {
}
.csa-accordion__icon {
}
.csa-accordion__a {
 padding-bottom:0px;
 font-size:14px;
}
.oxel_icon_button__container:hover{
 background-color:#cfd3d7;
}
.oxel_icon_button__container {
 background-color:#eceeef;
 padding-top:8px;
 padding-left:16px;
 padding-right:16px;
 padding-bottom:8px;
 transition-duration:0.3s;
 gap:8px;
}
.oxel_icon_button__container:not(.ct-section):not(.oxy-easy-posts),
.oxel_icon_button__container.oxy-easy-posts .oxy-posts,
.oxel_icon_button__container.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
gap:8px;
}
.oxel_icon_button_text {
 color:#374047;
 font-size:14px;
}
.csa-policies__grid {
 gap:64px;
}
.csa-policies__grid:not(.ct-section):not(.oxy-easy-posts),
.csa-policies__grid.oxy-easy-posts .oxy-posts,
.csa-policies__grid.ct-section .ct-section-inner-wrap{
gap:64px;
}
@media (max-width: 767px) {
.csa-policies__grid {
 gap:32px;
}
.csa-policies__grid:not(.ct-section):not(.oxy-easy-posts),
.csa-policies__grid.oxy-easy-posts .oxy-posts,
.csa-policies__grid.ct-section .ct-section-inner-wrap{
gap:32px;
}
}

@media (max-width: 479px) {
.csa-policies__grid {
 gap:24px;
}
.csa-policies__grid:not(.ct-section):not(.oxy-easy-posts),
.csa-policies__grid.oxy-easy-posts .oxy-posts,
.csa-policies__grid.ct-section .ct-section-inner-wrap{
gap:24px;
}
}

.csa-policies__icon {
 width:64px;
 flex-shrink:0;
 height:65px;
}
.csa-policies__icon:not(.ct-section):not(.oxy-easy-posts),
.csa-policies__icon.oxy-easy-posts .oxy-posts,
.csa-policies__icon.ct-section .ct-section-inner-wrap{
display:block;
}
.csa-policies {
 background-color:#ffffff;
}
.csa-policies:not(.ct-section):not(.oxy-easy-posts),
.csa-policies.oxy-easy-posts .oxy-posts,
.csa-policies.ct-section .ct-section-inner-wrap{
display:flex;
justify-content:center;
}
.csa-policies__title {
 font-size:20px;
 color:#0d2651;
 line-height:1.5;
 font-weight:400;
}
.csa-policies__card {
 gap:16px;
 text-decoration:none;
 background-color:#ffffff;
 text-align:left;
}
.csa-policies__card:not(.ct-section):not(.oxy-easy-posts),
.csa-policies__card.oxy-easy-posts .oxy-posts,
.csa-policies__card.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:nowrap;
align-items:center;
justify-content:flex-start;
gap:16px;
}
.csa-policies__inner {
 width:100%;
 padding-top:80px;
 max-width:1300px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:80px;
}
.csa-policies__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-policies__inner.oxy-easy-posts .oxy-posts,
.csa-policies__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
@media (max-width: 767px) {
.csa-policies__inner {
 padding-top:48px;
 padding-bottom:48px;
}
}

.csa-commerce {
 background-color:#ffffff;
}
.csa-commerce__inner {
 width:100%;
 max-width:1300px;
 padding-left:20px;
 padding-right:20px;
 padding-top:64px;
 padding-bottom:64px;
}
@media (max-width: 767px) {
.csa-commerce__inner {
 padding-top:48px;
 padding-bottom:48px;
}
}

.csa-product-related__inner {
 width:100%;
 padding-top:64px;
 max-width:1300px;
 gap:32px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:72px;
}
.csa-product-related__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-product-related__inner.oxy-easy-posts .oxy-posts,
.csa-product-related__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:32px;
}
@media (max-width: 767px) {
.csa-product-related__inner {
 padding-bottom:48px;
 padding-top:40px;
 gap:24px;
}
.csa-product-related__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-product-related__inner.oxy-easy-posts .oxy-posts,
.csa-product-related__inner.ct-section .ct-section-inner-wrap{
gap:24px;
}
}

.csa-product-related__card-title {
 font-size:16px;
 color:#0d2651;
 line-height:1.4;
 font-weight:600;
}
.csa-product-related__image {
 object-fit:cover;
 width:100%;
 border-radius:10px;
}
.csa-product-related__image:not(.ct-section):not(.oxy-easy-posts),
.csa-product-related__image.oxy-easy-posts .oxy-posts,
.csa-product-related__image.ct-section .ct-section-inner-wrap{
display:block;
}
.csa-product-related__title {
 font-weight:700;
 color:#0d2651;
 line-height:1.3;
}
.csa-product-related {
 background-color:#f7f8fc;
}
.csa-product-related:not(.ct-section):not(.oxy-easy-posts),
.csa-product-related.oxy-easy-posts .oxy-posts,
.csa-product-related.ct-section .ct-section-inner-wrap{
display:flex;
justify-content:center;
}
.csa-product-related__foot {
 padding-top:4px;
 gap:8px;
 margin-top:auto;
}
.csa-product-related__foot:not(.ct-section):not(.oxy-easy-posts),
.csa-product-related__foot.oxy-easy-posts .oxy-posts,
.csa-product-related__foot.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:wrap;
gap:8px;
}
.csa-product-related__cta {
 padding-left:16px;
 border-radius:50px;
 padding-right:16px;
 height:34px;
 background-color:#ff3364;
}
.csa-product-related__cta:not(.ct-section):not(.oxy-easy-posts),
.csa-product-related__cta.oxy-easy-posts .oxy-posts,
.csa-product-related__cta.ct-section .ct-section-inner-wrap{
display:inline-flex;
align-items:center;
justify-content:center;
}
.csa-product-related__card {
 border-radius:14px;
 width:22%;
 padding-left:16px;
 padding-top:16px;
 gap:12px;
 padding-right:16px;
 flex-shrink:1;
 background-color:#ffffff;
 padding-bottom:16px;
}
.csa-product-related__card:not(.ct-section):not(.oxy-easy-posts),
.csa-product-related__card.oxy-easy-posts .oxy-posts,
.csa-product-related__card.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
gap:12px;
}
@media (max-width: 991px) {
.csa-product-related__card {
 width:46%;
}
}

@media (max-width: 767px) {
.csa-product-related__card {
 width:100%;
 padding-right:12px;
 padding-left:12px;
 padding-top:12px;
 padding-bottom:16px;
}
}

.csa-product-related__grid {
 gap:40px;
}
.csa-product-related__grid:not(.ct-section):not(.oxy-easy-posts),
.csa-product-related__grid.oxy-easy-posts .oxy-posts,
.csa-product-related__grid.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:wrap;
align-items:stretch;
gap:40px;
}
@media (max-width: 767px) {
.csa-product-related__grid {
 gap:24px;
}
.csa-product-related__grid:not(.ct-section):not(.oxy-easy-posts),
.csa-product-related__grid.oxy-easy-posts .oxy-posts,
.csa-product-related__grid.ct-section .ct-section-inner-wrap{
gap:24px;
}
}

.csa-product-related__card-price {
 font-size:16px;
 color:#ff3364;
 line-height:1.4;
 font-weight:700;
}
.csa-product-related__cta-label {
 font-size:13px;
 color:#ffffff;
 line-height:1;
 font-weight:500;
}
.csa-ptab__title {
 font-size:24px;
 color:#0d2651;
 line-height:1.3;
 font-weight:700;
}
@media (max-width: 767px) {
.csa-ptab__title {
 font-size:20px;
}
}

.csa-product-glance__inner {
 padding-right:20px;
 width:100%;
 padding-left:20px;
 max-width:1300px;
 padding-bottom:40px;
}
.csa-product-glance__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-product-glance__inner.oxy-easy-posts .oxy-posts,
.csa-product-glance__inner.ct-section .ct-section-inner-wrap{
display:flex;
align-items:stretch;
}
.csa-product-glance__card {
 padding-top:24px;
 padding-right:24px;
 padding-left:24px;
 border-radius:16px;
 padding-bottom:24px;
 background-color:#f5f5f5;
}
.csa-product-glance__card:not(.ct-section):not(.oxy-easy-posts),
.csa-product-glance__card.oxy-easy-posts .oxy-posts,
.csa-product-glance__card.ct-section .ct-section-inner-wrap{
display:flex;
align-items:stretch;
}
@media (max-width: 767px) {
.csa-product-glance__card {
 padding-bottom:16px;
 padding-top:16px;
 padding-left:16px;
 padding-right:16px;
}
}

.csa-product-glance {
 background-color:#ffffff;
}
.csa-product-glance:not(.ct-section):not(.oxy-easy-posts),
.csa-product-glance.oxy-easy-posts .oxy-posts,
.csa-product-glance.ct-section .ct-section-inner-wrap{
display:flex;
justify-content:center;
}
.csa-twocol {
 background-color:#ffffff;
}
.csa-twocol:not(.ct-section):not(.oxy-easy-posts),
.csa-twocol.oxy-easy-posts .oxy-posts,
.csa-twocol.ct-section .ct-section-inner-wrap{
display:flex;
justify-content:center;
}
.csa-twocol__list {
 line-height:1.6;
}
.csa-twocol__inner {
 width:100%;
 padding-top:80px;
 max-width:1300px;
 gap:48px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:80px;
}
.csa-twocol__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-twocol__inner.oxy-easy-posts .oxy-posts,
.csa-twocol__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:48px;
}
@media (max-width: 767px) {
.csa-twocol__inner {
 padding-bottom:48px;
 padding-top:48px;
 gap:32px;
}
.csa-twocol__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-twocol__inner.oxy-easy-posts .oxy-posts,
.csa-twocol__inner.ct-section .ct-section-inner-wrap{
gap:32px;
}
}

.csa-twocol__text {
 line-height:1.6;
}
.csa-twocol__title {
 font-weight:700;
 color:#0d2651;
 line-height:1.3;
}
.csa-logos {
 background-color:#f7f8fc;
}
.csa-logos__inner {
 padding-top:0px;
 padding-left:20px;
 width:100%;
 padding-bottom:72px;
 max-width:1260px;
 padding-right:20px;
}
@media (max-width: 767px) {
.csa-logos__inner {
 padding-bottom:48px;
}
}

.csa-slider--logos {
}
.csa-logos__track {
 gap:44px;
}
.csa-logos__track:not(.ct-section):not(.oxy-easy-posts),
.csa-logos__track.oxy-easy-posts .oxy-posts,
.csa-logos__track.ct-section .ct-section-inner-wrap{
display:flex;
flex-wrap:wrap;
align-items:center;
gap:44px;
}
@media (max-width: 991px) {
.csa-logos__track {
 gap:24px;
}
.csa-logos__track:not(.ct-section):not(.oxy-easy-posts),
.csa-logos__track.oxy-easy-posts .oxy-posts,
.csa-logos__track.ct-section .ct-section-inner-wrap{
gap:24px;
}
}

@media (max-width: 767px) {
.csa-logos__track {
 gap:16px;
}
.csa-logos__track:not(.ct-section):not(.oxy-easy-posts),
.csa-logos__track.oxy-easy-posts .oxy-posts,
.csa-logos__track.ct-section .ct-section-inner-wrap{
flex-wrap:nowrap;
gap:16px;
}
}

.csa-logos__item {
 font-size:0px;
 line-height:0;
}
.form-cols {
 width:100%;
 text-align:left;
}
.form-cols:not(.ct-section):not(.oxy-easy-posts),
.form-cols.oxy-easy-posts .oxy-posts,
.form-cols.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:stretch;
}
@media (max-width: 991px) {
.form-cols {
}
.form-cols:not(.ct-section):not(.oxy-easy-posts),
.form-cols.oxy-easy-posts .oxy-posts,
.form-cols.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
}

@media (max-width: 767px) {
.form-cols {
}
.form-cols:not(.ct-section):not(.oxy-easy-posts),
.form-cols.oxy-easy-posts .oxy-posts,
.form-cols.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
}

.form-col-left {
 width:40%;
}
.form-col-left:not(.ct-section):not(.oxy-easy-posts),
.form-col-left.oxy-easy-posts .oxy-posts,
.form-col-left.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
justify-content:center;
}
@media (max-width: 991px) {
.form-col-left {
 width:100%;
}
}

@media (max-width: 767px) {
.form-col-left {
 width:100%;
}
}

.form-col-right {
 width:60%;
}
.form-col-right:not(.ct-section):not(.oxy-easy-posts),
.form-col-right.oxy-easy-posts .oxy-posts,
.form-col-right.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:center;
justify-content:center;
}
@media (max-width: 991px) {
.form-col-right {
 width:100%;
}
}

@media (max-width: 767px) {
.form-col-right {
 width:100%;
}
}

.csa-subjects__cols {
 gap:72px;
 width:100%;
}
.csa-subjects__cols:not(.ct-section):not(.oxy-easy-posts),
.csa-subjects__cols.oxy-easy-posts .oxy-posts,
.csa-subjects__cols.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:flex-start;
gap:72px;
}
@media (max-width: 991px) {
.csa-subjects__cols {
 gap:40px;
}
.csa-subjects__cols:not(.ct-section):not(.oxy-easy-posts),
.csa-subjects__cols.oxy-easy-posts .oxy-posts,
.csa-subjects__cols.ct-section .ct-section-inner-wrap{
gap:40px;
}
}

@media (max-width: 767px) {
.csa-subjects__cols {
 gap:32px;
}
.csa-subjects__cols:not(.ct-section):not(.oxy-easy-posts),
.csa-subjects__cols.oxy-easy-posts .oxy-posts,
.csa-subjects__cols.ct-section .ct-section-inner-wrap{
flex-direction:column;
gap:32px;
}
}

.csa-subjects__intro {
 color:#414042;
}
.csa-subjects__tip-text {
 font-size:16px;
 color:#414042;
 line-height:1.4;
 font-weight:400;
}
.csa-subjects__tick {
 font-size:15px;
 color:#ff3364;
 flex-shrink:0;
 line-height:0;
}
.csa-subjects__title-rest {
 font-weight:500;
}
.csa-subjects__tip-lead {
 font-size:16px;
 color:#5a6a82;
 line-height:1.4;
 font-weight:700;
}
.csa-subjects__eyebrow {
 font-size:14px;
 color:#ff3364;
 letter-spacing:1.2px;
 text-transform:uppercase;
 line-height:1.4;
 font-weight:700;
 margin-bottom:16px;
}
.csa-subjects__title {
 font-weight:700;
 color:#0d2651;
 margin-bottom:16px;
 line-height:1.2;
}
.csa-subjects__col {
 flex-shrink:1;
 width:100%;
 flex-grow:0;
 max-width:268px;
}
.csa-subjects__col:not(.ct-section):not(.oxy-easy-posts),
.csa-subjects__col.oxy-easy-posts .oxy-posts,
.csa-subjects__col.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
.csa-subjects {
 background-color:#ffffff;
}
.csa-subjects__tip-link {
}
.csa-subjects__tip-link:not(.ct-section):not(.oxy-easy-posts),
.csa-subjects__tip-link.oxy-easy-posts .oxy-posts,
.csa-subjects__tip-link.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
}
.csa-subjects__tip-link-label {
 font-size:16px;
 color:#ff3364;
 line-height:1.4;
 font-weight:700;
}
.csa-subjects__inner {
 width:100%;
 padding-top:64px;
 max-width:1260px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:64px;
}
.csa-subjects__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-subjects__inner.oxy-easy-posts .oxy-posts,
.csa-subjects__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
}
@media (max-width: 767px) {
.csa-subjects__inner {
 padding-top:48px;
 padding-bottom:48px;
}
}

.csa-subjects__list {
 width:100%;
 gap:14px;
}
.csa-subjects__list:not(.ct-section):not(.oxy-easy-posts),
.csa-subjects__list.oxy-easy-posts .oxy-posts,
.csa-subjects__list.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:14px;
}
.csa-subjects__tip {
 border-top-width:1px;
 width:100%;
 border-right-width:1px;
 padding-left:20px;
 border-color:#ffd4de;
 border-radius:12px;
 gap:10px;
 padding-right:20px;
 border-bottom-width:1px;
 padding-bottom:20px;
 border-width:1;
 margin-top:64px;
 border-left-width:1px;
 border-style:solid;
 padding-top:20px;
 background-color:#fff3f6;
}
.csa-subjects__tip:not(.ct-section):not(.oxy-easy-posts),
.csa-subjects__tip.oxy-easy-posts .oxy-posts,
.csa-subjects__tip.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:wrap;
align-items:center;
gap:10px;
}
.csa-subjects__head {
 text-align:center;
 font-weight:700;
 border-radius:50px;
 width:100%;
 color:#ffffff;
 padding-top:4px;
 font-size:14px;
 margin-bottom:16px;
 padding-left:16px;
 background-color:#130038;
 line-height:1.4;
 padding-bottom:4px;
 padding-right:16px;
 max-width:226px;
}
.csa-subjects__item {
 gap:10px;
 width:100%;
}
.csa-subjects__item:not(.ct-section):not(.oxy-easy-posts),
.csa-subjects__item.oxy-easy-posts .oxy-posts,
.csa-subjects__item.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
gap:10px;
}
.csa-subjects__note {
 margin-bottom:40px;
 color:#414042;
}
.csa-subjects__label {
 font-size:16px;
 color:#130038;
 line-height:1.4;
 font-weight:500;
}
.csa-subjects__tip-icon {
 font-size:18px;
 flex-shrink:0;
 line-height:0;
}
.csa-what__item-title {
 font-size:14px;
 color:#0d2651;
 line-height:1.4;
 font-weight:700;
}
.csa-what__inner {
 width:100%;
 padding-top:64px;
 max-width:1260px;
 gap:96px;
 padding-right:20px;
 padding-left:20px;
 padding-bottom:64px;
}
.csa-what__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-what__inner.oxy-easy-posts .oxy-posts,
.csa-what__inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:flex-start;
gap:96px;
}
@media (max-width: 991px) {
.csa-what__inner {
 padding-bottom:48px;
 padding-top:48px;
 gap:48px;
}
.csa-what__inner:not(.ct-section):not(.oxy-easy-posts),
.csa-what__inner.oxy-easy-posts .oxy-posts,
.csa-what__inner.ct-section .ct-section-inner-wrap{
flex-direction:column;
gap:48px;
}
}

.csa-what__item {
 gap:24px;
 width:100%;
}
.csa-what__item:not(.ct-section):not(.oxy-easy-posts),
.csa-what__item.oxy-easy-posts .oxy-posts,
.csa-what__item.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:flex-start;
gap:24px;
}
.csa-glance__label {
 font-size:14px;
 color:#130038;
 line-height:1.4;
 flex-shrink:0;
 font-weight:400;
}
@media (max-width: 479px) {
.csa-glance__label {
 flex-shrink:1;
}
}

.csa-what__intro {
 flex-shrink:1;
 width:100%;
 flex-grow:1;
}
.csa-what__intro:not(.ct-section):not(.oxy-easy-posts),
.csa-what__intro.oxy-easy-posts .oxy-posts,
.csa-what__intro.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
.csa-glance__rows {
 width:100%;
 margin-top:16px;
}
.csa-glance__price {
 font-size:18px;
 color:#130038;
 line-height:1.4;
 font-weight:700;
 text-align:right;
}
@media (max-width: 767px) {
.csa-glance__price {
}
}

@media (max-width: 479px) {
.csa-glance__price {
 text-align:left;
 font-size:18px;
 font-weight:700;
}
}

.csa-glance {
 width:100%;
 padding-left:40px;
 padding-top:32px;
 background-color:#e1f3ff;
 padding-right:40px;
 padding-bottom:32px;
 flex-shrink:1;
 flex-grow:1;
 border-radius:16px;
}
.csa-glance:not(.ct-section):not(.oxy-easy-posts),
.csa-glance.oxy-easy-posts .oxy-posts,
.csa-glance.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
@media (max-width: 767px) {
.csa-glance {
 padding-left:20px;
 padding-right:20px;
}
}

.csa-what__title-rest {
 font-weight:500;
}
.csa-what__item-text {
 color:#414042;
 line-height:1.4;
 font-weight:400;
 font-size:15px;
}
.csa-what__list {
 width:100%;
 gap:28px;
}
.csa-what__list:not(.ct-section):not(.oxy-easy-posts),
.csa-what__list.oxy-easy-posts .oxy-posts,
.csa-what__list.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:28px;
}
.csa-glance__price-row {
 width:100%;
 gap:16px;
 padding-top:16px;
}
.csa-glance__price-row:not(.ct-section):not(.oxy-easy-posts),
.csa-glance__price-row.oxy-easy-posts .oxy-posts,
.csa-glance__price-row.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:baseline;
justify-content:space-between;
gap:16px;
}
@media (max-width: 479px) {
.csa-glance__price-row {
 gap:4px;
}
.csa-glance__price-row:not(.ct-section):not(.oxy-easy-posts),
.csa-glance__price-row.oxy-easy-posts .oxy-posts,
.csa-glance__price-row.ct-section .ct-section-inner-wrap{
flex-direction:column;
align-items:flex-start;
gap:4px;
}
}

.csa-glance__badge-row {
 gap:8px;
}
.csa-glance__badge-row:not(.ct-section):not(.oxy-easy-posts),
.csa-glance__badge-row.oxy-easy-posts .oxy-posts,
.csa-glance__badge-row.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:wrap;
align-items:center;
gap:8px;
}
.csa-what__item-body {
 flex-shrink:1;
 gap:4px;
 width:100%;
}
.csa-what__item-body:not(.ct-section):not(.oxy-easy-posts),
.csa-what__item-body.oxy-easy-posts .oxy-posts,
.csa-what__item-body.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:4px;
}
.csa-glance__row {
 border-color:#a17bff;
 width:100%;
 border-style:solid;
 gap:16px;
 border-right-width:0px;
 padding-top:11px;
 border-bottom-width:1px;
 border-left-width:0px;
 padding-bottom:11px;
 border-top-width:0px;
}
.csa-glance__row:not(.ct-section):not(.oxy-easy-posts),
.csa-glance__row.oxy-easy-posts .oxy-posts,
.csa-glance__row.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
justify-content:space-between;
gap:16px;
}
@media (max-width: 479px) {
.csa-glance__row {
 gap:4px;
}
.csa-glance__row:not(.ct-section):not(.oxy-easy-posts),
.csa-glance__row.oxy-easy-posts .oxy-posts,
.csa-glance__row.ct-section .ct-section-inner-wrap{
flex-direction:column;
align-items:flex-start;
gap:4px;
}
}

.csa-what__icon {
 line-height:0;
 flex-shrink:0;
}
.csa-what__title {
 font-weight:700;
 color:#0d2651;
 margin-bottom:40px;
 line-height:1.2;
}
.csa-what {
 background-color:#f7f8fc;
}
.csa-glance__value {
 font-size:14px;
 color:#130038;
 line-height:1.4;
 font-weight:600;
 text-align:right;
}
@media (max-width: 479px) {
.csa-glance__value {
 text-align:left;
}
}

.csa-glance__price-label {
 font-size:18px;
 color:#130038;
 line-height:1.4;
 font-weight:700;
}
.csa-glance__title {
 font-size:26px;
 color:#130038;
 line-height:1.3;
 margin-top:8px;
 font-weight:700;
}
.tabs-7146-tab-active {
}
.tabs-contents-7146-tab {
 padding-left:0px;
 padding-right:0px;
}
.tabs-7146-tab {
}
.csa-accordion--spec {
}
.csa-accordion__icon--spec {
}
.csa-why-container {
 width:100%;
 gap:20px;
}
.csa-why-container:not(.ct-section):not(.oxy-easy-posts),
.csa-why-container.oxy-easy-posts .oxy-posts,
.csa-why-container.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:nowrap;
align-items:stretch;
justify-content:center;
gap:20px;
}
@media (max-width: 991px) {
.csa-why-container {
 text-align:left;
}
.csa-why-container:not(.ct-section):not(.oxy-easy-posts),
.csa-why-container.oxy-easy-posts .oxy-posts,
.csa-why-container.ct-section .ct-section-inner-wrap{
flex-wrap:wrap;
justify-content:center;
}
}

@media (max-width: 767px) {
.csa-why-container {
 gap:16px;
}
.csa-why-container:not(.ct-section):not(.oxy-easy-posts),
.csa-why-container.oxy-easy-posts .oxy-posts,
.csa-why-container.ct-section .ct-section-inner-wrap{
gap:16px;
}
}

.csa-why-card {
 border-radius:20px;
 flex-grow:1;
 padding-top:32px;
 padding-left:16px;
 padding-right:16px;
 padding-bottom:32px;
 gap:16px;
 max-width:400px;
 width:100%;
 min-width:300px;
 background-color:#ffffff;
 box-shadow:2px 2px 10px 2px rgba(0,0,0,0.12);
}
.csa-why-card:not(.ct-section):not(.oxy-easy-posts),
.csa-why-card.oxy-easy-posts .oxy-posts,
.csa-why-card.ct-section .ct-section-inner-wrap{
gap:16px;
}
@media (max-width: 1300px) {
.csa-why-card {
 min-width:200px;
}
}

@media (max-width: 991px) {
.csa-why-card {
 flex-shrink:1;
 max-width:100%;
 width:48%;
 min-width:250px;
}
.csa-why-card:not(.ct-section):not(.oxy-easy-posts),
.csa-why-card.oxy-easy-posts .oxy-posts,
.csa-why-card.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
}
}

@media (max-width: 767px) {
.csa-why-card {
 max-width:100%;
 min-width:204px;
}
}

@media (max-width: 479px) {
.csa-why-card {
 width:100%;
}
}

.csa-why-card-icon {
 width:60px;
 height:60px;
 margin-left:-5px;
}
.csa-why-card-title {
 min-height:45px;
}
@media (max-width: 1300px) {
.csa-why-card-title {
 font-size:18px;
}
}

@media (max-width: 991px) {
.csa-why-card-title {
 text-align:left;
}
}

@media (max-width: 479px) {
.csa-why-card-title {
 min-height:24px;
}
}

.form-col-left__container {
 max-width:400px;
 width:100%;
 gap:16px;
}
.form-col-left__container:not(.ct-section):not(.oxy-easy-posts),
.form-col-left__container.oxy-easy-posts .oxy-posts,
.form-col-left__container.ct-section .ct-section-inner-wrap{
gap:16px;
}
@media (max-width: 1300px) {
.form-col-left__container {
 width:95%;
}
}

@media (max-width: 991px) {
.form-col-left__container {
 width:100%;
 max-width:900px;
 margin-bottom:24px;
}
}

@media (max-width: 767px) {
.form-col-left__container {
 width:100%;
 max-width:800px;
}
.form-col-left__container:not(.ct-section):not(.oxy-easy-posts),
.form-col-left__container.oxy-easy-posts .oxy-posts,
.form-col-left__container.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:center;
}
}

.csa-subhero {
 background-color:#f7f8fc;
}
.oxel_icon_button_icon:hover{
 transition-duration:0.3s;
}
.oxel_icon_button_icon {
color: #ffffff;}.oxel_icon_button_icon 
>svg {width: 15px;height: 15px;}.oxel_icon_button_icon {
transform:rotate(270deg); margin-top:2px;
 transition-duration:0.3s;
}
.csa-faq {
}
.csa-faq .ct-section-inner-wrap {
padding-top: 96px;
padding-bottom: 96px;
}
.oxel_accordion {
 border-top-color:#adb4b9;
 border-right-color:#adb4b9;
 border-bottom-color:#adb4b9;
 border-left-color:#adb4b9;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
 border-top-style:none;
 border-right-style:none;
 border-bottom-style:none;
 border-left-style:none;
 width:100%;
}
.oxel_accordion__row {
 font-family:Poppins;
 width:100%;
 padding-top:16px;
 padding-left:12px;
 padding-right:12px;
 padding-bottom:16px;
 text-align:justify;
 border-bottom-color:#e2e2de;
 border-bottom-width:1px;
 border-bottom-style:solid;
 border-top-style:solid;
 background-color:#ffffff;
 border-right-style:solid;
 border-left-style:solid;
 font-weight:600;
 border-top-width:1px;
 border-right-width:1px;
 border-left-width:1px;
 border-top-color:#e2e2de;
 border-right-color:#e2e2de;
 border-left-color:#e2e2de;
 border-radius:9px;
}
.oxel_accordion__row:not(.ct-section):not(.oxy-easy-posts),
.oxel_accordion__row.oxy-easy-posts .oxy-posts,
.oxel_accordion__row.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
justify-content:space-between;
}
.oxel_accordion__icon {
color: #374047;}.oxel_accordion__icon 
>svg {width: 18px;height: 18px;}.oxel_accordion__icon {
 margin-right:8px;
 transition-duration:0.3s;
}
.oxel_accordion__row_left {
}
.oxel_accordion__row_left:not(.ct-section):not(.oxy-easy-posts),
.oxel_accordion__row_left.oxy-easy-posts .oxy-posts,
.oxel_accordion__row_left.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
}
.oxel_accordion__content {
 width:100%;
 padding-top:8px;
 padding-left:8px;
 padding-right:8px;
 padding-bottom:8px;
 border-bottom-color:#98a1a8;
 border-bottom-width:2px;
 border-bottom-style:none;
 overflow:hidden;
 opacity:1;
 transition-duration:3s;
 border-top-style:none;
 border-right-style:none;
 border-left-style:none;
 transition-property:max-height;
 text-align:left;
 max-height:3000px;
 margin-top:0px;
}
.oxel_accordion__content:not(.ct-section):not(.oxy-easy-posts),
.oxel_accordion__content.oxy-easy-posts .oxy-posts,
.oxel_accordion__content.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
}
.oxel_accordion__content__hidden {
 max-height:0px;
 padding-left:8px;
 padding-right:8px;
 padding-top:0px;
 z-index:-1;
 padding-bottom:0px;
 transition-duration:0s;
}
.oxel_accordion__content__hidden:not(.ct-section):not(.oxy-easy-posts),
.oxel_accordion__content__hidden.oxy-easy-posts .oxy-posts,
.oxel_accordion__content__hidden.ct-section .ct-section-inner-wrap{
display:flex;
}
.oxel_accordion__row__label {
 color:#0d2651;
 font-size:16px;
 font-weight:600;
}
.csa-quote-card--r5 {
}
.csa-brag {
}
.csa-brag__row {
}
.csa-brag__item {
}
@media (max-width: 479px) {
.csa-brag__item {
}
}

.csa-brag__icon {
}
.csa-brag__text {
}
.csa-brag__rule {
}
.csa-quote-card--v2 {
background-image:url(https://collegesa.co.za/wp-content/uploads/2026/09/csa-home-testimonial-block-2.svg);}
.csa-quote-card--v1 {
background-image:url(https://collegesa.co.za/wp-content/uploads/2026/09/csa-home-testimonial-block-1.svg);}
.csa-quote-card--v3 {
background-image:url(https://collegesa.co.za/wp-content/uploads/2026/09/csa-home-testimonial-block-3.svg);}
.content-block-container {
 align-self:stretch;
 padding-right:20px;
 padding-bottom:20px;
 padding-left:20px;
 width:50%;
 text-align:center;
}
.content-block-container:not(.ct-section):not(.oxy-easy-posts),
.content-block-container.oxy-easy-posts .oxy-posts,
.content-block-container.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-end;
justify-content:center;
}
@media (max-width: 991px) {
.content-block-container {
 padding-bottom:40px;
 padding-top:40px;
 text-align:right;
}
.content-block-container:not(.ct-section):not(.oxy-easy-posts),
.content-block-container.oxy-easy-posts .oxy-posts,
.content-block-container.ct-section .ct-section-inner-wrap{
align-items:center;
}
}

@media (max-width: 767px) {
.content-block-container {
 width:100%;
 padding-top:40px;
 padding-right:20px;
 padding-bottom:40px;
 padding-left:20px;
}
.content-block-container:not(.ct-section):not(.oxy-easy-posts),
.content-block-container.oxy-easy-posts .oxy-posts,
.content-block-container.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
}

.content-block {
 gap:12px;
 padding-bottom:0px;
 max-width:500px;
 width:100%;
}
.content-block:not(.ct-section):not(.oxy-easy-posts),
.content-block.oxy-easy-posts .oxy-posts,
.content-block.ct-section .ct-section-inner-wrap{
gap:12px;
}
@media (max-width: 767px) {
.content-block {
}
}

.solid-icon-button:hover{
 background-color:#133a7c;
 transition-duration:0.2s;
}
.solid-icon-button {
 color:#ffffff;
 padding-top:11px;
 padding-bottom:11px;
 padding-right:14px;
 padding-left:14px;
 gap:7px;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
 border-top-style:solid;
 border-right-style:solid;
 border-bottom-style:solid;
 border-left-style:solid;
 border-top-color:#0e306a;
 border-right-color:#0e306a;
 border-bottom-color:#0e306a;
 border-left-color:#0e306a;
 transition-duration:0.2s;
 background-color:#0e306a;
 margin-bottom:0px;
}
.solid-icon-button:not(.ct-section):not(.oxy-easy-posts),
.solid-icon-button.oxy-easy-posts .oxy-posts,
.solid-icon-button.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
gap:7px;
}
.solid-icon-button-text {
 font-weight:500;
 color:#ffffff;
}
.solid-icon-button-icon:hover{
 margin-left:2px;
 margin-right:-2px;
}
.solid-icon-button-icon {
 margin-left:0px;
 margin-right:0px;
}
.csa-how-card {
 background-color:#193159;
 border-top-style:solid;
 border-right-style:solid;
 border-bottom-style:solid;
 border-left-style:solid;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
 border-top-color:#264f80;
 border-right-color:#264f80;
 border-bottom-color:#264f80;
 border-left-color:#264f80;
 border-radius:20px;
 padding-top:40px;
 padding-left:20px;
 padding-right:20px;
 padding-bottom:32px;
 gap:16px;
 max-width:333px;
 min-width:200px;
 flex-grow:1;
 flex-shrink:1;
 width:100%;
}
.csa-how-card:not(.ct-section):not(.oxy-easy-posts),
.csa-how-card.oxy-easy-posts .oxy-posts,
.csa-how-card.ct-section .ct-section-inner-wrap{
gap:16px;
}
@media (max-width: 1300px) {
.csa-how-card {
}
}

@media (max-width: 991px) {
.csa-how-card {
 border-radius:20px;
}
}

.csa-how-num {
 font-weight:600;
 color:#ff3364;
 font-size:36px;
 line-height:1;
}
.csa-how-heading {
 color:#ffffff;
 font-weight:600;
 line-height:1.3;
 font-size:18px;
}
.csa-how-body {
 color:#ffffff;
}
.brag-strip {
}
.brag-strip__row {
 position:relative;
 width:100%;
}
.brag-strip__row:not(.ct-section):not(.oxy-easy-posts),
.brag-strip__row.oxy-easy-posts .oxy-posts,
.brag-strip__row.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
justify-content:space-between;
}
.brag-strip__item {
 gap:8px;
}
.brag-strip__item:not(.ct-section):not(.oxy-easy-posts),
.brag-strip__item.oxy-easy-posts .oxy-posts,
.brag-strip__item.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
gap:8px;
}
.brag-strip__icon {
}
.brag-strip__text {
 color:#ffffff;
 font-size:14px;
 font-weight:600;
 line-height:1.4;
}
.brag-strip__divider {
 width:1px;
 height:40px;
 background-color:#e2e2de;
 flex-shrink:0;
}
.csa-footer {
}
.csa-footer__bar {
}
.csa-footer__bar-inner {
}
.csa-footer__brand {
}
.csa-footer__col--contact {
}
.csa-footer__col--quick {
}
.csa-footer__contact {
}
.csa-footer__contact-item {
}
.csa-footer__copyright {
}
@media (max-width: 767px) {
.csa-footer__copyright {
 text-align:center;
}
}

.csa-footer__grid {
}
.csa-footer__heading {
}
.csa-footer__legal {
}
.csa-footer__logo {
}
.csa-footer__main {
}
.csa-footer__social {
}
.csa-footer__social-link {
}
.csa-footer__social-list {
}
.csa-footer__tagline {
}
.csa-logo-slot {
}
.csa-header {
}
.csa-header__bar {
}
.csa-header__cta {
}
.csa-header__inner {
}
.csa-header__logo {
}
.csa-header__nav {
}
.csa-header__search {
}
.csa-header__utility {
}
.csa-header__utility-inner {
}
.csa-u-sr-only {
}
.csa-utility__tab {
}
@media (max-width: 991px) {
.csa-utility__tab {
}
}

.csa-utility__tab--enrol {
}
.csa-utility__tab--login {
}
.csa-utility__tab--pay {
}
.custom-class {
}
@media (max-width: 767px) {
.custom-class {
}
.custom-class:not(.ct-section):not(.oxy-easy-posts),
.custom-class.oxy-easy-posts .oxy-posts,
.custom-class.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
}

.csa-burger-slot {
}
.hero-section {
background-image:url(https://collegesa.co.za/wp-content/uploads/2026/09/csa-home-homepage-banner-desktop.webp);}
.hero-section:not(.ct-section):not(.oxy-easy-posts),
.hero-section.oxy-easy-posts .oxy-posts,
.hero-section.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
}
@media (max-width: 991px) {
.hero-section {
background-image:url(https://collegesa.co.za/wp-content/uploads/2026/09/csa-home-homepage-banner-desktop.webp); background-position:45% 0%;
}
}

@media (max-width: 767px) {
.hero-section {
background-image:url(https://collegesa.co.za/wp-content/uploads/2026/09/csa-home-homepage-banner-mobile.webp); background-position:0% 100%;
}
}

@media (max-width: 479px) {
.hero-section {
background-image:url(https://collegesa.co.za/wp-content/uploads/2026/09/csa-home-homepage-banner-mobile.webp); background-position:50% 90%;
}
}

.hero-content-container {
 width:100%;
}
.csa-heading-span {
 color:#ff3364;
}
.csa-heading-h2 {
 color:#ffffff;
 font-weight:400;
}
@media (max-width: 991px) {
.csa-heading-h2 {
}
}

.contained {
 max-width:65%;
 gap:24px;
}
.contained:not(.ct-section):not(.oxy-easy-posts),
.contained.oxy-easy-posts .oxy-posts,
.contained.ct-section .ct-section-inner-wrap{
gap:24px;
}
@media (max-width: 991px) {
.contained {
 gap:16px;
}
.contained:not(.ct-section):not(.oxy-easy-posts),
.contained.oxy-easy-posts .oxy-posts,
.contained.ct-section .ct-section-inner-wrap{
gap:16px;
}
}

@media (max-width: 767px) {
.contained {
}
}

.hero-body {
 color:#ffffff;
}
.csa-home-hero__tabs {
 gap:16px;
}
.csa-home-hero__tabs:not(.ct-section):not(.oxy-easy-posts),
.csa-home-hero__tabs.oxy-easy-posts .oxy-posts,
.csa-home-hero__tabs.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:wrap;
gap:16px;
}
@media (max-width: 767px) {
.csa-home-hero__tabs {
}
}

.csa-home-hero__tab:hover{
 background-color:rgba(38,79,128,0.8);
}
.csa-home-hero__tab {
 background-color:rgba(38,79,128,0.4);
 border-top-style:solid;
 border-right-style:solid;
 border-bottom-style:solid;
 border-left-style:solid;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
 border-top-color:#264f80;
 border-right-color:#264f80;
 border-bottom-color:#264f80;
 border-left-color:#264f80;
 border-radius:50px;
 padding-left:13px;
 padding-right:13px;
 padding-bottom:8px;
 padding-top:8px;
 gap:8px;
 transition-duration:0.3s;
}
.csa-home-hero__tab:not(.ct-section):not(.oxy-easy-posts),
.csa-home-hero__tab.oxy-easy-posts .oxy-posts,
.csa-home-hero__tab.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
gap:8px;
}
@media (max-width: 991px) {
.csa-home-hero__tab {
 padding-top:6px;
 padding-bottom:6px;
 padding-right:10px;
 padding-left:10px;
}
}

.csa-home-hero__tab-text {
 color:#ffffff;
}
@media (max-width: 767px) {
.csa-home-hero__tab-text {
 font-size:12px;
}
}

@media (max-width: 479px) {
.csa-home-hero__tab-text {
 font-size:12px;
}
}

.csa-home-hero__tab-indicator {
 border-radius:100px;
 width:9px;
 height:9px;
}
@media (max-width: 767px) {
.csa-home-hero__tab-indicator {
 width:6px;
 height:6px;
}
}

.brag-strip-content-container {
 gap:8px;
}
.brag-strip-content-container:not(.ct-section):not(.oxy-easy-posts),
.brag-strip-content-container.oxy-easy-posts .oxy-posts,
.brag-strip-content-container.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
gap:8px;
}
.csa-icon {
}
.brag-strip-text {
 color:#ffffff;
 font-size:14px;
}
.brag-strip-col {
 padding-left:0px;
 padding-top:0px;
 padding-right:0px;
 padding-bottom:0px;
}
.csa-directory-container {
 width:100%;
 gap:32px;
}
.csa-directory-container:not(.ct-section):not(.oxy-easy-posts),
.csa-directory-container.oxy-easy-posts .oxy-posts,
.csa-directory-container.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
flex-wrap:wrap;
align-items:stretch;
gap:32px;
}
@media (max-width: 767px) {
.csa-directory-container {
 max-width:450px;
}
}

.csa-directory-card {
background-size: contain; border-top-style:solid;
 border-right-style:solid;
 border-bottom-style:solid;
 border-left-style:solid;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
 border-top-color:#e2e2de;
 border-right-color:#e2e2de;
 border-bottom-color:#e2e2de;
 border-left-color:#e2e2de;
 border-radius:20px;
 overflow:hidden;
 position:relative;
 flex-grow:1;
 flex-shrink:1;
 min-width:200px;
 background-repeat:no-repeat;
 width:300px;
 background-position:50% 100%;
}
.csa-directory-card-inner {
 width:100%;
 height:100%;
 border-top-width:2px;
 border-top-color:#ffaee0;
 border-top-style:solid;
 padding-left:20px;
 padding-right:20px;
 padding-top:20px;
 padding-bottom:20px;
}
.csa-directory-card-inner:not(.ct-section):not(.oxy-easy-posts),
.csa-directory-card-inner.oxy-easy-posts .oxy-posts,
.csa-directory-card-inner.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
justify-content:space-between;
}
@media (max-width: 1300px) {
.csa-directory-card-inner {
 border-top-width:3px;
}
}

@media (max-width: 991px) {
.csa-directory-card-inner {
 border-top-width:4px;
}
}

.csa-directory-card-upper-content {
 width:100%;
 gap:16px;
 padding-top:16px;
}
.csa-directory-card-upper-content:not(.ct-section):not(.oxy-easy-posts),
.csa-directory-card-upper-content.oxy-easy-posts .oxy-posts,
.csa-directory-card-upper-content.ct-section .ct-section-inner-wrap{
gap:16px;
}
.csa-directory-card-icon {
 position:absolute;
 top:12px;
 right:12px;
 width:50px;
 height:50px;
}
.csa-directory-card-icon:not(.ct-section):not(.oxy-easy-posts),
.csa-directory-card-icon.oxy-easy-posts .oxy-posts,
.csa-directory-card-icon.ct-section .ct-section-inner-wrap{
display:block;
}
.csa-directory-card-title {
 color:#0d2651;
 font-weight:600;
 max-width:86%;
 min-height:40px;
}
@media (max-width: 767px) {
.csa-directory-card-title {
 max-width:85%;
}
}

.csa-directory-card-icon-list {
 gap:12px;
}
.csa-directory-card-icon-list:not(.ct-section):not(.oxy-easy-posts),
.csa-directory-card-icon-list.oxy-easy-posts .oxy-posts,
.csa-directory-card-icon-list.ct-section .ct-section-inner-wrap{
gap:12px;
}
.csa-directory-card-il-li {
 gap:16px;
}
.csa-directory-card-il-li:not(.ct-section):not(.oxy-easy-posts),
.csa-directory-card-il-li.oxy-easy-posts .oxy-posts,
.csa-directory-card-il-li.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
gap:16px;
}
.csa-directory-card-body {
 color:#0d2651;
 font-weight:400;
 min-height:130px;
}
.csa-directory-card-li-icon {
 color:#0d2651;
}
.csa-directory-card-inner-lower-content {
 width:100%;
 min-height:150px;
}
.csa-directory-card-inner-lower-content:not(.ct-section):not(.oxy-easy-posts),
.csa-directory-card-inner-lower-content.oxy-easy-posts .oxy-posts,
.csa-directory-card-inner-lower-content.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
justify-content:flex-end;
}
@media (max-width: 991px) {
.csa-directory-card-inner-lower-content {
 min-height:200px;
}
}

.csa-pay-option-card {
 background-color:#ffffff;
 border-top-style:solid;
 border-right-style:solid;
 border-bottom-style:solid;
 border-left-style:solid;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
 border-top-color:#e2e2de;
 border-right-color:#e2e2de;
 border-bottom-color:#e2e2de;
 border-left-color:#e2e2de;
 border-radius:12px;
 width:100%;
 overflow:hidden;
 height:100%;
}
.csa-pill-label {
 padding-left:16px;
 padding-right:16px;
 padding-top:2px;
 padding-bottom:2px;
 border-radius:50px;
 text-transform:uppercase;
 letter-spacing:0.5px;
 font-weight:600;
 font-size:13px;
}
@media (max-width: 991px) {
.csa-pill-label {
 font-size:12px;
}
}

@media (max-width: 479px) {
.csa-pill-label {
 font-size:12px;
 padding-top:1px;
 padding-bottom:1px;
}
}

.csa-pill-label-pink {
 background-color:#fff5fb;
 color:#ff3364;
}
.csa-pay-option-inner {
 width:100%;
 height:100%;
 padding-left:24px;
 padding-right:24px;
 padding-top:24px;
 padding-bottom:24px;
 gap:8px;
 border-bottom-width:3px;
 border-bottom-style:solid;
}
.csa-pay-option-inner:not(.ct-section):not(.oxy-easy-posts),
.csa-pay-option-inner.oxy-easy-posts .oxy-posts,
.csa-pay-option-inner.ct-section .ct-section-inner-wrap{
gap:8px;
}
.csa-pill-label-purple {
 color:#ffffff;
 background-color:#c792ff;
}
.form-col-heading {
 color:#ffffff;
}
.h2-sml {
 font-size:24px;
}
@media (max-width: 991px) {
.h2-sml {
 font-size:20px;
}
}

.tabs-8664-tab {
}
.tabs-8664-tab-active {
}
.tabs-contents-8664-tab {
}
.csa-footer-cta:hover{
 margin-top:-3px;
 margin-bottom:3px;
 box-shadow:4px 4px 8px rgba(0,0,0,0.33);
}
.csa-footer-cta {
 gap:12px;
 background-color:#ffffff;
 border-radius:50px;
 padding-top:16px;
 padding-bottom:16px;
 padding-left:32px;
 padding-right:32px;
 transition-duration:0.3s;
}
.csa-footer-cta:not(.ct-section):not(.oxy-easy-posts),
.csa-footer-cta.oxy-easy-posts .oxy-posts,
.csa-footer-cta.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:row;
align-items:center;
justify-content:center;
gap:12px;
}
.tabs-6783-tab {
}
.tabs-6783-tab-active {
}
.tabs-contents-6783-tab {
}
.oxy-stock-content-styles {
}
.csa-card-excerpt {
}
.csa-pink-btn {
}
.csa-choose-head {
}
.csa-choose-text {
 width:320px;
 text-align:left;
}
.csa-choose-btn {
 margin-top:auto;
}
.csa-choose-outer {
 width:31.33%;
}
.csa-choose-outer:not(.ct-section):not(.oxy-easy-posts),
.csa-choose-outer.oxy-easy-posts .oxy-posts,
.csa-choose-outer.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
.csa-choose-content {
 width:100%;
 text-align:justify;
 gap:15px;
}
.csa-choose-content:not(.ct-section):not(.oxy-easy-posts),
.csa-choose-content.oxy-easy-posts .oxy-posts,
.csa-choose-content.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
align-items:flex-start;
justify-content:flex-start;
gap:15px;
}
.csa-choose-img {
 width:45px;
}
.csa-text-content {
 gap:20px;
 flex-grow:1;
}
.csa-text-content:not(.ct-section):not(.oxy-easy-posts),
.csa-text-content.oxy-easy-posts .oxy-posts,
.csa-text-content.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
gap:20px;
}
.tabs-5966-tab {
}
.tabs-5966-tab-active {
}
.tabs-contents-5966-tab {
}
.tabs-5964-tab {
}
.tabs-5964-tab-active {
}
.tabs-contents-5964-tab {
 gap:25px;
}
.tabs-contents-5964-tab:not(.ct-section):not(.oxy-easy-posts),
.tabs-contents-5964-tab.oxy-easy-posts .oxy-posts,
.tabs-contents-5964-tab.ct-section .ct-section-inner-wrap{
gap:25px;
}
.csa-tab-link {
}
.csa-trending-card-body {
 flex-grow:1;
 width:100%;
}
.csa-trending-card-body:not(.ct-section):not(.oxy-easy-posts),
.csa-trending-card-body.oxy-easy-posts .oxy-posts,
.csa-trending-card-body.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
.csa-trending-card {
 padding-top:10px;
 padding-right:10px;
 padding-bottom:10px;
 padding-left:10px;
 width:23.5%;
 flex-grow:1;
}
.csa-trending-card:not(.ct-section):not(.oxy-easy-posts),
.csa-trending-card.oxy-easy-posts .oxy-posts,
.csa-trending-card.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
@media (max-width: 1300px) {
.csa-trending-card {
 width:22.5%;
}
}

.csa-trending-card-title {
 text-align:left;
 font-size:16px;
}
@media (max-width: 1300px) {
.csa-trending-card-title {
 font-size:12px;
}
}

.csa-badge-bestseller {
}
.csa-trending-card-meta {
 flex-grow:1;
}
.csa-trending-card-meta:not(.ct-section):not(.oxy-easy-posts),
.csa-trending-card-meta.oxy-easy-posts .oxy-posts,
.csa-trending-card-meta.ct-section .ct-section-inner-wrap{
display:flex;
flex-direction:column;
}
.csa-trending-price {
}
.csa-trending-duration-pill {
}
.csa-trending-card-image {
}
.csa-trending-card-link {
}
.my-static-card {
}
.pm-span {
 font-size:11px;
}
.csa-grow:hover{
transform:scale(1.01,1.01);}
.csa-grow {
 transition-duration:0.3s;
}
.csa-footer__legal-list {
}
.csa-header__actions {
}
.csa-header__cta--pay {
 background-color:#c792ff;
}
.csa-header__cta--login {
 background-color:#a17bff;
}
.csa-btn__secondary:hover{
 background-color:#011a3d;
 transition-duration:0.3s;
}
.csa-btn__secondary {
 border-radius:8px;
 border-top-width:1px;
 border-right-width:1px;
 border-bottom-width:1px;
 border-left-width:1px;
 border-top-color:#ff3364;
 border-right-color:#ff3364;
 border-bottom-color:#ff3364;
 border-left-color:#ff3364;
 border-top-style:solid;
 border-right-style:solid;
 border-bottom-style:solid;
 border-left-style:solid;
 background-color:#0d2651;
 color:#ffffff;
}
.csa-course-listing-card__button {
}
.csa-course-listing-card__button--full {
}
@media (max-width: 767px) {
.csa-course-listing-card__button--full {
 width:100%;
 text-align:center;
}
}

.csa-page-hero--simple {
}
@media (max-width: 991px) {
.csa-page-hero--simple {
 background-position:25% 50%;
}
}

@media (max-width: 767px) {
.csa-page-hero--simple {
background-size: 100% auto; background-repeat:no-repeat;
 background-position:50% 100%;
}
}

.csa-page-hero__content--simple {
 max-width:700px;
}
@media (max-width: 991px) {
.csa-page-hero__content--simple {
 max-width:65%;
}
}

@media (max-width: 767px) {
.csa-page-hero__content--simple {
 max-width:100%;
}
}

.csa-page-hero__inner--simple {
}
@media (max-width: 767px) {
.csa-page-hero__inner--simple {
 padding-bottom:25%;
}
}

.csa-page-hero__intro--simple {
 margin-bottom:32px;
}
@media (max-width: 767px) {
.csa-page-hero__intro--simple {
 margin-bottom:40%;
}
}

.csa-btn--primary_courses:hover{
 background-color:#e8005f;
}
.csa-btn--primary_courses {
 padding-top:8px;
 padding-bottom:8px;
 padding-left:24px;
 padding-right:24px;
 background-color:#ff3364;
 color:#ffffff;
 transition-duration:0.3s;
}
/* ==========================================================================
    No selectors other than :root.
   ========================================================================== */

:root {
  /* ---- Brand -------------------------------------------------------- */
  --csa-navy: #0d2651;
  --csa-navy-deep: #011a3d;
  --csa-navy-mid: #193159;
  --csa-navy-soft: #264f80;
  --csa-pink: #ff3364;

  /* ---- Surfaces ----------------------------------------------------- */
  --csa-white: #ffffff;
  --csa-surface-grey: #f7f8fc;
  --csa-surface-pink: #fff5fb;
  --csa-surface-cyan: #e6f9ff;
  --csa-surface-purple: #f7f0ff;

  /* ---- Feature colours ---------------------------------------------- */
  --csa-blue: #71a1cc;
  --csa-purple: #c792ff;
  --csa-purple-mid: #a17bff;
  --csa-pink-light: #ff94cc;
  --csa-lilac: #b5a9cd;

  /* ---- Text --------------------------------------------------------- */
  --csa-ink: #414042;
  --csa-ink-muted: #808285;
  --csa-ink-invert: #eef0f5;
  --csa-grey: #aaaaaa;

  /* ---- Borders ------------------------------------------------------ */
  --csa-border-card: #e2e2de;
  --csa-border-accent: #ffaee0;

  /* ---- Type --------------------------------------------------------- */
  --csa-font: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;

  --csa-fw-regular: 400;
  --csa-fw-medium: 500;
  --csa-fw-semibold: 600;
  --csa-fw-bold: 700;

  --csa-fs-display: 52px;
  --csa-lh-display: 74px;

  --csa-fs-h2: 36px;
  --csa-lh-h2: 51px;

  --csa-fs-lead: 16px;
  --csa-lh-lead: 24px;

  --csa-fs-body: 14px;
  --csa-lh-body: 21px;

  --csa-fs-small: 12px;
  --csa-lh-small: 18px;

  --csa-fs-label: 13px;
  --csa-lh-label: 18px;

  --csa-fs-badge: 10px;
  --csa-lh-badge: 14px;
  --csa-ls-badge: 0.77px;

  /* ---- Space -------------------------------------------------------- */
  --csa-space-1: 4px;
  --csa-space-2: 8px;
  --csa-space-3: 16px;
  --csa-space-4: 24px;
  --csa-space-5: 32px;
  --csa-space-6: 48px;
  --csa-space-7: 64px;
  --csa-space-8: 96px;

  /* ---- Layout ------------------------------------------------------- */
  --csa-container: 1260px;
  --csa-gutter: 20px;

  /* ---- Radius ------------------------------------------------------- */
  --csa-radius-card: 20px;        
  --csa-radius-card-mobile: 15px;  
  --csa-radius-card-sm: 14px;      
  --csa-radius-pill: 50px;        

  /* ---- Shadow ------------------------------------------------------- */
  --csa-shadow-card: 4px 6px 9px 0 rgba(0, 0, 0, 0.07);

  /* ---- Call to action ----------------------------------------------- */
  --csa-cta-bg: var(--csa-pink);
  --csa-cta-radius: var(--csa-radius-pill);
  --csa-cta-fs: 13px;
  --csa-cta-fw: var(--csa-fw-medium);
}
/* ==========================================================================
   CollegeSA - 02 base
   Base typography and the small utility set the header and footer need.
   Everything else is scoped under a csa- class.
   Source of truth: DESIGN-SYSTEM.md
   Last updated: 2026-09-08

   Contents
   1. Base
   2. Focus
   3. Utilities
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Base

   **Poppins is loaded by Oxygen, in Global Styles, not by this file.**
   Decision D23. This file only names the family, through --csa-font in
   01-tokens.css. There are no @font-face rules to keep in step.

   Oxygen must have all four weights ticked: 400, 500, 600 and 700. If a
   weight is missing the browser fakes it, and 500 and 600 are what the
   buttons and the footer headings use.

   The body font-size below is 14px, from the design. It is set here on
   purpose, because Oxygen's own base size is not the design's.
   -------------------------------------------------------------------------- */

html {
  box-sizing: border-box;
  -webkit-text-size-adjust: 100%;
}

*,
*::before,
*::after {
  box-sizing: inherit;
}

body {
  margin: 0;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* --------------------------------------------------------------------------
   2. Focus

   One visible focus ring for the whole site. Keyboard users only, so it does
   not show on a mouse click.
   -------------------------------------------------------------------------- */

.csa-header :focus-visible,
.csa-footer :focus-visible {
  outline: 2px solid var(--csa-pink-light);
  outline-offset: 2px;
  border-radius: 2px;
}

/* --------------------------------------------------------------------------
   3. Utilities

   Keep this set small. See OXYGEN-CONVENTIONS.md section 2, rule 4.
   -------------------------------------------------------------------------- */

.csa-u-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.csa-u-sr-only:focus {
  position: fixed;
  top: var(--csa-space-2);
  left: var(--csa-space-2);
  z-index: 200;
  width: auto;
  height: auto;
  margin: 0;
  padding: var(--csa-space-2) var(--csa-space-3);
  overflow: visible;
  clip: auto;
  color: var(--csa-white);
  background-color: var(--csa-navy);
  border-radius: var(--csa-radius-pill);
}

/* The shared container, for the page bands built later. The header and the
   footer do not use it, they carry the same measurement on their own inner
   rows, so a builder element never needs two classes. */
.csa-container {
  width: 100%;
  max-width: calc(var(--csa-container) + (var(--csa-gutter) * 2));
  margin-inline: auto;
  padding-inline: var(--csa-gutter);
}

/* Every icon code block SVG carries this class. It is only a safe default.
   The real size is set per context in 03-components.css. */
.csa-icon {
  display: block;
  width: 1em;
  height: 1em;
  flex: 0 0 auto;
}

.tabs-5964-tab {
   display: flex;
    align-items: center;
    background-color: #FFFFFF;
    color: #1B264F;
    border: none;
    padding: 8px 16px;
    border-radius: 50px;
    font-weight: bold;
    font-size: 14px;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
    cursor: pointer;
    transition: all 0.2s ease;
}

.tabs-5964-tab.tabs-5964-tab-active{
    background-color: #FF0055;
    color: #FFFFFF;
} 
  
.csa-work-sub-h3 {
  font-weight: 500!important;
}

.cky-btn-revisit-wrapper {
  display: none !important;
}
   /* ==========================================================================
   CollegeSA - 03 components
   Buttons, the header and the footer. More components are added here as they
   are built.
   Source of truth: DESIGN-SYSTEM.md sections 5 and 11
   The home hero and its banner ratios moved to 05-home.css on 2026-09-09.
   Heading sizes moved to 04-typography.css on 2026-09-09.
   Last updated: 2026-09-11

   Contents
   1. Buttons
   2. Header, shared and sticky
   3. Header, utility tabs
   4. Header, bar and logo
   5. Header, desktop menu and dropdown
   6. Header, search
   7. Header, burger
   8. Header, mobile menu panel
   9. Header, tablet and mobile
   10. Footer, main
   11. Footer, bottom bar
   12. Footer, tablet and mobile
   13. Brag strip
   14. Directory card, the meta list icons
   15. Directory card, row widths
   16. Why College SA cards, the odd trailing card
   17. Card slider
   17b. Card slider, the two add-ons the testimonial band needed
   18. Testimonial cards, "What students are saying"
   19. Accordion, the FAQ band
   20. Page hero, the reusable banner section
   21. Card slider, the logo strip add-on
   22. Course catalogue, the chip states and the row zebra
   23. Course card, the mobile layout
   24. Two column content band, the simple pages
   25. Policy cards, the Policies page

   ---------------------------------------------------------------------------
   READ THIS BEFORE YOU WRITE ANOTHER FLEX RULE
   ---------------------------------------------------------------------------
   Oxygen sets these two defaults in universal.css:

       .ct-div-block { display: flex; flex-direction: column;
                       align-items: flex-start; }
       .ct-link      { display: flex; flex-wrap: wrap; text-align: center;
                       text-decoration: none; flex-direction: column;
                       align-items: center; justify-content: center; }

   THE `.ct-link` LINE WAS WRONG UNTIL 2026-09-18. It listed three of the
   seven properties, and the four it left out cost session 32 a paste on the
   Policies page. Re-read off the compiled universal.css, line 28, not
   remembered. `flex-wrap`, `text-align` and `justify-content` are the three
   that bite, because a card that sets direction and alignment looks almost
   right: a label that fits beside its icon stays there, and one that does not
   drops onto its own flex line, centred. See section 25.

   THE RULE THIS GIVES: a class on a `ct_link` answers ALL SEVEN, even where
   the value agrees with Oxygen's. Anything left out wins silently.

   So every Oxygen Div and every Link Wrapper is already a flex COLUMN that
   SHRINKS TO ITS CONTENT. Two consequences, and both of them broke the header
   on 2026-09-08:

   1. `display: flex` on its own does nothing. Always state
      `flex-direction: row` when you want a row. Leave it out and you get a
      column, silently.
   2. A child of one of those columns shrinks to its content instead of
      filling the width. State `align-items: stretch` on any column whose
      children must be full width, or give the child `width: 100%`.

   A <ul>, <form>, <button> or <a> that comes out of a code block is plain
   HTML, so it defaults to row and needs neither. That is why the menu sat in
   a row while everything around it stacked.

   Our rules beat Oxygen's on equal specificity, because Oxygen writes our
   stylesheets after its own defaults into the same universal.css. Verified on
   the build site.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Buttons
   -------------------------------------------------------------------------- */

.csa-btn {
  display: inline-flex;
  flex-direction: row;
  align-items: center;
  justify-content: center;
  gap: var(--csa-space-2);
  height: 34px;
  padding: 0 var(--csa-space-3);
  border: 1px solid transparent;
  border-radius: var(--csa-radius-pill);
  font-family: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size: 13px;
  font-weight: 500;
  line-height: 1;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}

.csa-btn--primary {
  color: var(--csa-white);
  background-color: var(--csa-cta-bg);
}

.csa-btn--primary:hover,
.csa-btn--primary:focus-visible {
  color: var(--csa-white);
  background-color: #e51f4f;
}

/* --------------------------------------------------------------------------
   2. Header, shared and sticky

   The header keeps its place in the flow, so page content still starts under
   it. The utility tabs hang below the bar and overlap the first section,
   which is what the design shows.
   -------------------------------------------------------------------------- */

.csa-header {
  position: sticky;
  top: 0;
  z-index: 100;
  flex-direction: column;
  align-items: stretch;
  background-color: var(--csa-navy);
}

/* The WordPress admin bar is fixed. Push the header under it. */
body.admin-bar .csa-header {
  top: 32px;
}

@media screen and (max-width: 782px) {
  body.admin-bar .csa-header {
    top: 46px;
  }
}

/* The shared container measurement, used by the header, the footer
   and the brag strip. */
.csa-header__utility-inner,
.csa-header__inner,
.csa-footer__grid,
.csa-footer__bar-inner,
.csa-brag__row {
  width: 100%;
  max-width: calc(var(--csa-container) + (var(--csa-gutter) * 2));
  margin-inline: auto;
  padding-inline: var(--csa-gutter);
}

/* --------------------------------------------------------------------------
   3. Header, utility tabs

   MOBILE ONLY, 767 and down: all three tabs sit in a row at the top of the
   page. From 768 up they are hidden, and the three buttons in the bar take
   their place. Section 9.
   -------------------------------------------------------------------------- */

.csa-header__utility {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  flex-direction: column;
  align-items: stretch;
}

.csa-header__utility-inner {
  display: flex;
  flex-direction: row;
  justify-content: flex-end;
  gap: var(--csa-space-2);
}

.csa-utility__tab {
  display: inline-flex;
  flex-direction: row;
  align-items: center;
  gap: 6px;
  height: 32px;
  padding: 0 14px;
  border-radius: 0 0 10px 10px;
  color: var(--csa-white);
  font-size: 13px;
  font-weight: 600;
  line-height: 1;
  text-decoration: none;
  transition: filter 0.2s ease, transform 0.2s ease;
}

.csa-utility__tab:hover,
.csa-utility__tab:focus-visible {
  color: var(--csa-white);
  filter: brightness(1.08);
}

/* An Oxygen Text element renders a div, so the labels inside a Link Wrapper
   are divs, not spans. This keeps them from picking up a stray margin. */
.csa-utility__tab > div,
.csa-header__cta > div,
.csa-footer__contact-item > div {
  margin: 0;
}

/* A Code Block that holds one inline SVG. 
   The size is set here, never on the SVG itself. */
.csa-icon-slot,
.csa-logo-slot {
  display: flex;
  align-items: center;
}

.csa-icon-slot svg,
.csa-logo-slot svg {
  display: block;
}

/* Scoped to the tab, not to the slot class, so a missed class on the Code
   Block cannot blow the icon up to its natural size. */
.csa-utility__tab svg {
  width: 14px;
  height: 14px;
}

.csa-utility__tab--enrol {
  display: none; /* Desktop uses the Enrol Now pill inside the bar instead. */
  background-color: var(--csa-pink);
}

.csa-utility__tab--login {
  background-color: var(--csa-purple-mid);
}

.csa-utility__tab--pay {
  background-color: var(--csa-purple);
}

/* --------------------------------------------------------------------------
   4. Header, bar and logo

   Rewritten 2026-10-02, session 37. Plain values only, no tokens: a token
   cannot be read or changed in the builder.

   THE ORDER IN THE BAR: logo, menu, the three buttons, search, burger. The
   buttons sit in their own Div, `csa-header__actions`, so the 10px between
   them can differ from the 24px between the groups.

   THE BUTTONS. Enrol Now, Student login and Pay now are Link Wrappers with
   `csa-btn csa-header__cta`, plus `csa-btn--primary` on Enrol Now and
   `csa-header__cta--login` or `csa-header__cta--pay` on the other two. The
   pink of Enrol Now is `.csa-btn--primary` in section 1. The purple of the
   other two is set in the builder, on their modifier class, so it stays
   editable there. Only the hover is here. Section 9 of OXYGEN-CONVENTIONS.md,
   "hover, focus and active states".

   The sizes of the bar, the gaps and the buttons change with the width. The
   values below are the full size, 1260 and up. Section 9 of this file holds
   the smaller tiers.
   -------------------------------------------------------------------------- */

.csa-header__bar {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  border-bottom: 1px solid #b9bec4;
}

.csa-header__inner {
  display: flex;
  flex-direction: row;
  align-items: stretch;
  gap: 24px;
  height: 96px;
}

.csa-header__logo {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: flex-start;
  margin-right: auto;
  text-decoration: none;
}

.csa-header__logo svg {
  width: 164px;
  height: auto;
}

.csa-header__nav {
  display: flex;
  flex-direction: row;
  align-items: stretch;
}

/* The Code Block wraps the menu in a plain div. It has to pass the full bar
   height through, or the dropdown top: 100% lands in the wrong place. */
.csa-header__nav > div {
  display: flex;
  align-items: stretch;
}

.csa-header__actions {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 10px;
}

.csa-header__search,
.csa-header__actions {
  align-self: center;
}

/* All seven properties Oxygen sets on `.ct-link`, stated, decision D125.
   `.csa-btn` in section 1 answers display, direction, alignment and the
   underline. These are the other three. Left out, a narrow button could wrap
   its label under its icon. */
.csa-header__cta {
  flex-wrap: nowrap;
  text-align: center;
  justify-content: center;
}

/* The icon in each button is a Code Block holding one inline SVG. Sized here,
   scoped to the button, so a missed class on the Code Block cannot blow the
   icon up to its natural size. */
.csa-header__cta .ct-code-block {
  display: flex;
  align-items: center;
  line-height: 0;
}

.csa-header__cta svg {
  display: block;
  width: 14px;
  height: 14px;
}

/* Student login and Pay now. The colour is a builder field on the modifier
   class; the hover lifts it slightly, the same as the mobile tabs. */
.csa-header__cta--login,
.csa-header__cta--pay {
  color: #ffffff;
  transition: filter 0.2s ease;
}

.csa-header__cta--login:hover,
.csa-header__cta--login:focus-visible,
.csa-header__cta--pay:hover,
.csa-header__cta--pay:focus-visible {
  color: #ffffff;
  filter: brightness(1.08);
}

/* --------------------------------------------------------------------------
   5. Header, desktop menu and dropdown

   Markup comes from the "Header, desktop menu" code block, through
   CSA_NavWalker, snippet S2. The dropdown opens on hover and on keyboard
   focus. :focus-within needs no JavaScript and keeps the menu usable with Tab.

   Rewritten 2026-10-01, session 37. Plain values only, no tokens: a
   token cannot be read or changed in the builder.

   THE CHEVRON IS A BUTTON NOW, NOT A SPAN INSIDE THE LINK. The walker prints
   `<a>` then `<button class="csa-subnav-toggle">` then the sub-menu, so the
   label is a real link to its page and the chevron is its own control. The
   top level items are meant to look exactly as they did: the 6px gap, the
   9px chevron, white turning pink, and the half turn on hover and focus.

   THE DROPDOWN IS PINK: a #e8005f panel, white labels with white icons, and
   thin white dividers between the rows. Decided 2026-10-05, a shade darker
   than the design's #ff3364 so the hover can use the brand pink.

   THE LABELS ARE 15px REGULAR, THE SAME AS THE TOP LEVEL AND THE MOBILE
   PANEL, and the icons are 24px. Do not size
   them from the design image: it draws them smaller, and the menu is meant
   to read at one size everywhere. Between 992 and 1259 the top level shrinks
   to 13px, and section 9 shrinks these labels with it. The longest label,
   "Community Education Programmes", is 270px at 15px.

   The hover fills the row with #ff3364. The design gives no hover, so it is
   due for design review.

   `is-dismissed` is set by the script in the desktop menu code block, on
   Escape or on a second click of the chevron. It hides an open dropdown
   until the pointer or the focus leaves the item. It has to come AFTER the
   :hover and :focus-within rules, which it ties on specificity.

   Section 9 of OXYGEN-CONVENTIONS.md, "the output of a code block". The
   builder cannot reach any of this.
   -------------------------------------------------------------------------- */

.csa-nav__list {
  display: flex;
  align-items: stretch;
  gap: 30px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.csa-nav__list > li {
  position: relative;
  display: flex;
  align-items: stretch;
}

.csa-nav__list > li > a {
  display: flex;
  align-items: center;
  gap: 6px;
  color: #ffffff;
  font-size: 15px;
  font-weight: 400;
  line-height: 1;
  text-decoration: none;
  white-space: nowrap;
  transition: color 0.2s ease;
}

.csa-nav__list > li > a:hover,
.csa-nav__list > li > a:focus-visible,
.csa-nav__list > li.current-menu-item > a,
.csa-nav__list > li.current-menu-ancestor > a,
.csa-nav__list > li.current-menu-parent > a {
  color: #ff3364;
}

/* The chevron button. Every line here undoes a browser button default, except
   the 6px, which is the gap the chevron had inside the link. It is padding,
   not a margin, so the gap is part of the hit area. */
.csa-nav__list > li > .csa-subnav-toggle {
  display: flex;
  flex-direction: row;
  align-items: center;
  margin: 0;
  padding: 0 0 0 6px;
  border: 0;
  border-radius: 0;
  background: none;
  color: #ffffff;
  font: inherit;
  line-height: 1;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
  transition: color 0.2s ease;
}

.csa-nav__list > li > .csa-subnav-toggle svg {
  display: block;
  width: 9px;
  height: 9px;
  transition: transform 0.2s ease;
}

/* The chevron turns pink with its label, as it did when it sat inside it. */
.csa-nav__list > li > a:hover + .csa-subnav-toggle,
.csa-nav__list > li > .csa-subnav-toggle:hover,
.csa-nav__list > li > .csa-subnav-toggle:focus-visible,
.csa-nav__list > li.current-menu-item > .csa-subnav-toggle,
.csa-nav__list > li.current-menu-ancestor > .csa-subnav-toggle,
.csa-nav__list > li.current-menu-parent > .csa-subnav-toggle {
  color: #ff3364;
}

.csa-nav__list > li:hover > .csa-subnav-toggle svg,
.csa-nav__list > li:focus-within > .csa-subnav-toggle svg {
  transform: rotate(180deg);
}

.csa-nav__list .sub-menu {
  position: absolute;
  top: 85%;
  left: 0;
  z-index: 10;
  display: none;
  width: max-content;
  min-width: 214px;
  margin: 0;
  padding: 0 14px;
  list-style: none;
  background-color: #e8005f;
  border-radius: 8px;
  box-shadow: 4px 6px 9px 0 rgba(0, 0, 0, 0.12);
  overflow: hidden;
}

.csa-nav__list > li:hover > .sub-menu,
.csa-nav__list > li:focus-within > .sub-menu {
  display: block;
}

/* After the two rules above, on purpose. Same specificity, so order decides. */
.csa-nav__list > li.is-dismissed > .sub-menu {
  display: none;
}

.csa-nav__list > li.is-dismissed > .csa-subnav-toggle svg {
  transform: none;
}

/* A thin white rule between the rows, inset to the text. */
.csa-nav__list .sub-menu > li + li {
  border-top: 1px solid rgba(255, 255, 255, 0.5);
}

/* Flex, so an icon and its label sit on one line. A link with no icon is a
   single text run and looks the same as it did as a block. */
.csa-nav__list .sub-menu a {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 10px;
  margin: 0 -14px;
  padding: 0 14px;
  color: #ffffff;
  font-size: 15px;
  font-weight: 400;
  line-height: 36px;
  text-decoration: none;
  white-space: nowrap;
  transition: background-color 0.2s ease;
}

/* The panel has no top or bottom padding, so the hover reaches its edges.
   The first and last rows carry that 4px instead. */
.csa-nav__list .sub-menu > li:first-child > a {
  padding-top: 4px;
}

.csa-nav__list .sub-menu > li:last-child > a {
  padding-bottom: 4px;
}
/* The hover is the brand pink on the darker panel. The negative margin takes
   the row to the panel's edges, so the colour fills the full width, while
   the dividers on the `li` stay inset. */
.csa-nav__list .sub-menu a:hover,
.csa-nav__list .sub-menu a:focus-visible {
  color: #ffffff;
  background-color: #ff3364;
}

/* A white ring on the pink. The base ring from 02-base.css is pink and would
   not show. */
.csa-nav__list .sub-menu a:focus-visible {
  outline: 2px solid #ffffff;
  outline-offset: 2px;
}

/* The sub-menu icon, from the walker and snippet S16. It follows the link's
   colour through currentColor. */
.csa-nav__list .csa-menu-icon {
  display: flex;
  flex: 0 0 auto;
}

.csa-nav__list .csa-menu-icon svg {
  display: block;
  width: 24px;
  height: 24px;
}

/* The menu icons are live's thin outline art. A stroke in the same colour
   around each filled shape adds weight without changing the artwork.
   non-scaling-stroke makes the width screen pixels, so every icon gains the
   same weight whatever its viewBox. Find a course is drawn with strokes, in
   a 64 box at 24px, so its own stroke grows by the same 0.6px: 2.5 + 1.6.
   Not scoped to the desktop menu, so the mobile panel's icons match. */
.csa-menu-icon svg > path {
  stroke: currentColor;
  stroke-width: 0.6px;
  stroke-linejoin: round;
  vector-effect: non-scaling-stroke;
}

.csa-menu-icon .csa-icon--find-a-course g {
  stroke-width: 4.1;
}

@media (prefers-reduced-motion: reduce) {
  .csa-nav__list > li > .csa-subnav-toggle svg {
    transition: none;
  }
}

/* --------------------------------------------------------------------------
   6. Search

   The form is one shortcode, [csa_search], snippet S9. Three variants: the
   header bar, the mobile panel, and the 404 page. Every visual difference
   between them is here, because the builder cannot see inside a code block.
   Section 9 of OXYGEN-CONVENTIONS.md, "the output of a code block".

   ---------------------------------------------------------------------------
   WHY THE INPUT AND THE BUTTON CARRY AN ELEMENT NAME IN THE SELECTOR
   ---------------------------------------------------------------------------
   Measured on /courses/uncategorized/test/ on 2026-09-17. WooCommerce styles
   the bare elements inside `.woocommerce`, and those selectors are heavier
   than a plain class:

       .woocommerce input[type="search"]    0,2,1   beat  .csa-search__input    0,1,0
       .woocommerce button[type="submit"]   0,2,1   beat  .csa-search__button   0,1,0

   So on every page with `body.woocommerce`, which is the product single, the
   shop, the cart, the checkout and my account, the header search rendered as
   a white box with a #d3ced2 border and a teal #65bec2 uppercase button.
   Nothing to do with file order: our rules lost on specificity.

       form.csa-search input.csa-search__input     0,2,2
       form.csa-search button.csa-search__button   0,2,2

   The declarations are unchanged, so the header search looks exactly as it
   always did, everywhere. It just wins now.

   ---------------------------------------------------------------------------
   WOOCOMMERCE HAS STATE RULES TOO, AND THEY NEED STATE RULES BACK
   ---------------------------------------------------------------------------
   Raising the two base rules above was not enough, as the product template
   showed. WooCommerce carries its own :focus and :hover rules:

       .woocommerce input[type="search"]:focus     0,3,1
           border: 1px solid #65bec2; box-shadow: 0 0 5px #65bec2;
       .woocommerce button[type="submit"]:hover    0,3,1
           background-color: #6799b2; border: 1px solid #6799b2;

   A base rule never beats a state rule, however specific it is, because both
   apply and the state rule is the later match. Our own :focus rule set only
   `outline` and our :hover rule set only `color`, so the teal glow and the
   blue block behind the magnifier landed unopposed.

   **Reset every property the other rule sets, in the same state.** That is
   the rule to carry to any other form control we put on a WooCommerce page.
   -------------------------------------------------------------------------- */

.csa-search {
  display: flex;
  align-items: center;
  gap: var(--csa-space-2);
  width: 186px;
  height: 34px;
  padding: 0 var(--csa-space-3);
  border: 1px solid rgba(255, 255, 255, 0.55);
  border-radius: var(--csa-radius-pill);
  background-color: transparent;
  transition: border-color 0.2s ease;
}

.csa-search:focus-within {
  border-color: var(--csa-pink-light);
}

form.csa-search input.csa-search__input {
  width: 100%;
  min-width: 0;
  height: auto;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--csa-white);
  font-family: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size: 13px;
  line-height: 1;
  appearance: none;
}

form.csa-search input.csa-search__input::placeholder {
  color: rgba(255, 255, 255, 0.7);
  opacity: 1;
}

/* WooCommerce has a focus rule of its own, `.woocommerce input[type="search"]:focus`,
   which draws a #65bec2 border and a 5px #65bec2 glow. Raising the base rule
   did nothing about it, because a state rule is only beaten by a state rule.
   Reset all three properties, not just the outline. */
form.csa-search input.csa-search__input:focus {
  outline: none;
  border: 0;
  box-shadow: none;
}

form.csa-search button.csa-search__button {
  display: flex;
  align-items: center;
  justify-content: center;
  width: auto;
  height: auto;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  color: var(--csa-white);
  letter-spacing: normal;
  text-transform: none;
  cursor: pointer;
  transition: color 0.2s ease;
}

/* Same again for the button. `.woocommerce button[type="submit"]:hover` paints
   a #6799b2 background and border, which put a solid blue block behind the
   magnifier on every WooCommerce page. */
form.csa-search button.csa-search__button:hover {
  border: 0;
  background: none;
  color: var(--csa-pink-light);
}

.csa-search__icon {
  display: block;
  width: 15px;
  height: 15px;
}

/* In the panel the field is full width and the magnifier is pink.

   The two element-name selectors below are 0,3,2. They have to clear the
   0,2,2 base rules above, which were raised to get past WooCommerce. A plain
   `.csa-search--mobile .csa-search__input` is 0,2,0 and would now lose. */
.csa-search--mobile {
  width: 100%;
  height: 44px;
}

form.csa-search.csa-search--mobile input.csa-search__input {
  font-size: 16px;
}

form.csa-search.csa-search--mobile button.csa-search__button {
  color: var(--csa-pink);
}

.csa-search--mobile .csa-search__icon {
  width: 22px;
  height: 22px;
}

/* --------------------------------------------------------------------------
   6b. Search, the page variant

   The 404 page. Figma node 201:2557, measured off the render on 2026-09-17
   because the node is a flattened bitmap and carries no readable text, fill
   or radius. Pixel values at the design's own scale:

       whole control      488 x 46
       field              377 x 46, white, 1px #0d2651 border, radius 6
       gap                10
       button             101 x 46, #ff3364, radius 6, label 22px in
       both text rows     y 17 to 28, so 12px of ink, centred

   12px of ink from the ascender to the baseline is 16px Poppins. The label
   weight is not readable from a bitmap, so 600 is taken from the stroke and
   is the one value here that is a judgement, not a measurement.

   This variant is a different shape from the header, not a recolour. The
   header is one bordered pill holding both children. This is two separate
   boxes with a gap, so the form's own border and padding are cleared.
   -------------------------------------------------------------------------- */

/* 0,2,1, not a plain modifier class. The tablet tier at the end of the header
   block sets `.csa-search { width: 160px }`, which is 0,1,0 but sits later in
   the file, so a plain `.csa-search--page` would shrink the 404 field to
   160px between 768 and 991. */
form.csa-search.csa-search--page {
  align-items: stretch;
  gap: 10px;
  width: 100%;
  max-width: 488px;
  height: 46px;
  padding: 0;
  border: 0;
  border-radius: 0;
}

form.csa-search.csa-search--page input.csa-search__input {
  padding: 0 16px;
  border: 1px solid var(--csa-navy);
  border-radius: 6px;
  background-color: var(--csa-white);
  color: var(--csa-navy);
  font-size: 16px;
  transition: border-color 0.2s ease;
}

form.csa-search.csa-search--page input.csa-search__input::placeholder {
  color: #94a3b8;
  opacity: 1;
}

/* The full border shorthand, not just border-color. The base focus rule above
   sets `border: 0` to clear WooCommerce, so a colour on its own would land on
   a zero width border and draw nothing. */
form.csa-search.csa-search--page input.csa-search__input:focus {
  border: 1px solid var(--csa-pink);
  box-shadow: none;
}

form.csa-search.csa-search--page button.csa-search__button {
  flex: 0 0 auto;
  min-width: 101px;
  padding: 0 22px;
  border-radius: 6px;
  background-color: var(--csa-pink);
  color: var(--csa-white);
  font-family: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size: 16px;
  font-weight: 600;
  line-height: 1;
  transition: background-color 0.2s ease;
}

/* The header button turns its icon pink on hover. This one carries a word on
   a pink ground, so it darkens the ground instead. */
form.csa-search.csa-search--page button.csa-search__button:hover {
  border: 0;
  background-color: var(--csa-pink-light);
  color: var(--csa-white);
}

/* --------------------------------------------------------------------------
   7. Header, burger
   -------------------------------------------------------------------------- */

/* The toggle Code Block wrapper. Give the Code Block the class
   csa-burger-slot in the builder. Without it the empty wrapper still holds a
   flex slot on desktop, and the 24px gap before it pulls the Enrol Now button
   24px off the right edge of the container. */
.csa-burger-slot {
  display: none;
  align-items: center;
}

.csa-burger {
  display: none;
  flex-direction: row;
  align-items: center;
  align-self: center;
  padding: var(--csa-space-2);
  margin-right: calc(var(--csa-space-2) * -1);
  border: 0;
  background: none;
  color: var(--csa-pink-light);
  cursor: pointer;
  transition: color 0.2s ease;
}

.csa-burger:hover {
  color: var(--csa-pink);
}

.csa-burger__icon {
  display: block;
  width: 26px;
  height: auto;
}

/* --------------------------------------------------------------------------
   8. Header, mobile menu panel

   Rewritten 2026-10-01, session 37. Plain values only, no tokens: a
   token cannot be read or changed in the builder.

   THE OPEN ITEM IS PINK, AS DESIGNED. The row turns #ff3364 and its sub-menu
   #ff5a89, both edge to edge in the panel. The negative 24px margins are the
   panel's own 24px padding, `.csa-mobile-menu__inner`. Change one and change
   the other.

   WHITE ON PINK IS UNDER WCAG AA FOR TEXT, AND THAT IS ACCEPTED. Measured
   2026-10-01: white on #ff3364 is 3.55:1, white on #ff5a89 is 2.97:1. Normal
   text needs 4.5:1. It is accepted as a known shortfall.

   THE CHEVRON IS A WHITE GHOST BUTTON, decided 2026-10-01. 44 x 44,
   a 1.5px white border, an 8px radius. The walker prints it beside the link,
   so the label goes to its page and the button opens the list.

   THE FOCUS RULE RESTATES THE RADIUS. `css/02-base.css` puts
   `border-radius: 2px` on every `.csa-header :focus-visible`, at 0,2,0, which
   would square the button off the moment it takes focus. The rule here is
   0,3,0 and wins.

   THE HOVER STATES ON PINK ARE INVENTED. The design gives none. White stays
   white and gains an underline, because pink-on-pink cannot be read. Due for
   design review.

   Section 9 of OXYGEN-CONVENTIONS.md: "the output of a code block", and
   "anything driven by a parent state".
   -------------------------------------------------------------------------- */

.csa-mobile-menu {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
  width: min(340px, 88vw);
  background-color: #0d2651;
  box-shadow: -8px 0 24px rgba(1, 26, 61, 0.35);
  transform: translateX(100%);
  transition: transform 0.25s ease;
  overflow-y: auto;
  overscroll-behavior: contain;
}

body.csa-menu-is-open .csa-mobile-menu {
  transform: translateX(0);
}

.csa-mobile-menu__inner {
  display: flex;
  flex-direction: column;
  min-height: 100%;
  padding: 24px;
}

/* The design has no logo in the panel, only the close button, so the search
   sits directly under it */
.csa-mobile-menu__header {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  padding-bottom: 24px;
}

.csa-mobile-menu__close {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  padding: 0;
  border: 0;
  background: none;
  color: #ff94cc;
  cursor: pointer;
  transition: color 0.2s ease;
}

.csa-mobile-menu__close:hover {
  color: #ff3364;
}

.csa-mobile-menu__close svg {
  display: block;
  width: 18px;
  height: 18px;
}

.csa-mobile-nav {
  margin-top: 32px;
}

.csa-mobile-nav__list,
.csa-mobile-nav__list .sub-menu {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Each top level item is a two column grid: the label, then the button, with
   the sub-menu across both columns underneath. The item runs edge to edge so
   its pink can, and the 24px of padding puts the content back on the panel's
   line. */
.csa-mobile-nav__list > li {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  column-gap: 12px;
  margin: 0 -24px;
  padding: 0 24px;
  transition: background-color 0.2s ease;
}

/* The rule under each item is short and it alternates purple then pink, the
   same pattern as the desktop dropdown. It is a grid item now, so it spans
   both columns. */
.csa-mobile-nav__list > li::after {
  content: "";
  display: block;
  grid-column: 1 / -1;
  height: 1px;
  background-color: #dac1fa;
}

.csa-mobile-nav__list > li:nth-child(even)::after {
  background-color: #f6c2e0;
}

.csa-mobile-nav__list > li > a {
  display: flex;
  align-items: center;
  min-width: 0;
  padding: 16px 0;
  color: #ffffff;
  font-size: 15px;
  font-weight: 600;
  text-decoration: none;
  transition: color 0.2s ease;
}

.csa-mobile-nav__list > li > a:hover,
.csa-mobile-nav__list > li.current-menu-item > a,
.csa-mobile-nav__list > li.current-menu-ancestor > a {
  color: #ff3364;
}

/* A parent with no URL. Its label opens the sub-menu, so it should look
   clickable. */
.csa-mobile-nav__list > li > a:not([href]) {
  cursor: pointer;
}

/* ---- The chevron button, option B -------------------------------------- */

.csa-mobile-nav__list .csa-subnav-toggle {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  margin: 0;
  padding: 0;
  border: 1.5px solid #ffffff;
  border-radius: 8px;
  background-color: transparent;
  color: #ffffff;
  font: inherit;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
  -webkit-tap-highlight-color: transparent;
  transition: background-color 0.2s ease;
}

.csa-mobile-nav__list .csa-subnav-toggle:hover {
  background-color: rgba(255, 255, 255, 0.12);
}

.csa-mobile-nav__list .csa-subnav-toggle:focus-visible {
  outline: 2px solid #ffffff;
  outline-offset: 2px;
  border-radius: 8px;
  background-color: rgba(255, 255, 255, 0.12);
}

.csa-mobile-nav__list .csa-subnav-toggle svg {
  display: block;
  width: 14px;
  height: 14px;
  transition: transform 0.2s ease;
}

/* ---- The open item ---------------------------------------------------- */

.csa-mobile-nav__list > li.is-open {
  background-color: #ff3364;
}

/* White on the pink, including the page you are on, whose label is otherwise
   pink and would vanish. Same specificity as the current-page rule above and
   later in the file, so it wins. */
.csa-mobile-nav__list > li.is-open > a,
.csa-mobile-nav__list > li.is-open > a:hover {
  color: #ffffff;
}

.csa-mobile-nav__list > li.is-open > a:hover {
  text-decoration: underline;
}

.csa-mobile-nav__list > li.is-open > .csa-subnav-toggle svg {
  transform: rotate(180deg);
}

/* ---- Opening and closing, animated ------------------------------------

   The same method as the FAQ accordion, section 19. An item with a sub-menu
   is a three-row grid: the label and button, the sub-menu, the divider. The
   middle row animates from 0fr to 1fr, so nothing is measured and the height
   is right at any width.

   The sub-menu is stretched to its row and clips what does not fit, which is
   what makes 0fr close it. `align-self: stretch` is not optional: the item
   centres its children, and a centred sub-menu would keep its own height and
   spill out of a closed row.

   It carries no top or bottom padding, because padding still shows at 0fr
   and would leave a pink strip under a closed item. The first and last links
   carry that space instead.

   `align-content: start` is not optional either. Mid-animation the middle row
   is a fraction such as 0.5fr, which leaves spare height, and by default the
   grid hands it to the auto rows: the label row swelled about 25px and shrank
   back as the animation finished. Measured 2026-10-06.

   `visibility: hidden` takes a closed sub-menu's links out of the tab order.
   It switches after the close has finished, and at once on open. */
.csa-mobile-nav__list > li.menu-item-has-children {
  grid-template-rows: auto 0fr auto;
  align-content: start;
  transition: background-color 0.3s ease, grid-template-rows 0.3s ease;
}

.csa-mobile-nav__list > li.menu-item-has-children.is-open {
  grid-template-rows: auto 1fr auto;
}

.csa-mobile-nav__list > li.menu-item-has-children::after {
  grid-row: 3;
}

/* The sub-menu runs edge to edge under the row, in the lighter pink. */
.csa-mobile-nav__list .sub-menu {
  grid-column: 1 / -1;
  grid-row: 2;
  align-self: stretch;
  min-height: 0;
  overflow: hidden;
  visibility: hidden;
  margin: 0 -24px;
  padding: 0 24px;
  background-color: #ff5a89;
  transition: visibility 0s linear 0.3s;
}

.csa-mobile-nav__list > li.is-open .sub-menu {
  visibility: visible;
  transition-delay: 0s;
}

/* The 4px and 12px the sub-menu used to carry, added to the links' own 10px. */
.csa-mobile-nav__list .sub-menu > li:first-child > a {
  padding-top: 14px;
}

.csa-mobile-nav__list .sub-menu > li:last-child > a {
  padding-bottom: 22px;
}

.csa-mobile-nav__list .sub-menu > li + li {
  border-top: 1px solid rgba(255, 255, 255, 0.5);
}

.csa-mobile-nav__list .sub-menu a {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 10px;
  padding: 10px 0;
  color: #ffffff;
  font-size: 15px;
  text-decoration: none;
}

.csa-mobile-nav__list .sub-menu a:hover,
.csa-mobile-nav__list .sub-menu a:focus-visible {
  color: #ffffff;
  text-decoration: underline;
}

/* A white ring on the pink. The base pink ring from 02-base.css would not
   show. */
.csa-mobile-nav__list .sub-menu a:focus-visible,
.csa-mobile-nav__list > li.is-open > a:focus-visible {
  outline: 2px solid #ffffff;
  outline-offset: 2px;
}

/* The sub-menu icon, from the walker and snippet S16. White through
   currentColor. */
.csa-mobile-nav__list .csa-menu-icon {
  display: flex;
  flex: 0 0 auto;
}

.csa-mobile-nav__list .csa-menu-icon svg {
  display: block;
  width: 20px;
  height: 20px;
}

/* The Enrol now button is pushed to the foot of the panel. */
.csa-mobile-menu__cta {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  margin-top: auto;
  padding: 14px 24px;
  border-radius: 50px;
  color: #ffffff;
  background-color: #ff3364;
  font-size: 16px;
  font-weight: 600;
  line-height: 1;
  text-decoration: none;
  transition: background-color 0.2s ease;
}

.csa-mobile-menu__cta:hover,
.csa-mobile-menu__cta:focus-visible {
  color: #ffffff;
  background-color: #e51f4f;
}

.csa-mobile-menu__cta svg {
  display: block;
  width: 18px;
  height: 18px;
}

.csa-mobile-menu__scrim {
  position: fixed;
  inset: 0;
  z-index: 1;
  background-color: rgba(1, 26, 61, 0.6);
}

@media (prefers-reduced-motion: reduce) {
  .csa-mobile-nav__list > li,
  .csa-mobile-nav__list > li.menu-item-has-children,
  .csa-mobile-nav__list .sub-menu,
  .csa-mobile-nav__list .csa-subnav-toggle,
  .csa-mobile-nav__list .csa-subnav-toggle svg {
    transition: none;
  }
}

/* --------------------------------------------------------------------------
   9. Header, tablet and mobile

   Rewritten 2026-10-02, session 37. Plain values only, no tokens.

   FOUR TIERS. No label is ever dropped to an icon, at any width.

   1260 and up    the full design, one row, the values in sections 4 to 6
   992 to 1259    one row, every size scales down smoothly with the width
   768 to 991     one row: logo, the three buttons, search, burger. The menu
                  moves into the burger panel, which holds the menu and Enrol
                  now. Its search is hidden, because search is in the bar.
   767 and down   the mobile layout: the three tabs across the top of the
                  page, the logo and the burger in the bar, and the panel with
                  search, the menu and Enrol now. Unchanged.

   THE TABS ARE MOBILE ONLY NOW. They no longer hang under the bar at any
   width. From 768 up the three buttons are in the bar instead.

   WHY THE TIER EDGES ARE .98 AND NOT 991 AND 767. At 125% display scaling a
   window can be 991.2px wide, which matches neither `max-width: 991px` nor
   `min-width: 992px`, and the header would lose its tier. OXYGEN-CONVENTIONS.md
   section 10.

   THE FLUID TIER, 992 TO 1259. Every value is
       clamp(smallest, calc(smallest + range * (100vw - 992px) / 268), full)
   so it is the smallest size at a 992 window, the full size at 1260, and a
   straight line between. `range` is full minus smallest. To change a size,
   change the two end values and the range together. To drop the fluid tier
   and use fixed sizes instead, replace this one block. Nothing else depends
   on it.

   THE BUDGET. Measured with Poppins on 2026-10-02. At 992 the row needs about
   929px of content. A 992 window with a classic 15px scrollbar gives 937px
   after the 20px gutters, so there are about 8px spare. At 1260 and up the
   row needs about 1184px against 1260. The full size is reached at 1260, not
   1240, because `100vw` counts the scrollbar: at 1240 the row would fit by
   one pixel. Any new menu item, or a longer label, spends this margin. Check
   the row at 992 after a menu change.

   THE SEARCH FIELD IS NEVER NARROWER THAN 150px. Below that the placeholder,
   "Search courses", is cut off at 12px.

   Section 9 of OXYGEN-CONVENTIONS.md: a value the builder cannot express,
   `clamp()` with `vw`, and "the output of a code block" for the menu and the
   search. The header layout has always been CSS, decision D36.
   -------------------------------------------------------------------------- */

/* ---- The tabs: mobile only --------------------------------------------- */

@media (min-width: 768px) {
  .csa-header__utility {
    display: none;
  }
}

/* ---- The burger and the panel: 991 and down --------------------------- */

@media (min-width: 992px) {
  .csa-burger,
  .csa-burger-slot,
  .csa-mobile-menu,
  .csa-mobile-menu__scrim {
    display: none;
  }
}

/* ---- 992 to 1259, one row, fluid -------------------------------------- */

@media (min-width: 992px) and (max-width: 1259.98px) {
  .csa-header__inner {
    gap: clamp(10px, calc(10px + 14 * (100vw - 992px) / 268), 24px);
  }

  .csa-header__logo svg {
    width: clamp(130px, calc(130px + 34 * (100vw - 992px) / 268), 164px);
  }

  .csa-nav__list {
    gap: clamp(12px, calc(12px + 18 * (100vw - 992px) / 268), 30px);
  }

  /* The dropdown labels follow the top level, so the two are always one size. */
  .csa-nav__list > li > a,
  .csa-nav__list .sub-menu a {
    font-size: clamp(13px, calc(13px + 2 * (100vw - 992px) / 268), 15px);
  }

  .csa-header__actions {
    gap: clamp(6px, calc(6px + 4 * (100vw - 992px) / 268), 10px);
  }

  .csa-header__cta {
    gap: clamp(6px, calc(6px + 2 * (100vw - 992px) / 268), 8px);
    padding: 0 clamp(10px, calc(10px + 6 * (100vw - 992px) / 268), 16px);
    font-size: clamp(12px, calc(12px + 1 * (100vw - 992px) / 268), 13px);
  }

  .csa-header__cta svg {
    width: clamp(12px, calc(12px + 2 * (100vw - 992px) / 268), 14px);
    height: clamp(12px, calc(12px + 2 * (100vw - 992px) / 268), 14px);
  }

  .csa-header__search .csa-search {
    width: clamp(150px, calc(150px + 36 * (100vw - 992px) / 268), 186px);
    padding: 0 clamp(12px, calc(12px + 4 * (100vw - 992px) / 268), 16px);
  }

  .csa-header__search form.csa-search input.csa-search__input {
    font-size: clamp(12px, calc(12px + 1 * (100vw - 992px) / 268), 13px);
  }
}

/* ---- 768 to 991, the burger tier --------------------------------------- */

/* The smallest sizes of the fluid tier, held. The menu is hidden from the bar
   and lives in the burger panel. */
@media (min-width: 768px) and (max-width: 991.98px) {
  .csa-header__inner {
    gap: 12px;
  }

  .csa-header__logo svg {
    width: 130px;
  }

  .csa-header__nav {
    display: none;
  }

  .csa-burger-slot,
  .csa-burger {
    display: flex;
  }

  .csa-header__actions {
    gap: 6px;
  }

  .csa-header__cta {
    gap: 6px;
    padding: 0 10px;
    font-size: 12px;
  }

  .csa-header__cta svg {
    width: 12px;
    height: 12px;
  }

  .csa-header__search .csa-search {
    width: 150px;
    padding: 0 12px;
  }

  .csa-header__search form.csa-search input.csa-search__input {
    font-size: 12px;
  }

  /* Search is in the bar at this tier, so the panel does not repeat it. */
  .csa-mobile-menu form.csa-search--mobile {
    display: none;
  }
}

/* ---- 767 and down, the mobile tier ------------------------------------- */

@media (max-width: 767.98px) {

  /* The tab strip sits at the top of the page, in the flow, and centres. */
  .csa-header__utility {
    position: static;
  }

  .csa-header__utility-inner {
    justify-content: center;
  }

  .csa-utility__tab {
    flex: 1 1 0;
    justify-content: center;
    min-width: 0;
    max-width: 140px;
    padding: 0 8px;
    border-radius: 0 0 12px 12px;
    font-size: 12px;
  }

  .csa-utility__tab--enrol {
    display: inline-flex;
  }

  .csa-header__inner {
    height: 72px;
  }

  .csa-header__logo svg {
    width: 140px;
  }

  .csa-header__nav,
  .csa-header__search,
  .csa-header__actions {
    display: none;
  }

  .csa-burger-slot,
  .csa-burger {
    display: flex;
  }
}

/* ---- 480 and down, the small phone tier -------------------------------- */

@media (max-width: 480px) {

  /* The icons stay. Three tabs with an icon each fit inside 360px once the
     row gutter, the tab padding, the icon gap and the type all come down.
     Budget at 360px: 336px of row, 6px gaps, so 108px a tab, and the widest
     tab, Student login, measures about 104px. Checked on the build site. */
  .csa-header__utility-inner {
    gap: 6px;
    padding-inline: 12px;
  }

  .csa-utility__tab {
    gap: 4px;
    max-width: none;
    padding: 0 8px;
    font-size: 11px;
    white-space: nowrap;
  }

  .csa-utility__tab svg {
    width: 12px;
    height: 12px;
  }
}

/* ---- 360 and down, the smallest phones ---------------------------------- */

@media (max-width: 360px) {

  /* At 320px the widest tab, Student login, needs 106px and only gets 95px,
     so the label clips. One more notch down takes it to 88px, which fits.
     Measured on the build site. */
  .csa-utility__tab {
    gap: 3px;
    padding: 0 6px;
    font-size: 10px;
  }

  .csa-utility__tab svg {
    width: 11px;
    height: 11px;
  }
}
/* --------------------------------------------------------------------------
   10. Footer, main
   -------------------------------------------------------------------------- */

.csa-footer {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  background-color: var(--csa-navy);
}

.csa-footer__main {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  padding-block: 40px 36px;
}

.csa-footer__grid {
  display: grid;
  grid-template-columns: 1.2fr 0.9fr 1fr auto;
  column-gap: 56px;
  row-gap: var(--csa-space-6);
  align-items: start;
}

/* The four grid columns. Oxygen makes every Div a flex column that shrinks to
   its content, so each one is told to fill its grid cell. */
.csa-footer__brand,
.csa-footer__col--quick,
.csa-footer__col--contact,
.csa-footer__social {
  display: flex;
  flex-direction: column;
  align-items: stretch;
}

.csa-footer__logo {
  display: inline-flex;
  flex-direction: row;
  align-self: flex-start;
  text-decoration: none;
}

.csa-footer__logo svg {
  width: 167px;
  height: auto;
}

.csa-footer__tagline {
  max-width: 270px;
  margin: var(--csa-space-4) 0 0;
  color: var(--csa-ink-invert);
  font-size: 12px;
  line-height: 21px;
}

/* The parent class is here on purpose, and it is the whole point of the rule.
   Oxygen Elements for WooCommerce 2.0.2 ships a headings rule that carries
   `.woocommerce-account h2` in its selector list, at 0,1,1. That is a body
   class plus a bare element, so on /my-account/ it reaches EVERY h2 on the
   page, including these two in the footer, and paints them #000000 at
   weight 700. `.csa-footer__heading` on its own is 0,1,0 and loses.
   `.csa-footer .csa-footer__heading` is 0,2,0 and wins, on every page.
   Measured on the build site 2026-09-17, universal.css line 619.
   Session 30. */
.csa-footer .csa-footer__heading {
  margin: 0 0 20px;
  color: var(--csa-pink);
  font-size: 16px;
  font-weight: 600;
  line-height: 1.2;
}

.csa-footer__list,
.csa-footer__legal-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.csa-footer__list li,
.csa-footer__legal-list li {
  line-height: 18px;
}

.csa-footer__list li + li {
  margin-top: 12px;
}

.csa-footer__list a,
.csa-footer__legal-list a,
.csa-footer__contact-item {
  color: var(--csa-white);
  font-size: 14px;
  line-height: 18px;
  text-decoration: none;
  transition: color 0.2s ease;
}

.csa-footer__list a:hover,
.csa-footer__list a:focus-visible,
.csa-footer__legal-list a:hover,
.csa-footer__legal-list a:focus-visible,
.csa-footer__contact-item:hover,
.csa-footer__contact-item:focus-visible {
  color: var(--csa-pink-light);
}

/* The vertical rule in the design sits between the two link columns. */
.csa-footer__col--contact {
  padding-left: var(--csa-space-6);
  border-left: 1px solid #e1e4e9;
}

.csa-footer__contact {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.csa-footer__contact-item {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: flex-start;
  gap: 10px;
}

.csa-footer__contact-item svg {
  width: 16px;
  height: 16px;
}

.csa-footer__social {
  align-self: center;
}

.csa-footer__social-list {
  display: flex;
  flex-direction: row;
  gap: var(--csa-space-2);
}

/* The circle is drawn here, so an Oxygen Icon element can sit inside the
   link and inherit the white. */
.csa-footer__social-link {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  color: var(--csa-white);
  background-color: var(--csa-pink);
  text-decoration: none;
  transition: opacity 0.2s ease, transform 0.2s ease, background-color 0.2s ease;
}

.csa-footer__social-link svg {
  width: 15px;
  height: 15px;
  fill: currentColor;
}

.csa-footer__social-link:hover,
.csa-footer__social-link:focus-visible {
  color: var(--csa-white);
  opacity: 0.85;
  transform: translateY(-2px);
}

/* --------------------------------------------------------------------------
   11. Footer, bottom bar
   -------------------------------------------------------------------------- */

.csa-footer__bar {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  background-color: var(--csa-navy-deep);
  border-top: 1px solid rgba(255, 255, 255, 0.2);
}

.csa-footer__bar-inner {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: var(--csa-space-4);
  min-height: 67px;
}

.csa-footer__copyright {
  margin: 0;
  color: var(--csa-ink-invert);
  font-size: 12px;
  line-height: 18px;
}

.csa-footer__legal {
  display: flex;
  flex-direction: row;
  align-items: center;
}

.csa-footer__legal-list {
  display: flex;
  flex-direction: row;
  gap: var(--csa-space-5);
}

/* --------------------------------------------------------------------------
   12. Footer, tablet and mobile

   Three tiers, matching the header. Decision D28.

   992px and up   four columns
   481 to 991     order contact, quick, social, brand
   480 and down   one column, same order

   The order is the same at every size below 992. Decision D74.

   ---------------------------------------------------------------------------
   WHO OWNS THE FOOTER BELOW 992
   ---------------------------------------------------------------------------
   The builder does, except for `order`. The builder sets `display: flex` and
   `flex-direction: column` on the grid at Oxygen's 767 breakpoint, on the
   element ID, so from 767 down the footer is a single flex column and the
   `grid-template-columns` below is inert. From 768 to 991 it is still a two
   column grid.

   **Set it on the element ID in the builder, not on the class.** An ID is
   0,1,0,0 and always beats this stylesheet. A class is 0,0,1,0, the same as
   the rules here, and this file is written later in `universal.css` than the
   builder's own class rules, so a class set in the builder silently loses.
   That is why the grid works and why the colophon did not. Decision D75, and
   `OXYGEN-CONVENTIONS.md` section 11.
   -------------------------------------------------------------------------- */

/* ---- 481 to 991, the tablet tier --------------------------------------- */

@media (min-width: 481px) and (max-width: 991px) {

  .csa-footer__main {
    padding-block: var(--csa-space-6);
  }

  .csa-footer__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: var(--csa-space-6);
    row-gap: var(--csa-space-6);
  }

  /* The same reading order as the phone tier: contact, quick, social,
     brand, set 2026-09-11. Oxygen Classic has no order field, so this is
     CSS. Nothing
     else about these four columns is set here, so the builder owns their
     width and their alignment. */
  .csa-footer__col--contact {
    order: 1;
    padding-left: 0;
    border-left: 0;
  }

  .csa-footer__col--quick {
    order: 2;
  }

  .csa-footer__social {
    order: 3;
  }

  .csa-footer__brand {
    order: 4;
  }

  .csa-footer__tagline {
    max-width: none;
  }

  /* The bottom bar is a row from 768 to 991 and the builder drops it to a
     column below that. At 768px the copyright and the legal links measure
     about 672px against 720px of container, so the tighter gap is what makes
     the row fit. */
  .csa-footer__legal-list {
    gap: var(--csa-space-4);
  }
}

/* ---- 480 and down, one column ------------------------------------------ */

@media (max-width: 480.98px) {

  .csa-footer__main {
    padding-block: var(--csa-space-6);
  }

  .csa-footer__grid {
    grid-template-columns: 1fr;
    row-gap: var(--csa-space-6);
  }

  .csa-footer__col--contact {
    order: 1;
    padding-left: 0;
    border-left: 0;
  }

  .csa-footer__col--quick {
    order: 2;
  }

  .csa-footer__social {
    order: 3;
    align-self: stretch;
  }

  .csa-footer__social-list {
    justify-content: center;
  }

  .csa-footer__brand {
    order: 4;
    text-align: center;
  }

  .csa-footer__logo {
    align-self: center;
  }

  .csa-footer__tagline {
    max-width: 340px;
    margin-inline: auto;
  }

  .csa-footer__bar-inner {
    flex-direction: column;
    justify-content: center;
    gap: var(--csa-space-3);
    padding-block: var(--csa-space-4);
    text-align: center;
  }

  .csa-footer__legal {
    order: 1;
  }

  .csa-footer__legal-list {
    flex-wrap: wrap;
    justify-content: center;
  }

  .csa-footer__copyright {
    order: 2;
  }
}

/* --------------------------------------------------------------------------
   13. Brag strip

   The pink band under the page banner. Four claims. Three vertical rules on
   desktop, a two by two grid with one centre rule below that, then one
   centred column on a phone.

   Measured from Figma nodes 25:26569 (desktop) and 25:26592 (mobile) on
   2026-09-09. The rule colour was sampled off the render at 226,226,222, so
   it is --csa-border-card. Text is Poppins SemiBold 14 / 20, white.

   ---------------------------------------------------------------------------
   WHY THE LAYOUT IS IN CSS AND NOT IN THE BUILDER
   ---------------------------------------------------------------------------
   Rule 13 and decision D4 say the builder sets what the builder can set. This
   component is the exception, and it is a hard technical one. Read off the
   build site on 2026-09-09.

   Set `display: flex` on an Oxygen class and Oxygen does not write
   `.my-class { display: flex }`. It writes this:

       .my-class:not(.ct-section):not(.oxy-easy-posts),
       .my-class.oxy-easy-posts .oxy-posts,
       .my-class.ct-section .ct-section-inner-wrap { display: flex; ... }

   That selector is specificity 0,3,0. A hand written rule on the plain class
   is 0,1,0, so it loses no matter where it sits in the file. The two by two
   grid could not override the builder's flex and never fired.

   So: any component whose layout changes at a breakpoint Oxygen does not
   have is styled in CSS, on plain classes, with nothing set in the builder.
   That is already how the header and the footer rows are built. Decision D36.

   The section itself is still all builder: the pink, the 22px top and bottom
   padding, the page width, and the white text colour that the icons inherit
   through `currentColor`.

   ---------------------------------------------------------------------------
   WHY THE FIRST BREAKPOINT IS 1120 AND NOT 991
   ---------------------------------------------------------------------------
   Measured on the build site. The four items and three rules need 945px at
   the design's sizes. The row's content box is the viewport less 48px of
   gutter, capped at 1160.

       1440   1152 content, 207 free, 34 to 35px in each of the six gaps
       1200   1152 content, 207 free, 34px
       1120   1072 content, 127 free, 21px
       1024    976 content,  31 free,  5px, the rules touch the text
        992    944 content,   1 free, it overflows

   So the four across layout dies at about 1113px, well above Oxygen's 991.

   The row is in the shared container group at the top of this file, so it
   lines up with the header and the footer. It needs it: this section is the
   one place where the Oxygen inner wrap's 20px of left and right padding is
   set to 0, so without the group the row would run edge to edge.
   -------------------------------------------------------------------------- */

.csa-brag__row {
  position: relative;
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
}

.csa-brag__item {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: var(--csa-space-2);
}

/* Both selectors on purpose. The Code Block element carries
   `csa-icon-slot csa-brag__icon`, and the SVG inside carries `csa-icon` from
   02-base.css, which is only a 1em safe default. Sizing both means the icon
   is right even if a stray `csa-icon` is left on the element. */
.csa-brag__icon,
.csa-brag__icon svg {
  width: 30px;
  height: 30px;
}

.csa-brag__text {
  font-size: 14px;
  font-weight: 600;
  line-height: 20px;
}

.csa-brag__rule {
  flex: 0 0 auto;
  width: 1px;
  height: 40px;
  background-color: var(--csa-border-card);
}

/* The single centre rule of the two by two grid. Off on desktop, where the
   three .csa-brag__rule elements do the work instead. It insets 16px top and
   bottom, which is what the mobile design measures: a 63px rule inside 96px
   of content. */
.csa-brag__row::before {
  content: "";
  display: none;
  position: absolute;
  top: 16px;
  bottom: 16px;
  left: 50%;
  width: 1px;
  transform: translateX(-50%);
  background-color: var(--csa-border-card);
}

/* ---------------------------------------------------------------------------
   The three tiers below are measured, not guessed. Poppins SemiBold text
   widths, taken in the browser on 2026-09-09:

                                          12px   13px   14px
       "Registered &"                       78     84     91
       "accredited college"                114    123    133
       "Trusted by 80 000+"                117    127    137
       "Distance learning"                 108    117    126
       "Support from academic"             146    158    170
       "academic specialists"              130    141    152
       "Support from academic specialists" 214    232    249

   "Support from academic" is the widest first line, so it sets the minimum
   text width a two by two column needs: 170px at 14px, 158px at 13px.

   Text width a two by two column actually gives is
       (min(viewport - 48, 720) - column gap) / 2 - icon - item gap
   --------------------------------------------------------------------------- */

/* ---- 1119 to 601, two by two at full size ------------------------------- */

/* Tightest point is 601px: 210px of text against the 170px it needs. */
@media (max-width: 1119px) {
  .csa-brag__row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--csa-space-6);
    row-gap: var(--csa-space-3);
    max-width: calc(720px + (var(--csa-gutter) * 2));
  }

  .csa-brag__row::before {
    display: block;
  }

  .csa-brag__rule {
    display: none;
  }

  .csa-brag__item {
    gap: 12px;
  }
}

/* ---- 600 to 481, two by two tightened ----------------------------------- */

/* At 14px the two by two runs out of room at about 520px, so this tier drops
   to 13px and halves the column gap. Tightest point is 481px: 168px of text
   against the 158px it needs. */
@media (max-width: 600px) {
  .csa-brag__icon,
  .csa-brag__icon svg {
    width: 26px;
    height: 26px;
  }

  .csa-brag__row {
    column-gap: var(--csa-space-4);
    row-gap: 14px;
  }

  .csa-brag__row::before {
    top: 12px;
    bottom: 12px;
  }

  .csa-brag__item {
    gap: 10px;
    justify-content: center;
  }

  .csa-brag__text {
    font-size: 13px;
    line-height: 18px;
  }
}

/* ---- 480 and down, one centred column ----------------------------------- */

/* Two columns stop working here. At 430px a column gives 143px of text and
   the widest first line needs 158px, so every second claim breaks to three
   lines and "80 000+" splits across a line break. One column gives 291px at
   375px and 236px at 320px, so all four claims sit on one line each.

   This is Oxygen's own 480 breakpoint and it matches the header and footer
   tier from decision D28.

   CENTRING
   The four claims are centred as one block, not one at a time, so the icons
   stay in a straight vertical line. `max-content` sizes the single track to
   the widest claim, and `justify-content: center` puts that track in the
   middle of the row.

   `minmax(0, ...)` is the guard. A bare `max-content` track can come out
   wider than the row and would push the strip off the page. Below about
   300px the widest claim, "Support from academic specialists" at 268px with
   its icon, stops fitting. The minmax lets the track shrink so the text
   wraps instead of overflowing.

   NOTE FOR THE BUILDER
   Justify content and Align items set on this row in Oxygen do nothing you
   can see at this width. On a one track grid they move the track, and the
   track is already centred by this rule. To take this tier back into the
   builder, set Display flex, Direction column, Align items center and Gap 12
   at the phone portrait breakpoint. Oxygen writes that at specificity 0,3,0,
   so it overrides everything in this block. */
@media (max-width: 480px) {
  .csa-brag__row {
    grid-template-columns: minmax(0, max-content);
    justify-content: center;
    row-gap: 12px;
  }

  .csa-brag__row::before {
    display: none;
  }
}

/* ---------------------------------------------------------------------------
   14. DIRECTORY CARD, THE META LIST ICONS
   The three icons in each card list: study mode, duration, price. The section
   runs on the home page and on the Courses page, so the rule belongs here in
   03 and not in a page stylesheet.

   The icons are inline Code Blocks, not uploads, because the colour is set in
   the builder. See code-blocks/icons/duration.html, starting-at.html and
   study-via-distance-learning.html.
   --------------------------------------------------------------------------- */

/* Both selectors on purpose. The Code Block element carries
   `csa-icon-slot csa-directory-card-li-icon`, and the SVG inside carries
   `csa-icon` from 02-base.css, which is only a 1em safe default. Sizing both
   means the icon is right even if a stray `csa-icon` is left on the element.

   `flex: 0 0 auto` keeps the icon at its set size when the row text is long.
   Without it a flex row is free to squash the icon before it wraps the text. */
.csa-directory-card-li-icon,
.csa-directory-card-li-icon svg {
  width: 25px;
  height: 25px;
  flex: 0 0 auto;
}

/* ---- 767 and down, the mobile tier -------------------------------------- */

/* 767px is the mobile tier used elsewhere in this file, and it matches the
   Oxygen `phone-landscape` breakpoint of 768px. */
@media (max-width: 767px) {
  .csa-directory-card-li-icon,
  .csa-directory-card-li-icon svg {
    width: 20px;
    height: 20px;
  }
}

/* ---------------------------------------------------------------------------
   15. DIRECTORY CARD, ROW WIDTHS
   The five school cards. Desktop is three, then two. Tablet is two, two, then
   one full width. Mobile is one card per row.

   The section runs on the home page and on the Courses page, and it is going
   into an Oxygen reusable part, so nothing here is scoped to a page.

   WHY THIS IS NOT IN THE BUILDER
   The container wraps on its own, so the browser picks the break point from
   the card width, not from a breakpoint. Measured on the build site on
   2026-09-09, with the builder's `width: 300px`:

       3/2          down to a 1004px viewport
       2/2/1        1004 down to 672
       1 per card   668 and down

   None of those three is 991, 768 or 480. The middle band also leaves one
   stretched card, which is in no design. One width field cannot make three
   cards fill one row and two cards fill the next.

   THE EXTRA PIXEL
   The widths subtract 65 and 33, not 64 and 32. A row that measures exactly
   100% can round up and wrap, which would undo the whole rule. One pixel of
   slack removes that risk.

   That pixel does NOT leave a gap. The builder's `flex-grow: 1` stays on the
   card and absorbs it. Measured on the build site: the right hand gap is
   0.00px on every row at every tier. Do not set `flex-grow: 0` here. With
   grow at 0 the same rows measure a 1.00px gap on the right.

   Line breaking uses the width, not the grown size, so grow cannot pull an
   extra card onto a row.

   SPECIFICITY
   `.csa-directory-container > .csa-directory-card` is 0,2,0 against the
   Oxygen class style at 0,1,0, so these win on specificity and not on source
   order. No `:not(.ct-section)` shape is needed, because nothing here is a
   flex container property. Decision D36 does not apply.

   MEASURED, sweeping every 4px through each tier:

       1160 down to 952   3/2       at all 53 widths
        951 down to 728   2/2/1     at all 56 widths
        727 down to 280   1 per row at all 112 widths

   Card widths at 1160: 365, 365, 365, 564, 564. That is what the emergent
   layout produced, so desktop is unchanged.

   The button alignment on cards 4 and 5 is a builder field, set at the
   Tablet breakpoint in Oxygen. It is not here. Rule 13.
   --------------------------------------------------------------------------- */

/* ---- 992 and up, three then two ----------------------------------------- */
@media (min-width: 992px) {
  .csa-directory-container > .csa-directory-card {
    width: calc((100% - 65px) / 3);
  }
  .csa-directory-container > .csa-directory-card:nth-child(n + 4) {
    width: calc((100% - 33px) / 2);
  }
}

/* ---- 768 to 991, two, two, then the fifth full width ---------------------
   There is no tablet frame in the designs. Decided in session 15. */
@media (min-width: 768px) and (max-width: 991.98px) {
  .csa-directory-container > .csa-directory-card {
    width: calc((100% - 33px) / 2);
  }
  .csa-directory-container > .csa-directory-card:nth-child(5) {
    width: 100%;
  }
}

/* ---- 767 and down, every card the same, as in the mobile design --------- */
@media (max-width: 767.98px) {
  .csa-directory-container > .csa-directory-card {
    width: 100%;
  }
}

/* ---------------------------------------------------------------------------
   16. WHY COLLEGE SA CARDS, THE ODD TRAILING CARD
   The card grid is two up from 480px to 991px. This rule handles the case
   where the card count is odd, so the last card has no partner on its row.

   Without it, `flex-grow: 1` lets that card consume the whole row and
   `justify-content: center` on the container has nothing left to centre.
   With it, the card keeps the column width and the container centres it.

   `:last-child:nth-child(odd)` matches the last card ONLY when the total
   count is odd. Three cards match card 3, five match card 5, four and two
   match nothing. So the section carries any card count with no edit. It is
   going into an Oxygen reusable part, and other pages use three cards.

   The subtraction is half the gap at that tier: 10px against the 20px
   tablet gap, 8px against the 16px phone gap. That makes the capped card
   exactly equal to the grown cards above it.

   No auto margins. The container already has `justify-content: center`,
   which centres the line once the card stops growing. Measured: the left
   and right insets are equal at every width.

   WHY THE MEDIA QUERIES MATTER
   Below 480px the grid is one up and every card fills the container. If the
   cap ran there too, the last card would sit at half width while the others
   went full width. The ranges match the Oxygen tiers exactly, which is why
   the builder's `min-width` must not be the thing that breaks the row. See
   the note in the builder settings below.

   BUILDER SETTINGS THIS RULE DEPENDS ON, on the class `csa-why-card`:
       Tablet          width 48%, max-width 100%, min-width 250px, grow 1
       Phone Landscape min-width 200px
       Phone Portrait  width 100%

   `min-width` is a safety net here, not the trigger. At a 440px container,
   which is the 480px viewport, a 48% card computes to 212px. Any min-width
   above 212px breaks the row to one up BEFORE the 480px breakpoint, and the
   cap above would then apply to a one up row. That is why 225px was lowered
   to 200px.

   MEASURED, 3 cards, card 3 against card 1:

       tablet, gap 20    C=951  466 / 466  insets 243 / 243
                         C=845  413 / 413  insets 216 / 216
                         C=728  354 / 354  insets 187 / 187
       phone,  gap 16    C=727  356 / 356  insets 186 / 186
                         C=560  272 / 272  insets 144 / 144
                         C=440  212 / 212  insets 114 / 114
       below 480         C=439  439 / 439  one up, full width, no cap

   4 cards are untouched: 2/2 at 466, 413 and 354, filling the row exactly.
   --------------------------------------------------------------------------- */

/* ---- 768 to 991, the 20px gap tier -------------------------------------- */
@media (min-width: 768px) and (max-width: 991px) {
  .csa-why-container > .csa-why-card:last-child:nth-child(odd) {
    max-width: calc(50% - 10px);
  }
}

/* ---- 480 to 767, the 16px gap tier -------------------------------------- */
@media (min-width: 480px) and (max-width: 767.98px) {
  .csa-why-container > .csa-why-card:last-child:nth-child(odd) {
    max-width: calc(50% - 8px);
  }
}

/* ---------------------------------------------------------------------------
   17. CARD SLIDER
   A row of cards that becomes a horizontal slider at 991px and below.

   The component is generic. It carries no page name and no card name, so the
   same three classes wrap any card set on any page. The how-it-works block on
   the home page is the first user. Nothing here is scoped to a page.

   THE STRUCTURE

       .csa-slider                     position context for the two buttons
         [code block]                  .csa-slider__btn--prev
         .csa-slider__track            the flex row AND the scroll container
           <card> <card> ...
         [code block]                  .csa-slider__btn--next

   One element is both the flex row and the scroll container. That matters.
   A percentage flex-basis on a card then resolves against the width the
   reader can see, so "two up" and "one up" are exact. A separate inner track
   would resolve the percentage against the track instead, and the arithmetic
   would drift.

   WHY THE DRAG IS NOT WRITTEN HERE
   Touch drag, momentum, and the rubber band at each end are native to an
   overflow container. A pointer-drag handler would replace all three with a
   worse copy, and it would break text selection. So the slider is a real
   scroll container, `scroll-snap-type` lands it on a card, and the JavaScript
   in snippet S3 only drives the two buttons and their disabled state. Mouse
   drag is therefore NOT supported, by choice. Below 992px the pointer is a
   finger, or it is the two buttons.

   WHY THIS IS NOT IN THE BUILDER
   There is no Oxygen field for `overflow`, `scroll-snap-type`,
   `scroll-behavior`, `overscroll-behavior`, a hidden scrollbar, a
   pseudo-element, a disabled state, or `calc()`. Rule 13 and section 9 of
   OXYGEN-CONVENTIONS.md. The card widths are here for the same reason the
   directory card widths are in section 15. The component goes into a
   reusable part, and a part that needs six builder fields re-entered on every
   page is not reusable.

   THE 0,4,0 SELECTOR ON THE CARDS
   Decision D36. Oxygen writes a class style at up to 0,3,0. A rule at 0,2,0
   can lose to it, and a rule at 0,3,0 ties, then falls back to source order,
   which we do not control. `> :not(.ct-section):not(.oxy-easy-posts)` is
   0,2,0 plus two class negations, so 0,4,0. It beats any builder value on
   `csa-how-card`, at Desktop and at every Oxygen breakpoint, whatever shape
   Oxygen chose to write. It is the same negation pair Oxygen uses itself.

   That is what lets the desktop sizing stay in the builder, where rule 13
   wants it, while the slider tier still gets exact widths. The builder values
   `max-width: 333px` and `min-width: 200px` are cancelled here and nowhere
   else.

   MIN-WIDTH IS SET TO ZERO ON PURPOSE
   Decision D41. A `min-width` above the computed basis stops being a safety
   net and becomes the thing that decides the layout. Zero here means the
   basis always wins.

   TIERS

       992 and up      4 up, no scrolling, no buttons. Cards shrink from
                       333px to 200px, which is the min-width other cards on
                       the page use. All of it from the builder.
       768 to 991      slider, 2 up, 20px gap
       767 and down    slider, 1 up, 16px gap

   There is no tablet frame in the designs. 2 up at tablet follows the Why
   College SA grid, which is 2 up over the same range. Section 16.

   `justify-content` is deliberately unset. With four cards at `flex-grow: 1`
   the row fills any container narrower than 1392px, so centring has no
   effect, and a `justify-content: center` left in place at the slider tier
   would put the first card out of reach of a scroll to the start.
   --------------------------------------------------------------------------- */

/* WIDTH 100% IS NOT OPTIONAL. Measured on the build site, 2026-09-10.

   An Oxygen section inner wrap is `display: flex; flex-direction: column;
   align-items: flex-start`. `flex-start`, not `stretch`. So a child is NOT
   given the width of the section. It is sized by its own content.

   A scroll container inside a shrink-to-fit parent is the classic trap. The
   parent asks the track how wide it wants to be, the track answers with the
   width of all four cards, and the parent grows to suit. The overflow then
   never happens, because there is nothing left to overflow.

   Measured at a 375px viewport, before the fix:
       .ct-section-inner-wrap   375     correct
       .csa-slider              645     sized by its own content
       .csa-slider__track       577
       document overflow        290px   the page scrolled sideways

   After the fix, at the same 375px viewport:
       .csa-slider              335     the section width, less its padding
       .csa-slider__track       267
       document overflow        0

   `width: 100%` resolves against the flex container, which has a definite
   width, so the track is capped and the cards overflow it as intended.
   `min-width: 0` stops the automatic minimum size of a flex item from
   putting the width back. */
.csa-slider {
  position: relative;
  width: 100%;
  max-width: 100%;
  min-width: 0;
}

.csa-slider__track {
  min-width: 0;
}

/* The buttons take their colour from the slider, so one modifier class
   carries the component onto a dark section. The default is the navy, for a
   light section such as the Courses page. */
.csa-slider__btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  display: none;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 48px;
  padding: 0;
  border: 0;
  border-radius: 4px;
  background: none;
  color: var(--csa-navy);
  cursor: pointer;
  transition: color 150ms ease, opacity 150ms ease;
}

.csa-slider--on-dark .csa-slider__btn {
  color: var(--csa-white);
}

.csa-slider__btn--prev { left: 0; }
.csa-slider__btn--next { right: 0; }

.csa-slider__btn svg {
  display: block;
  width: 14px;
  height: 28px;
}

.csa-slider__btn:hover,
.csa-slider__btn:focus-visible {
  color: var(--csa-pink);
}

.csa-slider__btn:focus-visible {
  outline: 2px solid var(--csa-pink);
  outline-offset: 4px;
}

/* The button is disabled at the first and at the last card. It stays in the
   layout, so the cards do not shift when an end is reached. */
.csa-slider__btn[disabled] {
  opacity: 0.35;
  cursor: default;
}

.csa-slider__btn[disabled]:hover {
  color: var(--csa-navy);
}

.csa-slider--on-dark .csa-slider__btn[disabled]:hover {
  color: var(--csa-white);
}

.csa-trend__track {
  scroll-padding-inline: 14px;
}

/* ---- 991 and down, the slider tier -------------------------------------- */

/* The padding on the slider is the lane the two buttons sit in. The buttons
   are absolutely positioned into that lane, so they never cover card content.
   To overlay them on the cards instead, remove the padding. Nothing else has
   to change. */
@media (max-width: 991.98px) {
  .csa-slider {
    padding-left: 48px;
    padding-right: 48px;
  }

  .csa-slider__btn {
    display: flex;
  }

  .csa-slider__track {
    overflow-x: auto;
    overflow-y: hidden;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    /* Stops a horizontal swipe from reaching the browser back gesture. */
    overscroll-behavior-x: contain;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }

  /* The scrollbar is hidden because the buttons are the affordance and the
     design shows no bar. Firefox uses the property above. */
  .csa-slider__track::-webkit-scrollbar {
    display: none;
  }

  /* 0,4,0. Read the note above before you change this selector. */
  .csa-slider .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
    flex-grow: 0;
    flex-shrink: 0;
    flex-basis: calc((100% - 20px) / 2);
    min-width: 0;
    max-width: none;
    scroll-snap-align: start;
  }
}

/* ---- 767 and down, one card at a time, on a 16px gap -------------------- */
@media (max-width: 767.98px) {
  .csa-slider {
    padding-left: 40px;
    padding-right: 40px;
  }

  .csa-slider__btn {
    width: 32px;
    height: 44px;
  }

  .csa-slider .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
    flex-basis: 100%;
  }
}

/* ---- 480 and down, a narrower button lane ------------------------------- */

/* At a 320px viewport the section padding plus a 40px lane on each side would
   leave the card under 200px. 34px holds it at about 212px, which matches the
   narrowest Why College SA card. Section 16. */
@media (max-width: 480px) {
  .csa-slider {
    padding-left: 34px;
    padding-right: 34px;
  }

  .csa-slider__btn {
    width: 28px;
    height: 40px;
  }

  .csa-slider__btn svg {
    width: 12px;
    height: 24px;
  }
}

/* The CSS smooth scroll applies to the button scroll as well as to a user
   scroll, so it is switched off here and not in the JavaScript. */
@media (prefers-reduced-motion: reduce) {
  .csa-slider__track {
    scroll-behavior: auto;
  }
  .csa-slider__btn {
    transition: none;
  }
}

/* ---------------------------------------------------------------------------
   17b. CARD SLIDER, THE TWO ADD-ONS THE TESTIMONIAL BAND NEEDED

   Both are opt-in and neither one changes the how-it-works slider.

   `--always` makes the component a slider at EVERY width, not only at 991 and
   below. The how-it-works block is four static cards on desktop, so it does
   not carry this class. The testimonial band scrolls on desktop too, because
   the design puts a chevron on each side of the desktop layout.

   `.csa-slider__dots` is a container the section supplies and snippet S3
   fills, one button per card. It is empty in the JSON. A slider with no dots
   container gets no dots and no JavaScript cost, which is why how-it-works is
   untouched.

   The dots are hidden above 767px. Above that the slider shows two or more
   cards at a time, so one dot per card stops meaning one dot per view. Dots
   for pages rather than for cards is a different component. The design asks
   for dots on mobile only, which is one card at a time, so that is the only
   tier they run in.
   --------------------------------------------------------------------------- */

@media (min-width: 991px) {
  .csa-slider--always .csa-slider__track {
    overflow-x: auto;
    overflow-y: hidden;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    overscroll-behavior-x: contain;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }

  .csa-slider--always .csa-slider__track::-webkit-scrollbar {
    display: none;
  }

  .csa-slider--always .csa-slider__btn {
    display: flex;
  }

  .csa-slider--always .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
    scroll-snap-align: start;
  }
}

/* The dots sit in normal flow as the last child of the slider, so they need no
   absolute positioning and they cannot sit on top of a card. The button is
   24px so it is a real tap target. The dot itself is 8px. */
.csa-slider__dots {
  display: none;
  flex-direction: row;
  align-items: center;
  justify-content: center;
  align-self: center;
  gap: 8px;
  margin-top: 16px;
}

.csa-slider__dot {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  padding: 0;
  border: 0;
  background: none;
  cursor: pointer;
}

.csa-slider__dot::before {
  content: "";
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--csa-surface-grey);
  opacity: 0.45;
  transition: opacity 150ms ease;
}

.csa-slider__dot[aria-current="true"]::before {
  opacity: 1;
}

.csa-slider__dot:focus-visible {
  outline: 2px solid var(--csa-white);
  outline-offset: 0;
  border-radius: 50%;
}

/* ---------------------------------------------------------------------------
   17c. CARD SLIDER, THE TRENDING COURSES ADD-ON

   The "Trending courses" band on the home page. `json/home/trending-courses.json`,
   built by `scripts/Build-TrendingCoursesJson.ps1`. Decision D127.
   Revised twice on 2026-09-28. The chevrons stay at the SIDES, in lanes, and
   never over a card, by decision. The lanes are narrower than
   section 17's, so a price-and-duration row still fits.

   The slider carries `csa-slider--always`, so it scrolls at every width, and
   `csa-slider--four-up`, this add-on.

       1301 and up     4 up    Oxygen Desktop
       992 to 1300     3 up    Oxygen Page Width, max-width 1300, read off
                               universal.css 2026-09-28
       768 to 991      2 up    section 17
       767 and down    1 up    section 17, capped at 480 here

   Measured in the live page on 2026-09-28, clearance being the room left in
   the widest price-and-duration row:

       width    card    clearance    chevron to card
       1440     281       17            10
       1301     278       14            10
       992      274       10            10
       768      285       21            26
       480      344       80            20
       375      239       column        20

   THE UNEVEN TRACK PADDING. `csa-trend__track` pads 6 left and 14 right in
   the builder, because the card shadow reaches 5px left and 13px right. With
   a 20px gap, a card that has scrolled off ends 14px outside the edge and its
   shadow stops 1px short, so no sliver shows. Gap minus left padding must be
   at least 13. Every lane below is 8px wider on the left than on the right,
   which puts each card the same distance from both chevrons.

   Section 9 permits these rules and nothing else:
     the card widths       `calc()` and `flex-basis`. No field for either,
                           and Oxygen drops `flex-basis`.
     the lanes at 991 and  a builder field, BUT section 17 sets them on
     down                  `.csa-slider` in this file at those widths, which
                           beats a class field. The DESKTOP lanes are on
                           `csa-slider--four-up` in the builder.
     the phone gap         a builder field, BUT `csa-slider__track` sets 16px
                           at Phone Landscape and Oxygen compiles that AFTER
                           `csa-trend__track`, so a field here loses the tie.
                           16px would bring the sliver back.
     the chevron box       sized in section 17 already.
     the single-card cap   section 17 sets `.csa-slider { max-width: 100% }`
                           in this file, which locks the field. Centring it
                           is on the class in the builder, `auto` margins.
     scroll-padding        no field.
     hover and focus       Oxygen's state handling is limited.

   `60px` is three gaps of 20px and `40px` is two. Change the gap on
   `csa-slider__track` and change these.
   --------------------------------------------------------------------------- */

.csa-trend__track {
  scroll-padding-left: 6px;
  scroll-padding-right: 14px;
}

/* 0,4,0, for the reason in section 17. */
@media (min-width: 1301px) {
  .csa-slider--four-up .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
    flex-grow: 0;
    flex-shrink: 0;
    flex-basis: calc((100% - 60px) / 4);
    min-width: 0;
    max-width: none;
  }
}

@media (min-width: 992px) and (max-width: 1300.98px) {
  .csa-slider--four-up .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
    flex-grow: 0;
    flex-shrink: 0;
    flex-basis: calc((100% - 40px) / 3);
    min-width: 0;
    max-width: none;
  }
}

/* The chevrons, 992 and up. The 28 x 40 box section 17 uses at 480 and down,
   so it fits the 32px and 24px lanes. The button at an END is hidden rather
   than dimmed, so the band opens with the next chevron only. */
@media (min-width: 992px) {
  .csa-slider--four-up .csa-slider__btn {
    width: 28px;
    height: 40px;
  }

  .csa-slider--four-up .csa-slider__btn svg {
    width: 12px;
    height: 24px;
  }

  .csa-slider--four-up .csa-slider__btn[disabled] {
    opacity: 0;
    pointer-events: none;
  }
}

/* The lanes at 991 and down: section 17's widths, plus 8px on the left. */
@media (max-width: 991.98px) {
  .csa-slider.csa-slider--four-up {
    padding-left: 56px;
    padding-right: 48px;
  }
}

/* One card, 767 and down. 480 holds a card of about 370px, which is the 350
   to 400 target. The gap goes back to 20: see the note above. */
@media (max-width: 767.98px) {
  .csa-slider.csa-slider--four-up {
    max-width: 480px;
    padding-left: 48px;
    padding-right: 40px;
  }

  .csa-slider--four-up .csa-trend__track:not(.ct-section):not(.oxy-easy-posts) {
    gap: 20px;
  }
}

@media (max-width: 480px) {
  .csa-slider.csa-slider--four-up {
    padding-left: 42px;
    padding-right: 34px;
  }
}

.csa-trend-card .csa-trend-card__title {
  transition: color 0.15s ease-in-out;
}

.csa-trend-card:hover .csa-trend-card__title,
.csa-trend-card:focus-visible .csa-trend-card__title {
  color: var(--csa-pink);
}

.csa-trend-card:focus-visible {
  outline: 2px solid var(--csa-pink);
  outline-offset: 2px;
}

/* ---------------------------------------------------------------------------
   18. TESTIMONIAL CARDS, "What students are saying"

   Generic. No page name and no home-page scope, so the same classes carry the
   band onto the Courses page or anywhere else. Measured off Figma node 1:4 at
   1:1 on 2026-09-10, by pixel scan, and off the mobile frame 1:23862.

   THE STRUCTURE

       .csa-quotes                        ct_section, full width, the colour
         .csa-slider .csa-slider--always .csa-slider--on-dark
           [code block]                   .csa-slider__btn--prev
           .csa-slider__track .csa-quotes__track
             .csa-quote-card              x 6
               .csa-quote-card__quote
               .csa-quote-card__meta
                 .csa-quote-card__name
                 .csa-quote-card__role
                 .csa-quote-card__stars
           [code block]                   .csa-slider__btn--next
           .csa-slider__dots              empty, snippet S3 fills it

   WHY THE CARD IS A SQUARE AND MUST STAY ONE

   The whole card is one SVG: csa-home-testimonial-block-1/2/3.svg. The white
   face, the peeled corner and the quote mark are all in the file, and the
   corner is really cut out of the card, so the colour band shows through it.
   None of that can be rebuilt with a border radius and a corner image.

   The file is a 500 x 500 box. The white face inside it is 416.35 x 416.34,
   sitting at 41.34, 18.32. So the ELEMENT is the 500 box and it is bigger than
   the card you see:

       element 353px  ->  visible white face 294px

   Every number below is a percentage of the 500 box, not of the face. That is
   also where the wide gaps in the design come from. At 1440 the design has
   131px between two faces. 59px of that is the SVG's own empty margin.

   MEASURED AT 1440

       band                   y 4262 to 4686, 424 high
       stripes                #c792ff, #a17bff, #ff94cc, 425px each,
                              the middle one centred, the outer two bleeding
       card face              294 x 294, at x 146, 572 and 997
       card pitch             425
       quote mark per card    #923eff, #6b3bff, #ff45af,
                              so the SVG order is block-2, block-3, block-1
       arrows                 48px circles, centres at x 74.5 and 1357,
                              which is the outer edge of the 1275px stripe row
       quote text             14 / 22, #414042, first line ink at y 4341
       name                   14, weight 600, #414042
       role                   12, #808285
       stars                  5, ink 10 x 10, pitch 14.6

   MEASURED ON MOBILE, FRAME 1:23862, 600px wide

       band                   one stripe, #ff94cc, no three way split
       card face              413 x 413, so the element is 496, 82.6% of 600
       chevron                18 x 33, plain, NO circle, right side only,
                              centred on the element, x centre 548.5
       dots                   3, 11px, pitch 18.5, #f7f8fc, centred

   WHY THE TYPE IS IN cqw AND NOT IN PIXELS

   The card is square, so its height is its width. Text at a fixed pixel size
   in a box whose height shrinks with the viewport overflows the moment the
   card gets narrow. Sizing the whole inside of the card in cqw means the card
   is the same drawing at every width and the text can never overflow. It also
   reproduces the design exactly at 353px, because every cqw value below is the
   measured pixel value divided by 353.3.

   WHY THE TEXT WRAPS AROUND THE CURL

   The peeled corner cuts diagonally across the card from face 203,135 down to
   face 0,292. A rectangular paragraph runs straight into it on line five. The
   float and shape-outside on the quote's ::before trace that diagonal, so the
   lines shorten as they descend, which is what the design shows. If a browser
   ever ignores shape-outside the text goes back to a rectangle. It would look
   wrong. It would not break the layout.

   NOT VERIFIED IN A BROWSER. The shape-outside polygon is derived from the SVG
   path, not read off a screen. Check it at 1440 and say if the wrap is out.

   TIERS

       1200 and up     3 up, the three stripes, arrows on the stripe row edge,
                       48px lane, the circled chevron
       992 to 1199     2 up, one pink band, arrows on the track edge
       880 to 991      2 up, the same, the plain chevron
       879 and down    1 up, the card fills the row, 40px lane, plus the dots
       480 and down    the same, 34px lane, a smaller chevron

   MEASURED ON THIS BUILD, 2026-09-10, in a browser, with no page overflow at
   any width from 1920 down to 320:

       1440   card 353 x 459, pitch 425, track 1203, arrow centre 82.5,
              quote 13px. This row is the design, to the pixel.
       1200   card 306 x 398, quote 11.3px, three up
       1199   card 353 x 459, quote 13px, two up
        992   card 353 x 459, quote 13px
        880   card 326 x 424, quote 12.0px
        879   card 420 x 546, quote 15.5px, one up, dots on
        375   card 307 x 399, quote 11.3px
        320   card 252 x 328, quote 9.3px

   No page overflow at any of them, no quote clipped at any of them, and no
   line of text crosses the peel at any of them. The tightest clearances at
   1440 are 37px on a quote line and 6.1px on the role.

   TWO KNOWN LIMITS, both from the same cause. The card holds a fixed number
   of characters, so a longer quote can only be paid for with a smaller type
   size, and the type is a fixed share of the card.

   1. Below about 406px the quote drops under 12px, and at 320 it is 9.3px.
      The fix is a taller card at the one up tier only, which is a phone
      showing one card and can afford the height. Ratio 1.55 instead of 1.3
      would take 375 to about 13px. It needs five dependent values redone:
      the ratio, the ::before top and radius, the quote height, and the
      polygon. NOT DONE. Confirm it is wanted before spending the time.
   2. Between 1200 and about 1281 the three up tier squeezes the card under
      326px and the quote goes to 11.3px. That window is 80px wide.

   COPY LIMITS, measured with the shape below in place. They are the same at
   every card width, because the type is a fixed share of the card.
       quote   about 400 characters. The approved three are 348, 373 and 334,
               and the longest leaves one line spare.
       name    about 34 characters, which is two lines. A third line would
               run over the peel.
   A longer quote is clipped, not overflowed.
   --------------------------------------------------------------------------- */

/* The band is edge to edge, so the inner wrap must not cap it. Written at
   0,4,0 for the reason in section 17. Leave the section's own width and side
   padding alone in the builder. Every number here depends on the section being
   the full width of the viewport. */
.csa-quotes.ct-section > .ct-section-inner-wrap:not(.oxy-easy-posts) {
  width: 100%;
  max-width: 100%;
  padding: 0;
}

/* OXYGEN PUTS A SECTION CLASS'S PADDING ON THE SECTION, AND KEEPS ITS OWN
   75px ON THE INNER WRAP. Measured on the build site, 2026-09-10.

   So a section that carries `padding: 64px 0 40px` from its class really
   renders 139px top and 115px bottom. Both of these sections set their own
   padding on the class, so the wrap's share has to go. Do not set section
   padding in the builder for these two: it lands on the wrap and adds to the
   class value instead of replacing it. */
.csa-quotes-head.ct-section > .ct-section-inner-wrap:not(.oxy-easy-posts) {
  padding-top: 0;
  padding-bottom: 0;
}

/* A Code Block is a div, and the newline after the pasted button is a real
   text node inside it. The button is absolutely positioned, so the div should
   collapse, but that stray newline gave it a 50px line box and pushed the
   whole band down. Measured on the build site, 2026-09-10. */
.csa-quotes .csa-slider > .ct-code-block {
  font-size: 0;
  line-height: 0;
}

/* ---- The geometry, in one place ---------------------------------------- */

/* WHY THE ROW IS IN cqw AND NOT IN %

   Measured in the browser on 2026-09-10, and it was wrong the first time.
   A percentage inside a custom property is NOT resolved where the property is
   declared. It is resolved where the property is USED, against whatever that
   element's containing block happens to be. One `100%` therefore meant 1440
   on the track and 1203 on a card, and the cards came out 47px too wide.

   cqw cannot be re-based like that. The slider is the container, so 100cqw is
   the slider's width at every point inside it.

   Nothing that reads --csa-quotes-row may sit ON the slider, because an
   element's own cqw looks at the container ABOVE it, not at itself. That is
   why the slider carries no padding of its own and the band's height comes
   from padding on the slots. */

/* THE COLOUR IS ON THE SLOT, SO IT MOVES WITH THE CARD. Decided 2026-09-10.

   The first build painted the three stripes as one fixed gradient on the
   band and let the cards slide over stationary colour. That is wrong. The
   colour belongs to the card. The mobile design proves it: it shows the
   THIRD card, and the band is pink because pink is that card's colour, not
   because the mobile band is pink.

   So every card now sits inside a `.csa-quote-slot`, which is the flex item,
   carries the colour, and runs the full height of the band. Scroll the track
   and the colour scrolls with the card.

       lane    clear space each side, where the arrow sits
       row     the coloured run, edge of first slot to edge of last
       up      cards across, per tier
       slot    one card's coloured block. row / up above 879, and the whole
               band width at one up, so a phone gets one colour per screen.
       card    the 500 box element. 353 is the design size and the cap.
               0.8313 is 353.3 / 425, the design's card to slot ratio.
       bleed   what the first and last slot need to reach the screen edge.
               Zero at one up, where the slot is already the full width.

   The track is the full band width and the slots tile it with no gap, so two
   colours always meet on a hard edge, the way the design draws them. */
.csa-quotes {
  --csa-quotes-lane: 48px;
}

.csa-quotes .csa-slider {
  container-type: inline-size;
  --csa-quotes-row: min(1275px, 100cqw - var(--csa-quotes-lane) * 2);
  --csa-quotes-up: 3;
  --csa-quotes-slot: calc(var(--csa-quotes-row) / var(--csa-quotes-up));
  --csa-quotes-card: min(353px, calc(var(--csa-quotes-slot) * 0.8313));
  --csa-quotes-bleed: calc((100cqw - var(--csa-quotes-row)) / 2);
  --csa-quotes-pad: calc(var(--csa-quotes-card) * 0.1);
  --csa-dots-space: 0px;
  padding: 0;
}

/* 0,4,0. Section 17 sets width, gap and overflow on this element from the
   builder. This has to beat that, and it has to beat section 17's own 0,4,0
   card rule, which it does on source order because it is later in this file. */
.csa-quotes .csa-slider__track:not(.ct-section):not(.oxy-easy-posts) {
  width: 100cqw;
  max-width: none;
  margin: 0;
  column-gap: 0;
  align-items: stretch;
  scrollbar-width: none;
}

/* The coloured block. 10% of the card above and below it is the design at
   both sizes: 35.35 on a 353 card at 1440, and 49.8 on a 496 card on mobile.
   That padding is inside the colour, so the block is full height. */
.csa-quotes .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
  flex: 0 0 auto;
  width: var(--csa-quotes-slot);
  min-width: 0;
  max-width: none;
  padding: var(--csa-quotes-pad) 0;
  scroll-snap-align: start;
}

/* The two ends run to the edge of the screen. The extra width is the lane, so
   the three slots tile the whole band and the row of cards still measures
   1275 at 1440.

   These need the same two negations as the rule above plus the pseudo-class,
   or they sit at 0,3,0 and lose to it. That is exactly what happened on the
   first attempt: the slots stayed 425 and 165px of the band went white. */
.csa-quotes .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts):first-child {
  width: calc(var(--csa-quotes-slot) + var(--csa-quotes-bleed));
  padding-left: var(--csa-quotes-bleed);
}

.csa-quotes .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts):last-child {
  width: calc(var(--csa-quotes-slot) + var(--csa-quotes-bleed));
  padding-right: var(--csa-quotes-bleed);
}

/* The three colours cycle by position, the order measured in the design. They
   are set in the builder on these three classes, not here. Rule 9. */
.csa-quote-slot {
  display: flex;
  flex-direction: column;
  justify-content: center;
}

/* ---- The buttons ------------------------------------------------------- */

/* One rule at every tier now. The arrow's centre sits on the edge of the
   coloured row, which is the lane. At 1440 that is 75px, and the design
   measured 74.5. On mobile the row edge IS the card element's edge, which is
   what the mobile design shows. */
.csa-quotes .csa-slider__btn {
  top: calc((100% - var(--csa-dots-space)) / 2);
}

.csa-quotes .csa-slider__btn--prev {
  left: calc((100cqw - var(--csa-quotes-row)) / 2);
  transform: translate(-50%, -50%);
}

.csa-quotes .csa-slider__btn--next {
  right: calc((100cqw - var(--csa-quotes-row)) / 2);
  transform: translate(50%, -50%);
}

/* THREE TESTIMONIALS AND THREE SLOTS, SO DESKTOP CANNOT SCROLL.

   Decided 2026-09-10. With three cards at three up the track has
   nothing to move, so snippet S3 correctly disables both buttons and they
   would sit permanently greyed on the widest screen. That reads as broken.

   `:has()` means this undoes itself. Add a fourth testimonial and the
   arrows come back with no CSS edit. Nothing else in the component counts
   cards.

   `:has()` is not supported in every browser Oxygen supports. Where it is
   not, the arrows stay visible and greyed, which is exactly the fallback we
   would have chosen anyway. */
@media (min-width: 1200px) {
  .csa-quotes .csa-slider:has(.csa-slider__track > :last-child:nth-child(-n + 3)) .csa-slider__btn {
    display: none;
  }
}

/* Two chevrons live in each button's code block. The circle is the desktop
   art, csa-home-slider-arrow.svg. The bare chevron is the mobile art. They
   swap at 992, and neither one is an image request, because both are inline. */
/* Section 17 sizes the button box at 36 x 48 and the SVG at 14 x 28. Both are
   cancelled here, because the two chevrons carry their own size. The 8px of
   padding is the tap target: it takes the bare 18 x 33 mobile chevron to a
   34 x 49 hit area. It is symmetric, so the translate still puts the chevron's
   own centre on the edge it is meant to sit on. */
.csa-quotes .csa-slider__btn {
  width: auto;
  height: auto;
  padding: 8px;
}

.csa-quotes .csa-slider__btn .csa-slider__chev--wide {
  display: none;
}

.csa-quotes .csa-slider__btn .csa-slider__chev--round {
  display: block;
  width: 48px;
  height: 48px;
}

/* ---- Tiers ------------------------------------------------------------- */

@media (max-width: 1199.98px) {
  .csa-quotes .csa-slider {
    --csa-quotes-up: 2;
  }
}

@media (max-width: 991px) {
  .csa-quotes .csa-slider__btn .csa-slider__chev--round {
    display: none;
  }

  .csa-quotes .csa-slider__btn .csa-slider__chev--wide {
    display: block;
    width: 18px;
    height: 33px;
  }
}

/* 839, not 767. Measured 2026-09-10. The quote's size is a fixed share of the
   card, so the card's width decides whether the text is readable:

       font = 3.9626 per cent of the card

   12px is the smallest type anywhere else on this site, --csa-fs-small. At
   the 13px base the quote is 3.6827 per cent of the card, so the card must
   not go under 326px. Two up reaches 326 at an 880px screen and three up
   reaches it at 1281. The two flips are therefore 1200 and 880. Oxygen's 768
   would have put an 11.1px quote on a tablet. Neither number is an Oxygen
   breakpoint, which is fine, because this whole component is written in CSS
   and nothing in it is set at a builder breakpoint. Decision D36. */
@media (max-width: 879px) {
  .csa-quotes {
    --csa-quotes-lane: 40px;
  }

  /* At one up the SLOT is the whole band, not the row, so one swipe is one
     screen of one colour with no sliver of the next card showing. The CARD
     is still the row, so the two lanes stay clear for the chevrons. The 420
     cap stops an 879px screen from drawing a 420 x 546 card at 879 wide.

     Bleed is zero here, because the slot already reaches both edges. */
  .csa-quotes .csa-slider {
    --csa-quotes-up: 1;
    --csa-quotes-slot: 100cqw;
    --csa-quotes-card: min(420px, var(--csa-quotes-row));
    --csa-quotes-bleed: 0px;
    --csa-dots-space: 40px;
  }

  /* The dots sit ON the card's colour, so they are laid over the extra
     bottom padding the slot carries at this tier, not below the band. */
  .csa-quotes .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
    padding-bottom: calc(var(--csa-quotes-pad) + var(--csa-dots-space));
  }

  .csa-quotes .csa-slider__dots {
    display: flex;
    position: absolute;
    left: 0;
    right: 0;
    bottom: calc(var(--csa-quotes-pad) * 0.4);
    margin-top: 0;
    z-index: 2;
  }
}

@media (max-width: 480px) {
  .csa-quotes {
    --csa-quotes-lane: 34px;
  }

  .csa-quotes .csa-slider__btn .csa-slider__chev--wide {
    width: 15px;
    height: 28px;
  }
}

/* ---- The card ---------------------------------------------------------- */

/* container-type makes 1cqw equal 1 per cent of this element's width, so every
   value below is the measured pixel divided by 353.3. Set the background
   image, contain, no repeat and centre on the three modifier classes in the
   builder.

   Do NOT set flex, width, height or aspect ratio on this class in the builder.
   Those four are the ones the rules above own. */
/* THE PADDING IS ON THE CHILDREN, NOT HERE. Measured 2026-09-10, and this was
   the second thing that was wrong on the first pass. An element's own cqw is
   measured against the container ABOVE it, never against itself, so
   `padding: 11.58cqw` on this card asked the viewport and came back with
   167px. The same four values live on the quote and on the meta below, as
   margins, where cqw does mean "per cent of this card". */
/* THE CARD IS 353 x 459, NOT A SQUARE. Decisions D53 and D56.

   The approved copy is about twice the length the design's placeholder copy
   was: 348, 373 and 334 characters against the 177 a square card holds at
   14px. Measured 2026-09-10. Cutting the padding to the minimum and dropping
   to 13px still left all three over by about three lines.

   So the card grew taller. The artwork grew with it: `scripts/Build-QuoteCardSvg.ps1`
   moves the card's top edge up 150 units and takes the viewBox from
   0 0 500 500 to 0 -150 500 650, which is the 1.3 ratio. The peel, the quote
   mark and the corner radius are never scaled, only moved down.

   It was faked with a white CSS box above a square SVG first, and that join
   had to have its radius, its edges and its drop shadow matched to the file
   by hand. It kept showing. Decision D56. Do not go back to it.

   The artwork is an inline SVG in a code block, and that SVG is the whole
   card, so nothing about the card's shape is set here. Decisions D55, D56. */
.csa-quote-card {
  container-type: inline-size;
  position: relative;
  width: var(--csa-quotes-card);
  max-width: 100%;
  margin-left: auto;
  margin-right: auto;
  aspect-ratio: 1 / 1.3;
  padding: 0;
}

/* THE ARTWORK IS AN INLINE SVG, NOT A BACKGROUND IMAGE. Decision D55.

   It was a background image until 2026-09-10 and the edges looked soft.
   Two causes, measured on the build site:

   1. A background image is RASTERISED. Chrome turns the SVG into a bitmap at
      the card's size and then paints that bitmap at the card's position. The
      card lands at x 117.5 and y 6288.906, because the page above it does not
      add up to whole pixels, so the bitmap is resampled and every edge goes
      soft. Nothing can be done about the position: it is the sum of every
      section above the band.
   2. The supplied files carry `isolation: isolate` and `mix-blend-mode:
      multiply`, which push the whole card into an offscreen buffer.

   An inline SVG is drawn as real vector geometry at the final resolution, so
   a fractional position anti-aliases the shape instead of resampling a
   bitmap. `scripts/Build-QuoteCardSvg.ps1` also strips the blend mode and the
   isolation, so cause 2 is gone as well.

   The three files are NOT interchangeable with the originals. They have their
   ids namespaced per card, because all three shipped with `id=
   "linear-gradient"` and would have collided in one page. Read the header of
   that script before you touch them. */
.csa-quote-card:not(.ct-section) {
  background-image: none;
}

/* The code block that holds the SVG. Out of flow, so it does not disturb the
   card's flex column, and stretched over the whole card, because the
   artwork now IS the whole card.

   font-size and line-height are zero for the same reason as the button code
   blocks: the newline after the pasted SVG is a real text node. */
.csa-quote-card__art {
  position: absolute;
  inset: 0;
  font-size: 0;
  line-height: 0;
  pointer-events: none;
}

/* The SVG IS the card, all of it. It carries the top edge, both corners, the
   peel and the drop shadow, so there is nothing here to match to it and no
   join to hide. viewBox 0 -150 500 650 at `width: 100%` renders 1.3 times
   the width, which is the card's own ratio. */
.csa-quote-card__svg {
  display: block;
  width: 100%;
  height: auto;
}

/* The art is a positioned box, so it paints above in-flow content. The quote
   and the meta have to be lifted over it. */
.csa-quote-card__quote,
.csa-quote-card__meta {
  position: relative;
  z-index: 1;
}

/* 45.06cqw is 159.2px at 353, which is the space between the top padding and
   the top of the name. The height is fixed on purpose. The float below needs a
   definite height, and a fixed height is what keeps the name, the role and the
   stars on the same line on all six cards, whatever the quote's length. */
/* Every value is still the measured pixel divided by 353, the card's WIDTH.
   The card is 1.25 times as tall as it is wide, so the vertical numbers are
   percentages of the width, not of the height.

       margin-top     12.9 SVG face inset + 20 padding = 32.9   ->  9.32cqw
       margin-left    29.2 SVG face inset + 16 padding = 45.2   -> 12.80cqw
       margin-right   29.9 SVG face inset + 24 padding = 53.9   -> 15.27cqw
       height         247.1, which leaves room for a two line name AND
                      about 7px of slack. Without the slack a two line name
                      filled the card to the exact pixel, rounding pushed it
                      over, and the card grew 4.29px taller than its own
                      artwork, showing a strip of the slot colour underneath.

   The top padding is 20 and not the design's 28, which is the reduction
   that was asked for. The bottom padding stays at the design's 36. It cannot be
   tightened: the peel cuts across the bottom left and the role text already
   comes within 7px of it. */
.csa-quote-card__quote {
  flex: none;
  margin: 9.32cqw 15.27cqw 0 12.80cqw;
  height: 70cqw;
  overflow: hidden;
  font-size: 3.6827cqw;
  line-height: 1.5714;
  color: var(--csa-ink);
}

/* The curl. The polygon traces the SVG's own cut, in the float's own box. It
   starts 51.4 per cent down the right edge, runs to the bottom right, along
   the bottom, then back up the diagonal to the curl's apex at 36.9, 67.5. */
.csa-quote-card__quote::before {
  content: "";
  float: right;
  width: 40.61%;
  height: 100%;
  shape-outside: polygon(100% 77.68%, 100% 100%, 0 100%, 15.33% 89.21%, 35.01% 87.56%);
  shape-margin: 3.1%;
}

/* The flex column itself is set in the builder on this class, rule 9. Only the
   `flex: none` is here, and only because a fixed height quote above it must
   never be allowed to squash this block. */
/* THE MAX-WIDTH IS THE PEEL, NOT A STYLE CHOICE. Measured 2026-09-10.

   The peel cuts across the bottom LEFT of the card as well as the right, and
   the name sits right against it. "Fofoza Junior Manganyi" at 13px ran 48px
   over the curl before this cap went in. The safe width at the second name
   line is 131px on a 353 card, so 37cqw.

   A capped name wraps to two lines, and the quote's fixed height above
   already allows for that. A name long enough to take three lines would run
   over the curl again. About 34 characters is the limit. */
.csa-quote-card__meta {
  flex: none;
  max-width: 37cqw;
  margin: 0 15.27cqw 23.91cqw 12.80cqw;
}

.csa-quote-card__name {
  font-size: 3.9626cqw;
  line-height: 1.5;
  font-weight: 600;
  color: var(--csa-ink);
}

.csa-quote-card__role {
  font-size: 3.3966cqw;
  line-height: 1.5;
  color: var(--csa-ink-muted);
}

/* ---- The star rating --------------------------------------------------- */

/* Five stars from two inline SVGs and no markup, so the rating is one class on
   the card and there is no code block to paste per card. The empty row is the
   background of the element. The filled row is the ::before, clipped by its
   own width to the rating. The two SVGs are csa-home-star-1.svg and
   csa-home-star-2.svg, inlined so they cost no request and need no upload.

   Set the rating with a modifier on the CARD: csa-quote-card--r1 to --r5.
   Give this element role="img" and an aria-label such as "4 out of 5 stars" in
   the builder's Attributes panel. Without it the rating is invisible to a
   screen reader, because there is no text and no image element. */
.csa-quote-card__stars {
  --csa-star: 3.3966cqw;
  --csa-star-pitch: 4.1324cqw;
  --csa-star-full: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cpath fill='%23ffc200' d='M47.92,77.65l-22.79,11.98c-1.44.76-3.13-.47-2.86-2.08l4.35-25.38c.11-.64-.1-1.29-.57-1.74L7.62,42.46c-1.17-1.14-.52-3.12,1.09-3.36l25.48-3.7c.64-.09,1.2-.5,1.48-1.08l11.39-23.09c.72-1.46,2.81-1.46,3.53,0l11.39,23.09c.29.58.84.98,1.48,1.08l25.48,3.7c1.62.23,2.26,2.22,1.09,3.36l-18.44,17.97c-.46.45-.68,1.1-.57,1.74l4.35,25.38c.28,1.61-1.41,2.84-2.86,2.08l-22.79-11.98c-.57-.3-1.26-.3-1.83,0Z'/%3E%3C/svg%3E");
  --csa-star-empty: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cpath fill='%23ffc200' d='M27.16,89.86c-.97,0-1.94-.3-2.77-.91-1.47-1.06-2.18-2.83-1.88-4.62l3.94-22.98-16.7-16.28c-1.3-1.26-1.75-3.12-1.19-4.84.56-1.72,2.02-2.95,3.81-3.21l23.07-3.35,10.32-20.91c.8-1.62,2.42-2.63,4.23-2.63h0c1.81,0,3.43,1.01,4.23,2.63l10.32,20.91,23.07,3.35c1.79.26,3.25,1.49,3.81,3.21.56,1.72.1,3.58-1.19,4.84l-16.7,16.28,3.94,22.98c.31,1.79-.42,3.56-1.88,4.62-1.46,1.06-3.37,1.2-4.97.35l-20.64-10.85-20.64,10.85c-.7.37-1.45.55-2.2.55ZM50,72.54c.75,0,1.51.18,2.19.54l19.22,10.1-3.67-21.4c-.26-1.53.25-3.09,1.36-4.18l15.55-15.16-21.49-3.12c-1.54-.22-2.87-1.19-3.55-2.58l-9.61-19.47-9.61,19.47c-.69,1.39-2.02,2.36-3.55,2.58l-21.48,3.12,15.55,15.16c1.11,1.08,1.62,2.65,1.36,4.18l-3.67,21.4,19.22-10.1c.69-.36,1.44-.54,2.19-.54Z'/%3E%3C/svg%3E");
  position: relative;
  width: calc(var(--csa-star-pitch) * 4 + var(--csa-star));
  height: var(--csa-star);
  margin-top: 5.66cqw;
  background-image:
    var(--csa-star-empty), var(--csa-star-empty), var(--csa-star-empty),
    var(--csa-star-empty), var(--csa-star-empty);
  background-position:
    0 0, var(--csa-star-pitch) 0, calc(var(--csa-star-pitch) * 2) 0,
    calc(var(--csa-star-pitch) * 3) 0, calc(var(--csa-star-pitch) * 4) 0;
  background-size: var(--csa-star) var(--csa-star);
  background-repeat: no-repeat;
}

.csa-quote-card__stars::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  width: max(0px, calc(var(--csa-star-pitch) * (var(--csa-rating, 5) - 1) + var(--csa-star)));
  background-image:
    var(--csa-star-full), var(--csa-star-full), var(--csa-star-full),
    var(--csa-star-full), var(--csa-star-full);
  background-position:
    0 0, var(--csa-star-pitch) 0, calc(var(--csa-star-pitch) * 2) 0,
    calc(var(--csa-star-pitch) * 3) 0, calc(var(--csa-star-pitch) * 4) 0;
  background-size: var(--csa-star) var(--csa-star);
  background-repeat: no-repeat;
}

.csa-quote-card--r1 { --csa-rating: 1; }
.csa-quote-card--r2 { --csa-rating: 2; }
.csa-quote-card--r3 { --csa-rating: 3; }
.csa-quote-card--r4 { --csa-rating: 4; }
.csa-quote-card--r5 { --csa-rating: 5; }

/* --------------------------------------------------------------------------
   19. ACCORDION, the FAQ band

   Measured on 2026-09-10 off Figma nodes 84:237 (desktop, 1440 x 506) and
   84:331 (mobile, 600 wide), by pixel scan of the render. Type values came
   from get_design_context on the same two nodes.

       card face          #ffffff
       card border        1px #eef0f5          NOT a shadow. White on white.
       card radius        8px                  arc 9px across, 7px down
       question           14px / 20px, 700, #0d2651
       question row       60px tall
       answer             12px / 23px, 400, #808285
       answer panel       72px for two lines, about 14px padding
       icon               21px circle, vertically centred
       icon closed        #eef0f5 disc, #0d2651 triangle down
       icon open          #ff3364 disc, #eef0f5 triangle up
       column gap         16px
       row gap            16px desktop, 24px mobile

   THE BAND HAS NO DROP SHADOW. Every other card on the home page uses
   --csa-shadow-card. This one does not. It is a hairline border only.
   Do not "fix" it by adding the shadow.

   Raw hex values, not tokens, so every value can be read and changed.

   FIVE THINGS THAT ARE DELIBERATE

   1. The item order is COLUMN FIRST. Q1 to Q3 fill the left column and Q4 to
      Q6 fill the right one. That is how the design is drawn. It means that
      stacking the two columns at 991 gives Q1 to Q6 in reading order with no
      reorder rule, and no `display: contents`.

   2. The panel animates `grid-template-rows: 0fr` to `1fr`, not a pixel
      height. A pixel height has to be measured by script and is wrong again
      the moment the window resizes and the answer rewraps. 0fr to 1fr needs
      no measurement and survives every resize. It needs the direct child to
      carry `overflow: hidden` and `min-height: 0`, which is what
      `__panel-inner` is for. Padding cannot go on the grid child, because
      padding still renders at 0fr, so the padding is on `__a` inside it.

   3. The open divider is an inset box-shadow, not a border-bottom. A border
      would add 1px to the row and make an open header 61px against a closed
      60px. An inset shadow paints in the same place and adds nothing.

   4. The triangle flips with `transform-box: view-box` and
      `transform-origin: 50px 50px`. Without `transform-box` the origin
      resolves against the polygon's own bounding box, whose centre is
      y 52.235, not the circle's y 50. Flipping about 52.235 leaves the
      triangle in the same band and does not match the supplied open file.
      Flipping about 50 gives y 63.73, 31.80, 63.73 against the supplied
      63.72, 31.79, 63.72. That is a match to 0.01.

   5. Panels are OPEN by default and are closed by `html.csa-js`. Snippet S4
      writes that class in wp_head before anything paints, so there is no
      flash. If the script ever fails to load, all six answers stay readable
      instead of being locked shut.

   NO HOVER STATE IS DESIGNED. The design gives the row a cursor and nothing
   else. None is invented here. It is due for design review.
   -------------------------------------------------------------------------- */

/* THE SECTION PADDING. Read this before you change it.

   Measured in the Oxygen builder on 2026-09-10. Padding on a section goes to
   two DIFFERENT places depending on where you set it:

       set on the CLASS `csa-faq`  ->  lands on the SECTION element
       set on the section ID       ->  lands on the INNER WRAP

   Oxygen's own 75px on `.ct-section-inner-wrap` survives both. So the 96px
   on the class ADDED to it and rendered 171px, measured.

   This rule zeroes only the wrap's VERTICAL padding. It does not touch the
   class padding, so the 96px stays editable in the builder, which is the
   whole point. It leaves the wrap's horizontal 20px alone, because that is
   the gutter every other band uses.

   Keep the section padding on the CLASS. Set it on the ID and it lands on
   the wrap, where this rule will cancel it and the builder box will look
   broken. OXYGEN-CONVENTIONS.md section 10. */
.csa-faq.ct-section > .ct-section-inner-wrap:not(.oxy-easy-posts) {
  padding-top: 0;
  padding-bottom: 0;
}

/* Two columns above 992, one at 991 and down. `min-width: 0` because
   .ct-section-inner-wrap is align-items: flex-start. Decision D45.
   No flex property here is also set in the builder, so Oxygen cannot write
   its own 0,3,0 selector over the top. Decision D36. */
.csa-accordion {
  display: flex;
  flex-direction: row;
  align-items: flex-start;
  gap: 16px;
  width: 100%;
  min-width: 0;
}

.csa-accordion__col {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 16px;
  flex: 1 1 0;
  min-width: 0;
}

/* `align-items: stretch` because Oxygen ships every Div as a flex COLUMN
   with `align-items: flex-start`. Without it the question row and the panel
   shrink to their text and the card is ragged. See the warning block at the
   top of this file. */
.csa-accordion__item {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  background-color: #ffffff;
  border: 1px solid #eef0f5;
  border-radius: 8px;
}

/* The row is a real <button>, so Enter and Space work with no key handler.
   Everything here undoes a browser button default.

   `flex-direction: row` is NOT optional. Oxygen's `.ct-div-block` default is
   `column`, and a custom tag does not remove that class, so `display: flex`
   on its own would silently stack the question above the icon. */
.csa-accordion__q {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  width: 100%;
  margin: 0;
  padding: 16px 24px;
  border: 0;
  border-radius: 8px;
  background-color: transparent;
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}

/* THE ROW HEIGHT IS NOT HERE. It is `min-height` on the class
   `csa-accordion__q`, set in the builder, so it can be raised to even up a
   column when one question wraps. 58, not 60, because the card carries a 1px
   border top and bottom and those sit OUTSIDE the button.
   Do not put min-height back in this file. It cannot be beaten from the
   builder and that is the whole reason it moved. */
.csa-accordion__item.is-open > .csa-accordion__q {
  box-shadow: inset 0 -1px 0 #eef0f5;
}

.csa-accordion__q:focus-visible {
  outline: 2px solid #ff3364;
  outline-offset: -2px;
}

.csa-accordion__label {
  min-width: 0;
  overflow-wrap: break-word;
  font-size: 14px;
  line-height: 20px;
  font-weight: 700;
  color: #0d2651;
}

/* An Oxygen Code Block is a div, and the newline after the code is a real
   text node. `font-size: 0` and `line-height: 0` stop that text node adding
   height to the row. OXYGEN-CONVENTIONS.md section 10. */
.csa-accordion__icon {
  flex: 0 0 auto;
  font-size: 0;
  line-height: 0;
}

.csa-accordion__svg {
  display: block;
  width: 21px;
  height: 21px;
}

.csa-accordion__disc {
  fill: #eef0f5;
  transition: fill 0.2s ease;
}

.csa-accordion__arrow {
  fill: #0d2651;
  transform-box: view-box;
  transform-origin: 50px 50px;
  transition: fill 0.2s ease, transform 0.3s ease;
}

.csa-accordion__item.is-open .csa-accordion__disc {
  fill: #ff3364;
}

.csa-accordion__item.is-open .csa-accordion__arrow {
  fill: #eef0f5;
  transform: scaleY(-1);
}

/* `align-items: stretch` overrides Oxygen's `flex-start`, which survives the
   switch to grid and would size the row to its content instead of to the
   0fr track. That alone stops the panel closing at all. */
.csa-accordion__panel {
  display: grid;
  grid-template-rows: 1fr;
  align-items: stretch;
  width: 100%;
  transition: grid-template-rows 0.3s ease;
}

html.csa-js .csa-accordion__panel {
  grid-template-rows: 0fr;
}

html.csa-js .csa-accordion__item.is-open .csa-accordion__panel {
  grid-template-rows: 1fr;
}

/* `display: block` on purpose. It is the grid child, and blocking it out of
   Oxygen's flex column removes every inherited flex rule in one line. */
.csa-accordion__panel-inner {
  display: block;
  overflow: hidden;
  min-height: 0;
}

.csa-accordion__a {
  padding: 14px 24px;
  overflow-wrap: break-word;
  line-height: 23px;
  color: #808285;
}

/* The answer is an Oxygen Rich Text element, so the copy arrives wrapped in
   <p> and <ul>. Question 6 is the only one with a list today. */
.csa-accordion__a p {
  margin: 0 0 12px;
}

.csa-accordion__a ul {
  margin: 0;
  padding-left: 18px;
  list-style: disc outside;
}

.csa-accordion__a li {
  margin: 0 0 4px;
}

.csa-accordion__a > :first-child {
  margin-top: 0;
}

.csa-accordion__a > :last-child,
.csa-accordion__a li:last-child {
  margin-bottom: 0;
}

/* A table inside an answer. Added 2026-09-14, for the payment details table.
   There is no builder field for a <th> or a <td>, so this is the same case as
   a code block: the builder cannot see inside the copy.
   OXYGEN-CONVENTIONS.md section 9.

   The rest of the answer, the sub-headings and the paragraphs, is set in the
   Rich Text element's own editor and needs nothing here.

   On the site this block sits at the END of the stylesheet, where it was
   pasted on 2026-09-14. Nothing else targets `.csa-accordion__a table`, so
   the position changes no cascade. The next full import lands it here. */
.csa-accordion__a table {
  width: 100%;
  margin: 0 0 12px;
  border: 1px solid #eef0f5;
  border-collapse: collapse;
}

.csa-accordion__a th,
.csa-accordion__a td {
  padding: 8px 12px;
  border: 1px solid #eef0f5;
  text-align: left;
  vertical-align: top;
}

.csa-accordion__a th {
  font-weight: 700;
  color: #0d2651;
}


/* A LINK INSIDE AN ANSWER. Pink and underlined, as decided on
   2026-09-18. Without a rule the browser paints it `-webkit-link` blue, which
   is the only blue anywhere on this site.

   OXYGEN-CONVENTIONS.md section 9, two rows: "hover, focus and active
   states", and "the output of a code block", because the copy lives inside a
   Rich Text element and the builder has no field for a link buried in it.

   The download button in the FAQs course-fees answer is NOT touched. It is a
   ct_link inside `__panel-inner`, a SIBLING of `__a`, not a descendant.

   THE HOVER COLOUR IS INVENTED. The design gives accordion links no state at
   all. Navy is the question colour from the same block, so it reads as part
   of the set. It is due for design review, blocker B10. */
.csa-accordion__a a {
  color: #ff3364;
  text-decoration: underline;
  transition: color 0.2s ease;
}

.csa-accordion__a a:hover,
.csa-accordion__a a:focus-visible {
  color: #0d2651;
}

/* A LOGO AT THE TOP OF AN ANSWER. Our Accreditation, 2026-09-18.

   Capped by HEIGHT, not by width. The ten accreditation logos run from
   150 x 300 portrait, NEBOSH, to 600 x 142 landscape, Saiosh, so a width cap
   would draw NEBOSH 600px tall. Both caps together keep the aspect ratio and
   let every logo sit on one visual line.

   80px IS NOT FROM A DESIGN. There is none for this page. It is the one
   number here worth tuning. */
.csa-accordion__a img {
  display: block;
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 80px;
  margin: 0 0 12px;
}

/* A WIDE TABLE INSIDE AN ANSWER. Our Accreditation, 2026-09-18.

   Three of its ten answers carry a four column table, SAQA ID, qualification,
   NQF level and credits, whose longest cell is an 85 character qualification
   title, "Further Education and Training Certificate: Information Technology:
   Technical Support". At 375px that table cannot be read and, with no
   wrapper, it pushes the whole page wide. So it scrolls sideways inside the
   answer instead.

   The wrapper is written into the Rich Text copy, which is why it is here and
   not in the builder. OXYGEN-CONVENTIONS.md section 9.

   ONLY THE FOUR COLUMN TABLES ARE WRAPPED. The Sage and NEBOSH tables are one
   column and fit at every width, so they carry no wrapper and no scrollbar.
   520px is the point below which four columns stop being readable. */
.csa-accordion__a .csa-table-scroll {
  margin: 0 0 12px;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}

.csa-accordion__a .csa-table-scroll > table {
  min-width: 520px;
  margin: 0;
}

/* One column at 991 and down. 991 is the Oxygen tablet breakpoint, so the
   builder's own tablet fields line up with this rule. The design measures a
   24px row gap on the 600 frame against 16px on the 1440 frame. */
@media (max-width: 991px) {
  /* `align-items: stretch` again. The row layout wants `flex-start`, so the
     two columns sit top aligned at their own height. The moment the
     direction flips to column, that same `flex-start` shrinks each column to
     its widest question instead of filling the band. */
  .csa-accordion {
    flex-direction: column;
    align-items: stretch;
    gap: 24px;
  }

  .csa-accordion__col {
    gap: 24px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .csa-accordion__panel,
  .csa-accordion__disc,
  .csa-accordion__arrow {
    transition: none;
  }
}

/* --------------------------------------------------------------------------
   20. Page hero, the reusable banner section

   Built 2026-09-11. Used on the Courses page first, and then on every page
   that takes a banner. It is in this file, not in a page file, because it
   runs on seven pages or more. Decision D34.

   THREE THINGS LIVE HERE AND NOTHING ELSE. Everything else is in
   `json/courses/page-hero.json`, on the classes, so the builder fields stay
   live. Rule 13, decision D62.

   1. `min-height`, because a `calc` with `vw` has no field. Released below
      768, where the copy sets the height.
   2. The inner wrap given the section's own height, so the copy can be
      centred in it. There is no field for that, and it locks nothing.
   3. The CTA hover and its transition, and the wide icon box. Oxygen state
      handling is limited, and the builder cannot see inside a code block.
      `OXYGEN-CONVENTIONS.md` section 9.

   THERE IS NO PADDING RULE HERE, AND THAT IS DELIBERATE. Decision D69. The
   section carries no padding. Its own four padding fields are set to 0 on
   the element in the JSON, which lands on the inner wrap and replaces
   Oxygen's own 75px. The real padding is on `csa-page-hero__inner`, a plain
   Div, so no default adds to it and nothing has to be cancelled in CSS.

   EVERY HERO IS THE SAME HEIGHT, AND THE ARTWORK CROPS. Decision D70,
   2026-09-11, decided after comparing the Courses page and the home page
   side by side on a 1920 x 945 screen.

   The first build gave each page the height of its own artwork, 2.286 for
   the 1920 x 840 files and 2.630 for the 1920 x 730 ones. That cropped
   nothing, but it made the Courses hero 110px taller than the home hero at
   1920 and pushed the brag strip off the screen.

   So the ratio is now 2.630 everywhere, which is the home page banner's own
   shape. A 1920 x 840 banner in it loses 13.1 per cent of its height, 55px
   at the top and 55px at the bottom at 1920, and the same 13.1 per cent at
   every width below the cap. That crop is accepted. The navy half of the
   artwork is flat colour, so the crop is only ever visible in the photo.

   The 730px cap is the artwork's own height, so above 1920 the hero stops
   growing instead of reaching 1 120px on a 2 560 screen.

   Below 768 there is no min-height at all. The portrait artwork is anchored
   to the bottom edge and the navy background colour fills the space above
   it, so the copy sets the height. `calc(100vw / 0.732)` was rejected: it
   asks for 1 048px of hero at 767px wide. The number that tunes that tier is
   `padding-bottom` on `csa-page-hero__inner` at Phone Landscape, in per
   cent, and a percentage padding resolves against the element's own width.
   Decision D49.

   `100vw` counts the scrollbar, so the section is 6 to 7px taller than the
   ratio asks in a desktop browser. Risk R6, accepted.
   -------------------------------------------------------------------------- */

.csa-page-hero {
  min-height: min(calc(100vw / 2.63), 730px);
}

/* The wrap is only as tall as its content, so `justify-content: center` set
   on the class in the builder would have nothing to centre against. This
   hands it the section's own computed height. The centring itself stays a
   builder field. */
.csa-page-hero.ct-section > .ct-section-inner-wrap:not(.oxy-easy-posts) {
  min-height: inherit;
}

@media (max-width: 767px) {
  .csa-page-hero {
    min-height: 0;
  }
}

/* The CTA arrow is 24 x 13, not a square. `.csa-icon` in `02-base.css` is
   1em by 1em, which letterboxes it. Height drives it here and the viewBox
   supplies the width, so there is no magic number to keep in step with the
   file. The size is the `font-size` on the code block's class, in the
   builder. */
.csa-icon--wide {
  width: auto;
  height: 1em;
}

/* The CTA hover. Pink fill, white label, white arrow, agreed with the
   designer on 2026-09-11. Decision D68.

   Both children are named. Each one carries its own colour from its own
   class, so neither can inherit a colour from the link. The arrow follows
   `color` because `code-blocks/icons/long-arrow-right.html` carries
   `stroke="currentColor"`.

   Classes, not ids. The fees and finance hover in `css/05-home.css` section
   3 targets ids, and an import that renumbers would kill it silently. */

.csa-page-hero__cta,
.csa-page-hero__cta-label,
.csa-page-hero__cta-icon {
  transition: background-color 0.2s ease, color 0.2s ease;
}

.csa-page-hero__cta:hover,
.csa-page-hero__cta:focus-visible {
  background-color: #ff3364;
}

.csa-page-hero__cta:hover .csa-page-hero__cta-label,
.csa-page-hero__cta:focus-visible .csa-page-hero__cta-label,
.csa-page-hero__cta:hover .csa-page-hero__cta-icon,
.csa-page-hero__cta:focus-visible .csa-page-hero__cta-icon {
  color: #ffffff;
}

@media (prefers-reduced-motion: reduce) {
  .csa-page-hero__cta,
  .csa-page-hero__cta-label,
  .csa-page-hero__cta-icon {
    transition: none;
  }
}

/* ---------------------------------------------------------------------------
   21. Card slider, the logo strip add-on

   Rewritten 2026-09-16, session 27. Decision D89.

   An accreditation logo band is the card slider with two changes.

       768 and up      the row WRAPS. It is not a slider at all. No chevron,
                       no lane, no paging. A school can carry three logos or
                       ten and the band simply grows another row.
       767 and down    it is a slider, and every logo takes an EQUAL SLOT.
                       Two slots to a view down to 481, one slot at 480 down.

   WHY THE SLOTS

   Measured on the build site 2026-09-16, before this change. At a 375 viewport
   the track window is 267px and each logo was its own width, 93 to 185px. So
   the window was wider than one logo and narrower than two, and the right edge
   of the track cut the second logo in half on BOTH school pages:

       IT, 10 logos    window 267, scroll width 1712. The first view showed
                       CompTIA whole and Microsoft sliced.
       HR,  3 logos    window 267, scroll width  519. The first view showed
                       QCTO whole and SAQA sliced.

   An equal slot puts the track edge on a slot boundary, so a logo is either
   wholly in the view or wholly out of it. It also makes snippet S3 exact. The
   script steps by the FIRST child's width plus the gap, which drifted badly
   against ten unequal logos and was only ever rescued by `scroll-snap-type`.

   WHY A SLOT CARRIES A HEIGHT, AND WHY THAT IS NOT A RULE 13 BREAK

   The slot sizes the box. `object-fit: contain` then fits the logo inside it,
   so a 4.4:1 wordmark and a 1.2:1 crest occupy the same box and neither one is
   ever cropped or distorted. Without the height a 1.2:1 logo in a full width
   slot at 375 renders 230px tall and owns the whole band.

   `height` HAS an Oxygen field. It is written here because it would otherwise
   be set by hand on every logo, on every school page: five schools and about
   thirty images. OXYGEN-CONVENTIONS.md section 9, "anything repeated across
   three or more places". `flex-basis` and `object-fit` have no field at all,
   and section 10 proves `flex-basis` is dropped on import.

   WHAT IS DELIBERATELY NOT HERE

   `flex-wrap`, `gap`, `align-items` and `justify-content` all have fields, and
   all three tiers are Oxygen's own breakpoints, so they live on the class
   `csa-logos__track` in the builder. Rule 13.

   They were set on the ELEMENT on both pages, which Oxygen compiles to an ID
   rule at 1,0,0. That beats every rule in this file and every class. So those
   element values MUST be cleared for the class, and this section, to do
   anything at all. STATUS.md carries the steps.

   THE 16px IN THE CALC IS THE GAP

   It has to match the `gap` set on `csa-logos__track` at Phone Landscape. CSS
   cannot read a gap, so the number is written twice. Section 17 does the same
   thing with its 20px. Change one and change the other.

   THE SELECTOR

   Section 17 sets the item width at 991 and below:

       .csa-slider .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts)

   That is 0,4,0. An item width set on a class in the builder is written at
   0,3,0 and loses, so this one cannot go in the builder. Decision D36, and
   OXYGEN-CONVENTIONS.md section 9.

   The rules below are 0,4,0 as well, so SOURCE ORDER decides between them.
   They have to stay AFTER section 17. Do not move this section up the file.
   --------------------------------------------------------------------------- */

/* ---- 768 and up, a wrapping row, not a slider --------------------------- */

/* Section 17 insets `.csa-slider` by 48px to make a lane for the two buttons.
   With no buttons on show that is 96px of the row's width given away for
   nothing, so the lane comes off with them.

   `overflow-x: auto` from section 17 is LEFT ALONE at 768 to 991, on purpose.
   A wrapped row cannot overflow, so it never fires. If the wrap is ever turned
   off on a page, the row scrolls instead of spilling out of the section, and a
   row you cannot reach is a smaller fault than a page that scrolls sideways. */
@media (min-width: 768px) {
  .csa-slider--logos .csa-slider__btn {
    display: none;
  }

  .csa-slider--logos {
    padding-left: 0;
    padding-right: 0;
  }

  /* Each logo keeps the width set on it in the builder. `flex-basis: auto`
     undoes section 17's two up basis, which runs from 991 down and would
     otherwise give each logo a share of the row at 768 to 991 instead of its
     own width. `max-width` is the safety net, because section 17 sets
     `max-width: none` at 0,4,0 over the same range. */
  .csa-slider--logos .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
    flex-basis: auto;
    max-width: 100%;
  }
}

/* ---- 767 to 481, two equal slots to a view ------------------------------ */

/* THE `justify-content` GUARD IS NOT OPTIONAL, AND IT IS NOT A STYLE CHOICE.

   Measured on the build site 2026-09-16, with ten logos at a 375 viewport.
   `justify-content: center` on a flex row that ALSO overflows centres the
   content on the container, so the overflow goes out of BOTH sides. The left
   overhang sits at a negative offset, and `scrollLeft` cannot go negative:

       first logo offset   -1206px
       min scrollLeft          0
       max scrollLeft          0

   Nine of the ten logos were unreachable, silently, with the chevrons showing
   and doing nothing. Section 17 already warns about this in its own words and
   leaves `justify-content` unset for exactly this reason.

   NOTHING IN THIS PROJECT SETS IT. The design aligns the row to the start at
   every width, and `csa-logos__track` carries no Justify content field at any
   breakpoint. A centred row at Desktop was proposed and rejected on
   2026-09-16, and the JSON no longer declares it.

   So this rule is a rail, not support for a style. It is 0,4,0, which beats
   the 0,3,0 Oxygen writes for a class, so if anyone ever sets Justify content
   on the track in the builder the value cannot reach the tier where it breaks
   scrolling. An element level value still beats it, at 1,0,0, which is the
   correct escape hatch.

   It locks the field on the track at 767 and down. That costs nothing. One
   slot fills the view, so the property has no visible effect there at all.
   Its only possible effect is the bug above.

   96px of height. At 767 a slot is about 315px wide, so the widest wordmark in
   the set, 4.4:1, is 72px tall in it and the height never binds. It binds on
   the tall marks only, which is the point of it. */
@media (max-width: 767.98px) {
  .csa-slider--logos .csa-slider__track:not(.ct-section):not(.oxy-easy-posts) {
    justify-content: flex-start;
  }

  .csa-slider--logos .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
    flex-basis: calc((100% - 16px) / 2);
    height: 96px;
    object-fit: contain;
    object-position: center;
  }
}

/* ---- 480 and down, one slot to a view ----------------------------------- */

/* Two slots at 480 leave about 178px a logo, and the 4.4:1 wordmark is 40px
   tall in that, under the 12px-equivalent floor the rest of the site holds to.
   One slot gives the same wordmark the full 372px window and 61px of height.
   Section 17 narrows the button lane at the same width, so the two flips stay
   together and there is one place to read the tier.

   80px, not 96px, because the window is now the whole track: a 1.2:1 crest at
   96px would be 116px wide against a 267px window at 375 and would sit alone
   in a band half as tall again as it needs to be. */
@media (max-width: 480px) {
  .csa-slider--logos .csa-slider__track > :not(.ct-section):not(.oxy-easy-posts) {
    flex-basis: 100%;
    height: 80px;
  }
}

/* The base net, for the wrapping tier. Section 17 overrides it at 991 and
   below, which is why the 768 block above restates it. */
.csa-logos__item {
  max-width: 100%;
  height: auto;
}

/* ---------------------------------------------------------------------------
   22. Course catalogue, the chip states and the row zebra

   Two rule sets, and nothing else. Every other value in the catalogue is a
   builder field and lives in the classes in json/hr/. Ground rule 13.

   WHY THE CHIP STATES CANNOT GO IN THE BUILDER

   Oxygen marks the active tab with a class that carries the tabs element's own
   instance number. Read off the build site 2026-09-14:

       <div class="oxy-tab tabs-8664-tab tabs-8664-tab-active">

   The 8664 changes per instance, so no stylesheet can name that class and no
   builder field targets it either. Snippet S5 mirrors the state onto
   `aria-selected`, which is both the correct ARIA and a stable hook, and that
   is what these rules key off.

   The instance class is kept as a SECOND selector, matched loosely. If S5 is
   off, or fails, the active chip still looks active. It is scoped to
   `.csa-chip`, so it cannot match anything else on the page.
   --------------------------------------------------------------------------- */

/* A tab is a div, so it does not get a pointer on its own. This is the one
   value here that MIGHT have an Oxygen field. If it does, move it to the
   builder and delete this rule. */
.csa-chip {
  cursor: pointer;
  transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}

.csa-chip[aria-selected="true"],
.csa-chip[class*="-tab-active"] {
  color: #ffffff;
  background-color: #ff3364;
  border-color: #ff3364;
}

.csa-chip[aria-selected="true"] .csa-chip__count,
.csa-chip[class*="-tab-active"] .csa-chip__count {
  color: #ff3364;
  background-color: #ffebf0;
}

/* The design gives the chip no hover state at all. This is invented, and it
   is deliberately slight: the border and the label only. It is due for design
   review with the other three on the blocker B10 list. */
.csa-chip:hover:not([aria-selected="true"]):not([class*="-tab-active"]) {
  color: #0d2651;
  border-color: #ffaee0;
}

/* The chip is the control that reveals the courses, so it needs a visible
   focus ring. The ring in css/02-base.css is scoped to the header and the
   footer, so it does not reach here. */
.csa-chip:focus-visible {
  outline: 2px solid #ff94cc;
  outline-offset: 2px;
}

/* ---- the specification rows ---------------------------------------------

   Rows 1, 3, 5 and 7 carry the darker fill, which is what the design draws:
   Entry requirements is striped, Language requirements is not. The even rows
   need no rule, because they show the card's own background through.

   `:nth-child` has no builder field, which is why this is here. It also means
   the stripes stay correct when the row count changes, and a short course
   card has a different row set from an accredited one.

   The rows have their own wrapper, `.csa-course-card__rows`, so the count
   starts at the first row and is not thrown off by the card head. */

.csa-course-card__row:nth-child(odd) {
  background-color: #d7eaff;
}

/* ---- the card foot ------------------------------------------------------

   `margin-top: auto` on `.csa-course-card__foot` is what holds the price row
   and the button to the bottom of the card, so two cards in a row end on the
   same line however long their blurbs are.

   IT IS NOT WRITTEN HERE, ON PURPOSE. It was, for about ten minutes, on the
   wrong conclusion that the builder could not express it. It can:
   `auto` is a UNIT in the Oxygen margin field, not a value. Pick it in
   the unit dropdown next to the number and it works. Rule 13 therefore keeps
   it in the builder, and a rule here would lock the field.

   It is set on the class in the builder, by hand, because the JSON cannot
   carry it yet. See OXYGEN-CONVENTIONS.md section 10. */

/* ---- the card button ----------------------------------------------------

   Hover, focus and the transition only. The pink, the radius and the padding
   are all builder fields and are in json/hr/panel-*.json. The hover colour is
   the same one `.csa-btn--primary` uses in section 1, so the two agree. */

.csa-course-card__cta,
.csa-course-card__cta-label,
.csa-course-card__cta-icon {
  transition: background-color 0.2s ease, color 0.2s ease;
}

.csa-course-card__cta:hover,
.csa-course-card__cta:focus-visible {
  background-color: #e51f4f;
}

.csa-course-card__cta:focus-visible {
  outline: 2px solid #ff94cc;
  outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
  .csa-chip,
  .csa-course-card__cta,
  .csa-course-card__cta-label,
  .csa-course-card__cta-icon {
    transition: none;
  }
}


/* ---------------------------------------------------------------------------
   23. Course card, the mobile layout

   The signed off mobile design, Figma `147:3` closed and `147:39` open.

   THE SPEC BLOCK WEARS NO `csa-accordion__*` CLASS, and that is the whole
   point of this section. The first attempt reused them for the mechanism and
   inherited the FAQ's LOOK with it: section 19 puts `background: #ffffff`, a
   1px `#eef0f5` border and an 8px radius on `.csa-accordion__item`, and
   `padding: 16px 24px` plus a radius on `.csa-accordion__q`. On the course
   card that showed as white rows on BOTH tiers, the wrong radius on the
   requirements block and a badly inset bar. Confirmed on the site 2026-09-16.

   So the card has `csa-spec*` classes of its own and snippet S4 was taught to
   recognise them. The panel mechanics below are therefore duplicated from
   section 19 rather than inherited. That duplication is deliberate: it is what
   keeps the FAQ band and the course card from styling each other.

   WHAT IS NOT HERE. The bar's fill, radius and padding, the tiles, the row
   weights, the foot and the price placement are all builder fields and live in
   `json/hr/panel-*.json`. Ground rule 13.

   THE BAR'S `display` IS NOT HERE EITHER, and it must not be. Oxygen writes a
   display set on a class at 0,3,0, so a `@media` rule here at 0,2,0 loses and
   the bar stayed visible on desktop. It is `none` by default and `flex` at
   Phone Landscape, both set in the JSON. Section 10.
   --------------------------------------------------------------------------- */

/* ---- the bar is hidden from 768 up -------------------------------------

   `!important`, and it is the one place in this project that earns it.

   Two things were tried first and both failed, measured on the site:

   1. A plain `@media (min-width: 768px) { ... display: none }`. Oxygen writes
      a display set on a class at 0,3,0, through its
      `:not(.ct-section):not(.oxy-easy-posts)` triple, so a 0,2,0 rule here
      loses and the bar stayed visible on desktop.
   2. `display: none` as the BASE value in the JSON with `flex` at Phone
      Landscape. Oxygen dropped the base `none` and emitted
      `.csa-spec__bar{display:flex}` with no media query at all.

   Oxygen's own breakpoints are all max-width, so the builder cannot express
   "768 and up" either. That leaves this. Section 10.

   THE SELECTOR IS FOUR CLASSES DEEP FOR A REASON. A plain
   `.csa-spec__bar { display: none !important }` is 0,1,0 and STILL lost,
   because between two `!important` declarations specificity is compared
   before source order, and Oxygen's is 0,3,0. This is 0,4,0. Caught in
   preview/course-card.html at a real 1100px viewport, which is the third time
   this same rule has bitten on this component. */

@media (min-width: 768px) {
  .csa-course-card .csa-spec .csa-spec__item > .csa-spec__bar {
    display: none !important;
  }
}

/* ---- the collapsing panel ----------------------------------------------

   Same mechanism as section 19: the panel animates `grid-template-rows` from
   `0fr` to `1fr`, so nothing has to be measured and it survives every resize.
   `align-items: stretch` overrides Oxygen's `flex-start`, which otherwise
   sizes the row to its content instead of to the 0fr track and stops the
   panel closing at all. */

.csa-spec__panel {
  display: grid;
  grid-template-rows: 1fr;
  align-items: stretch;
  width: 100%;
  transition: grid-template-rows 0.3s ease;
}

html.csa-js .csa-spec__panel {
  grid-template-rows: 0fr;
}

html.csa-js .csa-spec__item.is-open .csa-spec__panel {
  grid-template-rows: 1fr;
}

/* Held open from 768 up, where the bar is hidden and the card shows its whole
   specification list. 0,3,1 against the 0,2,1 above, so it wins. Snippet S4
   also leaves a spec item open and never marks it `inert` up here, because CSS
   cannot undo `inert`. If you change this breakpoint, change the matchMedia
   query in S4 with it. */
@media (min-width: 768px) {
  html.csa-js .csa-spec__panel {
    grid-template-rows: 1fr;
  }
}

/* `display: block` on purpose. It is the grid child, and blocking it out of
   Oxygen's flex column removes every inherited flex rule in one line. */
.csa-spec__panel-inner {
  display: block;
  overflow: hidden;
  min-height: 0;
}

/* ---- the toggle -------------------------------------------------------- */

/* The row is a real <button>, so the browser's own chrome comes off. There is
   no Oxygen field for `appearance`. */
.csa-spec__bar {
  appearance: none;
  -webkit-appearance: none;
  border: 0;
  margin: 0;
  cursor: pointer;
  font-family: inherit;
}

.csa-spec__bar:focus-visible {
  outline: 2px solid #ff3364;
  outline-offset: -2px;
}

/* The toggle is `code-blocks/icons/faq-toggle.html`, the SAME icon the FAQ
   band uses. An earlier version shipped an invented 16px circle, which was
   wrong: there was no reason to draw a second one.

   Section 19 already styles `.csa-accordion__disc` and `.csa-accordion__arrow`
   in their resting state, and those rules are not scoped to an item, so they
   apply here for free. Only the OPEN state needs re-scoping, because section
   19 hangs it off `.csa-accordion__item.is-open` and the card's item is
   `.csa-spec__item`. The two rules below are that, and nothing else.

   The tap target: the icon is 21px, which is half a usable one. The SVG keeps
   its size and a pseudo-element carries the hit area out to 44px, centred on
   it. Same trick as the slider dots in section 17b: an 8px dot inside a 24px
   button. Agreed 2026-09-15. */
.csa-spec__icon {
  position: relative;
  display: block;
  flex-shrink: 0;
}

/* Pink disc, pale arrow, flipped. Identical to the FAQ band. The arrow's
   `transform-box` and `transform-origin` come from section 19. */
.csa-spec__item.is-open .csa-accordion__disc {
  fill: #ff3364;
}

.csa-spec__item.is-open .csa-accordion__arrow {
  fill: #eef0f5;
  transform: scaleY(-1);
}

.csa-spec__icon::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 44px;
  height: 44px;
  transform: translate(-50%, -50%);
}

/* The last row's fill and its divider ran past the item's rounded corners,
   because a 10px radius on a parent does not clip a child on its own.

   `overflow: hidden` is in the stylesheet rather than the JSON because it is
   not a field this project has seen Oxygen keep, and a value Oxygen drops
   fails silently. If you find an Overflow field in the builder, move it there
   and delete this: it belongs with the radius, which IS a builder value.
   Reported 2026-09-16. */
.csa-spec__item {
  overflow: hidden;
}

/* ---- the panel rows at mobile ------------------------------------------

   THERE IS NO ZEBRA ON MOBILE. Measured off 147:39 on 2026-09-16 by scanning
   a column clear of text: the panel is a uniform #d7eaff from the header down
   to the bottom border, broken only by 1px dividers. Section 22's `odd` rule
   is a DESKTOP rule and has to be switched off here.

   Three rounds were spent trying to re-alternate six visible rows out of
   eight. That work was wrong from the start: the design never striped them.

   The dividers sit BETWEEN rows only, not above the first and not under the
   header. Five of them for six rows, counted in the frame. `+` gives exactly
   that with no nth-child arithmetic and no assumption about which rows are
   hidden. */
@media (max-width: 767.98px) {

  .csa-course-card__rows > .csa-course-card__row {
    background-color: transparent;
  }

  .csa-course-card__rows > .csa-course-card__row + .csa-course-card__row {
    border-top: 1px solid #c9dcf3;
  }

  /* Course duration and Registration open are the two stat tiles up top, so
     their rows come out of the list.

     THE SELECTOR IS LONG ON PURPOSE. Oxygen writes `display: flex !important`
     on `.csa-course-card__row:not(.ct-section):not(.oxy-easy-posts)`, which is
     0,3,0. Between two `!important` declarations SPECIFICITY is compared
     first and source order only breaks a tie, so a 0,2,0 rule here lost no
     matter where it sat in the file. This is 0,4,0 and wins outright.

     Both of those were caught in preview/course-card.html, which reported
     eight visible rows where the design has six. On the build site it would
     have cost another paste and another cache regeneration to find. */
  .csa-course-card .csa-course-card__rows > .csa-course-card__row.csa-course-card__row--tiled {
    display: none !important;
  }
}

/* The icon's own transitions belong to `.csa-accordion__disc` and
   `.csa-accordion__arrow`, which section 19 already covers here. */
@media (prefers-reduced-motion: reduce) {
  .csa-spec__panel {
    transition: none;
  }
}

/* --------------------------------------------------------------------------
   24. Two column content band, the simple pages

   Built 2026-09-17, session 30, for `/workplace-training/`. It is in this
   file and not in a page file because the alternating two-column band is the
   pattern for the fifteen simple pages, not a Workplace training one-off.
   Decision D34 and `OXYGEN-CONVENTIONS.md` section 5.

   TWO RULES LIVE HERE AND NOTHING ELSE. The layout, the gaps, the colours,
   the radius and the type are all on the classes in
   `json/workplace-training/two-col.json`, so every one of them stays a live
   builder field. Ground rule 13, decision D62.

   WHY EACH ONE IS ALLOWED, `OXYGEN-CONVENTIONS.md` section 9:

     aspect-ratio   there is no field for it, and it is the only way to give
                    five files of four different shapes one row height.
     min-width      `min-width: 0` is a key Oxygen DROPS, measured on
                    `csa-course-card` in section 10, so it cannot go in the
                    JSON. See the paragraph below for why it is needed at all.
     the `<ul>`     it is a descendant of a Text Block's content, and no
                    builder field reaches inside it: the Text Block's own
                    padding field lands on the block, not on the list.
                    `.csa-accordion__a ul` in section 19 is the precedent.

   WHY `min-width: 0`. Measured on the build site 2026-09-17, after the first
   paste. AN `<img>` IS A REPLACED ELEMENT, AND AS A FLEX ITEM ITS AUTOMATIC
   MINIMUM SIZE IS ITS INTRINSIC WIDTH. So `min-width: auto` resolved to
   1200px and clamped `width: 100%`, and `flex-shrink: 1` could not pull it
   back. Both columns sat at their min-content width and the row overflowed:

       natural              image 1200px, text column 107 to 140px,
                            page overflow 29px, at a 1440 viewport
       with min-width: 0    every row 614 / 614, page overflow 0

   Below 768 the row is a column, so the image is not competing for width and
   the tier was always correct: 335 x 223 at a 375 viewport, no overflow.

   THIS IS THE LIMIT OF THE TWO-EQUAL-COLUMNS PATTERN IN SECTION 10. That
   pattern was proven on two DIVS, where min-content is the text. It does not
   carry to a replaced element, and `flex-basis` and `min-width` are both
   dropped keys, so there is no JSON-only way to express it. The alternative
   is to wrap the image in a Div and put the flex sizing on the Div; this is
   one line against one more element and another paste.

   `width`, `border-radius`, `display` and `object-fit` are NOT here. They are
   on `.csa-twocol__media` in the builder, because the photograph is a real
   Image element. The first cut of this band used a Code Block holding an
   `<img>`, which cannot be reached from the builder and therefore needed all
   four of them in CSS. On review the media ids turned out to be
   readable off `/wp-json/`, and the element replaced the Code Block. Three
   rules came out of this file as a result.

   THE ASPECT RATIO IS OURS, NOT LIVE'S. Live serves 2:1 body art. The five
   supplied files are 1.36, 1.50, 1.50, 1.50 and 1.60, so uniform rows need one ratio.
   3:2 was chosen because it is three of the five untouched: the 1.36 file
   loses 9.3 per cent of its height and the 1.60 file 6.5 per cent of its
   width. A 2:1 box would have cropped every one of them by 25 to 35 per cent.
   -------------------------------------------------------------------------- */

.csa-twocol__media {
  aspect-ratio: 3 / 2;
  min-width: 0;
}

/* 32px of indent and the disc are live's own, measured 2026-09-17. The
   bullet spacing is 8px, against live's 0, because live's list items are one
   line each and three of ours wrap to two. */
.csa-twocol__list ul {
  margin: 0;
  padding-left: 32px;
  list-style: disc outside;
}

.csa-twocol__list li + li {
  margin-top: 8px;
}

/* --------------------------------------------------------------------------
   25. Policy cards, the Policies page

   Built 2026-09-18, session 32, for `/policies/`, post 36. It is in this file
   and not in a page stylesheet because a grid of icon-and-label links is a
   pattern, not a Policies one-off: `/student-services/` and `/sitemap/` are
   the same shape on live. Decision D34 and `OXYGEN-CONVENTIONS.md` section 5.

   TWO RULES LIVE HERE AND NOTHING ELSE. The gap, the card layout, the icon
   size, the colours and the type are all on the classes in
   `json/policies/policy-cards.json`, so every one of them stays a live
   builder field. Ground rule 13, decision D62.

   WHY EACH ONE IS ALLOWED, `OXYGEN-CONVENTIONS.md` section 9:

     the grid    `grid-template-columns` is a key Oxygen DOES NOT STORE.
                 Measured on `csa-cards` and written up in section 10: it
                 lands in the plain 0,1,0 rule where Oxygen's own
                 `repeat(1, minmax(200px, 1fr))` beats it, and the row
                 renders as one column. There is no field for it, so there is
                 no way to express this layout in the JSON.
     the hover   Live has NO hover and NO focus style on these ten links at
                 all, measured 2026-09-18. That is a defect, not a thing to
                 copy: ten links that give no feedback. Oxygen's state
                 handling is limited, so it belongs here.

   WHY 0,3,0 AND NOT A PLAIN CLASS. `display` and `gap` are flex and grid
   keys, so Oxygen compiles them into its own three-selector rule at 0,3,0,
   decision D36, and it puts `!important` on `display`. The grid's gap IS set
   in the builder, so that rule exists on this class. A plain 0,1,0 rule here
   would lose to any grid default Oxygen decides to write alongside the gap.
   Matching 0,3,0 wins on source order, because Oxygen writes our stylesheets
   after its own output into the same `universal.css`. `display: grid` is
   stated for the same reason and costs nothing if Oxygen never fights it.

   THE TIERS ARE OXYGEN'S OWN, 991 and 767, not the 992 and 768 that
   `04-typography.css` uses. That is deliberate here: the gap steps down at
   Oxygen's `phone-landscape` in the JSON, so the column count has to step at
   the same pixel or there is one width that gets a 64px gap on a single
   column. 4 / 2 / 1 was chosen on 2026-09-18. Live holds 4 columns to 767,
   which puts a card in about 160px at a 1024 viewport.

   NO FONT SIZE IS SET HERE. Ground rule 18. The card title is an h2 that
   needs 20px rather than Global Styles' 36px, and that 20px is on
   `csa-policies__title` in the JSON, where the builder can reach it.
   -------------------------------------------------------------------------- */

.csa-policies__grid:not(.ct-section):not(.oxy-easy-posts) {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

@media (max-width: 991px) {
  .csa-policies__grid:not(.ct-section):not(.oxy-easy-posts) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 767px) {
  .csa-policies__grid:not(.ct-section):not(.oxy-easy-posts) {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* The hover and focus state. `csa-policies__title` sets its colour at 0,1,0,
   because a colour is not a flex key and Oxygen puts it in the plain rule, so
   0,3,0 here is comfortable. The transition sits on the title rather than the
   card so nothing else on the card animates by accident. */
.csa-policies__card .csa-policies__title {
  transition: color 0.15s ease-in-out;
}

.csa-policies__card:hover .csa-policies__title,
.csa-policies__card:focus-visible .csa-policies__title {
  color: var(--csa-pink);
}

/* A visible keyboard ring. The card has no padding, so the outline is offset
   to keep it off the icon and the text. */
.csa-policies__card:focus-visible {
  outline: 2px solid var(--csa-pink);
  outline-offset: 4px;
}

/* --------------------------------------------------------------------------
   26. Search results, the results grid, the filters and the pagination

   Built 2026-09-28 for the Search Results template, post 324. Rewritten
   2026-09-29: each result is now the shared `csa-course-listing-card`, the
   snippet "CSA - course listing card", styled in the block after this one.
   Every `csa-result*` rule came out with the elements it styled. What is left
   here is the page around the card.

   WHY EACH RULE IS ALLOWED, `OXYGEN-CONVENTIONS.md` section 9:

     the grid        `grid-template-columns` is a key Oxygen does not store,
                     section 10. Section 25's pattern. The gap stays on the
                     class in the builder. A grid places cards in order, so an
                     odd last card takes the FIRST column of its row and never
                     sits in the middle. Decided 2026-09-28.
     equal heights   The Code Block inside each repeater item has no class, and
                     the card inside it is snippet output, so no builder field
                     reaches either.
     the filters     Shortcode output. The builder cannot see inside it.
     the pagination  Oxygen generates it inside the Repeater, with no element
                     of its own in the structure panel.
     the hovers      State handling.

   NO HEADING SIZE IS SET HERE. Ground rule 18. The font sizes below are on a
   select and the page numbers, neither of which the builder can reach.
   -------------------------------------------------------------------------- */

/* The grid. Two up to 992, one up below. 991 is Oxygen's Tablet, so the gap
   step on the class in the JSON and the column step here land on one pixel. */
.csa-results__list:not(.ct-section):not(.oxy-easy-posts) {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

@media (max-width: 991px) {
  .csa-results__list:not(.ct-section):not(.oxy-easy-posts) {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* Equal heights. The grid stretches each repeater item to its row, but the
   item is an Oxygen Div, a column with `align-items: flex-start`, and the
   Code Block and the card inside it kept their own content height. Measured
   2026-09-29: two cards in one row at 206 and 228px. This passes the row
   height down, so both cards in a row end on the same line and the price
   and button sit on one baseline. Scoped to this list, so the School pages,
   where the card sits straight in `csa-course-listing-grid`, are untouched. */
.csa-results__list > .ct-div-block {
  align-items: stretch;
}

.csa-results__list > .ct-div-block > .ct-code-block {
  display: flex;
  flex-direction: column;
  flex-grow: 1;
}

.csa-results__list > .ct-div-block > .ct-code-block > .csa-course-listing-card {
  flex-grow: 1;
}

/* The filter pills. 219:58 to 219:61: #e1f3ff, 43 high, fully round, 16px
   medium navy, the design's own chevron. `#e1f3ff` is the at-a-glance
   panel's blue, D91, which has no token. Written at 0,3,2 so WooCommerce's
   form rules, which reach bare fields inside `.woocommerce`, cannot win. D99. */
.csa-results__filters form.csa-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

/* The chevron lives on the FIELD, not the select. A select cannot carry a
   pseudo-element, and a background image cannot rotate, so the wrapper's
   `::after` draws it and turns it. 20px either side of the pill: 20 of
   padding on the left, and on the right 20 to the chevron's edge, the 12px
   chevron and 8px back to the text, which is the 40 of right padding. */
.csa-results__filters form.csa-filters .csa-filters__field {
  position: relative;
}

@media (max-width: 480px) {
  .csa-results__filters form.csa-filters {
    gap: 12px;
  }

  .csa-results__filters form.csa-filters .csa-filters__field {
    width: 100%;
  }
}

/* The pagination. It renders INSIDE the Repeater, so it is a grid item and
   must span both columns. Its look is section 27's, shared with the School pages. 48px under the last card is the design's: the
   34px gap plus 14. */
.csa-results__list > .oxy-repeater-pages-wrap {
  grid-column: 1 / -1;
  margin-top: 14px;
}

/* The empty state. */
.csa-results__empty-text {
  margin: 0 0 12px;
}

.csa-results__empty-link {
  color: var(--csa-pink);
  font-weight: 600;
  text-decoration: underline;
}

/* --------------------------------------------------------------------------
   26b. Search results, the filter pills and panels

   [csa_course_filters], the snippet "CSA - course filters". Each filter is a
   native <details>: the <summary> is the pill, the panel holds the options as
   radios, "Clear filter" when the filter is set, and "Clear all filters"
   follows the pills. Modelled on Udemy's filter panels.

   THE PILL IS UNCHANGED from section 26's select: #e1f3ff, 43 high, fully
   round, 16px medium navy, 20px either side of the text and the design's own
   chevron 20px from the right, pink and turned when open. Every pill has a
   thin border a shade darker than its fill; a set filter's border is navy.
   Both are inset shadows, so the pill keeps its size.

   Section 9: the whole control is snippet output, so no builder field
   reaches it. Every selector starts at `.csa-results__filters form.csa-filters`
   so WooCommerce's form rules, which reach bare fields inside `.woocommerce`,
   cannot win. D99.

   No `:has()` dependency for anything that matters: the bold checked option
   uses it, and an older browser simply shows it at normal weight.
   -------------------------------------------------------------------------- */

.csa-results__filters form.csa-filters {
  position: relative;
  align-items: center;
}

.csa-results__filters form.csa-filters .csa-filters__field {
  position: relative;
}

/* The pill. */
.csa-results__filters form.csa-filters .csa-filters__toggle {
  position: relative;
  display: flex;
  align-items: center;
  box-sizing: border-box;
  height: 43px;
  padding: 0 40px 0 20px;
  border-radius: 50px;
  background-color: #e1f3ff;
  box-shadow: inset 0 0 0 1px #b5d3ea;
  color: var(--csa-navy);
  font-family: inherit;
  font-size: 16px;
  font-weight: 500;
  line-height: 1;
  white-space: nowrap;
  list-style: none;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent;
}

/* The disclosure triangle every browser draws by default. Safari needs its own rule. */
.csa-results__filters form.csa-filters .csa-filters__toggle::-webkit-details-marker {
  display: none;
}

.csa-results__filters form.csa-filters .csa-filters__toggle::marker {
  content: "";
}

.csa-results__filters form.csa-filters .csa-filters__toggle::after {
  content: "";
  position: absolute;
  top: 50%;
  right: 20px;
  width: 12px;
  height: 12px;
  margin-top: -6px;
  background-image: url("data:image/svg+xml,%3Csvg preserveAspectRatio='none' overflow='visible' style='display: block;' width='12' height='12.0027' viewBox='0 0 12 12.0027' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg id='Closed Arrow'%3E%3Cpath id='Vector' d='M12 6.00133C12 6.39381 11.9655 6.78762 11.886 7.17083C11.8078 7.55934 11.6937 7.93459 11.5452 8.29658C11.3927 8.66387 11.2097 9.00862 10.991 9.33481C10.7722 9.66232 10.5242 9.96332 10.2444 10.2431C9.96466 10.5229 9.65968 10.7708 9.33217 10.9896C9.00466 11.2084 8.65991 11.3954 8.29792 11.5439C7.93062 11.6964 7.55537 11.8104 7.17217 11.8846C6.78366 11.9629 6.39515 12.0027 6.00267 12.0027C5.61018 12.0027 5.21637 11.9629 4.82786 11.8846C4.44333 11.8104 4.06808 11.6964 3.70211 11.5439C3.34013 11.3954 2.99537 11.2084 2.66786 10.9896C2.34035 10.7708 2.03537 10.5229 1.75559 10.2431C1.48112 9.96332 1.23184 9.66232 1.00908 9.33481C0.790291 9.00729 0.607307 8.66254 0.454821 8.29658C0.306313 7.93459 0.19228 7.55934 0.114048 7.17083C0.0397936 6.7863 1.45435e-05 6.39381 1.45435e-05 6.00133C1.45435e-05 5.60884 0.0397936 5.21503 0.114048 4.83182C0.19228 4.44331 0.306313 4.06807 0.454821 3.70608C0.607307 3.34409 0.790291 2.99403 1.00908 2.66785C1.23184 2.34033 1.48112 2.03934 1.75559 1.75956C2.03537 1.47978 2.34035 1.23182 2.66786 1.01304C2.99537 0.794254 3.34013 0.611271 3.70211 0.458784C4.06808 0.306298 4.44466 0.192265 4.82786 0.118011C5.21637 0.039779 5.60488 0 6.00267 0C6.40046 0 6.78366 0.039779 7.17217 0.118011C7.5567 0.192265 7.93195 0.306298 8.29792 0.458784C8.65991 0.611271 9.00466 0.794254 9.33217 1.01304C9.65968 1.23182 9.96466 1.47978 10.2444 1.75956C10.5242 2.03934 10.7722 2.34033 10.991 2.66785C11.2097 2.99536 11.3927 3.34409 11.5452 3.70608C11.6937 4.06807 11.8078 4.44331 11.886 4.83182C11.9642 5.21635 12 5.60884 12 6.00133Z' fill='%230D2651'/%3E%3Cpath id='Vector_2' d='M9.25673 4.9054L6 8.6067L2.74326 4.9054H9.25673Z' fill='white'/%3E%3C/g%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-size: 12px 12px;
  pointer-events: none;
  transition: transform 0.2s ease;
}

/* Open: turned and pink, as the header menu's chevron does on hover. */
.csa-results__filters form.csa-filters .csa-filters__field[open] > .csa-filters__toggle::after {
  transform: rotate(180deg);
  background-image: url("data:image/svg+xml,%3Csvg preserveAspectRatio='none' overflow='visible' style='display: block;' width='12' height='12.0027' viewBox='0 0 12 12.0027' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg id='Closed Arrow'%3E%3Cpath id='Vector' d='M12 6.00133C12 6.39381 11.9655 6.78762 11.886 7.17083C11.8078 7.55934 11.6937 7.93459 11.5452 8.29658C11.3927 8.66387 11.2097 9.00862 10.991 9.33481C10.7722 9.66232 10.5242 9.96332 10.2444 10.2431C9.96466 10.5229 9.65968 10.7708 9.33217 10.9896C9.00466 11.2084 8.65991 11.3954 8.29792 11.5439C7.93062 11.6964 7.55537 11.8104 7.17217 11.8846C6.78366 11.9629 6.39515 12.0027 6.00267 12.0027C5.61018 12.0027 5.21637 11.9629 4.82786 11.8846C4.44333 11.8104 4.06808 11.6964 3.70211 11.5439C3.34013 11.3954 2.99537 11.2084 2.66786 10.9896C2.34035 10.7708 2.03537 10.5229 1.75559 10.2431C1.48112 9.96332 1.23184 9.66232 1.00908 9.33481C0.790291 9.00729 0.607307 8.66254 0.454821 8.29658C0.306313 7.93459 0.19228 7.55934 0.114048 7.17083C0.0397936 6.7863 1.45435e-05 6.39381 1.45435e-05 6.00133C1.45435e-05 5.60884 0.0397936 5.21503 0.114048 4.83182C0.19228 4.44331 0.306313 4.06807 0.454821 3.70608C0.607307 3.34409 0.790291 2.99403 1.00908 2.66785C1.23184 2.34033 1.48112 2.03934 1.75559 1.75956C2.03537 1.47978 2.34035 1.23182 2.66786 1.01304C2.99537 0.794254 3.34013 0.611271 3.70211 0.458784C4.06808 0.306298 4.44466 0.192265 4.82786 0.118011C5.21637 0.039779 5.60488 0 6.00267 0C6.40046 0 6.78366 0.039779 7.17217 0.118011C7.5567 0.192265 7.93195 0.306298 8.29792 0.458784C8.65991 0.611271 9.00466 0.794254 9.33217 1.01304C9.65968 1.23182 9.96466 1.47978 10.2444 1.75956C10.5242 2.03934 10.7722 2.34033 10.991 2.66785C11.2097 2.99536 11.3927 3.34409 11.5452 3.70608C11.6937 4.06807 11.8078 4.44331 11.886 4.83182C11.9642 5.21635 12 5.60884 12 6.00133Z' fill='%23FF3364'/%3E%3Cpath id='Vector_2' d='M9.25673 4.9054L6 8.6067L2.74326 4.9054H9.25673Z' fill='white'/%3E%3C/g%3E%3C/svg%3E");
}

.csa-results__filters form.csa-filters .csa-filters__toggle:focus-visible {
  outline: 1px solid #869bb9;
  outline-offset: 2px;
}

/* A set filter: the same border, navy. */
.csa-results__filters form.csa-filters .csa-filters__field.is-set > .csa-filters__toggle {
  box-shadow: inset 0 0 0 1.5px var(--csa-navy);
}

/* The panel. Below the pill and at least as wide as it; leftwards when it would run off the right. */
.csa-results__filters form.csa-filters .csa-filters__panel {
  position: absolute;
  top: calc(100% + 8px);
  left: 0;
  z-index: 30;
  box-sizing: border-box;
  min-width: 100%;
  width: max-content;
  max-width: min(340px, calc(100vw - 40px));
  padding: 8px;
  border: 1px solid var(--csa-border-card);
  border-radius: var(--csa-radius-card-sm);
  background-color: var(--csa-white);
  box-shadow: 0 10px 24px rgba(13, 38, 81, 0.12);
}

.csa-results__filters form.csa-filters .csa-filters__field.is-flipped > .csa-filters__panel {
  left: auto;
  right: 0;
}

.csa-results__filters form.csa-filters .csa-filters__options {
  min-width: 0;
  max-height: 320px;
  margin: 0;
  padding: 0;
  border: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
}

/* An option: a 44px tap target, the radio in the site's pink. */
.csa-results__filters form.csa-filters .csa-filters__option {
  display: flex;
  align-items: center;
  gap: 12px;
  box-sizing: border-box;
  min-height: 44px;
  margin: 0;
  padding: 10px 12px;
  border-radius: 10px;
  color: var(--csa-navy);
  font-size: 16px;
  font-weight: 400;
  line-height: 1.3;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.csa-results__filters form.csa-filters .csa-filters__option:hover,
.csa-results__filters form.csa-filters .csa-filters__option:focus-within {
  background-color: var(--csa-surface-grey);
}

/* The radio is drawn here, not left native, so it looks the same on every browser and so the
   site's WooCommerce radio rule (`.woocommerce input[type="radio"]`, 0,2,1, a 24px radio whose
   checked dot is an 8px inset shadow) cannot fill an 18px one solid. A navy ring; chosen, a pink
   ring with a pink dot. */
.csa-results__filters form.csa-filters .csa-filters__option input[type="radio"] {
  -webkit-appearance: none;
  appearance: none;
  flex-shrink: 0;
  box-sizing: border-box;
  width: 18px;
  height: 18px;
  margin: 0;
  border: 1.5px solid var(--csa-navy);
  border-radius: 50%;
  background: var(--csa-white);
  box-shadow: none;
  outline: none;
  cursor: pointer;
}

.csa-results__filters form.csa-filters .csa-filters__option input[type="radio"]:checked {
  border-color: var(--csa-pink);
  background: var(--csa-pink);
  box-shadow: inset 0 0 0 3px var(--csa-white);
}

.csa-results__filters form.csa-filters .csa-filters__option input[type="radio"]:focus-visible {
  outline: 1px solid #869bb9;
  outline-offset: 2px;
}

.csa-results__filters form.csa-filters .csa-filters__option:has(input:checked) {
  font-weight: 600;
}

/* "Clear filter", under the options. */
.csa-results__filters form.csa-filters .csa-filters__clear {
  display: flex;
  align-items: center;
  gap: 8px;
  box-sizing: border-box;
  width: 100%;
  min-height: 44px;
  margin: 6px 0 0;
  padding: 10px 12px;
  border: 0;
  border-top: 1px solid var(--csa-border-card);
  border-radius: 0;
  background: none;
  color: var(--csa-pink);
  font-family: inherit;
  font-size: 15px;
  font-weight: 600;
  line-height: 1.3;
  text-align: left;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.csa-results__filters form.csa-filters .csa-filters__clear::before {
  content: "\00D7";
  font-size: 20px;
  font-weight: 400;
  line-height: 1;
}

/* "Clear all filters", after the pills, in the empty state's link style. */
.csa-results__filters form.csa-filters .csa-filters__clear-all {
  display: inline-flex;
  align-items: center;
  height: 43px;
  margin: 0;
  padding: 0 4px;
  border: 0;
  background: none;
  color: var(--csa-pink);
  font-family: inherit;
  font-size: 15px;
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 3px;
  cursor: pointer;
}

.csa-results__filters form.csa-filters .csa-filters__clear:focus-visible,
.csa-results__filters form.csa-filters .csa-filters__clear-all:focus-visible {
  outline: 1px solid #869bb9;
  outline-offset: 2px;
}

/* Without JavaScript: an "Any …" option per panel and an Apply button. With it, neither. */
.csa-results__filters form.csa-filters .csa-filters__submit {
  height: 43px;
  padding: 0 20px;
  border: 0;
  border-radius: 50px;
  background-color: var(--csa-cta-bg);
  color: var(--csa-white);
  font-family: inherit;
  font-size: 15px;
  font-weight: 500;
  cursor: pointer;
}

html.csa-js .csa-results__filters form.csa-filters .csa-filters__option--any,
html.csa-js .csa-results__filters form.csa-filters .csa-filters__submit {
  display: none;
}

/* Phones: one pill per line, as before, and the panel the pill's full width. */
@media (max-width: 480px) {
  .csa-results__filters form.csa-filters .csa-filters__field {
    width: 100%;
  }

  .csa-results__filters form.csa-filters .csa-filters__panel,
  .csa-results__filters form.csa-filters .csa-filters__field.is-flipped > .csa-filters__panel {
    left: 0;
    right: 0;
    width: auto;
    max-width: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .csa-results__filters form.csa-filters .csa-filters__toggle::after {
    transition: none;
  }
}

/* --------------------------------------------------------------------------
   26c. Search results, when nothing matches

   The snippet "CSA - search fallback": the "Showing results for" line after
   the filters on a corrected search, and [csa_search_fallback] in the empty
   state (Closest matches, then Trending courses or Recommended for you). The cards are section 27's `csa-course-listing-grid`.

   Section 9: all of it is snippet output, so no builder field reaches it.
   No heading size is set (ground rule 18): the section titles are plain h2s
   and take the site's global H2.
   -------------------------------------------------------------------------- */

.csa-search-notice {
  margin: 20px 0 0;
  color: var(--csa-navy);
  font-size: 16px;
  line-height: 1.5;
}

.csa-search-notice a {
  color: var(--csa-pink);
  font-weight: 600;
  text-decoration: underline;
}

.csa-search-fallback__section {
  margin-top: 48px;
}

.csa-search-fallback__title {
  margin: 0 0 24px;
}

/* --------------------------------------------------------------------------
   27. Course listing card, the School archives and Search Results

   The card `csa_course_listing_card()` returns, from the Code Snippet
   "CSA - course listing card". Not the Related courses card on a course page,
   which is styled differently on purpose. Values are the School archive's,
   copied from the CSS of Code Block #128 in the School templates.

   WHY A STYLESHEET IS ALLOWED, `OXYGEN-CONVENTIONS.md` section 9: the card is
   the output of a snippet, plain HTML with no Oxygen element in it, so there
   is no builder field for any of it and nothing here can lock one. Rule 13 is
   not in play.

   NO HEADING SIZE IS SET HERE. Ground rule 18. The title is an h3 and takes
   18px from Oxygen Global Styles, stepping through 04-typography.css. The
   font sizes below are on the excerpt, the price, the button and the badge.

   The price answers Oxygen Elements for WooCommerce's rule on
   `.woocommerce-Price-amount`, which paints the inner element black on every
   WooCommerce page, as the search results card does.
   -------------------------------------------------------------------------- */

.csa-course-listing-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 24px;
  width: 100%;
}

@media (max-width: 992px) {
  .csa-course-listing-grid {
    grid-template-columns: 1fr;
  }
}

.csa-course-listing-card {
  display: flex;
  flex-direction: row;
  background: #FFFFFF;
  border: 1px solid #E5E7EB;
  border-radius: 12px;
  overflow: hidden;
  transition: box-shadow 0.3s ease;
}

.csa-course-listing-card:hover {
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}

/* The photo slot, left. */
.csa-course-listing-card__media {
  width: 35%;
  position: relative;
  flex-shrink: 0;
}

/* Two classes and the element, 0,2,1, on purpose. WooCommerce's layout stylesheet sets
   `.woocommerce img, .woocommerce-page img { height: auto }` at 0,1,1, and every School
   archive and search page carries the `woocommerce` body class, so a single class here
   loses and the photo shrinks to its natural height instead of filling the slot. */
.csa-course-listing-card__media img.csa-course-listing-card__image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 50% !important;
}

/* The course's tags, one badge each, together in the photo's top left corner, wrapping onto
   another line when there are more than fit. */
.csa-course-listing-card__badges {
  position: absolute;
  top: 12px;
  left: 12px;
  right: 12px;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

/* The tag's own badge colour arrives as an inline style. A tag with none gets the purple here. */
.csa-course-listing-card__badge {
  background-color: var(--csa-purple-mid);
  color: #fff;
  padding: 4px 12px;
  border-radius: 20px;
  font-size: 11px;
  font-weight: bold;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

/* The text, right. */
.csa-course-listing-card__content {
  width: 65%;
  padding: 24px;
  display: flex;
  flex-direction: column;
}

.csa-course-listing-card__title {
  color: #1B264F;
  margin-top: 0;
  margin-bottom: 8px;
  line-height: 1.3;
}

.csa-course-listing-card__excerpt {
  font-size: 14px;
  color: #6B7280;
  line-height: 1.5;
  margin-bottom: 24px;
}

/* The price and the button, pinned to the bottom of the card. */
.csa-course-listing-card__footer {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
  margin-top: auto;
}

.csa-course-listing-card__price {
  font-weight: 700;
  color: #1B264F;
  font-size: 16px;
}

.csa-course-listing-card__price .woocommerce-Price-amount {
  color: inherit;
  font-weight: inherit;
  font-size: inherit;
}

.csa-course-listing-card__button {
  border: 1.5px solid #1B264F;
  color: #1B264F;
  border-radius: 24px;
  padding: 6px 20px;
  font-size: 14px;
  font-weight: 600;
  text-decoration: none;
  transition: all 0.2s;
}

.csa-course-listing-card__button:hover,
.csa-course-listing-card__button:focus-visible {
  background-color: #1B264F;
  color: #ffffff;
}

/* 600 is not an Oxygen breakpoint. The card stacks, photo on top. */
@media (max-width: 600px) {
  .csa-course-listing-card {
    flex-direction: column;
  }

  .csa-course-listing-card__media {
    width: 100%;
    height: auto;
    aspect-ratio: 16 / 9;
  }

  .csa-course-listing-card__content {
    width: 100%;
  }
}

/* The loading state, while the School page fetches another page of cards. The script adds
   `is-loading` to the grid. The spinner sits near the top of the grid, not the middle,
   because the grid is several rows tall and its middle is often off screen. */
.csa-course-listing-grid {
  position: relative;
}

.csa-course-listing-grid > .csa-course-listing-card {
  transition: all 0.2s ease;
}

.csa-course-listing-grid.is-loading > .csa-course-listing-card {
  opacity: 0.5;
  pointer-events: none;
}

.csa-course-listing-grid.is-loading::after {
  content: "";
  position: absolute;
  top: 80px;
  left: 50%;
  width: 44px;
  height: 44px;
  margin-left: -22px;
  border: 4px solid #E5E7EB;
  border-top-color: #FF0055;
  border-radius: 50%;
  animation: csa-course-listing-spin 0.8s linear infinite;
  z-index: 1;
}

@keyframes csa-course-listing-spin {
  to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
  .csa-course-listing-grid.is-loading::after {
    animation: none;
  }
}

/* The page links, everywhere on the site: the School pages' own container and every Oxygen
   Repeater's, which is how the Search Results page lists. Both are WordPress's
   paginate_links(): `page-numbers` on every item, plus `current`, `dots`, `prev` and `next`.
   Previous and Next keep their words at zero size, so a screen reader still announces
   them, and draw a chevron instead. */
.csa-course-listing-pagination,
.oxy-repeater-pages {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: 100%;
}

.csa-course-listing-pagination {
  margin-top: 40px;
}

.csa-course-listing-pagination .page-numbers,
.oxy-repeater-pages .page-numbers {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 36px;
  height: 36px;
  padding: 0 6px;
  border-radius: 18px;
  border: 1px solid #E5E7EB;
  background: #FFFFFF;
  color: #1B264F;
  font-size: 16px;
  font-weight: 600;
  line-height: 1;
  text-decoration: none;
  transition: all 0.2s ease;
}

.csa-course-listing-pagination a.page-numbers:hover,
.csa-course-listing-pagination a.page-numbers:focus-visible,
.oxy-repeater-pages a.page-numbers:hover,
.oxy-repeater-pages a.page-numbers:focus-visible {
  background: #F3F4F6;
  color: #1B264F;
}

.csa-course-listing-pagination .page-numbers.current,
.oxy-repeater-pages .page-numbers.current {
  background: #1B264F;
  color: #FFFFFF;
  border-color: #1B264F;
}

.csa-course-listing-pagination .page-numbers.dots,
.oxy-repeater-pages .page-numbers.dots {
  border-color: transparent;
  background: transparent;
}

.csa-course-listing-pagination .page-numbers.prev,
.csa-course-listing-pagination .page-numbers.next,
.oxy-repeater-pages .page-numbers.prev,
.oxy-repeater-pages .page-numbers.next {
  font-size: 0;
}

.csa-course-listing-pagination .page-numbers.prev::before,
.oxy-repeater-pages .page-numbers.prev::before {
  content: "\2039";
  font-size: 20px;
}

.csa-course-listing-pagination .page-numbers.next::before,
.oxy-repeater-pages .page-numbers.next::before {
  content: "\203A";
  font-size: 20px;
}

/* The School page's Field of Interest tabs and its description banner. Moved here from
   the School templates' code blocks, where Oxygen printed the CSS after the tabs in the
   page body, so the tabs and their icons drew unstyled for a moment on every load. */
.csa-tab-container { 
  display: flex; 
  gap: 16px; 
  flex-wrap: wrap; 
  margin-bottom: 40px; 
}

.csa-tab-link {
  display: flex; 
  align-items: center; 
  background-color: #FFFFFF; 
  color: #1B264F;
  border: none; 
  padding: 8px 16px; 
  border-radius: 50px; 
  font-weight: bold; 
  font-size: 14px;
  box-shadow: 0 4px 6px rgba(0,0,0,0.05); 
  cursor: pointer; 
  transition: all 0.2s ease;
}

.csa-tab-link,
.csa-tab-link:visited {
  color: #1B264F;
  text-decoration: none;
}

.csa-tab-link:hover,
.csa-tab-link:focus-visible { 
  color: #1B264F;
  box-shadow: 0 6px 12px rgba(0,0,0,0.1); 
}

/* Two classes and the element: WooCommerce's `.woocommerce img { height: auto }` is 0,1,1. */
.csa-tab-link img.csa-tab-icon { 
  width: 20px; 
  height: 20px; 
  margin-right: 8px; 
}

.csa-tab-count {
  background-color: #F3F4F6; 
  color: #1B264F; 
  border-radius: 12px; 
  padding: 2px 8px;
  font-size: 12px; 
  margin-left: 12px;
}

.csa-tab-link.csa-tab-active,
.csa-tab-link.csa-tab-active:hover,
.csa-tab-link.csa-tab-active:focus-visible { 
  background-color: #FF0055; 
  color: #FFFFFF; 
}

.csa-tab-link.csa-tab-active .csa-tab-count { 
  background-color: #D80048; 
  color: #FFFFFF; 
}

/* The dark blue description banner under the tabs */
.csa-subcat-banner {
    background-color: #0d2651;
    border-radius: 20px;
    padding: 32px 40px;
    margin-bottom: 40px;
    color: #ffffff;
    box-shadow: 0 4px 12px rgba(0,0,0,0.08);
    transition: all 0.3s ease;
}

.csa-subcat-banner-title {
    font-size: 22px;
    font-weight: 700;
    color: #ffffff;
    margin-top: 0;
    margin-bottom: 12px;
    line-height: 1.2;
}

.csa-subcat-banner-desc {
    font-size: 15px;
    color: #E2E8F0;
    line-height: 1.6;
    margin: 0;
}

@media (max-width: 768px) {
    .csa-subcat-banner {
        padding: 24px;
        margin-bottom: 24px;
    }
    .csa-subcat-banner-title {
        font-size: 18px;
    }
    .csa-subcat-banner-desc {
        font-size: 14px;
    }
}

.csa-support-contact__item {
  transition: color 0.2s ease;
}

.csa-support-contact__item:hover,
.csa-support-contact__item:focus-visible {
  color: #ff3364;
}
.csa-home-hero__tab {
    min-width: max-content;
}

body.home .hero-section {
  min-height: clamp(460px, calc(100vw / 2.63), 730px);
}

/* Tablet, 768 to 991. No floor and no ceiling: 100vw / 2.276 runs from 337px
   at 768 to 435px at 991, and both ends are inside the banner. */
@media (max-width: 991px) {
  body.home .hero-section {
    min-height: calc(100vw / 2.276);
  }
}


/* --------------------------------------------------------------------------
   2. Hero content padding, desktop

   Desktop only. Below 992px the builder's own padding fields take over, so
   this rule must not reach them. Without the media query it wins on source
   order and the tablet and mobile padding fields do nothing.

   It is here because it is a clamp, and there is no field for a clamp. It
   runs 64px at 992 up to 93px at 1431, then holds at 93px.

   The padding-bottom is a field, so it is not written here. Set it to 48px
   at Desktop in the builder.
   -------------------------------------------------------------------------- */

@media (min-width: 992px) {
  body.home .hero-section > .ct-section-inner-wrap {
    padding-top: clamp(64px, 6.5vw, 93px);
  }
}

#div_block-423-13:hover > #text_block-422-13 {
 color: #0A2849;
}

#div_block-423-13:hover > #code_block-424-13 svg {
 color: #0A2849;
}
@media (max-width: 1200px) {
    h1 {font-size: 52px;}
    h2 {font-size: 32px;}
    h3 {font-size: 20px;}
    h4 {font-size: 22px;}
    h5 {font-size: 20px;}
}

@media (max-width: 991px) {
    h1 {font-size: 40px;}
    h2 {font-size: 24px;}
    h3 {font-size: 20px;}
    h4 {font-size: 20px;}
    h5 {font-size: 18px;}
}

@media (max-width: 768px) {
    h1 {font-size: 28px;}
    h2 {font-size: 24px;}
    h3 {font-size: 18px;}
    h4 {font-size: 19px;}
    h5 {font-size: 17px;}
}

@media (max-width: 480px) {
    h1 {
        font-size: 26px;
        line-height: 1.2;
    }
    h2 {font-size: 22px;}
    h3 {font-size: 18px;}
    h4 {font-size: 18px;}
    h5 {font-size: 16px;}
}/* ==========================================================================
   CollegeSA - 06 product single

   The course page. One template, post 215, serving about 209 URLs.

   Created 2026-09-17, session 30. Built alongside
   `scripts/Build-ProductSingleJson.ps1`, which writes the four section files
   in `json/product-single/`.

   WHY THIS FILE IS SHORT. Ground rule 13 and OXYGEN-CONVENTIONS.md section 9.
   Everything an Oxygen field can set is in the JSON, on a class, where it can
   be reached in the builder. Five things are left, and each one is named in
   section 9's "belongs in CSS" table:

     1. The tab states. Oxygen marks the active tab with a class carrying the
        Tabs element's own instance number, `tabs-7215-tab-active`. No builder
        field targets it, so it is matched loosely as `[class*="-tab-active"]`
        and the instance number is never written down.

        IT DOES NOT KEY OFF `aria-selected`, which is where section 22 differs
        and deliberately so. Corrected 2026-09-17. Keying off both let the two
        disagree: on load the first tab showed an open chevron above a hidden
        panel, because `aria-selected` was still `true` while Oxygen had taken
        the instance class off. The class is the ground truth here, because it
        is the thing Oxygen itself drives and the thing that decides whether
        the panel is hidden. Snippet S10 keeps `aria-selected` in step for
        screen readers; nothing visual depends on it.
     2. The tabs-to-accordion switch, and the tab padding with it. It happens
        at 1199.98, which is not one of Oxygen's three breakpoints, so section
        9's stated exception sends the whole layout here and nothing of it to
        the builder.
     3. The at-a-glance table. That markup arrives from the PRODUCT
        DESCRIPTION, so it is never in the element tree and the builder cannot
        see inside it. Section 9: "the output of a code block".
     4. The prose inside a bound tab panel, for the same reason.
     5. The hover states, the chevron pseudo-element and the transitions.

   NO HEADING SIZE IS SET IN THIS FILE. Ground rule 18. `css/04-typography.css`
   is the rule of law, and the two sizes that differ from it, the 32px h1 and
   the 24px panel h2, are set in the builder on their own classes, in
   `json/product-single/head.json` and `tabs.json`.

   EVERY SELECTOR IS ROOTED IN A PRODUCT-TEMPLATE CLASS. Decided 2026-09-17:
   the course card designs are deliberately inconsistent between schools, so
   nothing here may leak. The roots are `.csa-product-head`,
   `.csa-product-glance__card`, `.csa-product-tabs`, `.csa-product-related`
   and `.csa-product-cart`. There is no bare element selector and no
   `.csa-ptab` on its own, which matters most for the rules below that reach
   Oxygen's own `.oxy-tabs`, `.oxy-tab` and `.oxy-tab-content` classes. Those
   classes are on every Tabs element on the site, including the HR and Health
   and Safety catalogue chips, and only the `.csa-product-tabs` root keeps
   this file off them.

   NO BODY CLASS SCOPE. D34 scopes a page stylesheet with a body class.
   WooCommerce does add `single-product` to the body, but the Oxygen builder
   renders this template with no product behind it, so that class is not there
   while the template is edited and every rule below would be invisible in the builder.
   The section class does the same job and survives into the builder.

   THIS FILE LOADS AFTER `04-typography.css`. Corrected on
   2026-09-17: Oxygen cannot reorder the Stylesheets panel, so a new
   stylesheet is appended and there is no way to put this one before 04.
   `OXYGEN-CONVENTIONS.md` section 11 says 04 is last and therefore wins at
   equal specificity. That is no longer true of this file, so the rule it
   protects has to be kept by hand: NOTHING HERE SETS A FONT SIZE ON A
   HEADING. Every selector below is at 0,2,0 or higher, so a bare `h2` rule in
   04 would lose to one here. There is none, and none may be added.

   THE ONE `display: grid` ON THIS PROJECT is in this file, on the at-a-glance
   table. Section 10 warns that a grid key sent through an Oxygen IMPORT lands
   in the weak 0,1,0 rule and loses. That warning is about the Oxygen store. A
   stylesheet is not the Oxygen store, and Oxygen has no default of its own on
   a bare `table` inside our card, so there is nothing for this rule to lose
   to.
   ========================================================================== */


/* --------------------------------------------------------------------------
   1. The tab strip above 1200, and the ACCORDION it becomes below it

   Live turns its tabs into an accordion below 1024, and the same was asked
   for on 2026-09-17. This does it with NO NEW JAVASCRIPT. Oxygen's own tab
   script keeps doing the switching; only the layout changes.

   HOW IT WORKS. The Tabs element and the Tab Contents element are siblings
   inside `.csa-product-tabs__inner`, which is a flex column. Give both of
   them `display: contents` and their children are promoted to children of
   that column, so the eight tabs and the eight panels become sixteen
   siblings in one flex context. `order` then interleaves them: tab 1, panel
   1, tab 2, panel 2, and so on. Oxygen already hides every inactive panel
   with `.oxy-tabs-contents-content-hidden { display: none !important }`, so
   what you get is an accordion with one section open at a time.

   IT IS ONLY POSSIBLE BECAUSE OXYGEN'S `display` HERE IS NOT `!important`.
   Read off the build site on 2026-09-17: `.oxy-tabs`, `.oxy-tabs-contents`,
   `.oxy-tab` and `.oxy-tab-content` all set `display: flex` at 0,1,0 with no
   priority. Only the hidden-panel rule carries `!important`, and that one we
   want. Section 10's "display carries !important" warning is about a class
   OXYGEN COMPILED FROM THE BUILDER, which is a different rule set.

   THE REAL BUG THIS ALSO FIXES. Oxygen's framework sets
   `.oxy-tab, .oxy-tab-content { padding: 20px }`. The imported class only
   overrode `padding-bottom`, so every tab carried 40px of horizontal padding
   it did not ask for. Measured at 1440 on 2026-09-17: eight tabs came to
   1235px against a 1260px track and the row wrapped. The labels alone are
   915px. With the padding zeroed the row is 1139px and fits.

   THE ACCORDION STARTS AT 991.98, which is Oxygen's tablet tier. Decided
   2026-09-17: dropping to an accordion at 1199 is far too big a screen. The
   first cut did that only because 992 to 1199 could not
   hold one row: at 992 the labels need 915px against 952px of track, leaving
   37px for seven gaps.

   SO THAT BAND SCALES INSTEAD OF SWITCHING. Between 992 and 1199 the gap runs
   12 to 32 and the label 13px to 14px, both on `clamp()`, which has no
   builder field. Measured on the build site 2026-09-17, one row and no
   slicing at every width, with about 20px of headroom throughout:

       992    gap 12.0   font 13.00   row 933 of 952
       1024   gap 15.1   font 13.15   row 965 of 984
       1100   gap 22.4   font 13.52   row 1040 of 1060
       1199   gap 31.9   font 13.99   row 1138 of 1159
       1440   gap 32     font 14      row 1139 of 1260

   991.98 AND 1199.98, NOT 991 AND 1199. A `min-width: 1200` and
   `max-width: 1199` pair leaves a crack that a fractional viewport width
   falls straight through. That happened in testing on 2026-09-17 and showed
   neither layout at all.

   THE STRIP NEVER WRAPS AND NEVER SLICES. `flex-wrap: nowrap` with
   `overflow-x: auto` is the safety net for the day a migrated tab set brings
   longer labels than these eight. `justify-content: flex-start` is NOT
   decoration: section 10 measured a centred scroll container putting the
   start permanently out of reach on the IT logos band, and this is a scroll
   container.

   NEITHER BREAKPOINT IS ONE OXYGEN CAN SET, and neither is `clamp()`, so this
   whole layout belongs in CSS with NOTHING of it in the builder. That is
   `OXYGEN-CONVENTIONS.md` section 9's stated exception, and it is why the
   padding, the gap and the flex-wrap are all here rather than in `tabs.json`.

   THE GAP HAD TO COME OFF THE ELEMENT FIRST. It was set on the Tabs ELEMENT,
   which Oxygen compiles to `#_tabs-<id>-215` in the per-post stylesheet at
   1,0,0. No class rule can beat that, section 11. The rules below only work
   once Gap and Flex wrap are cleared off the element at all three tiers.

   `.oxy-tab` IS A COLUMN. It sets `flex-direction: column; align-items:
   center`, so the chevron stacked under the label on the first cut. The
   accordion row sets `row` explicitly.

   THE UNDERLINE IS AN INSET BOX-SHADOW, not a border. A border would change
   the tab's height the moment it became active and shift the whole strip. The
   shadow costs no layout at all. Section 19 uses the same trick for the open
   FAQ divider. It would also have cost six option keys in the builder: the
   `border-width` shorthand alone is a dropped key, section 10.

   Measured at 1440, 1200, 1199, 768, 375 and 320 on the build site on
   2026-09-17. One row at 1200 and up, interleaved accordion below it, zero
   page overflow at every width.
   -------------------------------------------------------------------------- */

/* The strip. `gap` and `flex-wrap` live here, not on the element, because the
   992 to 1199 band has to change the gap and an element style would win. */
.csa-product-tabs .oxy-tabs {
  flex-wrap: nowrap;
  overflow-x: auto;
  justify-content: flex-start;
  gap: var(--csa-space-5);
}

/* A tab is a div, so it gets no pointer of its own. */
.csa-product-tabs .csa-ptab {
  cursor: pointer;
  padding: 0 0 10px;
  transition: box-shadow 0.2s ease, border-color 0.2s ease;
}

/* A label never breaks inside the strip. The accordion puts this back. */
.csa-product-tabs .csa-ptab > * {
  white-space: nowrap;
}

.csa-product-tabs .csa-ptab[class*="-tab-active"] {
  box-shadow: inset 0 -3px 0 0 var(--csa-pink);
}

/* The design gives the tab no hover state, because there is no design for
   this page at all, blocker B2. This is invented and deliberately slight: a
   faint underline in the accent pink, so a tab reads as clickable without
   pretending to be selected. It is due for design review, blocker B10. */
.csa-product-tabs .csa-ptab:hover:not([class*="-tab-active"]) {
  box-shadow: inset 0 -3px 0 0 var(--csa-border-accent);
}

/* The tab is the control that reveals the course detail, so it needs a
   visible focus ring at both tiers. The ring in `css/02-base.css` is scoped
   to the header and the footer and does not reach here. */
.csa-product-tabs .csa-ptab:focus-visible {
  outline: 2px solid var(--csa-pink-light);
  outline-offset: 3px;
}


/* The band that has to scale rather than switch. The two `clamp()` slopes
   both run 992 to 1200: gap 12 to 32, label 13px to 14px. */
@media (min-width: 992px) and (max-width: 1199.98px) {

  .csa-product-tabs .oxy-tabs {
    gap: clamp(12px, 9.615vw - 83.38px, 32px);
  }

  .csa-product-tabs .csa-ptab {
    font-size: clamp(13px, 0.4808vw + 8.23px, 14px);
  }
}


@media (max-width: 991.98px) {

  /* The promotion. This is the whole trick. */
  .csa-product-tabs .oxy-tabs,
  .csa-product-tabs .oxy-tabs-contents {
    display: contents;
  }

  /* One accordion row. */
  .csa-product-tabs .csa-ptab {
    width: 100%;
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    gap: var(--csa-space-3);
    padding: var(--csa-space-3) 0;
    border-bottom: 1px solid var(--csa-border-card);
    text-align: left;
  }

  /* The label takes the room, so the chevron is pushed to the right edge, and
     it is allowed to wrap again: a long tab name on a 320px screen has to
     break rather than overflow. `> *` matches the label element and never the
     `::after`, which is not an element. */
  .csa-product-tabs .csa-ptab > * {
    flex: 1 1 auto;
    white-space: normal;
  }

  /* The desktop underline has no place on an accordion row, and the hover
     rule above is 0,4,0, so it has to be named again to be turned off. */
  .csa-product-tabs .csa-ptab[class*="-tab-active"],
  .csa-product-tabs .csa-ptab:hover:not([class*="-tab-active"]) {
    box-shadow: none;
  }

  /* An open row runs straight into its panel, and the panel carries the
     closing hairline instead. */
  .csa-product-tabs .csa-ptab[class*="-tab-active"] {
    border-bottom-color: transparent;
  }

  .csa-product-tabs .oxy-tab-content {
    border-bottom: 1px solid var(--csa-border-card);
  }

  /* The chevron. A pure CSS corner, so it needs no file and inherits
     `currentColor`. Pseudo-elements are not available in the builder. */
  .csa-product-tabs .csa-ptab::after {
    content: "";
    flex: 0 0 auto;
    width: 9px;
    height: 9px;
    margin-right: 3px;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: translateY(-3px) rotate(45deg);
    transition: transform 0.2s ease;
  }

  .csa-product-tabs .csa-ptab[class*="-tab-active"]::after {
    transform: translateY(2px) rotate(-135deg);
  }

  /* `.oxy-tab-content` already carries Oxygen's own 20px top padding, which
     is the whole gap an accordion panel needs. */
  .csa-product-tabs .csa-ptab__panel {
    padding-top: 0;
  }

  /* The interleave. Sixteen rules, because `order` has to be stated per
     element and `:nth-child` has no builder field. Odd numbers are the tabs,
     even numbers are the panels, so tab N always lands immediately above
     panel N. */
  .csa-product-tabs .oxy-tabs > *:nth-child(1) { order: 1; }
  .csa-product-tabs .oxy-tabs-contents > *:nth-child(1) { order: 2; }
  .csa-product-tabs .oxy-tabs > *:nth-child(2) { order: 3; }
  .csa-product-tabs .oxy-tabs-contents > *:nth-child(2) { order: 4; }
  .csa-product-tabs .oxy-tabs > *:nth-child(3) { order: 5; }
  .csa-product-tabs .oxy-tabs-contents > *:nth-child(3) { order: 6; }
  .csa-product-tabs .oxy-tabs > *:nth-child(4) { order: 7; }
  .csa-product-tabs .oxy-tabs-contents > *:nth-child(4) { order: 8; }
  .csa-product-tabs .oxy-tabs > *:nth-child(5) { order: 9; }
  .csa-product-tabs .oxy-tabs-contents > *:nth-child(5) { order: 10; }
  .csa-product-tabs .oxy-tabs > *:nth-child(6) { order: 11; }
  .csa-product-tabs .oxy-tabs-contents > *:nth-child(6) { order: 12; }
  .csa-product-tabs .oxy-tabs > *:nth-child(7) { order: 13; }
  .csa-product-tabs .oxy-tabs-contents > *:nth-child(7) { order: 14; }
  .csa-product-tabs .oxy-tabs > *:nth-child(8) { order: 15; }
  .csa-product-tabs .oxy-tabs-contents > *:nth-child(8) { order: 16; }
}


/* --------------------------------------------------------------------------
   2. The at-a-glance strip

   This markup comes out of the product description, so it cannot be styled in
   the builder. `code-blocks/product-glance-sample.html` is the shape these
   rules are written against, and the build script writes both from the same
   array so the two cannot drift.

   WRITTEN AGAINST THE SUPPLIED MARKUP, 2026-09-17, which is live's.
   Measured at 1440 the same day: 3 columns, 16px gap, 45px icon, 16px between
   the icon and the label.

   THE TABLE CARRIES NO CLASS OF ITS OWN, and neither do the cells. The only
   hook is the card this template builds around it, which is why every
   selector below is a descendant of `.csa-product-glance__card`. Nothing else
   on this template puts a table in that card.

   `tbody` and `tr` are set to `display: contents` so the `td` cells become
   direct grid items of the table. Without it the six items stay in six rows,
   which is exactly what the markup asks for on its own.

   THE MARKUP'S INLINE STYLES DO NOT FIGHT THIS. The table carries
   `border-collapse` and `width`, and each cell carries `width: 100%`. None of
   them is `display`, so the grid applies, and `width: 100%` on a grid item is
   100% of its own track, which is what we want anyway.

   ONLY ROW 1 WRAPS ITS LABEL IN A `<span>`. The other five put a bare text
   node after the image, and CSS Grid wraps a run of text in an ANONYMOUS grid
   item, so all six cells lay out identically. An anonymous item cannot be
   selected, so it takes its type from the cell. Row 1's span is pinned to
   16px inline, so the cell is set to 16px and the six rows agree. That is why
   there is no font-size step down at the phone tier: it would move five rows
   and leave the sixth behind.

   `margin: 0` on the image is not decoration. The markup carries WordPress's
   `alignnone` class, which sets a margin in some contexts.
   -------------------------------------------------------------------------- */

.csa-product-glance__card table {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--csa-space-3);
  width: 100%;
}

.csa-product-glance__card tbody,
.csa-product-glance__card tr {
  display: contents;
}

.csa-product-glance__card td {
  display: grid;
  grid-template-columns: 45px 1fr;
  align-items: center;
  gap: var(--csa-space-3);
  padding: 0;
  border: 0;
  font-size: var(--csa-fs-lead);
  line-height: var(--csa-lh-lead);
  color: var(--csa-ink);
}

.csa-product-glance__card td img {
  display: block;
  width: 45px;
  height: 45px;
  margin: 0;
  object-fit: contain;
}

@media (max-width: 991px) {
  .csa-product-glance__card table {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 600px) {
  .csa-product-glance__card table {
    grid-template-columns: 1fr;
  }
}


/* --------------------------------------------------------------------------
   3. The prose inside a tab panel

   The panel body is one Text Block that is bound to the migrated tab
   content, so its paragraphs, lists and sub-headings are not elements in the
   tree and cannot be reached from the builder.

   NO FONT SIZES HERE. Ground rule 18. These rules set spacing, the list
   marker and the heading colour, and nothing else. `css/04-typography.css`
   owns every heading size on this site, including the ones that arrive inside
   this block.

   The first child loses its top margin so the panel's own 28px of padding is
   the only gap under the panel title.
   -------------------------------------------------------------------------- */

.csa-product-tabs .csa-ptab__body > :first-child {
  margin-top: 0;
}

.csa-product-tabs .csa-ptab__body > :last-child {
  margin-bottom: 0;
}

.csa-product-tabs .csa-ptab__body p {
  margin: 0 0 var(--csa-space-3);
}

.csa-product-tabs .csa-ptab__body h3,
.csa-product-tabs .csa-ptab__body h4,
.csa-product-tabs .csa-ptab__body h5 {
  margin: var(--csa-space-4) 0 var(--csa-space-2);
  color: var(--csa-navy);
}

.csa-product-tabs .csa-ptab__body ul,
.csa-product-tabs .csa-ptab__body ol {
  margin: 0 0 var(--csa-space-3);
  padding-left: var(--csa-space-5);
}

.csa-product-tabs .csa-ptab__body ul {
  list-style: disc;
}

.csa-product-tabs .csa-ptab__body ol {
  list-style: decimal;
}

.csa-product-tabs .csa-ptab__body li {
  margin-bottom: var(--csa-space-1);
}

.csa-product-tabs .csa-ptab__body strong {
  color: var(--csa-navy);
  font-weight: var(--csa-fw-semibold);
}


/* --------------------------------------------------------------------------
   4. The two button hovers

   Hover and the transition only. The pink, the pill, the height and the
   padding are all builder fields and they live in
   `json/product-single/head.json` and `related.json`. The hover colour is the
   one `.csa-btn--primary` already uses in section 1 of
   `css/03-components.css`, so the whole site agrees.
   -------------------------------------------------------------------------- */

.csa-product-cta,
.csa-product-related__cta {
  text-decoration: none;
  transition: background-color 0.2s ease;
}

.csa-product-cta:hover,
.csa-product-cta:focus-visible,
.csa-product-related__cta:hover,
.csa-product-related__cta:focus-visible {
  background-color: #e51f4f;
}

.csa-product-cta:focus-visible,
.csa-product-related__cta:focus-visible {
  outline: 2px solid var(--csa-pink-light);
  outline-offset: 2px;
}


/* --------------------------------------------------------------------------
   5. The real add-to-cart form

   NOT IN USE YET. There are no products, so nothing renders this. It is
   written now so the swap in `code-blocks/product-add-to-cart.php` is a
   two-minute job rather than a session.

   WHAT IT STYLES. WooCommerce prints `form.cart`, and Deposits & Partial
   Payments for WooCommerce Pro (Acowebs) injects its two radios into it on
   `woocommerce_before_add_to_cart_button`. That plugin is already installed
   here: `/wp-json/` serves `/awcdp/v1/...`, checked 2026-09-17. Every
   selector below was read off live's DOM the same day. None of it is guessed,
   and none of it is TESTED, because it cannot be until a product exists.

   IT IS IN A STYLESHEET because it is plugin output. The builder cannot see
   inside a Code Block, section 9.

   `display: contents` on the four Acowebs wrappers lifts the two radio labels
   and the submit button into the form's own flex row, so the three controls
   sit in one line with the Enquire now link, the way live draws them. It
   changes no markup and needs no template override, ground rule 10.

   WE DO NOT COPY LIVE'S TRICK. Live shrinks the real submit button to
   `font-size: 5px` with zero padding so it disappears, and submits the form
   from a click handler on the radios. Here the two radios are what they are,
   a choice, and "Register now" is a real submit button next to them. It is
   one more control on the row and it is honest about what it does.

   THE DEPOSIT DESCRIPTION IS HIDDEN. The plugin reveals "Pay a deposit of
   R418.00 per item" under the chosen radio with an inline style, which is why
   this needs `!important` to beat it. The head band already carries that
   figure on its own element, `csa-product-head__deposit`. Delete this one
   rule if that turns out to be the wrong call.

   SPECIFICITY IS THE RISK. These are 0,2,0 and 0,3,0 rules against markup
   WooCommerce and Acowebs also style. If a label or the button comes out
   wrong, read the computed rule before changing a value here. Section 10.
   -------------------------------------------------------------------------- */

.csa-product-cart form.cart {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--csa-space-2) 12px;
  margin: 0;
}

.csa-product-cart .awcdp-deposits-wrapper,
.csa-product-cart .awcdp-deposits-option,
.csa-product-cart .awcdp-radio,
.csa-product-cart .awcdp-radio > div {
  display: contents;
}

/* Visually hidden, still focusable and still operable by keyboard. The label
   is the visible control and it is correctly associated by `for`. */
.csa-product-cart .awcdp-deposit-radio {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

.csa-product-cart .awcdp-radio-label,
.csa-product-cart .single_add_to_cart_button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 42px;
  padding: 0 var(--csa-space-4);
  border: 0;
  border-radius: var(--csa-radius-pill);
  background-color: var(--csa-cta-bg);
  color: var(--csa-white);
  font-family: var(--csa-font);
  font-size: 14px;
  font-weight: var(--csa-fw-medium);
  line-height: 1;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color 0.2s ease, box-shadow 0.2s ease;
}

.csa-product-cart .awcdp-radio-label:hover,
.csa-product-cart .single_add_to_cart_button:hover {
  background-color: #e51f4f;
}

/* The chosen payment option. A ring rather than another colour, so the row
   does not end up with two different pinks in it. */
.csa-product-cart .awcdp-deposit-radio:checked + .awcdp-radio-label {
  box-shadow: 0 0 0 3px var(--csa-border-accent);
}

.csa-product-cart .awcdp-deposit-radio:focus-visible + .awcdp-radio-label,
.csa-product-cart .single_add_to_cart_button:focus-visible {
  outline: 2px solid var(--csa-pink-light);
  outline-offset: 2px;
}

/* The plugin reveals this with an inline style, so it takes `!important`. */
.csa-product-cart .awcdp-deposits-description {
  display: none !important;
}

/* One item per order. The quantity field is a hidden input with min and max
   both 1 on every course on live, so the wrapper is dead weight. */
.csa-product-cart .quantity {
  display: none;
}

/* --------------------------------------------------------------------------
   6. Related courses, the card photo

   Added 2026-09-29. The course photos come in different shapes, so without a
   ratio two cards in one row draw their photos at different heights: 217 and
   250 on a 358 card, measured on the build site. 3:2 matches section 24's
   two column band and the photo most courses use.

   OXYGEN-CONVENTIONS.md section 9, the first row: `aspect-ratio` has no field.
   `object-fit: cover` and the width are on the class in the builder already.
   -------------------------------------------------------------------------- */

.csa-product-related__image {
  aspect-ratio: 3 / 2;
}

/* --------------------------------------------------------------------------
   7. The price guard, the page head

   Added 2026-09-29. Oxygen Elements for WooCommerce ships a bare
   `.woocommerce-Price-amount` rule at 0,1,0 that sets `color: #000`,
   `font-size: 16px` and `font-weight: 700` on the INNER span WooCommerce
   prints inside every price. The builder values on `csa-product-head__price`
   and `csa-product-head__deposit` sit on the parent, so they never reached
   the number. Measured on the build site: the price rendered black at 16px.

   `inherit` hands the number back to the builder fields on the parent, so
   nothing here locks one. Same answer as section 26 and the course listing
   card in 03-components.css. OXYGEN-CONVENTIONS.md section 9, "the output of
   a code block": the builder cannot see inside a shortcode's markup.

   The deposit line keeps the plugin's 700, so its two amounts stay bold. Add
   `font-weight: inherit` to that rule to take the bold off.
   -------------------------------------------------------------------------- */

.csa-product-head__price .woocommerce-Price-amount {
  color: inherit;
  font-size: inherit;
  font-weight: inherit;
}

.csa-product-head__deposit .woocommerce-Price-amount {
  color: inherit;
  font-size: inherit;
}

/* Related courses: the Repeater lists the course's 12 most related courses so
   the snippet "CSA - visitor history" can re-rank them by what the visitor
   has viewed. Only the first four show. Oxygen gives every Repeater item
   `display: flex` at ID strength, `.oxy-dynamic-list :is([data-id=…], #incspec)`,
   so this borrows the same `#incspec` to outrank it without !important. */
.csa-product-related .oxy-dynamic-list > :is(:nth-child(n+5), #incspec) {
  display: none;
}
/* ==========================================================================
   CollegeSA - 06 woocommerce
   Cart, Checkout, Order received and My Account. Every rule is scoped to a
   WooCommerce body class, so nothing here can reach a page we built.

   This file is the source of truth. Oxygen holds a copy, under Manage,
   Stylesheets, named "06-woocommerce". Regenerate the CSS cache after a
   change.

   WHY THIS IS A STYLESHEET AND NOT THE BUILDER
   Ground rule 13 and OXYGEN-CONVENTIONS.md section 9. Everything below is
   the output of a WooCommerce shortcode, or of the page's own WYSIWYG
   content. Oxygen has no element for any of it, so it has no field for it
   either. Section 9 already permits a stylesheet for "the output of a code
   block", and this is the same case. The only two Oxygen elements on the
   template are the section and the container div, and both are styled on
   their classes in json/commerce/wrapper.json.

   THE TRAP THAT DOES NOT APPLY
   OXYGEN-CONVENTIONS.md section 10 says a rule in css/ needs !important AND
   0,4,0 to beat an Oxygen class. No element below carries an Oxygen class,
   so nothing here competes with Oxygen. It competes with WooCommerce's own
   woocommerce.css, whose rules top out at 0,3,0. Every selector below is at
   least 0,3,0, and it is 0,4,0 or carries an ID wherever WooCommerce also
   uses three classes, so no !important is needed anywhere in this file.

   GROUND RULE 18
   No heading size is set here. The page title is an h2 and takes 36px from
   Oxygen Global Styles, stepping down through 04-typography.css.

   Last updated: 2026-09-17 (session 30)

   Contents
   0. The heading guard, against Oxygen Elements for WooCommerce
   1. The page title, the eyebrow and the two-tone heading
   2. The WooCommerce frame and the notices
   3. Buttons
   4. Form fields and labels
   5. Tables, shared by cart, checkout and account
   6. Cart
   7. Checkout
   8. My Account
   9. Tablet and mobile
   ========================================================================== */

/* --------------------------------------------------------------------------
   0. The heading guard, against Oxygen Elements for WooCommerce

   Oxygen Elements for WooCommerce 2.0.2 ships one "Headings" rule that
   compiles into universal.css at about line 619, well before this file. It
   sets `color: #000000; font-weight: 700; line-height: 1.2;
   margin-bottom: 8px`, and its selector list carries two entries that are a
   BODY CLASS plus a BARE ELEMENT:

       .woocommerce-account h2        0,1,1
       .woocommerce-checkout h3       0,1,1

   Neither is confined to the WooCommerce output. On /my-account/ the first
   one reaches every h2 on the page, which is how it took the footer
   headings and our own page title. `.csa-footer__heading` and
   `.csa-commerce__title` are both 0,1,0, so both lost.

   The guard below is `body` plus the body class plus the element, 0,1,2. One
   more element in the count than the plugin's 0,1,1, so it wins, and it
   wins for any heading we have not named yet. It carries COLOUR ONLY, so it
   can never fight a size or a weight that belongs to an element.

   It does not touch the footer: `.csa-footer .csa-footer__heading` in
   03-components.css is 0,2,0, and two classes beat one.

   Measured on the build site at 1440 on 2026-09-17, session 30. The plugin
   file is not edited, so a plugin update cannot undo this.
   -------------------------------------------------------------------------- */

body.woocommerce-account h1,
body.woocommerce-account h2,
body.woocommerce-account h3,
body.woocommerce-account h4,
body.woocommerce-account legend,
body.woocommerce-cart h1,
body.woocommerce-cart h2,
body.woocommerce-cart h3,
body.woocommerce-cart h4,
body.woocommerce-checkout h1,
body.woocommerce-checkout h2,
body.woocommerce-checkout h3,
body.woocommerce-checkout h4,
body.woocommerce-checkout legend {
  color: var(--csa-navy);
}

/* THE CARD GUARD.

   The same plugin ships a "Tables and Forms Style" rule, universal.css line
   about 1180, that gives TWELVE selectors the same box:

       border: 1px solid #d3ced2;  border-top: 3px solid #65bec2;
       border-radius: 0;  background: #ffffff;  padding: 20px;

   That teal top bar is what appears on the checkout billing block, the
   Addresses page, the Account details form, the coupon forms and the reset
   password form. Its strongest member is 0,2,1, so `body` plus the body class
   plus `.woocommerce` clears the set at 0,3,1.

   Tables, the order overview and the login and register forms are left OUT of
   this list on purpose: sections 5, 7 and 8 already style each of them at
   0,3,1 or better, and adding them here would only fight our own rules.

   Measured on the build site 2026-09-18. Decision D117. */
body.woocommerce-page .woocommerce .col2-set,
body.woocommerce-page .woocommerce .woocommerce-address-fields,
body.woocommerce-page .woocommerce .woocommerce-EditAccountForm,
body.woocommerce-page .woocommerce .woocommerce-form-coupon,
body.woocommerce-page .woocommerce form.checkout_coupon {
  border-width: 3px 1px 1px;
  border-style: solid;
  border-color: var(--csa-pink) var(--csa-border-card) var(--csa-border-card);
  border-radius: var(--csa-radius-card-sm);
  background-color: var(--csa-white);
  padding: 24px;
}

/* THE BLOCK NOTICE BANNER.

   The Orders and Downloads panels do NOT use `.woocommerce-info`. WooCommerce
   renders them through the Blocks component `wc-block-components-notice-banner`,
   which is styled by `wc-blocks.css`. That file loads AFTER universal.css, so
   its 0,2,0 rules beat anything of ours at equal weight, and it is the source
   of the blue box, the 1px all-round border and the circular icon.

   Read off the build site 2026-09-18: `.is-info` is #f4f8ff on #007cba.

   The geometry below matches our own notices in section 2. The colours follow
   the brand where the brand has one, and keep WooCommerce's semantics where it
   does not: info takes the purple our `.woocommerce-info` uses, error takes
   the pink, and success and warning keep their green and amber, because there
   is no brand green or amber and a student must be able to tell a failure from
   a confirmation. Decision D118. */
body.woocommerce-page .wc-block-components-notice-banner {
  border-width: 1px;
  border-radius: 8px;
  color: var(--csa-ink);
  font-size: 14px;
  line-height: 1.6;
}

body.woocommerce-page .wc-block-components-notice-banner.is-info {
  border-color: var(--csa-purple-mid);
  background-color: var(--csa-surface-grey);
}

body.woocommerce-page .wc-block-components-notice-banner.is-info > svg {
  background-color: var(--csa-purple-mid);
}

body.woocommerce-page .wc-block-components-notice-banner.is-error {
  border-color: var(--csa-pink);
  background-color: var(--csa-surface-pink);
}

body.woocommerce-page .wc-block-components-notice-banner.is-error > svg {
  background-color: var(--csa-pink);
}

/* The action link, which WooCommerce floats right at 70 per cent opacity. */
body.woocommerce-page .wc-block-components-notice-banner .wc-forward {
  opacity: 1;
  color: var(--csa-pink);
  font-weight: var(--csa-fw-medium);
  text-decoration: underline;
}

body.woocommerce-page .wc-block-components-notice-banner .wc-forward:hover {
  color: var(--csa-navy);
}

/* --------------------------------------------------------------------------
   1. The page title, the eyebrow and the two-tone heading

   These three classes are typed by hand into each page's own content, in the
   Text tab of the editor, above the shortcode. The markup for all three
   pages is in json/commerce/page-titles.html.

   The values are the Adult Matric band's, read out of
   scripts/Build-AdultMatricSubjectsJson.ps1 lines 183 to 202. The class
   NAMES are new. Decision D46 and risk R7: never borrow a class.

   The `.csa-commerce__inner` parent is here for the same reason it is on the
   footer heading. The plugin rule in section 0 is 0,1,1 and also sets
   font-weight and margin-bottom, which the guard deliberately does not. On
   its own, `.csa-commerce__title` is 0,1,0 and was losing its 32px bottom
   margin to the plugin's 8px. With the container class it is 0,2,0 and keeps
   every value.
   -------------------------------------------------------------------------- */

.csa-commerce__inner .csa-commerce__eyebrow {
  margin: 0 0 16px;
  color: var(--csa-pink);
  font-size: 14px;
  font-weight: var(--csa-fw-bold);
  line-height: 1.4;
  letter-spacing: 1.2px;
  text-transform: uppercase;
}

.csa-commerce__inner .csa-commerce__title {
  margin: 0 0 32px;
  color: var(--csa-navy);
  font-weight: var(--csa-fw-bold);
  line-height: 1.2;
}

.csa-commerce__inner .csa-commerce__title-rest {
  font-weight: var(--csa-fw-medium);
}

/* --------------------------------------------------------------------------
   1a. ONE PAGE, THREE TITLES: the checkout endpoints

   `/checkout/order-received/<id>/` and `/checkout/order-pay/<id>/` are
   WooCommerce ENDPOINTS on the Checkout page, decision D111. They are the
   same WordPress post, so they got the same page content, and a student who
   had just paid was told "ALMOST THERE: Complete your enrolment in a few
   short steps". Found on 2026-09-29.

   The fix needs no PHP, because WooCommerce puts the endpoint on the body.
   Read off the build site the same day:

       /checkout/                      body.woocommerce-checkout
       /checkout/order-received/...    body.woocommerce-checkout .woocommerce-order-received
       /checkout/order-pay/...         body.woocommerce-checkout .woocommerce-order-pay

   So the Checkout page carries all THREE title pairs in its own content and
   this swaps them. The copy stays in the editor where it can be changed,
   which is the whole point of D110, and nothing is generated in CSS.

   The two endpoint pairs are hidden at 0,1,0 and shown again at 0,2,1, so
   the base rules above are untouched. Decision D140.
   -------------------------------------------------------------------------- */

.csa-commerce__eyebrow--received,
.csa-commerce__title--received,
.csa-commerce__eyebrow--pay,
.csa-commerce__title--pay {
  display: none;
}

body.woocommerce-order-received .csa-commerce__eyebrow--checkout,
body.woocommerce-order-received .csa-commerce__title--checkout,
body.woocommerce-order-pay .csa-commerce__eyebrow--checkout,
body.woocommerce-order-pay .csa-commerce__title--checkout {
  display: none;
}

body.woocommerce-order-received .csa-commerce__eyebrow--received,
body.woocommerce-order-pay .csa-commerce__eyebrow--pay {
  display: block;
}

body.woocommerce-order-received .csa-commerce__title--received,
body.woocommerce-order-pay .csa-commerce__title--pay {
  display: block;
}

/* --------------------------------------------------------------------------
   2. The WooCommerce frame and the notices

   WooCommerce prints .woocommerce-notices-wrapper on every load, empty or
   not, which otherwise leaves a gap above the title.
   -------------------------------------------------------------------------- */

body.woocommerce-page .woocommerce {
  color: var(--csa-ink);
  font-family: var(--csa-font);
}

body.woocommerce-page .woocommerce-notices-wrapper:empty {
  display: none;
}

body.woocommerce-page .woocommerce-message,
body.woocommerce-page .woocommerce-info,
body.woocommerce-page .woocommerce-error {
  margin: 0 0 24px;
  padding: 16px 20px;
  border-top: 0;
  border-left: 4px solid var(--csa-purple-mid);
  border-radius: 8px;
  background-color: var(--csa-surface-grey);
  color: var(--csa-ink);
  font-size: 14px;
  line-height: 1.6;
  list-style: none;
}

/* WooCommerce sets an icon here from its own font. We use a left bar instead,
   so the glyph and the 3.5em of padding it needs both come off. */
body.woocommerce-page .woocommerce-message::before,
body.woocommerce-page .woocommerce-info::before,
body.woocommerce-page .woocommerce-error::before {
  display: none;
}

body.woocommerce-page .woocommerce-error {
  border-left-color: var(--csa-pink);
  background-color: var(--csa-surface-pink);
}

body.woocommerce-page .woocommerce-error li {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* --------------------------------------------------------------------------
   3. Buttons

   The geometry matches .csa-btn in 03-components.css, at 42px rather than
   34px, because these are the primary action on a payment page and 34px is
   under the 44px touch target on a phone. The hover colour is the same
   #e51f4f that section 1 of 03-components.css uses.
   -------------------------------------------------------------------------- */

body.woocommerce-page .woocommerce a.button,
body.woocommerce-page .woocommerce button.button,
body.woocommerce-page .woocommerce input.button,
body.woocommerce-page .woocommerce a.button.alt,
body.woocommerce-page .woocommerce button.button.alt,
body.woocommerce-page .woocommerce input.button.alt,
body.woocommerce-page .woocommerce button#place_order {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 42px;
  padding: 0 24px;
  border: 1px solid transparent;
  border-radius: var(--csa-radius-pill);
  background-color: var(--csa-pink);
  color: var(--csa-white);
  font-family: var(--csa-font);
  font-size: 13px;
  font-weight: var(--csa-fw-medium);
  line-height: 1;
  text-decoration: none;
  text-transform: none;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}

body.woocommerce-page .woocommerce a.button:hover,
body.woocommerce-page .woocommerce button.button:hover,
body.woocommerce-page .woocommerce input.button:hover,
body.woocommerce-page .woocommerce a.button.alt:hover,
body.woocommerce-page .woocommerce button.button.alt:hover,
body.woocommerce-page .woocommerce input.button.alt:hover,
body.woocommerce-page .woocommerce button#place_order:hover,
body.woocommerce-page .woocommerce a.button:focus-visible,
body.woocommerce-page .woocommerce button.button:focus-visible,
body.woocommerce-page .woocommerce input.button:focus-visible,
body.woocommerce-page .woocommerce button#place_order:focus-visible {
  background-color: #e51f4f;
  color: var(--csa-white);
}

/* The secondary pair: "Update cart" and "Return to shop". */
body.woocommerce-page .woocommerce button[name="update_cart"],
body.woocommerce-page .woocommerce a.button.wc-backward {
  border-color: var(--csa-navy);
  background-color: transparent;
  color: var(--csa-navy);
}

body.woocommerce-page .woocommerce button[name="update_cart"]:hover,
body.woocommerce-page .woocommerce a.button.wc-backward:hover {
  border-color: var(--csa-navy);
  background-color: var(--csa-navy);
  color: var(--csa-white);
}

body.woocommerce-page .woocommerce button.button:disabled,
body.woocommerce-page .woocommerce button.button:disabled[disabled] {
  border-color: var(--csa-border-card);
  background-color: var(--csa-border-card);
  color: var(--csa-ink-muted);
  cursor: not-allowed;
}

/* --------------------------------------------------------------------------
   4. Form fields and labels
   -------------------------------------------------------------------------- */

body.woocommerce-page .woocommerce form .form-row {
  margin: 0 0 20px;
  padding: 0;
}

body.woocommerce-page .woocommerce form .form-row label,
body.woocommerce-page .woocommerce .woocommerce-form-row label {
  display: block;
  margin: 0 0 6px;
  color: var(--csa-navy);
  font-size: var(--csa-fs-label);
  font-weight: var(--csa-fw-medium);
  line-height: var(--csa-lh-label);
}

body.woocommerce-page .woocommerce form .form-row .required {
  color: var(--csa-pink);
  border: 0;
  text-decoration: none;
  visibility: visible;
}

body.woocommerce-page .woocommerce form .form-row input.input-text,
body.woocommerce-page .woocommerce form .form-row textarea,
body.woocommerce-page .woocommerce form .form-row select,
body.woocommerce-page .woocommerce .woocommerce-form-row input.input-text {
  width: 100%;
  min-height: 44px;
  padding: 10px 14px;
  border: 1px solid var(--csa-border-card);
  border-radius: 8px;
  background-color: var(--csa-white);
  box-shadow: none;
  color: var(--csa-ink);
  font-family: var(--csa-font);
  font-size: 14px;
  line-height: 1.5;
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

body.woocommerce-page .woocommerce form .form-row textarea {
  min-height: 110px;
  resize: vertical;
}

body.woocommerce-page .woocommerce form .form-row input.input-text:focus,
body.woocommerce-page .woocommerce form .form-row textarea:focus,
body.woocommerce-page .woocommerce form .form-row select:focus {
  border-color: var(--csa-purple-mid);
  box-shadow: 0 0 0 3px rgba(161, 123, 255, 0.18);
  outline: 0;
}

body.woocommerce-page .woocommerce form .form-row input.input-text::placeholder,
body.woocommerce-page .woocommerce form .form-row textarea::placeholder {
  color: var(--csa-grey);
}

/* A checkbox row is a label wrapping an input, so it must not be a block. */
body.woocommerce-page .woocommerce form label.woocommerce-form__label-for-checkbox {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
  color: var(--csa-ink);
  font-size: 14px;
  font-weight: var(--csa-fw-regular);
}

body.woocommerce-page .woocommerce form input.woocommerce-form__input-checkbox {
  width: 16px;
  height: 16px;
  min-height: 0;
  margin: 0;
  accent-color: var(--csa-pink);
}

/* The payment method radio. Oxygen Elements for WooCommerce gives it a
   #d3ced2 border, which is the last of that plugin's own colours on these
   pages. Measured 2026-09-18. */
body.woocommerce-page .woocommerce form input.input-radio,
body.woocommerce-page .woocommerce input.input-radio {
  border-color: var(--csa-border-card);
  accent-color: var(--csa-pink);
}

/* Validation. WooCommerce paints a validated field green. We keep it neutral
   and use the pink only for a genuine error. */
body.woocommerce-page .woocommerce form .form-row.woocommerce-invalid input.input-text,
body.woocommerce-page .woocommerce form .form-row.woocommerce-invalid select,
body.woocommerce-page .woocommerce form .form-row.woocommerce-invalid .select2-selection--single {
  border-color: var(--csa-pink);
}

body.woocommerce-page .woocommerce form .form-row.woocommerce-validated input.input-text,
body.woocommerce-page .woocommerce form .form-row.woocommerce-validated select {
  border-color: var(--csa-border-card);
}

/* Select2 drives the Country / Region and Province fields.

   THE LONG SELECTOR IS LOAD BEARING. `woocommerce-blocktheme.css` sets
   `padding: 0.9rem 1.1rem` on the rendered span, from
   `.woocommerce-page form .form-row .select2-container .select2-selection--single
   .select2-selection__rendered`, which is 0,5,1. WooCommerce loads that file
   because it reads Oxygen as a block theme: the body carries
   `woocommerce-uses-block-theme`.

   14.4px of padding either side of a 42px line box made the rendered span
   70.8px tall inside a 44px control, so "South Africa" was drawn BELOW the
   box. Measured on the build site 2026-09-18.

   The fix takes the padding off the span and puts it on the control, which is
   now a flex row so the text centres itself at any font size. The selectors
   below are 0,5,2 and 0,6,2, so they clear the 0,5,1. Decision D114.

   The dropdown list is appended to the end of body, outside .woocommerce, so
   its two rules stay on the body class alone. */
body.woocommerce-page .woocommerce form .form-row .select2-container .select2-selection--single {
  display: flex;
  align-items: center;
  height: 44px;
  padding: 0 14px;
  border: 1px solid var(--csa-border-card);
  border-radius: 8px;
  background-color: var(--csa-white);
}

body.woocommerce-page .woocommerce form .form-row .select2-container .select2-selection--single .select2-selection__rendered {
  padding: 0;
  color: var(--csa-ink);
  font-size: 14px;
  line-height: 1.5;
}

body.woocommerce-page .woocommerce form .form-row .select2-container .select2-selection--single .select2-selection__arrow {
  top: 0;
  right: 8px;
  height: 100%;
}

body.woocommerce-page .select2-container--open .select2-dropdown {
  border-color: var(--csa-purple-mid);
  font-size: 14px;
}

body.woocommerce-page .select2-container--default .select2-results__option--highlighted[aria-selected] {
  background-color: var(--csa-pink);
}

/* --------------------------------------------------------------------------
   5. Tables, shared by cart, checkout and account

   The Acowebs deposit rows are added through
   woocommerce_cart_totals_after_order_total and
   woocommerce_review_order_after_order_total, so they are ordinary table
   rows inside these same tables and need no rule of their own.
   -------------------------------------------------------------------------- */

body.woocommerce-page .woocommerce table.shop_table {
  width: 100%;
  margin: 0 0 24px;
  border: 1px solid var(--csa-border-card);
  border-collapse: separate;
  border-spacing: 0;
  border-radius: var(--csa-radius-card-sm);
  font-size: 14px;
}

body.woocommerce-page .woocommerce table.shop_table th {
  padding: 14px 16px;
  border-top: 0;
  border-bottom: 1px solid var(--csa-border-card);
  background-color: var(--csa-surface-grey);
  color: var(--csa-navy);
  font-weight: var(--csa-fw-semibold);
  text-align: left;
}

body.woocommerce-page .woocommerce table.shop_table td {
  padding: 14px 16px;
  border-top: 1px solid var(--csa-border-card);
  color: var(--csa-ink);
  vertical-align: middle;
}

body.woocommerce-page .woocommerce table.shop_table tbody tr:first-child td {
  border-top: 0;
}

/* Oxygen Elements for WooCommerce puts a 1px #d3ced2 border on the ROW as
   well, so every line in the order table was drawn twice, in two colours,
   one of them WooCommerce's old grey. That is what made the table look
   broken. The cells own every line here. Measured 2026-09-18. */
body.woocommerce-page .woocommerce table.shop_table tr {
  border: 0;
}

/* border-collapse has to be separate for the radius to show at all, and a
   separate table squares its own corners at the first and last cell. */
body.woocommerce-page .woocommerce table.shop_table thead tr:first-child th:first-child {
  border-top-left-radius: var(--csa-radius-card-sm);
}

body.woocommerce-page .woocommerce table.shop_table thead tr:first-child th:last-child {
  border-top-right-radius: var(--csa-radius-card-sm);
}

body.woocommerce-page .woocommerce table.shop_table tfoot tr:last-child th:first-child,
body.woocommerce-page .woocommerce table.shop_table tfoot tr:last-child td:first-child {
  border-bottom-left-radius: var(--csa-radius-card-sm);
}

body.woocommerce-page .woocommerce table.shop_table tfoot tr:last-child th:last-child,
body.woocommerce-page .woocommerce table.shop_table tfoot tr:last-child td:last-child {
  border-bottom-right-radius: var(--csa-radius-card-sm);
}

body.woocommerce-page .woocommerce table.shop_table tfoot th,
body.woocommerce-page .woocommerce table.shop_table tfoot td {
  border-top: 1px solid var(--csa-border-card);
  background-color: transparent;
  color: var(--csa-navy);
  font-weight: var(--csa-fw-semibold);
}

body.woocommerce-page .woocommerce table.shop_table .product-name a {
  color: var(--csa-navy);
  font-weight: var(--csa-fw-medium);
  text-decoration: none;
}

body.woocommerce-page .woocommerce table.shop_table .product-name a:hover {
  color: var(--csa-pink);
}

body.woocommerce-page .woocommerce table.shop_table .amount {
  color: var(--csa-navy);
  font-weight: var(--csa-fw-semibold);
}

/* --------------------------------------------------------------------------
   6. Cart
   -------------------------------------------------------------------------- */

body.woocommerce-cart .woocommerce table.cart td.actions {
  padding: 16px;
}

body.woocommerce-cart .woocommerce table.cart td.actions .coupon {
  display: flex;
  align-items: center;
  gap: 12px;
  float: none;
  margin: 0 0 16px;
}

body.woocommerce-cart .woocommerce table.cart td.actions .coupon input.input-text {
  width: auto;
  min-width: 200px;
  min-height: 42px;
  margin: 0;
  padding: 10px 14px;
  border: 1px solid var(--csa-border-card);
  border-radius: 8px;
  font-size: 14px;
}

body.woocommerce-cart .woocommerce .cart-collaterals .cart_totals {
  float: none;
  width: 100%;
  max-width: 420px;
  margin-left: auto;
  padding: 24px;
  border: 1px solid var(--csa-border-card);
  border-radius: var(--csa-radius-card-sm);
  background-color: var(--csa-white);
}

body.woocommerce-cart .woocommerce .cart-collaterals .cart_totals h2 {
  margin: 0 0 16px;
  color: var(--csa-navy);
  font-weight: var(--csa-fw-bold);
}

body.woocommerce-cart .woocommerce .cart-collaterals .cart_totals table.shop_table {
  margin: 0 0 20px;
  border: 0;
}

body.woocommerce-cart .woocommerce .cart-collaterals .cart_totals table.shop_table th {
  padding-left: 0;
  border-bottom: 0;
  background-color: transparent;
}

body.woocommerce-cart .woocommerce .cart-collaterals .cart_totals table.shop_table td {
  padding-right: 0;
  text-align: right;
}

body.woocommerce-cart .woocommerce .wc-proceed-to-checkout a.checkout-button {
  display: flex;
  width: 100%;
}

/* --------------------------------------------------------------------------
   7. Checkout

   WooCommerce floats .col-1 and .col-2 at 48 per cent each from a 0,3,0
   rule. The ID on #customer_details takes these selectors to 1,2,0, so the
   float comes off cleanly without !important.
   -------------------------------------------------------------------------- */

/* The card around the billing block. Oxygen Elements for WooCommerce styles
   `.woocommerce .col2-set` at 0,2,0 with a 3px #65bec2 top border and #d3ced2
   sides, which are its own colours and not ours. The accent is pink here and
   the sides are our card border. The ID takes this to 1,3,0. Decision D113. */
body.woocommerce-checkout .woocommerce #customer_details.col2-set {
  border-width: 3px 1px 1px;
  border-style: solid;
  border-color: var(--csa-pink) var(--csa-border-card) var(--csa-border-card);
  border-radius: var(--csa-radius-card-sm);
  background-color: var(--csa-white);
  padding: 24px;
}

/* THE TWO-COLUMN CHECKOUT. Decided 2026-09-18.

   The form is a grid, because its four children are siblings and there is no
   wrapper to put round the left-hand pair. #customer_details spans both rows
   of column 1; the order heading and the order panel take column 2.
   `align-items: start` keeps the order panel at the top of its row instead of
   stretching to the height of the billing block.

   `wc-order-attribution-inputs` is left to auto-place. It holds hidden inputs
   only, so it lands in column 1 at zero height and costs nothing. It is NOT
   set to `display: none`, deliberately, so nothing about order attribution
   depends on a CSS rule. */
body.woocommerce-checkout form.checkout {
  /* The site header is `position: sticky` at 97px, measured on the build site
     2026-09-18, so the order panel has to clear it. Change this one value if
     the header height changes. */
  --csa-wc-sticky-top: 121px;
  /* The gap between the heading's top and the panel's top. It has to be at
     least the heading's own height, because the two share a grid cell. "Your
     order" is one line at every width the two-column layout runs at. */
  --csa-wc-heading-gap: 40px;

  display: grid;
  grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr);
  column-gap: 40px;
}

/* THE STICKY COLUMN, when snippet S6 is active.

   S6 wraps the heading and the order panel in `.csa-order-col`, through
   `woocommerce_checkout_before_order_review_heading` and
   `woocommerce_checkout_after_order_review`. Both hooks are in
   `templates/checkout/form-checkout.php` at lines 52 and 62 of WooCommerce
   11.1.0, and they sit either side of exactly those two elements, so no
   template is overridden.

   One wrapper means ONE sticky element, so the heading and the panel move
   together and travel the whole height of the billing column. The rules below
   use the child combinator, so the moment the wrapper exists the three
   fallback rules under it stop matching on their own. Decision D119.
   -------------------------------------------------------------------------- */

body.woocommerce-checkout form.checkout > .csa-order-col {
  position: sticky;
  top: var(--csa-wc-sticky-top);
  grid-column: 2;
  grid-row: 1;
  align-self: start;
}

body.woocommerce-checkout form.checkout > .csa-order-col > #order_review_heading {
  margin: 0 0 16px;
}

body.woocommerce-checkout form.checkout > .csa-order-col > #order_review {
  margin-top: 0;
}

/* THE FALLBACK, for as long as S6 is not installed.

   ALL THREE SIT IN ROW 1, and that is what makes the panel sticky at all.

   A sticky element can only travel inside its own containing block. In the
   first version the heading had row 1 and the panel had row 2, so each one
   had a grid area no taller than itself and neither could move. Row 1 was
   also auto-sized, so the billing block's height was shared across the two
   rows and pushed the panel about 190px down the page. That is the gap that
   showed, and the reason nothing stuck.

   With all three in row 1, the row is as tall as the billing block, both
   right-hand items get that full height to travel in, and `align-self: start`
   keeps them at the top of it. The panel clears the heading with a margin
   rather than a row.

   This fallback is NOT as good as the wrapper above, and the difference is
   measurable: the heading is 24px tall and the panel is 609px, so on a
   908px billing block the heading has 884px of sticky travel and the panel
   only 259px. Past that the panel rides up and the heading is left on its
   own. Install S6 and this stops mattering. */
body.woocommerce-checkout form.checkout > #customer_details {
  grid-column: 1;
  grid-row: 1;
}

/* The heading is deliberately NOT sticky here. Without the wrapper the two
   are separate siblings with separate containing blocks, so they cannot share
   a travel: a 24px heading has 884px of room on a 908px billing block and the
   609px panel has 259px. Sticking both leaves the heading hovering on its own
   once the panel has run out, which is the fault that was reported. Letting the
   heading scroll away reads as intentional at every scroll position. Install
   S6 and the two travel together properly. */
body.woocommerce-checkout form.checkout > #order_review_heading {
  grid-column: 2;
  grid-row: 1;
  align-self: start;
  margin: 0;
}

body.woocommerce-checkout form.checkout > #order_review {
  position: sticky;
  top: calc(var(--csa-wc-sticky-top) + var(--csa-wc-heading-gap));
  grid-column: 2;
  grid-row: 1;
  align-self: start;
  margin-top: var(--csa-wc-heading-gap);
}

/* Billing sits ABOVE Additional information now, not beside it. The left
   column is about 730px of a 1260px container, and the billing fields below
   take two sub-columns out of it. Three levels of column in that width would
   leave each field about 170px. */
/* NO BOTTOM MARGIN AT DESKTOP. Caught in review: a margin on the left column
   makes the grid row 40px taller than the card, and the sticky panel's travel
   is the row, so the panel kept sliding for 40px after the billing card had
   ended. The margin is only wanted below 991, where the two stack. */
body.woocommerce-checkout .woocommerce #customer_details.col2-set {
  display: block;
  margin: 0;
}

body.woocommerce-checkout .woocommerce #customer_details.col2-set > .col-1,
body.woocommerce-checkout .woocommerce #customer_details.col2-set > .col-2 {
  float: none;
  width: 100%;
  min-width: 0;
  margin: 0;
  padding: 0;
}

body.woocommerce-checkout .woocommerce #customer_details.col2-set > .col-2 {
  margin-top: 32px;
}

/* The billing fields, two up. WooCommerce floats `.form-row-first` and
   `.form-row-last` at 47 per cent; a grid item's float is ignored, but its
   width is not, so the width is reset here.

   The full-width four are the ones that read badly in half a column: the
   Title select, Company, and the two address lines. Everything else pairs in
   DOM order, and the pairing therefore follows the field ORDER, which snippet
   S6 sets. Without S6 the order is WooCommerce's own and Country sits alone
   on its row: that looks untidy but nothing breaks. Decision D116. */
body.woocommerce-checkout .woocommerce-billing-fields__field-wrapper,
body.woocommerce-checkout .woocommerce-shipping-fields__field-wrapper {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 24px;
}

body.woocommerce-checkout .woocommerce-billing-fields__field-wrapper > .form-row,
body.woocommerce-checkout .woocommerce-shipping-fields__field-wrapper > .form-row {
  float: none;
  width: auto;
  margin-left: 0;
  margin-right: 0;
}

body.woocommerce-checkout #billing_title_field,
body.woocommerce-checkout #billing_company_field,
body.woocommerce-checkout #billing_address_1_field,
body.woocommerce-checkout #billing_address_2_field {
  grid-column: 1 / -1;
}

body.woocommerce-checkout #customer_details h3 {
  margin: 0 0 20px;
  color: var(--csa-navy);
  font-weight: var(--csa-fw-bold);
}

body.woocommerce-checkout #order_review_heading {
  margin: 0 0 16px;
  color: var(--csa-navy);
  font-weight: var(--csa-fw-bold);
}

body.woocommerce-checkout #order_review {
  padding: 24px;
  border: 1px solid var(--csa-border-card);
  border-radius: var(--csa-radius-card-sm);
  background-color: var(--csa-white);
}

body.woocommerce-checkout #order_review table.shop_table {
  margin: 0 0 8px;
  border: 0;
}

body.woocommerce-checkout #order_review table.shop_table th,
body.woocommerce-checkout #order_review table.shop_table td {
  padding-left: 0;
  padding-right: 0;
}

/* The order table sits INSIDE a card, so it carries no border of its own and
   must carry no corner radius either. Section 5 rounds the first and last
   cells of a standalone table; left on here, that drew the stray curve under
   the TOTAL row. Measured 2026-09-18. */
body.woocommerce-checkout #order_review table.shop_table th,
body.woocommerce-checkout #order_review table.shop_table td {
  border-radius: 0;
}

body.woocommerce-checkout #order_review table.shop_table thead th {
  background-color: transparent;
}

/* THE TOTALS COLUMN IS RIGHT ALIGNED, so the amounts line up on the decimal
   instead of on the widest label. Decided 2026-09-18. */
body.woocommerce-checkout #order_review table.shop_table th.product-total,
body.woocommerce-checkout #order_review table.shop_table td.product-total,
body.woocommerce-checkout #order_review table.shop_table tfoot td {
  text-align: right;
}

/* THE STRAY HALF-LINE. A tfoot row is a <th> label and a <td> amount SIDE BY
   SIDE, not one above the other. Section 5 gives every th a bottom border, so
   in the tfoot that drew a line under the label only, stopping a third of the
   way across, and stacking a second line where one tfoot row met the next.
   The row's top border is the only line it needs. Measured 2026-09-18. */
body.woocommerce-checkout #order_review table.shop_table tfoot th {
  border-bottom: 0;
}

/* The total row closes the table, so it carries a bottom line the way every
   other row carries a top one. */
body.woocommerce-checkout #order_review table.shop_table tfoot tr.order-total th,
body.woocommerce-checkout #order_review table.shop_table tfoot tr.order-total td {
  border-bottom: 1px solid var(--csa-border-card);
}

/* The tax note sits UNDER the amount, not after it. WooCommerce prints it as
   a trailing <small> inside the same cell, so `display: block` is the whole
   change. The `.amount` inside it is overruled here as well, because section
   5 makes every `.amount` navy and semibold and this one is a footnote. */
body.woocommerce-checkout #order_review table.shop_table tfoot tr.order-total td small.includes_tax,
body.woocommerce-checkout #order_review table.shop_table tfoot tr.order-total td small.includes_tax .amount {
  color: var(--csa-ink-muted);
  font-size: var(--csa-fs-small);
  font-weight: var(--csa-fw-regular);
}

body.woocommerce-checkout #order_review table.shop_table tfoot tr.order-total td small.includes_tax {
  display: block;
  margin-top: 4px;
  line-height: var(--csa-lh-small);
}

body.woocommerce-checkout #payment {
  border-radius: 0;
  background-color: transparent;
}

body.woocommerce-checkout #payment ul.payment_methods {
  margin: 0;
  padding: 0 0 16px;
  border-bottom: 1px solid var(--csa-border-card);
  list-style: none;
}

body.woocommerce-checkout #payment ul.payment_methods li {
  margin: 0 0 8px;
  color: var(--csa-ink);
  font-size: 14px;
  list-style: none;
}

body.woocommerce-checkout #payment ul.payment_methods li label {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: var(--csa-navy);
  font-weight: var(--csa-fw-medium);
}

body.woocommerce-checkout #payment ul.payment_methods li input[type="radio"] {
  accent-color: var(--csa-pink);
}

/* The gateway's description panel. The lilac is the live site's own, read off
   collegesa.co.za as --global-palette7 and added to 01-tokens.css as
   --csa-lilac. Navy on it measures 6.8 to 1, which passes AA. The extra
   `.woocommerce` takes these to 1,3,1, because WooCommerce's own
   `.woocommerce-checkout #payment div.payment_box` is 1,2,1 and would
   otherwise tie. Decision D113. */
body.woocommerce-checkout .woocommerce #payment div.payment_box {
  margin: 8px 0 0;
  padding: 14px 16px;
  border-radius: 8px;
  background-color: var(--csa-lilac);
  color: var(--csa-navy);
  font-size: 13px;
  line-height: 1.6;
}

body.woocommerce-checkout .woocommerce #payment div.payment_box::before {
  border-bottom-color: var(--csa-lilac);
}

/* The gateway's own text is a <p>. Two things had to be fixed on it, and only
   on it:

   1. The colour. Oxygen Elements for WooCommerce sets #666666 on a long
      "Texts" selector list that reaches inside here, so the box was lilac
      with grey text on it.
   2. The top margin. WooCommerce removes the BOTTOM margin of the last
      paragraph and leaves the top one, so a single paragraph sat 16px low in
      its box and looked unaligned. The rule is scoped to the payment box, so
      no other paragraph on the site loses its top margin.

   Decided 2026-09-18. */
body.woocommerce-checkout .woocommerce #payment div.payment_box p {
  margin-top: 0;
  color: var(--csa-navy);
}

body.woocommerce-checkout .woocommerce #payment div.payment_box a {
  color: var(--csa-navy);
  text-decoration: underline;
}

/* The privacy policy line under the payment box, and any other text link in
   the checkout body. Pink and underlined, the same as the account area.
   `:not(.button)` keeps Register and the coupon button out of it. */
body.woocommerce-checkout .woocommerce form.checkout a:not(.button),
body.woocommerce-checkout .woocommerce .woocommerce-privacy-policy-text a {
  color: var(--csa-pink);
  text-decoration: underline;
}

body.woocommerce-checkout .woocommerce form.checkout a:not(.button):hover,
body.woocommerce-checkout .woocommerce .woocommerce-privacy-policy-text a:hover {
  color: var(--csa-navy);
}

body.woocommerce-checkout #payment div.form-row.place-order {
  margin: 0;
  padding: 20px 0 0;
}

body.woocommerce-checkout .woocommerce-terms-and-conditions-wrapper {
  margin: 0 0 16px;
  font-size: 13px;
}

body.woocommerce-checkout .woocommerce-form-coupon-toggle {
  margin: 0 0 24px;
}

/* Order received. The same card treatment, so the confirmation matches the
   page the student has just left. */
body.woocommerce-checkout .woocommerce-order .woocommerce-thankyou-order-received {
  margin: 0 0 24px;
  padding: 16px 20px;
  border-left: 4px solid var(--csa-purple-mid);
  border-radius: 8px;
  background-color: var(--csa-surface-grey);
  color: var(--csa-navy);
  font-size: 16px;
  font-weight: var(--csa-fw-semibold);
}

body.woocommerce-checkout .woocommerce-order ul.woocommerce-order-overview {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
  margin: 0 0 32px;
  padding: 20px 24px;
  border: 1px solid var(--csa-border-card);
  border-radius: var(--csa-radius-card-sm);
  list-style: none;
}

body.woocommerce-checkout .woocommerce-order ul.woocommerce-order-overview li {
  border: 0;
  color: var(--csa-ink-muted);
  font-size: var(--csa-fs-small);
  letter-spacing: 0.5px;
  text-transform: uppercase;
}

body.woocommerce-checkout .woocommerce-order ul.woocommerce-order-overview li strong {
  display: block;
  margin-top: 4px;
  color: var(--csa-navy);
  font-size: 16px;
  letter-spacing: 0;
  text-transform: none;
}

/* Oxygen Elements for WooCommerce 2.0.2 paints these black at 0,1,1, from
   the same over-broad headings rule described in section 10 of
   OXYGEN-CONVENTIONS.md. Measured on the build site, universal.css line 619. */
body.woocommerce-checkout .woocommerce h2.woocommerce-column__title,
body.woocommerce-checkout .woocommerce h2.woocommerce-order-details__title,
body.woocommerce-checkout .woocommerce .woocommerce-customer-details h2 {
  color: var(--csa-navy);
}

/* --------------------------------------------------------------------------
   8. My Account

   The .logged-in body class is what tells the two halves apart. Logged out,
   .woocommerce holds one login form and must stay a plain block. Logged in,
   it holds the navigation and the content panel side by side.
   -------------------------------------------------------------------------- */

body.woocommerce-account .woocommerce form.woocommerce-form-login,
body.woocommerce-account .woocommerce form.woocommerce-form-register,
body.woocommerce-account .woocommerce form.woocommerce-ResetPassword {
  max-width: 520px;
  margin: 0;
  padding: 28px;
  border: 1px solid var(--csa-border-card);
  border-radius: var(--csa-radius-card-sm);
  background-color: var(--csa-white);
}

body.woocommerce-account .woocommerce h2 {
  margin: 0 0 20px;
  color: var(--csa-navy);
  font-weight: var(--csa-fw-bold);
}

/* Every text link in the account area is pink and underlined, decided
   2026-09-18. `:not(.button)` keeps the Log in and Save buttons out of it:
   the button rule in section 3 is 0,3,1 and this would otherwise tie with it
   and win on order. The navigation links are excluded by their own rule
   further down, which is 0,5,1. */
body.woocommerce-account .woocommerce a:not(.button) {
  color: var(--csa-pink);
  text-decoration: underline;
}

body.woocommerce-account .woocommerce a:not(.button):hover,
body.woocommerce-account .woocommerce a:not(.button):focus-visible {
  color: var(--csa-navy);
}

body.woocommerce-account .woocommerce .woocommerce-LostPassword {
  margin: 16px 0 0;
  font-size: 14px;
}

body.woocommerce-account.logged-in .woocommerce {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 40px;
}

body.woocommerce-account.logged-in .woocommerce .woocommerce-notices-wrapper {
  flex: 1 0 100%;
}

body.woocommerce-account .woocommerce .woocommerce-MyAccount-navigation {
  float: none;
  flex: 0 0 240px;
  width: auto;
  padding: 12px;
  border: 1px solid var(--csa-border-card);
  border-radius: var(--csa-radius-card-sm);
  background-color: var(--csa-white);
}

body.woocommerce-account .woocommerce .woocommerce-MyAccount-navigation ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

body.woocommerce-account .woocommerce .woocommerce-MyAccount-navigation ul li {
  margin: 0;
  list-style: none;
}

body.woocommerce-account .woocommerce .woocommerce-MyAccount-navigation ul li a {
  display: block;
  padding: 10px 14px;
  border-radius: 8px;
  color: var(--csa-navy);
  font-size: 14px;
  font-weight: var(--csa-fw-medium);
  text-decoration: none;
  transition: background-color 0.2s ease, color 0.2s ease;
}

body.woocommerce-account .woocommerce .woocommerce-MyAccount-navigation ul li a:hover,
body.woocommerce-account .woocommerce .woocommerce-MyAccount-navigation ul li.is-active a {
  background-color: var(--csa-surface-grey);
  color: var(--csa-pink);
}

body.woocommerce-account .woocommerce .woocommerce-MyAccount-content {
  float: none;
  flex: 1 1 320px;
  width: auto;
  min-width: 0;
}

body.woocommerce-account .woocommerce .woocommerce-MyAccount-content p {
  color: var(--csa-ink);
  font-size: 14px;
  line-height: 1.6;
}

body.woocommerce-account .woocommerce .woocommerce-MyAccount-content mark {
  background-color: transparent;
  color: var(--csa-navy);
  font-weight: var(--csa-fw-semibold);
}

/* The Addresses panel. Its two halves are a `.col2-set`, so the card guard in
   section 0 has already given it the pink top. What is left is the alignment:
   the "Add Billing address" link is a block-level `a` inside
   `.woocommerce-Address-title`, and it was drawing centred. Fixed
   2026-09-18. */
body.woocommerce-account .woocommerce .woocommerce-Address-title,
body.woocommerce-account .woocommerce .woocommerce-Address-title .edit,
body.woocommerce-account .woocommerce .woocommerce-Address address {
  text-align: left;
}

body.woocommerce-account .woocommerce .woocommerce-Address-title .edit {
  display: inline-block;
  margin-bottom: 16px;
}

body.woocommerce-account .woocommerce .woocommerce-Addresses.col2-set {
  display: flex;
  flex-wrap: wrap;
  gap: 40px;
}

body.woocommerce-account .woocommerce .woocommerce-Addresses.col2-set > .woocommerce-Address {
  float: none;
  flex: 1 1 260px;
  width: auto;
  min-width: 0;
}

/* Account details. The card guard gives the form its pink top; the field grid
   is the checkout's, so First name and Last name pair the same way. */
body.woocommerce-account .woocommerce form.woocommerce-EditAccountForm > p.form-row,
body.woocommerce-account .woocommerce form.woocommerce-EditAccountForm > fieldset {
  max-width: none;
}

body.woocommerce-account .woocommerce form.woocommerce-EditAccountForm fieldset {
  margin: 24px 0 0;
  padding: 24px 0 0;
  border: 0;
  border-top: 1px solid var(--csa-border-card);
}

body.woocommerce-account .woocommerce form.woocommerce-EditAccountForm legend {
  padding: 0;
  color: var(--csa-navy);
  font-weight: var(--csa-fw-semibold);
}

/* --------------------------------------------------------------------------
   9. Tablet and mobile

   768 is WooCommerce's own small-screen breakpoint, the one that turns a
   shop table into stacked rows in woocommerce-smallscreen.css. Matching it
   keeps the two sets of rules in step.
   -------------------------------------------------------------------------- */

/* The checkout drops to one column at 991, an Oxygen breakpoint and the width
   at which a 1fr order panel stops being wide enough to read a price in. */
@media (max-width: 991px) {

  body.woocommerce-checkout form.checkout {
    display: block;
  }

  /* Stacked, so the billing card needs the gap the desktop grid supplies
     with its column-gap. */
  body.woocommerce-checkout .woocommerce #customer_details.col2-set {
    margin-bottom: 32px;
  }

  /* Sticky goes with the grid. In one column the panel is below the form, so
     there is nothing left to stick to. Both the wrapper and the two-element
     fallback are unstuck here. */
  body.woocommerce-checkout form.checkout > .csa-order-col,
  body.woocommerce-checkout form.checkout > #order_review_heading,
  body.woocommerce-checkout form.checkout > #order_review {
    position: static;
    margin-top: 0;
  }

  body.woocommerce-checkout form.checkout > #order_review_heading {
    margin-bottom: 16px;
  }
}

/* The billing pair collapses at 600, not 768. Two 44px fields still read at
   600 in the left column; below it they do not. */
@media (max-width: 600px) {

  body.woocommerce-checkout .woocommerce-billing-fields__field-wrapper,
  body.woocommerce-checkout .woocommerce-shipping-fields__field-wrapper {
    grid-template-columns: minmax(0, 1fr);
  }
}

@media (max-width: 768px) {

  body.woocommerce-checkout .woocommerce #customer_details.col2-set {
    margin-bottom: 32px;
    padding: 20px 16px;
  }

  body.woocommerce-checkout .woocommerce #customer_details.col2-set > .col-2 {
    margin-top: 24px;
  }

  body.woocommerce-account.logged-in .woocommerce {
    display: block;
  }

  body.woocommerce-account .woocommerce .woocommerce-MyAccount-navigation {
    margin: 0 0 24px;
  }

  body.woocommerce-page .woocommerce table.shop_table th,
  body.woocommerce-page .woocommerce table.shop_table td {
    padding: 12px 14px;
  }

  body.woocommerce-cart .woocommerce .cart-collaterals .cart_totals {
    max-width: none;
    margin-left: 0;
  }

  body.woocommerce-cart .woocommerce table.cart td.actions .coupon {
    flex-wrap: wrap;
  }

  body.woocommerce-cart .woocommerce table.cart td.actions .coupon input.input-text {
    flex: 1 1 100%;
    min-width: 0;
  }
}

@media (max-width: 480px) {

  body.woocommerce-page .woocommerce a.button,
  body.woocommerce-page .woocommerce button.button,
  body.woocommerce-page .woocommerce input.button,
  body.woocommerce-page .woocommerce button#place_order {
    width: 100%;
  }

  body.woocommerce-checkout #order_review,
  body.woocommerce-cart .woocommerce .cart-collaterals .cart_totals {
    padding: 20px 16px;
  }

  body.woocommerce-account .woocommerce form.woocommerce-form-login,
  body.woocommerce-account .woocommerce form.woocommerce-form-register,
  body.woocommerce-account .woocommerce form.woocommerce-ResetPassword {
    padding: 20px 16px;
  }

  body.woocommerce-checkout .woocommerce-order ul.woocommerce-order-overview {
    gap: 16px;
    padding: 16px;
  }
}


.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container > .gform-grid-col > label {
  display: none !important;
}

.awcdp-deposits-wrapper,
.single_add_to_cart_button,
.quantity {
    display: none !important;
}

body.woocommerce-checkout #billing_country_field {
  display: none;
}
/* ==========================================================================
   CollegeSA - 07 forms
   Gravity Forms. One style for every form on the site.
   Created 2026-09-18, session 31. Decision D107.

   SCOPE. Every rule in this file starts at `.gform_wrapper`. That class is
   written by Gravity Forms and by nothing else, so no rule here can reach an
   Oxygen element, a WooCommerce cart or checkout form, or anything else on
   the page. 

   HOW THIS FILE BEATS GRAVITY FORMS, AND HOW IT BEATS WOOCOMMERCE.
   Measured on the build site, 2026-09-17 and 2026-09-18.

   THERE IS ONE `!important` BLOCK IN THIS FILE, IN SECTION 12, AND NOWHERE
   ELSE. It answers a third-party plugin that deliberately repaints the
   chained select controls. The reasoning is written out there.

   1. Every `--gf-ctrl-*` variable is declared by Gravity Forms at
      `.gform-theme--api,.gform-theme--framework`, which is 0,1,0. Section 2
      below sets them at `.gform_wrapper.gform-theme--framework`, 0,2,0, so
      it wins with no `!important`. The per-form inline `<style>`
      block Gravity Forms prints is 1,2,0, but it only sets the
      `--gf-color-*` palette, which sits ABOVE this layer, not below it. So
      that block is never fought.

   2. WooCommerce paints bare form elements on every WooCommerce page, which
      is all 209 course pages. `.woocommerce input[type="text"]` is 0,2,1 and
      beat our header search at 0,1,0. Decisions D99 and D101. So every
      property rule in this file names the element and carries three classes,
      which is 0,4,1 or better. D101 also says a base rule cannot beat a
      state rule at any specificity, so hover and focus are answered
      separately, in full, resetting every property the other rule sets.

   TWO SPECIFICITY SHAPES ARE USED, AND ONLY TWO.
       Variables    .gform_wrapper.gform-theme--framework                0,2,0
       Properties   .gform_wrapper.gform-theme.gform-theme--framework    0,3,0
                    plus the element and its class                       0,4,1

   THE NUMBERS ARE ALL IN SECTION 1. Change a form value there, not in the
   rule that uses it. This is decision D62 applied where the builder cannot
   reach: one tuning surface, so a change is one line and not a hunt.

   WHERE THE VALUES COME FROM.
   - Read off the LIVE style guide `/enquire-now/`, 2026-09-17: the 56px
     control height, the 8px label gap, the 13px description, the pink
     required mark, Poppins throughout.
   - Read off the design, the form over a photo, 2026-09-18: the filled
     borderless field, the 10px field radius, the rounded submit that is not
     a pill, the full width submit, the pink glow under it.
   - Four numbers were read off a SCREENSHOT of that design, not off a
     rendered page, because the Figma connector is not authorised. They are
     marked "screenshot" below. Confirm them on screen before sign-off.

   Contents
   1.  The numbers
   2.  The Gravity Forms variable map
   3.  The field grid
   4.  Labels, required marks and sub-labels
   5.  Descriptions
   6.  Text inputs, selects and textareas
   7.  Radios and checkboxes
   8.  Section breaks, the one heading in this file
   9.  The submit button and its arrow
   10. Validation
   11. The confirmation message
   12. Chained Selects
   13. The date picker
   14. File upload, and Turnstile
   15. The rating stars
   16. Tablet and mobile
   ========================================================================== */


/* --------------------------------------------------------------------------
   1. The numbers

   Everything tunable is here. The `--csa-*` tokens come from
   `css/01-tokens.css` and are not repeated.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme--framework {

  /* ---- Rhythm ----------------------------------------------------- */
  /* Live measures a 40px row gap. The design reads about 24px, which is
     what a two-up row needs to stay readable. screenshot. */
  --csa-form-row-gap: 24px;
  --csa-form-col-gap: 16px;

  /* ---- The field -------------------------------------------------- */
  /* 56px is measured on live. The design draws it tighter, and at the
     screenshot's scale it reads about 50px. 56px is kept because 16px
     type needs the room and it is a comfortable touch target. */
  --csa-form-field-h: 56px;
  --csa-form-field-radius: 10px;              
  --csa-form-field-bg: #eef2f8;               
  --csa-form-field-bg-focus: var(--csa-white);
  --csa-form-field-bg-disabled: #f4f6fa;
  --csa-form-field-border-w: 1px;
  --csa-form-field-border: transparent;
  --csa-form-field-border-hover: #d5dde9;
  --csa-form-field-border-focus: var(--csa-pink);
  --csa-form-field-text: var(--csa-ink);
  --csa-form-field-fs: 15px;                 
  --csa-form-field-pad-x: 16px;
  --csa-form-placeholder: #8a94a6;
  --csa-form-field-shadow: none;
  --csa-form-field-shadow-focus: 0 0 0 3px rgba(255, 51, 100, 0.16);

  /* ---- The label -------------------------------------------------- */
  --csa-form-label-fs: 15px;                  
  --csa-form-label-fw: var(--csa-fw-regular);
  --csa-form-label-color: var(--csa-navy);
  --csa-form-label-gap: 8px;                  
  --csa-form-sublabel-fs: 13px;
  --csa-form-sublabel-color: var(--csa-ink-muted);

  /* ---- Descriptions and errors ------------------------------------ */
  --csa-form-desc-fs: 13px;                   
  --csa-form-desc-color: var(--csa-ink-muted);
  --csa-form-error: #d92d20;
  --csa-form-error-bg: #fef3f2;

  /* ---- The submit ------------------------------------------------- */
  --csa-form-submit-radius: 14px;
  --csa-form-submit-bg: var(--csa-pink);
  --csa-form-submit-bg-hover: #e51f4f;
  --csa-form-submit-color: var(--csa-white);
  --csa-form-submit-fs: 18px;                 
  --csa-form-submit-fw: var(--csa-fw-semibold);
  --csa-form-submit-pad-y: 18px;              
  --csa-form-submit-pad-x: 32px;              
  --csa-form-submit-gap: 12px;                
  --csa-form-submit-shadow: 0 8px 20px rgba(255, 51, 100, 0.28);
  --csa-form-submit-shadow-hover: 0 10px 24px rgba(255, 51, 100, 0.34);

  /* ---- Choices ---------------------------------------------------- */
  --csa-form-choice-size: 20px;
  --csa-form-choice-gap: 12px;

  /* ---- The rating stars ------------------------------------------- */
  --csa-form-star-size: 32px;
  --csa-form-star-gap: 8px;
}


/* --------------------------------------------------------------------------
   2. The Gravity Forms variable map

   This block does most of the work. Gravity Forms consumes these in its own
   stylesheets, so setting them restyles the controls, the labels, the
   descriptions, the choices and the states in one place, without fighting a
   single property rule.

   0,2,0 against Gravity Forms' own 0,1,0.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme--framework {

  /* ---- Control, the box ------------------------------------------- */
  --gf-ctrl-size: var(--csa-form-field-h);
  --gf-ctrl-size-md: var(--csa-form-field-h);
  --gf-ctrl-radius: var(--csa-form-field-radius);
  --gf-ctrl-padding-x: var(--csa-form-field-pad-x);
  --gf-ctrl-padding-y: 0;

  --gf-ctrl-bg-color: var(--csa-form-field-bg);
  --gf-ctrl-bg-color-hover: var(--csa-form-field-bg);
  --gf-ctrl-bg-color-focus: var(--csa-form-field-bg-focus);
  --gf-ctrl-bg-color-disabled: var(--csa-form-field-bg-disabled);
  --gf-ctrl-bg-color-error: var(--csa-form-error-bg);

  --gf-ctrl-border-style: solid;
  --gf-ctrl-border-width: var(--csa-form-field-border-w);
  --gf-ctrl-border-color: var(--csa-form-field-border);
  --gf-ctrl-border-color-hover: var(--csa-form-field-border-hover);
  --gf-ctrl-border-color-focus: var(--csa-form-field-border-focus);
  --gf-ctrl-border-color-disabled: transparent;
  --gf-ctrl-border-color-error: var(--csa-form-error);

  --gf-ctrl-shadow: var(--csa-form-field-shadow);

  /* The focus ring is a box-shadow, section 6, so the outline is off.
     A visible ring is still guaranteed: see the note in section 6. */
  --gf-ctrl-outline-width: 0;
  --gf-ctrl-outline-width-focus: 0;
  --gf-ctrl-outline-color-focus: transparent;
  --gf-ctrl-outline-offset: 0;

  /* ---- Control, the type ------------------------------------------ */
  --gf-ctrl-font-family: var(--csa-font);
  --gf-ctrl-font-size: var(--csa-form-field-fs);
  --gf-ctrl-font-weight: var(--csa-fw-regular);
  --gf-ctrl-font-style: normal;
  --gf-ctrl-letter-spacing: normal;
  --gf-ctrl-line-height: 1.5;
  --gf-ctrl-color: var(--csa-form-field-text);
  --gf-ctrl-color-hover: var(--csa-form-field-text);
  --gf-ctrl-color-focus: var(--csa-form-field-text);
  --gf-ctrl-color-disabled: var(--csa-ink-muted);
  --gf-ctrl-color-error: var(--csa-form-field-text);

  --gf-ctrl-placeholder-color: var(--csa-form-placeholder);
  --gf-ctrl-placeholder-font-family: var(--csa-font);
  --gf-ctrl-placeholder-font-size: var(--csa-form-field-fs);
  --gf-ctrl-placeholder-font-weight: var(--csa-fw-regular);
  --gf-ctrl-placeholder-opacity: 1;

  --gf-ctrl-readonly-color: var(--csa-ink-muted);
  --gf-ctrl-readonly-font-family: var(--csa-font);
  --gf-ctrl-readonly-font-size: var(--csa-form-field-fs);

  /* ---- Control, the label ----------------------------------------- */
  --gf-ctrl-label-color-primary: var(--csa-form-label-color);
  --gf-ctrl-label-font-family-primary: var(--csa-font);
  --gf-ctrl-label-font-size-primary: var(--csa-form-label-fs);
  --gf-ctrl-label-font-weight-primary: var(--csa-form-label-fw);
  --gf-ctrl-label-line-height-primary: 1.4;

  --gf-ctrl-label-color-secondary: var(--csa-form-sublabel-color);
  --gf-ctrl-label-font-family-secondary: var(--csa-font);
  --gf-ctrl-label-font-size-secondary: var(--csa-form-sublabel-fs);
  --gf-ctrl-label-font-weight-secondary: var(--csa-fw-regular);
  --gf-ctrl-label-line-height-secondary: 1.4;

  --gf-ctrl-label-color-tertiary: var(--csa-form-label-color);
  --gf-ctrl-label-font-family-tertiary: var(--csa-font);
  --gf-ctrl-label-font-size-tertiary: var(--csa-form-field-fs);
  --gf-ctrl-label-font-weight-tertiary: var(--csa-fw-regular);

  --gf-ctrl-label-color-quaternary: var(--csa-ink-muted);
  --gf-ctrl-label-font-family-quaternary: var(--csa-font);
  --gf-ctrl-label-font-size-quaternary: var(--csa-form-sublabel-fs);

  /* The required mark. Pink on live, and the design agrees. */
  --gf-ctrl-label-color-req: var(--csa-pink);
  --gf-ctrl-label-font-family-req: var(--csa-font);
  --gf-ctrl-label-font-size-req: var(--csa-form-label-fs);
  --gf-ctrl-label-font-weight-req: var(--csa-form-label-fw);

  /* ---- Control, the description ----------------------------------- */
  --gf-ctrl-desc-color: var(--csa-form-desc-color);
  --gf-ctrl-desc-font-family: var(--csa-font);
  --gf-ctrl-desc-font-size: var(--csa-form-desc-fs);
  --gf-ctrl-desc-font-weight: var(--csa-fw-regular);
  --gf-ctrl-desc-line-height: 1.45;

  --gf-ctrl-desc-color-error: var(--csa-form-error);
  --gf-ctrl-desc-font-family-error: var(--csa-font);
  --gf-ctrl-desc-font-size-error: var(--csa-form-desc-fs);
  --gf-ctrl-desc-font-weight-error: var(--csa-fw-medium);

  /* ---- Control, the select chevron -------------------------------- */
  /* Our own chevron, in Navy. Gravity Forms' default is its own grey and
     it is set on the palette layer, which this file does not touch. */
  --gf-ctrl-select-icon: url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0.292893 0.292893C0.683417 -0.097631 1.31658 -0.097631 1.70711 0.292893L5 3.58579L8.29289 0.292893C8.68342 -0.0976311 9.31658 -0.0976311 9.70711 0.292893C10.0976 0.683417 10.0976 1.31658 9.70711 1.70711L5.70711 5.70711C5.31658 6.09763 4.68342 6.09763 4.29289 5.70711L0.292893 1.70711C-0.0976311 1.31658 -0.0976311 0.683418 0.292893 0.292893Z' fill='%230d2651'/%3E%3C/svg%3E");
  --gf-ctrl-select-icon-hover: var(--gf-ctrl-select-icon);
  --gf-ctrl-select-icon-focus: var(--gf-ctrl-select-icon);
  --gf-ctrl-select-icon-size: 10px auto;
  --gf-ctrl-select-padding-x: 44px;

  /* ---- Control, the textarea -------------------------------------- */
  --gf-ctrl-textarea-height: 150px;
  --gf-ctrl-textarea-radius: var(--csa-form-field-radius);
  --gf-ctrl-textarea-padding-y: 14px;
  --gf-ctrl-textarea-line-height: 1.55;
  --gf-ctrl-textarea-resize: vertical;

  /* ---- Control, the choices --------------------------------------- */
  --gf-ctrl-choice-size: var(--csa-form-choice-size);
  --gf-ctrl-choice-size-md: var(--csa-form-choice-size);
  --gf-ctrl-choice-check-color: var(--csa-white);
  --gf-ctrl-accent-color: var(--csa-pink);
  --gf-ctrl-checkbox-check-radius: 4px;
  --gf-ctrl-radio-check-size: 8px;

  /* ---- Control, the button ---------------------------------------- */
  --gf-ctrl-btn-radius: var(--csa-form-submit-radius);
  --gf-ctrl-btn-font-family: var(--csa-font);
  --gf-ctrl-btn-font-size: var(--csa-form-submit-fs);
  --gf-ctrl-btn-font-weight: var(--csa-form-submit-fw);
  --gf-ctrl-btn-line-height: 1;
  --gf-ctrl-btn-letter-spacing: normal;
  --gf-ctrl-btn-text-transform: none;
  --gf-ctrl-btn-text-decoration: none;
  --gf-ctrl-btn-padding-x: var(--csa-form-submit-pad-x);
  --gf-ctrl-btn-padding-y: var(--csa-form-submit-pad-y);
  --gf-ctrl-btn-icon-gap: var(--csa-form-submit-gap);
  --gf-ctrl-btn-size: auto;
  --gf-ctrl-btn-size-md: auto;

  --gf-ctrl-btn-bg-color-primary: var(--csa-form-submit-bg);
  --gf-ctrl-btn-bg-color-hover-primary: var(--csa-form-submit-bg-hover);
  --gf-ctrl-btn-bg-color-focus-primary: var(--csa-form-submit-bg-hover);
  --gf-ctrl-btn-bg-color-disabled-primary: #f4a8bc;
  --gf-ctrl-btn-color-primary: var(--csa-form-submit-color);
  --gf-ctrl-btn-color-hover-primary: var(--csa-form-submit-color);
  --gf-ctrl-btn-color-focus-primary: var(--csa-form-submit-color);
  --gf-ctrl-btn-color-disabled-primary: var(--csa-white);
  --gf-ctrl-btn-border-style-primary: solid;
  --gf-ctrl-btn-border-width-primary: 1px;
  --gf-ctrl-btn-border-color-primary: transparent;
  --gf-ctrl-btn-border-color-hover-primary: transparent;
  --gf-ctrl-btn-border-color-focus-primary: transparent;
  --gf-ctrl-btn-shadow: var(--csa-form-submit-shadow);
  --gf-ctrl-btn-shadow-hover: var(--csa-form-submit-shadow-hover);
  --gf-ctrl-btn-shadow-focus: var(--csa-form-submit-shadow-hover);

  /* ---- The date picker -------------------------------------------- */
  --gf-ctrl-date-picker-bg-color: var(--csa-white);
  --gf-ctrl-date-picker-radius: 14px;
  --gf-ctrl-date-picker-shadow: var(--csa-shadow-card);
  --gf-ctrl-date-picker-cell-content-radius: 8px;
  --gf-ctrl-date-picker-cell-content-color: var(--csa-ink);
  --gf-ctrl-date-picker-cell-content-color-hover: var(--csa-navy);
  --gf-ctrl-date-picker-cell-content-color-selected: var(--csa-white);
  --gf-ctrl-date-picker-cell-content-bg-color-hover: var(--csa-surface-grey);
  --gf-ctrl-date-picker-cell-content-bg-color-selected: var(--csa-pink);
  --gf-ctrl-date-picker-head-cell-font-weight: var(--csa-fw-semibold);

  /* ---- File upload ------------------------------------------------ */
  --gf-ctrl-file-btn-radius: 8px;
  --gf-ctrl-file-btn-font-family: var(--csa-font);
  --gf-ctrl-file-btn-font-weight: var(--csa-fw-medium);
  --gf-ctrl-file-btn-text-transform: none;
  --gf-ctrl-file-zone-radius: var(--csa-form-field-radius);
  --gf-ctrl-file-prog-bar-bg-color-loading: var(--csa-pink);
  --gf-ctrl-file-prog-bar-radius: 4px;
}


/* --------------------------------------------------------------------------
   3. The field grid

   Gravity Forms lays the fields out on a 12 column grid and each field
   carries its own span, set per field in the admin. This file only sets the
   gaps. It never sets a span, because a span is content, not style, and
   changing one here would silently override what the admin says.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme.gform-theme--framework .gform_fields {
  row-gap: var(--csa-form-row-gap);
  column-gap: var(--csa-form-col-gap);
}

/* A field box carries no spacing of its own. All of it is the grid gap, so
   a hidden field cannot leave a hole. */
.gform_wrapper.gform-theme.gform-theme--framework .gform_fields > .gfield {
  margin: 0;
  padding: 0;
}



/* --------------------------------------------------------------------------
   4. Labels, required marks and sub-labels

   The colour, size and weight all come from the variable map in section 2.
   What is left is the gap under the label, which has no variable, and the
   spacing of the required mark.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme.gform-theme--framework label.gfield_label {
  display: block;
  margin: 0 0 var(--csa-form-label-gap);
  padding: 0;
}

/* The asterisk sits against the label text on live with a space before it.
   Gravity Forms prints the space, so this rule only stops it wrapping to a
   line of its own on a long label. */
.gform_wrapper.gform-theme.gform-theme--framework .gfield_required {
  white-space: nowrap;
}

/* A sub-label belongs to a compound field: name, address, and the two
   halves of a date. It sits under its own input. */
.gform_wrapper.gform-theme.gform-theme--framework .ginput_complex label {
  margin: 6px 0 0;
}


/* --------------------------------------------------------------------------
   5. Descriptions

   Size and colour are in section 2. 
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme.gform-theme--framework .gfield_description {
  margin: 8px 0 0;
  padding: 0;
}

/* A description set above the field needs the margin on the other side. */
.gform_wrapper.gform-theme.gform-theme--framework .gfield_description.gfield_description_above {
  margin: 0 0 8px;
}

.gform_required_legend {
  display: none !important; 
}


/* --------------------------------------------------------------------------
   6. Text inputs, selects and textareas

   THIS IS THE WOOCOMMERCE BLOCK. Decisions D99 and D101.

   On a WooCommerce page, which is every course page, WooCommerce paints
   `input`, `select` and `textarea` by element at 0,2,1. Measured on
   `/courses/uncategorized/test/` on 2026-09-17: our fields came out with a
   `#d3ced2` border, a 4px radius and black text, none of which is ours.

   So each rule below names the element and carries three classes, 0,4,1.
   D101 is the other half: a base rule cannot beat a state rule at any
   specificity, because both match and the state rule comes later. So hover
   and focus are written out in full, and each one resets EVERY property the
   WooCommerce rule sets in that state: background, border, box-shadow,
   colour and outline.

   The focus ring is a box-shadow, not an outline, because WooCommerce sets
   `outline: none` on focus at 0,2,1 and a bare outline of ours would be
   erased. A box-shadow is not in WooCommerce's reset, so it survives. The
   pink border comes with it, so the ring is visible in forced-colours mode
   as well.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme.gform-theme--framework input[type="text"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="email"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="tel"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="url"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="number"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="password"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="date"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="search"],
.gform_wrapper.gform-theme.gform-theme--framework select,
.gform_wrapper.gform-theme.gform-theme--framework textarea {
  font-family: var(--csa-font);
  font-size: var(--csa-form-field-fs);
  font-weight: var(--csa-fw-regular);
  line-height: 1.5;
  color: var(--csa-form-field-text);
  background-color: var(--csa-form-field-bg);
  border: var(--csa-form-field-border-w) solid var(--csa-form-field-border);
  border-radius: var(--csa-form-field-radius);
  box-shadow: var(--csa-form-field-shadow);
  outline: none;
  transition: background-color 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease;
}

.gform_wrapper.gform-theme.gform-theme--framework input[type="text"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="email"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="tel"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="url"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="number"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="password"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="date"],
.gform_wrapper.gform-theme.gform-theme--framework input[type="search"],
.gform_wrapper.gform-theme.gform-theme--framework select {
  height: var(--csa-form-field-h);
  padding: 0 var(--csa-form-field-pad-x);
}

/* THE SELECT NEEDS `align-content`, OR ITS TEXT SITS AT THE TOP OF THE BOX. */
.gform_wrapper.gform-theme.gform-theme--framework select {
  align-content: center;
  padding-top: calc((var(--csa-form-field-h) - (var(--csa-form-field-fs) * 1.5) - (var(--csa-form-field-border-w) * 2)) / 2);
  padding-bottom: calc((var(--csa-form-field-h) - (var(--csa-form-field-fs) * 1.5) - (var(--csa-form-field-border-w) * 2)) / 2);
  padding-left: var(--csa-form-field-pad-x);
  padding-right: var(--gf-ctrl-select-padding-x);
}

.gform_wrapper.gform-theme.gform-theme--framework textarea {
  min-height: var(--gf-ctrl-textarea-height);
  padding: 14px var(--csa-form-field-pad-x);
  resize: vertical;
}

/* ---- Hover. Answers `.woocommerce input:hover` in full. ---- */

.gform_wrapper.gform-theme.gform-theme--framework input[type="text"]:hover,
.gform_wrapper.gform-theme.gform-theme--framework input[type="email"]:hover,
.gform_wrapper.gform-theme.gform-theme--framework input[type="tel"]:hover,
.gform_wrapper.gform-theme.gform-theme--framework input[type="url"]:hover,
.gform_wrapper.gform-theme.gform-theme--framework input[type="number"]:hover,
.gform_wrapper.gform-theme.gform-theme--framework input[type="password"]:hover,
.gform_wrapper.gform-theme.gform-theme--framework input[type="date"]:hover,
.gform_wrapper.gform-theme.gform-theme--framework input[type="search"]:hover,
.gform_wrapper.gform-theme.gform-theme--framework select:hover,
.gform_wrapper.gform-theme.gform-theme--framework textarea:hover {
  color: var(--csa-form-field-text);
  background-color: var(--csa-form-field-bg);
  border: var(--csa-form-field-border-w) solid var(--csa-form-field-border-hover);
  box-shadow: var(--csa-form-field-shadow);
  outline: none;
}

/* ---- Focus. Answers `.woocommerce input:focus` in full. ----

   Both `:focus` and `:focus-visible` are written. A form control shows its
   focus state on a mouse click as well as a keyboard tab, unlike a link, so
   `:focus-visible` on its own would leave a click-focused field unmarked.
   D101 also records that a scripted `element.focus()` does NOT match
   `:focus-visible` in Chrome. Test this with a real click. */

.gform_wrapper.gform-theme.gform-theme--framework input[type="text"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework input[type="email"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework input[type="tel"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework input[type="url"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework input[type="number"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework input[type="password"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework input[type="date"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework input[type="search"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework select:focus,
.gform_wrapper.gform-theme.gform-theme--framework textarea:focus,
.gform_wrapper.gform-theme.gform-theme--framework input[type="text"]:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework input[type="email"]:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework input[type="tel"]:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework input[type="url"]:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework input[type="number"]:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework input[type="password"]:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework input[type="date"]:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework input[type="search"]:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework select:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework textarea:focus-visible {
  color: var(--csa-form-field-text);
  background-color: var(--csa-form-field-bg-focus);
  border: var(--csa-form-field-border-w) solid var(--csa-form-field-border-focus);
  box-shadow: var(--csa-form-field-shadow-focus);
  outline: none;
}

/* The placeholder. `::placeholder` needs its own rule, because a placeholder
   inherits nothing useful from the control. */
.gform_wrapper.gform-theme.gform-theme--framework input::placeholder,
.gform_wrapper.gform-theme.gform-theme--framework textarea::placeholder {
  color: var(--csa-form-placeholder);
  opacity: 1;
}

/* A select with no chosen value shows its placeholder option. Gravity Forms
   marks it `gf_placeholder`, which is the only way to grey it. */
.gform_wrapper.gform-theme.gform-theme--framework select.gf_placeholder,
.gform_wrapper.gform-theme.gform-theme--framework select option.gf_placeholder {
  color: var(--csa-form-placeholder);
}

/* Disabled and read only. */
.gform_wrapper.gform-theme.gform-theme--framework input:disabled,
.gform_wrapper.gform-theme.gform-theme--framework select:disabled,
.gform_wrapper.gform-theme.gform-theme--framework textarea:disabled {
  color: var(--csa-ink-muted);
  background-color: var(--csa-form-field-bg-disabled);
  border-color: transparent;
  cursor: not-allowed;
}

@media (prefers-reduced-motion: reduce) {
  .gform_wrapper.gform-theme.gform-theme--framework input,
  .gform_wrapper.gform-theme.gform-theme--framework select,
  .gform_wrapper.gform-theme.gform-theme--framework textarea {
    transition: none;
  }
}


/* --------------------------------------------------------------------------
   7. Radios and checkboxes

   The box, the tick and the accent colour are all in section 2. What is left
   is the row spacing and the label, which have no variable.

   The control itself is NOT rebuilt. Gravity Forms styles the real input
   with `appearance: none` and its own check mark, and replacing that would
   mean rebuilding the keyboard and screen reader behaviour for no gain.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme.gform-theme--framework .gfield_radio,
.gform_wrapper.gform-theme.gform-theme--framework .gfield_checkbox {
  display: flex;
  flex-direction: column;
  gap: var(--csa-form-choice-gap);
  margin: 0;
  padding: 0;
  list-style: none;
}

.gform_wrapper.gform-theme.gform-theme--framework .gchoice {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 10px;
  margin: 0;
}

.gform_wrapper.gform-theme.gform-theme--framework .gchoice label {
  margin: 0;
  font-family: var(--csa-font);
  font-size: var(--csa-form-field-fs);
  font-weight: var(--csa-fw-regular);
  line-height: 1.4;
  color: var(--csa-form-field-text);
  cursor: pointer;
}

/* "Other" on a radio field is a text input inline with the choices. It is
   not a full width field, so it keeps its own measure. */
.gform_wrapper.gform-theme.gform-theme--framework .gchoice input[type="text"] {
  max-width: 320px;
}


/* --------------------------------------------------------------------------
   8. Section breaks, THE ONE HEADING IN THIS FILE

   Why it is needed: a Gravity Forms section break renders a real heading
   element. `typography.css` sizes headings with bare element
   selectors, so a section title inside a form would be sized as a page
   heading. It is not a page heading, it is a group label inside a form.

   Two forms use it: 2, Register Now, with three sections, and 15, Request
   your digital certificate, with two.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme.gform-theme--framework .gsection {
  margin: 16px 0 0;
  padding: 0 0 16px;
  border-bottom: 1px solid var(--csa-border-card);
}

.gform_wrapper.gform-theme.gform-theme--framework .gsection_title {
  margin: 0;
  font-family: var(--csa-font);
  font-size: 20px;
  font-weight: var(--csa-fw-semibold);
  line-height: 1.35;
  color: var(--csa-navy);
}

.gform_wrapper.gform-theme.gform-theme--framework .gsection_description {
  margin: 8px 0 0;
  font-size: var(--csa-form-desc-fs);
  line-height: 1.45;
  color: var(--csa-form-desc-color);
}

/* The first section in a form has nothing above it to separate from. */
.gform_wrapper.gform-theme.gform-theme--framework .gform_fields > .gfield:first-child .gsection {
  margin-top: 0;
}


/* --------------------------------------------------------------------------
   9. The submit button and its arrow

   The arrow is put inside the button by snippet S11, not by CSS, because a
   background image cannot follow `currentColor` and this arrow must turn
   with the label. `code-blocks/icons/long-arrow-right.html` carries
   `stroke="currentColor"`, which is the same mechanism the page hero CTA
   uses. `css/03-components.css` section 20.

   The button is a real `<button>` on this site. Measured on the build site
   2026-09-17: Gravity Forms 3.1.1.1 renders `<button type="submit">`, not
   the `<input type="submit">` that live's older version renders. That is
   what makes an inline SVG possible at all.

   WooCommerce paints `button` by element as well, so this block is written
   at 0,4,1 and answers hover and focus in full. D99 and D101.

   FULL WIDTH. The design draws the submit across the whole form. Gravity
   Forms has a per-form button width setting, and 14 of the 15 forms are set
   to `auto`. Rather than ask for 14 admin changes, the width is set here,
   where one line covers every form. Change `width` to `auto` in the first
   rule if a narrow button is ever wanted.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme.gform-theme--framework .gform_footer {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 12px;
  margin: 28px 0 0;
  padding: 0;
}

.gform_wrapper.gform-theme.gform-theme--framework button.gform_button,
.gform_wrapper.gform-theme.gform-theme--framework input.gform_button {
  display: inline-flex;
  flex-direction: row;
  align-items: center;
  justify-content: center;
  gap: var(--csa-form-submit-gap);
  width: 100%;
  height: auto;
  padding: var(--csa-form-submit-pad-y) var(--csa-form-submit-pad-x);
  font-family: var(--csa-font);
  font-size: var(--csa-form-submit-fs);
  font-weight: var(--csa-form-submit-fw);
  line-height: 1;
  letter-spacing: normal;
  text-transform: none;
  text-decoration: none;
  color: var(--csa-form-submit-color);
  background-color: var(--csa-form-submit-bg);
  border: 1px solid transparent;
  border-radius: var(--csa-form-submit-radius);
  box-shadow: var(--csa-form-submit-shadow);
  outline: none;
  cursor: pointer;
  transition: background-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
}

.gform_wrapper.gform-theme.gform-theme--framework button.gform_button:hover,
.gform_wrapper.gform-theme.gform-theme--framework input.gform_button:hover {
  color: var(--csa-form-submit-color);
  background-color: var(--csa-form-submit-bg-hover);
  border: 1px solid transparent;
  box-shadow: var(--csa-form-submit-shadow-hover);
  outline: none;
}

.gform_wrapper.gform-theme.gform-theme--framework button.gform_button:focus,
.gform_wrapper.gform-theme.gform-theme--framework input.gform_button:focus,
.gform_wrapper.gform-theme.gform-theme--framework button.gform_button:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework input.gform_button:focus-visible {
  color: var(--csa-form-submit-color);
  background-color: var(--csa-form-submit-bg-hover);
  border: 1px solid var(--csa-white);
  box-shadow: var(--csa-form-submit-shadow-hover), 0 0 0 3px rgba(255, 51, 100, 0.35);
  outline: none;
}

.gform_wrapper.gform-theme.gform-theme--framework button.gform_button:active,
.gform_wrapper.gform-theme.gform-theme--framework input.gform_button:active {
  transform: translateY(1px);
  box-shadow: var(--csa-form-submit-shadow);
}

.gform_wrapper.gform-theme.gform-theme--framework button.gform_button:disabled,
.gform_wrapper.gform-theme.gform-theme--framework input.gform_button:disabled {
  background-color: #f4a8bc;
  box-shadow: none;
  cursor: not-allowed;
}

/* The label and the arrow are both spans written by snippet S11. Each one
   carries its own class, so neither can be reached by accident. */
.gform_wrapper.gform-theme.gform-theme--framework .csa-form__submit-label {
  display: inline-block;
  color: inherit;
}

/* `.csa-icon--wide` in `css/03-components.css` section 20 sizes this: height
   is 1em and the viewBox supplies the width, because the arrow is 24 x 13
   and not a square. So the arrow follows the button's own font size and
   there is no number here to keep in step with the file. */
.gform_wrapper.gform-theme.gform-theme--framework .csa-form__submit-icon {
  color: inherit;
  transition: transform 0.2s ease;
}

.gform_wrapper.gform-theme.gform-theme--framework button.gform_button:hover .csa-form__submit-icon,
.gform_wrapper.gform-theme.gform-theme--framework button.gform_button:focus-visible .csa-form__submit-icon {
  transform: translateX(4px);
}

@media (prefers-reduced-motion: reduce) {
  .gform_wrapper.gform-theme.gform-theme--framework button.gform_button,
  .gform_wrapper.gform-theme.gform-theme--framework input.gform_button,
  .gform_wrapper.gform-theme.gform-theme--framework .csa-form__submit-icon {
    transition: none;
  }

  .gform_wrapper.gform-theme.gform-theme--framework button.gform_button:hover .csa-form__submit-icon,
  .gform_wrapper.gform-theme.gform-theme--framework button.gform_button:focus-visible .csa-form__submit-icon {
    transform: none;
  }
}

/* The spinner Gravity Forms puts beside the button while it submits. */
.gform_wrapper.gform-theme.gform-theme--framework .gform_ajax_spinner {
  width: 20px;
  height: 20px;
  margin-inline-start: 12px;
}


/* --------------------------------------------------------------------------
   10. Validation

   Three separate things, and all three are styled here: the summary box at
   the top of the form, the message under a field, and the field itself.

   The colour is `--csa-form-error` in section 1, which is NOT a brand token.
   `css/01-tokens.css` has no error colour, and pink is already the call to
   action, so an error in pink would read as a decoration. 
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme.gform-theme--framework .gform_validation_errors {
  margin: 0 0 24px;
  padding: 16px 20px;
  color: var(--csa-form-error);
  background-color: var(--csa-form-error-bg);
  border: 1px solid var(--csa-form-error);
  border-radius: var(--csa-form-field-radius);
  box-shadow: none;
}

.gform_wrapper.gform-theme.gform-theme--framework .gform_validation_errors h2 {
  margin: 0;
  font-family: var(--csa-font);
  font-size: 16px;
  font-weight: var(--csa-fw-semibold);
  line-height: 1.4;
  color: var(--csa-form-error);
}

.gform_wrapper.gform-theme.gform-theme--framework .gform_validation_errors ol,
.gform_wrapper.gform-theme.gform-theme--framework .gform_validation_errors ul {
  margin: 8px 0 0;
  padding-inline-start: 20px;
  font-size: var(--csa-form-desc-fs);
  line-height: 1.5;
}

.gform_wrapper.gform-theme.gform-theme--framework .gform_validation_errors a {
  color: var(--csa-form-error);
  text-decoration: underline;
}

/* The message under the field. */
.gform_wrapper.gform-theme.gform-theme--framework .gfield_validation_message,
.gform_wrapper.gform-theme.gform-theme--framework .validation_message {
  margin: 8px 0 0;
  padding: 0;
  font-family: var(--csa-font);
  font-size: var(--csa-form-desc-fs);
  font-weight: var(--csa-fw-medium);
  line-height: 1.45;
  color: var(--csa-form-error);
  background: none;
  border: 0;
}

/* The field in error. Written at 0,5,1 so it sits above the base control
   rule in section 6, which is 0,4,1 and would otherwise match later in the
   file and win. */
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="text"],
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="email"],
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="tel"],
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="number"],
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="date"],
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error select,
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error textarea {
  background-color: var(--csa-form-error-bg);
  border: var(--csa-form-field-border-w) solid var(--csa-form-error);
}

.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="text"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="email"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="tel"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="number"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error input[type="date"]:focus,
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error select:focus,
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error textarea:focus {
  background-color: var(--csa-white);
  border: var(--csa-form-field-border-w) solid var(--csa-form-error);
  box-shadow: 0 0 0 3px rgba(217, 45, 32, 0.16);
  outline: none;
}

/* The label of a field in error keeps the normal label colour. Only the
   control and the message carry the error, so a long form does not turn
   into a wall of red. */


/* --------------------------------------------------------------------------
   11. The confirmation message

   What the visitor sees after a successful submit. It replaces the whole
   form, so it is the last thing the page says and it should not look like a
   plain paragraph.
   -------------------------------------------------------------------------- */

.gform_confirmation_wrapper .gform_confirmation_message {
  margin: 0;
  padding: 24px 28px;
  font-family: var(--csa-font);
  font-size: var(--csa-fs-lead);
  font-weight: var(--csa-fw-medium);
  line-height: 1.6;
  color: var(--csa-navy);
  background-color: var(--csa-surface-cyan);
  border-radius: var(--csa-form-field-radius);
}


/* --------------------------------------------------------------------------
   12. Chained Selects

   Eight forms use it: 2, 5, 9, 10, 11, 12, 13 and 14. It renders three
   selects in a row that share one label, each with its own sub-label:
   Category, Field of interest, Course.
   The base. Answers the plugin's `background-color`, `border-color` and
   `box-shadow` together, so nothing of its green survives. */
.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container > .gform-grid-col > select,
.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container .gfcs-column-section-block > .gform-grid-col > select {
  color: var(--csa-form-field-text) !important;
  background-color: var(--csa-form-field-bg) !important;
  border: var(--csa-form-field-border-w) solid var(--csa-form-field-border) !important;
  border-radius: var(--csa-form-field-radius) !important;
  box-shadow: var(--csa-form-field-shadow) !important;
}

/* Hover. The plugin draws a `#98b28b` border and a 3px green glow here. */
.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container > .gform-grid-col > select:hover,
.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container .gfcs-column-section-block > .gform-grid-col > select:hover {
  background-color: var(--csa-form-field-bg) !important;
  border: var(--csa-form-field-border-w) solid var(--csa-form-field-border-hover) !important;
  box-shadow: var(--csa-form-field-shadow) !important;
}

/* Focus. The plugin has no focus rule of its own, but its base rule is 0,4,1
   and so is the focus rule in section 6, so the two could land either way
   depending on which stylesheet the page loads last. This settles it. */
.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container > .gform-grid-col > select:focus,
.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container > .gform-grid-col > select:focus-visible,
.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container .gfcs-column-section-block > .gform-grid-col > select:focus,
.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container .gfcs-column-section-block > .gform-grid-col > select:focus-visible {
  background-color: var(--csa-form-field-bg-focus) !important;
  border: var(--csa-form-field-border-w) solid var(--csa-form-field-border-focus) !important;
  box-shadow: var(--csa-form-field-shadow-focus) !important;
  outline: none !important;
}

.gform_wrapper.gform-theme.gform-theme--framework .gfield_error .ginput_chained_selects_container > .gform-grid-col > select:has(> option[value=""]:checked),
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error .ginput_chained_selects_container .gfcs-column-section-block > .gform-grid-col > select:has(> option[value=""]:checked) {
  background-color: var(--csa-form-error-bg) !important;
  border: var(--csa-form-field-border-w) solid var(--csa-form-error) !important;
  box-shadow: var(--csa-form-field-shadow) !important;
}

.gform_wrapper.gform-theme.gform-theme--framework .gfield_error .ginput_chained_selects_container > .gform-grid-col > select:has(> option[value=""]:checked):focus,
.gform_wrapper.gform-theme.gform-theme--framework .gfield_error .ginput_chained_selects_container .gfcs-column-section-block > .gform-grid-col > select:has(> option[value=""]:checked):focus {
  background-color: var(--csa-white) !important;
  border: var(--csa-form-field-border-w) solid var(--csa-form-error) !important;
  box-shadow: 0 0 0 3px rgba(217, 45, 32, 0.16) !important;
  outline: none !important;
}

.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  gap: var(--csa-form-col-gap);
}

.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container > .gform-grid-col {
  display: flex;
  flex-direction: column;
  flex: 1 1 200px;
  min-width: 0;
  margin: 0;
}

.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container > .gform-grid-col > select {
  width: 100%;
  min-width: 0;
}

/* The sub-label follows its own select, so the margin goes above it. Each
   select in the chain is a separate question, and this is the only label it
   has. */
.gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container > .gform-grid-col > label {
  display: block;
  margin: 6px 0 0;
  font-family: var(--csa-font);
  font-size: var(--csa-form-sublabel-fs);
  font-weight: var(--csa-fw-regular);
  line-height: 1.4;
  color: var(--csa-form-sublabel-color);
}


/* --------------------------------------------------------------------------
   13. The date picker

   ONE FIELD ON THE WHOLE SITE uses it: "Date of birth" on form 2, Register
   Now. The colours are in section 2. What is left is the popup itself, which
   jQuery UI renders outside the form, so it cannot be scoped to
   `.gform_wrapper` like everything else.

   `#ui-datepicker-div` is the id jQuery UI gives its one shared popup. It is
   an id, so it is 1,0,0 and nothing on this site can outrank it. It is the
   only rule in this file that starts outside `.gform_wrapper`, and it is
   safe because that element exists only while a date picker is open.
   -------------------------------------------------------------------------- */

#ui-datepicker-div.gform-theme-datepicker {
  font-family: var(--csa-font);
  font-size: var(--csa-fs-body);
  background-color: var(--csa-white);
  border: 1px solid var(--csa-border-card);
  border-radius: 14px;
  box-shadow: var(--csa-shadow-card);
}

#ui-datepicker-div.gform-theme-datepicker .ui-datepicker-title {
  font-weight: var(--csa-fw-semibold);
  color: var(--csa-navy);
}

#ui-datepicker-div.gform-theme-datepicker .ui-state-active,
#ui-datepicker-div.gform-theme-datepicker .ui-state-active:hover {
  color: var(--csa-white);
  background-color: var(--csa-pink);
  border-radius: 8px;
}


/* --------------------------------------------------------------------------
   14. File upload, and Turnstile

   File upload is on two forms, 4 and 15. Both are SINGLE file, confirmed in
   the export on 2026-09-18: `multipleFiles` is false on both. So the
   drag-and-drop zone, its progress bars and its preview list never render,
   and none of that is styled here. If a field is ever switched to multiple
   files, this section needs the zone added.

   Turnstile is on 13 of the 15 forms, at size `large`. It renders a
   Cloudflare iframe. Nothing inside it can be styled, by anyone. All this
   can do is give it room and stop it pushing the page wide on a phone.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme.gform-theme--framework input[type="file"] {
  width: 100%;
  padding: 14px var(--csa-form-field-pad-x);
  font-family: var(--csa-font);
  font-size: var(--csa-fs-body);
  color: var(--csa-form-field-text);
  background-color: var(--csa-form-field-bg);
  border: var(--csa-form-field-border-w) solid var(--csa-form-field-border);
  border-radius: var(--csa-form-field-radius);
}

.gform_wrapper.gform-theme.gform-theme--framework input[type="file"]::file-selector-button {
  margin-inline-end: 14px;
  padding: 8px 18px;
  font-family: var(--csa-font);
  font-size: var(--csa-fs-label);
  font-weight: var(--csa-fw-medium);
  color: var(--csa-white);
  background-color: var(--csa-navy);
  border: 0;
  border-radius: 8px;
  cursor: pointer;
}

.gform_wrapper.gform-theme.gform-theme--framework input[type="file"]:hover::file-selector-button {
  background-color: var(--csa-navy-soft);
}

/* The line Gravity Forms prints under the field, listing the allowed file
   types and the size limit. */
.gform_wrapper.gform-theme.gform-theme--framework .gform_fileupload_rules {
  display: block;
  margin: 8px 0 0;
  font-size: var(--csa-form-desc-fs);
  color: var(--csa-form-desc-color);
}

/* Turnstile. The widget is about 300px wide at this size, so it fits at
   320px, but the iframe is given a hard ceiling in case Cloudflare changes
   it. Measure this at 320 on the first pass. */
.gform_wrapper.gform-theme.gform-theme--framework .gfield--type-turnstile {
  margin: 4px 0 0;
}

.gform_wrapper.gform-theme.gform-theme--framework .gfield--type-turnstile iframe {
  max-width: 100%;
}


/* --------------------------------------------------------------------------
   15. The rating stars

   ONE FORM uses it: 6, the rating form. The field is a Survey add-on field
   with `inputType: rating` and five choices, confirmed in the export.

   The add-on draws the stars as two background images out of its own plugin
   folder, `star-unselected.svg` and `star-selected.svg`. They are grey and
   gold, they are not ours, and a background image cannot be recoloured with
   CSS. So both stars are replaced here with our own, in Navy outline and
   Pink fill.

   THE ADD-ON'S OWN RULES ARE 0,3,1. Read off live on 2026-09-17:
   `.gform-theme--foundation .gsurvey-rating:not(:checked) > label`. A
   `:not()` counts the selector inside it, so that is three classes and one
   element. Everything below is written at 0,4,1 to clear it.

   THE ORDER IS REVERSED ON PURPOSE, AND IT IS A CHANGE FROM LIVE.
   The add-on prints the radios 5, 4, 3, 2, 1 and floats them left, so live
   reads "5 4 3 2 1" from left to right. The fill still works, because the
   add-on fills the hovered star and every later sibling, but the row reads
   backwards. `row-reverse` puts them back in the order a person expects, 1
   on the left and 5 on the right, and the fill then runs from the left up to
   the hovered star, which is what a star rating is supposed to do. No
   markup changes and no script changes.

   `justify-content` is `flex-start`, section 10 of OXYGEN-CONVENTIONS.md.
   With `row-reverse` that puts the row against the right edge of its box, so
   `margin-inline-end: auto` on the row pulls it back to the left. Centring
   is not used, and neither is `space-between`.
   -------------------------------------------------------------------------- */

.gform_wrapper.gform-theme--framework .gsurvey-rating-wrapper {
  display: block;
}

.gform_wrapper.gform-theme--framework .gsurvey-rating {
  display: flex;
  flex-direction: row-reverse;
  justify-content: flex-start;
  align-items: center;
  gap: var(--csa-form-star-gap);
  float: none;
  width: -moz-fit-content;
  width: fit-content;
  margin-inline-end: auto;
}

.gform_wrapper.gform-theme--framework .gsurvey-rating:not(:checked) > label,
.gform_wrapper.gform-theme--framework .gsurvey-rating > label {
  width: var(--csa-form-star-size);
  height: var(--csa-form-star-size);
  block-size: var(--csa-form-star-size);
  margin: 0;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23aeb7c3' stroke-width='1.6' stroke-linejoin='round'%3E%3Cpath d='M12 2.6l2.9 5.88 6.5.95-4.7 4.58 1.11 6.47L12 17.42l-5.81 3.06 1.11-6.47-4.7-4.58 6.5-.95L12 2.6z'/%3E%3C/svg%3E");
  background-position: center center;
  background-repeat: no-repeat;
  background-size: var(--csa-form-star-size) auto;
  cursor: pointer;
  transition: transform 0.15s ease;
}

.gform_wrapper.gform-theme--framework .gsurvey-rating:not(:checked) > label:hover,
.gform_wrapper.gform-theme--framework .gsurvey-rating:not(:checked) > label:hover ~ label,
.gform_wrapper.gform-theme--framework .gsurvey-rating > input:checked ~ label,
.gform_wrapper.gform-theme--framework .gsurvey-rating > input:focus-visible + label {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23ff3364' stroke='%23ff3364' stroke-width='1.6' stroke-linejoin='round'%3E%3Cpath d='M12 2.6l2.9 5.88 6.5.95-4.7 4.58 1.11 6.47L12 17.42l-5.81 3.06 1.11-6.47-4.7-4.58 6.5-.95L12 2.6z'/%3E%3C/svg%3E");
  background-size: var(--csa-form-star-size) auto;
}

.gform_wrapper.gform-theme--framework .gsurvey-rating:not(:checked) > label:hover {
  transform: scale(1.08);
}

/* The keyboard ring. The radio itself is clipped out of sight by the
   add-on, so the ring has to go on the label the radio labels. */
.gform_wrapper.gform-theme--framework .gsurvey-rating > input:focus-visible + label {
  outline: 2px solid var(--csa-pink-light);
  outline-offset: 3px;
  border-radius: 4px;
}

@media (prefers-reduced-motion: reduce) {
  .gform_wrapper.gform-theme--framework .gsurvey-rating > label {
    transition: none;
  }

  .gform_wrapper.gform-theme--framework .gsurvey-rating:not(:checked) > label:hover {
    transform: none;
  }
}


/* --------------------------------------------------------------------------
   16. Tablet and mobile

   768 AND DOWN: every field goes full width. Gravity Forms collapses its own
   grid at a viewport of its choosing, which is not one of our tiers, so the
   collapse is stated here and it is stated at 0,5,0 so it beats the per
   field span the admin sets. A two-up row of 16px fields does not fit in a
   375px viewport minus the page gutter.

   THE FIELD TYPE STAYS AT 16px AT EVERY WIDTH. It is not stepped down with
   the rest of the type, because iOS Safari zooms the page when a visitor
   focuses a control whose text is under 16px, and the zoom does not undo
   itself. 
   -------------------------------------------------------------------------- */

@media (max-width: 992px) {
  .gform_wrapper.gform-theme.gform-theme--framework .gsection_title {
    font-size: 19px;
  }
}

@media (max-width: 768px) {
  .gform_wrapper.gform-theme.gform-theme--framework .gform_fields > .gfield {
    grid-column: 1 / -1;
  }

  .gform_wrapper.gform-theme.gform-theme--framework .gsection_title {
    font-size: 18px;
  }

  .gform_wrapper.gform-theme--framework {
    --csa-form-row-gap: 20px;
  }
}

@media (max-width: 480px) {
  .gform_wrapper.gform-theme--framework {
    --csa-form-field-h: 52px;
    --csa-form-field-pad-x: 14px;
    --csa-form-label-fs: 15px;
    --csa-form-submit-fs: 16px;
    --csa-form-submit-pad-x: 20px;
    --csa-form-star-size: 28px;
  }

  .gform_wrapper.gform-theme.gform-theme--framework .gsection_title {
    font-size: 18px;
  }

  /* The chained selects stack rather than squeeze. Three selects on one row
     at 375px gives each one about 100px, which cannot show a course name. */
  .gform_wrapper.gform-theme.gform-theme--framework .ginput_chained_selects_container > .gform-grid-col {
    flex: 1 1 100%;
  }
}

#gform_wrapper_15 .gform_title {
  display:none!important;
}

#input_15_9 {
  height: 90px;
}/* Trending Courses - homepage section
   Custom classes applied to native Oxygen elements.
   Brand colors reused: navy #0D2651, pink #FF3364.
   Single static card, built and styled per request - no
   repeater/slider, no dynamic data. */


.csa-trending-heading {
  font-weight: 600;
  color: #0D2651;
}


.csa-trending-heading-regular {
  font-weight: 400;
}


.csa-trending-card {
  background-color: #FFFFFF;
  border-radius: 16px;
  box-shadow: 0 10px 30px rgba(13, 38, 81, 0.08);
  overflow: hidden;
  position: relative;
  display: flex;
  flex-direction: column;
  flex-grow:1 !important;
/*   width: 100%;
  max-width: 260px; */
}


.csa-trending-card-image {
  width: 100%;
  aspect-ratio: 16 / 11;
  border-radius: 16px 16px 0 0;
  background-size: cover;
  background-position: center;
}


.csa-trending-card-body {
  padding: 20px;
}


.csa-trending-card-title {
  color: #0D2651;
  font-weight: 600;
/*   font-size: 18px; */
  margin-bottom: 12px;
}


.csa-badge-bestseller {
  display: inline-block;
  background-color: #FF3364;
  color: #FFFFFF;
  font-weight: 700;
  font-size: 12px;
  padding: 6px 16px;
  border-radius: 999px;
  margin-bottom: 14px;
}


.csa-trending-card-meta {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}


.csa-trending-price {
  color: #0D2651;
  font-weight: 700;
  font-size: 20px;
}


.csa-trending-duration-pill {
  display: inline-block;
  background-color: #FDFDFD;
  border: 1px solid #EDEDED;
  color: #414042;
  font-size: 13px;
  padding: 6px 14px;
  border-radius: 999px;
  white-space: nowrap;
}


.csa-trending-card-link {
  position: absolute;
  inset: 0;
  z-index: 5;
  font-size: 0;
  line-height: 0;
  overflow: hidden;
}

.ct-slide {
  align-items:stretch !important;
  height:auto!important;
}