diff --git a/articles/carbon-removal-mechanisms/components/cycle.js b/articles/carbon-removal-mechanisms/components/cycle.js index 1fcd0396..d179218f 100644 --- a/articles/carbon-removal-mechanisms/components/cycle.js +++ b/articles/carbon-removal-mechanisms/components/cycle.js @@ -251,73 +251,71 @@ const Cycle = ({ tag, data, labels, intro }) => { } return ( - - - - + + + - - + - - {arrow('land', 'material', 78)} - {arrow('material', 'geological', 43)} - {arrow('fuel', 'geological', 60, 1)} - + + {arrow('land', 'material', 78)} + {arrow('material', 'geological', 43)} + {arrow('fuel', 'geological', 60, 1)} + - - {element('fuel', 0)} - {element('geological', 70)} - {element('material', 140)} - {element('land', 210)} - {element('ocean', 280)} - + + {element('fuel', 0)} + {element('geological', 70)} + {element('material', 140)} + {element('land', 210)} + {element('ocean', 280)} + - {labels && ( - <> - - - Atmosphere - - {label('Fuels', 16)} - {label('Geologic', 73)} - {label('Material', 148)} - {label('Land', 228)} - {label('Ocean', 293)} - - - )} - - - - - + {labels && ( + <> + + + Atmosphere + + {label('Fuels', 16)} + {label('Geologic', 73)} + {label('Material', 148)} + {label('Land', 228)} + {label('Ocean', 293)} + + + )} + + + + ) } diff --git a/articles/carbon-removal-mechanisms/index.md b/articles/carbon-removal-mechanisms/index.md index 492a37c9..384fa450 100644 --- a/articles/carbon-removal-mechanisms/index.md +++ b/articles/carbon-removal-mechanisms/index.md @@ -1,4 +1,5 @@ import { Cite, Endnote, PullQuote } from '@carbonplan/layouts' +import { Figure } from '@carbonplan/components' import Cycle from './components/cycle' export const meta = { @@ -43,12 +44,14 @@ Increased carbon in the atmosphere causes warming at the Earth’s surface. Sinc To help the reader develop intuition about carbon removal, we use “intervention diagrams” to succinctly illustrate the impact of specific projects. A blank diagram looks like this: - +
+ +
For any given project, we use colors to highlight which stocks are involved and which fluxes are enhanced or blocked. We dim the others. @@ -60,38 +63,44 @@ With this diagram in hand, let’s build our intuition by first stepping through Consider the process of storing carbon dioxide in mineral form via injection into basaltic rock, which results in effectively permanent CO₂ storage. Using our diagram, we show geologic storage by filling in the appropriate circle indicating where carbon is ultimately stored. - +
+ +
Does geologic injection lead to carbon removal? The answer depends on where the CO₂ came from. Let’s imagine the CO₂ is waste from some industrial process that burns a carbon-based fossil fuel. Injecting the captured CO₂ from a fossil energy waste stream into geologic storage permanently stores CO₂, but has not taken it out of the atmosphere because the source of the carbon was a fossil fuel and was destined for the atmosphere if not captured first. As a result of the project’s decision to capture and store carbon, CO₂ emissions that might have otherwise occurred are avoided instead. We call this outcome “avoided emissions” and distinguish it from “carbon removal.” We diagram it with a crossed out circle blocking the arrow from fuels to the atmosphere, and drawing a horizontal arrow from fuels to geologic storage. - +
+ +
Now consider an alternative source of CO₂: the atmosphere. Suppose a project captures CO₂ from the atmosphere using direct air capture technology, and then injects pure CO₂ into the ground. This project performs carbon removal because it reduces atmospheric CO₂ and stores it in another stock. We draw this scenario by highlighting an arrow straight from the atmosphere to geologic storage. Compared to the previous example, the end location of storage remains the same, but the source of the CO₂ — and thus the source of the flux — has changed. (As drawn, this scenario assumes that direct air capture is powered by zero-carbon energy; otherwise, we would also include an arrow from fuels to the atmosphere to reflect the fact that the project leads to both atmospheric emissions and carbon removal.) - +
+ +
We distinguish these two scenarios because precision is necessary for accurate characterization and decision-making, not because one is necessarily better or worse for the climate. Either can be good or bad, depending on the context. @@ -99,17 +108,19 @@ For example, when evaluating a carbon removal project, we must consider all of t Similarly, if the captured CO₂ is used to create a synthetic fuel or to extract further fossil fuels through a process called “enhanced oil recovery,” then the overall process might accomplish little to no net carbon removal. In some circumstances, it could even emit more than it removes while continuing to enable fossil fuel production. We would diagram such a project as follows. - +
+ +
As this diagram suggests, a project’s efficacy depends on the scale of gross carbon removal (down arrow) relative to the scale of gross project emissions (up arrow). In our [project reports](https://carbonplan.org/reports) we use a summary metric called “Negativity” to capture this important aspect of projects’ lifecycle emissions. If a project performs carbon removal, but its Negativity is near 0, then it’s not an effective way of delivering climate benefits. @@ -129,14 +140,16 @@ Viewed in isolation, a tree performs carbon removal, at least for the period of In our diagram, we show the simple case of a growing forest with a circle representing the storage of carbon in the land, and an arrow representing a flux of CO₂ from the atmosphere into the land. - +
+ +
The accounting becomes more complex for projects that change existing ecological systems. @@ -148,17 +161,19 @@ But what if someone agrees to not cut down a forest they were otherwise planning These projects avoid emissions because cutting down the trees would have caused emissions in two ways — first, the industrial processes of harvesting cause emissions on their own, and second, the dead biomass leftover would decompose and emit CO₂. But they are also carbon removal because the trees left standing will continue to capture carbon from the atmosphere, with the total amount depending on their age and growth relative to saturation. We can show this in our diagram by combining the two arrows. - +
+ +
These projects address the same stock as before, but the intervention affects the flux both to and from the atmosphere. As this example illustrates, understanding a project’s net impact always depends on what would have happened in the absence of the intervention. @@ -172,31 +187,35 @@ From a narrow perspective, decomposition of biomass exposed to the atmosphere re In our diagram, we include a special storage location for such durable “materials” and we indicate a flux from land biomass into this more permanent stock. We do not, however, indicate a flux from the atmosphere into the biomass because these projects are solely responsible for the conversion, not the biomass production. Rather, we indicate an avoided emission from the land back into the atmosphere. - +
+ +
In some cases, one could reasonably argue that the broader system, including both biomass production and conversion into biochar, performs carbon removal. In this broader system, carbon fluxes from the atmosphere into land biomass; some remains as biomass; and some is stored for a long duration as biochar. Strictly from a carbon cycle perspective, it’s rather similar to the combination of direct air capture and geological sequestration described above. We could diagram that more complete system as follows. - +
+ +
But how should we label any individual project? Ultimately, it’s a judgement call. Where the situation is ambiguous, we prefer to define the system boundaries based on the project itself, rather than the abstract technology or method, because funding and decision making occur at the level of these projects. If a project manages an end-to-end system that produces biomass and converts it to biochar, then we would say the project performs carbon removal. If instead a project procures biomass from elsewhere and makes biochar, then we would say the project avoids emissions. @@ -208,47 +227,53 @@ Consider the case of creating bio-oil from sawdust and then injecting that bio-o First, we consider the narrowest boundary condition. For this scenario, we assume that the bio-oil has already been produced and that without the project, the bio-oil would be burned to produce CO₂ emissions. In this case, the project is avoiding emissions by geologically sequestering the bio-oil instead. - +
+ +
Second, we could broaden the boundary to start with the sawdust. If we assume that without the project the sawdust would decompose and produce CO₂ emissions, then the project is again avoiding emissions, in this case by processing the sawdust into bio-oil and geologically sequestering it. - +
+ +
Third, we might consider an even broader boundary that begins with the biomass production itself. Here, we assume that without the project the biomass would not have been grown. In that case, the project performs carbon removal by growing biomass, converting it into bio-oil, and geologically sequestering it. - +
+ +
As these alternative perspectives illustrate, the same basic project type can act as carbon removal or as two different variants of avoided emissions, depending on the boundary conditions we draw and the role of the project we consider within that boundary. diff --git a/articles/dac-calculator-explainer/components/boundary-condition.js b/articles/dac-calculator-explainer/components/boundary-condition.js index 4c1361e3..df02118a 100644 --- a/articles/dac-calculator-explainer/components/boundary-condition.js +++ b/articles/dac-calculator-explainer/components/boundary-condition.js @@ -8,13 +8,12 @@ const BoundaryCondition = () => { const { faux, heading } = context.theme.fonts return ( - - - - - - + + + + + + + + + TRANSPORTATION + + + + CO₂ DEPLETED AIR + + + + AIR + + + + + DIRECT AIR{' '} + + + CAPTURE + + + - - - - - - - - TRANSPORTATION - - - CO₂ DEPLETED AIR + CO₂ + + - AIR + COMPRESSION + + + - + - DIRECT AIR{' '} + HEAT / POWER{' '} - - CAPTURE + + GENERATION + + + + STORAGE + + - - - CO₂ - + + + + + - - - COMPRESSION - - - - - - - - HEAT / POWER{' '} - - - GENERATION - - - - - - STORAGE - - - - - - + + + - - - - + + + - - - - - - - - - - - - - - + + + + - - - - + + + - - - - + + + + + + ENERGY + + + RESOURCE + + + + - - - - ENERGY - - - RESOURCE - - - - - - - - - - - - - - + + + + + + ) } diff --git a/articles/dac-calculator-explainer/components/cost-summary.js b/articles/dac-calculator-explainer/components/cost-summary.js index 11cbdb91..338181a6 100644 --- a/articles/dac-calculator-explainer/components/cost-summary.js +++ b/articles/dac-calculator-explainer/components/cost-summary.js @@ -71,7 +71,7 @@ const CostSummary = ({ 'Total Cost [$/tCO2]': solarTotalCost, } return ( - + diff --git a/articles/dac-calculator-explainer/components/parameter-scenario.js b/articles/dac-calculator-explainer/components/parameter-scenario.js index bbf586e1..5d821c8b 100644 --- a/articles/dac-calculator-explainer/components/parameter-scenario.js +++ b/articles/dac-calculator-explainer/components/parameter-scenario.js @@ -24,7 +24,7 @@ const ParameterScenario = ({ } return ( - + diff --git a/articles/dac-calculator-explainer/index.md b/articles/dac-calculator-explainer/index.md index 5c470754..29747ed4 100644 --- a/articles/dac-calculator-explainer/index.md +++ b/articles/dac-calculator-explainer/index.md @@ -1,4 +1,4 @@ -import { Link, Colors, FigureCaption } from '@carbonplan/components' +import { Link, Colors, Figure, FigureCaption } from '@carbonplan/components' import { Endnote, Cite } from '@carbonplan/layouts' import BoundaryCondition from './components/boundary-condition' import ParameterScenario from './components/parameter-scenario' @@ -62,12 +62,14 @@ Techno-economic analyses (TEAs) for emerging technologies, such as DAC, rely hea Our calculator estimates the cost of a given DAC technology explicitly linked to the energy resource used to power it. In other words, the cost not only includes building the DAC facility, but also building the energy infrastructure. We do not, however, include costs for CO₂ transportation or storage. In the case of natural gas with carbon capture and storage, the carbon capture process is inside the boundary, but transportation and storage is outside. The “boundary condition” diagram below shows which costs are included. - - - Boundary conditions for the DAC cost calculator.{' '} - Purple box bounds the components considered for - our analysis. - +
+ + + Boundary conditions for the DAC cost calculator.{' '} + Purple box bounds the components considered + for our analysis. + +
Each of these cost components in turn depend on parameters, which are presented in the calculator as interactive sliders. Above each slider, a chart shows how the total net removed cost will change as you vary that parameter, conditional on the current setting of the others. So, as you change each parameter, not only can you see how the total cost changes, but you can also see how it affects sensitivity to the other parameters. Finally, a dropdown at the top lets you choose between three different sources of energy, which we will now describe. @@ -87,100 +89,109 @@ The third scenario uses solar photovoltaics (PV) to continuously power the DAC p With default settings, the calculator yields the highest cost for solar, second highest for wind, and lowest for NGCC. But, as we will explore, these costs reflect just one specific set of assumptions. - - - Net removed costs ($/tCO₂eq) for three energy configurations. - +
+ + + Net removed costs ($/tCO₂eq) for three energy configurations. + +
Here we explore three alternative scenarios in detail: a higher cost NGCC scenario, a lower cost wind scenario, and an NGCC scenario with a higher leakage rate. To model higher cost NGCC, we use parameters from a DAC facility described in a 2011 report from the American Physical Societies, including corrections from two additional follow-on analyses. In using these reports we are assuming a higher DAC plant cost and slightly higher electricity and thermal energy requirements than some other estimates. - - - - Summary for a higher cost NGCC scenario. - +
+ + + Summary for a higher cost NGCC scenario. + +
To model a hypothetical lower cost wind scenario, we keep the default capital expenses the same, which are based on a DAC facility described in Keith et al. (2018), and we assume lower electricity and thermal energy requirements. - - - Summary for a lower cost wind scenario. - +
+ + + Summary for a lower cost wind scenario. + +
Finally, returning to the higher cost NGCC example, we can further consider increasing the natural gas leakage rate from the default of 2.2% to 3.7%. With these parameters, net removed cost increases to $490, higher than for any of the scenarios considered thus far. - - - Summary for a higher cost NGCC scenario with higher leakage. - +
+ + + Summary for a higher cost NGCC scenario with higher leakage. + +
As these comparisons show, the energy source on its own does not determine how scenarios stack up — the full parameter space matters. For NGCC in particular, is it also possible for emissions to be so high that the system no longer achieves carbon removal. This would occur in the above scenario if we were to use a GWP20 of 86 for methane instead of a GWP100 of 32. Even with a GWP100 of 32, higher electricity and thermal requirements coupled to even higher leakage rates could result in no net removal, as shown here, though note that these are extremely high values. - - - Summary for an NGCC scenario that does not achieve carbon removal. - +
+ + + Summary for an NGCC scenario that does not achieve carbon removal. + +
A final note is that not all parameter combinations may be feasible. For example, the calculator allows users to set operating and maintenance costs to $0/tCO₂, but this would not be considered an achievable value for realistic DAC systems. diff --git a/articles/forest-offsets-explainer/components/analysis-explanation/desktop.js b/articles/forest-offsets-explainer/components/analysis-explanation/desktop.js index a3ebead3..017d69b2 100644 --- a/articles/forest-offsets-explainer/components/analysis-explanation/desktop.js +++ b/articles/forest-offsets-explainer/components/analysis-explanation/desktop.js @@ -6,11 +6,10 @@ const AnalysisExplanationDesktop = () => { const { faux, heading } = theme.fonts return ( - - - - + + + + + + + BASELINE{' '} + + + AVERAGE + + + + + + + COMMON + + + PRACTICE + + + + + + + INITIAL{' '} + + + CARBON + + + + + + HOW CREDITING WORKS + + + + + OUR ANALYSIS + + + + + + UPFRONT + + + CREDITS + + + + + + + + + + ADJUST + + + COMMON + + + PRACTICE + + + + + + + OVER- + + + CREDITING + + + + + + + + - - - - - - - + + + ) } diff --git a/articles/forest-offsets-explainer/components/analysis-explanation/mobile.js b/articles/forest-offsets-explainer/components/analysis-explanation/mobile.js index d4a0ac30..36d4e485 100644 --- a/articles/forest-offsets-explainer/components/analysis-explanation/mobile.js +++ b/articles/forest-offsets-explainer/components/analysis-explanation/mobile.js @@ -6,11 +6,10 @@ const AnalysisExplanationMobile = () => { const { faux, heading } = theme.fonts return ( - - - - + + + + + + + BASELINE{' '} + + + AVERAGE + + + + + + + COMMON + + + PRACTICE + + + + + + + INITIAL{' '} + + + CARBON + + + + + + HOW CREDITING WORKS + + + + + OUR ANALYSIS + + + + + + UPFRONT + + + CREDITS + + + + + + + + + + OVER- + + + CREDITING + + + + + + + + + + ADJUSTED + + + COMMON PRACTICE + + + + + - - - - - - + + ) } diff --git a/articles/forest-offsets-explainer/components/program-overview/index.js b/articles/forest-offsets-explainer/components/program-overview/index.js index 61b0edc5..9a162893 100644 --- a/articles/forest-offsets-explainer/components/program-overview/index.js +++ b/articles/forest-offsets-explainer/components/program-overview/index.js @@ -64,39 +64,37 @@ const Bar = ({ width, label, value, color }) => { const ProgramOverview = () => { const { theme } = useThemeUI() return ( - - - - - - - - + + + + + + ) } diff --git a/articles/forest-offsets-explainer/components/project-analysis/index.js b/articles/forest-offsets-explainer/components/project-analysis/index.js index 8bc29b7b..834dabf3 100644 --- a/articles/forest-offsets-explainer/components/project-analysis/index.js +++ b/articles/forest-offsets-explainer/components/project-analysis/index.js @@ -417,7 +417,7 @@ const ProjectAnalysis = () => { : null return ( - + diff --git a/articles/forest-offsets-explainer/components/southern-cascades/index.js b/articles/forest-offsets-explainer/components/southern-cascades/index.js index 94e8e9e8..0f37c746 100644 --- a/articles/forest-offsets-explainer/components/southern-cascades/index.js +++ b/articles/forest-offsets-explainer/components/southern-cascades/index.js @@ -92,7 +92,7 @@ const SouthernCascades = () => { }, []) return ( - + diff --git a/articles/forest-offsets-explainer/components/summary-results/index.js b/articles/forest-offsets-explainer/components/summary-results/index.js index 14a78d11..15e733ae 100644 --- a/articles/forest-offsets-explainer/components/summary-results/index.js +++ b/articles/forest-offsets-explainer/components/summary-results/index.js @@ -41,7 +41,7 @@ const sx = { const SummaryResults = () => { const { theme } = useThemeUI() return ( - + diff --git a/articles/forest-offsets-explainer/index.md b/articles/forest-offsets-explainer/index.md index d50a8f99..eee22949 100644 --- a/articles/forest-offsets-explainer/index.md +++ b/articles/forest-offsets-explainer/index.md @@ -1,5 +1,5 @@ import { Box } from 'theme-ui' -import { FigureCaption } from '@carbonplan/components' +import { Figure, FigureCaption } from '@carbonplan/components' import { Cite, Endnote } from '@carbonplan/layouts' import SummaryResults from './components/summary-results' import ProgramOverview from './components/program-overview' @@ -64,14 +64,16 @@ Carbon offsets are widely used by individuals, corporations, and governments to To better understand whether these climate claims hold up in practice, we performed a comprehensive evaluation of California's forest carbon offsets program — the largest such program in existence, worth more than $2 billion. Our analysis of crediting errors demonstrates that a large fraction of the credits in the program do not reflect real climate benefits. The scale of the problem is enormous: 29% of the offsets we analyzed are over-credited, totaling 30 million tCO₂e worth approximately $410 million. - - - Summary of results from our analysis of crediting error, in terms of net - over-crediting, percentage relative to the projects we analyzed, and value in - dollars assuming a credit value of $13.67. Each credit represents 1 tCO₂e. - Ranges report 5th and 95th percentiles of a bootstrapped distribution forming - a 90% confidence interval. - +
+ + + Summary of results from our analysis of crediting error, in terms of net + over-crediting, percentage relative to the projects we analyzed, and value + in dollars assuming a credit value of $13.67. Each credit represents 1 + tCO₂e. Ranges report 5th and 95th percentiles of a bootstrapped distribution + forming a 90% confidence interval. + +
This article provides an overview of how we identified crediting errors in California's offsets program. For a deeper dive on our methods and analysis, you can read [our preprint](https://doi.org/10.1101/2021.04.28.441870). To better understand its implications, you can read [a story](https://www.propublica.org/article/the-climate-solution-actually-adding-millions-of-tons-of-co2-into-the-atmosphere) by Lisa Song (ProPublica) and James Temple (MIT Technology Review) that covers and contextualizes our findings. Finally, you can browse [an interactive online map](https://carbonplan.org/research/forest-offsets) of the projects we analyzed, or download the open source [data](https://doi.org/10.5281/zenodo.4630712) and [code](https://github.com/carbonplan/forest-offsets) that underlies our analysis. @@ -81,26 +83,31 @@ Carbon offset programs issue credits to projects that purport to avoid greenhous California’s offsets program plays a central role in the state's prominent cap-and-trade program. While it is open to many kinds of offset projects, most credits come from forest projects, which can take place anywhere in the continental United States and southern Alaska. You might think these projects involve growing new forests, but the vast majority instead involve a practice called "improved forest management" (IFM). An IFM project claims to increase forest carbon storage through changes in existing forest management practices, such as increasing the length of timber harvest rotations. - - - California's forest carbon offsets program by the numbers. Each credit is - worth 1 tCO₂e. We analyzed 65 IFM projects for which sufficient public data - were available, totaling 102 million upfront IFM credits. These represent - about two-thirds of all forest offsets, and about one half of California’s - entire offsets program. - +
+ + + California's forest carbon offsets program by the numbers. Each credit is + worth 1 tCO₂e. We analyzed 65 IFM projects for which sufficient public data + were available, totaling 102 million upfront IFM credits. These represent + about two-thirds of all forest offsets, and about one half of California’s + entire offsets program. + +
The critical aspect of California’s forest offsets program is that it awards large volumes of credits at the start of a project when carbon stocks exceed regional averages. These "upfront" credits to IFM projects are responsible for more than half of the total carbon offsets program, and more than two-thirds of all forest credits. How are these credits awarded? Projects provide "baseline" scenarios that are meant to represent the average amount of carbon that would remain under a typical harvest scenario. The difference between the initial carbon and this baseline determines the credits awarded. To prevent unrealistic baseline scenarios, the protocol requires that the average carbon stored in a baseline scenario stays above a value called "common practice," which is defined by the average regional carbon stocks from putatively similar forest types. - - - IFM projects are awarded upfront credits based on the difference between - "initial carbon" stocks and the 100-year projected "baseline average." Under - protocol rules, baseline averages cannot be lower than common practice. Thus, - erroneously low estimates of common practice can lead to over-crediting. - +
+ + + IFM projects are awarded upfront credits based on the difference between + "initial carbon" stocks and the 100-year projected "baseline average." Under + protocol rules, baseline averages cannot be lower than common practice. + Thus, erroneously low estimates of common practice can lead to + over-crediting. + +
As it happens, about 90% of projects report baseline averages that are equal to or within just 5% of the minimum common practice number. Thus, crediting is determined almost entirely by the value of common practice — and if common practice is set too low, that means projects are getting excess credits that do not reflect real climate benefits. @@ -120,16 +127,18 @@ But ACR189 wasn’t an exception. We found this same pattern over and over again To quantify these errors systematically, we replaced projects’ common practice numbers with an independent, species-specific estimate. We then used the protocol rules to recalculate how many credits each project should have received using this more ecologically robust approach. (We also checked to make sure we could accurately reproduce the most recent common practice numbers and the number of credits projects actually received, in order to be confident in our ability to estimate any over- or under-crediting.) - - - We estimate crediting error by re-calculating the number of credits that would - have been awarded to forest offset projects with a more ecologically robust - measure of common practice. The extent of crediting error is shown as a - percent of each project's total credits (top) and in units of tCO₂e (middle). - For comparison we also show the total credits awarded to the project (bottom). - Use the menu to sort by the different metrics, and select individual bars to - see more info for that project. - +
+ + + We estimate crediting error by re-calculating the number of credits that + would have been awarded to forest offset projects with a more ecologically + robust measure of common practice. The extent of crediting error is shown as + a percent of each project's total credits (top) and in units of tCO₂e + (middle). For comparison we also show the total credits awarded to the + project (bottom). Use the menu to sort by the different metrics, and select + individual bars to see more info for that project. + +
Our analysis relied on the [digitized project records](https://doi.org/10.5281/zenodo.4630684) described above, as well as public data from the US Forest Service [Forest Inventory Analysis](https://www.fia.fs.fed.us/) program and the open source [rFIA package](https://github.com/hunter-stanke/rFIA). Our methods are described in detail in [our preprint](https://doi.org/10.1101/2021.04.28.441870) and all of the [code](https://github.com/carbonplan/forest-offsets) and [additional data](https://doi.org/10.5281/zenodo.4630712) underlying our analysis is open source and fully reproducible. @@ -143,27 +152,30 @@ The fundamental challenge with awarding upfront offset credits lies in defining This is best illustrated in the spatial pattern of projects in the Southern Cascades region described above. This "supersection" — the California program’s term for the large regions over which carbon averages are calculated — is actually composed of three smaller subregions. The subregion on the western edge features relatively wet, carbon-dense forests. But this subregion is combined with two others, which have drier and less-carbon-dense forests. Because the common practice averages across all three subregions, an "average" forest in the western subregion is automatically eligible for upfront credits — simply due to a [statistical artifact](https://en.wikipedia.org/wiki/Modifiable_areal_unit_problem), and without creating any real benefits to the climate. Almost all of the supersection’s projects cluster within this area, where they benefit from a statistical error and inappropriately enable regulated polluters to increase their emissions. - - - In the Southern Cascades supersection, three subregions (or "ecosections") - with distinct local carbon patterns were averaged together to yield a common - practice number that distorts ecological reality. The number in each subregion - shows the relative carbon compared to the supersection average, in units of - tCO₂ per acre. The western-most carbon-rich subregion ( - - green - - ) contains almost all of this supersection’s offset projects - () - , which earn credits simply by having forests with higher carbon levels - than the supersection average. Select a project - () - to see details including ID, developer, and our estimate of crediting error. - +
+ + + In the Southern Cascades supersection, three subregions (or "ecosections") + with distinct local carbon patterns were averaged together to yield a common + practice number that distorts ecological reality. The number in each + subregion shows the relative carbon compared to the supersection average, in + units of tCO₂ per acre. The western-most carbon-rich subregion ( + + green + + ) contains almost all of this supersection’s offset projects + () + , which earn credits simply by having forests with higher carbon levels + than the supersection average. Select a project + () + to see details including ID, developer, and our estimate of crediting + error. + +
While the Southern Cascades is an extreme example, any form of averaging creates an opportunity for adverse selection. Biogeographers have long understood the challenge of drawing firm boundaries around ecological regions or categories of species. While boundaries help communicate with outside audiences, border regions are complex areas where the characteristics of separate regions interact. Any program based on such boundaries must be continually reviewed to ensure the kind of adverse selection described here is not taking place. diff --git a/articles/forest-risks-explainer/components/risk-maps/index.js b/articles/forest-risks-explainer/components/risk-maps/index.js index e590f81a..b548e4f0 100644 --- a/articles/forest-risks-explainer/components/risk-maps/index.js +++ b/articles/forest-risks-explainer/components/risk-maps/index.js @@ -48,7 +48,7 @@ const RiskMaps = () => { }, []) return ( - + { return ( diff --git a/articles/forest-risks-explainer/index.md b/articles/forest-risks-explainer/index.md index 23b9ef9e..131aef25 100644 --- a/articles/forest-risks-explainer/index.md +++ b/articles/forest-risks-explainer/index.md @@ -1,5 +1,5 @@ import { Box } from 'theme-ui' -import { Table, FigureCaption } from '@carbonplan/components' +import { Table, Figure, FigureCaption } from '@carbonplan/components' import { Endnote, Cite } from '@carbonplan/layouts' import RiskMaps from './components/risk-maps' import RiskTrajectories from './components/risk-trajectories' @@ -55,33 +55,34 @@ We analyzed the historical relationship between climate conditions and three key We projected risks to forests based on three future climate scenarios (“shared socioeconomic pathways” or SSPs) using data from the Coupled Model Intercomparison Project Phase 6 (CMIP6). These scenarios incorporate socioeconomic and climate factors to describe different future levels of emissions and subsequent climate change. - +
+
+ Although SSP2-4.5 is the lowest emissions scenario we include, it is considered “middle-of-the-road” in terms of the [full suite of scenarios](https://gmd.copernicus.org/articles/13/3571/2020/) and still results in warming that exceeds the limits set by the Paris Agreement. Note that there is significant uncertainty as to the likelihood of some of these scenarios given current trends, but together they offer a view at the range of future outcomes. @@ -89,32 +90,34 @@ Our full high-resolution results can be browsed in a live [web mapping tool](htt Note that projected "risk" here means slightly different things for the different forms of disturbance. Fire risk represents the probability of at least one moderate or high severity fire within a 20 year period. Drought and insect risks represent the expected mortality (as a fraction) over a 20 year period related to each of the factors. While qualitatively comparable, full harmonization would require further assumptions about the fraction of biomass lost in fires and expected background levels of mortality. - - - Risks to forests projected through the 21st century.{' '} - - Fire - {' '} - risk represents the probability of at least one moderate or high severity fire - within a twenty year period.{' '} - - Drought - {' '} - and{' '} - - insect - {' '} - risks represent the expected mortality (as a fraction) related to each of the - factors. Adjusting the sliders next to each panel raises or lowers the - threshold for when a pixel will appear, denoting a location at or exceeding - that risk level. The{' '} - - biomass - {' '} - map shows, as a reference, locations with an estimated biomass of at least 1 - tC/ha in 2020. Pan through years (lower right) or change emissions scenario - (lower left) to see risks change. - +
+ + + Risks to forests projected through the 21st century.{' '} + + Fire + {' '} + risk represents the probability of at least one moderate or high severity + fire within a twenty year period.{' '} + + Drought + {' '} + and{' '} + + insect + {' '} + risks represent the expected mortality (as a fraction) related to each of + the factors. Adjusting the sliders next to each panel raises or lowers the + threshold for when a pixel will appear, denoting a location at or exceeding + that risk level. The{' '} + + biomass + {' '} + map shows, as a reference, locations with an estimated biomass of at least 1 + tC/ha in 2020. Pan through years (lower right) or change emissions scenario + (lower left) to see risks change. + +
Historically, areas with high wildfire risk (regions covered with orange dots) are predominantly in the mountains of the western US, especially California, the northern Rocky Mountains, and the southwest. Areas of high mortality for insects and drought were generally in the Rocky Mountains of Idaho, Montana, and Colorado. @@ -130,20 +133,22 @@ Our insect and drought models were partially limited by noisy observational fore In the future, all US-averaged risks are projected to increase in severity throughout the 21st century. Changes depend substantially on emissions scenario, with modeled increases by 2090 ranging from 4-14x for fire and 1.3-1.8x for drought and insects. However, the severity of the risk change will depend on location, which you can explore in the interactive graphic below. - - - Trajectory of risks under three future climate change emissions scenarios:{' '} - - SSP5-8.5 (high) - - , - SSP3-7.0 (medium) - , and - SSP2-4.5 (low) - . Averaging risks regionally (upper left) reveals how risks depend on location. - The ensemble mean of 6 global climate models is dark while light traces indicate - each individual ensemble member. Historical period shown in gray. - +
+ + + Trajectory of risks under three future climate change emissions scenarios:{' '} + + SSP5-8.5 (high) + + , + SSP3-7.0 (medium) + , and + SSP2-4.5 (low) + . Averaging risks regionally (upper left) reveals how risks depend on location. + The ensemble mean of 6 global climate models is dark while light traces indicate + each individual ensemble member. Historical period shown in gray. + +
The west coast, which is already beleaguered by fire risk, has the potential to experience intense growth in risk such that by 2090 fire risk could exceed 50% in the high emissions scenario. By the end of the century, the historically low-fire risk southeast could have levels of fire risks similar to the present-day west coast. Increases in drought mortality are most striking in the southwest, where climate change could increase drought mortality by about 3x. As mentioned above, projections are more uncertain for drought and insect mortality, and vary depending on the decade and the underlying individual climate model (with individual model scenarios shown in pale traces, compared to the multi-model mean shown with thicker lines). diff --git a/articles/microsoft-2021-insights/components/distributions.js b/articles/microsoft-2021-insights/components/distributions.js index 406d6026..f2d07d3b 100644 --- a/articles/microsoft-2021-insights/components/distributions.js +++ b/articles/microsoft-2021-insights/components/distributions.js @@ -30,7 +30,7 @@ const sx = { const Distributions = () => { return ( - + Volume tCO₂ diff --git a/articles/microsoft-2021-insights/components/metrics.js b/articles/microsoft-2021-insights/components/metrics.js index c526f59f..7eeac500 100644 --- a/articles/microsoft-2021-insights/components/metrics.js +++ b/articles/microsoft-2021-insights/components/metrics.js @@ -39,9 +39,6 @@ const Metrics = () => { [6, 2, 2, 2], [6, 4, 4, 4], ]} - sx={{ - my: [6, 6, 6, 7], - }} /> ) } diff --git a/articles/microsoft-2021-insights/components/numbers.js b/articles/microsoft-2021-insights/components/numbers.js index e6eb951e..6d3a7faa 100644 --- a/articles/microsoft-2021-insights/components/numbers.js +++ b/articles/microsoft-2021-insights/components/numbers.js @@ -52,7 +52,7 @@ const sx = { const Numbers = () => { return ( - + { } return ( - + { return ( - + Mechanism diff --git a/articles/microsoft-2021-insights/index.md b/articles/microsoft-2021-insights/index.md index 61c93041..de871259 100644 --- a/articles/microsoft-2021-insights/index.md +++ b/articles/microsoft-2021-insights/index.md @@ -1,4 +1,4 @@ -import { FigureCaption, Colors } from '@carbonplan/components' +import { Figure, FigureCaption, Colors } from '@carbonplan/components' import { PullQuote, Endnote } from '@carbonplan/layouts' import InlineCheck from '../../components/inline-check' import Distributions from './components/distributions' @@ -47,34 +47,40 @@ In early 2020, Microsoft announced a [commitment to purchase carbon removal](htt We received early access to these now-public proposals to perform our independent analysis. We evaluated 161 of 189 proposals, excluding 28 because of missing, incomplete, or duplicative information (see Figure 1). - - - Summary numbers across the project proposals we analyzed. All fractions are - expressed in terms of volume (which is in units of tCO₂). - +
+ + + Summary numbers across the project proposals we analyzed. All fractions are + expressed in terms of volume (which is in units of tCO₂). + +
While existing registries and protocols purport to standardize aspects of carbon removal procurement, we were struck by the enormous diversity of proposals. 16 registries and 45 unique protocols were represented — and still, less than 30% of projects had any affiliation with a registry or protocol. As [highlighted by Carbon Direct](https://carbon-direct.com/responsible-carbon-removal-means-putting-science-first/), we also found that the existence of registry listings did not reliably predict project quality one way or the other, although projects on registries were likely to feature more public project documentation than those that were not. Using the public proposals, project websites, registry listings, and published literature, we analyzed each of the 161 proposals on the basis of [seven harmonized metrics](https://carbonplan.org/research/cdr-database/methods). - +
+ +
Metric validation is done on the basis of project proposals, which may or may not reflect reality; we do not purport to verify what projects claim, only to analyze the consistency and validity of the claims themselves. Volume in particular, must be interpreted with care because applicants appear to have made different, diverging assumptions around what numbers to report. We saw offers of volumes already generated, volumes to be generated in the coming year, and volumes to be generated over the next decade or more. This variety, which we attempt to document in the database notes and comments, reflects the complex reality of what projects are attempting to achieve on the ground — a reality that buyers must understand to make responsible decisions. As a result, the numbers should not be compared on an apples-to-apples basis without paying close attention to the details. Distributions of volume and permanence across projects reveal familiar patterns, with notable categorical distinctions (Figure 2). Forest and soil projects tend to have the largest volumes and the lowest permanence, though we again caution that volumes should not be taken at face value. Permanence is generally higher for biomass projects, and 1000+ years or more is common for mineralization and direct air capture. Volumes claimed for these categories vary widely, depending on whether projects proposed prototypes in progress, speculative future plans, or something in between. All three direct air capture projects, in particular, proposed scaling up existing deployments and thus offered very large volumes. - - - Distributions of volume (above) and permanence (below) across six project - categories: forests,{' '} - soil, biomass,{' '} - ocean, mineralization,{' '} - direct air capture. Each circle - represents a project, and curves show the distribution using a kernel density - estimate. Values reflect project proposals and may not necessarily be accurate - or realistic. - +
+ + + Distributions of volume (above) and permanence (below) across six project + categories: forests,{' '} + soil, biomass,{' '} + ocean, mineralization,{' '} + direct air capture. Each circle + represents a project, and curves show the distribution using a kernel density + estimate. Values reflect project proposals and may not necessarily be accurate + or realistic. + +
To help guide interpretation of these metrics, we validate with a the mechanism, volume, negativity, and permanence of each project if we can independently confirm claims with reasonable confidence, based on the best available science, data, and public documentation. Where we don’t feel confident about validation, we simply report the project claim without giving it a . In the case of additionality (would the claimed climate benefits occur without the project?) and specificity (was there enough information for us to perform our analysis?) we assign a qualitative score on a scale of 1 to 3. @@ -91,16 +97,18 @@ We learned a lot performing this analysis, both from the content of the proposal In our previous round of analysis, we often found ourselves unable to confidently and independently validate projects’ claims. That was also the case here (see Figure 3). - - - Fraction of validated projects across five metrics and six project categories:{' '}forests,{' '} - soil, biomass,{' '} - ocean, mineralization,{' '} - direct air capture. Each bar shows - the fraction of projects (from 0 to 1) in that category for which we were able - to validate the given metric. In the case of additionality, which uses a 3 - point scale, validation here is defined as a score of at least 2. - +
+ + + Fraction of validated projects across five metrics and six project categories:{' '}forests,{' '} + soil, biomass,{' '} + ocean, mineralization,{' '} + direct air capture. Each bar shows + the fraction of projects (from 0 to 1) in that category for which we were able + to validate the given metric. In the case of additionality, which uses a 3 + point scale, validation here is defined as a score of at least 2. + +
The missing information tended to vary by project category. @@ -128,15 +136,17 @@ Across all metrics and categories, our ability to validate project claims depend Permanence is a critical dimension when considering carbon removal. Carbon dioxide emissions create an effectively permanent climate problem, so carbon removal needs to provide durable and ideally permanent storage. The recently proposed [Oxford Taxonomy of Offsets](https://www.smithschool.ox.ac.uk/publications/reports/Oxford-Offsetting-Principles-2020.pdf) distinguishes projects based on their mechanism (avoided emissions or carbon removal) and the permanence of any applicable carbon storage (short or long duration). The framework encourages buyers seeking to offset their emissions to shift their procurement decisions toward Type 5 (long duration carbon removal) as much as possible — and only after making deep cuts to existing emissions. - - - Categorizing projects using the Oxford Taxonomy. Fractions falling into each - category are expressed in terms of volume relative to the set purchased by - Microsoft. Fractions were similar when expressed relative to the full set of - proposals. Durations of “short” and “long” storage do not have strict - definitions in the Oxford Taxonomy, so we assumed a threshold of 500 years to - separate the categories. - +
+ + + Categorizing projects using the Oxford Taxonomy. Fractions falling into each + category are expressed in terms of volume relative to the set purchased by + Microsoft. Fractions were similar when expressed relative to the full set of + proposals. Durations of “short” and “long” storage do not have strict + definitions in the Oxford Taxonomy, so we assumed a threshold of 500 years + to separate the categories. + +
Microsoft’s RFP solicited carbon removal, so it nominally considered only Types 4 and 5. The project proposals, however, included avoided emissions and carbon removal each with both short- and long-lived storage (Types 2 through 5). diff --git a/articles/offset-project-fire/components/fire-map.js b/articles/offset-project-fire/components/fire-map.js index f48b233b..09456de6 100644 --- a/articles/offset-project-fire/components/fire-map.js +++ b/articles/offset-project-fire/components/fire-map.js @@ -81,14 +81,7 @@ const FireMap = () => { }, []) return ( - + { }, [risk, mortality]) return ( - + The map below shows the region of the fire and the project area boundary. - - - Intersection between the Riverside / Beachie Creek / Lionshead fire and forest - offset project ACR260. Red area shows cumulative area - burned through the date selected on the slider. - +
+ + + Intersection between the Riverside / Beachie Creek / Lionshead fire and + forest offset project ACR260. Red area shows + cumulative area burned through the date selected on the slider. + +
Second, we need to estimate the fraction of carbon lost due to fire-related mortality. Estimating carbon loss will ultimately require detailed assessment on the ground, which we lack today. As a historical reference point, the 2003 B&B fire, which burned nearby under similar conditions, ultimately killed almost half the trees it encountered. Though the situation in Oregon is still evolving, we can calculate the carbon impacts that would arise from a similar outcome in this incident. At a 50% loss of carbon in the 72% of the ACR260 project area burned through September 17, the Lionshead Fire will have reversed 963,534 credits (about 4% of the total buffer pool). In a worst case scenario in which the entirety of the project burns and all credited carbon is lost, more than 11% of the buffer pool could be depleted. @@ -88,13 +90,15 @@ To explore this question, we built a simple model that asks what the experience Our model starts by asking what would happen in a year where the same number of offset credits in the ACR260 project experience a fire. We then vary two parameters: the fraction of carbon lost in each event and the frequency with which such events might occur. In the calculator below, you can select values for these two variables and simulate futures that show, as a function of time, the fraction of the buffer pool depleted. - - - A simple stochastic model predicts buffer pool depletion as a function of the - severity and frequency of fires. Individual red lines - show different simulations. The dashed line at 20% shows the approximate - fraction of the buffer pool for fire. - +
+ + + A simple stochastic model predicts buffer pool depletion as a function of + the severity and frequency of fires. Individual red{' '} + lines show different simulations. The dashed line at 20% shows the + approximate fraction of the buffer pool for fire. + +
Under a scenario in which carbon loss is 50% in burned areas and events of this magnitude occur once every 4 years, fire alone could consume the entirety of the buffer pool by 2100, despite the fact that the buffer pool is intended to insure against many other non-fire risks. diff --git a/articles/permanence-calculator-explainer/components/parameters.js b/articles/permanence-calculator-explainer/components/parameters.js index 8245a936..d1439b7f 100644 --- a/articles/permanence-calculator-explainer/components/parameters.js +++ b/articles/permanence-calculator-explainer/components/parameters.js @@ -1,5 +1,5 @@ import { Box } from 'theme-ui' -import { Table } from '@carbonplan/components' +import { Figure, Table } from '@carbonplan/components' const Top = ({ children }) => { return ( @@ -78,21 +78,22 @@ const table = [ const Parameters = ({}) => { return ( -
+
+
+ ) } diff --git a/articles/permanence-calculator-explainer/components/scenario.js b/articles/permanence-calculator-explainer/components/scenario.js index 31d7a968..6cc2b2d8 100644 --- a/articles/permanence-calculator-explainer/components/scenario.js +++ b/articles/permanence-calculator-explainer/components/scenario.js @@ -1,7 +1,7 @@ -import { Box, Grid, Divider } from 'theme-ui' +import { Box, Divider } from 'theme-ui' import { scaleLinear } from 'd3-scale' import { line } from 'd3-shape' -import { Row, Column } from '@carbonplan/components' +import { Figure, Row, Column } from '@carbonplan/components' const Scenario = ({ projectDuration, @@ -81,7 +81,7 @@ const Scenario = ({ } return ( - +
@@ -182,7 +182,7 @@ const Scenario = ({ - +
) } diff --git a/articles/seaweed-farming-explainer/components/cost-calculator/cost-calculator.js b/articles/seaweed-farming-explainer/components/cost-calculator/cost-calculator.js index 57bdd1e8..b2b24566 100644 --- a/articles/seaweed-farming-explainer/components/cost-calculator/cost-calculator.js +++ b/articles/seaweed-farming-explainer/components/cost-calculator/cost-calculator.js @@ -85,7 +85,7 @@ const CostCalculator = () => { (target === 'products' ? cost - parameters.productValue : cost) / benefit return ( - + diff --git a/articles/seaweed-farming-explainer/components/growth-chart/growth-chart.js b/articles/seaweed-farming-explainer/components/growth-chart/growth-chart.js index 896373cf..a075cbe2 100644 --- a/articles/seaweed-farming-explainer/components/growth-chart/growth-chart.js +++ b/articles/seaweed-farming-explainer/components/growth-chart/growth-chart.js @@ -92,7 +92,7 @@ const GrowthChart = () => { }) return ( - + Target { const colormap = useThemedColormap('cool').slice(20) return ( - + - - Interactive calculator for exploring the costs of growing seaweed alongside - its potential climate benefits for seaweed sinking or biomass products. - Circles on the map can be selected to populate biophysical parameters for each - location. Sliders adjust the values of technoeconomic parameters used by the - model. Values at the top report the production cost, the climate benefit, and - the removal cost (for sinking) or mitigation cost (for products), which can be - obtained as the production cost divided by the climate benefit (less product - value in the case of mitigation cost). - +
+ + + Interactive calculator for exploring the costs of growing seaweed alongside + its potential climate benefits for seaweed sinking or biomass products. + Circles on the map can be selected to populate biophysical parameters for + each location. Sliders adjust the values of technoeconomic parameters used + by the model. Values at the top report the production cost, the climate + benefit, and the removal cost (for sinking) or mitigation cost (for + products), which can be obtained as the production cost divided by the + climate benefit (less product value in the case of mitigation cost). + +
## Assumptions and caveats @@ -109,23 +111,27 @@ Our model and tool help highlight important targets for research and innovation. Even if seed and capital costs are minimized, seaweed-based CDR seems likely to be more expensive than alternatives like direct air capture, and it is not clear that there are viable and large markets for seaweed products. These factors, combined with the challenges inherent to verification and monitoring as well as the potential for ecosystem disruption, suggest that expansion of seaweed cultivation should be approached with caution. - - - Estimated costs of using farmed seaweed for carbon removal (sinking) or - avoiding GHG emissions (feed, food, fuel). Maps show optimistically low net - costs (5th percentile) from ambient nutrient simulations. - +
+ + + Estimated costs of using farmed seaweed for carbon removal (sinking) or + avoiding GHG emissions (feed, food, fuel). Maps show optimistically low net + costs (5th percentile) from ambient nutrient simulations. + +
## Looking ahead Future work should focus on targeted research and development of large-scale seaweed farms in the most economically-feasible locations to further reduce uncertainties. In particular, the biophysical uncertainty surrounding the atmospheric removal fraction (the amount that growing and sinking seaweed reduces atmospheric CO₂) must be resolved to appropriately assess and validate seaweed as a negative emissions strategy. Among the economic uncertainties, reducing uncertainty in the availability and size of markets for seaweed products is especially important, and reducing uncertainty in the cost of capital and seeded line through deployment of more large farms will help clarify the economic potential of seaweed farming at scales relevant to the global carbon budget. Additionally, the seaweed farming industry would have to expand at unprecedented rates for seaweed to provide gigaton-scale climate benefits annually, as shown in Figure 3. - - - Growth of seaweed farming required to reach 2030 and 2050 goals of 1 Gt CO₂e - annually for sinking and biomass products. For reference, 350K km² is - approximately 0.1% of the world’s oceans. - +
+ + + Growth of seaweed farming required to reach 2030 and 2050 goals of 1 Gt CO₂e + annually for sinking and biomass products. For reference, 350K km² is + approximately 0.1% of the world’s oceans. + +
Producing seaweed in the lowest-cost areas to reach 1 Gt CO₂e of emissions avoided or 1 Gt CO₂ removal by 2050 would entail the area farmed to increase by roughly 13% or 17% per year, respectively, compared to the 2000-2018 seaweed farming industrial growth rate of 6%. Achieving the same level of climate benefits from seaweed by 2030 increases the implied expansion rate of farms to roughly 44% or 60% per year for emissions avoided or carbon removed, respectively. diff --git a/articles/soil-carbon-comment/components/conclusions.js b/articles/soil-carbon-comment/components/conclusions.js index 1861c17a..32e4ef37 100644 --- a/articles/soil-carbon-comment/components/conclusions.js +++ b/articles/soil-carbon-comment/components/conclusions.js @@ -1,5 +1,4 @@ -import { Box } from 'theme-ui' -import { Table } from '@carbonplan/components' +import { Figure, Table } from '@carbonplan/components' const additionality = [ [ @@ -117,11 +116,7 @@ const TableWrapper = ({ data, header, first = false }) => { const Conclusions = () => { return ( - +
{ data={samplingAndVerification} /> - +
) } diff --git a/articles/soil-depth-sampling/components/country/index.js b/articles/soil-depth-sampling/components/country/index.js index de2a6708..c550961c 100644 --- a/articles/soil-depth-sampling/components/country/index.js +++ b/articles/soil-depth-sampling/components/country/index.js @@ -89,7 +89,7 @@ const Country = ({ map, selected, locations }) => { }, []) return ( - + { const { mono, heading } = context.theme.fonts return ( - - - - - - + + TILLED + + - TILLED + + NEWLY + + + COUNTED + + + CARBON + - - - - NEWLY - - - COUNTED - - - CARBON - - - - - - - - - - + + + + - - + - - + - - - - - - + + + + + - - - + - - - - - + + + + - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + - - - - - + + + - - - - - + - - - - + + + - - - - - + - - - - - + + + + - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NO-TILLED + + + + CONVERSION TO + + + NO-TILL + + + + + + - NO-TILLED + + PLOW + + + LAYER + + + + - - CONVERSION TO + + INCREASED - - NO-TILL + + DENSITY - - - - - - - PLOW - - - LAYER - - - - - - - - INCREASED - - - DENSITY - - - + + + - - - - - - 30 cm - - - 30 cm - + + + 30 cm + + + 30 cm + + + - - - - + + + - - - - - - - - - + + + + + ) } diff --git a/articles/soil-depth-sampling/components/depth/index.js b/articles/soil-depth-sampling/components/depth/index.js index 791a4e76..0f6f4a5a 100644 --- a/articles/soil-depth-sampling/components/depth/index.js +++ b/articles/soil-depth-sampling/components/depth/index.js @@ -35,7 +35,7 @@ const Depth = () => { }, []) return ( - + - - Reported effect sizes for conversion to no-till as a function of depth from - six synthesis papers, in order from left to right: Bai et al. (2019), Mondal - et al. (2020), Xiao et al. (2020), Nunes et al. (2020), Du et al. (2017), and - Angers et al. (2008). Relative carbon increases under no-till are shown in - orange, while losses are shown in gray. The number above each chart shows the - value for that dataset at the position of the horizontal line. Du et al. - (2017) and Angers et al. (2008) reported geometric mean effect sizes; the - remaining studies reported arithmetic mean effect sizes. - +
+ + + Reported effect sizes for conversion to no-till as a function of depth from + six synthesis papers, in order from left to right: Bai et al. (2019), Mondal + et al. (2020), Xiao et al. (2020), Nunes et al. (2020), Du et al. (2017), + and Angers et al. (2008). Relative carbon increases under no-till are shown + in orange, while losses are shown in gray. The number above each chart shows + the value for that dataset at the position of the horizontal line. Du et al. + (2017) and Angers et al. (2008) reported geometric mean effect sizes; the + remaining studies reported arithmetic mean effect sizes. + +
The impact of tillage on soil carbon seems to depend on the environment. In some contexts – colder, wetter climates, for instance – increased carbon at the surface and reduced carbon at depth tend to offset each other. In warmer and drier environments, reduced carbon storage at depth seems to be less common and the overall effect of no-till on carbon storage may be positive. These conclusions depend on how climate and soil type are taken into account across studies, however, so it is not surprising that different papers have found different answers. @@ -83,13 +85,15 @@ Tillage breaks up the soil structure, essentially “fluffing up” the soil and The difference in soil density under no-till versus conventional tillage can affect carbon stock estimates. We illustrate this in Figure 2. On the left, a field is sampled to a fixed depth of 30 cm and carbon stocks are calculated at that depth. After conversion to no-till, the density of the plow layer increases, shifting the soil surface downwards slightly. If the same volume (or depth) of soil is then collected, soil particles that would have been left out before are now included, leading to a larger carbon stock estimate. This larger carbon stock estimate would be entirely due to changing the frame of reference for sampling. - - - Conversion to no-till agriculture increases soil density in the plow layer. If - a fixed sampling depth is used, more soil is counted. Failing to account for - this artifact results in extra carbon even if the actual carbon stock remains - unchanged. - +
+ + + Conversion to no-till agriculture increases soil density in the plow layer. + If a fixed sampling depth is used, more soil is counted. Failing to account + for this artifact results in extra carbon even if the actual carbon stock + remains unchanged. + +
This potential measurement artifact is easy to avoid. Soil scientists have devised a method for reporting carbon stocks based on soil mass instead of soil volume. Using this “equivalent soil mass” accounting requires taking soil samples at multiple depth intervals. These intervals can be analyzed separately or combined in pre-calculated amounts to reduce analysis costs. The equivalent soil mass method uses a mathematical function to weight the data from different depth intervals, yielding an estimate of the carbon stored in a given mass of soil within an area of land. The extra mathematical step makes this method slightly more complicated, but it doesn’t require new equipment or significantly increase costs. @@ -103,17 +107,19 @@ To illustrate the potential for sampling depth issues to impact crediting outcom We ran three simulations corresponding to low, medium, or high magnitudes of error. In the medium case — a 3% increase in density over the top 20 cm — failing to account for density would lead to over-reporting of true soil carbon gains of 367 million tCO₂, equivalent to 58% of the [total annual emissions from the US agricultural sector](https://www.epa.gov/ghgemissions/inventory-us-greenhouse-gas-emissions-and-sinks-1990-2019) in 2019. - - - Simulating the potential scale of a measurement artifact related to density. - The color of each dot shows the scale of the potential error in units of tCO₂ - / ha. The three scenarios correspond to an increase of 1% of density in the - top 10 cm, 3% in the top 20 cm, or 5% in the top 30 cm, which result in a low, - medium, or high magnitude of error, respectively, if density is not corrected - for. If applied across all available land, the total magnitude of error under - the three scenarios would be 61 million tCO₂, 367 million tCO₂, or 913 million - tCO₂. - +
+ + + Simulating the potential scale of a measurement artifact related to density. + The color of each dot shows the scale of the potential error in units of + tCO₂ / ha. The three scenarios correspond to an increase of 1% of density in + the top 10 cm, 3% in the top 20 cm, or 5% in the top 30 cm, which result in + a low, medium, or high magnitude of error, respectively, if density is not + corrected for. If applied across all available land, the total magnitude of + error under the three scenarios would be 61 million tCO₂, 367 million tCO₂, + or 913 million tCO₂. + +
This calculation is meant to be illustrative, not conclusive. It is unlikely that 100% of US croplands would enroll in carbon programs crediting no-till practices, and presumably at least some would use measurement techniques that account for the density change effect. The SSURGO data we used also do not contain information about tillage, so our calculations do not directly simulate conversion to no-till. Albeit highly approximate, our analysis illustrates how a seemingly small measurement artifact can add up to a lot of mistakenly credited carbon over a large land area. diff --git a/articles/soil-protocols-explainer/components/metric-histogram.js b/articles/soil-protocols-explainer/components/metric-histogram.js index 365d6d43..6a55f0e7 100644 --- a/articles/soil-protocols-explainer/components/metric-histogram.js +++ b/articles/soil-protocols-explainer/components/metric-histogram.js @@ -45,7 +45,7 @@ const sx = { const MetricHistogram = () => { return ( - + Rigor diff --git a/articles/soil-protocols-explainer/components/recommendation-table.js b/articles/soil-protocols-explainer/components/recommendation-table.js index dbdb44d3..c2718627 100644 --- a/articles/soil-protocols-explainer/components/recommendation-table.js +++ b/articles/soil-protocols-explainer/components/recommendation-table.js @@ -30,9 +30,6 @@ const RecommendationTable = () => { [6, 1, 1, 1], [6, 5, 5, 5], ]} - sx={{ - my: [6, 6, 6, 7], - }} /> ) } diff --git a/articles/soil-protocols-explainer/components/score-summary.js b/articles/soil-protocols-explainer/components/score-summary.js index 6669133f..7e31be84 100644 --- a/articles/soil-protocols-explainer/components/score-summary.js +++ b/articles/soil-protocols-explainer/components/score-summary.js @@ -1,8 +1,6 @@ -import { Box, Divider } from 'theme-ui' -import { Row, Column } from '@carbonplan/components' +import { Divider } from 'theme-ui' +import { Figure, Row, Column } from '@carbonplan/components' import Squares from './squares' -import Rating from './rating' -import { sx } from './styles' import { scoreDescriptions } from './score-descriptions' const Entry = ({ start, id, label, value }) => { @@ -28,13 +26,13 @@ const Entry = ({ start, id, label, value }) => { const ScoreSummary = ({ id }) => { return ( - +
- +
) } diff --git a/articles/soil-protocols-explainer/components/timeline-summary.js b/articles/soil-protocols-explainer/components/timeline-summary.js index b53c793d..40a6802b 100644 --- a/articles/soil-protocols-explainer/components/timeline-summary.js +++ b/articles/soil-protocols-explainer/components/timeline-summary.js @@ -4,7 +4,7 @@ import Timeline from './timeline' const TimelineSummary = () => { return ( - + - - - Summary table of our results. Each protocol is a row. The first four columns - show scores along four individual metrics (each on a scale from 1 to 3) and - the final column shows the overall rating (on a scale from 1 to 5). For more - details, check out the{' '} - - interactive version - {' '} - of this table. Abbreviations: Grazing (G), Compost (C) Improved Agriculture - (IA), Sustainable Agriculture (SA), Fire + Grazing (FG) - +
+ + + Summary table of our results. Each protocol is a row. The first four columns + show scores along four individual metrics (each on a scale from 1 to 3) and + the final column shows the overall rating (on a scale from 1 to 5). For more + details, check out the{' '} + + interactive version + {' '} + of this table. Abbreviations: Grazing (G), Compost (C) Improved Agriculture + (IA), Sustainable Agriculture (SA), Fire + Grazing (FG) + +
Before describing our results, it is useful to highlight two methodological challenges we faced. The first concerns the different greenhouse gas emissions and carbon cycle processes involved in this area. Most of the protocols we reviewed credit some combination of carbon removal and avoided emissions, including CO₂ emissions unrelated to soil carbon (e.g. tractor use), and in some cases other greenhouse gases like N₂O and CH₄ that result from fertilizer use, grazing animals, or anaerobic decomposition. No protocols track carbon removal and avoided emissions separately, so buyers looking to focus exclusively on carbon removal must decipher this distinction themselves. @@ -117,13 +119,15 @@ Beyond explicit additionality tests, how a protocol treats the timing of activit To help visualize how key project milestones impact crediting, we created a timeline for each protocol that shows when an eligible activity could have been implemented relative to project registration, and for what period soil carbon changes can be credited. Here we show two hypothetical timelines representing typical and more rigorous approaches. - - - Hypothetical timelines showing when eligible activities could be implemented - relative to the start of project implementation. The typical case we observed - allows for a long period of backdating (above) whereas a more rigorous - timeline restricts this window (below). - +
+ + + Hypothetical timelines showing when eligible activities could be implemented + relative to the start of project implementation. The typical case we + observed allows for a long period of backdating (above) whereas a more + rigorous timeline restricts this window (below). + +
In the typical timeline, relevant activities can be implemented 5 to 10 years prior to project registration — something we found in 10 of 14 protocols. Some protocols allow projects to earn “back-credits” for the entirety of that historical period; others restrict the crediting window while still allowing older practice changes to earn credits going forward. If a buyer wants confidence that their purchase creates climate benefits that would not have happened otherwise, either type of backdating raises concerns. @@ -176,7 +180,9 @@ One of our most striking results is that most protocols set a low bar on soil sa We have a three-step recommendation for buyers or to anyone else looking to fund carbon removal projects involving soil. - +
+ +
Depending on their goals, we suggest that buyers also pay careful attention to distinguishing carbon removal from avoided emissions. Many of the protocols credit reductions in multiple greenhouse gases (such as avoided methane or nitrous oxide emissions), yet we have not found any evidence that registries distinguish carbon removal and avoided emissions in the credits they issue. We recommend that buyers who seek to specifically procure carbon removal ask projects to distinguish the share of total credits attributable to carbon removal from overall emission reductions. This information can be used to discount the carbon removal benefit of an individual credit. diff --git a/articles/stripe-2020-insights/components/metrics.js b/articles/stripe-2020-insights/components/metrics.js index 0f407f43..e88ce22a 100644 --- a/articles/stripe-2020-insights/components/metrics.js +++ b/articles/stripe-2020-insights/components/metrics.js @@ -39,9 +39,6 @@ const Metrics = () => { [6, 2, 2, 2], [6, 4, 4, 4], ]} - sx={{ - my: [6, 6, 6, 7], - }} /> ) } diff --git a/articles/stripe-2020-insights/components/permanence.js b/articles/stripe-2020-insights/components/permanence.js index 2fa8d09e..90d1e62d 100644 --- a/articles/stripe-2020-insights/components/permanence.js +++ b/articles/stripe-2020-insights/components/permanence.js @@ -26,12 +26,9 @@ const Permanence = () => { return ( diff --git a/articles/stripe-2020-insights/components/table.js b/articles/stripe-2020-insights/components/table.js index 897abf76..04695966 100644 --- a/articles/stripe-2020-insights/components/table.js +++ b/articles/stripe-2020-insights/components/table.js @@ -70,7 +70,7 @@ const Table = () => { const order = ['forests', 'soil', 'biomass', 'dac', 'mineralization', 'ocean'] return ( - + +
+ +
For the first four metrics — mechanism, volume, negativity, and permanence — we attempted to independently validate projects’ claims. We gave projects a when we could validate a claim with reasonable confidence. Where we didn’t feel confident about validating claims, we left the entry blank, generally erring on the side of caution and respectfulness. We also indicated what kind of additional information would be useful in comments. As we develop better methods, and as we and the community learn more about these and other projects, we expect to be able to validate more claims with confidence. @@ -80,17 +82,19 @@ Perhaps the most important finding is how often we found ourselves unable to con We were able to assign a for many projects on mechanism, for which we generally have existing published literature and data, and in several cases also on permanence. We were less often able to assign a on volume or negativity, reflecting the additional complexity of these dimensions. -
- - Each column is a metric, and each row shows our ratings for an individual - project. Colors represent project categories:{' '} - forests, soil,{' '} - biomass,{' '} - direct air capture,{' '} - mineralization, and{' '} - ocean. Click the arrow in each row to see the - report for that project. - +
+
+ + Each column is a metric, and each row shows our ratings for an individual + project. Colors represent project categories:{' '} + forests, soil,{' '} + biomass,{' '} + direct air capture,{' '} + mineralization, and{' '} + ocean. Click the arrow in each row to see the + report for that project. + + The complexity of carbon removal solutions across so many technologies @@ -107,15 +111,17 @@ Carbon dioxide remains active in the atmospheric carbon cycle for hundreds to th The projects we analyzed clustered into two distinct groups: those with permanence horizons that match the scale of the climate problem, and those that don’t. For example, projects seeking to store CO₂ underground in geologic reservoirs or in stable mineralized form have a plausible claim to carbon removal on the scale of 1000 years or more. Biochar projects, too, are likely to retain a significant fraction of their carbon in stable form for hundreds of years or more. In contrast, others that seek to store carbon in soils or forests tend to claim much shorter time horizons — some as few as one year, but more commonly between 10 and 100 years. - - - Each point shows the price and permanence for an individual project. Colors - represent project categories: forests,{' '} - soil, biomass,{' '} - direct air capture,{' '} - mineralization, and{' '} - ocean. - +
+ + + Each point shows the price and permanence for an individual project. Colors + represent project categories: forests,{' '} + soil, biomass,{' '} + direct air capture,{' '} + mineralization, and{' '} + ocean. + +
Whether temporary storage can be made reliable over longer time periods turns on whether permanence risks are physical or socioeconomic. We are optimistic that physical risks can be well characterized by rigorous science. For example, projects storing carbon in forests need to promise that these carbon stocks will remain. Quantitative analysis can help predict the vulnerability of a specific location or species in a changing climate for risk factors like fire, drought, or insect-related tree mortality. diff --git a/articles/stripe-2021-insights/components/distributions/index.js b/articles/stripe-2021-insights/components/distributions/index.js index 419ae324..2dd7f0e3 100644 --- a/articles/stripe-2021-insights/components/distributions/index.js +++ b/articles/stripe-2021-insights/components/distributions/index.js @@ -23,7 +23,7 @@ const Distributions = () => { } return ( - + { const Numbers = () => { return ( - + { setSource(key) } return ( - + 1000 year carbon storage as a key target, the fraction of projects across categories differed from what we’ve seen previously. Notably, there were no forest or soil projects proposed in this solicitation. Volumes were also lower, and prices higher. - - - Summary numbers across the project proposals we analyzed. All fractions are - expressed in terms of volume (in units of gross tCO₂). - +
+ + + Summary numbers across the project proposals we analyzed. All fractions are + expressed in terms of volume (in units of gross tCO₂). + +
Using the [now-public proposals](https://github.com/stripe/carbon-removal-source-materials), project websites, and published literature, we analyzed each proposal on the basis of [seven harmonized metrics](https://carbonplan.org/research/cdr-database/methods). Below we show distributions of two key metrics, volume and permanence, in an interactive where you can compare the three batches of proposals we’ve evaluated thus far. Compared to previous rounds, Permanence values are higher (due to Stripe’s criteria) and volumes are generally lower (likely due to limited supplies that meet these strict criteria). - - - Distributions of volume (above) and permanence (below) across six project - categories: forests,{' '} - soil, biomass,{' '} - ocean, mineralization,{' '} - direct air capture. Each circle represents a - project, and curves show the distribution using a kernel density estimate. - Permanence values and volumes reflect proposal claims, and are not necessarily - accurate or realistic. You can compare volume and permanence distributions - between the RFPs we’ve analyzed using the toggle in the upper left. - +
+ + + Distributions of volume (above) and permanence (below) across six project + categories: forests,{' '} + soil, biomass,{' '} + ocean, mineralization,{' '} + direct air capture. Each circle represents a + project, and curves show the distribution using a kernel density estimate. + Permanence values and volumes reflect proposal claims, and are not + necessarily accurate or realistic. You can compare volume and permanence + distributions between the RFPs we’ve analyzed using the toggle in the upper + left. + +
As a reminder, volume claims vary widely depending on project stage and assumed delivery timelines, and are reported here on a gross basis that does not reflect projects’ own greenhouse gas emissions. We attempt to document nuances in the database notes and comments. Volumes should not be compared directly without paying careful attention to project details. @@ -90,17 +95,20 @@ This is the second time Stripe proposals have included public offer prices expre Below we show the distributions of our price and volume metrics in an interactive where you can compare the two batches of Stripe proposals. - - - Comparing price vs volume for all projects from the 2020 and 2021 Stripe RFPs. - You can compare results using the toggle in the upper left. Only projects with - an overall rating of 2 or higher are shown, so as to ensure a minimal degree - of robustness in the data. All values are self-reported and should be - interpreted with care. Due to reporting inconsistencies, volumes are shown as - gross removal (tCO₂) whereas prices are shown as net negative removal (offered - $/net tCO₂). For the Stripe 2021 RFP data, where we had estimates of net - removal, we confirmed overall trends were similar using those values instead. - +
+ + + Comparing price vs volume for all projects from the 2020 and 2021 Stripe + RFPs. You can compare results using the toggle in the upper left. Only + projects with an overall rating of 2 or higher are shown, so as to ensure a + minimal degree of robustness in the data. All values are self-reported and + should be interpreted with care. Due to reporting inconsistencies, volumes + are shown as gross removal (tCO₂) whereas prices are shown as net negative + removal (offered $/net tCO₂). For the Stripe 2021 RFP data, where we had + estimates of net removal, we confirmed overall trends were similar using + those values instead. + +
The data show a shift toward lower volumes and higher prices, which would seem consistent with Stripe’s strong requirements around permanence. As we obtain more public data on CDR prices, more analysis of price trends and learning curves will become possible. diff --git a/articles/ton-year-explainer/components/cartoon-emissions.js b/articles/ton-year-explainer/components/cartoon-emissions.js index f94af319..38ad5a88 100644 --- a/articles/ton-year-explainer/components/cartoon-emissions.js +++ b/articles/ton-year-explainer/components/cartoon-emissions.js @@ -416,126 +416,124 @@ const Svg = () => { const CartoonEmissions = () => { return ( - - - - - + + + + - + + + + + Time + + + + + + - + + (Cost of emission) + + 2 ton-years + + + + + + + + + + + + - - - CO₂ - + CO₂ - - - +
+ + ) } diff --git a/articles/ton-year-explainer/components/cartoon-project.js b/articles/ton-year-explainer/components/cartoon-project.js index a72f465b..2e8f2178 100644 --- a/articles/ton-year-explainer/components/cartoon-project.js +++ b/articles/ton-year-explainer/components/cartoon-project.js @@ -755,14 +755,12 @@ const Svg = () => { />
@@ -771,188 +769,186 @@ const Svg = () => { const CartoonProject = () => { return ( - - - - - + + + + - + + + + + Time + + + + + - - - - - - + + + + + + + + + + + CO₂ - - - CO₂ - - - CO₂ - + CO₂ - - - +
+ + ) } diff --git a/articles/ton-year-explainer/components/emissions-chart.js b/articles/ton-year-explainer/components/emissions-chart.js index 5e276166..af73a8a4 100644 --- a/articles/ton-year-explainer/components/emissions-chart.js +++ b/articles/ton-year-explainer/components/emissions-chart.js @@ -11,7 +11,7 @@ import { Ticks, TickLabels, } from '@carbonplan/charts' -import { Column, Group, Row, Slider } from '@carbonplan/components' +import { Group, Slider } from '@carbonplan/components' import { useRef, useState } from 'react' import { getBaselineData, getIrfCurve } from './utils' @@ -62,120 +62,118 @@ const EmissionsChart = () => { } return ( - + - - - - - - - + + + + + + - - - volume - - - time - - + + + volume + + + time + + - - - - - - + + + - - - - {impact.toFixed(2)} ton-years - - Cost of emitting 1{' '} - - tCO₂ - - - - - + setTimeHorizon(Number(e.target.value))} - value={timeHorizon} - step={1} - min={1} - max={1000} /> + + + + {impact.toFixed(2)} ton-years + + Cost of emitting 1{' '} + + tCO₂ + - + + setTimeHorizon(Number(e.target.value))} + value={timeHorizon} + step={1} + min={1} + max={1000} + /> + + -
+ ) } diff --git a/articles/ton-year-explainer/components/equivalence-table.js b/articles/ton-year-explainer/components/equivalence-table.js index 240c5e70..8017f904 100644 --- a/articles/ton-year-explainer/components/equivalence-table.js +++ b/articles/ton-year-explainer/components/equivalence-table.js @@ -35,60 +35,54 @@ const sx = { const EquivalenceTable = () => { return ( - - - - - - - Storage
- amount -
- {EQUIVALENCE_VALUES.map((_, i) => ( - - 1tCO₂ - - ))} + + + + + + Storage
+ amount
- - - Storage
- period + {EQUIVALENCE_VALUES.map((_, i) => ( + + 1tCO₂ - {EQUIVALENCE_VALUES.map(([delay]) => ( - - {delay} - - - years - - - y - + ))} + + + + Storage
+ period +
+ {EQUIVALENCE_VALUES.map(([delay]) => ( + + {delay} + + + years + + + y - ))} - -
-
- - - Equivalent
- emissions +
+ ))}
- {EQUIVALENCE_VALUES.map(([delay, value]) => ( - - {value} - tCO₂ - - ))} -
-
-
+ + + + + Equivalent
+ emissions +
+ {EQUIVALENCE_VALUES.map(([delay, value]) => ( + + {value} + tCO₂ + + ))} +
+ ) } diff --git a/articles/ton-year-explainer/components/examples-table.js b/articles/ton-year-explainer/components/examples-table.js index 255ea589..9ac301c8 100644 --- a/articles/ton-year-explainer/components/examples-table.js +++ b/articles/ton-year-explainer/components/examples-table.js @@ -78,8 +78,6 @@ const table = [ const ExamplesTable = () => { return (
{ benefitPosition.left = 'calc(0.2 * (100% - 70px) + 75px)' } return ( - + Method diff --git a/articles/ton-year-explainer/components/value-chart.js b/articles/ton-year-explainer/components/value-chart.js index bda4f9f7..e1ccbc15 100644 --- a/articles/ton-year-explainer/components/value-chart.js +++ b/articles/ton-year-explainer/components/value-chart.js @@ -115,134 +115,132 @@ const ValueChart = () => { const lashofAmount = impact / lashofBenefit return ( - - - - - - - - - - - - Impact - - - - - - - - - - + + + + + + + + + + + Impact + + + + - - + + Moura Costa} /> - - - - - - - - - - + - - Equivalence Ratio - - + + Moura Costa} + /> + + + + + + + + + + - - - - + + Equivalence Ratio + + - + Moura Costa} /> - - - - - - + + + Moura Costa} + /> + + + + + ) } diff --git a/articles/ton-year-explainer/index.md b/articles/ton-year-explainer/index.md index 79dacb7d..df0c2ad9 100644 --- a/articles/ton-year-explainer/index.md +++ b/articles/ton-year-explainer/index.md @@ -1,4 +1,9 @@ -import { Link, FigureCaption, TableCaption } from '@carbonplan/components' +import { + Link, + Figure, + FigureCaption, + TableCaption, +} from '@carbonplan/components' import { Endnote, Cite, PullQuote } from '@carbonplan/layouts' import EmissionsChart from './components/emissions-chart' import MethodsChart from './components/methods-chart' @@ -69,15 +74,17 @@ If CO₂ stayed in the atmosphere permanently, the impact of an emission in ton- To demonstrate this calculation, we provide a simplified (but physically unrealistic) example in the figure below. In this example, 1 tCO₂ is emitted at t=0 and removed from the atmosphere by natural processes over four years. In the first year, the 1 tCO₂ results in 1 ton-year of atmospheric impact. In the second year, only 0.5 tCO₂ remains, resulting in another 0.5 ton-years of impact. Summing each year’s atmospheric impact over the 4 year time horizon results in a total cost of 2 ton-years. - - - A simplified example of calculating the ton-year cost of an emission. In this - example, 1 tCO₂ is emitted at t=0 and removed from the atmosphere by natural - processes over four years. The emission’s ton-year impact is summed over the - time horizon to calculate the total ton-year cost of the emission. This - example is physically unrealistic because real CO₂ emissions affect - atmospheric CO₂ concentrations for millennia.{' '} - +
+ + + A simplified example of calculating the ton-year cost of an emission. In + this example, 1 tCO₂ is emitted at t=0 and removed from the atmosphere by + natural processes over four years. The emission’s ton-year impact is summed + over the time horizon to calculate the total ton-year cost of the emission. + This example is physically unrealistic because real CO₂ emissions affect + atmospheric CO₂ concentrations for millennia. + +
### Step 04 — Calculating the ton-years of a carbon storage solution @@ -87,17 +94,19 @@ Moura Costa calculates the benefit of carbon storage in the most straightforward Lashof, in contrast, looks only at atmospheric outcomes and assumes that temporarily stored carbon is fully re-emitted at the end of the storage period. Lashof calculates the benefit of temporary carbon storage by asking how many ton-years of atmospheric impact are avoided within the specified time horizon. So if temporary carbon storage pushes some of the impact of an emission out past the chosen time horizon, Lashof considers that a quantifiable benefit. For the same Figure 2 example project and a time horizon of four years, Lashof calculates a 0.5 ton-year benefit — only one quarter of the benefit calculated by Moura Costa. - - - A simplified example of calculating the ton-year benefit of temporary carbon - storage according to two ton-year accounting methods: Moura Costa and Lashof. - In this example, a project stores 1 tCO₂ in a tree for two years, then - re-emits that carbon into the atmosphere. The emitted CO₂ is removed from the - atmosphere by natural processes over four years. Moura Costa calculates a 2 - ton-year benefit, while Lashof calculates a 0.5 ton-year benefit. This example - is physically unrealistic because real CO₂ emissions affect the atmosphere for - hundreds of thousands of years.{' '} - +
+ + + A simplified example of calculating the ton-year benefit of temporary carbon + storage according to two ton-year accounting methods: Moura Costa and + Lashof. In this example, a project stores 1 tCO₂ in a tree for two years, + then re-emits that carbon into the atmosphere. The emitted CO₂ is removed + from the atmosphere by natural processes over four years. Moura Costa + calculates a 2 ton-year benefit, while Lashof calculates a 0.5 ton-year + benefit. This example is physically unrealistic because real CO₂ emissions + affect the atmosphere for hundreds of thousands of years. + +
### Step 05 — Making an equivalence claim @@ -117,13 +126,15 @@ Rather than explicitly incorporating these processes, which operate over timesca Using the same cost and benefit logic described above, ton-year accounting integrates under these curves (rather than using addition and multiplication as shown in our simplified example) to calculate the ton-year cost of CO₂ residing in the atmosphere. In Figure 3, you can use the time horizon slider to see how the ton-year cost of emitting 1 tCO₂ is calculated by integrating under a CO₂ emission curve. - - - Ton-year methods calculate the ton-year cost of CO₂ in the atmosphere by - integrating under a curve that represents the proportion of an emission - remaining in the atmosphere as a function of time (Joos et al., 2013). Drag - the slider to change the time horizon. - +
+ + + Ton-year methods calculate the ton-year cost of CO₂ in the atmosphere by + integrating under a curve that represents the proportion of an emission + remaining in the atmosphere as a function of time (Joos et al., 2013). Drag + the slider to change the time horizon. + +
When ton-year accounting takes the integral of the CO₂ emission curve, it approximates the amount of extra energy trapped in the climate system by a CO₂ emission — a concept known as cumulative radiative forcing. Excess energy trapped in the climate system causes harmful and effectively irreversible climate impacts, like glacier melt and sea-level rise, so even temporary reductions yield positive climate benefits. @@ -137,15 +148,17 @@ Unfortunately, there is no objective framework for balancing these potentially c The great thing about physical equivalence claims based on cumulative radiative forcing is that we can check them. Figure 4 shows the Moura Costa and Lashof benefit calculations applied to a more realistic project scenario. In the illustrated project scenario, 1 tCO₂ is stored for 20 years before it is fully re-emitted to the atmosphere. All calculations are performed with a time horizon of 100 years. - - - Different ton-year methods produce different claims about the benefit of the - same temporary carbon storage. For a project that stores 1 CO₂ for 20 years - before re-emitting it to the atmosphere and a 100 year time horizon, Moura - Costa calculates a 20 ton-year benefit while Lashof calculates an 8.4 ton-year - benefit. The timescale toggle provides context for how a 100 year time horizon - compares to the long-lived nature of atmospheric CO₂. - +
+ + + Different ton-year methods produce different claims about the benefit of the + same temporary carbon storage. For a project that stores 1 CO₂ for 20 years + before re-emitting it to the atmosphere and a 100 year time horizon, Moura + Costa calculates a 20 ton-year benefit while Lashof calculates an 8.4 + ton-year benefit. The timescale toggle provides context for how a 100 year + time horizon compares to the long-lived nature of atmospheric CO₂. + +
If Moura Costa and Lashof are both making physical equivalence claims about the same temporary storage, how can they come up with different answers? @@ -155,11 +168,13 @@ When we try to do this for Moura Costa, however, we encounter a problem. To comp It is also true that by comparing the ton-years of CO₂ in the atmosphere directly to the ton-years of CO₂ in storage, Moura Costa distorts the core, physical logic of ton-year accounting and significantly exaggerates the climate benefits of temporary storage. A clear illustration of this problem is that Moura Costa allows for the claim that temporarily storing 1 tCO₂ justifies the emission of more than 1 tCO₂ — an indefensible outcome (Table 1). - - - The Moura Costa method allows for the claim that temporarily storing 1 tCO₂ - justifies the emission of more than 1 tCO₂ — an indefensible outcome. - +
+ + + The Moura Costa method allows for the claim that temporarily storing 1 tCO₂ + justifies the emission of more than 1 tCO₂ — an indefensible outcome. + +
We are not the first people to make these observations about the Moura Costa method, but since the method has been used, we believe these concerns bear repeating. @@ -169,50 +184,54 @@ In sum, ton-year accounting methods can produce equivalence claims that say some Figure 5 lets you explore how choosing a ton-year accounting method and modifying input parameters can dramatically affect the apparent value of temporary storage. Based on user-specified parameters, Figure 5 shows the ton-year cost of an emission, the ton-year benefit of temporary storage, and the corresponding equivalence ratio calculated by the Moura Costa and Lashof methods. - - - The choice of a ton-year accounting method and input parameters can - dramatically affect the apparent value of temporary storage. Based on the - chosen parameters, the ton-year cost of emitting 1 tCO₂ (top) and ton-year - benefit of temporarily storing 1 tCO₂ (middle) are calculated according to - both the Moura Costa and Lashof methods. The storage amount needed for - equivalence (the “equivalence ratio”) is calculated by dividing the ton-year - cost of an emission by the ton-year benefit of the temporary storage (bottom). - The parameters can be modified by moving the sliders or typing in values. Note - that discount rates should be applied with extreme caution since they break - the claim of physical equivalence. Displayed values less than 1 are rounded to - three significant digits. - +
+ + + The choice of a ton-year accounting method and input parameters can + dramatically affect the apparent value of temporary storage. Based on the + chosen parameters, the ton-year cost of emitting 1 tCO₂ (top) and ton-year + benefit of temporarily storing 1 tCO₂ (middle) are calculated according to + both the Moura Costa and Lashof methods. The storage amount needed for + equivalence (the “equivalence ratio”) is calculated by dividing the ton-year + cost of an emission by the ton-year benefit of the temporary storage + (bottom). The parameters can be modified by moving the sliders or typing in + values. Note that discount rates should be applied with extreme caution + since they break the claim of physical equivalence. Displayed values less + than 1 are rounded to three significant digits. + +
With a time horizon of 1000 years, the cost of an emission is about 310 ton-years. Lashof calculates that 1 tCO₂ stored for 1 year would result in an approximately 0.235 ton-year benefit, so for “equivalence”, we’d need to store about 1319 tCO₂ for 1 year (310.161 / 0.235 = 1319.45). Moura Costa, in contrast, calculates we need to store only around 310 tCO₂ for 1 year (310.161 / 1 = 310.161). Changing the time horizon to 100 years drops the Lashof and Moura Costa equivalence claims to 128 tCO₂ and 52 tCO₂ stored for 1 year, respectively. This diversity can also be seen in real examples of how ton-year accounting has been used in the offsets industry (Table 2). - - - Ton-year accounting methods have been and are being used in the offsets - industry with a diversity of method and parameter choices. CAR (2020) refers - to the Climate Action Reserve’s implementation of ton-year accounting in its{' '} - - Soil Enrichment Protocol - - . NCX (2020) refers to the method described in NCX’s - Version 0.4 white paper - . NCX (2021) refers to the method described in NCX’s - Version 0.5 white paper - . Each column in the table uses a distinct ton-year accounting method. To - ground these industry examples in the rest of the conversation, we include an example - using the Lashof method for comparison. - +
+ + + Ton-year accounting methods have been and are being used in the offsets + industry with a diversity of method and parameter choices. CAR (2020) refers + to the Climate Action Reserve’s implementation of ton-year accounting in its{' '} + + Soil Enrichment Protocol + + . NCX (2020) refers to the method described in NCX’s + Version 0.4 white paper + . NCX (2021) refers to the method described in NCX’s + Version 0.5 white paper + . Each column in the table uses a distinct ton-year accounting method. + To ground these industry examples in the rest of the conversation, we include + an example using the Lashof method for comparison. + +
The Climate Action Reserve (CAR) provides a ton-year accounting option in some of its published protocols, including its [Soil Enrichment Protocol](https://www.climateactionreserve.org/how/protocols/soil-enrichment/). CAR’s ton-year method asserts that 1 tCO₂ stored for 100 years is equivalent to 1 tCO₂ emitted. For projects that do not want to commit to CAR’s standard 100-year permanence obligation, CAR gives 1/100th of a credit for each year 1 tCO₂ is stored. (CAR’s calculation of partial credit is distinct from any other published ton-year approach that we’ve come across; it relies on the assumption that 100-years is “permanent” and gives partial credit for anything less.) diff --git a/package-lock.json b/package-lock.json index aebe8231..211503d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@carbonplan/charts": "^2.7.0", "@carbonplan/colormaps": "^3.0.2", - "@carbonplan/components": "^11.3.0", + "@carbonplan/components": "^11.5.0", "@carbonplan/icons": "^1.0.0", "@carbonplan/layouts": "^1.4.0", "@carbonplan/minimaps": "^1.0.0", @@ -24,6 +24,7 @@ "@next/mdx": "^10.2.3", "@react-spring/web": "^9.4.2", "@theme-ui/color": "^0.13.1", + "@theme-ui/core": "^0.13.1", "@theme-ui/css": "^0.13.1", "@theme-ui/match-media": "^0.13.1", "d3-drag": "^3.0.0", @@ -78,25 +79,25 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", - "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.17.2", - "@babel/parser": "^7.17.3", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", @@ -115,9 +116,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dependencies": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -128,11 +129,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dependencies": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" @@ -202,13 +203,13 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", @@ -228,11 +229,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -266,12 +267,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", + "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" }, "engines": { @@ -292,9 +293,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -505,9 +506,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", + "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -666,9 +667,9 @@ } }, "node_modules/@carbonplan/components": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@carbonplan/components/-/components-11.3.0.tgz", - "integrity": "sha512-XB6hZ1s0FfwH5n53yTY8pVqU9uGjm8xDo3QHscy9BWXio5I/b8r07+ivkDeZLDhHXVSxpF2AXsSTO3SkNr432g==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@carbonplan/components/-/components-11.5.0.tgz", + "integrity": "sha512-1oIWV6aXVJACQ+JpGtuijNx/LL2Sv5/SG3EzETqZUofGxgsgXP14AKLo15PLaw2NyCjOcsIaI3qipJ4WWLErAg==", "dependencies": { "@carbonplan/emoji": "^1.0.0", "@carbonplan/icons": "^1.0.0", @@ -676,7 +677,7 @@ }, "peerDependencies": { "@emotion/react": "^11.1.5", - "next": "^10.1.3 || ^11.0.1 || || ^12.0.4", + "next": "^10.1.3 || ^11.0.1 || ^12.0.4", "react": "^16.14.0 || ^17.0.2", "react-dom": "^16.14.0 || ^17.0.2", "theme-ui": ">=0.11.1" @@ -703,9 +704,9 @@ } }, "node_modules/@carbonplan/layouts": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@carbonplan/layouts/-/layouts-1.4.0.tgz", - "integrity": "sha512-cOM5hpgGvzeU9TUgoHON/OS+/toIDHT8HbcGFCxh0IrLDeOT6q/cs81B9g74ExlckG8HwJFtOsWzaq2CfslsSw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@carbonplan/layouts/-/layouts-1.5.0.tgz", + "integrity": "sha512-PHkmQBIDuLbw45KoThAd0tRtjJIYDyJn5jF5wZIaANHCAdTZZTInvPQEYvonfHSv6UpT/bn6RSsW0XaB+vSOig==", "dependencies": { "@carbonplan/icons": "^1.1.0" }, @@ -822,15 +823,14 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "node_modules/@emotion/react": { - "version": "11.8.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.1.tgz", - "integrity": "sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q==", + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.2.tgz", + "integrity": "sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==", "dependencies": { "@babel/runtime": "^7.13.10", "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", "@emotion/serialize": "^1.0.2", - "@emotion/sheet": "^1.1.0", "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" @@ -1959,26 +1959,26 @@ } }, "node_modules/@react-spring/animated": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.4.3.tgz", - "integrity": "sha512-hKKmeXPoGpJ/zrG/RC8stwW8PmMH0BbewHD8aUPLbyzD9fNvZEJ0mjKmOI0CcSwMpb43kuwY2nX3ZJVImPQCoQ==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.4.4.tgz", + "integrity": "sha512-e9xnuBaUTD+NolKikUmrGWjX8AVCPyj1GcEgjgq9E+0sXKv46UY7cm2EmB6mUDTxWIDVKebARY++xT4nGDraBQ==", "dependencies": { - "@react-spring/shared": "~9.4.3-beta.0", - "@react-spring/types": "~9.4.3-beta.0" + "@react-spring/shared": "~9.4.4", + "@react-spring/types": "~9.4.4" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0" } }, "node_modules/@react-spring/core": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.4.3.tgz", - "integrity": "sha512-Jr6/GjHwXYxAtttcYDXOtH36krO0XGjYaSsGR6g+vOUO4y0zAPPXoAwpK6vS7Haip5fRwk7rMdNG+OzU7bB4Bg==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.4.4.tgz", + "integrity": "sha512-llgb0ljFyjMB0JhWsaFHOi9XFT8n1jBMVs1IFY2ipIBerWIRWrgUmIpakLPHTa4c4jwqTaDSwX90s2a0iN7dxQ==", "dependencies": { - "@react-spring/animated": "~9.4.3-beta.0", - "@react-spring/rafz": "~9.4.3-beta.0", - "@react-spring/shared": "~9.4.3-beta.0", - "@react-spring/types": "~9.4.3-beta.0" + "@react-spring/animated": "~9.4.4", + "@react-spring/rafz": "~9.4.4", + "@react-spring/shared": "~9.4.4", + "@react-spring/types": "~9.4.4" }, "funding": { "type": "opencollective", @@ -1989,36 +1989,36 @@ } }, "node_modules/@react-spring/rafz": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.4.3.tgz", - "integrity": "sha512-KnujiZNIHzXsRq1D4tVbCajl8Lx+e6vtvUk7o69KbuneSpEgil9P/x3b+hMDk8U0NHGhJjzhU7723/CNsQansA==" + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.4.4.tgz", + "integrity": "sha512-5ki/sQ06Mdf8AuFstSt5zbNNicRT4LZogiJttDAww1ozhuvemafNWEHxhzcULgCPCDu2s7HsroaISV7+GQWrhw==" }, "node_modules/@react-spring/shared": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.4.3.tgz", - "integrity": "sha512-mB1UUD/pl1LzaY0XeNWZtvJzxMa8gLQf02nY12HAz4Rukm9dFRj0jeYwQYLdfYLsGFo1ldvHNurun6hZMG7kiQ==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.4.4.tgz", + "integrity": "sha512-ySVgScDZlhm/+Iy2smY9i/DDrShArY0j6zjTS/Re1lasKnhq8qigoGiAxe8xMPJNlCaj3uczCqHy3TY9bKRtfQ==", "dependencies": { - "@react-spring/rafz": "~9.4.3-beta.0", - "@react-spring/types": "~9.4.3-beta.0" + "@react-spring/rafz": "~9.4.4", + "@react-spring/types": "~9.4.4" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0" } }, "node_modules/@react-spring/types": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.4.3.tgz", - "integrity": "sha512-dzJrPvUc42K2un9y6D1IsrPQO5tKsbWwUo+wsATnXjG3ePWyuDBIOMJuPe605NhIXUmPH+Vik2wMoZz06hD1uA==" + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.4.4.tgz", + "integrity": "sha512-KpxKt/D//q/t/6FBcde/RE36LKp8PpWu7kFEMLwpzMGl9RpcexunmYOQJWwmJWtkQjgE1YRr7DzBMryz6La1cQ==" }, "node_modules/@react-spring/web": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.4.3.tgz", - "integrity": "sha512-llKve/uJ73JVagBAVvA74S/LfZP4oSB3XP1qmggSUNXzPZZo5ylIMrs55PxpLyxgzzihuhDU5N17ct3ATViOHw==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.4.4.tgz", + "integrity": "sha512-iJmOLdhcuizriUlu/xqBc5y8KaFts+UI+iC+GxyTwBtzxA9czKiSAZW2ESuhG8stafa3jncwjfTQQp84KN36cw==", "dependencies": { - "@react-spring/animated": "~9.4.3-beta.0", - "@react-spring/core": "~9.4.3-beta.0", - "@react-spring/shared": "~9.4.3-beta.0", - "@react-spring/types": "~9.4.3-beta.0" + "@react-spring/animated": "~9.4.4", + "@react-spring/core": "~9.4.4", + "@react-spring/shared": "~9.4.4", + "@react-spring/types": "~9.4.4" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0", @@ -2243,6 +2243,21 @@ "react": "^16 || ^17" } }, + "node_modules/@theme-ui/mdx": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@theme-ui/mdx/-/mdx-0.13.1.tgz", + "integrity": "sha512-P4jtqB9iJQcy0qiD4c30QVYEMxvPwhfegPte/ifcOr8NR4dO/gTP9jkbGN7DgXGvIkNitzCNZjjrQT9IcbPAJg==", + "dependencies": { + "@theme-ui/core": "0.13.1", + "@theme-ui/css": "0.13.1" + }, + "peerDependencies": { + "@emotion/react": "^11", + "@emotion/styled": "^11", + "@mdx-js/react": "^1 || ^2", + "react": "^16 || ^17" + } + }, "node_modules/@theme-ui/parse-props": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/@theme-ui/parse-props/-/parse-props-0.13.1.tgz", @@ -2270,21 +2285,6 @@ "react": "^16 || ^17" } }, - "node_modules/@theme-ui/theme-provider/node_modules/@theme-ui/mdx": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@theme-ui/mdx/-/mdx-0.13.1.tgz", - "integrity": "sha512-P4jtqB9iJQcy0qiD4c30QVYEMxvPwhfegPte/ifcOr8NR4dO/gTP9jkbGN7DgXGvIkNitzCNZjjrQT9IcbPAJg==", - "dependencies": { - "@theme-ui/core": "0.13.1", - "@theme-ui/css": "0.13.1" - }, - "peerDependencies": { - "@emotion/react": "^11", - "@emotion/styled": "^11", - "@mdx-js/react": "^1 || ^2", - "react": "^16 || ^17" - } - }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -2295,9 +2295,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -2385,9 +2385,9 @@ } }, "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", + "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==", "dev": true }, "node_modules/@types/parse-json": { @@ -2456,9 +2456,9 @@ } }, "node_modules/@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "node_modules/abab": { @@ -2860,12 +2860,22 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", - "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" @@ -2875,10 +2885,6 @@ }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bser": { @@ -2932,13 +2938,19 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001319", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", + "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/cartesian-product": { "version": "2.1.2", @@ -3220,9 +3232,9 @@ "dev": true }, "node_modules/csstype": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" }, "node_modules/cwise-compiler": { "version": "1.1.3", @@ -3428,9 +3440,9 @@ } }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -3549,9 +3561,9 @@ "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==" }, "node_modules/electron-to-chromium": { - "version": "1.4.74", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.74.tgz", - "integrity": "sha512-DvQ20M0I4dIH8KcAo7n7E4OEeNafZ1N8z6g6ck+ALCM0ZoV6mpjaX6ekjs31zKlqPzacU3lmjG9PZEa1mQhEpQ==" + "version": "1.4.89", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz", + "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==" }, "node_modules/emittery": { "version": "0.8.1", @@ -6709,12 +6721,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "bin": { "json5": "lib/cli.js" }, @@ -6970,21 +6979,21 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -7012,9 +7021,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/ms": { "version": "2.1.2", @@ -8340,21 +8349,6 @@ "react-dom": "^16 || ^17" } }, - "node_modules/theme-ui/node_modules/@theme-ui/mdx": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@theme-ui/mdx/-/mdx-0.13.1.tgz", - "integrity": "sha512-P4jtqB9iJQcy0qiD4c30QVYEMxvPwhfegPte/ifcOr8NR4dO/gTP9jkbGN7DgXGvIkNitzCNZjjrQT9IcbPAJg==", - "dependencies": { - "@theme-ui/core": "0.13.1", - "@theme-ui/css": "0.13.1" - }, - "peerDependencies": { - "@emotion/react": "^11", - "@emotion/styled": "^11", - "@mdx-js/react": "^1 || ^2", - "react": "^16 || ^17" - } - }, "node_modules/throat": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", @@ -9103,22 +9097,22 @@ } }, "@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==" + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" }, "@babel/core": { - "version": "7.17.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", - "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.17.2", - "@babel/parser": "^7.17.3", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", @@ -9130,9 +9124,9 @@ } }, "@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -9140,11 +9134,11 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "requires": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" @@ -9193,13 +9187,13 @@ } }, "@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", @@ -9213,11 +9207,11 @@ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-split-export-declaration": { @@ -9239,12 +9233,12 @@ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", + "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" } }, @@ -9259,9 +9253,9 @@ } }, "@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==" + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==" }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.12.1", @@ -9406,9 +9400,9 @@ } }, "@babel/runtime": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", + "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -9548,9 +9542,9 @@ } }, "@carbonplan/components": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@carbonplan/components/-/components-11.3.0.tgz", - "integrity": "sha512-XB6hZ1s0FfwH5n53yTY8pVqU9uGjm8xDo3QHscy9BWXio5I/b8r07+ivkDeZLDhHXVSxpF2AXsSTO3SkNr432g==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@carbonplan/components/-/components-11.5.0.tgz", + "integrity": "sha512-1oIWV6aXVJACQ+JpGtuijNx/LL2Sv5/SG3EzETqZUofGxgsgXP14AKLo15PLaw2NyCjOcsIaI3qipJ4WWLErAg==", "requires": { "@carbonplan/emoji": "^1.0.0", "@carbonplan/icons": "^1.0.0", @@ -9570,9 +9564,9 @@ "requires": {} }, "@carbonplan/layouts": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@carbonplan/layouts/-/layouts-1.4.0.tgz", - "integrity": "sha512-cOM5hpgGvzeU9TUgoHON/OS+/toIDHT8HbcGFCxh0IrLDeOT6q/cs81B9g74ExlckG8HwJFtOsWzaq2CfslsSw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@carbonplan/layouts/-/layouts-1.5.0.tgz", + "integrity": "sha512-PHkmQBIDuLbw45KoThAd0tRtjJIYDyJn5jF5wZIaANHCAdTZZTInvPQEYvonfHSv6UpT/bn6RSsW0XaB+vSOig==", "requires": { "@carbonplan/icons": "^1.1.0" } @@ -9678,15 +9672,14 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "@emotion/react": { - "version": "11.8.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.1.tgz", - "integrity": "sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q==", + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.2.tgz", + "integrity": "sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==", "requires": { "@babel/runtime": "^7.13.10", "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", "@emotion/serialize": "^1.0.2", - "@emotion/sheet": "^1.1.0", "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" @@ -10487,53 +10480,53 @@ "optional": true }, "@react-spring/animated": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.4.3.tgz", - "integrity": "sha512-hKKmeXPoGpJ/zrG/RC8stwW8PmMH0BbewHD8aUPLbyzD9fNvZEJ0mjKmOI0CcSwMpb43kuwY2nX3ZJVImPQCoQ==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.4.4.tgz", + "integrity": "sha512-e9xnuBaUTD+NolKikUmrGWjX8AVCPyj1GcEgjgq9E+0sXKv46UY7cm2EmB6mUDTxWIDVKebARY++xT4nGDraBQ==", "requires": { - "@react-spring/shared": "~9.4.3-beta.0", - "@react-spring/types": "~9.4.3-beta.0" + "@react-spring/shared": "~9.4.4", + "@react-spring/types": "~9.4.4" } }, "@react-spring/core": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.4.3.tgz", - "integrity": "sha512-Jr6/GjHwXYxAtttcYDXOtH36krO0XGjYaSsGR6g+vOUO4y0zAPPXoAwpK6vS7Haip5fRwk7rMdNG+OzU7bB4Bg==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.4.4.tgz", + "integrity": "sha512-llgb0ljFyjMB0JhWsaFHOi9XFT8n1jBMVs1IFY2ipIBerWIRWrgUmIpakLPHTa4c4jwqTaDSwX90s2a0iN7dxQ==", "requires": { - "@react-spring/animated": "~9.4.3-beta.0", - "@react-spring/rafz": "~9.4.3-beta.0", - "@react-spring/shared": "~9.4.3-beta.0", - "@react-spring/types": "~9.4.3-beta.0" + "@react-spring/animated": "~9.4.4", + "@react-spring/rafz": "~9.4.4", + "@react-spring/shared": "~9.4.4", + "@react-spring/types": "~9.4.4" } }, "@react-spring/rafz": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.4.3.tgz", - "integrity": "sha512-KnujiZNIHzXsRq1D4tVbCajl8Lx+e6vtvUk7o69KbuneSpEgil9P/x3b+hMDk8U0NHGhJjzhU7723/CNsQansA==" + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.4.4.tgz", + "integrity": "sha512-5ki/sQ06Mdf8AuFstSt5zbNNicRT4LZogiJttDAww1ozhuvemafNWEHxhzcULgCPCDu2s7HsroaISV7+GQWrhw==" }, "@react-spring/shared": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.4.3.tgz", - "integrity": "sha512-mB1UUD/pl1LzaY0XeNWZtvJzxMa8gLQf02nY12HAz4Rukm9dFRj0jeYwQYLdfYLsGFo1ldvHNurun6hZMG7kiQ==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.4.4.tgz", + "integrity": "sha512-ySVgScDZlhm/+Iy2smY9i/DDrShArY0j6zjTS/Re1lasKnhq8qigoGiAxe8xMPJNlCaj3uczCqHy3TY9bKRtfQ==", "requires": { - "@react-spring/rafz": "~9.4.3-beta.0", - "@react-spring/types": "~9.4.3-beta.0" + "@react-spring/rafz": "~9.4.4", + "@react-spring/types": "~9.4.4" } }, "@react-spring/types": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.4.3.tgz", - "integrity": "sha512-dzJrPvUc42K2un9y6D1IsrPQO5tKsbWwUo+wsATnXjG3ePWyuDBIOMJuPe605NhIXUmPH+Vik2wMoZz06hD1uA==" + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.4.4.tgz", + "integrity": "sha512-KpxKt/D//q/t/6FBcde/RE36LKp8PpWu7kFEMLwpzMGl9RpcexunmYOQJWwmJWtkQjgE1YRr7DzBMryz6La1cQ==" }, "@react-spring/web": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.4.3.tgz", - "integrity": "sha512-llKve/uJ73JVagBAVvA74S/LfZP4oSB3XP1qmggSUNXzPZZo5ylIMrs55PxpLyxgzzihuhDU5N17ct3ATViOHw==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.4.4.tgz", + "integrity": "sha512-iJmOLdhcuizriUlu/xqBc5y8KaFts+UI+iC+GxyTwBtzxA9czKiSAZW2ESuhG8stafa3jncwjfTQQp84KN36cw==", "requires": { - "@react-spring/animated": "~9.4.3-beta.0", - "@react-spring/core": "~9.4.3-beta.0", - "@react-spring/shared": "~9.4.3-beta.0", - "@react-spring/types": "~9.4.3-beta.0" + "@react-spring/animated": "~9.4.4", + "@react-spring/core": "~9.4.4", + "@react-spring/shared": "~9.4.4", + "@react-spring/types": "~9.4.4" } }, "@sinonjs/commons": { @@ -10736,6 +10729,15 @@ "integrity": "sha512-SHTNDa5YQae5pRtBplSL9A1i4oufg/ojQByJGleV03YfkDDJ8vc4IrehpcOuW3MBqVd+TpVj7+BngIrtiua7Fg==", "requires": {} }, + "@theme-ui/mdx": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@theme-ui/mdx/-/mdx-0.13.1.tgz", + "integrity": "sha512-P4jtqB9iJQcy0qiD4c30QVYEMxvPwhfegPte/ifcOr8NR4dO/gTP9jkbGN7DgXGvIkNitzCNZjjrQT9IcbPAJg==", + "requires": { + "@theme-ui/core": "0.13.1", + "@theme-ui/css": "0.13.1" + } + }, "@theme-ui/parse-props": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/@theme-ui/parse-props/-/parse-props-0.13.1.tgz", @@ -10753,17 +10755,6 @@ "@theme-ui/core": "0.13.1", "@theme-ui/css": "0.13.1", "@theme-ui/mdx": "0.13.1" - }, - "dependencies": { - "@theme-ui/mdx": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@theme-ui/mdx/-/mdx-0.13.1.tgz", - "integrity": "sha512-P4jtqB9iJQcy0qiD4c30QVYEMxvPwhfegPte/ifcOr8NR4dO/gTP9jkbGN7DgXGvIkNitzCNZjjrQT9IcbPAJg==", - "requires": { - "@theme-ui/core": "0.13.1", - "@theme-ui/css": "0.13.1" - } - } } }, "@tootallnate/once": { @@ -10773,9 +10764,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -10863,9 +10854,9 @@ } }, "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", + "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==", "dev": true }, "@types/parse-json": { @@ -10933,9 +10924,9 @@ } }, "@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "abab": { @@ -11249,12 +11240,12 @@ "dev": true }, "browserslist": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", - "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" @@ -11302,9 +11293,9 @@ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, "caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" + "version": "1.0.30001319", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", + "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==" }, "cartesian-product": { "version": "2.1.2", @@ -11538,9 +11529,9 @@ } }, "csstype": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" }, "cwise-compiler": { "version": "1.1.3", @@ -11684,9 +11675,9 @@ } }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -11777,9 +11768,9 @@ "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==" }, "electron-to-chromium": { - "version": "1.4.74", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.74.tgz", - "integrity": "sha512-DvQ20M0I4dIH8KcAo7n7E4OEeNafZ1N8z6g6ck+ALCM0ZoV6mpjaX6ekjs31zKlqPzacU3lmjG9PZEa1mQhEpQ==" + "version": "1.4.89", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz", + "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==" }, "emittery": { "version": "0.8.1", @@ -14166,12 +14157,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "kdbush": { "version": "3.0.0", @@ -14372,18 +14360,18 @@ } }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -14402,9 +14390,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "ms": { "version": "2.1.2", @@ -15411,17 +15399,6 @@ "@theme-ui/css": "0.13.1", "@theme-ui/mdx": "0.13.1", "@theme-ui/theme-provider": "0.13.1" - }, - "dependencies": { - "@theme-ui/mdx": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@theme-ui/mdx/-/mdx-0.13.1.tgz", - "integrity": "sha512-P4jtqB9iJQcy0qiD4c30QVYEMxvPwhfegPte/ifcOr8NR4dO/gTP9jkbGN7DgXGvIkNitzCNZjjrQT9IcbPAJg==", - "requires": { - "@theme-ui/core": "0.13.1", - "@theme-ui/css": "0.13.1" - } - } } }, "throat": { diff --git a/package.json b/package.json index df14565c..2cf6078b 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "dependencies": { "@carbonplan/charts": "^2.7.0", "@carbonplan/colormaps": "^3.0.2", - "@carbonplan/components": "^11.3.0", + "@carbonplan/components": "^11.5.0", "@carbonplan/icons": "^1.0.0", "@carbonplan/layouts": "^1.4.0", "@carbonplan/minimaps": "^1.0.0", @@ -38,6 +38,7 @@ "@next/mdx": "^10.2.3", "@react-spring/web": "^9.4.2", "@theme-ui/color": "^0.13.1", + "@theme-ui/core": "^0.13.1", "@theme-ui/css": "^0.13.1", "@theme-ui/match-media": "^0.13.1", "d3-drag": "^3.0.0",