├── .gitignore ├── assets └── phone-icon.png ├── js └── functions.js ├── .editorconfig ├── css ├── 00-banner.css └── style.css ├── phpcs.ruleset.xml ├── composer.json ├── package.json ├── .travis.yml ├── Gruntfile.js ├── parts └── headers.php ├── README.md ├── front-page.php ├── .stylelintrc ├── functions.php ├── style.css └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | vendor 4 | composer.lock 5 | style.css.map 6 | -------------------------------------------------------------------------------- /assets/phone-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/washingtonstateuniversity/alert.wsu.edu/master/assets/phone-icon.png -------------------------------------------------------------------------------- /js/functions.js: -------------------------------------------------------------------------------- 1 | jQuery(document).ready(function($) { 2 | $( ".accordion" ).accordion({ 3 | collapsible: true, 4 | active: true, 5 | header:"h4", 6 | heightStyle: "content" 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | # Unix-style newlines with a newline ending every file 5 | [*] 6 | end_of_line = lf 7 | insert_final_newline = true 8 | 9 | [*.{js,php,css,md,xml,html}] 10 | indent_style = tab 11 | intent_size = 4 12 | 13 | [{package.json,.travis.yml}] 14 | indent_style = space 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /css/00-banner.css: -------------------------------------------------------------------------------- 1 | /* 2 | Theme Name: WSU Alert 3 | Theme URI: https://github.com/washingtonstateuniversity/alert.wsu.edu/ 4 | Description: A child theme for Washington State University's Spine framework 5 | Author: WSU Web Communication 6 | Author URI: https://web.wsu.edu/ 7 | Template: spine 8 | Version: 1.0.0 9 | */ 10 | -------------------------------------------------------------------------------- /phpcs.ruleset.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Sniffs for the coding standards of WSUWP PHP projects. 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "washingtonstateuniversity/alert.wsu.edu", 3 | "authors": [ 4 | { 5 | "name": "Washington State University" 6 | } 7 | ], 8 | "require-dev": { 9 | "squizlabs/php_codesniffer": "2.8.x", 10 | "wp-coding-standards/wpcs": "0.11.0" 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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "alert.wsu.edu", 3 | "version": "1.0.0", 4 | "repository": { 5 | "type": "git", 6 | "url": "https://github.com/washingtonstateuniversity/alert.wsu.edu" 7 | }, 8 | "devDependencies": { 9 | "autoprefixer": "^7.1.6", 10 | "grunt": "~1.0.1", 11 | "grunt-contrib-clean": "^1.1.0", 12 | "grunt-contrib-concat": "~1.0.1", 13 | "grunt-contrib-csslint": "^2.0.0", 14 | "grunt-contrib-cssmin": "~2.2.1", 15 | "grunt-postcss": "^0.9.0", 16 | "grunt-phpcs": "^0.4.0", 17 | "grunt-stylelint": "^0.9.0", 18 | "stylelint": "^8.2.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | grunt.initConfig({ 3 | pkg: grunt.file.readJSON('package.json'), 4 | 5 | stylelint: { 6 | src: [ "css/*.css" ] 7 | }, 8 | 9 | concat: { 10 | options: { 11 | sourceMap: true 12 | }, 13 | dist: { 14 | src: "css/*.css", 15 | dest: "tmp-style.css" 16 | } 17 | }, 18 | 19 | postcss: { 20 | options: { 21 | map: true, 22 | diff: false, 23 | processors: [ 24 | require( "autoprefixer" )( { 25 | browsers: [ "> 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 | phpcs: { 43 | plugin: { 44 | src: './' 45 | }, 46 | options: { 47 | bin: "vendor/bin/phpcs --extensions=php --ignore=\"*/vendor/*,*/node_modules/*\"", 48 | standard: "phpcs.ruleset.xml" 49 | } 50 | } 51 | 52 | }); 53 | 54 | grunt.loadNpmTasks( "grunt-postcss" ); 55 | grunt.loadNpmTasks( "grunt-contrib-concat" ); 56 | grunt.loadNpmTasks( "grunt-contrib-clean" ); 57 | grunt.loadNpmTasks( "grunt-phpcs" ); 58 | grunt.loadNpmTasks( "grunt-stylelint" ); 59 | 60 | // Default task(s). 61 | grunt.registerTask('default', ['stylelint', 'concat', 'postcss', 'clean', "phpcs"]); 62 | }; 63 | -------------------------------------------------------------------------------- /parts/headers.php: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 |
7 |
8 |
9 | 10 |
11 |

WSU Pullman Alerts

12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 |

21 | 22 |
23 | 24 | Read full alert... 25 |
26 |
27 |
28 | 29 | 30 | 31 |

There are no active alerts.

32 | 33 |
34 |
35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WSU Alerts Child Theme 2 | 3 | ## Managing Alerts 4 | 5 | Alerts are created as posts with 2 important details: 6 | 7 | Site categories are used to classify the importance. The three main categories are "Announcements", "Emergency", and "Warning". 8 | 9 | In the top right of the edit screen, "Alert Status" is available. For an alert to show as active, the drop down must be changed to **active**. 10 | 11 | ## Header 12 | 13 | A common header is shown on all alert.wsu.edu pages and is populated with information on the latest active alert. This common header is split into two pieces. 14 | 15 | ### Overall alert status 16 | 17 | The text at the top of the page changes depending on the status: 18 | 19 | * Emergency: "There is an active emergency" 20 | * Warning: "There is an active warning" 21 | * None: "There are no alerts" 22 | 23 | ### Full Announcement 24 | 25 | * If there are no active alerts, the area is colored green and the text shows "There are no warnings or emergencies". 26 | * If there is an active **warning**, the area is colored yellow and the text of the warning is displayed. 27 | * If there is an active **emergency**, the area is colored orange and the text of the warning is displayed. 28 | 29 | ## Front page 30 | 31 | The front page (after the common header) displays the most recent 3 posts tagged as "Post to alert home page" (slug: `home`) in the first section. These can be categorized in any way. 32 | 33 | The remaining sections on the page are customizable through the page builder interface. 34 | -------------------------------------------------------------------------------- /front-page.php: -------------------------------------------------------------------------------- 1 | 5 |
6 | 7 | 8 |
9 |
10 |
11 |

Announcements

12 |
13 |
    14 | 15 | 'home', 18 | 'posts_per_page' => 3, 19 | 'fields' => 'ids', 20 | ) ); 21 | 22 | if ( $wsu_alert_announcements->have_posts() ) { 23 | while ( $wsu_alert_announcements->have_posts() ) { 24 | $wsu_alert_announcements->the_post(); 25 | ?> 26 |
  • 27 | 28 | 31 | 32 | 33 | Read Announcement 34 | 35 |
  • 36 |

    There are no announcements at this time.

    43 | 44 |
45 |
46 | 47 |
48 | 49 |
50 |

To report an emergency:

51 |
52 |

phone-icon

53 |

DIAL 9-1-1

54 |
55 |

NOTE: When dialing 911 from a WSU Pullman campus number, there will be a 7 second delay in connecting. WAIT! DO NOT HANG UP!

56 |
57 | 58 |
59 | 60 | 75 |
76 | 77 | 78 |
79 | slug, array( 'emergency', 'warning' ), true ) ) { 44 | return $category->slug; 45 | } 46 | } 47 | 48 | return 'clear'; 49 | } 50 | 51 | 52 | /** 53 | * Get current item alert level 54 | * 55 | * @since 1.0.0 56 | * 57 | * @return string 58 | */ 59 | function wsu_get_alert_level($post_id) { 60 | $categories = get_the_category( $post_id ); 61 | 62 | foreach ( $categories as $category ) { 63 | if ( in_array( $category->slug, array( 'emergency', 'warning' ), true ) ) { 64 | return $category->slug; 65 | } 66 | } 67 | 68 | return 'clear'; 69 | } 70 | 71 | /** 72 | * Returns the total number of active alerts 73 | * 74 | * @since 1.0.0 75 | * 76 | * @return string 77 | */ 78 | function wsu_alert_count() { 79 | $active_alerts = wsu_alert_get_latest(); 80 | 81 | return count($active_alerts); 82 | } 83 | 84 | /** 85 | * Retrieves the latest active alert. 86 | * 87 | * @since 0.1.0 88 | * 89 | * @return array 90 | */ 91 | function wsu_alert_get_latest() { 92 | $active_alerts = wp_cache_get( 'active-alert-id', 'alert' ); 93 | 94 | if ( false === $active_alerts ) { 95 | $args = array( 96 | 'meta_key' => 'wsu_alert_status', 97 | 'meta_value' => 'active', 98 | 'posts_per_page' => 99, 99 | 'fields' => 'ids', 100 | ); 101 | $active_alerts = get_posts( $args ); 102 | 103 | wp_cache_set( 'active-alert-id', $active_alerts, 'alert', HOUR_IN_SECONDS ); 104 | } 105 | 106 | return $active_alerts; 107 | } 108 | 109 | add_action( 'clean_post_cache', 'wsu_alert_clean_cache' ); 110 | /** 111 | * Clear the alert cache whenever post cache is cleaned on 112 | * alert.wsu.edu. 113 | * 114 | * @since 0.3.0 115 | */ 116 | function wsu_alert_clean_cache() { 117 | wp_cache_delete( 'active-alert-id', 'alert' ); 118 | } 119 | 120 | /** 121 | * Displays the header title with an overall alert status based on the current 122 | * alert level. 123 | * 124 | * @since 0.1.0 125 | */ 126 | function wsu_alert_display_status_title() { 127 | $count = wsu_alert_count(); 128 | 129 | if ( $count === 0 ) { 130 | echo 'There are no WSU Pullman alerts.'; 131 | } else { 132 | echo 'Current active alerts: ' . $count; 133 | } 134 | } 135 | 136 | add_action( 'rest_api_init', 'wsu_alert_register_rest_endpoint' ); 137 | /** 138 | * Registers the active alert REST API endpoint. 139 | * 140 | * @since 0.2.0 141 | */ 142 | function wsu_alert_register_rest_endpoint() { 143 | register_rest_route( 'alert/v1', '/active/', array( 144 | 'methods' => 'GET', 145 | 'callback' => 'wsu_alert_handle_active_endpoint', 146 | ) ); 147 | } 148 | 149 | /** 150 | * Provides an endpoint information about any active alerts. 151 | * 152 | * @since 0.2.0 153 | * 154 | * @return array 155 | */ 156 | function wsu_alert_handle_active_endpoint() { 157 | if ( 'emergency' !== wsu_alert_level() ) { 158 | return array( 159 | 'status' => 'clear', 160 | 'message' => 'There are no active emergency alerts.', 161 | 'url' => '', 162 | ); 163 | } 164 | 165 | $active_alerts = wsu_alert_get_latest(); 166 | $active_alert = array_shift( $active_alerts ); 167 | setup_postdata( $active_alert ); 168 | 169 | $data = array( 170 | 'status' => 'emergency', 171 | 'message' => get_the_title( $active_alert ), 172 | 'url' => esc_url( get_the_permalink( $active_alert ) ), 173 | ); 174 | wp_reset_postdata(); 175 | 176 | return $data; 177 | } 178 | 179 | add_action( 'add_meta_boxes', 'wsu_alert_add_meta_boxes', 10 ); 180 | /** 181 | * Adds meta boxes used to manage alerts. 182 | * 183 | * @since 0.1.0 184 | * 185 | * @param string $post_type 186 | */ 187 | function wsu_alert_add_meta_boxes( $post_type ) { 188 | if ( 'post' !== $post_type ) { 189 | return; 190 | } 191 | 192 | add_meta_box( 'wsu_alert_active_status', 'Alert Status', 'wsu_alert_display_alert_status', 'post', 'side', 'high' ); 193 | } 194 | 195 | /** 196 | * Displays the meta box used to capture an alert's active or inactive status. 197 | * 198 | * @since 0.1.0 199 | * 200 | * @param WP_Post $post 201 | */ 202 | function wsu_alert_display_alert_status( $post ) { 203 | $alert_status = get_post_meta( $post->ID, 'wsu_alert_status', true ); 204 | 205 | if ( ! in_array( $alert_status, array( 'active', 'inactive' ), true ) ) { 206 | $alert_status = 'inactive'; 207 | } 208 | 209 | ?> 210 | 211 | 215 | post_status ) { 233 | return; 234 | } 235 | 236 | // @codingStandardsIgnoreStart 237 | if ( ! isset( $_POST['alert_status_select'] ) ) { 238 | return; 239 | } 240 | 241 | if ( in_array( $_POST['alert_status_select'], array( 'inactive', 'active' ), true ) ) { 242 | update_post_meta( $post_id, 'wsu_alert_status', sanitize_text_field( $_POST['alert_status_select'] ) ); 243 | } else { 244 | update_post_meta( $post_id, 'wsu_alert_status', 'inactive' ); 245 | } 246 | // @codingStandardsIgnoreEnd 247 | } 248 | 249 | add_action( 'init', 'wsu_alert_unregister_taxonomies', 12 ); 250 | /** 251 | * Removes support for additional taxonomies on alerts. 252 | * 253 | * This helps to keep the new alert screen free of clutter so that it's 254 | * easier to manage things quickly without distraction. 255 | * 256 | * @since 0.1.0 257 | */ 258 | function wsu_alert_unregister_taxonomies() { 259 | unregister_taxonomy_for_object_type( 'wsuwp_university_category', 'post' ); 260 | unregister_taxonomy_for_object_type( 'wsuwp_university_location', 'post' ); 261 | unregister_taxonomy_for_object_type( 'wsuwp_university_org', 'post' ); 262 | } 263 | 264 | add_action( 'after_setup_theme', 'wsu_alert_setup_image_sizes', 9 ); 265 | /** 266 | * Removes support for featured images and other post thumbnails on alerts. 267 | * 268 | * This helps to keep the new alert screen free of clutter. If background 269 | * images are needed for other pages on the site, we'll need to selectively 270 | * re-enable them. 271 | * 272 | * @since 0.1.0 273 | */ 274 | function wsu_alert_setup_image_sizes() { 275 | remove_theme_support( 'post-thumbnails' ); 276 | remove_action( 'after_setup_theme', 'Spine_Theme_Images' ); 277 | } 278 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | font-size: 100%; 5 | box-sizing: border-box; 6 | word-wrap: break-word; 7 | } 8 | 9 | body, 10 | body:not(.has-background-image) { 11 | background-image: none; 12 | background-color: #d7dadb; 13 | color: #23282b; 14 | } 15 | 16 | main section { 17 | background-color: #fff; 18 | margin-top: 30px; 19 | } 20 | 21 | main section:first-child { 22 | margin-top: 0; 23 | } 24 | 25 | .main-header { 26 | background-color: #fff; 27 | } 28 | 29 | .main-header sub, 30 | .main-header sup, 31 | .main-header sup a { 32 | color: #23282b; 33 | font-size: 32px; 34 | font-weight: 300; 35 | } 36 | 37 | .main-header sup a:hover { 38 | color: #981e32; 39 | } 40 | 41 | .main-header sub *, 42 | .main-header sub a { 43 | display: none; 44 | } 45 | 46 | main section.no-margin, 47 | header.main-header + section { 48 | margin-top: 0; 49 | } 50 | 51 | hr { 52 | background-color: rgba(0, 0, 0, .1); 53 | margin-top: 2em; 54 | margin-bottom: 2em; 55 | } 56 | 57 | /******************* 58 | Typography 59 | *******************/ 60 | 61 | h2 { 62 | font-size: 24px; 63 | font-weight: 400; 64 | padding: 1.6em 0; 65 | } 66 | 67 | h5 { 68 | font-weight: 600; 69 | padding-bottom: 1.2em; 70 | font-size: 1.1rem; 71 | } 72 | 73 | main p, 74 | main ol, 75 | main ul { 76 | font-weight: 300; 77 | font-size: 1rem; 78 | line-height: 1.6; 79 | padding-bottom: 1.5em; 80 | } 81 | 82 | main ul li { 83 | list-style: circle; 84 | padding-bottom: 1em; 85 | } 86 | 87 | /************************ 88 | Notification System 89 | *************************/ 90 | 91 | .notifications-wrap { 92 | width: 100%; 93 | display: block; 94 | color: #2e2e2e; 95 | } 96 | 97 | .notifications-wrap .crimson-title { 98 | width: 100%; 99 | background-color: #981e32; 100 | padding: .8em 2rem; 101 | } 102 | 103 | .notifications-wrap .crimson-title header { 104 | font-size: 1rem; 105 | color: #fff; 106 | } 107 | 108 | .notifications-wrap .system-announcement-wrapper { 109 | width: auto; 110 | min-height: 200px; 111 | padding: 2rem; 112 | margin: 0 -2rem; 113 | border-bottom: 3px solid rgba(0, 0, 0, 0.1); 114 | } 115 | 116 | .notifications-wrap .system-announcement-wrapper:last-child { 117 | border-bottom: none; 118 | } 119 | 120 | .notifications-wrap .system-announcement-wrapper.clear { 121 | background-color: rgb(172, 163, 1); 122 | } 123 | 124 | .notifications-wrap .system-announcement-wrapper.warning { 125 | background-color: rgba(255, 184, 28, 1); 126 | } 127 | 128 | .notifications-wrap .system-announcement-wrapper.emergency { 129 | background-color: rgb(246, 134, 31); 130 | } 131 | 132 | .notifications-wrap .system-announcement-container { 133 | width: 100%; 134 | max-width: 900px; 135 | max-width: 98ch; 136 | } 137 | 138 | .notifications-wrap .system-announcement-container header { 139 | font-size: 1.8rem; 140 | font-weight: 600; 141 | text-transform: capitalize; 142 | padding-bottom: 1em; 143 | } 144 | 145 | .notifications-wrap .system-announcement-content { 146 | margin-top: 1.3em; 147 | } 148 | 149 | .notifications-wrap .system-announcement-container h1 { 150 | font-size: 1.3em; 151 | line-height: 1.3; 152 | } 153 | 154 | .notifications-wrap .system-announcement-container p { 155 | font-weight: 400; 156 | } 157 | 158 | .notifications-wrap .alert-content-area { 159 | padding: 2rem 2rem 0rem 2rem; 160 | } 161 | 162 | .notifications-wrap .alert-content-area header { 163 | margin-bottom: 1rem; 164 | } 165 | .notifications-wrap .alert-content-area .no-active-alerts { 166 | padding-bottom: 0; 167 | margin-bottom: 1rem; 168 | } 169 | 170 | /******************* 171 | Content Syndicate 172 | *******************/ 173 | 174 | .announcements-container { 175 | counter-reset: section; 176 | } 177 | 178 | .announcements-container ul { 179 | padding-left: 45px; 180 | } 181 | 182 | .announcements-container ul li { 183 | list-style: none; 184 | border-bottom: 1px solid #d9d9d9; 185 | padding: 2em 0; 186 | } 187 | 188 | .announcements-container ul li:first-child { 189 | padding-top: 0; 190 | } 191 | 192 | .announcements-container ul li:last-child { 193 | border-bottom: 0; 194 | } 195 | 196 | .announcements-container ul li:before { 197 | position: absolute; 198 | left: 68px; 199 | width: 20px; 200 | text-align: center; 201 | counter-increment: section; 202 | content: counter(section); 203 | padding: .2em; 204 | font-size: .8rem; 205 | border: 1px solid #23282b; 206 | border-radius: 50%; 207 | } 208 | 209 | .announcement-item-byline-author { 210 | display: none; 211 | } 212 | 213 | .announcement-item-title, 214 | .announcement-item-byline { 215 | font-weight: 600; 216 | margin-bottom: .7em; 217 | } 218 | 219 | .announcement-item-excerpt { 220 | margin-top: .8em; 221 | display: block; 222 | } 223 | 224 | /******************* 225 | Notifications 226 | *******************/ 227 | 228 | .notifications { 229 | counter-reset: notifications; 230 | } 231 | 232 | ul.notifications { 233 | column-count: 2; 234 | column-gap: 20px; 235 | margin-top: 2em; 236 | } 237 | 238 | ul.notifications li { 239 | list-style: none; 240 | padding-bottom: 3em; 241 | } 242 | 243 | ul.notifications li:before { 244 | display: inline-block; 245 | width: 20px; 246 | text-align: center; 247 | vertical-align: middle; 248 | counter-increment: notifications; 249 | content: counter(notifications); 250 | padding: .2em; 251 | margin-right: .8em; 252 | font-size: .8rem; 253 | border: 1px solid #23282b; 254 | border-radius: 50%; 255 | } 256 | 257 | .showTip { 258 | font-size: .9em; 259 | border: 1px solid #981e32; 260 | border-radius: 50%; 261 | padding: .3em; 262 | display: inline-block; 263 | width: 20px; 264 | text-align: center; 265 | height: 20px; 266 | vertical-align: text-top; 267 | line-height: .9; 268 | margin-left: .5em; 269 | } 270 | 271 | /******************* 272 | Dial 911 273 | *******************/ 274 | 275 | .dial-911 > p:first-child { 276 | padding-top: 1.6em; 277 | text-transform: uppercase; 278 | } 279 | 280 | .dial-911 .dial { 281 | display: flex; 282 | width: 100%; 283 | height: 60px; 284 | padding-bottom: 1em; 285 | } 286 | 287 | .dial-911 .dial img, 288 | .dial-911 .dial h2 { 289 | display: inline-flex; 290 | } 291 | 292 | .dial-911 .dial img { 293 | min-width: 47px; 294 | height: 47px; 295 | margin-right: .8em; 296 | } 297 | 298 | .dial-911 .dial h2 { 299 | font-weight: 600; 300 | font-size: 2rem; 301 | line-height: .4; 302 | padding-top: .5em; 303 | white-space: nowrap; 304 | } 305 | 306 | .dial-911 em { 307 | font-size: .9em; 308 | } 309 | 310 | /******************* 311 | Accordion 312 | *******************/ 313 | 314 | .ui-accordion { 315 | height: 100%; 316 | padding-bottom: 2em; 317 | } 318 | 319 | .ui-accordion div.accordion-content { 320 | padding-top: .8em; 321 | } 322 | 323 | .ui-accordion h4 { 324 | cursor: pointer; 325 | font-size: 1.2rem; 326 | font-weight: 400; 327 | outline: 0; 328 | } 329 | 330 | .ui-accordion h4.ui-state-default:before { 331 | content: "+"; 332 | } 333 | 334 | .ui-accordion h4.ui-state-active:before { 335 | content: "-"; 336 | } 337 | 338 | .ui-accordion h4.ui-state-default:before, 339 | .ui-accordion h4.ui-state-active:before { 340 | font-size: .8rem; 341 | font-weight: 300; 342 | border: 1px solid #981e32; 343 | border-radius: 50%; 344 | padding: .2em; 345 | display: inline-block; 346 | width: 20px; 347 | text-align: center; 348 | vertical-align: middle; 349 | margin-right: 10px; 350 | color: #981e32; 351 | } 352 | 353 | /******************* 354 | Examples 355 | *******************/ 356 | 357 | .examples { 358 | padding-bottom: 2em; 359 | } 360 | 361 | .examples p { 362 | padding-bottom: 1em; 363 | } 364 | 365 | /**************************** 366 | Blog, Archive, and Search 367 | *****************************/ 368 | 369 | .blog main section, 370 | .archive main section, 371 | .search main section { 372 | margin-top: 0; 373 | } 374 | 375 | .blog article, 376 | .archive article, 377 | .search article { 378 | padding-bottom: 1.4em; 379 | } 380 | 381 | .blog h2.article-title, 382 | .archive h2.article-title, 383 | .search h2.article-title { 384 | padding-bottom: 0; 385 | } 386 | 387 | .article-header hgroup.source, 388 | .article-header .hgroup.source { 389 | padding-bottom: 1.8em; 390 | } 391 | 392 | .article-author { 393 | display: none; 394 | } 395 | 396 | /******************* 397 | Media Query 398 | *******************/ 399 | @media screen and (max-width: 990px) { 400 | 401 | main ol, 402 | main ul { 403 | padding-left: 0; 404 | padding-right: 0; 405 | } 406 | 407 | ul.notifications { 408 | column-count: 1; 409 | } 410 | 411 | ul.notifications li:before, 412 | .ui-accordion h4.ui-state-default:before, 413 | .ui-accordion h4.ui-state-active:before { 414 | position: absolute; 415 | display: block; 416 | left: 25px; 417 | } 418 | } 419 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | /* 2 | Theme Name: WSU Alert 3 | Theme URI: https://github.com/washingtonstateuniversity/alert.wsu.edu/ 4 | Description: A child theme for Washington State University's Spine framework 5 | Author: WSU Web Communication 6 | Author URI: https://web.wsu.edu/ 7 | Template: spine 8 | Version: 1.0.0 9 | */ 10 | 11 | * { 12 | margin: 0; 13 | padding: 0; 14 | font-size: 100%; 15 | box-sizing: border-box; 16 | word-wrap: break-word; 17 | } 18 | 19 | body, 20 | body:not(.has-background-image) { 21 | background-image: none; 22 | background-color: #d7dadb; 23 | color: #23282b; 24 | } 25 | 26 | main section { 27 | background-color: #fff; 28 | margin-top: 30px; 29 | } 30 | 31 | main section:first-child { 32 | margin-top: 0; 33 | } 34 | 35 | .main-header { 36 | background-color: #fff; 37 | } 38 | 39 | .main-header sub, 40 | .main-header sup, 41 | .main-header sup a { 42 | color: #23282b; 43 | font-size: 32px; 44 | font-weight: 300; 45 | } 46 | 47 | .main-header sup a:hover { 48 | color: #981e32; 49 | } 50 | 51 | .main-header sub *, 52 | .main-header sub a { 53 | display: none; 54 | } 55 | 56 | main section.no-margin, 57 | header.main-header + section { 58 | margin-top: 0; 59 | } 60 | 61 | hr { 62 | background-color: rgba(0, 0, 0, .1); 63 | margin-top: 2em; 64 | margin-bottom: 2em; 65 | } 66 | 67 | /******************* 68 | Typography 69 | *******************/ 70 | 71 | h2 { 72 | font-size: 24px; 73 | font-weight: 400; 74 | padding: 1.6em 0; 75 | } 76 | 77 | h5 { 78 | font-weight: 600; 79 | padding-bottom: 1.2em; 80 | font-size: 1.1rem; 81 | } 82 | 83 | main p, 84 | main ol, 85 | main ul { 86 | font-weight: 300; 87 | font-size: 1rem; 88 | line-height: 1.6; 89 | padding-bottom: 1.5em; 90 | } 91 | 92 | main ul li { 93 | list-style: circle; 94 | padding-bottom: 1em; 95 | } 96 | 97 | /************************ 98 | Notification System 99 | *************************/ 100 | 101 | .notifications-wrap { 102 | width: 100%; 103 | display: block; 104 | color: #2e2e2e; 105 | } 106 | 107 | .notifications-wrap .crimson-title { 108 | width: 100%; 109 | background-color: #981e32; 110 | padding: .8em 2rem; 111 | } 112 | 113 | .notifications-wrap .crimson-title header { 114 | font-size: 1rem; 115 | color: #fff; 116 | } 117 | 118 | .notifications-wrap .system-announcement-wrapper { 119 | width: auto; 120 | min-height: 200px; 121 | padding: 2rem; 122 | margin: 0 -2rem; 123 | border-bottom: 3px solid rgba(0, 0, 0, 0.1); 124 | } 125 | 126 | .notifications-wrap .system-announcement-wrapper:last-child { 127 | border-bottom: none; 128 | } 129 | 130 | .notifications-wrap .system-announcement-wrapper.clear { 131 | background-color: rgb(172, 163, 1); 132 | } 133 | 134 | .notifications-wrap .system-announcement-wrapper.warning { 135 | background-color: rgba(255, 184, 28, 1); 136 | } 137 | 138 | .notifications-wrap .system-announcement-wrapper.emergency { 139 | background-color: rgb(246, 134, 31); 140 | } 141 | 142 | .notifications-wrap .system-announcement-container { 143 | width: 100%; 144 | max-width: 900px; 145 | max-width: 98ch; 146 | } 147 | 148 | .notifications-wrap .system-announcement-container header { 149 | font-size: 1.8rem; 150 | font-weight: 600; 151 | text-transform: capitalize; 152 | padding-bottom: 1em; 153 | } 154 | 155 | .notifications-wrap .system-announcement-content { 156 | margin-top: 1.3em; 157 | } 158 | 159 | .notifications-wrap .system-announcement-container h1 { 160 | font-size: 1.3em; 161 | line-height: 1.3; 162 | } 163 | 164 | .notifications-wrap .system-announcement-container p { 165 | font-weight: 400; 166 | } 167 | 168 | .notifications-wrap .alert-content-area { 169 | padding: 2rem 2rem 0rem 2rem; 170 | } 171 | 172 | .notifications-wrap .alert-content-area header { 173 | margin-bottom: 1rem; 174 | } 175 | .notifications-wrap .alert-content-area .no-active-alerts { 176 | padding-bottom: 0; 177 | margin-bottom: 1rem; 178 | } 179 | 180 | /******************* 181 | Content Syndicate 182 | *******************/ 183 | 184 | .announcements-container { 185 | counter-reset: section; 186 | } 187 | 188 | .announcements-container ul { 189 | padding-left: 45px; 190 | } 191 | 192 | .announcements-container ul li { 193 | list-style: none; 194 | border-bottom: 1px solid #d9d9d9; 195 | padding: 2em 0; 196 | } 197 | 198 | .announcements-container ul li:first-child { 199 | padding-top: 0; 200 | } 201 | 202 | .announcements-container ul li:last-child { 203 | border-bottom: 0; 204 | } 205 | 206 | .announcements-container ul li:before { 207 | position: absolute; 208 | left: 68px; 209 | width: 20px; 210 | text-align: center; 211 | counter-increment: section; 212 | content: counter(section); 213 | padding: .2em; 214 | font-size: .8rem; 215 | border: 1px solid #23282b; 216 | border-radius: 50%; 217 | } 218 | 219 | .announcement-item-byline-author { 220 | display: none; 221 | } 222 | 223 | .announcement-item-title, 224 | .announcement-item-byline { 225 | font-weight: 600; 226 | margin-bottom: .7em; 227 | } 228 | 229 | .announcement-item-excerpt { 230 | margin-top: .8em; 231 | display: block; 232 | } 233 | 234 | /******************* 235 | Notifications 236 | *******************/ 237 | 238 | .notifications { 239 | counter-reset: notifications; 240 | } 241 | 242 | ul.notifications { 243 | column-count: 2; 244 | column-gap: 20px; 245 | margin-top: 2em; 246 | } 247 | 248 | ul.notifications li { 249 | list-style: none; 250 | padding-bottom: 3em; 251 | } 252 | 253 | ul.notifications li:before { 254 | display: inline-block; 255 | width: 20px; 256 | text-align: center; 257 | vertical-align: middle; 258 | counter-increment: notifications; 259 | content: counter(notifications); 260 | padding: .2em; 261 | margin-right: .8em; 262 | font-size: .8rem; 263 | border: 1px solid #23282b; 264 | border-radius: 50%; 265 | } 266 | 267 | .showTip { 268 | font-size: .9em; 269 | border: 1px solid #981e32; 270 | border-radius: 50%; 271 | padding: .3em; 272 | display: inline-block; 273 | width: 20px; 274 | text-align: center; 275 | height: 20px; 276 | vertical-align: text-top; 277 | line-height: .9; 278 | margin-left: .5em; 279 | } 280 | 281 | /******************* 282 | Dial 911 283 | *******************/ 284 | 285 | .dial-911 > p:first-child { 286 | padding-top: 1.6em; 287 | text-transform: uppercase; 288 | } 289 | 290 | .dial-911 .dial { 291 | display: -ms-flexbox; 292 | display: flex; 293 | width: 100%; 294 | height: 60px; 295 | padding-bottom: 1em; 296 | } 297 | 298 | .dial-911 .dial img, 299 | .dial-911 .dial h2 { 300 | display: -ms-inline-flexbox; 301 | display: inline-flex; 302 | } 303 | 304 | .dial-911 .dial img { 305 | min-width: 47px; 306 | height: 47px; 307 | margin-right: .8em; 308 | } 309 | 310 | .dial-911 .dial h2 { 311 | font-weight: 600; 312 | font-size: 2rem; 313 | line-height: .4; 314 | padding-top: .5em; 315 | white-space: nowrap; 316 | } 317 | 318 | .dial-911 em { 319 | font-size: .9em; 320 | } 321 | 322 | /******************* 323 | Accordion 324 | *******************/ 325 | 326 | .ui-accordion { 327 | height: 100%; 328 | padding-bottom: 2em; 329 | } 330 | 331 | .ui-accordion div.accordion-content { 332 | padding-top: .8em; 333 | } 334 | 335 | .ui-accordion h4 { 336 | cursor: pointer; 337 | font-size: 1.2rem; 338 | font-weight: 400; 339 | outline: 0; 340 | } 341 | 342 | .ui-accordion h4.ui-state-default:before { 343 | content: "+"; 344 | } 345 | 346 | .ui-accordion h4.ui-state-active:before { 347 | content: "-"; 348 | } 349 | 350 | .ui-accordion h4.ui-state-default:before, 351 | .ui-accordion h4.ui-state-active:before { 352 | font-size: .8rem; 353 | font-weight: 300; 354 | border: 1px solid #981e32; 355 | border-radius: 50%; 356 | padding: .2em; 357 | display: inline-block; 358 | width: 20px; 359 | text-align: center; 360 | vertical-align: middle; 361 | margin-right: 10px; 362 | color: #981e32; 363 | } 364 | 365 | /******************* 366 | Examples 367 | *******************/ 368 | 369 | .examples { 370 | padding-bottom: 2em; 371 | } 372 | 373 | .examples p { 374 | padding-bottom: 1em; 375 | } 376 | 377 | /**************************** 378 | Blog, Archive, and Search 379 | *****************************/ 380 | 381 | .blog main section, 382 | .archive main section, 383 | .search main section { 384 | margin-top: 0; 385 | } 386 | 387 | .blog article, 388 | .archive article, 389 | .search article { 390 | padding-bottom: 1.4em; 391 | } 392 | 393 | .blog h2.article-title, 394 | .archive h2.article-title, 395 | .search h2.article-title { 396 | padding-bottom: 0; 397 | } 398 | 399 | .article-header hgroup.source, 400 | .article-header .hgroup.source { 401 | padding-bottom: 1.8em; 402 | } 403 | 404 | .article-author { 405 | display: none; 406 | } 407 | 408 | /******************* 409 | Media Query 410 | *******************/ 411 | @media screen and (max-width: 990px) { 412 | 413 | main ol, 414 | main ul { 415 | padding-left: 0; 416 | padding-right: 0; 417 | } 418 | 419 | ul.notifications { 420 | column-count: 1; 421 | } 422 | 423 | ul.notifications li:before, 424 | .ui-accordion h4.ui-state-default:before, 425 | .ui-accordion h4.ui-state-active:before { 426 | position: absolute; 427 | display: block; 428 | left: 25px; 429 | } 430 | } 431 | /*# sourceMappingURL=style.css.map */ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | WSU Alerts Child Theme 2 | 3 | Copyright 2017 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 WSU Alerts Child Theme can be freely obtained at the following URL: 365 | 366 | https://github.com/washingtonstateuniversity/alert.wsu.edu/ 367 | --------------------------------------------------------------------------------