diff --git a/build/precache-manifest.50006c56e19073402d72ae675adcab72.js b/build/precache-manifest.50006c56e19073402d72ae675adcab72.js
new file mode 100644
index 00000000..9ab9c293
--- /dev/null
+++ b/build/precache-manifest.50006c56e19073402d72ae675adcab72.js
@@ -0,0 +1,30 @@
+self.__precacheManifest = (self.__precacheManifest || []).concat([
+ {
+ "revision": "64596856986271e6f21f6d5b573915e1",
+ "url": "./index.html"
+ },
+ {
+ "revision": "88e44a11d06edf1eef2c",
+ "url": "./static/css/main.36bc8d80.chunk.css"
+ },
+ {
+ "revision": "d588bdce3e6e15c9d83f",
+ "url": "./static/js/2.c80c4b2d.chunk.js"
+ },
+ {
+ "revision": "d822076f121a0870ca6705e1ebd3041a",
+ "url": "./static/js/2.c80c4b2d.chunk.js.LICENSE.txt"
+ },
+ {
+ "revision": "88e44a11d06edf1eef2c",
+ "url": "./static/js/main.703e18fb.chunk.js"
+ },
+ {
+ "revision": "cb17529e290eed44a367",
+ "url": "./static/js/runtime-main.42b58e32.js"
+ },
+ {
+ "revision": "c02541ff141198f0735de067023b6552",
+ "url": "./static/media/codap.c02541ff.ico"
+ }
+]);
\ No newline at end of file
diff --git a/build/static/js/main.703e18fb.chunk.js b/build/static/js/main.703e18fb.chunk.js
new file mode 100644
index 00000000..38574578
--- /dev/null
+++ b/build/static/js/main.703e18fb.chunk.js
@@ -0,0 +1,2 @@
+(this["webpackJsonpcodap-data-interactives"]=this["webpackJsonpcodap-data-interactives"]||[]).push([[0],[,,,,,,,function(e){e.exports=JSON.parse('{"projects":[{"name":"Ocean Tracks","url":"https://oceantracks.org/"},{"name":"ESTEEM","url":"https://hirise.fi.ncsu.edu/projects/esteem/"}],"categories":[{"category":"Partners","tooltip":"Plugins developed by and with other groups."},{"category":"Portals","tooltip":"Plugins that fetch data from external sources."},{"category":"Simulators","tooltip":"Plugins that create data with interactive simulations of phenomena."},{"category":"Generators","tooltip":"Plugins that generate data from abstract statistical models."},{"category":"Tools","tooltip":"Useful plugins that work with datasets in CODAP."},{"category":"Dev","tooltip":"Useful plugins for plugin developers."},{"category":"Search","tooltip":"Search results"}],"data_interactives":[{"title":"Ocean Tracks Selector","description":"Compare the tracks of Pacific Ocean animals tagged by the Ocean Tracks project. Note that this plugin will not load in SSL.","width":550,"height":500,"path":"https://oceantracks.org/map/trackmenu_1.html","visible":"true","aegis":"Ocean Tracks","categories":["Partners","Portals"]},{"title":"Sampler","description":"Create random datasets from scratch or existing datasets.","title-string":"DG.plugin.Sampler.title","description-string":"DG.plugin.Sampler.description","width":232,"height":400,"path":"/TP-Sampler/index.html","icon":"/TP-Sampler/icon-sampler.svg","visible":"true","aegis":"ESTEEM","isStandard":"true","categories":["Partners","Generators"]},{"title":"Scrambler","description":"Test hypotheses by randomly varying an attribute.","title-string":"DG.plugin.Scrambler.name","description-string":"DG.plugin.Scrambler.description","width":400,"height":600,"path":"/eepsmedia/plugins/scrambler/index.html","icon":"/eepsmedia/plugins/scrambler/images/whisk_on_side.svg","visible":"true","isStandard":"true","categories":["Tools"]},{"title":"SRRI Ship Odyssey Data Game","description":"Send rats on a dive to find sunken treasure with this SRRI game.","width":290,"height":304,"path":"/ShipOdyssey/index.html","visible":false,"aegis":"SRRI","categories":["Partners"]},{"title":"SRRI Chainsaw Data Game","description":"Fire up a chainsaw and see how many logs you can cut to the right length. SRRI game.","width":290,"height":304,"path":"/Chainsaw/index.html","visible":false,"aegis":"SRRI","categories":["Partners"]},{"title":"SRRI Inference Data Game","description":"Another SRRI game. See if you can beat a conservative statistician at his own game -- making good guesses from samples.","width":290,"height":304,"path":"/Inference/index.html","visible":false,"aegis":"SRRI","categories":["Partners"]},{"title":"Cart Weight","description":"Win by predicting the total weight of a cart stacked with bricks.","width":290,"height":305,"path":"/CartWeight/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Ramp Game (Netlogo version)","description":"Win by landing on the target.","width":500,"height":734,"path":"/RampGame/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Floyd\'s of Fargo","description":"Make big money running your own car insurance business!","width":570,"height":480,"path":"/FloydsFargo/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Lunar Lander","description":"You and your friends land spacecrafts, then rate your landings.","width":357,"height":541,"path":"/LunarLander/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Markov","description":"Play Rock, Paper, Scissors with the evil Dr. Markov to save the dog.","width":550,"height":315,"path":"/Markov/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Proximity","description":"Get high scores by shooting a ball to land as close to a target as possible.","width":463,"height":344,"path":"/Proximity/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Shuffleboard","description":"Live on the edge-Land a disk on each pad without sliding off to score big!","width":520,"height":350,"path":"/Shuffleboard/index.html","visible":false,"aegis":"Data Games","categories":["Partners"]},{"title":"Guess My Number","description":"As the title says.","width":400,"height":250,"path":"/GuessMyNumber/GuessMyNumber.html","visible":false,"aegis":"CODAP","categories":["Misc"]},{"title":"Random Number Generator","description":"An extremely simple plugin. It generates random numbers between 1 and 100.","width":300,"height":150,"path":"/NewRandomNumbers/index.html","visible":true,"aegis":"CODAP","categories":["Utilities"]},{"title":"Fast Plants Simulator","description":"Simulate growth of fast plants.","width":400,"height":250,"path":"/FastPlants/FastPlants.html","visible":true,"aegis":"CODAP","categories":["Utilities","Simulators"]},{"title":"Performance Harness","description":"A way to generate data while testing the performance of CODAP.","width":400,"height":250,"path":"/PerformanceHarness/PerformanceHarness.html","visible":true,"aegis":"CODAP","categories":["Utilities","Dev"]},{"title":"Normal Distribution Sampler","description":"A way to generate a sample data set from a normal distribution.","width":400,"height":300,"path":"/Sampler/Sampler.html","visible":true,"aegis":"CODAP","categories":["Utilities","Generators"]},{"title":"TerraPop Plugin","description":"Plugin for importing TerraPop data sets.","width":550,"height":500,"path":"/TerraPopInteractive/TPI.html","visible":true,"aegis":"Terra-Pop","categories":["Partners","Portals"]},{"title":"GeoJSON Importer","description":"Plugin for importing GeoJSON","width":450,"height":200,"path":"/GeoJSONImporter/GeoJSONImporter.html","visible":false,"aegis":"CODAP","categories":["Utilities"]},{"title":"Wolf-Sheep Predation","description":"Netlogo model that explores the stability of predator-prey ecosystems.","width":550,"height":500,"path":"/WolfSheep/index.html","visible":true,"aegis":"CODAP","categories":["Partners","Simulators"]},{"title":"Ants","description":"Netlogo model of an ant colony seeking nearby food.","width":550,"height":500,"path":"/Ants/ants.html","visible":true,"aegis":"CODAP","categories":["Partners","Simulators"]},{"title":"Virus Growth","description":"Netlogo model that explores the effect of infectiousness, chance of recovery, and duration of the cycle on infection in a population.","width":780,"height":620,"path":"/Virus/Virus.html","visible":true,"aegis":"CODAP","categories":["Partners","Simulators"]},{"title":"Sage","description":"A Building Models systems modeler.","width":780,"height":620,"path":"https://codap.concord.org/sage/sage.html","visible":true,"aegis":"Building Models","categories":["Partners","Simulators"]},{"title":"Data Card","description":"Data Card permits the user to browse and modify a data set one case at a time.","width":780,"height":620,"path":"/DataCard/DataCard.html","visible":false,"categories":["Utilities"]},{"title":"Track Generator","description":"Simulate OceanTracks data with a simple random walk.","width":400,"height":300,"path":"/Movement/Movement.html","visible":true,"categories":["Utilities","Generators"]},{"title":"Pivotal Tracker Importer","description":"Import stories and activities from any project in Pivotal Tracker.","width":400,"height":250,"path":"/PivotalImporter/PTImporter.html","visible":false,"categories":["Utilities"]},{"title":"Spring Mass Model","description":"Physics model that simulate a mass suspended on a spring created by the InquirySpace project.","width":600,"height":400,"path":"https://lab.concord.org/embeddable.html?codap=true%23interactives/inquiry-space/2-spring.json","visible":true,"categories":["Partners","Simulators"]},{"title":"DropHTMLTable","description":"A basic screen scraper. Drop the contents of an HTML page. The plugin will find the tables to transfer to CODAP.","width":600,"height":400,"path":"/ScreenScraper/index.html","visible":true,"categories":["Utilities"]},{"title":"Questionnaire","description":"Allows the creation of a document with a questionnaire through which data can be added to CODAP.","width":400,"height":600,"path":"/questionnaire/index.html","visible":true,"categories":["Utilities"]},{"title":"Collaboration Service","description":"Allows multiple users to add data to specified data contexts.","width":300,"height":200,"path":"/CollaborationService/CollaborationService.html","visible":true,"categories":["Utilities","Tools"]},{"title":"Attribute Stacker","description":"Allows user to tidy the data set","width":600,"height":400,"path":"/AttributeStacker/index.html","visible":false,"categories":["Utilities"]},{"title":"Charts","description":"Allows user to create common charts for attributes on the data contexts","width":600,"height":400,"path":"/Charts/index.html","visible":true,"categories":["Utilities","Tools"]},{"title":"CaseGenerator","description":"","width":600,"height":400,"path":"/CaseGenerator/CaseGenerator.html","visible":false,"categories":["Utilities"]},{"title":"Plugin API Tester","description":"Exercise the CODAP Plugin API and see the results","width":600,"height":400,"path":"/DataInteractiveAPITester/index.html","visible":true,"categories":["Utilities","Dev"]},{"title":"GeoJSON Importer","description":"","width":600,"height":400,"path":"/GeoJSONImporter/GeoJSONImporter.html","visible":false,"categories":["Utilities"]},{"title":"GoogleSheets","description":"","width":600,"height":400,"path":"/GoogleSheets/example.html","visible":false,"categories":["Utilities"]},{"title":"Image Library","description":"","width":600,"height":400,"path":"/ImageLibrary/index.html","visible":false,"categories":["Utilities"]},{"title":"JSON Rows","description":"","width":600,"height":400,"path":"/JsonRows/JsonRows.html","visible":false,"categories":["Utilities"]},{"title":"Movement","description":"","width":600,"height":400,"path":"/Movement/Movement.html","visible":false,"categories":["Utilities"]},{"title":"Live Dataset","description":"Loads a CSV document from the web and periodically updates","path":"/LiveDataSet/index.html","visible":false,"categories":["Utilities"]},{"title":"CODAP Onboarding","description":"This is the onboarding plugin for CODAP","path":"https://codap.concord.org/plugins/releases/latest/onboarding","width":600,"height":400,"visible":false,"categories":["Utilities"]},{"title":"Ecochamber Simulator","description":"Simulates an ecochamber. Plants and animals in a sealed system, and how they affect rates of photosynthesis and respiration. This is part of the InSPECT project.","path":"https://concord-consortium.github.io/ecochamber/?noise=true","visible":false,"categories":["Partners"]},{"title":"Elodea Simulator","description":"Simulates how many bubbles are produce by elodea plant depending on light color, light level, and CO2 level. This is part of the InSPECT project.","path":"https://concord-consortium.github.io/elodea-sim/index.html","visible":false,"categories":["Partners"]},{"title":"Sensor Interactive (InquirySpace 2 version)","description":"Collect data using Vernier sensors and send the data to CODAP for further analysis","width":600,"height":420,"path":"https://sensor-interactive.concord.org","visible":false,"categories":["Partners","Generators"]},{"title":"Ramp Simulation (InquirySpace 2 version)","description":"Win by landing the car on the target. This is part of the InquirySpace 2 project. To run the Game version of this interactive add \'?game\' to the ramp game url and reload the page.","width":600,"height":400,"path":"https://ramp-game.concord.org","visible":false,"categories":["Partners","Simulators"]},{"title":"Dataflow Onboarding","description":"This is the onboarding plugin for the DataFlow plugin. This is part of the InSPECT project. This must be used in conjunction with the Dataflow plugin","width":600,"height":400,"path":"https://concord-consortium.github.io/codap-data-interactives/DataflowGettingStarted/DataflowGettingStarted.html","visible":false,"categories":["Partners"]},{"title":"Dataflow","description":"The DataFlow plugin is part of the InSPECT project. It collects sensor data collected by the InSPECT Raspbery Pis.","width":600,"height":400,"path":"https://dataflow.staging.concord.org/ext/flow?features=1?use_codap=1","visible":false,"categories":["Partners"]},{"title":"2013 CA ACS Data Portal","description":"A Data Science Games plugin. It will get a random sample of Californians from the 2013 American Community Survey","width":600,"height":400,"path":"https://codap.concord.org/data-science-worlds/acs/acs.html?lang=en","visible":true,"categories":["Partners"]},{"title":"Data Sonofication","description":"The Data Sonofication plugin was created by Takahiko Tsuchiya","width":600,"height":400,"path":"https://ttsuchiya.github.io/codap/plugins/Sonification/SimpleSpectrum/index.html","visible":false,"categories":["Partners","Tools"]},{"title":"Draw Tool","description":"Annotate an image.","title-string":"DG.plugin.DrawTool.title","description-string":"DG.plugin.DrawTool.description","width":600,"height":400,"path":"/DrawTool/index.html","icon":"/DrawTool/icon-draw-tool.svg","visible":true,"isStandard":"true","categories":["Utilities","Tools"]},{"title":"Microdata Portal","description":"Investigate populations from the US census at the individual level.","title-string":"DG.plugin.MicrodataPortal.title","description-string":"DG.plugin.MicrodataPortal.description","path":"/sdlc/plugin/index.html","icon":"/sdlc/plugin/assets/images/icon-microdata-portal.svg","aegis":"SDLC","visible":true,"width":380,"height":520,"isStandard":"true","categories":["Partners","Portals"]},{"title":"acs","description":"ACS data portal: 20000 Californans in 2013","width":600,"height":400,"path":"/data-science-worlds/acs/acs.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"arbor","description":"Make decision trees by hand!","width":600,"height":400,"path":"/data-science-worlds/arbor/arbor.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"barty","description":"BART data for 2015 through 2018. Over 10 million data points.","width":600,"height":400,"path":"/data-science-worlds/barty/barty.html","visible":true,"aegis":"DSG","categories":["Partners","Portals"]},{"title":"fish","description":"A Commons game where you have to fish for a living","width":600,"height":400,"path":"/data-science-worlds/fish/fish.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"geiger","description":"Find the radioactive speck without taking a lethal dose","width":600,"height":400,"path":"/data-science-worlds/geiger/geiger.html","visible":true,"aegis":"DSG","categories":["Partners"]},{"title":"journal","description":"Nature-of-science helper: write tiny papers to share your data with others.","width":600,"height":400,"path":"/data-science-worlds/journal/journal.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"nhanes","description":"Data portal for 11,000-ish cases of 2003 data from NHANES","width":600,"height":400,"path":"/data-science-worlds/nhanes/nhanes.html","visible":true,"aegis":"DSG","categories":["Partners","Portals"]},{"title":"stebbins","description":"Simulation of natural selection","width":600,"height":400,"path":"/data-science-worlds/steb/steb.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"stella","description":"Simulation for stellar astronomy","width":600,"height":400,"path":"/data-science-worlds/stella/stella.html","visible":true,"aegis":"DSG","categories":["Partners","Simulators"]},{"title":"xeno","description":"Diagnose sick alien creatures. Works with arbor.","width":600,"height":400,"path":"/data-science-worlds/xeno/xeno.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"Table Sharing","description":"Allows students to share their data","width":400,"height":600,"path":"https://codap-shared-table-plugin.concord.org/branch/master/index.html","visible":"false","categories":["Partners"]},{"title":"NOAA Weather","description":"Investigate historical weather patterns","title-string":"DG.plugin.NOAA-weather.title","description-string":"DG.plugin.NOAA-weather.description","width":380,"height":490,"path":"/NOAA-weather/index.html","icon":"/NOAA-weather/assets/images/icon-noaa-weather.svg","visible":"true","isStandard":"true","categories":["Partners","Portals"]},{"title":"Moments Recorder","description":"This plugin tracks user actions in CODAP through notification. Each action represents the state of the document at completion of that action. User clicks on an item to bring the CODAP document back to that state","width":400,"height":600,"path":"https://codap.concord.org/~bfinzer/story_builder/index.html","visible":"false","categories":["Partners"]},{"title":"Choosy","description":"Organize and simplify datasets, especially those with many attributes.","title-string":"DG.plugin.Choosy.title","description-string":"DG.plugin.Choosy.description","width":400,"height":600,"icon":"/eepsmedia/plugins/Choosy/art/choosy.svg","path":"/eepsmedia/plugins/Choosy/index.html","visible":"false","isStandard":"true","categories":["Partners","Tools"]},{"title":"Transformers","description":"Transform datasets with a collection of powerful tools","title-string":"DG.plugin.Transformers.title","description-string":"DG.plugin.Transformers.description","width":350,"height":450,"icon":"/codap-transformers/transformers-icon-small.svg","path":"/codap-transformers/","visible":"false","isStandard":"true","categories":["Partners","Tools"]},{"title":"Story Builder","description":"Create a narrative of your investigation","title-string":"DG.plugin.StoryBuilder.pluginName","description-string":"DG.plugin.StoryBuilder.description","width":800,"height":130,"path":"/story-builder/","icon":"/story-builder/story-builder-icon.svg","visible":"false","isStandard":"true","categories":["Partners","Tools"]},{"title":"Sonify","description":"Listen to your data","width":325,"height":274,"path":"/Sonify/index.html","icon":"Sonify/src/assets/images/sonify.svg","visible":"true","isStandard":"true","categories":["Partners","Tools"]},{"title":"Day Length","description":"Computes the day length for a year for any place in the world","width":350,"height":450,"path":"/DayLength/build/","visible":"true","categories":["Generators","Tools"]},{"title":"Collect Measures","description":"With a data set containing randomly generated values, re-randomize and collect measures repeatedly.","width":350,"height":450,"path":"/CollectMeasures/build/","visible":"true","categories":["Generators","Tools"]},{"title":"Fatal Encounters","description":"Explore data from the Fatal Encounters website; a database created to document people in the United Stated who were killed during interactions with the police.","width":350,"height":450,"path":"/FatalEncounters/","visible":"true","categories":["Portals"]}]}')},,,,,,,,function(e,t,a){e.exports=a.p+"static/media/codap.c02541ff.ico"},function(e,t,a){e.exports=a(42)},,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){"use strict";a.r(t);var i=a(0),r=a.n(i),s=a(12),n=a.n(s),o=(a(21),a(1)),l=a(2),c=a(5),h=a(4),d=a(3),p=a(7);a(22);var g=function(e){var t=e.categories,a=function(e){var t=[];return e.forEach((function(e){e.visible&&"false"!==e.visible&&e.categories.forEach((function(e){t.includes(e)||t.push(e)}))})),t}(e.plugins),i=t.map((function(e){return e.category})).filter((function(e){return a.includes(e)}));return r.a.createElement(r.a.Fragment,null,i&&r.a.createElement("div",{className:"navigationTabs"},i.map((function(a,i){var s=t.filter((function(e){return e.category===a}))[0];return r.a.createElement("div",{key:"".concat(i),className:"tab theme".concat(i%4+1," ").concat(e.categorySelected===a?"selected":""),onClick:function(){return e.handleCategorySelect(a)},title:s?s.tooltip:""},a)}))))},u=(a(23),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(e){var i;return Object(o.a)(this,a),(i=t.call(this,e)).handleChange=i.props.handleBranchSelect.bind(Object(c.a)(i)),i}return Object(l.a)(a,[{key:"render",value:function(){return r.a.createElement("form",{onSubmit:this.handleSubmit},r.a.createElement("label",{className:"dropdownLabel"},"Select branch:"),r.a.createElement("select",{className:"dropdownSelect",value:this.props.branchSelected,onChange:this.handleChange},r.a.createElement("option",{value:"latest"},"latest"),r.a.createElement("option",{value:"staging"},"staging"),r.a.createElement("option",{value:"stable"},"stable"),r.a.createElement("option",{value:"branch"},"branch")))}}]),a}(r.a.Component)),m=(a(24),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){var e;return Object(o.a)(this,a),(e=t.call(this)).state={value:""},e}return Object(l.a)(a,[{key:"handleClear",value:function(){this.props.onSearch("")}},{key:"handleChange",value:function(e){var t=e.target.value;this.props.onSearch(t)}},{key:"render",value:function(){var e=this,t=this.props.searchString;return r.a.createElement("div",{className:"search-panel"},r.a.createElement("input",{type:"text",placeholder:"search for...",onChange:function(t){return e.handleChange(t)},value:t}),r.a.createElement("button",{className:"search-panel-clear",onClick:function(t){return e.handleClear(t)}},"\u24e7"))}}]),a}(r.a.Component)),b=(a(25),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){return Object(o.a)(this,a),t.apply(this,arguments)}return Object(l.a)(a,[{key:"render",value:function(){return r.a.createElement("div",{className:"header"},this.renderHeaderTitle(),r.a.createElement(g,{plugins:this.props.plugins,categories:this.props.categories,categorySelected:this.props.categorySelected,handleCategorySelect:this.props.onCategorySelect}))}},{key:"renderHeaderTitle",value:function(){return r.a.createElement("div",{className:"headerTitle"},r.a.createElement("div",{className:"headerLeft"},r.a.createElement("a",{href:"https://codap.concord.org/",title:"CODAP Project",target:"_blank",rel:"noopener noreferrer"},r.a.createElement("img",{src:"https://codap.concord.org/wp-content/themes/cc/img/codap-logo.png",className:"codap-logo",alt:"Common Online Data Analysis Program"}))),r.a.createElement("div",{className:"headerCenter"},r.a.createElement("span",{className:"title"},"CODAP Data Interactive Plugins")),r.a.createElement("div",{className:"headerRight"},r.a.createElement(m,{onSearch:this.props.onSearch,searchString:this.props.searchString}),r.a.createElement(u,{branchSelected:this.props.branchSelected,handleBranchSelect:this.props.onBranchSelect})))}}]),a}(r.a.Component)),f=a(13),v=a.n(f),w=a(14),S=a(15),y=a.n(S);a(39);function P(){return(window.location.origin+window.location.pathname).replace(/index.html$/,"").replace(/\/build\//,"")}var C=function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){return Object(o.a)(this,a),t.apply(this,arguments)}return Object(l.a)(a,[{key:"copyToClipboard",value:function(){navigator.clipboard.writeText(this.cleanPath())}},{key:"render",value:function(){var e=this;return r.a.createElement("div",{className:"card"},this.renderPluginTitleAndDescription(),r.a.createElement("div",{className:"embeddableLink",onClick:function(){return e.copyToClipboard()}},"copy link to clipboard",r.a.createElement("span",{role:"img","aria-label":"Image of a clipboard"},"\ud83d\udccb")))}},{key:"renderPluginTitleAndDescription",value:function(){var e=this.props,t=e.plugin,a=e.url,i="";return i=t.path.match(/^http/i)?t.path:P()+t.path,a.match(/^https/i)&&!i.match(/^https/i)&&(i=i.replace(/http/i,"https")),i.match(/^https/i)&&!a.match(/^https/i)&&(a=a.replace(/http/i,"https")),r.a.createElement("div",null,r.a.createElement("div",{title:"Open in CODAP"},r.a.createElement("a",{href:"".concat(a,"?di=").concat(i),className:"pluginTitle",target:"_blank",rel:"noopener noreferrer"},r.a.createElement("img",{src:y.a,alt:"CODAP Logo"}),"\xa0",t.title)),r.a.createElement("p",{className:"pluginDescription"},this.renderHTML(t.description)))}},{key:"renderHTML",value:function(e){return Object(w.a)(v.a.sanitize(e||""))}},{key:"cleanPath",value:function(){var e=this.props.plugin,t="",a="https://codap.concord.org/app/";return t=e.path.match(/^http/i)?e.path:P()+e.path,a.match(/^https/i)&&!t.match(/^https/i)&&(t=t.replace(/http/i,"https")),t.match(/^https/i)&&!a.match(/^https/i)&&(a=a.replace(/http/i,"https")),t}}]),a}(r.a.PureComponent),D=(a(40),function(e){var t=e.plugins,a=e.categorySelected,i=e.url,s=e.tabIndex,n="card-list-wrapper theme".concat(s%4+1),o=t.filter((function(e){return e.visible&&"false"!==e.visible&&e.categories.find((function(e){return e.replace(/\..*/,"")===a}))})).sort((function(e,t){var a=e.title.toLowerCase(),i=t.title.toLowerCase();return ai?1:0}));return r.a.createElement("div",{className:n},r.a.createElement("div",{className:"card-list"},o.map((function(e,t){return r.a.createElement(C,{key:t,plugin:e,url:i})}))))}),k=(a(41),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){return Object(o.a)(this,a),t.apply(this,arguments)}return Object(l.a)(a,[{key:"render",value:function(){return r.a.createElement("div",{className:"footer"},r.a.createElement("div",{className:"footerLeft"},this.renderInfoLinks()),r.a.createElement("div",{className:"footerRight"},this.renderCCLogo()))}},{key:"renderCCLogo",value:function(){return r.a.createElement("div",{id:"cc"},"a product of",r.a.createElement("div",{className:"cc-logo"},r.a.createElement("a",{href:"https://concord.org/",title:"The Concord Consortium - Revolutionary digital learning for science, math, and engineering"},r.a.createElement("img",{src:"https://codap.concord.org/_assets/img/cc-logo.png",alt:"The Concord Consortium"}))))}},{key:"renderInfoLinks",value:function(){return r.a.createElement(r.a.Fragment,null,r.a.createElement("p",null,"CODAP plugin repository: ",r.a.createElement("a",{target:"blank",href:"https://github.com/concord-consortium/codap-data-interactives"}," github.com/concord-consortium/codap-data-interactives")),r.a.createElement("p",null,"CODAP project repository: ",r.a.createElement("a",{target:"blank",href:"https://github.com/concord-consortium/codap"}," github.com/concord-consortium/codap")),r.a.createElement("p",null,"To find out more about the CODAP project: ",r.a.createElement("a",{target:"blank",href:"https://concord.org/projects/codap"}," About CODAP")),r.a.createElement("p",null,"\xa9 Copyright 2021 ",r.a.createElement("a",{href:"https://concord.org/",title:"The Concord Consortium - Revolutionary digital learning for science, amth, and engineering"},"The Concord Consortium"),". All rights reserved."))}}]),a}(r.a.Component));var O=function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){var e;return Object(o.a)(this,a),(e=t.call(this)).handleCategorySelect=e.handleCategorySelect.bind(Object(c.a)(e)),e.handleBranchSelect=e.handleBranchSelect.bind(Object(c.a)(e)),e.handleSearch=e.handleSearch.bind(Object(c.a)(e)),e.state={dataInteractives:p.data_interactives,categories:p.categories,categorySelected:"Partners",branchSelected:window.location.search.substr(1).includes("dev")?"staging":"latest",searchString:""},e}return Object(l.a)(a,[{key:"render",value:function(){var e,t=this.state.dataInteractives,a=this.state.categories,i=this.state.categorySelected,s=this.state.branchSelected,n=this.state.searchString;switch(s){case"latest":e="/releases/latest/";break;case"staging":e="/releases/staging/";break;case"stable":e="/app/";break;case"branch":e="/~jsandoe/build/"}var o="https://codap.concord.org"+e,l=a.findIndex((function(e){return e.category===i}));return r.a.createElement("div",{className:"App"},r.a.createElement(b,{plugins:t,categories:a,categorySelected:i,branchSelected:s,onCategorySelect:this.handleCategorySelect,onBranchSelect:this.handleBranchSelect,onSearch:this.handleSearch,searchString:n}),r.a.createElement(D,{plugins:t,categorySelected:i,url:o,tabIndex:l}),r.a.createElement(k,null))}},{key:"handleCategorySelect",value:function(e){this.setState({categorySelected:e})}},{key:"handleBranchSelect",value:function(e){this.setState({branchSelected:e.target.value})}},{key:"handleSearch",value:function(e){var t=!1;this.setState({searchString:e}),this.state.dataInteractives.forEach((function(e){var t=e.categories.indexOf("Search");t>=0&&e.categories.splice(t,1)})),e.length>=3&&this.state.dataInteractives.forEach((function(a){(function(e,t){return t=t.toLowerCase(),e.description&&e.description.toLowerCase().includes(t)||e.title&&e.title.toLowerCase().includes(t)||e.aegis&&e.aegis.toLowerCase().includes(t)})(a,e)&&(a.categories.push("Search"),t=!0)})),t&&"Search"!==this.state.categorySelected?(this.priorSelected=this.state.categorySelected,this.setState({categorySelected:"Search"})):t||"Search"!==this.state.categorySelected||(this.setState({categorySelected:this.priorSelected}),this.priorSelected=null)}}]),a}(r.a.PureComponent);Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));n.a.render(r.a.createElement(r.a.StrictMode,null,r.a.createElement(O,null)),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}],[[16,1,2]]]);
+//# sourceMappingURL=main.703e18fb.chunk.js.map
\ No newline at end of file
diff --git a/build/static/js/main.703e18fb.chunk.js.map b/build/static/js/main.703e18fb.chunk.js.map
new file mode 100644
index 00000000..9b0b74a8
--- /dev/null
+++ b/build/static/js/main.703e18fb.chunk.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["components/card/codap.ico","components/header/navigation.jsx","utils/util.js","components/header/dropdown-select.jsx","components/header/search-panel.jsx","components/header/header.jsx","components/card/card.jsx","components/card-list/card-list.jsx","components/footer/footer.jsx","App.js","serviceWorker.js","index.js"],"names":["module","exports","NavigationTabs","props","categoryDefinitions","categories","categoriesInUse","plugins","categoryArray","forEach","plugin","visible","category","includes","push","getCategories","map","e","filter","className","index","tip","c","key","categorySelected","onClick","handleCategorySelect","title","tooltip","DropdownSelect","handleChange","handleBranchSelect","bind","onSubmit","this","handleSubmit","value","branchSelected","onChange","React","Component","SearchPanel","state","onSearch","ev","searchString","target","type","placeholder","handleClear","Header","renderHeaderTitle","onCategorySelect","href","rel","src","alt","onBranchSelect","getURLRoot","window","location","origin","pathname","replace","Card","navigator","clipboard","writeText","cleanPath","renderPluginTitleAndDescription","copyToClipboard","role","aria-label","url","pluginPath","path","match","logo","renderHTML","description","parse","DOMPurify","sanitize","PureComponent","CardList","tabIndex","cardListWrapperClassNames","pluginsToShow","find","cat","sort","a","b","aLow","toLowerCase","bLow","Footer","renderInfoLinks","renderCCLogo","id","App","handleSearch","dataInteractives","dataInteractiveList","data_interactives","search","substr","findIndex","entry","setState","event","found","ix","indexOf","splice","length","aegis","pluginSearch","priorSelected","Boolean","hostname","ReactDOM","render","StrictMode","document","getElementById","serviceWorker","ready","then","registration","unregister","catch","error","console","message"],"mappings":"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","file":"static/js/main.703e18fb.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/codap.c02541ff.ico\";","import React from \"react\";\nimport PropTypes from 'prop-types';\nimport { getCategories } from \"../../utils/util\";\nimport \"./navigation.css\"\n\nexport const NavigationTabs = (props) => {\n const categoryDefinitions = props.categories;\n const categoriesInUse = getCategories(props.plugins);\n const categories = categoryDefinitions.map(e => e.category)\n .filter(category=>categoriesInUse.includes(category));\n\n return (\n <>\n { categories && {this.renderHTML(plugin.description)}
CODAP plugin repository: github.com/concord-consortium/codap-data-interactives
\nCODAP project repository: github.com/concord-consortium/codap
\nTo find out more about the CODAP project: About CODAP
\n© Copyright 2021 The Concord Consortium. All rights reserved.
\n >\n )\n }\n}\n","import React from 'react';\nimport dataInteractiveList from \"./data_interactive_map.json\";\nimport { Header } from \"./components/header/header\";\nimport { CardList } from \"./components/card-list/card-list\";\nimport { Footer } from \"./components/footer/footer\";\nimport { isDevMode } from \"./utils/util\";\n\n/**\n *\n * @param plugin {\n * {description: string},\n * {title: string},\n * {aegis: string}\n * }\n * @param searchString {string}\n * @return {boolean}\n */\nfunction pluginSearch(plugin, searchString) {\n searchString = searchString.toLowerCase();\n return (plugin.description && plugin.description.toLowerCase().includes(searchString)) ||\n (plugin.title && plugin.title.toLowerCase().includes(searchString)) ||\n (plugin.aegis && plugin.aegis.toLowerCase().includes(searchString));\n}\n\nexport default class App extends React.PureComponent {\n constructor() {\n super();\n this.handleCategorySelect = this.handleCategorySelect.bind(this);\n this.handleBranchSelect = this.handleBranchSelect.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.state = {\n dataInteractives: dataInteractiveList.data_interactives,\n categories: dataInteractiveList.categories,\n categorySelected: \"Partners\",\n branchSelected: isDevMode() ? \"staging\" : \"latest\",\n searchString: ''\n };\n }\n\n render() {\n const codapBaseUrl = \"https://codap.concord.org\";\n const plugins = this.state.dataInteractives;\n const categories = this.state.categories;\n const categorySelected = this.state.categorySelected;\n const branchSelected = this.state.branchSelected;\n const searchString = this.state.searchString;\n let path;\n switch (branchSelected) {\n case \"latest\":\n path = \"/releases/latest/\"\n break;\n case \"staging\":\n path = \"/releases/staging/\"\n break;\n case \"stable\":\n path = \"/app/\"\n break;\n case \"branch\":\n path = \"/~jsandoe/build/\"\n break;\n }\n const url = codapBaseUrl+path;\n let tabIndex = categories.findIndex(entry => entry.category === categorySelected);\n\n return (\n