diff --git a/findex/_targets.R b/findex/_targets.R index 4d9fc2f5fc30fb7b91b11366f39152fdd4115746..2f25bde6632690e72c949817fa94ed4c578ef1a5 100644 --- a/findex/_targets.R +++ b/findex/_targets.R @@ -250,9 +250,7 @@ p3 <- list( theme(legend.position = "none") ggsave(sprintf("../src/assets/images/%s_threat_by_basin.png", str_replace_all(p2_threat_categories, " ", "_")), - final_plot, height = 6, width = 10, dpi = 300) - - knitr::plot_crop(sprintf("../src/assets/images/%s_threat_by_basin.png", str_replace_all(p2_threat_categories, " ", "_"))) + final_plot, height = 4.5, width = 10, dpi = 300) }, format = "file", pattern = p2_threat_categories @@ -268,9 +266,22 @@ p3 <- list( theme(legend.position = "none") ggsave("../src/assets/images/all_threat_by_basin.png", - final_plot, height = 6, width = 10, dpi = 300) + final_plot, height = 4.5, width = 10, dpi = 300) + }, + format = "file" + ), + tar_target( + p3_base_top_threat_map_png, + { + final_plot <- top_threat_plot(in_dat = p2_mean_weighted_threats, + threat_pal = p2_viz_config, + hybas_habitat_types = p2_hybas_habitat_types_sf, + proj = p1_proj, + threat_category = "base") + + theme(legend.position = "none") - knitr::plot_crop("../src/assets/images/all_threat_by_basin.png") + ggsave("../src/assets/images/base_threat_by_basin.png", + final_plot, height = 4.5, width = 10, dpi = 300) }, format = "file" ), diff --git a/findex/src/plot_utils.R b/findex/src/plot_utils.R index dd8abe46d5be9a3db7abb6deb1f725e9db5ff41c..aaf23d74050aea368ad4c9e0a9a78a6ec47f586b 100644 --- a/findex/src/plot_utils.R +++ b/findex/src/plot_utils.R @@ -277,11 +277,14 @@ top_threat_plot <- function(in_dat, threat_pal, hybas_habitat_types, proj, threa proj_sf <- st_transform(processed_sf, crs = st_crs(proj)) + bbox <- sf::st_bbox(proj_sf) + # make non-target threat category values NA so they are not plotted if(threat_category != "none"){ proj_sf <- proj_sf |> mutate(ThreatCategory = case_when(ThreatCategory != threat_category ~ NA, .default = as.character(ThreatCategory))) } + na_color <- ifelse(threat_category == "base", "gray80", NA) pal <- threat_pal |> select(MajorCat, pal) |> @@ -296,9 +299,12 @@ top_threat_plot <- function(in_dat, threat_pal, hybas_habitat_types, proj, threa threat_map <- ggplot()+ geom_sf(data = proj_sf, aes(geometry = Shape, fill = ThreatCategory), color = NA)+ - scale_fill_manual(values = pal$pal, breaks = pal$MajorCat, na.value = "gray80")+ + scale_fill_manual(values = pal$pal, breaks = pal$MajorCat, na.value = na_color)+ guides(fill = guide_legend(nrow = 2,)) + theme_void()+ + coord_sf(xlim = c(bbox[["xmin"]], bbox[["xmax"]]), + ylim = c(bbox[["ymin"]], bbox[["ymax"]]), + expand = FALSE) + theme( legend.ticks = element_blank(), legend.title = element_text(face = "bold"), diff --git a/src/assets/css/base.css b/src/assets/css/base.css index ce9c0b78b075b45ece97f3ead1aa275b8e6b129c..159a210e2be0e65354e6cc3686a7691e685da80e 100644 --- a/src/assets/css/base.css +++ b/src/assets/css/base.css @@ -20,6 +20,22 @@ --usgs-blue: #00264c; --faded-usgs-blue: #d8dee4; --usgs-green: #006F41; + --mid-teal: #648E8E; + --mid-brown: #a27846; + --mid-blue: #265079; + --mid-red: #b24d4b; + --mid-purple: #845c93; + --teal: #4E6D6E; + --brown: #7A562B; + --blue: #002D5E; + --red: #B74F49; + --purple: #835192; + --faded-teal: #C9D8D9;; + --faded-brown: #E1C8AA; + --faded-blue: #B2C0CE; + --darker-teal: #405959; + --darker-brown: #5B401F; + --darker-blue: #002D5E; font-size: 62.5%; @@ -38,6 +54,22 @@ --color-code-links-background: var(--medium-grey); --color-link: var(--medium-blue); --color-USGS-header-footer: var(--usgs-blue); + --color-habitat-top: var(--mid-teal); + --color-pollution-top: var(--mid-brown); + --color-climate-and-weather-top: var(--mid-blue); + --color-invasive-species-top: var(--mid-red); + --color-fishing-pressure-top: var(--mid-purple); + --color-habitat: var(--teal); + --color-pollution: var(--brown); + --color-climate-and-weather: var(--blue); + --color-invasive-species: var(--red); + --color-fishing-pressure: var(--purple); + --color-habitat-faded: var(--faded-teal); + --color-pollution-faded: var(--faded-brown); + --color-climate-and-weather-faded: var(--faded-blue); + --color-habitat-dark: var(--darker-teal); + --color-pollution-dark: var(--darker-brown); + --color-climate-and-dark-faded: var(--darker-blue); } /* @media (prefers-color-scheme: dark) { diff --git a/src/assets/images/CW_Change_in_flooding_map.png b/src/assets/images/CW_Change_in_flooding_map.png index e641b44b15c257a5524cb360296b4fe65320c41b..a33d010a69a2c1457e264dfb131473e669c3a849 100644 Binary files a/src/assets/images/CW_Change_in_flooding_map.png and b/src/assets/images/CW_Change_in_flooding_map.png differ diff --git a/src/assets/images/CW_Change_in_ice_cover_map.png b/src/assets/images/CW_Change_in_ice_cover_map.png index 86c0bf76d704cb06f87fadba64b07b99f1ba9406..7c6c9a09d0979863ecb7e581f93315773b8b029e 100644 Binary files a/src/assets/images/CW_Change_in_ice_cover_map.png and b/src/assets/images/CW_Change_in_ice_cover_map.png differ diff --git a/src/assets/images/CW_Change_in_water_temperature_map.png b/src/assets/images/CW_Change_in_water_temperature_map.png index fb9a247a8be215d54e6212f2f041462a7aecf992..8f52af2c7e8ab4017ecfde694c533b2bf4439db4 100644 Binary files a/src/assets/images/CW_Change_in_water_temperature_map.png and b/src/assets/images/CW_Change_in_water_temperature_map.png differ diff --git a/src/assets/images/CW_Change_in_wind_patterns_map.png b/src/assets/images/CW_Change_in_wind_patterns_map.png index 09a66316c3392f0b0c257f467f9b24283e10b95d..199da5d16a545986d619b35e5da721892a246e1c 100644 Binary files a/src/assets/images/CW_Change_in_wind_patterns_map.png and b/src/assets/images/CW_Change_in_wind_patterns_map.png differ diff --git a/src/assets/images/CW_Drought_map.png b/src/assets/images/CW_Drought_map.png index abb8bdb44b3209a41b439e542d543377b704110b..159e150dbb9ae6f3cbca480e4198fe00b911bbd5 100644 Binary files a/src/assets/images/CW_Drought_map.png and b/src/assets/images/CW_Drought_map.png differ diff --git a/src/assets/images/Climate_and_weather_map.png b/src/assets/images/Climate_and_weather_map.png index 04b65ef462e71c543a1a94a18dc04c918b1de5ce..e6ed7d39ff88ddc772a6f872b759c01b0a801ed2 100644 Binary files a/src/assets/images/Climate_and_weather_map.png and b/src/assets/images/Climate_and_weather_map.png differ diff --git a/src/assets/images/Climate_and_weather_threat_by_basin.png b/src/assets/images/Climate_and_weather_threat_by_basin.png index f05c5c52b3fb0aa2004084b9176da1f79b8df079..e26bd70b4e028d7d2e45602f35c55454fdc871e0 100644 Binary files a/src/assets/images/Climate_and_weather_threat_by_basin.png and b/src/assets/images/Climate_and_weather_threat_by_basin.png differ diff --git a/src/assets/images/FP_Overfishing_map.png b/src/assets/images/FP_Overfishing_map.png index 1fd1a9a68410002f55edf885a63e128e98f86378..a6e2886abe2ff3838f2a3562a50e4e7917e4f272 100644 Binary files a/src/assets/images/FP_Overfishing_map.png and b/src/assets/images/FP_Overfishing_map.png differ diff --git a/src/assets/images/Fishing_pressure_map.png b/src/assets/images/Fishing_pressure_map.png index d580d74005cd1906f1fd3adc8cc8041bc6751239..332c2cf5a55f70c4aee2c9dbad88f376eacac0a7 100644 Binary files a/src/assets/images/Fishing_pressure_map.png and b/src/assets/images/Fishing_pressure_map.png differ diff --git a/src/assets/images/Fishing_pressure_threat_by_basin.png b/src/assets/images/Fishing_pressure_threat_by_basin.png index 7f23ec98dcec45c13a92e15f26c6d09775f9bd95..079e2888269a7e00668768d0fee33eb32ca68f12 100644 Binary files a/src/assets/images/Fishing_pressure_threat_by_basin.png and b/src/assets/images/Fishing_pressure_threat_by_basin.png differ diff --git a/src/assets/images/H_Agricultural_extraction_map.png b/src/assets/images/H_Agricultural_extraction_map.png index e9fd9585077151bf7ac027c34b91dc1d5c578597..d4c7f99699c6e5838913e6d4b7f547fc81a2ea6a 100644 Binary files a/src/assets/images/H_Agricultural_extraction_map.png and b/src/assets/images/H_Agricultural_extraction_map.png differ diff --git a/src/assets/images/H_Dams_map.png b/src/assets/images/H_Dams_map.png index 20ae6479496062ae0174d607a0c88503d0626943..846ba0e97600704753183eed3c0d2c433f0e3d71 100644 Binary files a/src/assets/images/H_Dams_map.png and b/src/assets/images/H_Dams_map.png differ diff --git a/src/assets/images/H_Deforestation_and_associated_runoff_map.png b/src/assets/images/H_Deforestation_and_associated_runoff_map.png index 033068fef9e123eeff32556623c279b62d5d106d..6322e616fa90fa992d1a87133c24e35fb30a064a 100644 Binary files a/src/assets/images/H_Deforestation_and_associated_runoff_map.png and b/src/assets/images/H_Deforestation_and_associated_runoff_map.png differ diff --git a/src/assets/images/H_Industrial_extraction_map.png b/src/assets/images/H_Industrial_extraction_map.png index bc90d274e2e35cf3b12a084c9b7a7754631d0fb6..f095ad1862c31687fb69ee71ffdacf0aa5d73d69 100644 Binary files a/src/assets/images/H_Industrial_extraction_map.png and b/src/assets/images/H_Industrial_extraction_map.png differ diff --git a/src/assets/images/H_Riparian_degradation_map.png b/src/assets/images/H_Riparian_degradation_map.png index f082a75349df1c0bc3f11eec94dd8d3611401494..e97d65079523a4af31a48412d62741823f2939df 100644 Binary files a/src/assets/images/H_Riparian_degradation_map.png and b/src/assets/images/H_Riparian_degradation_map.png differ diff --git a/src/assets/images/H_Urban_extraction_map.png b/src/assets/images/H_Urban_extraction_map.png index ef38e159b6a99d1156416db2ffa0d18c4021dc11..2eb9da7d2af3339eee90a8b6f8de68ffec78781e 100644 Binary files a/src/assets/images/H_Urban_extraction_map.png and b/src/assets/images/H_Urban_extraction_map.png differ diff --git a/src/assets/images/H_Wetland_drainage_map.png b/src/assets/images/H_Wetland_drainage_map.png index edb5952119ec7ee5f5d42ba2fc86ede5ae6d2c3f..1dd2694823aed306fcfa3dc2a9d8af6ad22836db 100644 Binary files a/src/assets/images/H_Wetland_drainage_map.png and b/src/assets/images/H_Wetland_drainage_map.png differ diff --git a/src/assets/images/Habitat_map.png b/src/assets/images/Habitat_map.png index ab5f7f4b6b648ba385f797181430ac1ee1582a25..5a6d6c5b052727384b3fe052bc23fc64c0351976 100644 Binary files a/src/assets/images/Habitat_map.png and b/src/assets/images/Habitat_map.png differ diff --git a/src/assets/images/Habitat_threat_by_basin.png b/src/assets/images/Habitat_threat_by_basin.png index 4deecd0f6dfe2c29d38e2f2cee22c25173c1dcef..e1d388efaffc065ed16affa15e3d2fa8ce50207e 100644 Binary files a/src/assets/images/Habitat_threat_by_basin.png and b/src/assets/images/Habitat_threat_by_basin.png differ diff --git a/src/assets/images/IS_Invasive_non-native_species_map.png b/src/assets/images/IS_Invasive_non-native_species_map.png index d565368b86f9155fa64a12e0b60c54a5e9711f6d..4148c7e7e694c0c1473785002156df5755bf043e 100644 Binary files a/src/assets/images/IS_Invasive_non-native_species_map.png and b/src/assets/images/IS_Invasive_non-native_species_map.png differ diff --git a/src/assets/images/Invasive_species_map.png b/src/assets/images/Invasive_species_map.png index ed38967d6fe285b1584cd3deeb844fd8122e6e81..7ad6ffde97e94e8864711d0beab79cc08f38f90a 100644 Binary files a/src/assets/images/Invasive_species_map.png and b/src/assets/images/Invasive_species_map.png differ diff --git a/src/assets/images/Invasive_species_threat_by_basin.png b/src/assets/images/Invasive_species_threat_by_basin.png index 0f97e2627ce6b5b3d20dd2fdab9b2e15c5f133be..0e9316fe2b2b038eccccc1b66ca9802466eef92e 100644 Binary files a/src/assets/images/Invasive_species_threat_by_basin.png and b/src/assets/images/Invasive_species_threat_by_basin.png differ diff --git a/src/assets/images/P_Agricultural_effluents_map.png b/src/assets/images/P_Agricultural_effluents_map.png index bc7d56c2a88ca060338def87392b823fc295e053..0e9f6a5c9e7c10a3f303e2d0039dc793246de128 100644 Binary files a/src/assets/images/P_Agricultural_effluents_map.png and b/src/assets/images/P_Agricultural_effluents_map.png differ diff --git a/src/assets/images/P_Aquaculture_effluents_map.png b/src/assets/images/P_Aquaculture_effluents_map.png index cb47e3f04bfbdf6ee18415804944864de5c188e5..965949c8469b81e5e40df775739aa7400b1e0361 100644 Binary files a/src/assets/images/P_Aquaculture_effluents_map.png and b/src/assets/images/P_Aquaculture_effluents_map.png differ diff --git a/src/assets/images/P_Industrial_effluents_map.png b/src/assets/images/P_Industrial_effluents_map.png index 5e5501debc5a72c3d933241b7d86a6590571c58a..e8e53a35b20cd4b71ae613694f81f0a54049d524 100644 Binary files a/src/assets/images/P_Industrial_effluents_map.png and b/src/assets/images/P_Industrial_effluents_map.png differ diff --git a/src/assets/images/P_Mining_map.png b/src/assets/images/P_Mining_map.png index 1c770686095653b1cd3d5527fae3ba27d3543ee5..81ba0dde9bf214e9097fc35283b34342d4615bf3 100644 Binary files a/src/assets/images/P_Mining_map.png and b/src/assets/images/P_Mining_map.png differ diff --git a/src/assets/images/P_Oil_or_gas_exploration_map.png b/src/assets/images/P_Oil_or_gas_exploration_map.png index 1d7309498164ffd067cb15c56268b2c4e4346f51..8510793878852bed25aef3c5e3ccef14249554ab 100644 Binary files a/src/assets/images/P_Oil_or_gas_exploration_map.png and b/src/assets/images/P_Oil_or_gas_exploration_map.png differ diff --git a/src/assets/images/P_Pharmaceuticals_map.png b/src/assets/images/P_Pharmaceuticals_map.png index 2a0e1a4bfc906c4463333440ef6f1c294ca317eb..e4101056e7d4a141a57fe5d41ec3a37593683b6e 100644 Binary files a/src/assets/images/P_Pharmaceuticals_map.png and b/src/assets/images/P_Pharmaceuticals_map.png differ diff --git a/src/assets/images/P_Plastics_map.png b/src/assets/images/P_Plastics_map.png index f9e1a868b61bbcd5d7a0da8233349fac7e6c2d4c..be248676331cdd433c1f0f566597f0fa86c12393 100644 Binary files a/src/assets/images/P_Plastics_map.png and b/src/assets/images/P_Plastics_map.png differ diff --git a/src/assets/images/P_Urban_wastewater_map.png b/src/assets/images/P_Urban_wastewater_map.png index 7ee72edcb21572f4dceb3bfe13b408bbf9df285d..a8249760da1ebbc7e57034a241dc6b5cbf81e4d0 100644 Binary files a/src/assets/images/P_Urban_wastewater_map.png and b/src/assets/images/P_Urban_wastewater_map.png differ diff --git a/src/assets/images/Pollution_map.png b/src/assets/images/Pollution_map.png index e16563dbec24d9af54b21760d8dcbfb9d02a71ff..8705b0dbc9deb93b674258595d2d9c9e7b672ed9 100644 Binary files a/src/assets/images/Pollution_map.png and b/src/assets/images/Pollution_map.png differ diff --git a/src/assets/images/Pollution_threat_by_basin.png b/src/assets/images/Pollution_threat_by_basin.png index d44c896bfe65fb97b148e64cd1d12a31e9e6e937..d3e7d8b48ac9a40ff8f22a14b6d0a51f096d630a 100644 Binary files a/src/assets/images/Pollution_threat_by_basin.png and b/src/assets/images/Pollution_threat_by_basin.png differ diff --git a/src/assets/images/all_threat_by_basin.png b/src/assets/images/all_threat_by_basin.png index dc66f4d03550790e19beb6fe22e90696f63a12dc..b3ad8011d116b94de7d0e924fd53aad4c016855b 100644 Binary files a/src/assets/images/all_threat_by_basin.png and b/src/assets/images/all_threat_by_basin.png differ diff --git a/src/assets/images/base_threat_by_basin.png b/src/assets/images/base_threat_by_basin.png new file mode 100644 index 0000000000000000000000000000000000000000..f8fa13e75d18afeef8db5128b483156bac1d0277 Binary files /dev/null and b/src/assets/images/base_threat_by_basin.png differ diff --git a/src/assets/text/text.js b/src/assets/text/text.js index c4eccf6a315bcfb7776d52df3be16c74935cdd8c..850f44e6bf095d1a1f36511e35a676c3c56e74c7 100644 --- a/src/assets/text/text.js +++ b/src/assets/text/text.js @@ -236,8 +236,47 @@ export default { paragraph1: 'Land use change is the biggest threat to inland fisheries.' }, FindexGlobalThreats: { - heading1:"Global variability of threats", - paragraph1: "While threats related to habitat are the <a href='/visualizations/earth-in-flux/#/findex/inland-fish-total-threats' target='_blank'>overall highest threat</a> to inland fisheries worldwide, the severity of threats varies globally.", + heading1:"What are the top threats to inland fisheries?", + paragraph1: "While threats related to habitat are the <a href='/visualizations/earth-in-flux/#/findex/inland-fish-total-threats' target='_blank'>overall highest threat</a> to inland fisheries worldwide, the top threat for each river basin varies globally.", + mapData: { + habitat: { + visible: true, + path: 'Habitat_threat_by_basin.png', + color: 'var(--color-habitat-top)', + order: 1, + label: "Habitat" + }, + pollution: { + visible: true, + path: 'Pollution_threat_by_basin.png', + color: 'var(--color-pollution-top)', + order: 2, + label: "Pollution" + }, + climate_and_weather: { + visible: true, + path: 'Climate_and_weather_threat_by_basin.png', + color: 'var(--color-climate-and-weather-top)', + order: 3, + label: "Climate and weather" + }, + invasive_species: { + visible: true, + path: 'Invasive_species_threat_by_basin.png', + color: 'var(--color-invasive-species-top)', + order: 4, + label: "Invasive species" + }, + fishing_pressure: { + visible: true, + path: 'Fishing_pressure_threat_by_basin.png', + color: 'var(--color-fishing-pressure-top)', + order: 5, + label: "Fishing pressure" + }, + }, + heading2:"Where are threats higher and lower?", + paragraph2: "Similarly, the severity of threats varies globally.", tabData: [ { tabTitle: "Habitat", diff --git a/src/components/FindexGlobalThreatsViz.vue b/src/components/FindexGlobalThreatsViz.vue index c9221a7593b535feea760900dfb715f8a1735cd9..0ff9065ca7e0c1fc85f6155eb62a2787e552a943 100644 --- a/src/components/FindexGlobalThreatsViz.vue +++ b/src/components/FindexGlobalThreatsViz.vue @@ -2,16 +2,53 @@ <section> <!---VizSection--> <VizSection - :figures="false" + :figures="true" :fig-caption="false" > - <!-- HEADING --> <template #heading> <h2 v-html="text.heading1" /> </template> - <!-- FIGURES --> <template #aboveExplanation> <p v-html="text.paragraph1" /> + <div class="toggle-group"> + <p id="toggle-title">Toggle map layers:</p> + <ToggleSwitch + v-for="layer in layers" + :key="layer.order" + v-model="layer.visible" + :label="layer.label" + :rightColor="layer.color" + /> + </div> + </template> + <template #figures> + <div id="top-threat-map-container"> + <figure + class="base-image" + > + <img class="map-image" :src="getImageURL('base_threat_by_basin.png')" alt=""> + </figure> + <figure + v-for="layer in layers" + :key="layer.order" + v-show="layer.visible" + class="overlay-image" + > + <img class="map-image" :src="getImageURL(layer.path)" alt=""> + </figure> + </div> + </template> + </VizSection> + <!---VizSection--> + <VizSection + :figures="false" + :fig-caption="false" + > + <template #heading> + <h2 v-html="text.heading2" /> + </template> + <template #aboveExplanation> + <p v-html="text.paragraph2" /> </template> </VizSection> <tabsGroup id="map-tabs" :options="{ useUrlFragment: false }" > @@ -43,8 +80,9 @@ </template> <script setup> - import { computed, nextTick, onMounted, ref } from "vue"; + import { computed, nextTick, onMounted, reactive, ref } from "vue"; import VizSection from '@/components/VizSection.vue'; + import ToggleSwitch from '@/components/ToggleSwitch.vue'; import FishIcon from '@/assets/svgs/noun-fish-7471722.svg'; // define props @@ -72,6 +110,9 @@ return subCategoryData.value.subThreatText; }); + // set up reactive layers object + const layers = reactive(props.text.mapData) + // Declare behavior on mounted // functions called here onMounted(async () => { @@ -142,20 +183,35 @@ updateIcon(); } + function getImageURL(file) { + return new URL(`../assets/images/${file}`, import.meta.url).href + } + </script> <style lang="scss"> -$habitat: #4E6D6E; -$habitat-faded: #C9D8D9; -$habitat-dark: #405959; -$pollution: #7A562B; -$pollution-faded: #E1C8AA; -$pollution-dark: #5B401F; -$climate-and-weather: #002D5E; -$climate-and-weather-faded: #B2C0CE; -$climate-and-weather-dark: #002D5E; -$invasive-species: #B74F49; -$fishing-pressure: #835192; +#toggle-title { + font-weight: 700; +} +#top-threat-map-container { + position: relative; + margin-top: 3rem; +} +.base-image { + position: relative; +} +.overlay-image { + position: absolute; + top: 0; + left: 0; +} +.map-image { + width: 100%; + justify-self: center; + @media only screen and (max-width: 600px) { + width: 100%; + } +} #map-tabs { margin-top: 3rem; } @@ -193,39 +249,39 @@ $fishing-pressure: #835192; width: 100%; } .habitat { - color: $habitat; - fill: $habitat; + color: var(--color-habitat); + fill: var(--color-habitat); } .pollution { - color: $pollution; - fill: $pollution; + color: var(--color-pollution); + fill: var(--color-pollution); } .climate-and-weather { - color: $climate-and-weather; - fill: $climate-and-weather; + color: var(--color-climate-and-weather); + fill: var(--color-climate-and-weather); } .invasive-species { - color: $invasive-species; - fill: $invasive-species; + color: var(--color-invasive-species); + fill: var(--color-invasive-species); } .fishing-pressure { - color: $fishing-pressure; - fill: $fishing-pressure; + color: var(--color-fishing-pressure); + fill: var(--color-fishing-pressure); } .highlight.habitat { - background-color: $habitat; + background-color: var(--color-habitat); } .highlight.pollution { - background-color: $pollution; + background-color: var(--color-pollution); } .highlight.climate-and-weather { - background-color: $climate-and-weather; + background-color: var(--color-climate-and-weather); } .highlight.invasive-species { - background-color: $invasive-species; + background-color: var(--color-invasive-species); } .highlight.fishing-pressure { - background-color: $fishing-pressure; + background-color: var(--color-fishing-pressure); } .category-button { background-color: transparent; @@ -240,16 +296,16 @@ $fishing-pressure: #835192; } @media (hover: hover) { .category-button.habitat:hover { - background-color: $habitat-faded; - color: $habitat-dark; + background-color: var(--color-habitat-faded); + color: var(--color-habitat-dark); } .category-button.pollution:hover { - background-color: $pollution-faded; - color: $pollution-dark; + background-color: var(--color-pollution-faded); + color: var(--color-pollution-dark); } .category-button.climate-and-weather:hover { - background-color: $climate-and-weather-faded; - color: $climate-and-weather-dark; + background-color: var(--color-climate-and-weather-faded); + color: var(--color-climate-and-weather-dark); } .category-button.invasive-species:hover { color: white; @@ -259,13 +315,13 @@ $fishing-pressure: #835192; } } .habitat { - text-decoration: underline solid $habitat-faded; + text-decoration: underline solid var(--color-habitat-faded); } .pollution { - text-decoration: underline solid $pollution-faded; + text-decoration: underline solid var(--color-pollution-faded); } .climate-and-weather { - text-decoration: underline solid $climate-and-weather-faded; + text-decoration: underline solid var(--color-climate-and-weather-faded); } .separator { background-color: transparent; diff --git a/src/components/ToggleSwitch.vue b/src/components/ToggleSwitch.vue new file mode 100644 index 0000000000000000000000000000000000000000..88db271d291983640c782d085e1ff67645c73773 --- /dev/null +++ b/src/components/ToggleSwitch.vue @@ -0,0 +1,155 @@ +<template> + <div class="checkbox_wrap toggle-container" aria-label="Toggle container"> + <label class="toggle-label" aria-hidden="true"> + <!-- Left label for either/or use case --> + <span + v-if="leftLabel" + class="toggle-text" + :class="{ tactive: !modelValue }" + aria-hidden="true" + > + {{ leftLabel }} + </span> + + <!-- Toggle switch --> + <input + type="checkbox" + class="toggle-input" + :checked="modelValue" + @change="$emit('update:modelValue', !modelValue)" + aria-hidden="true" + /> + <span + class="toggle-slider" + :style="{ backgroundColor: modelValue ? rightColor : leftColor }" + aria-hidden="true" + ></span> + + <!-- Right label for either/or use case or single toggle label --> + <span + v-if="rightLabel" + class="toggle-text" + :class="{ tactive: modelValue, inactive: !modelValue }" + aria-hidden="true" > + {{ rightLabel }} + </span> + <!-- Single label --> + <span + v-else-if="label" + class="toggle-text" + :class="{ tactive: modelValue, inactive: !modelValue }" + aria-hidden="true" + > + {{ label }} + </span> + </label> + </div> +</template> + +<script setup> +defineProps({ + modelValue: Boolean, // v-model binding for toggle state + + // optional props for either/or labels + leftLabel: { + type: String, + required: false + }, + rightLabel: { + type: String, + required: false + }, + + // optional prop for single label (on/off use case) + label: { + type: String, + required: false + }, + // colors for each label and inactive state + leftColor: { + type: String, + default: 'var(--inactive-grey)' + }, + rightColor: { + type: String, + default: 'var(--soft-black)' + }, + inactiveColor: { + type: String, + default: 'var(--inactive-grey)' + } +}); + +defineEmits(['update:modelValue']); +</script> + +<style scoped> + +.toggle-container { + display: flex; + align-items: start; + gap: 10px; +} + +/* toggle label for positioning */ +.toggle-label { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + position: relative; +} + +/* text styles */ +.toggle-text { + transition: color 0.3s ease; + color: var(--inactive-grey); +} + +.toggle-text.tactive { + color: var(--black-soft); /* active label is black */ +} +.toggle-input:focus-visible { + outline: none; /* removes focus outline */ +} + +.toggle-label:focus-visible { + outline: none; /* removes focus outline */ +} + +/* toggle input (hidden) */ +.toggle-input { + display: none; +} + +/* toggle slider styles */ +.toggle-slider { + flex-shrink: 0; + position: relative; + width: 40px; + height: 20px; + border-radius: 20px; + transition: background-color 0.3s ease; + border: 1px solid var(--black-soft); +} + +.toggle-slider::before { + content: ""; + position: absolute; + width: 16px; + height: 16px; + background-color: white; + border-radius: 50%; + top: 1px; + left: 1%; + transition: transform 0.3s ease; + border: 1px solid var(--black-soft); +} + +/* move slider to the right when checked */ +.toggle-input:checked + .toggle-slider::before { + transform: translateX(20px); + border: 1px solid var(--black-soft); +} + +</style>