docs(LakeWatch): add general architecture design

This commit is contained in:
Price Hiller 2024-07-07 22:37:09 -05:00
parent b64422575d
commit 5f2e24a067
Signed by: Price
GPG Key ID: C3FADDE7A8534BEB
30 changed files with 28984 additions and 0 deletions

View File

@ -0,0 +1,145 @@
* Lake Watch Architecture
** Classes
*** MainMenuActivity
- Responsible for launching all other activities (the following):
- ~BoatRampMenuActivity~
- ~WeatherActivity~
- ~SettingsActivity~
- ~WaterLevelActivity~
- Primary entrypoint for the application
*** SettingsActivity
- Responsible for the following:
- Handling dark mode and light mode toggling
- Forcing a data fetch
- Forcefully clearing the cache
- Data fetching
- Our app will be talking to external data sources beyond local files on the system
- Due to this external data sourcing, the app may end up out of synchronization with those sources and thus we want to allow a given user to force an update if it ever becomes necessary. It's a escape hatch of sorts.
- Cache clearing
- To avoid overloading those external data sources we're going to maintain a cache on the local device that will be preferenced for data fetching under certain criteria (such as difference in dates, a generated hash for a given data set, and potentially more).
- As such, it would be useful if anything ever ends up in a bad state to forcefully clear out this cache to allow data to be reindexed.
*** Settings Data
- Handle the logic behind the scenes for the ~SettingsActivity~ class. It's responsible for actually driving the data behind the view, like the data fetching and caching.
- Likewise, it's also responsible for setting the global lightmode and darkmode for the entire application.
*** WeatherActivity
- Controls general weather information local to Canyon Lake. That information includes:
- High and Low temperature
- Wind speed and direction
- Precipitation chances along with the amount of said precipitation
- A short weather description
- This view will also include a link to [[https://weather.gov]] for Canyon Lake which may include further information.
*** WeatherData
- This is the Model for the ~WeatherActivity~ view.
- Responsible for fetching the local weather conditions at Canyon Lake.
*** MainRampMenuActivity
- Responsible for displaying a vertically scrollable view of all simple boat ramp details, those details include:
- The name of the ramp
- The status of the ramp, is it open, closed, or is its status unknown?
- Color coding based on the status
- Also responsible for launching each individual ramp subview with more details on a given ramp when the ramp is tapped/clicked on
- Contains a list of ~BoatRampData~ objects to pull said data from
*** BoatRampActivity
- Responsible for actually displaying the long information on a given boat ramp, that information includes:
- The boat ramp name, which may be different from the address
- The boat ramp status, open/closed/unknown
- The boat ramp opening times (the officially stated times when the ramp is open if its status shows it as open)
- The address, that has an included copy button to make it easy to paste into a GPS app
- The operator of the ramp, who is actually in charge of it
- The last time the information on the ramp was updated
- Useful for determining if the ramp status may be incorrect
- An image of the boat ramp
*** BoatRampData
- The Model class responsible for handling data interactions for both the ~MainRampMenuActivity~ and the ~BoatRampActivity~
- It pulls data from various data sources that are all kludged together or, unfortunately, sometimes /manually/ gathered for display in the view classes
- The ~BoatRampData~ is intended to be used as a collection, thus the ~loadBoatRampData~ returns an ~ArrayList~ of the data so the ~MainRampMenuActivity~ can easily use it
**** BoatRampStatus
- Contained within the ~BoatRampData~ class
- It's an Enumeration for determining the various states of the ramp
- Since a given ramp can have more than two states (open/closed/unknown), it had to be an Enumeration
*** WaterLevelActivity
- Responsible for displaying information on Canyon Lake's current water level and other data; furthermore, it will show historical water level and other data as well as showing a water level graph for the past three years
- Its information includes:
- How full the lake is as a percentage and in feet
- The surface area covered by the lake in acres of the total lake
- How many feet below (or above) the full pool the current water level is
- The last time the information was updated
*** WaterLevelData
- Contains the following information:
- ~date~: the date for the given water data record
- ~waterLevel~: the level of the water for the given record as feet above the vertical datum
- ~surfaceArea~: the acres covered by the lake surface
- ~reservoirStorage~: actual storage at measured lake elevation
- ~conservationStorage~: reservoir storage - dead pool capacity (note: conservation storage is capped at conservation capacity)
- ~percentFull~: 100 * conservation storage/conservation capacity
- ~conservationCapacity~: storage at conservation pool elevation - dead pool capacity
- ~deadPoolCapacity~: storage at dead pool elevation
- ~WaterLevelData~ is intended to be used as a collection of objects because each object represents a single date's information, as such the ~loadWaterLevelData~ method returns an ~ArrayList~ of ~WaterLevelData~ with the newest data being the first object in the list.
- Some of the data may not be used, but it's /much/ faster and easier to load the full CSV without cutting out some columns of data, thus that's what we do to populate it
** Data Files
*** ~weather-gov-forcast.json~
This file was pulled from [[https://api.weather.gov/gridpoints/EWX/136,74/forecast]].
It contains all the relevant weather data for Canyon Lake. And yes, before you ask, EWX, 136,74 is the correct station for Canyon Lake.
We intend to hit that API as needed for the data, but will include a preloaded set as well in case something goes wrong with that endpoint.
*** ~waterdata.csv~
Please see the file, the entire top of that CSV includes comments as to its exact functionality and numbers as provided to us from following URL: [[https://www.waterdatafortexas.org/reservoirs/individual/canyon.csv]].
To summarize the data is in the following format:
| date | water_level | surface_area | reservoir_storage | conservation_storage | percent_full | conservation_capacity | dead_pool_capacity |
|------------|-------------|--------------|-------------------|----------------------|--------------|-----------------------|--------------------|
| 2024-06-19 | 885.41 | 5689.16 | 215710 | 215639 | 56.9 | 378781 | 71 |
All data is using feet or acres as relevant.
*** ~Canyon-Lake-WaterData-Graph.png~
That PNG is an example of the actual graph we intend to show in the app, it will serve as a fallback in case data can't be pulled for any reason such that the user isn't left with nothing on screen.
It contains the water level per month for the last three years plotted out based on the data in the ~waterdata.csv~ file.
*** BOAT RAMP DATA FROM HELL
We are breaking the boat ramp data down into its own section because of how ad-hoc the data consistency and availability is.
Some operators, like Comal County, are angels and have the data in a simple JSON serving API that we can hit and get up to date statuses for.
Another operator who at least posts data, is the United States Army Core of Engineers. It's great that they do post data, but! They post their data in a manually updated HTML page — so we get to go through the /fun/, /_fun_/ experience of doing data scrapping against those pages to get up to date information.
The worst operators, like WORD (yes, that's an operator), told me (Price Hiller) to effectively pound sand after waiting on hold for the better part of two hours. So for the WORD ramps, and others like them the data status is in god's hands.
For the record, we only have up to date data we can pull on the ramps for approximately 14 ramps give or take a few. There's 23 total. A lot of the data will be manually entered for the purposes of this section based on news articles and hearsay.
Do take note that the ~Canyon-Lake-USACE-...~ directories are included for the relevant HTML files and are not going to be discussed below as during our scrape those directories won't exist, our scraper will see the full webpage.
**** ~Comal-County-Ramp-Info.json~
Comal County posts their ramp information off of their GIS system for the public to use. Under the ~features~ key within the JSON, they have per ramp statuses which we will be leveraging for their ramp information.
**** ~Canyon-Lake-USACE-Operators.html~
This file includes *all* of the operators of every Canyon Lake boat ramp. This makes it easy on us to assign names to ramps, and determine who actually owns the ramps.
**** ~Canyon-Lake-USACE.html~
This file has all the United States Army Corps of Engineer's data on their ramps. That data has the names of the ramps and whether they are closed or not and (sometimes) operating hours.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,877 @@
html,
body,
span,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
b,
u,
i,
center,
form,
label,
legend,
footer,
header,
menu,
nav,
output,
summary {
margin: 0;
padding: 0;
border: 0;
/* font: inherit; */
vertical-align: baseline;
}
#headerFloat {
height: 45px;
z-index: 999;
}
.main-bar {
min-height: 45px;
background: black;
}
.header-float {
margin-left: auto;
margin-right: auto;
max-width: 1152px;
/* min-height: 28px;
height: 45px; */
display: flex;
}
.page-wrap {
margin-top: 25px;
margin-bottom: 200px;
margin: 0 auto;
max-width: 1152px;
background-color: white;
padding-top: 102px;
}
.sticky {
position: sticky;
top: 0;
width: 100%;
}
.sticky + .content {
padding-top: 102px;
}
#header {
position: relative;
}
.content {
padding: 16px;
}
.not-found {
font-size: 4vh;
font-weight: 700;
}
.search-bar {
margin: auto;
margin-right: 15px;
}
.search-bar i {
color: #ccc;
cursor: pointer;
font-size: 0.9em;
margin: auto;
padding: 5px;
margin-left: 0;
}
.search-bar input {
background: hsla(0,0%,100%,.2);
border: none;
color: #ccc;
font-size: 14px;
padding: 2px 8px;
width: 150px;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-ms-border-radius: 5px;
-o-border-radius: 5px;
}
.site-name {
font-weight: 700;
font-size: 14px;
margin-right: 8px;
margin-left: 115px;
float: left;
position: relative;
margin-top: 5px;
}
.site-area {
font-size: 14px;
float: left;
position: relative;
margin-top: 5px;
color: #212529;
font-family: Roboto, Arial, Helvetica, sans-serif;
}
.site-title {
background: rgb(215, 215, 215);
height: 32px;
}
.site-logo {
float: left;
position: absolute;
margin-left: 11px;
margin-top: 12px;
width: 65px;
height: 45px;
transition: all 0.2s ease-in-out;
}
.reg {
font-size: 11px;
position: relative;
color: lightslategray;
left: 81px;
top: 61px;
transition: all 0.2s ease-in-out;
}
.dropbtn {
display: inline-block;
cursor: pointer;
background-color: black;
color: #d0d0d0;
padding: 0 8px;
z-index: 3;
line-height: 45px;
font-weight: 600;
text-decoration: none;
font-size: 13.6px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
border: none;
}
.sub-menu {
background: #555555;
color: #d0d0d0;
font-family: "Open Sans", Arial, Helvetica, sans-serif;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.sub-header {
/* min-height: 28px; */
font-size: 1rem;
font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif;
min-width: 200px;
padding-right: 15px;
padding-left: 15px;
vertical-align: middle;
}
.options-block {
padding-top: 1vh;
}
.legend:hover {
background-color: gray;
}
.collapsible {
cursor: pointer;
/* padding: 18px; */
width: 100%;
border: none;
text-align: left;
font-size: 2em;
outline: none;
vertical-align: middle;
}
.burger-bar .active,
.burger-bar .collapsible:hover {
background-color: #555 !important;
color: white !important;
}
.collapsible:before {
display: inline-table;
white-space: nowrap;
content: "+";
color: black;
alt: "Click to Expand";
text-align: center;
vertical-align: middle;
font-weight: 700;
font-size: 3vh;
float: left;
margin-left: 1vw;
margin-right: 1vw;
}
.collapsible:hover:before {
color: white;
}
.content {
padding: 0 18px;
max-height: 0;
width: 100%;
overflow-x: hidden;
transition: max-height 0.2s ease-out;
background-color: #f1f1f1;
}
.sub-arrow-down {
display: inline-block;
width: 0;
height: 0;
margin-left: 0.255em;
vertical-align: 0.255em;
border-top: 0.3em solid;
border-right: 0.3em solid transparent;
border-left: 0.3em solid transparent;
}
.sub-arrow-up {
display: inline-block;
width: 0;
height: 0;
margin-left: 0.255em;
vertical-align: 0.255em;
border-bottom: 0.3em solid;
border-right: 0.3em solid transparent;
border-left: 0.3em solid transparent;
}
.mobile-hide {
display: inline-block;
}
#skin-footer-background {
background-color: #333;
padding-bottom: 68px;
padding-top: 32px;
}
/* Burger Bar */
.burger-bar {
position: sticky;
margin-right: 11px;
transition: all 0.2s ease-in-out;
right: 0;
top: 0;
display: none;
color: white;
font-size: 30px;
cursor: pointer;
}
.overlay {
height: 100%;
width: 0;
position: fixed;
z-index: 99;
top: 0;
right: 0;
overflow-x: hidden;
background-color: rgba(0, 0, 0, 0.9);
transition: 0.5s;
}
.overlay-content {
position: relative;
color: white;
top: 10%;
bottom: 0px;
left: 0px;
right: 0px;
width: 100%;
text-align: left;
z-index: 1;
}
.overlay a {
padding: 8px;
text-decoration: none;
font-size: 1.5em;
color: white;
transition: 0.3s;
display: block;
}
.overlay a:hover,
.overlay a:focus {
color: #f1f1f1;
}
.overlay .closebtn {
position: absolute;
top: 20px;
right: 45px;
/* font-size: 60px; */
font-size: 3em;
}
#mobileNavContent .home {
display: flex;
position: sticky;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.9);
border: 1px solid;
border-left: none;
border-right: none;
}
#mobileNavContent .home i {
margin: auto 0;
}
.closebtn:hover::before {
content: "";
}
.collapsible-mobile {
cursor: pointer;
padding: 5px;
width: 100%;
border: none;
text-align: left;
font-size: 1.5em;
outline: none;
vertical-align: middle;
margin-top: 0.5em;
}
.burger-bar .active,
.burger-bar .collapsible-mobile:hover,
.home a:first-of-type:hover {
background-color: #555 !important;
color: white !important;
}
.home a:last-of-type:hover {
color: red !important;
}
.collapsible-mobile:before {
display: inline-table;
white-space: nowrap;
content: "+";
color: white;
alt: "Click to Expand";
text-align: left;
vertical-align: middle;
font-weight: 700;
/* font-size: 3vh; */
margin-left: 1vw;
margin-right: 1vw;
padding-bottom: 4px;
}
.content-hide, .hide {
display: none;
}
.content-mobile {
border: 1px solid;
border-left: 5px solid gray;
padding: 0 18px;
width: 100%;
overflow: hidden;
transition: max-height 0.2s ease-out;
background-color: transparent;
}
.burger-bar .active:before {
content: "-";
alt: "Click to Contract";
color: white;
}
.site-logo:hover::before {
content: "";
}
.content-mobile a:hover::before {
/* content: "> "; */
color: white;
}
.content-mobile a:hover {
text-decoration: underline;
}
.home {
color: white;
}
/* Sub Menu */
.top-level-menu a
/* Apply to all links inside the multi-level menu */ {
display: flex;
font: bold 14px Arial, Helvetica, sans-serif;
color: #d0d0d0;
text-decoration: none;
padding: 0 8px;
/* Make the link cover the entire list item-container */
display: block;
cursor: pointer;
font-size: 13.6px;
font-weight: 600;
/* box-shadow: 0px 8px 16px 0px rgb(0 0 0 / 20%); */
border: none;
}
.top-level-menu li {
position: relative;
}
.top-level-menu ul {
border-right: 1px solid black;
border-top: 1px solid black;
}
.top-level-menu > li > a {
line-height: 45px;
}
.second-level-menu a:hover > i {
display: none;
}
.top-level-menu a:hover {
color: white;
}
.top-level-menu a i {
margin: auto;
margin-right: 0;
}
.top-level-menu {
list-style: none;
display: inline-block;
padding: 0;
color: #d0d0d0;
}
.top-level-menu > li {
position: relative;
float: left;
min-width: 50px;
}
.top-level-menu > li:hover {
background-color: rgb(121, 121, 121);
}
.top-level-menu li:hover > ul {
/* On hover, display the next level's menu */
/* display: inline; */
z-index: 99;
opacity: 1;
transition-delay: 0.2s;
visibility: visible;
}
.second-level-menu {
transition: 0s;
opacity: 0;
visibility: hidden;
position: absolute;
top: 45px;
left: 0;
min-width: 300px;
list-style: none;
padding: 0;
margin: 0;
border-top: none!important;
/* display: inline; */
/* visibility: hidden; */
}
.second-level-menu a {
display: flex;
}
.second-level-menu a i {
margin: auto;
margin-right: 0;
}
.second-level-menu > li > a {
line-height: 45px;
}
.second-level-menu > li {
position: relative;
/* padding-right: 50px; */
/* height: 45px; */
background: #555555;
border-bottom: 1px solid rgba(0, 0, 0, 0.3);
}
.second-level-menu > li:hover {
color: white;
background-color: rgb(121, 121, 121);
}
.third-level-menu {
position: absolute;
top: 0;
left: 100%;
font-size: 0.9rem;
/* min-width: 150px; */
width: 100%;
list-style: none;
padding: 0;
margin: 0;
/* display: inline; */
transition: 0s;
opacity: 0;
visibility: hidden;
}
.third-level-menu a i {
margin: auto;
margin-right: 0;
}
.third-level-menu > li {
/* padding-right: 150px; */
background: lightgray;
border-bottom: 1px solid black;
border-left: 2px solid black;
}
.third-level-menu a {
color: black;
display: flex;
font-size: 0.9em;
}
.third-level-menu > li > a {
line-height: 40px;
}
.third-level-menu > li:hover {
background-color: gray;
color: white;
}
.fourth-level-menu {
position: absolute;
top: 0;
left: 100%;
font-size: 0.9rem;
/* min-width: 150px; */
width: 100%;
list-style: none;
padding: 0;
margin: 0;
/* display: none; */
/* background-color: #ff6699; */
animation-fill-mode: forwards;
transition: 0s;
opacity: 0;
visibility: hidden;
/* display: inline; */
}
.fourth-level-menu a i {
margin: auto;
margin-right: 0;
}
.fourth-level-menu > li {
/* padding-right: 150px; */
background: lightgray;
border-bottom: 1px solid black;
border-left: 2px solid black;
}
.fourth-level-menu a {
display: flex;
font-size: 0.8em;
}
.fourth-level-menu > li > a {
line-height: 35px;
}
.fourth-level-menu > li:hover {
background-color: gray;
color: white;
}
@media only screen and (max-width: 1400px) {
.fourth-level-menu {
right: 100%;
left: unset;
}
}
.fifth-level-menu {
position: absolute;
top: 0;
left: 100%;
font-size: 0.9rem;
/* min-width: 150px; */
width: 75%;
list-style: none;
padding: 0;
margin: 0;
/* display: none; */
/* background-color: #ff6699; */
animation-fill-mode: forwards;
transition: 0s;
opacity: 0;
visibility: hidden;
/* display: inline; */
}
.fifth-level-menu a i {
margin: auto;
margin-right: 0;
}
.fifth-level-menu > li {
/* padding-right: 150px; */
background: lightgray;
border-bottom: 1px solid black;
border-left: 2px solid black;
}
.fifth-level-menu a {
display: flex;
font-size: 0.8em;
}
.fifth-level-menu > li > a {
line-height: 35px;
}
.fifth-level-menu > li:hover {
background-color: gray;
color: white;
}
@media only screen and (max-width: 1400px) {
.fifth-level-menu {
left: 100%;
right: unset;
}
}
/* Menu Link Styles */
/* Mobile Settings */
@media only screen and (max-width: 950px) {
.burger-bar {
display: inline-block;
}
.overlay a {
/* font-size: 20px; */
}
.overlay .closebtn {
font-size: 2em;
top: -5px;
right: 5px;
}
.page-title {
font-size: 16pt;
}
.page-wrap {
margin-top: 2vw;
/*padding-top: 70px;*/
}
#desktop-menu {
display: none;
}
.divider {
display: none;
}
.site-logo {
float: left;
position: absolute;
margin-top: 5px;
margin-left: 15px;
width: 45px;
height: 23px;
}
.reg {
left: 61px;
top: 32px;
}
.sub-header {
/* height: 70px; */
margin-bottom: 30px;
color: #e5e1e1;
background: rgba(51, 51, 51, 0.95);
width: 100%;
padding: 5px;
}
.site-area {
display: block;
margin-left: 0;
font-size: 1em;
margin-left: 5px;
color: #e5e1e1;
}
.site-name {
display: block;
font-size: 1em;
margin-left: 5px;
}
.options-block {
display: block;
}
.mobile-hide {
display: none;
}
.collapsible {
width: 100% !important;
height: 3vh !important;
text-align: left !important;
}
.collapsible:before {
margin-left: 0.5vw;
margin-right: 2vw;
text-align: match-parent;
vertical-align: middle;
}
}
#page-container #skip-link-holder a {
height: 30px;
display: block;
width: 100%;
position: fixed;
top: -30px;
left: 0;
z-index: 10001;
color: #fff;
background: #de1e2e;
opacity: 0.9;
border-bottom: 0;
-webkit-box-shadow: 0 2px 5px rgb(0 0 0 / 50%);
box-shadow: 0 2px 5px rgb(0 0 0 / 50%);
line-height: 30px;
padding: 0 8px;
}
#page-container #skip-link-holder a:active,
#page-container #skip-link-holder a:focus {
left: 0;
top: 0;
z-index: 10000;
}
/* Styles the return to top button */
#returnTop {
display: none;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border: none;
outline: none;
background-color: red;
color: white;
cursor: pointer;
padding: 15px;
border-radius: 4px;
}
#returnTop:hover {
background-color: #555;
}
/* Page CSS overrides */
*,
::after,
::before {
box-sizing: border-box;
}
.container-fluid,
.page-container {
position: relative;
}
.slideshow-title {
display: flex;
background: lightgray;
width: 100%;
justify-content: center;
padding: 5px;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border: 1px solid black;
}
.container-fluid {
width: 100%;
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
.page-content {
display: flex;
flex-wrap: wrap;
}
.box-usace {
margin: 0 0 32px;
position: relative;
}
.inline-logo {
margin: auto 5px;
width: 22px;
height: 18px;
}
@media only print {
#header {
display: none!important;
}
/* iframe {
display: none;
} */
#footer {
display: none!important;
}
}

View File

@ -0,0 +1,329 @@
.side-menu {
display: flex;
}
/* ================== */
/* Box Header Content */
.box-usace .box-header-striped {
font-size: 20.8px;
font-size: 1.3rem;
font-weight: 700;
line-height: 22.4px;
line-height: 1.4rem;
margin-bottom: 0;
z-index: 3;
}
.box-usace .box-header-striped {
font-size: 20.8px;
font-size: 1.3rem;
font-weight: 700;
line-height: 22.4px;
line-height: 1.4rem;
margin-bottom: 0;
z-index: 3;
}
.box-usace .box-header-striped:before {
content: " ";
display: block;
width: 100%;
height: 25px;
margin-bottom: -12px;
background-color: #ededed;
}
.box-usace .box-header-striped:after {
content: " ";
display: block;
position: absolute;
width: 50px;
height: 5px;
top: 0;
left: 0;
background-color: #de1e2e;
z-index: 2;
}
.title {
/*font-family: Roboto, Arial, Helvetica, sans-serif;*/
font-family: Verdana, Arial, Helvetica, sans-serif;
}
.backend-cp-collapsible,
.backend-cp-fixed {
overflow-x: auto;
overflow-y: hidden;
}
/* END Box Header Content */
/* ====================== */
/* MENU CONTENT */
#leftPane {
overflow: visible;
}
.box-usace .box-content {
display: flex;
flex-direction: column;
padding: 16px 0 0;
margin: 0;
}
.acAccordionMenu {
/*font: 16px Arial, Hevetica, Sans-Serif;*/
font: 16px Verdana, Hevetica, Sans-Serif;
list-style: none;
margin: 0;
padding-inline-start: 0;
}
.acResponsive .usaceAccordionMenuListItem {
border-bottom: 1px solid #efefef;
}
.acAccordionMenu li {
list-style: none;
line-height: 20px;
}
.acResponsive a:hover,
.acResponsive span:hover {
font-weight: bold;
}
.usaceAccordionMenuListItem {
position: relative;
}
.usaceAccordionMenuListItem div.lvl0 a {
text-decoration: none;
}
.acResponsive .listItem a,
.acResponsive .listItem span {
padding: 10px 10px 10px 15px !important;
display: block;
}
div.listItem a {
color: #333;
}
.col-md,
.col-md-3 {
position: relative;
width: 100%;
padding-right: 15px;
padding-left: 15px;
}
/* Mobile Content */
@media (min-width: 768px) {
.col-md-3 {
-ms-flex: 0 0 25%;
flex: 0 0 25%;
}
.col-md {
-ms-flex-preferred-size: 0;
flex-basis: 0;
-ms-flex-positive: 1;
flex-grow: 1;
max-width: 100%;
}
}
/* .listItemSub.lvl1 {
margin-left: 5%;
}
.listItemSub .listItem {
position: relative;
}
.listItemSub .listItem::before {
content: "+";
font-size: 1.5em;
margin-right: 5px;
position: absolute;
display: block;
top: 50%;
-webkit-transform: translateY(-55%);
-moz-transform: translateY(-55%);
-ms-transform: translateY(-55%);
transform: translateY(-55%);
border-bottom: none;
} */
.sidebar-container {
display: relative;
z-index: 999;
cursor: pointer;
/* font-weight: bold; */
/*font-family: Arial, Helvetica, sans-serif;*/
font-family: Verdana, Helvetica, sans-serif;
}
.sidebar-container .fa-caret-right {
margin-left: auto;
}
.sidebar-container a {
text-decoration: none;
padding: 10px 10px 10px 15px !important;
color: black;
/* display: block; */
}
.sidebar-container li {
border-bottom: solid 1px;
}
.sidebar-container a:hover {
color: white;
}
.sidebar-container li > a {
display: flex;
align-items: center;
/* transition: 0.3s; */
}
/* .sb-m2 {
position: absolute;
top: 50%;
left: 100%;
min-width: 150px;
list-style: none;
padding: 0;
margin: 0;
display: none;
}
.sb-m2>li {
height: 45px;
background: rgba(255, 255, 255, 0.95);
padding-right: 15px;
} */
.sb-main-menu {
list-style: none;
/* display: inline-block; */
padding: 0;
/* color: #d0d0d0; */
}
/* .sub-menu:after {
} */
.sb-main-menu > li {
position: relative;
line-height: 15px;
min-width: 50px;
}
/* Active display for all elements on hover within top level menu */
.sb-main-menu li:hover {
/* display: block;
color: green; */
background: gray;
color: white;
/* font-weight: 800; */
}
.sb-sub-menu {
border: 1px solid black;
position: absolute;
top: 0;
left: 100%;
min-width: 300px;
list-style: none;
padding: 0;
margin: 0;
display: none;
}
.sb-sub-menu > li {
position: relative;
line-height: 15px;
min-width: 50px;
background: rgba(255, 255, 255, 0.95);
border-bottom: 1px solid rgba(0, 0, 0, 0.3);
color: black;
}
.sb-main-menu li:hover > ul {
display: inline;
z-index: 99;
}
.sb-main-menu:nth-child(3) {
bottom: 0;
}
/* sidebar menu 0 */
/* .sb-m0>li {
position: relative;
float: left;
height: 45px;
min-width: 50px;
} */
/***** Sidebar Jump Menu - START ******/
.ac-hide {
display: none;
}
@media screen and (max-width: 768px) {
.ac-show-mobile-only {
display: block;
}
/* Facility Closure Report CSS OVERRIDE */
.header-grid > th {
font-size: 0.5em;
font-weight: 500;
}
}
@media screen and (min-width: 768px) {
.ac-hide-mobile-only {
display: block !important;
}
}
.ac-jump-menu {
max-width: 100%;
min-width: 100%;
text-overflow: ellipsis;
}
.ac-jump-menu-header {
font-weight: bold;
margin: 10px 0;
}
.ac-jump-menu-warning,
.ac-jump-menu-success {
display: none;
margin: 10px 0;
}
.ac-jump-menu-success i.fa-spin {
margin: 0 10px 0 0;
}
.ac-jump-menu .ac-main-menu {
font-weight: 800;
font-size: 1.1rem;
}
.ac-jump-menu .ac-sbm1 {
font-weight: 700;
font-size: 1rem;
}
.ac-jump-menu .ac-sbm2 {
font-size: 0.9rem;
}
/***** Jump Menu - END ******/
@media only print {
#sidebar {
display: none;
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 123.57 164.41"><defs><style>.cls-1{fill:#231f20;}.cls-1,.cls-2,.cls-3{fill-rule:evenodd;}.cls-2{fill:#f3c41d;}.cls-3{fill:#fff;}</style></defs><title>army-logo-color</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M120.6,3a9.82,9.82,0,0,0-7.21-3H10.23A9.74,9.74,0,0,0,3,3a9.74,9.74,0,0,0-3,7.21v97a9.74,9.74,0,0,0,3,7.21,9.7,9.7,0,0,0,7.21,3H113.39a10.14,10.14,0,0,0,10.18-10.18v-97a9.7,9.7,0,0,0-3-7.21Z"/><path class="cls-2" d="M120.35,10.23a6.88,6.88,0,0,0-2.07-4.94,6.55,6.55,0,0,0-4.89-2H10.23a6.66,6.66,0,0,0-4.94,2,6.82,6.82,0,0,0-2,4.94v97a6.74,6.74,0,0,0,2,4.94,6.66,6.66,0,0,0,4.94,2H113.39a6.55,6.55,0,0,0,4.89-2,6.79,6.79,0,0,0,2.07-4.94v-97Z"/><path class="cls-1" d="M116,7.61a3.72,3.72,0,0,0-2.62-1.06H10.23A3.66,3.66,0,0,0,7.61,7.61,3.7,3.7,0,0,0,6.5,10.23v97a3.7,3.7,0,0,0,1.11,2.62,3.66,3.66,0,0,0,2.62,1.06H113.39a3.72,3.72,0,0,0,2.62-1.06,3.62,3.62,0,0,0,1.06-2.62v-97A3.62,3.62,0,0,0,116,7.61Z"/><polygon class="cls-2" points="109.5 47.24 74.16 47.24 63.17 13.87 51.98 47.24 16.34 47.24 45.48 67.76 34.59 101.19 63.02 80.82 91.96 101.69 81.27 67.41 109.5 47.24 109.5 47.24"/><polygon class="cls-1" points="97.81 50.57 71.34 50.57 63.12 25.56 54.75 50.57 28.03 50.57 49.81 65.94 41.7 90.95 63.02 75.73 84.65 91.36 76.68 65.69 97.81 50.57 97.81 50.57"/><polygon class="cls-3" points="73.25 64.94 89.24 53.54 69.27 53.54 63.07 34.69 56.77 53.54 36.6 53.54 53.04 65.14 46.94 83.99 62.97 72.5 79.31 84.3 73.25 64.94 73.25 64.94"/><path class="cls-1" d="M10.23,120.55a9.7,9.7,0,0,0-7.21,3,9.74,9.74,0,0,0-3,7.21v23.44a9.68,9.68,0,0,0,3,7.16,9.71,9.71,0,0,0,7.21,3H113.39a9.79,9.79,0,0,0,7.21-3,9.63,9.63,0,0,0,3-7.16V130.78a10.23,10.23,0,0,0-10.18-10.23Z"/><path class="cls-2" d="M5.29,125.84a6.74,6.74,0,0,0-2,4.94v23.44a6.65,6.65,0,0,0,2,4.9,6.66,6.66,0,0,0,4.94,2H113.39a6.55,6.55,0,0,0,4.89-2,6.7,6.7,0,0,0,2.07-4.9V130.78a6.79,6.79,0,0,0-2.07-4.94,6.56,6.56,0,0,0-4.89-2H10.23a6.67,6.67,0,0,0-4.94,2Z"/><path class="cls-1" d="M10.23,127.1a3.62,3.62,0,0,0-2.62,1.06,3.69,3.69,0,0,0-1.11,2.62v23.44a3.6,3.6,0,0,0,1.11,2.58,3.51,3.51,0,0,0,2.62,1.11H113.39A3.57,3.57,0,0,0,116,156.8a3.51,3.51,0,0,0,1.06-2.58V130.78a3.6,3.6,0,0,0-1.06-2.62,3.68,3.68,0,0,0-2.62-1.06Z"/><path class="cls-3" d="M78.75,140.92v-5.3l-3.12-2.92h-8V153h4.64v-8.11h2V153h4.54v-8.11l-2.37-2,2.37-2ZM14,132.7V150l3.12,3h5.25l3-3V132.7H20.72v16.43h-2V132.7Zm60.19,3.78v4.59h-2v-4.59Zm21.43-3.78H90.15l-1.52,9.78h-.4l-1.66-9.78H81.12V153h4.24V140.11h.2l2,12.85h1.72l2-12.85h.21V153h4.23V132.7Zm8.27,7.31h0l-1.66-7.31H97.56l4,11.74V153h4.69v-8.52l4-11.74h-4.64L103.91,140ZM31.66,153V149H27V153ZM46.48,149V153h4.64V149Zm-1.61-13.41-3.28-2.92H36.65l-3,2.92v6.1l3.22,2.93,3.33.25v4.23H38.27v-2.67H33.63V150l3,3H41.8l3.07-3v-6.15l-3.18-2.92-3.42-.31v-4.13h1.91v2.72h4.69v-3.58Zm17.85-2.92H56L53.14,153h4.54l.4-3.78h2.67l.41,3.78h4.53l-3-20.26Zm-4.34,12.7.71-8.42h.45l.86,8.42Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,52 @@
/* #breadcrumbs {
font-size: 18px;
margin: auto 15px;
padding: 20px 0 20px;
color: #ddd;
font-family: "Font Awesome 5 Free";
}
.skin-breadcrumb {
color: #06c;
font-weight: 900;
} */
#breadcrumbs {
display: flex;
flex-shrink: 1;
flex-wrap: wrap;
font-size: 1.2rem;
margin: auto 15px;
padding-bottom: 10px;
color: #ddd;
/* font-family: "Font Awesome 5 Free"; */
font-family: Verdana, Geneva, Tahoma, sans-serif;
z-index: -1;
}
.breadcrumb-link {
color: #06c;
text-decoration: none;
font-weight: 900;
}
.breadcrumb-link:not(:first-child):before,
.breadcrumb-current:before {
content: "/";
margin: 0 5px;
color: black;
text-decoration: none;
}
.breadcrumb-current {
color: #999;
}
@media (max-width: 768px) {
#breadcrumbs {
padding: 10px 0;
}
}
@media only print {
#breadcrumbs {
display: none !important;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -0,0 +1,193 @@
/* Lakepage Styles */
html,
body {
font-family: Verdana, sans-serif;
font-size: 15px;
line-height: 1.5;
height: unset!important;
}
.rightpanel_wrapper {
font-size: 12px;
line-height: 1.4;
}
.rightpanel_wrapper p {
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0px;
margin-inline-end: 0px;
}
.lake-img {
margin: auto 0;
text-align: center;
}
.lake-img.logo {
padding: 0;
text-align: left;
}
.lake-img img {
max-width: 65%;
border: 2px solid black;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-ms-border-radius: 5px;
-o-border-radius: 5px;
}
.lake-img.logo img {
border: unset;
}
.text-padding {
padding: 0 10px;
}
.box-top-container {
display: flex;
padding-bottom: 20px;
}
.box-header-striped {
margin-bottom: 5px!important;
}
.box-content-border {
border: 1px solid black;
box-shadow: 1px 1px black;
border-top: none;
overflow-x: auto;
background-color:white;
margin:auto
}
.box-content-border table {
min-width: 500px;
}
.box-content img {
margin-left: 0;
margin-right: 0;
}
#contentTable {
table-layout: fixed;
}
td {
/* overflow: hidden; */
font-size: 1em;
text-overflow: ellipse;
word-wrap: normal;
}
h1,
h2,
h3,
h4,
h5,
h6 {
/* font-family: Arial, Helvetica, sans-serif; */
}
a {
color: inherit;
background-color: transparent;
}
hr {
border: solid 1px black;
width: 96%;
color: #FFFF00;
height: 1px;
}
.box-usace p {
margin-bottom: 32px;
}
.box-container-item {
display: flex;
flex-direction: column;
width: 100%;
}
.life-jacket {
position: fixed;
max-width: 5vw;
height: auto;
width: 25%;
right: 2%;
top: 100px;
z-index: 5;
}
.iframe-map {
width: 100%;
height: 50vh;
}
/* Style rows to shrink with page */
.flex-table {
display: flex;
gap: 10px;
column-gap: 20px;
flex-wrap: wrap;
flex-shrink: 3;
}
.flex-table a {
width: 25%;
word-break: unset;
}
@media only screen and (max-width: 480px) {
/* Make sure the links don't create a scroll */
.text-padding a {
word-break: break-word;
}
.lake-img img {
max-width: 100%;
}
td {
font-size: 0.8em;
}
.serh-grid {
overflow-x: auto;
display: block;
}
.text-padding {
padding: 0;
padding-left: 5px;
}
}
@media only screen and (max-width: 950px) {
.flex-table {
flex-direction: column;
}
.flex-table a {
width: 100%;
}
.life-jacket {
position: relative;
height: 80px;
width: 80px;
max-width: unset;
left: 50%;
top: -10px;
z-index: 5;
transform: translateX(-50%);
}
.lake-img img {
max-width: 100%;
}
.box-top-container {
flex-wrap: wrap;
}
.contact-info {
margin: auto;
}
.text-padding {
padding: 5px;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 105.52 80.94"><defs><style>.cls-1{fill:#DE1E2E;}.cls-2{fill:#fff;}</style></defs><title>usace-logo</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="105.52" height="80.94" rx="10.67" ry="10.67"/><path class="cls-2" d="M95.07,74.83H11A4.9,4.9,0,0,1,6.1,69.94V11A4.9,4.9,0,0,1,11,6.1H95.07A4.9,4.9,0,0,1,100,11v59A4.89,4.89,0,0,1,95.07,74.83ZM11,8.1A2.9,2.9,0,0,0,8.1,11v59A2.9,2.9,0,0,0,11,72.83H95.07A2.9,2.9,0,0,0,98,69.94V11A2.9,2.9,0,0,0,95.07,8.1Z"/><path class="cls-2" d="M84.5,52V26.42l4.12-4.12V16.42H83.69v4.33L80,20.68V16.42c0-.05-4.53,0-4.53,0v4.33H71.81V16.42c0-.06-4.87,0-4.87,0V22.3L71,26.42s.06,12.83.06,12.7-10.92,0-10.94,0,0-5.07,0-5.07l2.77-2.77V24.06c0-.14-4.12.06-4.39,0-.09,0,0,4.25,0,4.25H55.06V24.12H50.6a40.46,40.46,0,0,0,.07,4.12H46.82V24.12H42.49c-.13,0,0,7,0,7l3.11,3.11.07,4.86h-11V26.42l3.92-3.92V16.42H33.71v4.33l-3.78-.07V16.42H25.68s0,4.34,0,4.33-3.45-.07-3.78-.07V16.42s-4.93-.06-4.93,0v6.22l3.78,3.71V52.83s-3.92,3.85-3.92,4,.07,6.42.07,6.42H89V56.48ZM29.19,56.41h-3V45.74h3Zm.07-17.29h-3V28.45h3ZM41.08,53.23h-3V45.67h3ZM60.8,60.66H45.74V50.06s2.89-7.51,7.16-7.57l.13,0,.14-.15.17.17c4.65.38,7.46,7.53,7.46,7.53Zm7.29-7.36h-3V45.74h3Zm11.75,3.11h-3V45.74h3ZM80,37.9H77V27.23h3Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

View File

@ -0,0 +1,877 @@
html,
body,
span,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
b,
u,
i,
center,
form,
label,
legend,
footer,
header,
menu,
nav,
output,
summary {
margin: 0;
padding: 0;
border: 0;
/* font: inherit; */
vertical-align: baseline;
}
#headerFloat {
height: 45px;
z-index: 999;
}
.main-bar {
min-height: 45px;
background: black;
}
.header-float {
margin-left: auto;
margin-right: auto;
max-width: 1152px;
/* min-height: 28px;
height: 45px; */
display: flex;
}
.page-wrap {
margin-top: 25px;
margin-bottom: 200px;
margin: 0 auto;
max-width: 1152px;
background-color: white;
padding-top: 102px;
}
.sticky {
position: sticky;
top: 0;
width: 100%;
}
.sticky + .content {
padding-top: 102px;
}
#header {
position: relative;
}
.content {
padding: 16px;
}
.not-found {
font-size: 4vh;
font-weight: 700;
}
.search-bar {
margin: auto;
margin-right: 15px;
}
.search-bar i {
color: #ccc;
cursor: pointer;
font-size: 0.9em;
margin: auto;
padding: 5px;
margin-left: 0;
}
.search-bar input {
background: hsla(0,0%,100%,.2);
border: none;
color: #ccc;
font-size: 14px;
padding: 2px 8px;
width: 150px;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-ms-border-radius: 5px;
-o-border-radius: 5px;
}
.site-name {
font-weight: 700;
font-size: 14px;
margin-right: 8px;
margin-left: 115px;
float: left;
position: relative;
margin-top: 5px;
}
.site-area {
font-size: 14px;
float: left;
position: relative;
margin-top: 5px;
color: #212529;
font-family: Roboto, Arial, Helvetica, sans-serif;
}
.site-title {
background: rgb(215, 215, 215);
height: 32px;
}
.site-logo {
float: left;
position: absolute;
margin-left: 11px;
margin-top: 12px;
width: 65px;
height: 45px;
transition: all 0.2s ease-in-out;
}
.reg {
font-size: 11px;
position: relative;
color: lightslategray;
left: 81px;
top: 61px;
transition: all 0.2s ease-in-out;
}
.dropbtn {
display: inline-block;
cursor: pointer;
background-color: black;
color: #d0d0d0;
padding: 0 8px;
z-index: 3;
line-height: 45px;
font-weight: 600;
text-decoration: none;
font-size: 13.6px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
border: none;
}
.sub-menu {
background: #555555;
color: #d0d0d0;
font-family: "Open Sans", Arial, Helvetica, sans-serif;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.sub-header {
/* min-height: 28px; */
font-size: 1rem;
font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif;
min-width: 200px;
padding-right: 15px;
padding-left: 15px;
vertical-align: middle;
}
.options-block {
padding-top: 1vh;
}
.legend:hover {
background-color: gray;
}
.collapsible {
cursor: pointer;
/* padding: 18px; */
width: 100%;
border: none;
text-align: left;
font-size: 2em;
outline: none;
vertical-align: middle;
}
.burger-bar .active,
.burger-bar .collapsible:hover {
background-color: #555 !important;
color: white !important;
}
.collapsible:before {
display: inline-table;
white-space: nowrap;
content: "+";
color: black;
alt: "Click to Expand";
text-align: center;
vertical-align: middle;
font-weight: 700;
font-size: 3vh;
float: left;
margin-left: 1vw;
margin-right: 1vw;
}
.collapsible:hover:before {
color: white;
}
.content {
padding: 0 18px;
max-height: 0;
width: 100%;
overflow-x: hidden;
transition: max-height 0.2s ease-out;
background-color: #f1f1f1;
}
.sub-arrow-down {
display: inline-block;
width: 0;
height: 0;
margin-left: 0.255em;
vertical-align: 0.255em;
border-top: 0.3em solid;
border-right: 0.3em solid transparent;
border-left: 0.3em solid transparent;
}
.sub-arrow-up {
display: inline-block;
width: 0;
height: 0;
margin-left: 0.255em;
vertical-align: 0.255em;
border-bottom: 0.3em solid;
border-right: 0.3em solid transparent;
border-left: 0.3em solid transparent;
}
.mobile-hide {
display: inline-block;
}
#skin-footer-background {
background-color: #333;
padding-bottom: 68px;
padding-top: 32px;
}
/* Burger Bar */
.burger-bar {
position: sticky;
margin-right: 11px;
transition: all 0.2s ease-in-out;
right: 0;
top: 0;
display: none;
color: white;
font-size: 30px;
cursor: pointer;
}
.overlay {
height: 100%;
width: 0;
position: fixed;
z-index: 99;
top: 0;
right: 0;
overflow-x: hidden;
background-color: rgba(0, 0, 0, 0.9);
transition: 0.5s;
}
.overlay-content {
position: relative;
color: white;
top: 10%;
bottom: 0px;
left: 0px;
right: 0px;
width: 100%;
text-align: left;
z-index: 1;
}
.overlay a {
padding: 8px;
text-decoration: none;
font-size: 1.5em;
color: white;
transition: 0.3s;
display: block;
}
.overlay a:hover,
.overlay a:focus {
color: #f1f1f1;
}
.overlay .closebtn {
position: absolute;
top: 20px;
right: 45px;
/* font-size: 60px; */
font-size: 3em;
}
#mobileNavContent .home {
display: flex;
position: sticky;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.9);
border: 1px solid;
border-left: none;
border-right: none;
}
#mobileNavContent .home i {
margin: auto 0;
}
.closebtn:hover::before {
content: "";
}
.collapsible-mobile {
cursor: pointer;
padding: 5px;
width: 100%;
border: none;
text-align: left;
font-size: 1.5em;
outline: none;
vertical-align: middle;
margin-top: 0.5em;
}
.burger-bar .active,
.burger-bar .collapsible-mobile:hover,
.home a:first-of-type:hover {
background-color: #555 !important;
color: white !important;
}
.home a:last-of-type:hover {
color: red !important;
}
.collapsible-mobile:before {
display: inline-table;
white-space: nowrap;
content: "+";
color: white;
alt: "Click to Expand";
text-align: left;
vertical-align: middle;
font-weight: 700;
/* font-size: 3vh; */
margin-left: 1vw;
margin-right: 1vw;
padding-bottom: 4px;
}
.content-hide, .hide {
display: none;
}
.content-mobile {
border: 1px solid;
border-left: 5px solid gray;
padding: 0 18px;
width: 100%;
overflow: hidden;
transition: max-height 0.2s ease-out;
background-color: transparent;
}
.burger-bar .active:before {
content: "-";
alt: "Click to Contract";
color: white;
}
.site-logo:hover::before {
content: "";
}
.content-mobile a:hover::before {
/* content: "> "; */
color: white;
}
.content-mobile a:hover {
text-decoration: underline;
}
.home {
color: white;
}
/* Sub Menu */
.top-level-menu a
/* Apply to all links inside the multi-level menu */ {
display: flex;
font: bold 14px Arial, Helvetica, sans-serif;
color: #d0d0d0;
text-decoration: none;
padding: 0 8px;
/* Make the link cover the entire list item-container */
display: block;
cursor: pointer;
font-size: 13.6px;
font-weight: 600;
/* box-shadow: 0px 8px 16px 0px rgb(0 0 0 / 20%); */
border: none;
}
.top-level-menu li {
position: relative;
}
.top-level-menu ul {
border-right: 1px solid black;
border-top: 1px solid black;
}
.top-level-menu > li > a {
line-height: 45px;
}
.second-level-menu a:hover > i {
display: none;
}
.top-level-menu a:hover {
color: white;
}
.top-level-menu a i {
margin: auto;
margin-right: 0;
}
.top-level-menu {
list-style: none;
display: inline-block;
padding: 0;
color: #d0d0d0;
}
.top-level-menu > li {
position: relative;
float: left;
min-width: 50px;
}
.top-level-menu > li:hover {
background-color: rgb(121, 121, 121);
}
.top-level-menu li:hover > ul {
/* On hover, display the next level's menu */
/* display: inline; */
z-index: 99;
opacity: 1;
transition-delay: 0.2s;
visibility: visible;
}
.second-level-menu {
transition: 0s;
opacity: 0;
visibility: hidden;
position: absolute;
top: 45px;
left: 0;
min-width: 300px;
list-style: none;
padding: 0;
margin: 0;
border-top: none!important;
/* display: inline; */
/* visibility: hidden; */
}
.second-level-menu a {
display: flex;
}
.second-level-menu a i {
margin: auto;
margin-right: 0;
}
.second-level-menu > li > a {
line-height: 45px;
}
.second-level-menu > li {
position: relative;
/* padding-right: 50px; */
/* height: 45px; */
background: #555555;
border-bottom: 1px solid rgba(0, 0, 0, 0.3);
}
.second-level-menu > li:hover {
color: white;
background-color: rgb(121, 121, 121);
}
.third-level-menu {
position: absolute;
top: 0;
left: 100%;
font-size: 0.9rem;
/* min-width: 150px; */
width: 100%;
list-style: none;
padding: 0;
margin: 0;
/* display: inline; */
transition: 0s;
opacity: 0;
visibility: hidden;
}
.third-level-menu a i {
margin: auto;
margin-right: 0;
}
.third-level-menu > li {
/* padding-right: 150px; */
background: lightgray;
border-bottom: 1px solid black;
border-left: 2px solid black;
}
.third-level-menu a {
color: black;
display: flex;
font-size: 0.9em;
}
.third-level-menu > li > a {
line-height: 40px;
}
.third-level-menu > li:hover {
background-color: gray;
color: white;
}
.fourth-level-menu {
position: absolute;
top: 0;
left: 100%;
font-size: 0.9rem;
/* min-width: 150px; */
width: 100%;
list-style: none;
padding: 0;
margin: 0;
/* display: none; */
/* background-color: #ff6699; */
animation-fill-mode: forwards;
transition: 0s;
opacity: 0;
visibility: hidden;
/* display: inline; */
}
.fourth-level-menu a i {
margin: auto;
margin-right: 0;
}
.fourth-level-menu > li {
/* padding-right: 150px; */
background: lightgray;
border-bottom: 1px solid black;
border-left: 2px solid black;
}
.fourth-level-menu a {
display: flex;
font-size: 0.8em;
}
.fourth-level-menu > li > a {
line-height: 35px;
}
.fourth-level-menu > li:hover {
background-color: gray;
color: white;
}
@media only screen and (max-width: 1400px) {
.fourth-level-menu {
right: 100%;
left: unset;
}
}
.fifth-level-menu {
position: absolute;
top: 0;
left: 100%;
font-size: 0.9rem;
/* min-width: 150px; */
width: 75%;
list-style: none;
padding: 0;
margin: 0;
/* display: none; */
/* background-color: #ff6699; */
animation-fill-mode: forwards;
transition: 0s;
opacity: 0;
visibility: hidden;
/* display: inline; */
}
.fifth-level-menu a i {
margin: auto;
margin-right: 0;
}
.fifth-level-menu > li {
/* padding-right: 150px; */
background: lightgray;
border-bottom: 1px solid black;
border-left: 2px solid black;
}
.fifth-level-menu a {
display: flex;
font-size: 0.8em;
}
.fifth-level-menu > li > a {
line-height: 35px;
}
.fifth-level-menu > li:hover {
background-color: gray;
color: white;
}
@media only screen and (max-width: 1400px) {
.fifth-level-menu {
left: 100%;
right: unset;
}
}
/* Menu Link Styles */
/* Mobile Settings */
@media only screen and (max-width: 950px) {
.burger-bar {
display: inline-block;
}
.overlay a {
/* font-size: 20px; */
}
.overlay .closebtn {
font-size: 2em;
top: -5px;
right: 5px;
}
.page-title {
font-size: 16pt;
}
.page-wrap {
margin-top: 2vw;
/*padding-top: 70px;*/
}
#desktop-menu {
display: none;
}
.divider {
display: none;
}
.site-logo {
float: left;
position: absolute;
margin-top: 5px;
margin-left: 15px;
width: 45px;
height: 23px;
}
.reg {
left: 61px;
top: 32px;
}
.sub-header {
/* height: 70px; */
margin-bottom: 30px;
color: #e5e1e1;
background: rgba(51, 51, 51, 0.95);
width: 100%;
padding: 5px;
}
.site-area {
display: block;
margin-left: 0;
font-size: 1em;
margin-left: 5px;
color: #e5e1e1;
}
.site-name {
display: block;
font-size: 1em;
margin-left: 5px;
}
.options-block {
display: block;
}
.mobile-hide {
display: none;
}
.collapsible {
width: 100% !important;
height: 3vh !important;
text-align: left !important;
}
.collapsible:before {
margin-left: 0.5vw;
margin-right: 2vw;
text-align: match-parent;
vertical-align: middle;
}
}
#page-container #skip-link-holder a {
height: 30px;
display: block;
width: 100%;
position: fixed;
top: -30px;
left: 0;
z-index: 10001;
color: #fff;
background: #de1e2e;
opacity: 0.9;
border-bottom: 0;
-webkit-box-shadow: 0 2px 5px rgb(0 0 0 / 50%);
box-shadow: 0 2px 5px rgb(0 0 0 / 50%);
line-height: 30px;
padding: 0 8px;
}
#page-container #skip-link-holder a:active,
#page-container #skip-link-holder a:focus {
left: 0;
top: 0;
z-index: 10000;
}
/* Styles the return to top button */
#returnTop {
display: none;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border: none;
outline: none;
background-color: red;
color: white;
cursor: pointer;
padding: 15px;
border-radius: 4px;
}
#returnTop:hover {
background-color: #555;
}
/* Page CSS overrides */
*,
::after,
::before {
box-sizing: border-box;
}
.container-fluid,
.page-container {
position: relative;
}
.slideshow-title {
display: flex;
background: lightgray;
width: 100%;
justify-content: center;
padding: 5px;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border: 1px solid black;
}
.container-fluid {
width: 100%;
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
.page-content {
display: flex;
flex-wrap: wrap;
}
.box-usace {
margin: 0 0 32px;
position: relative;
}
.inline-logo {
margin: auto 5px;
width: 22px;
height: 18px;
}
@media only print {
#header {
display: none!important;
}
/* iframe {
display: none;
} */
#footer {
display: none!important;
}
}

View File

@ -0,0 +1,329 @@
.side-menu {
display: flex;
}
/* ================== */
/* Box Header Content */
.box-usace .box-header-striped {
font-size: 20.8px;
font-size: 1.3rem;
font-weight: 700;
line-height: 22.4px;
line-height: 1.4rem;
margin-bottom: 0;
z-index: 3;
}
.box-usace .box-header-striped {
font-size: 20.8px;
font-size: 1.3rem;
font-weight: 700;
line-height: 22.4px;
line-height: 1.4rem;
margin-bottom: 0;
z-index: 3;
}
.box-usace .box-header-striped:before {
content: " ";
display: block;
width: 100%;
height: 25px;
margin-bottom: -12px;
background-color: #ededed;
}
.box-usace .box-header-striped:after {
content: " ";
display: block;
position: absolute;
width: 50px;
height: 5px;
top: 0;
left: 0;
background-color: #de1e2e;
z-index: 2;
}
.title {
/*font-family: Roboto, Arial, Helvetica, sans-serif;*/
font-family: Verdana, Arial, Helvetica, sans-serif;
}
.backend-cp-collapsible,
.backend-cp-fixed {
overflow-x: auto;
overflow-y: hidden;
}
/* END Box Header Content */
/* ====================== */
/* MENU CONTENT */
#leftPane {
overflow: visible;
}
.box-usace .box-content {
display: flex;
flex-direction: column;
padding: 16px 0 0;
margin: 0;
}
.acAccordionMenu {
/*font: 16px Arial, Hevetica, Sans-Serif;*/
font: 16px Verdana, Hevetica, Sans-Serif;
list-style: none;
margin: 0;
padding-inline-start: 0;
}
.acResponsive .usaceAccordionMenuListItem {
border-bottom: 1px solid #efefef;
}
.acAccordionMenu li {
list-style: none;
line-height: 20px;
}
.acResponsive a:hover,
.acResponsive span:hover {
font-weight: bold;
}
.usaceAccordionMenuListItem {
position: relative;
}
.usaceAccordionMenuListItem div.lvl0 a {
text-decoration: none;
}
.acResponsive .listItem a,
.acResponsive .listItem span {
padding: 10px 10px 10px 15px !important;
display: block;
}
div.listItem a {
color: #333;
}
.col-md,
.col-md-3 {
position: relative;
width: 100%;
padding-right: 15px;
padding-left: 15px;
}
/* Mobile Content */
@media (min-width: 768px) {
.col-md-3 {
-ms-flex: 0 0 25%;
flex: 0 0 25%;
}
.col-md {
-ms-flex-preferred-size: 0;
flex-basis: 0;
-ms-flex-positive: 1;
flex-grow: 1;
max-width: 100%;
}
}
/* .listItemSub.lvl1 {
margin-left: 5%;
}
.listItemSub .listItem {
position: relative;
}
.listItemSub .listItem::before {
content: "+";
font-size: 1.5em;
margin-right: 5px;
position: absolute;
display: block;
top: 50%;
-webkit-transform: translateY(-55%);
-moz-transform: translateY(-55%);
-ms-transform: translateY(-55%);
transform: translateY(-55%);
border-bottom: none;
} */
.sidebar-container {
display: relative;
z-index: 999;
cursor: pointer;
/* font-weight: bold; */
/*font-family: Arial, Helvetica, sans-serif;*/
font-family: Verdana, Helvetica, sans-serif;
}
.sidebar-container .fa-caret-right {
margin-left: auto;
}
.sidebar-container a {
text-decoration: none;
padding: 10px 10px 10px 15px !important;
color: black;
/* display: block; */
}
.sidebar-container li {
border-bottom: solid 1px;
}
.sidebar-container a:hover {
color: white;
}
.sidebar-container li > a {
display: flex;
align-items: center;
/* transition: 0.3s; */
}
/* .sb-m2 {
position: absolute;
top: 50%;
left: 100%;
min-width: 150px;
list-style: none;
padding: 0;
margin: 0;
display: none;
}
.sb-m2>li {
height: 45px;
background: rgba(255, 255, 255, 0.95);
padding-right: 15px;
} */
.sb-main-menu {
list-style: none;
/* display: inline-block; */
padding: 0;
/* color: #d0d0d0; */
}
/* .sub-menu:after {
} */
.sb-main-menu > li {
position: relative;
line-height: 15px;
min-width: 50px;
}
/* Active display for all elements on hover within top level menu */
.sb-main-menu li:hover {
/* display: block;
color: green; */
background: gray;
color: white;
/* font-weight: 800; */
}
.sb-sub-menu {
border: 1px solid black;
position: absolute;
top: 0;
left: 100%;
min-width: 300px;
list-style: none;
padding: 0;
margin: 0;
display: none;
}
.sb-sub-menu > li {
position: relative;
line-height: 15px;
min-width: 50px;
background: rgba(255, 255, 255, 0.95);
border-bottom: 1px solid rgba(0, 0, 0, 0.3);
color: black;
}
.sb-main-menu li:hover > ul {
display: inline;
z-index: 99;
}
.sb-main-menu:nth-child(3) {
bottom: 0;
}
/* sidebar menu 0 */
/* .sb-m0>li {
position: relative;
float: left;
height: 45px;
min-width: 50px;
} */
/***** Sidebar Jump Menu - START ******/
.ac-hide {
display: none;
}
@media screen and (max-width: 768px) {
.ac-show-mobile-only {
display: block;
}
/* Facility Closure Report CSS OVERRIDE */
.header-grid > th {
font-size: 0.5em;
font-weight: 500;
}
}
@media screen and (min-width: 768px) {
.ac-hide-mobile-only {
display: block !important;
}
}
.ac-jump-menu {
max-width: 100%;
min-width: 100%;
text-overflow: ellipsis;
}
.ac-jump-menu-header {
font-weight: bold;
margin: 10px 0;
}
.ac-jump-menu-warning,
.ac-jump-menu-success {
display: none;
margin: 10px 0;
}
.ac-jump-menu-success i.fa-spin {
margin: 0 10px 0 0;
}
.ac-jump-menu .ac-main-menu {
font-weight: 800;
font-size: 1.1rem;
}
.ac-jump-menu .ac-sbm1 {
font-weight: 700;
font-size: 1rem;
}
.ac-jump-menu .ac-sbm2 {
font-size: 0.9rem;
}
/***** Jump Menu - END ******/
@media only print {
#sidebar {
display: none;
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 123.57 164.41"><defs><style>.cls-1{fill:#231f20;}.cls-1,.cls-2,.cls-3{fill-rule:evenodd;}.cls-2{fill:#f3c41d;}.cls-3{fill:#fff;}</style></defs><title>army-logo-color</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M120.6,3a9.82,9.82,0,0,0-7.21-3H10.23A9.74,9.74,0,0,0,3,3a9.74,9.74,0,0,0-3,7.21v97a9.74,9.74,0,0,0,3,7.21,9.7,9.7,0,0,0,7.21,3H113.39a10.14,10.14,0,0,0,10.18-10.18v-97a9.7,9.7,0,0,0-3-7.21Z"/><path class="cls-2" d="M120.35,10.23a6.88,6.88,0,0,0-2.07-4.94,6.55,6.55,0,0,0-4.89-2H10.23a6.66,6.66,0,0,0-4.94,2,6.82,6.82,0,0,0-2,4.94v97a6.74,6.74,0,0,0,2,4.94,6.66,6.66,0,0,0,4.94,2H113.39a6.55,6.55,0,0,0,4.89-2,6.79,6.79,0,0,0,2.07-4.94v-97Z"/><path class="cls-1" d="M116,7.61a3.72,3.72,0,0,0-2.62-1.06H10.23A3.66,3.66,0,0,0,7.61,7.61,3.7,3.7,0,0,0,6.5,10.23v97a3.7,3.7,0,0,0,1.11,2.62,3.66,3.66,0,0,0,2.62,1.06H113.39a3.72,3.72,0,0,0,2.62-1.06,3.62,3.62,0,0,0,1.06-2.62v-97A3.62,3.62,0,0,0,116,7.61Z"/><polygon class="cls-2" points="109.5 47.24 74.16 47.24 63.17 13.87 51.98 47.24 16.34 47.24 45.48 67.76 34.59 101.19 63.02 80.82 91.96 101.69 81.27 67.41 109.5 47.24 109.5 47.24"/><polygon class="cls-1" points="97.81 50.57 71.34 50.57 63.12 25.56 54.75 50.57 28.03 50.57 49.81 65.94 41.7 90.95 63.02 75.73 84.65 91.36 76.68 65.69 97.81 50.57 97.81 50.57"/><polygon class="cls-3" points="73.25 64.94 89.24 53.54 69.27 53.54 63.07 34.69 56.77 53.54 36.6 53.54 53.04 65.14 46.94 83.99 62.97 72.5 79.31 84.3 73.25 64.94 73.25 64.94"/><path class="cls-1" d="M10.23,120.55a9.7,9.7,0,0,0-7.21,3,9.74,9.74,0,0,0-3,7.21v23.44a9.68,9.68,0,0,0,3,7.16,9.71,9.71,0,0,0,7.21,3H113.39a9.79,9.79,0,0,0,7.21-3,9.63,9.63,0,0,0,3-7.16V130.78a10.23,10.23,0,0,0-10.18-10.23Z"/><path class="cls-2" d="M5.29,125.84a6.74,6.74,0,0,0-2,4.94v23.44a6.65,6.65,0,0,0,2,4.9,6.66,6.66,0,0,0,4.94,2H113.39a6.55,6.55,0,0,0,4.89-2,6.7,6.7,0,0,0,2.07-4.9V130.78a6.79,6.79,0,0,0-2.07-4.94,6.56,6.56,0,0,0-4.89-2H10.23a6.67,6.67,0,0,0-4.94,2Z"/><path class="cls-1" d="M10.23,127.1a3.62,3.62,0,0,0-2.62,1.06,3.69,3.69,0,0,0-1.11,2.62v23.44a3.6,3.6,0,0,0,1.11,2.58,3.51,3.51,0,0,0,2.62,1.11H113.39A3.57,3.57,0,0,0,116,156.8a3.51,3.51,0,0,0,1.06-2.58V130.78a3.6,3.6,0,0,0-1.06-2.62,3.68,3.68,0,0,0-2.62-1.06Z"/><path class="cls-3" d="M78.75,140.92v-5.3l-3.12-2.92h-8V153h4.64v-8.11h2V153h4.54v-8.11l-2.37-2,2.37-2ZM14,132.7V150l3.12,3h5.25l3-3V132.7H20.72v16.43h-2V132.7Zm60.19,3.78v4.59h-2v-4.59Zm21.43-3.78H90.15l-1.52,9.78h-.4l-1.66-9.78H81.12V153h4.24V140.11h.2l2,12.85h1.72l2-12.85h.21V153h4.23V132.7Zm8.27,7.31h0l-1.66-7.31H97.56l4,11.74V153h4.69v-8.52l4-11.74h-4.64L103.91,140ZM31.66,153V149H27V153ZM46.48,149V153h4.64V149Zm-1.61-13.41-3.28-2.92H36.65l-3,2.92v6.1l3.22,2.93,3.33.25v4.23H38.27v-2.67H33.63V150l3,3H41.8l3.07-3v-6.15l-3.18-2.92-3.42-.31v-4.13h1.91v2.72h4.69v-3.58Zm17.85-2.92H56L53.14,153h4.54l.4-3.78h2.67l.41,3.78h4.53l-3-20.26Zm-4.34,12.7.71-8.42h.45l.86,8.42Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,52 @@
/* #breadcrumbs {
font-size: 18px;
margin: auto 15px;
padding: 20px 0 20px;
color: #ddd;
font-family: "Font Awesome 5 Free";
}
.skin-breadcrumb {
color: #06c;
font-weight: 900;
} */
#breadcrumbs {
display: flex;
flex-shrink: 1;
flex-wrap: wrap;
font-size: 1.2rem;
margin: auto 15px;
padding-bottom: 10px;
color: #ddd;
/* font-family: "Font Awesome 5 Free"; */
font-family: Verdana, Geneva, Tahoma, sans-serif;
z-index: -1;
}
.breadcrumb-link {
color: #06c;
text-decoration: none;
font-weight: 900;
}
.breadcrumb-link:not(:first-child):before,
.breadcrumb-current:before {
content: "/";
margin: 0 5px;
color: black;
text-decoration: none;
}
.breadcrumb-current {
color: #999;
}
@media (max-width: 768px) {
#breadcrumbs {
padding: 10px 0;
}
}
@media only print {
#breadcrumbs {
display: none !important;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,193 @@
/* Lakepage Styles */
html,
body {
font-family: Verdana, sans-serif;
font-size: 15px;
line-height: 1.5;
height: unset!important;
}
.rightpanel_wrapper {
font-size: 12px;
line-height: 1.4;
}
.rightpanel_wrapper p {
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0px;
margin-inline-end: 0px;
}
.lake-img {
margin: auto 0;
text-align: center;
}
.lake-img.logo {
padding: 0;
text-align: left;
}
.lake-img img {
max-width: 65%;
border: 2px solid black;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-ms-border-radius: 5px;
-o-border-radius: 5px;
}
.lake-img.logo img {
border: unset;
}
.text-padding {
padding: 0 10px;
}
.box-top-container {
display: flex;
padding-bottom: 20px;
}
.box-header-striped {
margin-bottom: 5px!important;
}
.box-content-border {
border: 1px solid black;
box-shadow: 1px 1px black;
border-top: none;
overflow-x: auto;
background-color:white;
margin:auto
}
.box-content-border table {
min-width: 500px;
}
.box-content img {
margin-left: 0;
margin-right: 0;
}
#contentTable {
table-layout: fixed;
}
td {
/* overflow: hidden; */
font-size: 1em;
text-overflow: ellipse;
word-wrap: normal;
}
h1,
h2,
h3,
h4,
h5,
h6 {
/* font-family: Arial, Helvetica, sans-serif; */
}
a {
color: inherit;
background-color: transparent;
}
hr {
border: solid 1px black;
width: 96%;
color: #FFFF00;
height: 1px;
}
.box-usace p {
margin-bottom: 32px;
}
.box-container-item {
display: flex;
flex-direction: column;
width: 100%;
}
.life-jacket {
position: fixed;
max-width: 5vw;
height: auto;
width: 25%;
right: 2%;
top: 100px;
z-index: 5;
}
.iframe-map {
width: 100%;
height: 50vh;
}
/* Style rows to shrink with page */
.flex-table {
display: flex;
gap: 10px;
column-gap: 20px;
flex-wrap: wrap;
flex-shrink: 3;
}
.flex-table a {
width: 25%;
word-break: unset;
}
@media only screen and (max-width: 480px) {
/* Make sure the links don't create a scroll */
.text-padding a {
word-break: break-word;
}
.lake-img img {
max-width: 100%;
}
td {
font-size: 0.8em;
}
.serh-grid {
overflow-x: auto;
display: block;
}
.text-padding {
padding: 0;
padding-left: 5px;
}
}
@media only screen and (max-width: 950px) {
.flex-table {
flex-direction: column;
}
.flex-table a {
width: 100%;
}
.life-jacket {
position: relative;
height: 80px;
width: 80px;
max-width: unset;
left: 50%;
top: -10px;
z-index: 5;
transform: translateX(-50%);
}
.lake-img img {
max-width: 100%;
}
.box-top-container {
flex-wrap: wrap;
}
.contact-info {
margin: auto;
}
.text-padding {
padding: 5px;
}
}

View File

@ -0,0 +1,35 @@
//========================================================================
//
// Handle Top Button for returning to top of page
//
//========================================================================
// When the user clicks on the button, scroll to the top of the document
function toTopFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
const toTopBtn = document.getElementById("returnTop");
// Add the button handlers if the user has the element ID in their page
if (toTopBtn) {
toTopBtn.onclick = function () {
toTopFunction();
};
function onScroll() {
if (
// User scrolls more than 50pixels, show the button
document.body.scrollTop > 50 ||
document.documentElement.scrollTop > 50
) {
// Toggle button visibility
document.getElementById("returnTop").style.display = "block";
} else {
document.getElementById("returnTop").style.display = "none";
}
}
// Trigger the scroll function when the user scrolls in the window
window.onscroll = function () {
onScroll();
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 105.52 80.94"><defs><style>.cls-1{fill:#DE1E2E;}.cls-2{fill:#fff;}</style></defs><title>usace-logo</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="105.52" height="80.94" rx="10.67" ry="10.67"/><path class="cls-2" d="M95.07,74.83H11A4.9,4.9,0,0,1,6.1,69.94V11A4.9,4.9,0,0,1,11,6.1H95.07A4.9,4.9,0,0,1,100,11v59A4.89,4.89,0,0,1,95.07,74.83ZM11,8.1A2.9,2.9,0,0,0,8.1,11v59A2.9,2.9,0,0,0,11,72.83H95.07A2.9,2.9,0,0,0,98,69.94V11A2.9,2.9,0,0,0,95.07,8.1Z"/><path class="cls-2" d="M84.5,52V26.42l4.12-4.12V16.42H83.69v4.33L80,20.68V16.42c0-.05-4.53,0-4.53,0v4.33H71.81V16.42c0-.06-4.87,0-4.87,0V22.3L71,26.42s.06,12.83.06,12.7-10.92,0-10.94,0,0-5.07,0-5.07l2.77-2.77V24.06c0-.14-4.12.06-4.39,0-.09,0,0,4.25,0,4.25H55.06V24.12H50.6a40.46,40.46,0,0,0,.07,4.12H46.82V24.12H42.49c-.13,0,0,7,0,7l3.11,3.11.07,4.86h-11V26.42l3.92-3.92V16.42H33.71v4.33l-3.78-.07V16.42H25.68s0,4.34,0,4.33-3.45-.07-3.78-.07V16.42s-4.93-.06-4.93,0v6.22l3.78,3.71V52.83s-3.92,3.85-3.92,4,.07,6.42.07,6.42H89V56.48ZM29.19,56.41h-3V45.74h3Zm.07-17.29h-3V28.45h3ZM41.08,53.23h-3V45.67h3ZM60.8,60.66H45.74V50.06s2.89-7.51,7.16-7.57l.13,0,.14-.15.17.17c4.65.38,7.46,7.53,7.46,7.53Zm7.29-7.36h-3V45.74h3Zm11.75,3.11h-3V45.74h3ZM80,37.9H77V27.23h3Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,319 @@
{
"@context": [
"https://geojson.org/geojson-ld/geojson-context.jsonld",
{
"@version": "1.1",
"wx": "https://api.weather.gov/ontology#",
"geo": "http://www.opengis.net/ont/geosparql#",
"unit": "http://codes.wmo.int/common/unit/",
"@vocab": "https://api.weather.gov/ontology#"
}
],
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-98.267787900000002,
29.8850555
],
[
-98.267787900000002,
29.862304600000002
],
[
-98.241550400000008,
29.862304600000002
],
[
-98.241550400000008,
29.8850555
],
[
-98.267787900000002,
29.8850555
]
]
]
},
"properties": {
"units": "us",
"forecastGenerator": "BaselineForecastGenerator",
"generatedAt": "2024-07-07T22:38:49+00:00",
"updateTime": "2024-07-07T21:42:37+00:00",
"validTimes": "2024-07-07T15:00:00+00:00/P7DT13H",
"elevation": {
"unitCode": "wmoUnit:m",
"value": 284.0736
},
"periods": [
{
"number": 1,
"name": "This Afternoon",
"startTime": "2024-07-07T17:00:00-05:00",
"endTime": "2024-07-07T18:00:00-05:00",
"isDaytime": true,
"temperature": 96,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": null
},
"windSpeed": "10 mph",
"windDirection": "E",
"icon": "/icons/land/day/sct?size=medium",
"shortForecast": "Mostly Sunny",
"detailedForecast": "Mostly sunny, with a high near 96. Heat index values as high as 103. East wind around 10 mph."
},
{
"number": 2,
"name": "Tonight",
"startTime": "2024-07-07T18:00:00-05:00",
"endTime": "2024-07-08T06:00:00-05:00",
"isDaytime": false,
"temperature": 77,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": null
},
"windSpeed": "5 to 10 mph",
"windDirection": "NE",
"icon": "/icons/land/night/sct?size=medium",
"shortForecast": "Partly Cloudy",
"detailedForecast": "Partly cloudy, with a low around 77. Heat index values as high as 101. Northeast wind 5 to 10 mph."
},
{
"number": 3,
"name": "Monday",
"startTime": "2024-07-08T06:00:00-05:00",
"endTime": "2024-07-08T18:00:00-05:00",
"isDaytime": true,
"temperature": 92,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 30
},
"windSpeed": "10 to 15 mph",
"windDirection": "N",
"icon": "/icons/land/day/tsra_hi,30/tsra_hi,20?size=medium",
"shortForecast": "Slight Chance Showers And Thunderstorms",
"detailedForecast": "A chance of rain showers between 7am and 10am, then a slight chance of showers and thunderstorms. Partly sunny, with a high near 92. Heat index values as high as 101. North wind 10 to 15 mph, with gusts as high as 25 mph. Chance of precipitation is 30%. New rainfall amounts less than a tenth of an inch possible."
},
{
"number": 4,
"name": "Monday Night",
"startTime": "2024-07-08T18:00:00-05:00",
"endTime": "2024-07-09T06:00:00-05:00",
"isDaytime": false,
"temperature": 74,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 20
},
"windSpeed": "5 to 10 mph",
"windDirection": "NE",
"icon": "/icons/land/night/tsra_hi,20/few?size=medium",
"shortForecast": "Slight Chance Showers And Thunderstorms then Mostly Clear",
"detailedForecast": "A slight chance of showers and thunderstorms before 7pm. Mostly clear, with a low around 74. Northeast wind 5 to 10 mph, with gusts as high as 25 mph. Chance of precipitation is 20%."
},
{
"number": 5,
"name": "Tuesday",
"startTime": "2024-07-09T06:00:00-05:00",
"endTime": "2024-07-09T18:00:00-05:00",
"isDaytime": true,
"temperature": 94,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 20
},
"windSpeed": "5 mph",
"windDirection": "N",
"icon": "/icons/land/day/sct/tsra_hi,20?size=medium",
"shortForecast": "Mostly Sunny then Slight Chance Showers And Thunderstorms",
"detailedForecast": "A slight chance of showers and thunderstorms after 1pm. Mostly sunny, with a high near 94. North wind around 5 mph. Chance of precipitation is 20%."
},
{
"number": 6,
"name": "Tuesday Night",
"startTime": "2024-07-09T18:00:00-05:00",
"endTime": "2024-07-10T06:00:00-05:00",
"isDaytime": false,
"temperature": 75,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 20
},
"windSpeed": "0 to 5 mph",
"windDirection": "SSE",
"icon": "/icons/land/night/tsra_hi,20?size=medium",
"shortForecast": "Slight Chance Showers And Thunderstorms",
"detailedForecast": "A slight chance of showers and thunderstorms. Partly cloudy, with a low around 75. South southeast wind 0 to 5 mph. Chance of precipitation is 20%."
},
{
"number": 7,
"name": "Wednesday",
"startTime": "2024-07-10T06:00:00-05:00",
"endTime": "2024-07-10T18:00:00-05:00",
"isDaytime": true,
"temperature": 94,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 40
},
"windSpeed": "0 to 5 mph",
"windDirection": "S",
"icon": "/icons/land/day/tsra_hi,20/tsra_hi,40?size=medium",
"shortForecast": "Chance Showers And Thunderstorms",
"detailedForecast": "A chance of showers and thunderstorms. Mostly sunny, with a high near 94. South wind 0 to 5 mph. Chance of precipitation is 40%."
},
{
"number": 8,
"name": "Wednesday Night",
"startTime": "2024-07-10T18:00:00-05:00",
"endTime": "2024-07-11T06:00:00-05:00",
"isDaytime": false,
"temperature": 73,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 40
},
"windSpeed": "0 to 5 mph",
"windDirection": "S",
"icon": "/icons/land/night/tsra_hi,40/sct?size=medium",
"shortForecast": "Chance Showers And Thunderstorms then Partly Cloudy",
"detailedForecast": "A chance of showers and thunderstorms before 7pm. Partly cloudy, with a low around 73. South wind 0 to 5 mph. Chance of precipitation is 40%."
},
{
"number": 9,
"name": "Thursday",
"startTime": "2024-07-11T06:00:00-05:00",
"endTime": "2024-07-11T18:00:00-05:00",
"isDaytime": true,
"temperature": 92,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 30
},
"windSpeed": "0 to 5 mph",
"windDirection": "S",
"icon": "/icons/land/day/bkn/tsra_hi,30?size=medium",
"shortForecast": "Partly Sunny then Chance Showers And Thunderstorms",
"detailedForecast": "A chance of showers and thunderstorms after 1pm. Partly sunny, with a high near 92. South wind 0 to 5 mph. Chance of precipitation is 30%."
},
{
"number": 10,
"name": "Thursday Night",
"startTime": "2024-07-11T18:00:00-05:00",
"endTime": "2024-07-12T06:00:00-05:00",
"isDaytime": false,
"temperature": 74,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 30
},
"windSpeed": "0 to 5 mph",
"windDirection": "SSE",
"icon": "/icons/land/night/tsra_hi,30/bkn?size=medium",
"shortForecast": "Chance Showers And Thunderstorms then Mostly Cloudy",
"detailedForecast": "A chance of showers and thunderstorms before 7pm. Mostly cloudy, with a low around 74. Chance of precipitation is 30%."
},
{
"number": 11,
"name": "Friday",
"startTime": "2024-07-12T06:00:00-05:00",
"endTime": "2024-07-12T18:00:00-05:00",
"isDaytime": true,
"temperature": 94,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 20
},
"windSpeed": "0 to 10 mph",
"windDirection": "SSE",
"icon": "/icons/land/day/sct/tsra_hi,20?size=medium",
"shortForecast": "Mostly Sunny then Slight Chance Showers And Thunderstorms",
"detailedForecast": "A slight chance of showers and thunderstorms after 1pm. Mostly sunny, with a high near 94. Chance of precipitation is 20%."
},
{
"number": 12,
"name": "Friday Night",
"startTime": "2024-07-12T18:00:00-05:00",
"endTime": "2024-07-13T06:00:00-05:00",
"isDaytime": false,
"temperature": 75,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 20
},
"windSpeed": "0 to 10 mph",
"windDirection": "SSE",
"icon": "/icons/land/night/tsra_hi,20/sct?size=medium",
"shortForecast": "Slight Chance Showers And Thunderstorms then Partly Cloudy",
"detailedForecast": "A slight chance of showers and thunderstorms before 7pm. Partly cloudy, with a low around 75. Chance of precipitation is 20%."
},
{
"number": 13,
"name": "Saturday",
"startTime": "2024-07-13T06:00:00-05:00",
"endTime": "2024-07-13T18:00:00-05:00",
"isDaytime": true,
"temperature": 96,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": null
},
"windSpeed": "0 to 10 mph",
"windDirection": "SSE",
"icon": "/icons/land/day/sct?size=medium",
"shortForecast": "Mostly Sunny",
"detailedForecast": "Mostly sunny, with a high near 96."
},
{
"number": 14,
"name": "Saturday Night",
"startTime": "2024-07-13T18:00:00-05:00",
"endTime": "2024-07-14T06:00:00-05:00",
"isDaytime": false,
"temperature": 75,
"temperatureUnit": "F",
"temperatureTrend": "",
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": null
},
"windSpeed": "0 to 10 mph",
"windDirection": "SSE",
"icon": "/icons/land/night/sct?size=medium",
"shortForecast": "Partly Cloudy",
"detailedForecast": "Partly cloudy, with a low around 75."
}
]
}
}

168
LakeWatch/PDCD/Layout.uml Normal file
View File

@ -0,0 +1,168 @@
@startuml
skinparam classAttributeIconSize 0
enum BoatRampStatus<Model> {
OPEN
CLOSED
UNKNOWN
}
skinparam classAttributeIconSize 0
class BoatRampData<Model> {
-name: String
-status: BoatRampStatus
-openTimes: ZonedDateTime
-address: String
-operator: String
-lastUpdated: ZonedDateTime
-imageUrl: String
+<<constructor>> BoatRampData(name: String, status: BoatRampStatus, openTimes, ZonedDateTime, address: String, operator: String, lastUpdated: ZonedDateTime, imageUrl: String)
+_loadBoatRampData(): ArrayList<BoatRampData>
+saveBoatRampData()
+toString(): String
+getName(): String
+setName(newName: String)
+getStatus(): BoatRampStatus
+setStatus(newStatus: BoatRampStatus)
+getOpenTimes(): ZonedDateTime
+setOpenTimes(time: ZonedDateTime)
+getAddress(): String
+setAddress(newAddress: String)
+getOperator(): String
+setOperator(newOperator: String)
+getLastUpdated(): ZonedDateTime
+setLastUpdated(newLastUpdatedTime: ZonedDateTime)
+getImageUrl(): String
+setImageUrl(newImageUrl: String)
}
skinparam classAttributeIconSize 0
class BoatRampActivity<Controller> {
#onCreate(savedInstanceState: Bundle)
}
skinparam classAttributeIconSize 0
class MainRampMenuActivity<Controller> {
-allRampData: ArrayList<BoatRampData>
#onCreate(savedInstanceState: Bundle)
-launchBoatRampActivity()
}
skinparam classAttributeIconSize 0
class WaterLevelData<Model> {
-date: Date
-waterLevel: double
-surfaceArea: double
-reservoirStorage: int
-conservationStorage: int
-percentFull: double
-conservationCapacity: int
-deadPoolCapacity: int
+<<constructor>>WaterLevelData(date: Date, level: double, isCurrent: boolean)
+_loadWaterLevelData(): ArrayList<WaterLevelData>
+saveWaterLevelData()
+toString(): String
+getDate(): String
+setDate(newDate: Date)
+getWaterLevel(): double
+setWaterLevel(newLevel: double)
+getSurfaceArea(): double
+setSurfaceArea(newSurfaceArea: double)
+getReservoirStorage(): int
+setReservoirStorage(newReservoirStorage: int)
+getConservationStorage(): int
+setConservationStorage(newConservationStorage: int)
+getPercentFull(): double
+setPercentFull(newPercentFull: double)
+getConservationCapacity(): int
+setConservationCapacity(newConservationCapacity: int)
+getDeadPoolCapacity(): int
+setDeadPoolCapacity(newDeadPoolCapacity: int)
}
skinparam classAttributeIconSize 0
class WaterLevelActivity<Controller> {
#onCreate(savedInstanceState: Bundle)
}
skinparam classAttributeIconSize 0
class MainMenuActivity<Controller> {
#onCreate(savedInstanceState: Bundle)
-launchMainRampMenuActivity()
-launchWaterLevelActivity()
-launchSettingsActivity()
-launchWeatherActivity()
}
skinparam classAttributeIconSize 0
class SettingsActivity<Controller> {
#onCreate(savedInstanceState: Bundle)
-toggleLightMode()
-forceDataFetch()
-clearCache()
}
skinparam classAttributeIconSize 0
class SettingsData<Model> {
-isLightModeEnabled: boolean
+<<contructor>>SettingsData(isLightModeEnabled: boolean)
+_loadSettingsData(): SettingsData
+saveSettingsData()
+toString(): String
+getLightModeState(): boolean
+setLightModeState(lightModeEnabled: boolean)
}
skinparam classAttributeIconSize 0
class WeatherActivity<Controller> {
#onCreate(savedInstanceState: Bundle)
}
skinparam classAttributeIconSize 0
class WeatherData<Model> {
-weatherDescriptor: String
-tempHigh: int
-tempLow: int
-windSpeed: int
-gustSpeed: int
-windDirection: String
-chancePrecipitation: int
-amountPrecipitation: double
+<<constructor>> WeatherData(weatherDescriptor: String, tempHigh: int, tempLow: int, windSpeed: int, gustSpeed: int, windDirection: String, chancePrecipitation: int, amountPrecipitation: double):
+_loadWeatherData(): WeatherData
+saveWeatherData()
+toString(): String
+getWeatherDescriptor(): String
+setWeatherDescriptor(weatherDescriptor: String)
+getTempHigh(): int
+setTempHigh(tempHigh: int)
+getTempLow(): int
+setTempLow(tempLow: int)
+getWindSpeed(): int
+setWindSpeed(windSpeed: int)
+getGustSpeed(): int
+setGustSpeed(gustSpeed: int)
+getWindDirection(): String
+setWindDirection(windDirection: String):
+getChancePrecipitation(): int
+setChancePrecipitation(chancePrecipitation: int)
+getAmountPrecipitation(): double
+setAmountPrecipitation(amountPrecipitation: double)
}
SettingsActivity ..> SettingsData
SettingsActivity <.u. MainMenuActivity
WeatherActivity ..> WeatherData
WeatherActivity <.u. MainMenuActivity
BoatRampActivity ..> BoatRampData
MainRampMenuActivity *-- BoatRampData
MainRampMenuActivity <.u. MainMenuActivity
MainRampMenuActivity ..> BoatRampActivity
WaterLevelActivity ..> WaterLevelData
WaterLevelActivity <.u. MainMenuActivity
BoatRampData *-- BoatRampStatus
@enduml