├── .gitignore ├── screenshot.png ├── README.md ├── css ├── 00-banner.css ├── 09-cost-of-attendance.css ├── 08-scholarships-page.css ├── 06-footer.css ├── 02-layout-overrides.css ├── 03-typography.css ├── 01-header.css ├── 05-form-elements.css ├── 04-helpers.css └── 07-home-page.css ├── js ├── accordion.min.js ├── toc-select.min.js ├── cost-tables.min.js ├── home.min.js └── admin-cost-tables.min.js ├── composer.json ├── parts ├── footers.php ├── headers-search.php ├── headers.php └── single-layout-scholarship.php ├── package.json ├── spine └── header.php ├── .travis.yml ├── src └── js │ ├── accordion.js │ ├── toc-select.js │ ├── cost-tables.js │ ├── home.js │ └── admin-cost-tables.js ├── includes ├── content-syndicate.php ├── class-wsu-student-financial-services-site-actions-widget.php ├── class-wsu-student-financial-services-give-link-widget.php ├── class-wsu-student-financial-services-theme.php └── cost-tables.php ├── phpcs.ruleset.xml ├── admin-css └── cost-tables.css ├── Gruntfile.js ├── search.php ├── .stylelintrc ├── functions.php ├── LICENSE └── style.css /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | vendor 4 | composer.lock 5 | style.css.map -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/washingtonstateuniversity/finaid.wsu.edu/master/screenshot.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #WSU Student Financial Services Theme 2 | 3 | [![Build Status](https://travis-ci.org/washingtonstateuniversity/finaid.wsu.edu.svg?branch=master)](https://travis-ci.org/washingtonstateuniversity/finaid.wsu.edu) 4 | -------------------------------------------------------------------------------- /css/00-banner.css: -------------------------------------------------------------------------------- 1 | /* 2 | Theme Name: WSU Student Financial Services 3 | Theme URI: https://web.wsu.edu 4 | Description: A WSU child theme for Student Financial Services 5 | Author: WSU University Communications 6 | Author URI: https://web.wsu.edu 7 | Template: spine 8 | Version: 0.1.4 9 | */ 10 | -------------------------------------------------------------------------------- /js/accordion.min.js: -------------------------------------------------------------------------------- 1 | !function(i){"use strict";var a=i(".js-accordion");a.find("h3").each(function(a){var t="accordion-content-"+a;i(this).attr("aria-controls",t).attr("aria-expanded","false").next("div").attr("id",t).attr("aria-hidden","true").hide()}),a.on("click","h3",function(){"false"===i(this).attr("aria-expanded")?i(this).attr("aria-expanded","true").next("div").attr("aria-hidden","false").slideDown("fast"):i(this).attr("aria-expanded","false").next("div").attr("aria-hidden","true").slideUp("fast")})}(jQuery); -------------------------------------------------------------------------------- /js/toc-select.min.js: -------------------------------------------------------------------------------- 1 | !function(n,e){"use strict";n(e).ready(function(){var e=n("#toc"),t=e.find("li");t.unwrap().wrapAll("").closest("select").prepend(""),n(t).each(function(){var e=n(this).children("a"),t=e.attr("href"),i=e.text();n(this).replaceWith("")}),e.addClass("select-wrap")}),n("#toc").on("change","select",function(){var e=n(this).val(),t=n(e).closest("section");""===e?n("section.hidden").hide():n(t).show().siblings(".hidden").hide()})}(jQuery,document); -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "washingtonstateuniversity/finaid.wsu.edu", 3 | "authors": [ 4 | { 5 | "name": "Washington State University" 6 | } 7 | ], 8 | "require-dev": { 9 | "squizlabs/php_codesniffer": "3.x.x", 10 | "wp-coding-standards/wpcs": "1.x.x" 11 | }, 12 | "scripts": { 13 | "post-install-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wp-coding-standards/wpcs", 14 | "post-update-cmd" : "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wp-coding-standards/wpcs" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /parts/footers.php: -------------------------------------------------------------------------------- 1 | 'footer', 8 | 'menu' => 'footer', 9 | 'container' => false, 10 | 'container_class' => false, 11 | 'fallback_cb' => false, 12 | 'menu_class' => 'site-footer-menu', 13 | 'menu_id' => false, 14 | 'depth' => 2, 15 | ); 16 | ?> 17 | 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wsu-student-financial-services-theme", 3 | "version": "0.1.4", 4 | "repository": { 5 | "type": "git", 6 | "url": "https://github.com/washingtonstateuniversity/finaid.wsu.edu" 7 | }, 8 | "devDependencies": { 9 | "autoprefixer": "^9.1.3", 10 | "grunt": "^1.0.3", 11 | "grunt-contrib-clean": "^1.1.0", 12 | "grunt-contrib-concat": "~1.0.1", 13 | "grunt-contrib-jshint": "^1.0.0", 14 | "grunt-contrib-uglify": "^3.4.0", 15 | "grunt-jscs": "^3.0.1", 16 | "grunt-phpcs": "^0.4.0", 17 | "grunt-postcss": "^0.9.0", 18 | "grunt-stylelint": "^0.10.0", 19 | "stylelint": "^9.5.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /css/09-cost-of-attendance.css: -------------------------------------------------------------------------------- 1 | .cost-table-placeholder { 2 | margin-bottom: 2rem; 3 | } 4 | 5 | .cost-table-placeholder th { 6 | background-color: #203639; 7 | color: #fff; 8 | vertical-align: middle; 9 | } 10 | 11 | .cost-table-placeholder th, 12 | .cost-table-placeholder td { 13 | padding: 8px; 14 | } 15 | 16 | .cost-table-placeholder td { 17 | border-bottom: 1px solid #ddd; 18 | } 19 | 20 | .cost-table-placeholder tr:nth-of-type(even) td { 21 | background: #f3f3f3; 22 | } 23 | 24 | .cost-table-placeholder td:empty { 25 | height: 22px; 26 | } 27 | 28 | .cost-table-placeholder header { 29 | color: #393939; 30 | font-size: 1.75em; 31 | font-weight: 400; 32 | padding-bottom: 20px; 33 | } 34 | -------------------------------------------------------------------------------- /spine/header.php: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 |
6 | 7 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /js/cost-tables.min.js: -------------------------------------------------------------------------------- 1 | !function(o,l){"use strict";var a=o(".sfs-cost-tables"),n=o("#cost-table-session"),i=o("#cost-table-campus"),c=o("#cost-table-career"),r=i.find("option"),d=c.find("option"),p=o(".cost-table-placeholder");function u(a,s){a.each(function(){""!==o(this).val()&&-1!==o.inArray(o(this).val(),s)&&o(this).prop("disabled",!1)})}a.on("change",function(a){r.prop("disabled",!1),d.prop("disabled",!1);var s=a.target,t=o(s).attr("name"),e={action:"cost_tables",nonce:l.nonce,language:l.language,session:n.val(),campus:i.val(),career:c.val(),updated:t};""!==n.val()&&""!==i.val()&&""!==c.val()&&(p.html("
"),r.prop("disabled",!0),d.prop("disabled",!0),o.post(l.ajax_url,e,function(a){var s=o.parseJSON(a);u(r,s.campuses),u(d,s.careers),p.html(s.table)}))})}(jQuery,window.cost_tables); -------------------------------------------------------------------------------- /js/home.min.js: -------------------------------------------------------------------------------- 1 | document.addEventListener("DOMContentLoaded",function(){void 0===window.getComputedStyle(document.body).mixBlendMode&&document.documentElement.classList.add("no-mix-blend-mode")},!1),function(c){"use strict";c(".home-calendar .wsuwp-content-syndicate-list").before("").after(""),c(".event-control.prev").hide(),c(".wsuwp-content-syndicate-wrapper").on("click",".event-control",function(e){e.preventDefault();var t,n=c(".wsuwp-content-syndicate-list"),o=c(".wsuwp-content-syndicate-event"),s=-(o.length*o.outerWidth()-n.width());c(this).hasClass("prev")?n.css("left","+="+o.outerWidth()+"px"):c(this).hasClass("next")&&n.css("left","-="+o.outerWidth()+"px"),0<=(t=parseInt(n.css("left")))?c(".event-control.prev").hide():c(".event-control.prev").show(),t<=s?c(".event-control.next").hide():c(".event-control.next").show()})}(jQuery); -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: php 3 | 4 | # Cache some data across builds for performance. 5 | cache: 6 | apt: true 7 | directories: 8 | - node_modules 9 | - vendor 10 | - $HOME/.composer/cache 11 | 12 | notifications: 13 | email: 14 | on_success: never 15 | on_failure: change 16 | slack: 17 | on_pull_requests: true 18 | on_success: change 19 | on_failure: always 20 | on_start: never 21 | on_cancel: always 22 | rooms: 23 | - wsu-ucomm:n2TLZRJd84rMOMbkKthSEMgS 24 | 25 | branches: 26 | only: 27 | - master 28 | 29 | matrix: 30 | include: 31 | - php: 7.1 32 | env: WP_TRAVISCI=grunt 33 | 34 | before_script: 35 | - export PATH="$HOME/.composer/vendor/bin:$PATH" 36 | - mysql --version 37 | - phpenv config-rm xdebug.ini 38 | - phpenv versions 39 | - php --version 40 | - composer install 41 | - nvm install stable 42 | - npm install -g grunt-cli 43 | - npm install 44 | - npm --version 45 | - node --version 46 | 47 | script: 48 | - grunt --version 49 | - grunt default 50 | -------------------------------------------------------------------------------- /js/admin-cost-tables.min.js: -------------------------------------------------------------------------------- 1 | !function(i){"use strict";var d=i("#cost-table-meta table"),a=i("#cost-table-meta .add-column"),t=i("#cost-table-meta .add-row");6<=d.find("tr:first td").length&&a.prop("disabled",!0),a.on("click",function(){d.find("tr:first td").length<6&&d.find("tr").each(function(){i(this).find("td").last().clone().find("input").val("").end().appendTo(i(this))}),6<=d.find("tr:first td").length&&a.prop("disabled",!0)}),t.on("click",function(){d.find("tr").last().clone().find("input[type='text']").val("").end().find("input[type='text']").attr("name",function(t,e){var n=parseInt(e.match(/\d+/))+1;return e.replace(/\d+/,n)}).end().appendTo(d)}),d.on("click",".coa-meta-delete",function(){var t=i(this);if(t.hasClass("delete-row")){var e=t.closest("tr");if(0===e.index())return;e.remove(),d.find("tr").each(function(){var t=i(this),n=t.index()-1;t.find("input[type='text']").attr("name",function(t,e){return e.replace(/\d+/,n)}).end()})}if(t.hasClass("delete-column")){var n=t.closest("td").index();if(0===n)return;d.find("tr").each(function(){i(this).find("td").eq(n).remove()}),a.prop("disabled",!1)}})}(jQuery); -------------------------------------------------------------------------------- /src/js/accordion.js: -------------------------------------------------------------------------------- 1 | ( function( $ ) { 2 | 3 | "use strict"; 4 | 5 | var $js_accordion = $( ".js-accordion" ); 6 | 7 | // In any element with the .js-accordion class, add the aria-controls attribute to all h3 tags. 8 | // Add a corresponding id to any div immediately following an h3, and hide the div. 9 | $js_accordion.find( "h3" ).each( function( index ) { 10 | var content_id = "accordion-content-" + index; 11 | 12 | $( this ).attr( "aria-controls", content_id ).attr( "aria-expanded", "false" ). 13 | next( "div" ).attr( "id", content_id ).attr( "aria-hidden", "true" ).hide(); 14 | } ); 15 | 16 | // When an h3 is clicked, toggle the visibility of the div immediately following it. 17 | $js_accordion.on( "click", "h3", function() { 18 | if ( "false" === $( this ).attr( "aria-expanded" ) ) { 19 | $( this ).attr( "aria-expanded", "true" ). 20 | next( "div" ).attr( "aria-hidden", "false" ).slideDown( "fast" ); 21 | } else { 22 | $( this ).attr( "aria-expanded", "false" ). 23 | next( "div" ).attr( "aria-hidden", "true" ).slideUp( "fast" ); 24 | } 25 | } ); 26 | }( jQuery ) ); 27 | -------------------------------------------------------------------------------- /src/js/toc-select.js: -------------------------------------------------------------------------------- 1 | ( function( $, document ) { 2 | "use strict"; 3 | 4 | // Convert output from the WSUWP Table of Contents Generator into a `select` element. 5 | $( document ).ready( function() { 6 | var $toc = $( "#toc" ), 7 | items = $toc.find( "li" ); 8 | 9 | items.unwrap().wrapAll( "" ).closest( "select" ).prepend( "" ); 10 | 11 | $( items ).each( function() { 12 | var link = $( this ).children( "a" ), 13 | href = link.attr( "href" ), 14 | text = link.text(); 15 | $( this ).replaceWith( "" ); 16 | } ); 17 | 18 | $toc.addClass( "select-wrap" ); 19 | } ); 20 | 21 | // When a title is selected, toggle the visibility of its respective section. 22 | $( "#toc" ).on( "change", "select", function() { 23 | var id = $( this ).val(), 24 | section = $( id ).closest( "section" ); 25 | 26 | if ( "" === id ) { 27 | $( "section.hidden" ).hide(); 28 | } else { 29 | $( section ).show().siblings( ".hidden" ).hide(); 30 | } 31 | } ); 32 | }( jQuery, document ) ); 33 | -------------------------------------------------------------------------------- /css/08-scholarships-page.css: -------------------------------------------------------------------------------- 1 | /* "« Scholarship Search Results" link on individual scholarships */ 2 | .scholarships-back-to-results .column { 3 | padding-top: 2rem; 4 | padding-bottom: 2rem; 5 | } 6 | 7 | .scholarships-back-to-results .column p { 8 | padding: 0; 9 | } 10 | 11 | .apply .cta-button { 12 | margin-top: 0; 13 | } 14 | 15 | /* Scholarships landing page */ 16 | .scholarships-landing .main-header { 17 | height: auto; 18 | overflow: auto; 19 | } 20 | 21 | .scholarships-landing .page-header-group { 22 | display: none; 23 | } 24 | 25 | /* Scholarships search form */ 26 | .wsuwp-scholarships-filters .donor label span { 27 | font-weight: 300; 28 | } 29 | 30 | /* Scholarships sharing tools */ 31 | .back-to-results { 32 | float: left; 33 | } 34 | 35 | .social-share-bar { 36 | float: right; 37 | margin-top: 0; 38 | position: relative; 39 | } 40 | 41 | .social-share-bar a, 42 | .social-share-bar a:hover { 43 | background: none; 44 | border-bottom: none; 45 | } 46 | 47 | @media only screen and (max-width: 530px) { 48 | 49 | .social-share-bar { 50 | clear: both; 51 | float: left; 52 | margin-top: 1em; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /includes/content-syndicate.php: -------------------------------------------------------------------------------- 1 | $atts['language'], 36 | ), $request_url ); 37 | 38 | return $request_url; 39 | } 40 | -------------------------------------------------------------------------------- /css/06-footer.css: -------------------------------------------------------------------------------- 1 | .site-footer { 2 | background: linear-gradient(to right, #f3f3f3 0%, #efefef 100%); 3 | margin-top: 2rem; 4 | position: relative; 5 | } 6 | 7 | .give-link { 8 | background: #981e32; 9 | border: none; 10 | border-radius: 30px 0 0 30px; 11 | color: #fff; 12 | font-style: italic; 13 | font-size: 1.7rem; 14 | font-weight: 300; 15 | line-height: 1; 16 | padding: .8rem 0 .8rem 80px; 17 | position: absolute; 18 | right: 0; 19 | text-transform: uppercase; 20 | top: 0; 21 | width: 30%; 22 | } 23 | 24 | .give-link:hover { 25 | background: #981e32; 26 | border: none; 27 | color: #fff; 28 | } 29 | 30 | .give-link svg { 31 | width: 36px; 32 | top: 9px; 33 | position: absolute; 34 | left: 26px; 35 | } 36 | 37 | .site-footer ul { 38 | list-style: none; 39 | padding: 0; 40 | } 41 | 42 | .site-footer .one > ul > li, 43 | .site-footer-menu > li { 44 | box-sizing: border-box; 45 | float: left; 46 | padding: 0 .5rem; 47 | width: 25%; 48 | } 49 | 50 | .site-footer .one > ul > li > a, 51 | .site-footer-menu > li > a { 52 | border-bottom: none; 53 | color: #393939; 54 | display: block; 55 | font-size: 1em; 56 | font-weight: 700; 57 | letter-spacing: .5px; 58 | line-height: 1; 59 | padding-bottom: .5rem; 60 | pointer-events: none; 61 | text-transform: uppercase; 62 | } 63 | 64 | .site-footer .one ul li, 65 | .site-footer-menu ul li { 66 | padding: 0 0 .6rem; 67 | } 68 | 69 | @media screen and (max-width: 791px) { 70 | 71 | .site-footer { 72 | display: none; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /phpcs.ruleset.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | . 17 | 18 | Sniffs for the coding standards used in WSUWP Themes 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /admin-css/cost-tables.css: -------------------------------------------------------------------------------- 1 | #cost-table-meta .inside { 2 | text-align: right; 3 | } 4 | 5 | #cost-table-meta table { 6 | margin-bottom: 12px; 7 | table-layout: fixed; 8 | width: 100%; 9 | } 10 | 11 | #cost-table-meta tr:first-of-type td { 12 | text-align: center; 13 | } 14 | 15 | #cost-table-meta td:first-of-type { 16 | width: 20px; 17 | } 18 | 19 | #cost-table-meta td input { 20 | width: 100%; 21 | } 22 | 23 | .coa-meta-delete { 24 | background: none; 25 | border: none; 26 | cursor: pointer; 27 | height: 24px; 28 | overflow: hidden; 29 | position: relative; 30 | text-indent: 24px; 31 | white-space: nowrap; 32 | width: 24px; 33 | } 34 | 35 | .coa-meta-delete.delete-column { 36 | margin: 0 auto; 37 | } 38 | 39 | .coa-meta-delete:before { 40 | border-radius: 50%; 41 | color: #0073aa; 42 | content: "\f153"; 43 | display: block; 44 | font: 400 16px/20px dashicons; 45 | height: 20px; 46 | left: 2px; 47 | line-height: 1.28; 48 | text-align: center; 49 | speak: none; 50 | text-indent: 0; 51 | top: 2px; 52 | position: absolute; 53 | width: 20px; 54 | -webkit-font-smoothing: antialiased; 55 | } 56 | 57 | .coa-meta-delete:hover:before { 58 | color: #c00; 59 | } 60 | 61 | #cost-table-meta tr:first-of-type td:nth-of-type(2) .coa-meta-delete, 62 | #cost-table-meta tr:nth-of-type(2) .coa-meta-delete { 63 | display: none; 64 | } 65 | 66 | .coa-meta-add { 67 | background: none; 68 | border: none; 69 | color: #0073aa; 70 | cursor: pointer; 71 | text-decoration: underline; 72 | } 73 | 74 | .add-column:disabled, 75 | .add-column:disabled:hover { 76 | color: #82878c; 77 | text-decoration: none; 78 | } 79 | 80 | .coa-meta-add:hover { 81 | color: #00a0d2; 82 | } 83 | 84 | .coa-meta-add span { 85 | speak: none; 86 | } 87 | -------------------------------------------------------------------------------- /parts/headers-search.php: -------------------------------------------------------------------------------- 1 | 7 |
8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 | Search 32 | 33 |
34 | 35 |
36 | 37 | 42 |
43 |
44 |

45 |
46 |
47 | 58 |
59 |
60 |

61 |
62 |
63 | 7 |
8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 | 35 |
36 | 37 | 42 |
43 |
44 |

45 |
46 |
47 | 58 |
59 |
60 |

61 |
62 |
63 | header ~ .column { 40 | padding-top: 2rem; 41 | } 42 | 43 | section.row { 44 | border-bottom: 5px solid #f3f3f3; 45 | } 46 | 47 | section.row.no-bottom-border, 48 | main > .page > section.row:last-child, 49 | main > .page > :last-child section.row, 50 | .main-header + section.row, 51 | footer > section.row { 52 | border-bottom: none; 53 | } 54 | 55 | section.pad-top > header { 56 | padding-top: 3rem; 57 | } 58 | 59 | section.pad-bottom > header { 60 | padding-bottom: 0; 61 | } 62 | 63 | @media only screen and (min-width: 694px) { 64 | 65 | .fluid .row.side-right .column.one { 66 | padding-right: 1.3125rem; 67 | width: 66.66666%; 68 | } 69 | 70 | .fluid .row.side-right .column.two { 71 | padding-left: .625rem; 72 | width: 33.33333%; 73 | } 74 | 75 | .reverse.side-left.gutter .column.two:not(.gutterless) { 76 | padding-left: 2rem; 77 | padding-right: 1rem; 78 | } 79 | 80 | .reverse.side-left.gutter .column.one:not(.gutterless) { 81 | padding-left: 1rem; 82 | padding-right: 2rem; 83 | } 84 | } 85 | 86 | #spine .spine-actions-tabs>li>a { 87 | display: block; 88 | position: relative; 89 | width: 100%; 90 | height: 2.2em; 91 | font-weight: 400; 92 | font-size: 1.2em; 93 | line-height: 1em; 94 | text-shadow: none; 95 | padding: 0.8em 0 0.8em 0; 96 | display: block; 97 | } 98 | 99 | -------------------------------------------------------------------------------- /src/js/cost-tables.js: -------------------------------------------------------------------------------- 1 | ( function( $, cost_tables ) { 2 | "use strict"; 3 | 4 | var $form = $( ".sfs-cost-tables" ), 5 | $session = $( "#cost-table-session" ), 6 | $campus = $( "#cost-table-campus" ), 7 | $career = $( "#cost-table-career" ), 8 | $campus_options = $campus.find( "option" ), 9 | $career_options = $career.find( "option" ), 10 | $table_container = $( ".cost-table-placeholder" ); 11 | 12 | // Disable any options that won't yield a table if selected. 13 | function update_options( options, available ) { 14 | options.each( function() { 15 | if ( "" !== $( this ).val() ) { 16 | if ( -1 !== $.inArray( $( this ).val(), available ) ) { 17 | $( this ).prop( "disabled", false ); 18 | } 19 | } 20 | } ); 21 | } 22 | 23 | // Handle changes to the form. 24 | $form.on( "change", function( e ) { 25 | 26 | // Make sure all values are posted. 27 | $campus_options.prop( "disabled", false ); 28 | $career_options.prop( "disabled", false ); 29 | 30 | var input = e.target, 31 | name = $( input ).attr( "name" ), 32 | data = { 33 | action: "cost_tables", 34 | nonce: cost_tables.nonce, 35 | language: cost_tables.language, 36 | session: $session.val(), 37 | campus: $campus.val(), 38 | career: $career.val(), 39 | updated: name 40 | }; 41 | 42 | // Make the AJAX request if each input has a viable value. 43 | if ( "" !== $session.val() && "" !== $campus.val() && "" !== $career.val() ) { 44 | $table_container.html( "
" ); 45 | $campus_options.prop( "disabled", true ); 46 | $career_options.prop( "disabled", true ); 47 | 48 | $.post( cost_tables.ajax_url, data, function( response ) { 49 | var response_data = $.parseJSON( response ); 50 | 51 | update_options( $campus_options, response_data.campuses ); 52 | update_options( $career_options, response_data.careers ); 53 | 54 | $table_container.html( response_data.table ); 55 | } ); 56 | } 57 | } ); 58 | }( jQuery, window.cost_tables ) ); 59 | -------------------------------------------------------------------------------- /src/js/home.js: -------------------------------------------------------------------------------- 1 | // Check for `mix-blend-mode` support and add a class to the HTML tag accordingly. 2 | document.addEventListener( "DOMContentLoaded", function() { 3 | var supportsMixBlendMode = window.getComputedStyle( document.body ).mixBlendMode; 4 | if ( "undefined" === typeof supportsMixBlendMode ) { 5 | document.documentElement.classList.add( "no-mix-blend-mode" ); 6 | } 7 | }, false ); 8 | 9 | ( function( $ ) { 10 | 11 | "use strict"; 12 | 13 | // Add Previous and Next controls for navigating the output of the Content Syndicate shortcode. 14 | $( ".home-calendar .wsuwp-content-syndicate-list" ). 15 | before( "" ). 16 | after( "" ); 17 | 18 | // Hide the Previous control - we only want to show it when it"s needed. 19 | $( ".event-control.prev" ).hide(); 20 | 21 | // Adjust the left offset of the Content Syndicate list accordingly when the controls are clicked. 22 | $( ".wsuwp-content-syndicate-wrapper" ).on( "click", ".event-control", function( e ) { 23 | e.preventDefault(); 24 | 25 | var list = $( ".wsuwp-content-syndicate-list" ), 26 | event = $( ".wsuwp-content-syndicate-event" ), 27 | position = "", 28 | right_max = -( event.length * event.outerWidth() - list.width() ); 29 | 30 | if ( $( this ).hasClass( "prev" ) ) { 31 | list.css( "left", "+=" + event.outerWidth() + "px" ); 32 | } else if ( $( this ).hasClass( "next" ) ) { 33 | list.css( "left", "-=" + event.outerWidth() + "px" ); 34 | } 35 | 36 | position = parseInt( list.css( "left" ) ); 37 | 38 | // Show the controls when list items are available to scroll to, and hide them otherwise. 39 | if ( 0 <= position ) { 40 | $( ".event-control.prev" ).hide(); 41 | } else { 42 | $( ".event-control.prev" ).show(); 43 | } 44 | 45 | if ( right_max >= position ) { 46 | $( ".event-control.next" ).hide(); 47 | } else { 48 | $( ".event-control.next" ).show(); 49 | } 50 | } ); 51 | }( jQuery ) ); 52 | -------------------------------------------------------------------------------- /css/03-typography.css: -------------------------------------------------------------------------------- 1 | h1 { 2 | color: #981e32; 3 | font-size: 3em; 4 | font-weight: 800; 5 | margin-bottom: 5px; 6 | text-transform: uppercase; 7 | } 8 | 9 | h2 { 10 | color: #981e32; 11 | font-size: 2.5em; 12 | font-weight: 300; 13 | margin-top: 1.5rem; 14 | padding-bottom: 25px; 15 | } 16 | 17 | h3, 18 | h4 { 19 | color: #393939; 20 | margin-top: 1.25rem; 21 | } 22 | 23 | h3 { 24 | font-size: 1.75em; 25 | font-weight: 400; 26 | padding-bottom: 20px; 27 | } 28 | 29 | h4 { 30 | font-size: 1.25em; 31 | font-weight: 700; 32 | text-transform: uppercase; 33 | } 34 | 35 | h5 { 36 | color: #981e32; 37 | font-size: .7rem; 38 | font-weight: 700; 39 | line-height: 15px; 40 | padding-bottom: 20px; 41 | } 42 | 43 | .white-text h1, 44 | .white-text h2, 45 | .white-text h3, 46 | .white-text h4, 47 | .white-text h5, 48 | .white-text a { 49 | color: #fff; 50 | } 51 | 52 | section > header > h1, 53 | section > header > h2, 54 | section > header > h3, 55 | section > header > h4 { 56 | padding: 0; 57 | } 58 | 59 | p, 60 | main section li { 61 | font-size: 1rem; 62 | font-weight: 300; 63 | line-height: 1.5; 64 | } 65 | 66 | p, 67 | p ~ p { 68 | line-height: 1.65rem; 69 | padding-bottom: 1.75rem; 70 | } 71 | 72 | .false-header { 73 | font-size: 1.4em; 74 | font-weight: 300; 75 | letter-spacing: 1px; 76 | padding-bottom: 0; 77 | text-transform: uppercase; 78 | } 79 | 80 | p.false-header + h2 { 81 | margin-top: 0; 82 | } 83 | 84 | .landing h2 { 85 | font-size: 3.5em; 86 | font-weight: 700; 87 | padding-top: 0; 88 | text-transform: uppercase; 89 | } 90 | 91 | .intro { 92 | font-size: 1.25rem; 93 | line-height: 1.5em; 94 | color: #4e4e4e; 95 | } 96 | 97 | main a { 98 | border-bottom: 1px solid #b7b7b7; 99 | text-decoration: none; 100 | transition: all .4s ease; 101 | } 102 | 103 | main a:hover { 104 | background-color: #efefef; 105 | border-bottom: 1px solid #981e32; 106 | color: #981e32; 107 | text-decoration: none; 108 | } 109 | 110 | main ul { 111 | list-style-type: square; 112 | } 113 | 114 | @media screen and (max-width: 693px) { 115 | 116 | .landing h2 { 117 | font-size: 9vw; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /includes/class-wsu-student-financial-services-site-actions-widget.php: -------------------------------------------------------------------------------- 1 | 'A link to be displayed at the top of every page', 14 | ) 15 | ); 16 | } 17 | 18 | /** 19 | * Outputs the content of the widget 20 | * 21 | * @param array $args 22 | * @param array $instance 23 | */ 24 | public function widget( $args, $instance ) { 25 | $default_instance = array( 26 | 'action_link' => '', 27 | 'action_text' => '', 28 | ); 29 | 30 | $instance = shortcode_atts( $default_instance, $instance ); 31 | 32 | ?> 33 |
  • 34 | 35 |
  • 36 | 51 |

    52 | 53 | 58 |

    59 |

    60 | 61 | 66 |

    67 | 1%", "ie 8-11", "Firefox ESR" ] 26 | } ) 27 | ] 28 | }, 29 | dist: { 30 | src: "tmp-style.css", 31 | dest: "style.css" 32 | } 33 | }, 34 | 35 | clean: { 36 | options: { 37 | force: true 38 | }, 39 | temp: [ "tmp-style.css", "tmp-style.css.map" ] 40 | }, 41 | 42 | jscs: { 43 | scripts: { 44 | src: [ "Gruntfile.js", "src/js/*.js" ], 45 | options: { 46 | preset: "jquery", 47 | requireCamelCaseOrUpperCaseIdentifiers: false, // We rely on name_name too much to change them all. 48 | maximumLineLength: 250 49 | } 50 | } 51 | }, 52 | 53 | jshint: { 54 | grunt_script: { 55 | src: [ "Gruntfile.js" ], 56 | options: { 57 | curly: true, 58 | eqeqeq: true, 59 | noarg: true, 60 | quotmark: "double", 61 | undef: true, 62 | unused: false, 63 | node: true // Define globals available when running in Node. 64 | } 65 | }, 66 | theme_scripts: { 67 | src: [ "src/js/*.js" ], 68 | options: { 69 | bitwise: true, 70 | curly: true, 71 | eqeqeq: true, 72 | forin: true, 73 | freeze: true, 74 | noarg: true, 75 | nonbsp: true, 76 | quotmark: "double", 77 | undef: true, 78 | unused: true, 79 | browser: true, // Define globals exposed by modern browsers. 80 | jquery: true // Define globals exposed by jQuery. 81 | } 82 | } 83 | }, 84 | 85 | uglify: { 86 | all: { 87 | files: [ { 88 | expand: true, 89 | cwd: "src/js/", 90 | src: "*.js", 91 | dest: "js", 92 | ext: ".min.js" 93 | } ] 94 | } 95 | }, 96 | 97 | phpcs: { 98 | plugin: { 99 | src: "./" 100 | }, 101 | options: { 102 | bin: "vendor/bin/phpcs --extensions=php --ignore=\"*/vendor/*,*/node_modules/*\"", 103 | standard: "phpcs.ruleset.xml" 104 | } 105 | } 106 | 107 | } ); 108 | 109 | grunt.loadNpmTasks( "grunt-contrib-clean" ); 110 | grunt.loadNpmTasks( "grunt-contrib-concat" ); 111 | grunt.loadNpmTasks( "grunt-contrib-jshint" ); 112 | grunt.loadNpmTasks( "grunt-contrib-uglify" ); 113 | grunt.loadNpmTasks( "grunt-jscs" ); 114 | grunt.loadNpmTasks( "grunt-phpcs" ); 115 | grunt.loadNpmTasks( "grunt-postcss" ); 116 | grunt.loadNpmTasks( "grunt-stylelint" ); 117 | 118 | // Default task(s). 119 | grunt.registerTask( "default", [ "stylelint", "concat", "postcss", "clean", "jscs", "jshint", "uglify", "phpcs" ] ); 120 | }; 121 | -------------------------------------------------------------------------------- /src/js/admin-cost-tables.js: -------------------------------------------------------------------------------- 1 | ( function( $ ) { 2 | 3 | "use strict"; 4 | 5 | var $table = $( "#cost-table-meta table" ), 6 | $add_column = $( "#cost-table-meta .add-column" ), 7 | $add_row = $( "#cost-table-meta .add-row" ), 8 | total_columns = 6; 9 | 10 | /** 11 | * Hide the "Add Column" button if there are already the allowed maximum. 12 | */ 13 | if ( total_columns <= $table.find( "tr:first td" ).length ) { 14 | $add_column.prop( "disabled", true ); 15 | } 16 | 17 | /** 18 | * Add a column to the table. 19 | * 20 | * This clones the last cell in each row, 21 | * removes the value from the input, 22 | * and appends the cell to the row. 23 | * 24 | * This also disables the "Add Column" button once the allowed maximum is reached. 25 | */ 26 | $add_column.on( "click", function() { 27 | if ( total_columns > $table.find( "tr:first td" ).length ) { 28 | $table.find( "tr" ).each( function() { 29 | $( this ).find( "td" ).last().clone() 30 | .find( "input" ).val( "" ).end() 31 | .appendTo( $( this ) ); 32 | } ); 33 | } 34 | 35 | if ( total_columns <= $table.find( "tr:first td" ).length ) { 36 | $add_column.prop( "disabled", true ); 37 | } 38 | } ); 39 | 40 | /** 41 | * Add a row to the table. 42 | * 43 | * This clones the last row in the table, 44 | * removes the values from the inputs, 45 | * and increments the name attribute index. 46 | */ 47 | $add_row.on( "click", function() { 48 | $table.find( "tr" ).last().clone() 49 | .find( "input[type='text']" ).val( "" ).end() 50 | .find( "input[type='text']" ).attr( "name", function( i, value ) { 51 | var new_index = parseInt( value.match( /\d+/ ) ) + 1; 52 | return value.replace( /\d+/, new_index ); 53 | } ).end() 54 | .appendTo( $table ); 55 | } ); 56 | 57 | /** 58 | * Delete a row or column from the table. 59 | */ 60 | $table.on( "click", ".coa-meta-delete", function() { 61 | var $button = $( this ); 62 | 63 | // Delete a row. 64 | if ( $button.hasClass( "delete-row" ) ) { 65 | var $row = $button.closest( "tr" ); 66 | 67 | // Don't allow the first row to be deleted. 68 | if ( 0 === $row.index() ) { 69 | return; 70 | } 71 | 72 | // Delete the row. 73 | $row.remove(); 74 | 75 | // Reindex remaining rows. 76 | $table.find( "tr" ).each( function() { 77 | var $current_row = $( this ), 78 | index = $current_row.index() - 1; 79 | 80 | $current_row.find( "input[type='text']" ).attr( "name", function( i, value ) { 81 | return value.replace( /\d+/, index ); 82 | } ).end(); 83 | } ); 84 | } 85 | 86 | // Delete a column. 87 | if ( $button.hasClass( "delete-column" ) ) { 88 | var $column = $button.closest( "td" ).index(); 89 | 90 | // Don't allow the first column to be deleted. 91 | if ( 0 === $column ) { 92 | return; 93 | } 94 | 95 | // Delete the column. 96 | $table.find( "tr" ).each( function() { 97 | $( this ).find( "td" ).eq( $column ).remove(); 98 | } ); 99 | 100 | // Reenable the add column button. 101 | $add_column.prop( "disabled", false ); 102 | } 103 | } ); 104 | 105 | }( jQuery ) ); 106 | -------------------------------------------------------------------------------- /search.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
    6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
    18 | 19 |
    20 | 21 | 22 | 23 |

    Search 24 | 30 | 72 | 73 |
    74 | 75 | 76 | 77 |

    78 | 79 |
    80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
    90 | 91 | 92 | 93 | 'A "give" link to be displayed in the site footer', 14 | ) 15 | ); 16 | } 17 | 18 | /** 19 | * Outputs the content of the widget 20 | * 21 | * @param array $args 22 | * @param array $instance 23 | */ 24 | public function widget( $args, $instance ) { 25 | $default_instance = array( 26 | 'url' => '', 27 | 'text' => '', 28 | ); 29 | 30 | $instance = shortcode_atts( $default_instance, $instance ); 31 | 32 | if ( ! $instance['url'] || ! $instance['text'] ) { 33 | return; 34 | } 35 | 36 | ?> 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 59 |

    60 | 61 | 66 |

    67 |

    68 | 69 | 74 |

    75 | 13 |
    14 | 15 |
    16 |

    17 | « Scholarship Search Results 18 |

    19 | 20 | 21 |
    22 | 23 |
    24 | 42 | 43 |
    44 | 45 |
    46 |

    47 |
    48 | 49 |
    50 | 51 |

    52 | Apply 53 |

    54 | 55 |
    56 | 57 |
    58 | 59 |
    60 | 61 |
    62 | 63 | 64 | format( 'm/d/Y' ) : $deadline; 68 | ?>

    Deadline:

    Amount:

    Paper Application Available

    Online Application Available

    88 |

    Contact information:

    89 | 114 |

    About

    115 | 122 | 140 |
    141 | 142 |
    143 | 144 |
    145 | 146 | 147 | -------------------------------------------------------------------------------- /includes/class-wsu-student-financial-services-theme.php: -------------------------------------------------------------------------------- 1 | setup_hooks(); 31 | } 32 | return self::$instance; 33 | } 34 | 35 | /** 36 | * Setup hooks to include. 37 | * 38 | * @since 0.0.1 39 | */ 40 | public function setup_hooks() { 41 | add_filter( 'spine_child_theme_version', array( $this, 'theme_version' ) ); 42 | add_action( 'init', array( $this, 'register_menu' ), 10 ); 43 | add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); 44 | add_filter( 'body_class', array( $this, 'browser_body_class' ) ); 45 | add_filter( 'wsuwp_content_syndicate_json', array( $this, 'announcements_html' ), 10, 2 ); 46 | add_filter( 'nav_menu_css_class', array( $this, 'menu_classes' ), 12, 3 ); 47 | } 48 | 49 | /** 50 | * Provide a theme version for use in cache busting. 51 | * 52 | * @since 0.0.1 53 | * 54 | * @return string 55 | */ 56 | public function theme_version() { 57 | return $this->script_version; 58 | } 59 | 60 | /** 61 | * Register the additional menu used in the theme footer. 62 | * 63 | * @since 0.0.1 64 | */ 65 | public function register_menu() { 66 | register_nav_menu( 'footer', 'Footer' ); 67 | } 68 | 69 | /** 70 | * Enqueue the scripts used in the theme. 71 | * 72 | * @since 0.0.1 73 | */ 74 | public function enqueue_scripts() { 75 | if ( is_front_page() ) { 76 | wp_enqueue_script( 'sfs-scripts', get_stylesheet_directory_uri() . '/js/home.min.js', array( 'jquery' ), $this->script_version, true ); 77 | } 78 | 79 | $post = get_post(); 80 | 81 | if ( isset( $post->post_content ) && strpos( $post->post_content, 'js-accordion' ) ) { 82 | wp_enqueue_script( 'sfs-scripts', get_stylesheet_directory_uri() . '/js/accordion.min.js', array( 'jquery' ), $this->script_version, true ); 83 | } 84 | 85 | if ( isset( $post->post_content ) && has_shortcode( $post->post_content, 'wsuwp_toc' ) ) { 86 | $body_classes = get_post_meta( $post->ID, '_wsuwp_body_class', true ); 87 | 88 | if ( false !== strpos( $body_classes, 'convert-toc-to-select' ) ) { 89 | wp_enqueue_script( 'sfs-convert-toc', get_stylesheet_directory_uri() . '/js/toc-select.min.js', array( 'wsuwp-toc-generator', 'jquery' ), $this->script_version, true ); 90 | } 91 | } 92 | } 93 | 94 | /** 95 | * Apply 'gecko' as a body class on the home page for Firefox users. 96 | * 97 | * @since 0.0.3 98 | * 99 | * @param array $classes Original body classes. 100 | * 101 | * @return array $classes Modified body classes. 102 | */ 103 | public function browser_body_class( $classes ) { 104 | global $is_gecko; 105 | 106 | if ( is_front_page() && $is_gecko ) { 107 | $classes[] = 'gecko'; 108 | } 109 | 110 | return $classes; 111 | } 112 | 113 | /** 114 | * Provide a custom HTML template for use with syndicated content. 115 | * 116 | * @param string $content The unfiltered content. 117 | * @param stdClass $atts Shortcode attributes. 118 | * 119 | * @return string Modified HTML to output. 120 | */ 121 | public function announcements_html( $content, $atts ) { 122 | return str_replace( '', ' » Read More', $content ); 123 | } 124 | 125 | /** 126 | * Filter menu item classes for event category pages. 127 | * 128 | * @param array $classes Current list of nav menu classes. 129 | * @param WP_Post $item Post object representing the menu item. 130 | * @param stdClass $args Arguments used to create the menu. 131 | * 132 | * @return array 133 | */ 134 | public function menu_classes( $classes, $item, $args ) { 135 | // Bail if this isn't the site menu. 136 | if ( 'site' !== $args->menu ) { 137 | return $classes; 138 | } 139 | 140 | // Bail if this isn't an Events Category page. 141 | if ( ! is_tax( 'tribe_events_cat' ) ) { 142 | return $classes; 143 | } 144 | 145 | // Run applicable URLs through `trailingslashit` just to be safe. 146 | $current_url = trailingslashit( get_term_link( get_query_var( 'term' ), 'tribe_events_cat' ) ); 147 | $menu_item_url = trailingslashit( $item->url ); 148 | 149 | if ( $current_url === $menu_item_url ) { 150 | $classes[] = 'active'; 151 | } else { 152 | $classes = array(); 153 | } 154 | 155 | return $classes; 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /functions.php: -------------------------------------------------------------------------------- 1 | 'Actions', 33 | 'id' => 'site-actions', 34 | 'description' => 'Displays the action links on the top of every page.', 35 | ); 36 | 37 | register_sidebar( $header_args ); 38 | 39 | $footer_args = array( 40 | 'name' => 'Give Link', 41 | 'id' => 'give-link', 42 | 'description' => 'Displays the "give" link in the site footer.', 43 | ); 44 | 45 | register_sidebar( $footer_args ); 46 | 47 | } ); 48 | 49 | /** 50 | * Determine what should be displayed in the main header area. 51 | * 52 | * @since 0.0.1 53 | * 54 | * @return array List of elements for output in main header. 55 | */ 56 | function sfs_get_header_elements() { 57 | $sfs_headers = array( 58 | 'section_title' => '', 59 | 'page_sup' => '', 60 | 'page_sub' => '', 61 | ); 62 | 63 | // Section title. 64 | if ( is_page() ) { 65 | // Retrieve the title of the top-level category for pages. 66 | $category = get_the_category(); 67 | if ( $category ) { 68 | $category_parents = get_category_parents( $category[0]->term_id ); 69 | $top_category = explode( '/', $category_parents ); 70 | $section = rtrim( $top_category[0], '/' ); 71 | if ( $section ) { 72 | $sfs_headers['section_title'] = $section; 73 | } 74 | } else { 75 | // Fall back to the page title if the page has no categories. 76 | $sfs_headers['section_title'] = get_the_title(); 77 | } 78 | } elseif ( is_singular( 'post' ) || ( is_archive() && ! is_post_type_archive( 'tribe_events' ) ) ) { 79 | // For posts and archive views (excluding events archives), use "Latest". 80 | $sfs_headers['section_title'] = 'Latest'; 81 | } elseif ( is_single() && ! is_singular( 'tribe_events' ) ) { 82 | // For all other post types except events, retrieve: 83 | // 1) a category name; or 84 | // 2) the post type name. 85 | $category = get_the_category(); 86 | if ( $category ) { 87 | $sfs_headers['section_title'] = $category[0]->cat_name; 88 | } else { 89 | $post_type = get_post_type_object( get_post_type() ); 90 | $sfs_headers['section_title'] = $post_type->labels->name; 91 | } 92 | } 93 | 94 | if ( '' === $sfs_headers['section_title'] ) { 95 | // Use the Spine parent theme's sub header value for anything else. 96 | $spine_main_header_values = spine_get_main_header(); 97 | $sfs_headers['section_title'] = $spine_main_header_values['sub_header_default']; 98 | } 99 | 100 | // Page sup header. 101 | $page_sup = get_post_meta( get_the_ID(), 'sup-header', true ); 102 | if ( $page_sup ) { 103 | $sfs_headers['page_sup'] = $page_sup; 104 | } 105 | 106 | // Page sub header. 107 | if ( is_singular( 'post' ) ) { 108 | // For posts, retrieve: 109 | // 1) a category name; or 110 | // 2) the post type name. 111 | $category = get_the_category(); 112 | if ( $category ) { 113 | $sfs_headers['page_sub'] = $category[0]->cat_name; 114 | } else { 115 | $post_type = get_post_type_object( get_post_type() ); 116 | $sfs_headers['page_sub'] = $post_type->labels->name; 117 | } 118 | } elseif ( is_singular( 'tribe_events' ) ) { 119 | // For individual events, retrieve: 120 | // 1) an event category name; or 121 | // 2) "Events". 122 | $event_category = get_the_terms( get_queried_object_id(), 'tribe_events_cat' ); 123 | if ( $event_category ) { 124 | $sfs_headers['page_sub'] = $event_category[0]->name; 125 | } else { 126 | $sfs_headers['page_sub'] = 'Events'; 127 | } 128 | } elseif ( is_post_type_archive( 'tribe_events' ) ) { 129 | if ( is_tax() ) { 130 | // Retrieve the term title for Event taxonomy archives. 131 | $sfs_headers['page_sub'] = single_term_title( '', false ); 132 | } else { 133 | // Output "Full Calendar" for the main Events archive view. 134 | $sfs_headers['page_sub'] = 'Full Calendar'; 135 | } 136 | } elseif ( is_archive() ) { 137 | // Use the Spine parent theme's sub header value for anything else. 138 | $spine_main_header_values = spine_get_main_header(); 139 | $sfs_headers['page_sub'] = $spine_main_header_values['sub_header_default']; 140 | } else { 141 | // For everything else, grab the Spine Main Header Bottom Header Text, or the post title 142 | $page_sub = get_post_meta( get_the_ID(), 'sub-header', true ); 143 | $sfs_headers['page_sub'] = ( $page_sub ) ? $page_sub : get_the_title(); 144 | } 145 | 146 | return apply_filters( 'sfs_theme_header_elements', $sfs_headers ); 147 | } 148 | -------------------------------------------------------------------------------- /css/07-home-page.css: -------------------------------------------------------------------------------- 1 | .crimson-top { 2 | border-top: 5px solid #981e32; 3 | } 4 | 5 | /* Video/intro section */ 6 | section.video { 7 | padding-bottom: 3rem; 8 | position: relative; 9 | z-index: 1; 10 | } 11 | 12 | .column.video { 13 | position: static; 14 | } 15 | 16 | .video-container { 17 | height: 100%; 18 | left: 0; 19 | mix-blend-mode: multiply; 20 | overflow: hidden; 21 | position: absolute; 22 | top: 0; 23 | width: 100%; 24 | z-index: -1; 25 | display: flex; 26 | justify-content: center; 27 | } 28 | 29 | .video-container video { 30 | min-height: 100%; 31 | width: auto; 32 | } 33 | 34 | .video-container:after { 35 | background: rgba(0, 0, 0, .1); 36 | content: ""; 37 | height: 100%; 38 | position: absolute; 39 | width: 100%; 40 | } 41 | 42 | .multiply .transparent-crimson-back { 43 | background: none; 44 | } 45 | 46 | .no-mix-blend-mode .multiply .transparent-crimson-back { 47 | background: rgba(152, 30, 50, .9); 48 | } 49 | 50 | .multiply .transparent-crimson-back:before { 51 | background: #940606; 52 | content: ""; 53 | position: absolute; 54 | width: 100%; 55 | height: 100%; 56 | left: 0; 57 | top: 0; 58 | z-index: -2; 59 | } 60 | 61 | .false-header1 { 62 | border-bottom: solid 2px #981e32; 63 | color: #fff; 64 | font-size: 1.2em; 65 | font-weight: 800; 66 | letter-spacing: 1px; 67 | margin-bottom: 2.5em; 68 | padding-bottom: .5em; 69 | text-transform: uppercase; 70 | } 71 | 72 | .help { 73 | color: #fff; 74 | font-size: 4em; 75 | font-weight: 800; 76 | margin-bottom: 5px; 77 | } 78 | 79 | .five-steps { 80 | counter-reset: count-it; 81 | list-style: none; 82 | padding: 0 0 2.5rem; 83 | } 84 | 85 | .five-steps li { 86 | padding: 0; 87 | } 88 | 89 | .five-steps a, 90 | .five-steps a:hover { 91 | border-bottom: 1px solid #717171; 92 | color: #fff; 93 | display: block; 94 | font-size: 1.1em; 95 | font-weight: 400; 96 | margin-left: 4.5rem; 97 | padding: .5em 0; 98 | position: relative; 99 | transition: color .4s, padding .4s; 100 | } 101 | 102 | .five-steps a:before { 103 | align-items: center; 104 | background: #b5babe; 105 | color: #fff; 106 | content: counter(count-it); 107 | counter-increment: count-it; 108 | display: flex; 109 | height: calc(100% - .2em); 110 | justify-content: center; 111 | left: -4.5rem; 112 | position: absolute; 113 | text-align: center; 114 | top: .2em; 115 | transition: background .4s, color .4s; 116 | width: 2.5rem; 117 | } 118 | 119 | .five-steps a:hover { 120 | background: none; 121 | padding-left: .75em; 122 | } 123 | 124 | .five-steps a:hover:before { 125 | background: #fff; 126 | color: #981e32; 127 | } 128 | 129 | /* Announcements and quicklinks */ 130 | .home .wsuwp-content-syndicate-list { 131 | list-style-type: none; 132 | } 133 | 134 | .home .wsuwp-content-syndicate-item { 135 | margin-bottom: 1em; 136 | } 137 | 138 | .home .wsuwp-content-syndicate-item a, 139 | .home-calendar .wsuwp-content-syndicate-event a { 140 | text-decoration: none; 141 | color: #393939; 142 | border-bottom: none; 143 | } 144 | 145 | .home .wsuwp-content-syndicate-item a .read-more, 146 | .home-calendar .wsuwp-content-syndicate-event a .read-more { 147 | font-size: .75em; 148 | font-weight: 700; 149 | color: #981e32; 150 | } 151 | 152 | .home .wsuwp-content-syndicate-item a:hover { 153 | color: #981e32; 154 | border-bottom: solid 1px #981e32; 155 | } 156 | 157 | .home .content-item-byline-author, 158 | .home .content-item-read-story { 159 | display: none; 160 | } 161 | 162 | .home main .quicklinks { 163 | display: flex; 164 | } 165 | 166 | .home main .quicklinks ul { 167 | list-style: none; 168 | margin: auto; 169 | padding: 0; 170 | } 171 | 172 | .home main .quicklinks li + li { 173 | margin-top: 1rem; 174 | } 175 | 176 | .home main .quicklinks a { 177 | border: 2px solid #981e32; 178 | box-sizing: border-box; 179 | color: #981e32; 180 | display: inline-block; 181 | font-size: .9em; 182 | font-weight: 600; 183 | letter-spacing: 2px; 184 | padding: 14px; 185 | text-align: center; 186 | text-transform: uppercase; 187 | transition: background .4s, color .4s; 188 | width: 100%; 189 | } 190 | 191 | .home main .quicklinks a:hover { 192 | background: #981e32; 193 | color: #fff; 194 | } 195 | 196 | /* Home page events */ 197 | .home-calendar .wsuwp-content-syndicate-wrapper { 198 | overflow: hidden; 199 | padding-bottom: 2rem; 200 | } 201 | 202 | .home-calendar .wsuwp-content-syndicate-list { 203 | display: flex; 204 | padding: 0; 205 | position: relative; 206 | } 207 | 208 | .home-calendar .wsuwp-content-syndicate-event { 209 | box-sizing: border-box; 210 | flex: 1 0 25%; 211 | list-style: none; 212 | padding: .5em 1em 0 0; 213 | transition: background .4s; 214 | width: 25%; 215 | } 216 | 217 | .home-calendar .content-item-event-date { 218 | box-sizing: border-box; 219 | color: #fff; 220 | float: left; 221 | font-size: 32px; 222 | font-weight: 600; 223 | line-height: 50px; 224 | position: relative; 225 | text-align: center; 226 | text-transform: uppercase; 227 | width: 3.5rem; 228 | word-spacing: 3rem; 229 | z-index: 1; 230 | } 231 | 232 | .home-calendar .content-item-event-date:first-line { 233 | font-size: 12px; 234 | font-weight: 300; 235 | line-height: 24px; 236 | } 237 | 238 | .gecko .home-calendar .content-item-event-date { 239 | line-height: 33px; 240 | height: 74px; 241 | } 242 | 243 | .gecko .home-calendar .content-item-event-date:first-line { 244 | vertical-align: top; 245 | } 246 | 247 | .home-calendar .content-item-event-date:before, 248 | .home-calendar .content-item-event-date:after { 249 | content: ""; 250 | left: 0; 251 | position: absolute; 252 | transition: background .4s; 253 | width: 100%; 254 | z-index: -1; 255 | } 256 | 257 | .home-calendar .content-item-event-date:before { 258 | background: #717171; 259 | height: 24px; 260 | top: 0; 261 | } 262 | 263 | .home-calendar .content-item-event-date:after { 264 | background: #b5babe; 265 | bottom: 0; 266 | height: 48px; 267 | } 268 | 269 | .home-calendar li:hover .content-item-event-date:before { 270 | background: #b5babe; 271 | } 272 | 273 | .home-calendar li:hover .content-item-event-date:after { 274 | background: #981e32; 275 | } 276 | 277 | .home-calendar .content-item-event-title { 278 | display: block; 279 | margin-left: 4.25rem; 280 | } 281 | 282 | .home-calendar .content-item-event-title a { 283 | border-bottom: 0; 284 | } 285 | 286 | .home-calendar .content-item-event-meta { 287 | display: none; 288 | } 289 | 290 | /* Home page event navigation */ 291 | .event-control { 292 | border: none; 293 | display: block; 294 | height: 3rem; 295 | overflow: hidden; 296 | position: absolute; 297 | text-indent: -5rem; 298 | top: 50%; 299 | transform: translateY(-50%); 300 | width: 2rem; 301 | } 302 | 303 | .event-control:hover { 304 | background: none; 305 | border-bottom: none; 306 | } 307 | 308 | .event-control:before, 309 | .event-control:after { 310 | border: 1.5rem solid transparent; 311 | box-sizing: border-box; 312 | content: ""; 313 | position: absolute; 314 | top: 0; 315 | } 316 | 317 | .event-control.prev { 318 | margin-left: -2.5rem; 319 | } 320 | 321 | .event-control.prev:before { 322 | border-right-color: #717171; 323 | right: 0; 324 | transition: border-right-color .4s; 325 | } 326 | 327 | .event-control.prev:hover:before { 328 | border-right-color: #981e32; 329 | } 330 | 331 | .event-control.prev:after { 332 | border-right-color: #fff; 333 | right: -.25rem; 334 | } 335 | 336 | .event-control.next { 337 | right: -.5rem; 338 | } 339 | 340 | .event-control.next:before { 341 | border-left-color: #717171; 342 | left: 0; 343 | transition: border-left-color .4s; 344 | } 345 | 346 | .event-control.next:hover:before { 347 | border-left-color: #981e32; 348 | } 349 | 350 | .event-control.next:after { 351 | border-left-color: #fff; 352 | left: -.25rem; 353 | } 354 | 355 | .social-media-channels { 356 | display: flex; 357 | justify-content: space-between; 358 | list-style: none; 359 | } 360 | 361 | .social-media-channels li { 362 | padding: 0; 363 | } 364 | 365 | .social-media-channels a { 366 | border: none; 367 | box-sizing: border-box; 368 | display: block; 369 | font-size: 1.8em; 370 | height: 33px; 371 | line-height: 33px; 372 | position: relative; 373 | text-indent: -99164px; 374 | width: 33px; 375 | } 376 | 377 | .social-media-channels a:hover { 378 | background: none; 379 | border: none; 380 | } 381 | 382 | .social-media-channels a:before { 383 | font-family: Spine-Icons; 384 | height: 33px; 385 | left: 0; 386 | position: absolute; 387 | text-align: center; 388 | text-indent: 0; 389 | top: 0; 390 | width: 33px; 391 | -webkit-font-smoothing: antialiased; 392 | -moz-osx-font-smoothing: grayscale; 393 | } 394 | 395 | .social-media-channels .facebook a:before { 396 | color: #3b5998; 397 | content: "F"; 398 | } 399 | 400 | .social-media-channels .twitter a:before { 401 | color: #55acee; 402 | content: "T"; 403 | } 404 | 405 | .social-media-channels .youtube a:before { 406 | color: #cc181e; 407 | content: "Y"; 408 | } 409 | 410 | .social-media-channels .instagram a:before { 411 | color: #517fa5; 412 | content: "I"; 413 | } 414 | 415 | .social-media-channels li a:hover:before { 416 | color: #981e32; 417 | } 418 | 419 | .home .site-action-links > ul > li { 420 | display: none; 421 | } 422 | 423 | .home .site-action-links .widget_polylang { 424 | border-left: none; 425 | display: block; 426 | } 427 | 428 | html[lang="es-ES"] .help { 429 | font-size: 3.5em; 430 | } 431 | 432 | @media only screen and (max-width: 1090px) { 433 | 434 | html[lang="es-ES"] .help { 435 | font-size: 4.5vw; 436 | } 437 | } 438 | 439 | @media screen and (max-width: 791px) { 440 | 441 | .home-calendar .wsuwp-content-syndicate-list li { 442 | flex: 1 0 50%; 443 | width: 50%; 444 | } 445 | } 446 | 447 | @media only screen and (max-width: 693px) { 448 | 449 | .home .halves .column.one { 450 | min-height: 350px; 451 | padding-left: 0; 452 | padding-right: 0; 453 | } 454 | 455 | html[lang="es-ES"] .help { 456 | font-size: 2.5em; 457 | } 458 | } 459 | 460 | @media only screen and (max-width: 530px) { 461 | 462 | .home-calendar .wsuwp-content-syndicate-list li { 463 | flex: 1 0 100%; 464 | width: 100%; 465 | } 466 | 467 | .home .column.intro p { 468 | font-size: 1.5em; 469 | } 470 | 471 | .home h1 { 472 | font-size: 3em; 473 | } 474 | } 475 | 476 | @media only screen and (min-width: 694px) { 477 | 478 | .home .halves .column.two { 479 | padding: 6rem 2rem; 480 | } 481 | } 482 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | WSU Student Financial Services Theme 2 | 3 | Copyright 2016 by Washington State University 4 | 5 | This program is free software; you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation; either version 2 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program; if not, write to the Free Software 17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 | 19 | =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 20 | 21 | GNU GENERAL PUBLIC LICENSE 22 | Version 2, June 1991 23 | 24 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 25 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 26 | Everyone is permitted to copy and distribute verbatim copies 27 | of this license document, but changing it is not allowed. 28 | 29 | Preamble 30 | 31 | The licenses for most software are designed to take away your 32 | freedom to share and change it. By contrast, the GNU General Public 33 | License is intended to guarantee your freedom to share and change free 34 | software--to make sure the software is free for all its users. This 35 | General Public License applies to most of the Free Software 36 | Foundation's software and to any other program whose authors commit to 37 | using it. (Some other Free Software Foundation software is covered by 38 | the GNU Lesser General Public License instead.) You can apply it to 39 | your programs, too. 40 | 41 | When we speak of free software, we are referring to freedom, not 42 | price. Our General Public Licenses are designed to make sure that you 43 | have the freedom to distribute copies of free software (and charge for 44 | this service if you wish), that you receive source code or can get it 45 | if you want it, that you can change the software or use pieces of it 46 | in new free programs; and that you know you can do these things. 47 | 48 | To protect your rights, we need to make restrictions that forbid 49 | anyone to deny you these rights or to ask you to surrender the rights. 50 | These restrictions translate to certain responsibilities for you if you 51 | distribute copies of the software, or if you modify it. 52 | 53 | For example, if you distribute copies of such a program, whether 54 | gratis or for a fee, you must give the recipients all the rights that 55 | you have. You must make sure that they, too, receive or can get the 56 | source code. And you must show them these terms so they know their 57 | rights. 58 | 59 | We protect your rights with two steps: (1) copyright the software, and 60 | (2) offer you this license which gives you legal permission to copy, 61 | distribute and/or modify the software. 62 | 63 | Also, for each author's protection and ours, we want to make certain 64 | that everyone understands that there is no warranty for this free 65 | software. If the software is modified by someone else and passed on, we 66 | want its recipients to know that what they have is not the original, so 67 | that any problems introduced by others will not reflect on the original 68 | authors' reputations. 69 | 70 | Finally, any free program is threatened constantly by software 71 | patents. We wish to avoid the danger that redistributors of a free 72 | program will individually obtain patent licenses, in effect making the 73 | program proprietary. To prevent this, we have made it clear that any 74 | patent must be licensed for everyone's free use or not licensed at all. 75 | 76 | The precise terms and conditions for copying, distribution and 77 | modification follow. 78 | 79 | GNU GENERAL PUBLIC LICENSE 80 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 81 | 82 | 0. This License applies to any program or other work which contains 83 | a notice placed by the copyright holder saying it may be distributed 84 | under the terms of this General Public License. The "Program", below, 85 | refers to any such program or work, and a "work based on the Program" 86 | means either the Program or any derivative work under copyright law: 87 | that is to say, a work containing the Program or a portion of it, 88 | either verbatim or with modifications and/or translated into another 89 | language. (Hereinafter, translation is included without limitation in 90 | the term "modification".) Each licensee is addressed as "you". 91 | 92 | Activities other than copying, distribution and modification are not 93 | covered by this License; they are outside its scope. The act of 94 | running the Program is not restricted, and the output from the Program 95 | is covered only if its contents constitute a work based on the 96 | Program (independent of having been made by running the Program). 97 | Whether that is true depends on what the Program does. 98 | 99 | 1. You may copy and distribute verbatim copies of the Program's 100 | source code as you receive it, in any medium, provided that you 101 | conspicuously and appropriately publish on each copy an appropriate 102 | copyright notice and disclaimer of warranty; keep intact all the 103 | notices that refer to this License and to the absence of any warranty; 104 | and give any other recipients of the Program a copy of this License 105 | along with the Program. 106 | 107 | You may charge a fee for the physical act of transferring a copy, and 108 | you may at your option offer warranty protection in exchange for a fee. 109 | 110 | 2. You may modify your copy or copies of the Program or any portion 111 | of it, thus forming a work based on the Program, and copy and 112 | distribute such modifications or work under the terms of Section 1 113 | above, provided that you also meet all of these conditions: 114 | 115 | a) You must cause the modified files to carry prominent notices 116 | stating that you changed the files and the date of any change. 117 | 118 | b) You must cause any work that you distribute or publish, that in 119 | whole or in part contains or is derived from the Program or any 120 | part thereof, to be licensed as a whole at no charge to all third 121 | parties under the terms of this License. 122 | 123 | c) If the modified program normally reads commands interactively 124 | when run, you must cause it, when started running for such 125 | interactive use in the most ordinary way, to print or display an 126 | announcement including an appropriate copyright notice and a 127 | notice that there is no warranty (or else, saying that you provide 128 | a warranty) and that users may redistribute the program under 129 | these conditions, and telling the user how to view a copy of this 130 | License. (Exception: if the Program itself is interactive but 131 | does not normally print such an announcement, your work based on 132 | the Program is not required to print an announcement.) 133 | 134 | These requirements apply to the modified work as a whole. If 135 | identifiable sections of that work are not derived from the Program, 136 | and can be reasonably considered independent and separate works in 137 | themselves, then this License, and its terms, do not apply to those 138 | sections when you distribute them as separate works. But when you 139 | distribute the same sections as part of a whole which is a work based 140 | on the Program, the distribution of the whole must be on the terms of 141 | this License, whose permissions for other licensees extend to the 142 | entire whole, and thus to each and every part regardless of who wrote it. 143 | 144 | Thus, it is not the intent of this section to claim rights or contest 145 | your rights to work written entirely by you; rather, the intent is to 146 | exercise the right to control the distribution of derivative or 147 | collective works based on the Program. 148 | 149 | In addition, mere aggregation of another work not based on the Program 150 | with the Program (or with a work based on the Program) on a volume of 151 | a storage or distribution medium does not bring the other work under 152 | the scope of this License. 153 | 154 | 3. You may copy and distribute the Program (or a work based on it, 155 | under Section 2) in object code or executable form under the terms of 156 | Sections 1 and 2 above provided that you also do one of the following: 157 | 158 | a) Accompany it with the complete corresponding machine-readable 159 | source code, which must be distributed under the terms of Sections 160 | 1 and 2 above on a medium customarily used for software interchange; or, 161 | 162 | b) Accompany it with a written offer, valid for at least three 163 | years, to give any third party, for a charge no more than your 164 | cost of physically performing source distribution, a complete 165 | machine-readable copy of the corresponding source code, to be 166 | distributed under the terms of Sections 1 and 2 above on a medium 167 | customarily used for software interchange; or, 168 | 169 | c) Accompany it with the information you received as to the offer 170 | to distribute corresponding source code. (This alternative is 171 | allowed only for noncommercial distribution and only if you 172 | received the program in object code or executable form with such 173 | an offer, in accord with Subsection b above.) 174 | 175 | The source code for a work means the preferred form of the work for 176 | making modifications to it. For an executable work, complete source 177 | code means all the source code for all modules it contains, plus any 178 | associated interface definition files, plus the scripts used to 179 | control compilation and installation of the executable. However, as a 180 | special exception, the source code distributed need not include 181 | anything that is normally distributed (in either source or binary 182 | form) with the major components (compiler, kernel, and so on) of the 183 | operating system on which the executable runs, unless that component 184 | itself accompanies the executable. 185 | 186 | If distribution of executable or object code is made by offering 187 | access to copy from a designated place, then offering equivalent 188 | access to copy the source code from the same place counts as 189 | distribution of the source code, even though third parties are not 190 | compelled to copy the source along with the object code. 191 | 192 | 4. You may not copy, modify, sublicense, or distribute the Program 193 | except as expressly provided under this License. Any attempt 194 | otherwise to copy, modify, sublicense or distribute the Program is 195 | void, and will automatically terminate your rights under this License. 196 | However, parties who have received copies, or rights, from you under 197 | this License will not have their licenses terminated so long as such 198 | parties remain in full compliance. 199 | 200 | 5. You are not required to accept this License, since you have not 201 | signed it. However, nothing else grants you permission to modify or 202 | distribute the Program or its derivative works. These actions are 203 | prohibited by law if you do not accept this License. Therefore, by 204 | modifying or distributing the Program (or any work based on the 205 | Program), you indicate your acceptance of this License to do so, and 206 | all its terms and conditions for copying, distributing or modifying 207 | the Program or works based on it. 208 | 209 | 6. Each time you redistribute the Program (or any work based on the 210 | Program), the recipient automatically receives a license from the 211 | original licensor to copy, distribute or modify the Program subject to 212 | these terms and conditions. You may not impose any further 213 | restrictions on the recipients' exercise of the rights granted herein. 214 | You are not responsible for enforcing compliance by third parties to 215 | this License. 216 | 217 | 7. If, as a consequence of a court judgment or allegation of patent 218 | infringement or for any other reason (not limited to patent issues), 219 | conditions are imposed on you (whether by court order, agreement or 220 | otherwise) that contradict the conditions of this License, they do not 221 | excuse you from the conditions of this License. If you cannot 222 | distribute so as to satisfy simultaneously your obligations under this 223 | License and any other pertinent obligations, then as a consequence you 224 | may not distribute the Program at all. For example, if a patent 225 | license would not permit royalty-free redistribution of the Program by 226 | all those who receive copies directly or indirectly through you, then 227 | the only way you could satisfy both it and this License would be to 228 | refrain entirely from distribution of the Program. 229 | 230 | If any portion of this section is held invalid or unenforceable under 231 | any particular circumstance, the balance of the section is intended to 232 | apply and the section as a whole is intended to apply in other 233 | circumstances. 234 | 235 | It is not the purpose of this section to induce you to infringe any 236 | patents or other property right claims or to contest validity of any 237 | such claims; this section has the sole purpose of protecting the 238 | integrity of the free software distribution system, which is 239 | implemented by public license practices. Many people have made 240 | generous contributions to the wide range of software distributed 241 | through that system in reliance on consistent application of that 242 | system; it is up to the author/donor to decide if he or she is willing 243 | to distribute software through any other system and a licensee cannot 244 | impose that choice. 245 | 246 | This section is intended to make thoroughly clear what is believed to 247 | be a consequence of the rest of this License. 248 | 249 | 8. If the distribution and/or use of the Program is restricted in 250 | certain countries either by patents or by copyrighted interfaces, the 251 | original copyright holder who places the Program under this License 252 | may add an explicit geographical distribution limitation excluding 253 | those countries, so that distribution is permitted only in or among 254 | countries not thus excluded. In such case, this License incorporates 255 | the limitation as if written in the body of this License. 256 | 257 | 9. The Free Software Foundation may publish revised and/or new versions 258 | of the General Public License from time to time. Such new versions will 259 | be similar in spirit to the present version, but may differ in detail to 260 | address new problems or concerns. 261 | 262 | Each version is given a distinguishing version number. If the Program 263 | specifies a version number of this License which applies to it and "any 264 | later version", you have the option of following the terms and conditions 265 | either of that version or of any later version published by the Free 266 | Software Foundation. If the Program does not specify a version number of 267 | this License, you may choose any version ever published by the Free Software 268 | Foundation. 269 | 270 | 10. If you wish to incorporate parts of the Program into other free 271 | programs whose distribution conditions are different, write to the author 272 | to ask for permission. For software which is copyrighted by the Free 273 | Software Foundation, write to the Free Software Foundation; we sometimes 274 | make exceptions for this. Our decision will be guided by the two goals 275 | of preserving the free status of all derivatives of our free software and 276 | of promoting the sharing and reuse of software generally. 277 | 278 | NO WARRANTY 279 | 280 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 281 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 282 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 283 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 284 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 285 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 286 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 287 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 288 | REPAIR OR CORRECTION. 289 | 290 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 291 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 292 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 293 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 294 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 295 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 296 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 297 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 298 | POSSIBILITY OF SUCH DAMAGES. 299 | 300 | END OF TERMS AND CONDITIONS 301 | 302 | How to Apply These Terms to Your New Programs 303 | 304 | If you develop a new program, and you want it to be of the greatest 305 | possible use to the public, the best way to achieve this is to make it 306 | free software which everyone can redistribute and change under these terms. 307 | 308 | To do so, attach the following notices to the program. It is safest 309 | to attach them to the start of each source file to most effectively 310 | convey the exclusion of warranty; and each file should have at least 311 | the "copyright" line and a pointer to where the full notice is found. 312 | 313 | 314 | Copyright (C) 315 | 316 | This program is free software; you can redistribute it and/or modify 317 | it under the terms of the GNU General Public License as published by 318 | the Free Software Foundation; either version 2 of the License, or 319 | (at your option) any later version. 320 | 321 | This program is distributed in the hope that it will be useful, 322 | but WITHOUT ANY WARRANTY; without even the implied warranty of 323 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 324 | GNU General Public License for more details. 325 | 326 | You should have received a copy of the GNU General Public License along 327 | with this program; if not, write to the Free Software Foundation, Inc., 328 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 329 | 330 | Also add information on how to contact you by electronic and paper mail. 331 | 332 | If the program is interactive, make it output a short notice like this 333 | when it starts in an interactive mode: 334 | 335 | Gnomovision version 69, Copyright (C) year name of author 336 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 337 | This is free software, and you are welcome to redistribute it 338 | under certain conditions; type `show c' for details. 339 | 340 | The hypothetical commands `show w' and `show c' should show the appropriate 341 | parts of the General Public License. Of course, the commands you use may 342 | be called something other than `show w' and `show c'; they could even be 343 | mouse-clicks or menu items--whatever suits your program. 344 | 345 | You should also get your employer (if you work as a programmer) or your 346 | school, if any, to sign a "copyright disclaimer" for the program, if 347 | necessary. Here is a sample; alter the names: 348 | 349 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 350 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 351 | 352 | , 1 April 1989 353 | Ty Coon, President of Vice 354 | 355 | This General Public License does not permit incorporating your program into 356 | proprietary programs. If your program is a subroutine library, you may 357 | consider it more useful to permit linking proprietary applications with the 358 | library. If this is what you want to do, use the GNU Lesser General 359 | Public License instead of this License. 360 | 361 | WRITTEN OFFER 362 | 363 | The source code for any program binaries or compressed scripts that are 364 | included with the WSU Student Financial Services Theme can be freely obtained 365 | at the following URL: 366 | 367 | https://github.com/washingtonstateuniversity/finaid.wsu.edu/ 368 | -------------------------------------------------------------------------------- /includes/cost-tables.php: -------------------------------------------------------------------------------- 1 | 'Session', 27 | 'plural' => 'Sessions', 28 | 'description' => '', 29 | 'slug' => 'session', 30 | ), 31 | array( 32 | 'singular' => 'Campus', 33 | 'plural' => 'Campuses', 34 | 'description' => '', 35 | 'slug' => 'campus', 36 | ), 37 | array( 38 | 'singular' => 'Career Path', 39 | 'plural' => 'Career Paths', 40 | 'description' => '', 41 | 'slug' => 'career-path', 42 | ), 43 | ); 44 | } 45 | 46 | add_action( 'init', 'WSU\Financial_Aid\Cost_Tables\register_post_type' ); 47 | add_filter( 'pll_get_post_types', 'WSU\Financial_Aid\Cost_Tables\add_to_pll', 10, 2 ); 48 | add_action( 'add_meta_boxes_' . post_type_slug(), 'WSU\Financial_Aid\Cost_Tables\add_meta_boxes' ); 49 | add_action( 'edit_form_after_title', 'WSU\Financial_Aid\Cost_Tables\edit_form_after_title' ); 50 | add_action( 'admin_enqueue_scripts', 'WSU\Financial_Aid\Cost_Tables\admin_enqueue_scripts' ); 51 | add_action( 'save_post_' . post_type_slug(), 'WSU\Financial_Aid\Cost_Tables\save_post', 10, 2 ); 52 | 53 | add_action( 'init', 'WSU\Financial_Aid\Cost_Tables\register_taxonomies' ); 54 | add_action( 'init', 'WSU\Financial_Aid\Cost_Tables\register_meta', 25 ); 55 | foreach ( taxonomies() as $taxonomy ) { 56 | if ( 'campus' === $taxonomy['slug'] ) { 57 | continue; 58 | } 59 | 60 | add_action( "{$taxonomy['slug']}_edit_form_fields", 'WSU\Financial_Aid\Cost_Tables\edit_term_meta_fields', 10 ); 61 | add_action( "edit_{$taxonomy['slug']}", 'WSU\Financial_Aid\Cost_Tables\save_term_fields' ); 62 | } 63 | add_filter( 'wsuwp_taxonomy_metabox_post_types', 'WSU\Financial_Aid\Cost_Tables\taxonomy_meta_box' ); 64 | 65 | add_shortcode( 'sfs_cost_tables', 'WSU\Financial_Aid\Cost_Tables\display_sfs_cost_tables' ); 66 | add_action( 'wp_ajax_nopriv_cost_tables', 'WSU\Financial_Aid\Cost_Tables\ajax_callback' ); 67 | add_action( 'wp_ajax_cost_tables', 'WSU\Financial_Aid\Cost_Tables\ajax_callback' ); 68 | 69 | add_shortcode( 'sfs_cost_table', 'WSU\Financial_Aid\Cost_Tables\display_sfs_cost_table' ); 70 | 71 | /** 72 | * Registers a post type for tracking cost of attendance data. 73 | * 74 | * @since 0.1.0 75 | */ 76 | function register_post_type() { 77 | $args = array( 78 | 'labels' => array( 79 | 'name' => 'Cost Tables', 80 | 'singular_name' => 'Cost Table', 81 | 'all_items' => 'All Cost Tables', 82 | 'view_item' => 'View Cost Table', 83 | 'add_new_item' => 'Add New Cost Table', 84 | 'edit_item' => 'Edit Cost Table', 85 | 'update_item' => 'Update Cost Table', 86 | 'search_items' => 'Search Cost Tables', 87 | 'not_found' => 'No Cost Tables found', 88 | 'not_found_in_trash' => 'No Cost Tables found in Trash', 89 | ), 90 | 'description' => 'Cost of attendance breakdowns.', 91 | 'public' => false, 92 | 'show_ui' => true, 93 | 'menu_position' => 7, 94 | 'menu_icon' => 'dashicons-clipboard', 95 | 'supports' => array( 96 | 'title', 97 | ), 98 | ); 99 | 100 | \register_post_type( post_type_slug(), $args ); 101 | } 102 | 103 | /** 104 | * Adds Polylang support to the Cost Tables post type. 105 | * 106 | * @since 0.1.0 107 | * 108 | * @param array $post_types Post types with Polylang support. 109 | * 110 | * @return array 111 | */ 112 | function add_to_pll( $post_types ) { 113 | $post_types[ post_type_slug() ] = post_type_slug(); 114 | 115 | return $post_types; 116 | } 117 | 118 | /** 119 | * Adds the metaboxes used to capture attendance cost data. 120 | * 121 | * @since 0.1.0 122 | */ 123 | function add_meta_boxes() { 124 | add_meta_box( 125 | 'cost-table-meta', 126 | 'Attendance Cost Details', 127 | 'WSU\Financial_Aid\Cost_Tables\display_cost_meta_box', 128 | post_type_slug(), 129 | 'normal', 130 | 'high' 131 | ); 132 | } 133 | 134 | /** 135 | * Displays the metabox used to capture attendance cost data. 136 | * 137 | * @since 0.1.0 138 | * 139 | * @param WP_Post $post Object for the post currently being edited. 140 | */ 141 | function display_cost_meta_box( $post ) { 142 | wp_nonce_field( 'save-cost-table-meta', '_cost_table_meta_nonce' ); 143 | 144 | $data = get_post_meta( $post->ID, '_cost_table_data', true ); 145 | ?> 146 | 147 | 148 | 149 | 150 | 151 | $cells ) { ?> 152 | 153 | 155 | 156 | 157 | $cell ) { ?> 158 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 170 | 171 | $cell ) { ?> 172 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 187 | 190 | 191 | 192 | 195 | 198 | 201 | 202 | 203 | 204 | 205 |
    159 | 160 |
    168 | 169 | 173 | 174 |
    185 | 186 | 188 | 189 |
    193 | 194 | 196 | 197 | 199 | 200 |
    206 | 207 | 208 | 209 | post_type ) { 221 | return; 222 | } 223 | 224 | if ( 'publish' !== $post->post_status ) { 225 | return; 226 | } 227 | 228 | ?> 229 |

    Use [sfs_cost_table id="ID ); ?>"] to embed this table in a page or post.

    230 | id !== post_type_slug() ) { 242 | return; 243 | } 244 | 245 | wp_enqueue_style( 'cost-tables', get_stylesheet_directory_uri() . '/admin-css/cost-tables.css', array(), null ); // @codingStandardsIgnoreLine 246 | wp_enqueue_script( 'cost-tables', get_stylesheet_directory_uri() . '/js/admin-cost-tables.min.js', array( 'jquery' ), null, true ); // @codingStandardsIgnoreLine 247 | } 248 | 249 | /** 250 | * Saves the cost of attendance data. 251 | * 252 | * @since 0.1.0 253 | * 254 | * @param int $post_id ID of the post being saved. 255 | * @param WP_Post $post Post object of the post being saved. 256 | */ 257 | function save_post( $post_id, $post ) { 258 | if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { 259 | return; 260 | } 261 | 262 | if ( 'auto-draft' === $post->post_status ) { 263 | return; 264 | } 265 | 266 | if ( ! isset( $_POST['_cost_table_meta_nonce'] ) || ! wp_verify_nonce( $_POST['_cost_table_meta_nonce'], 'save-cost-table-meta' ) ) { 267 | return; 268 | } 269 | 270 | $sanitized_data = array(); 271 | $rendered_table = ''; 272 | 273 | if ( isset( $_POST['_cost_table_data'] ) && '' !== $_POST['_cost_table_data'] ) { 274 | foreach ( $_POST['_cost_table_data'] as $row => $cells ) { 275 | foreach ( $cells as $index => $cell ) { 276 | $sanitized_data[ $row ][] = wp_kses_post( $cell ); 277 | } 278 | } 279 | 280 | update_post_meta( $post_id, '_cost_table_data', $sanitized_data ); 281 | } else { 282 | delete_post_meta( $post_id, '_cost_table_data' ); 283 | } 284 | 285 | // Render a table from the sanitized data and save as the post content. 286 | if ( ! empty( $sanitized_data ) ) { 287 | $rendered_table = ''; 288 | 289 | foreach ( $sanitized_data as $row => $cells ) { 290 | $rendered_table .= ''; 291 | 292 | foreach ( $cells as $index => $cell ) { 293 | $rendered_table .= ( 0 === $row ) ? ''; 296 | } 297 | 298 | $rendered_table .= ''; 299 | } 300 | 301 | $rendered_table .= '
    ' : ''; 294 | $rendered_table .= $cell; 295 | $rendered_table .= ( 0 === $row ) ? '' : '
    '; 302 | } 303 | 304 | // Unhook this function to prevent an infinite loop. 305 | remove_action( 'save_post_' . post_type_slug(), 'WSU\Financial_Aid\Cost_Tables\save_post', 10 ); 306 | 307 | wp_update_post( array( 308 | 'ID' => $post_id, 309 | 'post_content' => $rendered_table, 310 | ) ); 311 | 312 | // Rehook this function. 313 | add_action( 'save_post_' . post_type_slug(), 'WSU\Financial_Aid\Cost_Tables\save_post', 10 ); 314 | } 315 | 316 | /** 317 | * Registers taxonomies attached to the Cost Tables post type. 318 | * 319 | * @since 0.1.0 320 | */ 321 | function register_taxonomies() { 322 | foreach ( taxonomies() as $taxonomy ) { 323 | $args = array( 324 | 'labels' => array( 325 | 'name' => $taxonomy['plural'], 326 | 'singular_name' => $taxonomy['singular'], 327 | 'all_items' => 'All ' . $taxonomy['plural'], 328 | 'edit_item' => 'Edit ' . $taxonomy['singular'], 329 | 'view_item' => 'View ' . $taxonomy['singular'], 330 | 'update_item' => 'Update ' . $taxonomy['singular'], 331 | 'add_new_item' => 'Add New ' . $taxonomy['singular'], 332 | 'new_item_name' => 'New ' . $taxonomy['singular'] . ' Name', 333 | 'search_items' => 'Search ' . $taxonomy['plural'], 334 | 'popular_items' => 'Popular ' . $taxonomy['plural'], 335 | 'separate_items_with_commas' => 'Separate ' . $taxonomy['plural'] . ' with commas', 336 | 'add_or_remove_items' => 'Add or remove ' . $taxonomy['plural'], 337 | 'choose_from_most_used' => 'Choose from the most used ' . $taxonomy['plural'], 338 | 'not_found' => 'No ' . $taxonomy['plural'] . ' found', 339 | ), 340 | 'description' => $taxonomy['description'], 341 | 'public' => true, 342 | 'hierarchical' => false, 343 | 'show_admin_column' => true, 344 | ); 345 | 346 | register_taxonomy( $taxonomy['slug'], post_type_slug(), $args ); 347 | } 348 | } 349 | 350 | /** 351 | * Registers taxonomies attached to the Cost Tables post type. 352 | * 353 | * @since 0.1.0 354 | */ 355 | function term_meta_keys() { 356 | if ( function_exists( 'pll_languages_list' ) ) { 357 | $meta_keys = array(); 358 | $languages = pll_languages_list(); 359 | 360 | foreach ( $languages as $language ) { 361 | if ( 'en' === $language ) { 362 | continue; 363 | } 364 | 365 | $term = get_term_by( 'slug', $language, 'language' ); 366 | 367 | $meta_keys[ "_$language-name" ] = array( 368 | 'description' => $term->name . ' Name', 369 | 'type' => 'string', 370 | 'sanitize_callback' => 'sanitize_text_field', 371 | 'single' => true, 372 | ); 373 | } 374 | 375 | return $meta_keys; 376 | } 377 | 378 | return array(); 379 | } 380 | 381 | /** 382 | * Registers the meta keys used with terms for capturing language names. 383 | * 384 | * @since 0.1.0 385 | */ 386 | function register_meta() { 387 | if ( ! empty( term_meta_keys() ) ) { 388 | foreach ( term_meta_keys() as $key => $args ) { 389 | \register_meta( 'term', $key, $args ); 390 | } 391 | } 392 | } 393 | 394 | /** 395 | * Captures language meta assigned to a term. 396 | * 397 | * @since 0.1.0 398 | * 399 | * @param WP_Term $term 400 | */ 401 | function edit_term_meta_fields( $term ) { 402 | $term_meta = get_registered_metadata( 'term', $term->term_id ); 403 | 404 | foreach ( term_meta_keys() as $key => $meta ) { 405 | ?> 406 | 407 | 408 | 409 | 410 | 411 | 415 | 416 | 417 | current_action() ) { 432 | return; 433 | } 434 | 435 | // Reuse the default nonce that is checked in `edit-tags.php`. 436 | check_admin_referer( 'update-tag_' . $term_id ); 437 | 438 | $keys = get_registered_meta_keys( 'term' ); 439 | 440 | foreach ( term_meta_keys() as $key => $meta ) { 441 | if ( isset( $_POST[ $key ] ) && isset( $keys[ $key ] ) && isset( $keys[ $key ]['sanitize_callback'] ) ) { 442 | // Each piece of meta is registered with sanitization. 443 | update_term_meta( $term_id, $key, $_POST[ $key ] ); 444 | } 445 | } 446 | } 447 | 448 | /** 449 | * Displays a meta box with the Select2 interface provided by the University Taxonomy plugin. 450 | * 451 | * @since 0.1.0 452 | * 453 | * @param array $post_types Post types and their associated taxonomies. 454 | */ 455 | function taxonomy_meta_box( $post_types ) { 456 | $post_types[ post_type_slug() ] = array_column( taxonomies(), 'slug' ); 457 | 458 | return $post_types; 459 | } 460 | 461 | /** 462 | * Retrieves a cost table and the associated options. 463 | * 464 | * @since 0.1.0 465 | * 466 | * @param string $language The current page language, provided as a term slug. 467 | * @param string $session The provided session slug. 468 | * @param string $campus The provided campus slug. 469 | * @param string $career The provided career slug. 470 | * 471 | * @return array 472 | */ 473 | function cost_table_query( $language, $session, $campus, $career ) { 474 | if ( ! $language || ! $session || ! $campus || ! $career ) { 475 | return; 476 | } 477 | 478 | // Set up the array of data to fill in and return. 479 | $data = array( 480 | 'table' => false, 481 | 'campuses' => array(), 482 | 'careers' => array(), 483 | ); 484 | 485 | // Find all tables for the given language and session. 486 | $posts = get_posts( array( 487 | 'post_type' => post_type_slug(), 488 | 'posts_per_page' => 60, 489 | 'lang' => $language, 490 | 'tax_query' => array( 491 | array( 492 | 'taxonomy' => 'session', 493 | 'field' => 'slug', 494 | 'terms' => $session, 495 | ), 496 | ), 497 | ) ); 498 | 499 | if ( ! $posts ) { 500 | return $data; 501 | } 502 | 503 | foreach ( $posts as $post ) { 504 | // Build the array of campus options offered during the given session. 505 | $campuses = get_the_terms( $post->ID, 'campus' ); 506 | 507 | if ( $campuses && ! is_wp_error( $campuses ) ) { 508 | foreach ( $campuses as $term ) { 509 | if ( ! in_array( $term->slug, $data['campuses'], true ) ) { 510 | $data['campuses'][] = $term->slug; 511 | } 512 | } 513 | } 514 | 515 | // Narrow results down to tables for the given campus. 516 | if ( ! has_term( $campus, 'campus', $post->ID ) ) { 517 | continue; 518 | } 519 | 520 | // Build the array of career path options offered during the given session at the given campus. 521 | $careers = get_the_terms( $post->ID, 'career-path' ); 522 | 523 | if ( $careers && ! is_wp_error( $careers ) ) { 524 | foreach ( $careers as $term ) { 525 | if ( ! in_array( $term->slug, $data['campuses'], true ) ) { 526 | $data['careers'][] = $term->slug; 527 | } 528 | } 529 | } 530 | 531 | // Attempt to find a table that meets all the given critera. 532 | if ( has_term( $career, 'career-path', $post->ID ) ) { 533 | $data['table'] = wp_kses_post( $post->post_content ); 534 | } 535 | } 536 | 537 | return $data; 538 | } 539 | 540 | /** 541 | * Display a form for viewing cost of attendance tables. 542 | * 543 | * @since 0.1.0 544 | * 545 | * @param array $atts Shortcode attributes. 546 | * 547 | * @return string $html HTML output. 548 | */ 549 | function display_sfs_cost_tables( $atts ) { 550 | $defaults = array( 551 | 'default_session' => '', 552 | 'default_campus' => 'pullman', 553 | 'default_career' => 'undergraduate', 554 | 'language_code' => '', 555 | 'session_label' => 'Year/Session', 556 | 'campus_label' => 'Campus', 557 | 'career_label' => 'Career Path', 558 | ); 559 | 560 | $atts = shortcode_atts( $defaults, $atts ); 561 | 562 | // Bail if no default session was provided - we can't find an initial table without it. 563 | if ( ! $atts['default_session'] ) { 564 | return ''; 565 | } 566 | 567 | $default_session = sanitize_text_field( $atts['default_session'] ); 568 | $default_campus = sanitize_text_field( $atts['default_campus'] ); 569 | $default_career = sanitize_text_field( $atts['default_career'] ); 570 | 571 | if ( '' === $atts['language_code'] ) { 572 | $language_terms = get_the_terms( get_the_ID(), 'language' ); 573 | if ( $language_terms ) { 574 | $language = $language_terms[0]->slug; 575 | } else { 576 | $language = 'en'; 577 | } 578 | } else { 579 | $language = sanitize_text_field( $atts['language_code'] ); 580 | } 581 | 582 | wp_enqueue_script( 'sfs-cost-tables', get_stylesheet_directory_uri() . '/js/cost-tables.min.js', array( 'jquery' ), \WSU_Student_Financial_Services_Theme()->theme_version(), true ); 583 | 584 | wp_localize_script( 'sfs-cost-tables', 'cost_tables', array( 585 | 'ajax_url' => admin_url( 'admin-ajax.php' ), 586 | 'nonce' => wp_create_nonce( 'sfs-cost-tables' ), 587 | 'language' => $language, 588 | ) ); 589 | 590 | $cache_key = md5( get_the_modified_date( 'Y-m-d H:i:s', get_the_ID() ) . $language ); 591 | $cached_content = wp_cache_get( $cache_key, 'wsu_coa_tables' ); 592 | 593 | if ( $cached_content ) { 594 | return $cached_content; 595 | } 596 | 597 | $session_terms = get_terms( 'session' ); 598 | $campus_terms = get_terms( 'campus' ); 599 | $career_terms = get_terms( 'career-path' ); 600 | $data = cost_table_query( $language, $default_session, $default_campus, $default_career ); 601 | 602 | // Bail if no terms were found or no data was returned. 603 | if ( ! $session_terms || ! $campus_terms || ! $career_terms || ! $data ) { 604 | return ''; 605 | } 606 | 607 | ob_start(); 608 | ?> 609 |
    610 | 611 |
    612 |
    613 |
    614 | 632 |
    633 |
    634 | 635 |
    636 |
    637 |
    638 | 651 |
    652 |
    653 | 654 |
    655 |
    656 |
    657 | 680 |
    681 |
    682 | 683 |
    684 | 685 |
    686 | 687 |
    688 | 689 | name; 719 | $campus_name = $campus_term->name; 720 | $career_name = $career_term->name; 721 | 722 | if ( 'en' !== $language ) { 723 | $translated_session = get_term_meta( $session_term->term_id, "_$language-name", true ); 724 | $translated_career = get_term_meta( $career_term->term_id, "_$language-name", true ); 725 | 726 | if ( $translated_session ) { 727 | $session_name = $translated_session; 728 | } 729 | 730 | if ( $translated_career ) { 731 | $career_name = $translated_career; 732 | } 733 | } 734 | 735 | $notice = $career_name . ' is not offered at the ' . $campus_name . ' campus during the ' . $session_name . ' session.'; 736 | 737 | switch ( $_POST['updated'] ) { 738 | case 'session': 739 | $data['table'] = '

    ' . $notice . ' Please select another session, or check the Campus or Career Path drop-downs for other options offered during this session.

    '; 740 | break; 741 | case 'campus': 742 | $data['table'] = '

    ' . $notice . ' Please check the Career Path drop-down for other options offered at ' . $campus_name . ' during this session, or select another campus.

    '; 743 | break; 744 | case 'career': 745 | // Theoretically, no one should make it in here... 746 | $data['table'] = "

    We don't seem to have an estimate for the selected options. Please try another combination.

    "; 747 | break; 748 | } 749 | } 750 | 751 | echo wp_json_encode( $data ); 752 | 753 | exit(); 754 | } 755 | 756 | /** 757 | * Display a cost of attendance table. 758 | * 759 | * @since 0.1.2 760 | * 761 | * @param array $atts Shortcode attributes. 762 | * 763 | * @return string $html HTML output. 764 | */ 765 | function display_sfs_cost_table( $atts ) { 766 | $defaults = array( 767 | 'id' => '', 768 | ); 769 | 770 | $atts = shortcode_atts( $defaults, $atts ); 771 | 772 | // Bail if no id is provided. 773 | if ( ! $atts['id'] ) { 774 | return ''; 775 | } 776 | 777 | $table = get_post( absint( $atts['id'] ) ); 778 | 779 | // Bail if no table is found. 780 | if ( ! $table || 'cost-table' !== $table->post_type ) { 781 | return ''; 782 | } 783 | 784 | $html = '
    '; 785 | $html .= '
    ' . esc_html( $table->post_title ) . '
    '; 786 | $html .= wp_kses_post( $table->post_content ); 787 | $html .= '
    '; 788 | 789 | return $html; 790 | } 791 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | /* 2 | Theme Name: WSU Student Financial Services 3 | Theme URI: https://web.wsu.edu 4 | Description: A WSU child theme for Student Financial Services 5 | Author: WSU University Communications 6 | Author URI: https://web.wsu.edu 7 | Template: spine 8 | Version: 0.1.5 9 | */ 10 | 11 | .main-header { 12 | box-sizing: border-box; 13 | color: #fff; 14 | font-size: .85em; 15 | letter-spacing: 2px; 16 | height: 200px; 17 | position: relative; 18 | text-transform: uppercase; 19 | width: 100%; 20 | } 21 | 22 | .main-header { 23 | background: #981e32; 24 | background: linear-gradient(to right, #981e32 0%, #c60c30 100%); 25 | } 26 | 27 | .tagged-blue .main-header { 28 | background: #4f868e; 29 | background: linear-gradient(to right, #4f868e 0%, #00a5bd 100%); 30 | } 31 | 32 | .has-featured-image .main-header { 33 | background: none; 34 | float: left; 35 | height: 400px; 36 | text-shadow: 1px 1px 5px rgba(0, 0, 0, .35); 37 | } 38 | 39 | .main-header span, 40 | .main-header li { 41 | float: left; 42 | line-height: normal; 43 | padding: 0; 44 | } 45 | 46 | .site-header-group { 47 | float: left; 48 | font-size: .65rem; 49 | margin: 0 2rem; 50 | overflow: hidden; 51 | padding: 1rem 0; 52 | } 53 | 54 | .site-header-group span + span, 55 | .site-action-links li + li { 56 | border-left: 1px solid #fff; 57 | margin-left: 1em; 58 | padding-left: 1em; 59 | } 60 | 61 | .site-header-group .sup-header { 62 | font-weight: 600; 63 | } 64 | 65 | .site-header-group .sub-header { 66 | font-weight: 400; 67 | } 68 | 69 | .site-action-links { 70 | float: right; 71 | font-size: .65rem; 72 | padding: 1rem 2rem; 73 | } 74 | 75 | .site-action-links ul { 76 | padding: 0; 77 | } 78 | 79 | .page-header-group { 80 | bottom: 0; 81 | box-sizing: border-box; 82 | padding: 1rem 2rem 1.5rem; 83 | position: absolute; 84 | width: 100%; 85 | } 86 | 87 | .page-header-group .sup-header { 88 | color: #dcdcdc; 89 | font-size: 1.5em; 90 | font-weight: 400; 91 | letter-spacing: .15em; 92 | text-transform: uppercase; 93 | } 94 | 95 | .page-header-group .sub-header { 96 | clear: both; 97 | display: block; 98 | font-size: 2.5em; 99 | font-weight: 700; 100 | letter-spacing: .05em; 101 | line-height: 1; 102 | text-transform: uppercase; 103 | } 104 | 105 | .main-header a { 106 | border-bottom: none; 107 | color: #fff; 108 | } 109 | 110 | .main-header a:hover { 111 | border-bottom: none; 112 | background: none; 113 | } 114 | 115 | .featured-image { 116 | z-index: -1; 117 | } 118 | 119 | .home .main-header { 120 | background: none; 121 | height: auto; 122 | float: left; 123 | z-index: 2; 124 | } 125 | 126 | .home .site-header-group, 127 | .home .page-header-group { 128 | display: none; 129 | } 130 | 131 | .home .video { 132 | clear: none; 133 | } 134 | 135 | @media screen and (max-width: 791px) { 136 | 137 | .main-header { 138 | height: auto; 139 | } 140 | 141 | .site-header-group { 142 | border-bottom: 1px solid #fff; 143 | float: none; 144 | } 145 | 146 | .main-header li { 147 | float: none; 148 | text-align: right; 149 | } 150 | 151 | .site-action-links li + li { 152 | border-left: none; 153 | margin-left: 0; 154 | padding-left: 0; 155 | } 156 | 157 | .page-header-group { 158 | clear: both; 159 | position: relative; 160 | } 161 | 162 | .has-featured-image .page-header-group { 163 | position: absolute; 164 | } 165 | 166 | .page-header-group span { 167 | float: none; 168 | } 169 | } 170 | 171 | @media only screen and (max-width: 693px) { 172 | 173 | .site-header-group span { 174 | display: block; 175 | float: none; 176 | } 177 | 178 | .site-header-group span + span { 179 | border-left: none; 180 | margin-left: 0; 181 | padding-left: 0; 182 | } 183 | } 184 | 185 | @media only screen and (max-width: 530px) { 186 | 187 | .page-header-group .sub-header { 188 | font-size: 8.5vw; 189 | } 190 | } 191 | 192 | #spine #glue:before { 193 | border-right: solid 5px #f3f3f3; 194 | } 195 | 196 | body { 197 | background-color: #f3f3f3; 198 | color: #4e4e4e; 199 | } 200 | 201 | main { 202 | background-color: #fff; 203 | } 204 | 205 | .gray-lightly-back, 206 | .lightly-back { 207 | background-color: #f3f3f3; 208 | } 209 | 210 | hgroup.source { 211 | display: none; 212 | } 213 | 214 | .pad-top .column, 215 | .padded-top { 216 | padding-top: 3rem; 217 | } 218 | 219 | .pad-bottom .column, 220 | .padded-bottom { 221 | padding-bottom: 3rem; 222 | } 223 | 224 | .pad-ends .column, 225 | .padded-ends { 226 | padding-top: 3rem; 227 | padding-bottom: 3rem; 228 | } 229 | 230 | .row > header ~ .column { 231 | padding-top: 2rem; 232 | } 233 | 234 | section.row { 235 | border-bottom: 5px solid #f3f3f3; 236 | } 237 | 238 | section.row.no-bottom-border, 239 | main > .page > section.row:last-child, 240 | main > .page > :last-child section.row, 241 | .main-header + section.row, 242 | footer > section.row { 243 | border-bottom: none; 244 | } 245 | 246 | section.pad-top > header { 247 | padding-top: 3rem; 248 | } 249 | 250 | section.pad-bottom > header { 251 | padding-bottom: 0; 252 | } 253 | 254 | @media only screen and (min-width: 694px) { 255 | 256 | .fluid .row.side-right .column.one { 257 | padding-right: 1.3125rem; 258 | width: 66.66666%; 259 | } 260 | 261 | .fluid .row.side-right .column.two { 262 | padding-left: .625rem; 263 | width: 33.33333%; 264 | } 265 | 266 | .reverse.side-left.gutter .column.two:not(.gutterless) { 267 | padding-left: 2rem; 268 | padding-right: 1rem; 269 | } 270 | 271 | .reverse.side-left.gutter .column.one:not(.gutterless) { 272 | padding-left: 1rem; 273 | padding-right: 2rem; 274 | } 275 | } 276 | 277 | h1 { 278 | color: #981e32; 279 | font-size: 3em; 280 | font-weight: 800; 281 | margin-bottom: 5px; 282 | text-transform: uppercase; 283 | } 284 | 285 | h2 { 286 | color: #981e32; 287 | font-size: 2.5em; 288 | font-weight: 300; 289 | margin-top: 1.5rem; 290 | padding-bottom: 25px; 291 | } 292 | 293 | h3, 294 | h4 { 295 | color: #393939; 296 | margin-top: 1.25rem; 297 | } 298 | 299 | h3 { 300 | font-size: 1.75em; 301 | font-weight: 400; 302 | padding-bottom: 20px; 303 | } 304 | 305 | h4 { 306 | font-size: 1.25em; 307 | font-weight: 700; 308 | text-transform: uppercase; 309 | } 310 | 311 | h5 { 312 | color: #981e32; 313 | font-size: .7rem; 314 | font-weight: 700; 315 | line-height: 15px; 316 | padding-bottom: 20px; 317 | } 318 | 319 | .white-text h1, 320 | .white-text h2, 321 | .white-text h3, 322 | .white-text h4, 323 | .white-text h5, 324 | .white-text a { 325 | color: #fff; 326 | } 327 | 328 | section > header > h1, 329 | section > header > h2, 330 | section > header > h3, 331 | section > header > h4 { 332 | padding: 0; 333 | } 334 | 335 | p, 336 | main section li { 337 | font-size: 1rem; 338 | font-weight: 300; 339 | line-height: 1.5; 340 | } 341 | 342 | p, 343 | p ~ p { 344 | line-height: 1.65rem; 345 | padding-bottom: 1.75rem; 346 | } 347 | 348 | .false-header { 349 | font-size: 1.4em; 350 | font-weight: 300; 351 | letter-spacing: 1px; 352 | padding-bottom: 0; 353 | text-transform: uppercase; 354 | } 355 | 356 | p.false-header + h2 { 357 | margin-top: 0; 358 | } 359 | 360 | .landing h2 { 361 | font-size: 3.5em; 362 | font-weight: 700; 363 | padding-top: 0; 364 | text-transform: uppercase; 365 | } 366 | 367 | .intro { 368 | font-size: 1.25rem; 369 | line-height: 1.5em; 370 | color: #4e4e4e; 371 | } 372 | 373 | main a { 374 | border-bottom: 1px solid #b7b7b7; 375 | text-decoration: none; 376 | transition: all .4s ease; 377 | } 378 | 379 | main a:hover { 380 | background-color: #efefef; 381 | border-bottom: 1px solid #981e32; 382 | color: #981e32; 383 | text-decoration: none; 384 | } 385 | 386 | main ul { 387 | list-style-type: square; 388 | } 389 | 390 | @media screen and (max-width: 693px) { 391 | 392 | .landing h2 { 393 | font-size: 9vw; 394 | } 395 | } 396 | 397 | /* Custom section and column backgrounds */ 398 | .section-wrapper-has-background, 399 | .column { 400 | background-position: center; 401 | background-size: cover; 402 | } 403 | 404 | .left-center-bg { 405 | background-position: left center; 406 | background-repeat: no-repeat; 407 | } 408 | 409 | .right-center-bg { 410 | background-position: right center; 411 | background-repeat: no-repeat; 412 | } 413 | 414 | .transparent-gray-back { 415 | background: rgba(113, 113, 113, .75); 416 | } 417 | 418 | .transparent-gray-light-back { 419 | background: rgba(141, 149, 154, .75); 420 | } 421 | 422 | .transparent-gray-lighter-back { 423 | background: rgba(181, 186, 190, .75); 424 | } 425 | 426 | .transparent-gray-lightly-back { 427 | background: rgba(215, 218, 219, .75); 428 | } 429 | 430 | .transparent-gray-lightest-back { 431 | background: rgba(239, 240, 241, .85); 432 | } 433 | 434 | .transparent-crimson-back { 435 | background: rgba(152, 30, 50, .9); 436 | } 437 | 438 | .transparent-white-back { 439 | background: rgba(255, 255, 255, .85); 440 | } 441 | 442 | .transparent-black-back { 443 | background: rgba(0, 0, 0, .75); 444 | } 445 | 446 | /* Buttons */ 447 | .cta-button { 448 | background: none; 449 | border: 1px solid #981e32; 450 | color: #981e32; 451 | display: inline-block; 452 | font-weight: 700; 453 | letter-spacing: 1px; 454 | line-height: normal; 455 | margin-top: 1em; 456 | padding: .5em 2em; 457 | text-transform: uppercase; 458 | transition: background .4s, color .4s; 459 | } 460 | 461 | .cta-button:hover { 462 | background: #981e32; 463 | color: #fff; 464 | } 465 | 466 | .white-text .cta-button, 467 | .cta-button.white { 468 | border: 1px solid #fff; 469 | color: #fff; 470 | transition: background .4s, border-color .4s, color .4s; 471 | } 472 | 473 | .white-text .cta-button:hover, 474 | .cta-button.white:hover { 475 | background: #b5babe; 476 | border-color: #b5babe; 477 | } 478 | 479 | .body-cta { 480 | border: 1px solid #b7b7b7; 481 | display: inline-block; 482 | font-size: .9em; 483 | font-weight: 700; 484 | letter-spacing: 1px; 485 | margin: .5rem 0 2rem; 486 | padding: .25em 1em; 487 | text-transform: uppercase; 488 | transition: background .4s; 489 | } 490 | 491 | .body-cta + .body-cta { 492 | margin-bottom: .25rem; 493 | } 494 | 495 | .body-cta + br + .body-cta { 496 | margin-top: -1rem; 497 | } 498 | 499 | .body-cta:hover { 500 | background-color: #efefef; 501 | border-bottom: solid 1px #b7b7b7; 502 | } 503 | 504 | .white-text .body-cta { 505 | color: #fff; 506 | } 507 | 508 | .white-text .body-cta { 509 | border: 2px solid #fff; 510 | } 511 | 512 | .center { 513 | text-align: center; 514 | } 515 | 516 | /* Accordion */ 517 | .js-accordion h3 { 518 | border-top: solid 1px #f3f3f3; 519 | cursor: pointer; 520 | font-size: 1.25rem; 521 | font-weight: 300; 522 | padding: 1rem 3.5rem .5rem 1rem; 523 | position: relative; 524 | } 525 | 526 | .js-accordion h3:hover, 527 | .js-accordion h3:active { 528 | color: #981e32; 529 | } 530 | 531 | .js-accordion h3:after { 532 | content: "+"; 533 | font-weight: 400; 534 | position: absolute; 535 | right: 1.5rem; 536 | top: 1rem; 537 | transition: transform .4s; 538 | } 539 | 540 | .js-accordion h3[aria-expanded="true"]:after { 541 | -ms-transform: rotate(45deg); 542 | transform: rotate(45deg); 543 | } 544 | 545 | .js-accordion h3 + div { 546 | padding: .5em 0 0 1.25em; 547 | } 548 | 549 | /* Loading animation */ 550 | 551 | @keyframes spin { 552 | 553 | 0% { 554 | transform: rotate(0deg); 555 | } 556 | 557 | 100% { 558 | transform: rotate(360deg); 559 | } 560 | } 561 | 562 | .sfs-loading-indicator { 563 | animation: spin 1s infinite linear; 564 | border: .25rem solid rgba(113, 113, 113, .5); 565 | border-radius: 50%; 566 | border-top-color: #981e32; 567 | height: 2rem; 568 | margin: 0 auto; 569 | width: 2rem; 570 | } 571 | 572 | /* Miscellaneous */ 573 | a#fafsa { 574 | margin-top: -100px; 575 | position: absolute; 576 | } 577 | 578 | .convert-toc-to-select #toc ul { 579 | display: none; 580 | } 581 | 582 | .centered { 583 | max-width: 900px; 584 | margin: 0 auto; 585 | } 586 | 587 | .centered h2, 588 | .centered .false-header { 589 | text-align: center; 590 | } 591 | 592 | .college { 593 | font-weight: 400; 594 | text-transform: none; 595 | padding-bottom: .5em; 596 | } 597 | 598 | @media only screen and (min-width: 694px) { 599 | 600 | .equal-height-columns { 601 | display: -ms-flexbox; 602 | display: flex; 603 | } 604 | } 605 | 606 | .flex-form { 607 | display: -ms-flexbox; 608 | display: flex; 609 | -ms-flex-wrap: wrap; 610 | flex-wrap: wrap; 611 | } 612 | 613 | main input[type], 614 | main input[type]:hover, 615 | main input[type]:focus, 616 | main select, 617 | main textarea { 618 | border-radius: 0; 619 | border: 1px solid #b7b7b7; 620 | box-shadow: none; 621 | color: #717171; 622 | font-family: inherit; 623 | font-size: 12px; 624 | font-weight: 400; 625 | letter-spacing: 1px; 626 | padding: 9px; 627 | -webkit-appearance: none; 628 | -moz-appearance: none; 629 | } 630 | 631 | main input[type]:focus, 632 | main select:focus, 633 | main textarea:focus { 634 | border-color: #981e32; 635 | } 636 | 637 | main input[type], 638 | main textarea { 639 | margin: .25rem; 640 | } 641 | 642 | main input[maxlength] { 643 | width: 4.5rem; 644 | } 645 | 646 | main input[type="checkbox"], 647 | main input[type="checkbox"]:hover, 648 | main input[type="checkbox"]:focus, 649 | main input[type="radio"], 650 | main input[type="radio"]:hover, 651 | main input[type="radio"]:focus { 652 | border: none; 653 | padding: 0; 654 | width: auto; 655 | } 656 | 657 | main input[type="checkbox"], 658 | main input[type="checkbox"]:hover, 659 | main input[type="checkbox"]:focus { 660 | -webkit-appearance: checkbox; 661 | -moz-appearance: checkbox; 662 | } 663 | 664 | main input[type="radio"], 665 | main input[type="radio"]:hover, 666 | main input[type="radio"]:focus { 667 | -webkit-appearance: radio; 668 | -moz-appearance: radio; 669 | } 670 | 671 | .select-wrap, 672 | .ginput_container_select { 673 | background: #fff; 674 | display: inline-block; 675 | margin: .25rem; 676 | position: relative; 677 | } 678 | 679 | .select-wrap:before, 680 | .select-wrap:after, 681 | .ginput_container_select:before, 682 | .ginput_container_select:after { 683 | border: solid transparent; 684 | border-width: 8px 5px; 685 | box-sizing: border-box; 686 | content: ""; 687 | height: 16px; 688 | position: absolute; 689 | right: 8px; 690 | } 691 | 692 | .select-wrap:before, 693 | .ginput_container_select:before { 694 | border-bottom-color: #b7b7b7; 695 | top: 0; 696 | } 697 | 698 | .select-wrap:after, 699 | .ginput_container_select:after { 700 | border-top-color: #b7b7b7; 701 | bottom: 0; 702 | } 703 | 704 | .select-wrap select, 705 | .ginput_container_select select { 706 | background: none; 707 | cursor: pointer; 708 | margin: 0; 709 | padding-right: 21px; 710 | position: relative; 711 | z-index: 1; 712 | } 713 | 714 | main textarea { 715 | height: 100px; 716 | text-transform: none; 717 | } 718 | 719 | main input[type="submit"] { 720 | background: #64bf17; 721 | border-color: #64bf17; 722 | color: #fff; 723 | min-width: 4.5rem; 724 | padding: 9px 18px; 725 | transition: background .4s, border-color .4s; 726 | vertical-align: baseline; 727 | } 728 | 729 | main input[type="submit"]:hover, 730 | main input[type="submit"]:focus { 731 | background: #488812; 732 | border-color: #488812; 733 | color: #fff; 734 | padding: 9px 18px; 735 | } 736 | 737 | main ::-webkit-input-placeholder { 738 | color: #717171; 739 | opacity: 1; 740 | } 741 | 742 | main :-moz-placeholder { 743 | color: #717171; 744 | } 745 | 746 | main ::-moz-placeholder { 747 | color: #717171; 748 | } 749 | 750 | main :-ms-input-placeholder { 751 | color: #717171; 752 | } 753 | 754 | /* Gravity Forms */ 755 | .gform_wrapper { 756 | overflow-x: visible; 757 | } 758 | 759 | .gform_fields { 760 | list-style: none; 761 | padding: 0; 762 | } 763 | 764 | .gform_fields li { 765 | padding: 0 0 1.75rem; 766 | } 767 | 768 | .gfield_description { 769 | font-size: 12px; 770 | font-style: italic; 771 | margin-left: .25rem; 772 | } 773 | 774 | .gf_name_has_2:after { 775 | clear: both; 776 | content: ""; 777 | display: table; 778 | } 779 | 780 | .gf_name_has_2 span { 781 | float: left; 782 | width: 50%; 783 | } 784 | 785 | .gf_name_has_2 input { 786 | width: calc(100% - .5rem); 787 | } 788 | 789 | .gfield_required { 790 | color: #981e32; 791 | margin-left: 5px; 792 | } 793 | 794 | .hide-label label, 795 | .hide-sub-labels span label { 796 | clip: rect(1px, 1px, 1px, 1px); 797 | height: 1px; 798 | margin: 0; 799 | overflow: hidden; 800 | padding: 0; 801 | position: absolute; 802 | width: 1px; 803 | word-wrap: normal; 804 | } 805 | 806 | .gform_validation_container { 807 | display: none; 808 | } 809 | 810 | main select::-ms-expand { 811 | display: none; 812 | } 813 | 814 | .site-footer { 815 | background: linear-gradient(to right, #f3f3f3 0%, #efefef 100%); 816 | margin-top: 2rem; 817 | position: relative; 818 | } 819 | 820 | .give-link { 821 | background: #981e32; 822 | border: none; 823 | border-radius: 30px 0 0 30px; 824 | color: #fff; 825 | font-style: italic; 826 | font-size: 1.7rem; 827 | font-weight: 300; 828 | line-height: 1; 829 | padding: .8rem 0 .8rem 80px; 830 | position: absolute; 831 | right: 0; 832 | text-transform: uppercase; 833 | top: 0; 834 | width: 30%; 835 | } 836 | 837 | .give-link:hover { 838 | background: #981e32; 839 | border: none; 840 | color: #fff; 841 | } 842 | 843 | .give-link svg { 844 | width: 36px; 845 | top: 9px; 846 | position: absolute; 847 | left: 26px; 848 | } 849 | 850 | .site-footer ul { 851 | list-style: none; 852 | padding: 0; 853 | } 854 | 855 | .site-footer .one > ul > li, 856 | .site-footer-menu > li { 857 | box-sizing: border-box; 858 | float: left; 859 | padding: 0 .5rem; 860 | width: 25%; 861 | } 862 | 863 | .site-footer .one > ul > li > a, 864 | .site-footer-menu > li > a { 865 | border-bottom: none; 866 | color: #393939; 867 | display: block; 868 | font-size: 1em; 869 | font-weight: 700; 870 | letter-spacing: .5px; 871 | line-height: 1; 872 | padding-bottom: .5rem; 873 | pointer-events: none; 874 | text-transform: uppercase; 875 | } 876 | 877 | .site-footer .one ul li, 878 | .site-footer-menu ul li { 879 | padding: 0 0 .6rem; 880 | } 881 | 882 | @media screen and (max-width: 791px) { 883 | 884 | .site-footer { 885 | display: none; 886 | } 887 | } 888 | 889 | .crimson-top { 890 | border-top: 5px solid #981e32; 891 | } 892 | 893 | /* Video/intro section */ 894 | section.video { 895 | padding-bottom: 3rem; 896 | position: relative; 897 | z-index: 1; 898 | } 899 | 900 | .column.video { 901 | position: static; 902 | } 903 | 904 | .video-container { 905 | height: 100%; 906 | left: 0; 907 | mix-blend-mode: multiply; 908 | overflow: hidden; 909 | position: absolute; 910 | top: 0; 911 | width: 100%; 912 | z-index: -1; 913 | display: -ms-flexbox; 914 | display: flex; 915 | -ms-flex-pack: center; 916 | justify-content: center; 917 | } 918 | 919 | .video-container video { 920 | min-height: 100%; 921 | width: auto; 922 | } 923 | 924 | .video-container:after { 925 | background: rgba(0, 0, 0, .1); 926 | content: ""; 927 | height: 100%; 928 | position: absolute; 929 | width: 100%; 930 | } 931 | 932 | .multiply .transparent-crimson-back { 933 | background: none; 934 | } 935 | 936 | .no-mix-blend-mode .multiply .transparent-crimson-back { 937 | background: rgba(152, 30, 50, .9); 938 | } 939 | 940 | .multiply .transparent-crimson-back:before { 941 | background: #940606; 942 | content: ""; 943 | position: absolute; 944 | width: 100%; 945 | height: 100%; 946 | left: 0; 947 | top: 0; 948 | z-index: -2; 949 | } 950 | 951 | .false-header1 { 952 | border-bottom: solid 2px #981e32; 953 | color: #fff; 954 | font-size: 1.2em; 955 | font-weight: 800; 956 | letter-spacing: 1px; 957 | margin-bottom: 2.5em; 958 | padding-bottom: .5em; 959 | text-transform: uppercase; 960 | } 961 | 962 | .help { 963 | color: #fff; 964 | font-size: 4em; 965 | font-weight: 800; 966 | margin-bottom: 5px; 967 | } 968 | 969 | .five-steps { 970 | counter-reset: count-it; 971 | list-style: none; 972 | padding: 0 0 2.5rem; 973 | } 974 | 975 | .five-steps li { 976 | padding: 0; 977 | } 978 | 979 | .five-steps a, 980 | .five-steps a:hover { 981 | border-bottom: 1px solid #717171; 982 | color: #fff; 983 | display: block; 984 | font-size: 1.1em; 985 | font-weight: 400; 986 | margin-left: 4.5rem; 987 | padding: .5em 0; 988 | position: relative; 989 | transition: color .4s, padding .4s; 990 | } 991 | 992 | .five-steps a:before { 993 | -ms-flex-align: center; 994 | align-items: center; 995 | background: #b5babe; 996 | color: #fff; 997 | content: counter(count-it); 998 | counter-increment: count-it; 999 | display: -ms-flexbox; 1000 | display: flex; 1001 | height: calc(100% - .2em); 1002 | -ms-flex-pack: center; 1003 | justify-content: center; 1004 | left: -4.5rem; 1005 | position: absolute; 1006 | text-align: center; 1007 | top: .2em; 1008 | transition: background .4s, color .4s; 1009 | width: 2.5rem; 1010 | } 1011 | 1012 | .five-steps a:hover { 1013 | background: none; 1014 | padding-left: .75em; 1015 | } 1016 | 1017 | .five-steps a:hover:before { 1018 | background: #fff; 1019 | color: #981e32; 1020 | } 1021 | 1022 | /* Announcements and quicklinks */ 1023 | .home .wsuwp-content-syndicate-list { 1024 | list-style-type: none; 1025 | } 1026 | 1027 | .home .wsuwp-content-syndicate-item { 1028 | margin-bottom: 1em; 1029 | } 1030 | 1031 | .home .wsuwp-content-syndicate-item a, 1032 | .home-calendar .wsuwp-content-syndicate-event a { 1033 | text-decoration: none; 1034 | color: #393939; 1035 | border-bottom: none; 1036 | } 1037 | 1038 | .home .wsuwp-content-syndicate-item a .read-more, 1039 | .home-calendar .wsuwp-content-syndicate-event a .read-more { 1040 | font-size: .75em; 1041 | font-weight: 700; 1042 | color: #981e32; 1043 | } 1044 | 1045 | .home .wsuwp-content-syndicate-item a:hover { 1046 | color: #981e32; 1047 | border-bottom: solid 1px #981e32; 1048 | } 1049 | 1050 | .home .content-item-byline-author, 1051 | .home .content-item-read-story { 1052 | display: none; 1053 | } 1054 | 1055 | .home main .quicklinks { 1056 | display: -ms-flexbox; 1057 | display: flex; 1058 | } 1059 | 1060 | .home main .quicklinks ul { 1061 | list-style: none; 1062 | margin: auto; 1063 | padding: 0; 1064 | } 1065 | 1066 | .home main .quicklinks li + li { 1067 | margin-top: 1rem; 1068 | } 1069 | 1070 | .home main .quicklinks a { 1071 | border: 2px solid #981e32; 1072 | box-sizing: border-box; 1073 | color: #981e32; 1074 | display: inline-block; 1075 | font-size: .9em; 1076 | font-weight: 600; 1077 | letter-spacing: 2px; 1078 | padding: 14px; 1079 | text-align: center; 1080 | text-transform: uppercase; 1081 | transition: background .4s, color .4s; 1082 | width: 100%; 1083 | } 1084 | 1085 | .home main .quicklinks a:hover { 1086 | background: #981e32; 1087 | color: #fff; 1088 | } 1089 | 1090 | /* Home page events */ 1091 | .home-calendar .wsuwp-content-syndicate-wrapper { 1092 | overflow: hidden; 1093 | padding-bottom: 2rem; 1094 | } 1095 | 1096 | .home-calendar .wsuwp-content-syndicate-list { 1097 | display: -ms-flexbox; 1098 | display: flex; 1099 | padding: 0; 1100 | position: relative; 1101 | } 1102 | 1103 | .home-calendar .wsuwp-content-syndicate-event { 1104 | box-sizing: border-box; 1105 | -ms-flex: 1 0 25%; 1106 | flex: 1 0 25%; 1107 | list-style: none; 1108 | padding: .5em 1em 0 0; 1109 | transition: background .4s; 1110 | width: 25%; 1111 | } 1112 | 1113 | .home-calendar .content-item-event-date { 1114 | box-sizing: border-box; 1115 | color: #fff; 1116 | float: left; 1117 | font-size: 32px; 1118 | font-weight: 600; 1119 | line-height: 50px; 1120 | position: relative; 1121 | text-align: center; 1122 | text-transform: uppercase; 1123 | width: 3.5rem; 1124 | word-spacing: 3rem; 1125 | z-index: 1; 1126 | } 1127 | 1128 | .home-calendar .content-item-event-date:first-line { 1129 | font-size: 12px; 1130 | font-weight: 300; 1131 | line-height: 24px; 1132 | } 1133 | 1134 | .gecko .home-calendar .content-item-event-date { 1135 | line-height: 33px; 1136 | height: 74px; 1137 | } 1138 | 1139 | .gecko .home-calendar .content-item-event-date:first-line { 1140 | vertical-align: top; 1141 | } 1142 | 1143 | .home-calendar .content-item-event-date:before, 1144 | .home-calendar .content-item-event-date:after { 1145 | content: ""; 1146 | left: 0; 1147 | position: absolute; 1148 | transition: background .4s; 1149 | width: 100%; 1150 | z-index: -1; 1151 | } 1152 | 1153 | .home-calendar .content-item-event-date:before { 1154 | background: #717171; 1155 | height: 24px; 1156 | top: 0; 1157 | } 1158 | 1159 | .home-calendar .content-item-event-date:after { 1160 | background: #b5babe; 1161 | bottom: 0; 1162 | height: 48px; 1163 | } 1164 | 1165 | .home-calendar li:hover .content-item-event-date:before { 1166 | background: #b5babe; 1167 | } 1168 | 1169 | .home-calendar li:hover .content-item-event-date:after { 1170 | background: #981e32; 1171 | } 1172 | 1173 | .home-calendar .content-item-event-title { 1174 | display: block; 1175 | margin-left: 4.25rem; 1176 | } 1177 | 1178 | .home-calendar .content-item-event-title a { 1179 | border-bottom: 0; 1180 | } 1181 | 1182 | .home-calendar .content-item-event-meta { 1183 | display: none; 1184 | } 1185 | 1186 | /* Home page event navigation */ 1187 | .event-control { 1188 | border: none; 1189 | display: block; 1190 | height: 3rem; 1191 | overflow: hidden; 1192 | position: absolute; 1193 | text-indent: -5rem; 1194 | top: 50%; 1195 | -ms-transform: translateY(-50%); 1196 | transform: translateY(-50%); 1197 | width: 2rem; 1198 | } 1199 | 1200 | .event-control:hover { 1201 | background: none; 1202 | border-bottom: none; 1203 | } 1204 | 1205 | .event-control:before, 1206 | .event-control:after { 1207 | border: 1.5rem solid transparent; 1208 | box-sizing: border-box; 1209 | content: ""; 1210 | position: absolute; 1211 | top: 0; 1212 | } 1213 | 1214 | .event-control.prev { 1215 | margin-left: -2.5rem; 1216 | } 1217 | 1218 | .event-control.prev:before { 1219 | border-right-color: #717171; 1220 | right: 0; 1221 | transition: border-right-color .4s; 1222 | } 1223 | 1224 | .event-control.prev:hover:before { 1225 | border-right-color: #981e32; 1226 | } 1227 | 1228 | .event-control.prev:after { 1229 | border-right-color: #fff; 1230 | right: -.25rem; 1231 | } 1232 | 1233 | .event-control.next { 1234 | right: -.5rem; 1235 | } 1236 | 1237 | .event-control.next:before { 1238 | border-left-color: #717171; 1239 | left: 0; 1240 | transition: border-left-color .4s; 1241 | } 1242 | 1243 | .event-control.next:hover:before { 1244 | border-left-color: #981e32; 1245 | } 1246 | 1247 | .event-control.next:after { 1248 | border-left-color: #fff; 1249 | left: -.25rem; 1250 | } 1251 | 1252 | .social-media-channels { 1253 | display: -ms-flexbox; 1254 | display: flex; 1255 | -ms-flex-pack: justify; 1256 | justify-content: space-between; 1257 | list-style: none; 1258 | } 1259 | 1260 | .social-media-channels li { 1261 | padding: 0; 1262 | } 1263 | 1264 | .social-media-channels a { 1265 | border: none; 1266 | box-sizing: border-box; 1267 | display: block; 1268 | font-size: 1.8em; 1269 | height: 33px; 1270 | line-height: 33px; 1271 | position: relative; 1272 | text-indent: -99164px; 1273 | width: 33px; 1274 | } 1275 | 1276 | .social-media-channels a:hover { 1277 | background: none; 1278 | border: none; 1279 | } 1280 | 1281 | .social-media-channels a:before { 1282 | font-family: Spine-Icons; 1283 | height: 33px; 1284 | left: 0; 1285 | position: absolute; 1286 | text-align: center; 1287 | text-indent: 0; 1288 | top: 0; 1289 | width: 33px; 1290 | -webkit-font-smoothing: antialiased; 1291 | -moz-osx-font-smoothing: grayscale; 1292 | } 1293 | 1294 | .social-media-channels .facebook a:before { 1295 | color: #3b5998; 1296 | content: "F"; 1297 | } 1298 | 1299 | .social-media-channels .twitter a:before { 1300 | color: #55acee; 1301 | content: "T"; 1302 | } 1303 | 1304 | .social-media-channels .youtube a:before { 1305 | color: #cc181e; 1306 | content: "Y"; 1307 | } 1308 | 1309 | .social-media-channels .instagram a:before { 1310 | color: #517fa5; 1311 | content: "I"; 1312 | } 1313 | 1314 | .social-media-channels li a:hover:before { 1315 | color: #981e32; 1316 | } 1317 | 1318 | .home .site-action-links > ul > li { 1319 | display: none; 1320 | } 1321 | 1322 | .home .site-action-links .widget_polylang { 1323 | border-left: none; 1324 | display: block; 1325 | } 1326 | 1327 | html[lang="es-ES"] .help { 1328 | font-size: 3.5em; 1329 | } 1330 | 1331 | @media only screen and (max-width: 1090px) { 1332 | 1333 | html[lang="es-ES"] .help { 1334 | font-size: 4.5vw; 1335 | } 1336 | } 1337 | 1338 | @media screen and (max-width: 791px) { 1339 | 1340 | .home-calendar .wsuwp-content-syndicate-list li { 1341 | -ms-flex: 1 0 50%; 1342 | flex: 1 0 50%; 1343 | width: 50%; 1344 | } 1345 | } 1346 | 1347 | @media only screen and (max-width: 693px) { 1348 | 1349 | .home .halves .column.one { 1350 | min-height: 350px; 1351 | padding-left: 0; 1352 | padding-right: 0; 1353 | } 1354 | 1355 | html[lang="es-ES"] .help { 1356 | font-size: 2.5em; 1357 | } 1358 | } 1359 | 1360 | @media only screen and (max-width: 530px) { 1361 | 1362 | .home-calendar .wsuwp-content-syndicate-list li { 1363 | -ms-flex: 1 0 100%; 1364 | flex: 1 0 100%; 1365 | width: 100%; 1366 | } 1367 | 1368 | .home .column.intro p { 1369 | font-size: 1.5em; 1370 | } 1371 | 1372 | .home h1 { 1373 | font-size: 3em; 1374 | } 1375 | } 1376 | 1377 | @media only screen and (min-width: 694px) { 1378 | 1379 | .home .halves .column.two { 1380 | padding: 6rem 2rem; 1381 | } 1382 | } 1383 | 1384 | /* "« Scholarship Search Results" link on individual scholarships */ 1385 | .scholarships-back-to-results .column { 1386 | padding-top: 2rem; 1387 | padding-bottom: 2rem; 1388 | } 1389 | 1390 | .scholarships-back-to-results .column p { 1391 | padding: 0; 1392 | } 1393 | 1394 | .apply .cta-button { 1395 | margin-top: 0; 1396 | } 1397 | 1398 | /* Scholarships landing page */ 1399 | .scholarships-landing .main-header { 1400 | height: auto; 1401 | overflow: auto; 1402 | } 1403 | 1404 | .scholarships-landing .page-header-group { 1405 | display: none; 1406 | } 1407 | 1408 | /* Scholarships search form */ 1409 | .wsuwp-scholarships-filters .donor label span { 1410 | font-weight: 300; 1411 | } 1412 | 1413 | /* Scholarships sharing tools */ 1414 | .back-to-results { 1415 | float: left; 1416 | } 1417 | 1418 | .social-share-bar { 1419 | float: right; 1420 | margin-top: 0; 1421 | position: relative; 1422 | } 1423 | 1424 | .social-share-bar a, 1425 | .social-share-bar a:hover { 1426 | background: none; 1427 | border-bottom: none; 1428 | } 1429 | 1430 | @media only screen and (max-width: 530px) { 1431 | 1432 | .social-share-bar { 1433 | clear: both; 1434 | float: left; 1435 | margin-top: 1em; 1436 | } 1437 | } 1438 | 1439 | .cost-table-placeholder { 1440 | margin-bottom: 2rem; 1441 | } 1442 | 1443 | .cost-table-placeholder th { 1444 | background-color: #203639; 1445 | color: #fff; 1446 | vertical-align: middle; 1447 | } 1448 | 1449 | .cost-table-placeholder th, 1450 | .cost-table-placeholder td { 1451 | padding: 8px; 1452 | } 1453 | 1454 | .cost-table-placeholder td { 1455 | border-bottom: 1px solid #ddd; 1456 | } 1457 | 1458 | .cost-table-placeholder tr:nth-of-type(even) td { 1459 | background: #f3f3f3; 1460 | } 1461 | 1462 | .cost-table-placeholder td:empty { 1463 | height: 22px; 1464 | } 1465 | 1466 | .cost-table-placeholder header { 1467 | color: #393939; 1468 | font-size: 1.75em; 1469 | font-weight: 400; 1470 | padding-bottom: 20px; 1471 | } 1472 | 1473 | /*# sourceMappingURL=style.css.map */ --------------------------------------------------------------------------------