diff --git a/components/command-menu.js b/components/command-menu.js
new file mode 100644
index 00000000..8de7601e
--- /dev/null
+++ b/components/command-menu.js
@@ -0,0 +1,291 @@
+import { Global } from '@emotion/react'
+import { useState, useEffect, useMemo } from 'react'
+import { Command } from 'cmdk'
+import { Box, Flex } from 'theme-ui'
+import { Down, Left, Search, Up } from '@carbonplan/icons'
+import { Badge } from '@carbonplan/components'
+import { useRouter } from 'next/router'
+
+import contents from '../data/contents.json'
+
+const COLUMNS = 4
+
+const Item = ({ date, type, page, summary, title }) => {
+ const router = useRouter()
+ return (
+
+ [4, 5, 5, 6].map((i) => `calc(${theme.space[i]}px - 3px)`),
+ },
+
+ "&[aria-disabled='true']": {
+ color: 'secondary',
+ cursor: 'not-allowed',
+ },
+ }}
+ onSelect={() => router.push(`https://carbonplan.org/${page}`)}
+ value={page}
+ >
+
+
+ {title}
+
+
+ {type}
+
+
+
+ {summary}
+
+
+ )
+}
+
+const CommandMenu = () => {
+ const [open, setOpen] = useState(false)
+ const [search, setSearch] = useState('')
+
+ // Toggle the menu when ⌘K is pressed
+ useEffect(() => {
+ const down = (e) => {
+ if (e.key === 'k' && e.metaKey) {
+ setOpen((open) => !open)
+ }
+ }
+
+ document.addEventListener('keydown', down)
+ return () => document.removeEventListener('keydown', down)
+ }, [])
+
+ const filteredItems = useMemo(() => {
+ const regexp = new RegExp(search.trim(), 'i')
+
+ if (!search.trim()) {
+ return []
+ }
+ return contents
+ .filter((c) => c.title)
+ .filter(
+ ({ title, summary, page }) =>
+ title?.match(regexp) ||
+ page.replace('-', ' ').match(regexp) ||
+ summary?.match(regexp)
+ )
+ }, [search])
+
+ return (
+ <>
+ ({
+ '[cmdk-overlay]': {
+ width: '100vw',
+ height: '100vh',
+ backgroundColor: theme.colors.primary,
+ opacity: 0.5,
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ zIndex: 2000,
+ },
+ })}
+ />
+
+
+
+
+
+
+
+
+
+ {search ? 'No results found.' : ''}
+
+
+ {
+ /* TODO: replace with fetched contents.json files */
+ filteredItems.map((c) => (
+
+ ))
+ }
+
+
+
+ Navigate
+
+
+
+
+
+
+ Open link
+
+
+
+
+ >
+ )
+}
+
+export default CommandMenu
diff --git a/data/contents.json b/data/contents.json
new file mode 100644
index 00000000..1cc84272
--- /dev/null
+++ b/data/contents.json
@@ -0,0 +1,406 @@
+[
+ {
+ "page": "research"
+ },
+ {
+ "page": "research/cdr-verification-explainer",
+ "type": "article",
+ "date": "2022-09-19",
+ "title": "Verification Confidence Levels for carbon dioxide removal",
+ "summary": "We developed an interactive tool to map quantification capacity and uncertainty across CDR pathways. Read this article, explore the interactive tool, or read Frontier’s post to learn more."
+ },
+ {
+ "page": "research/cdr-scale-barriers",
+ "type": "article",
+ "date": "2022-07-12",
+ "title": "Barriers to scaling the long-duration carbon dioxide removal industry",
+ "summary": "What are the key challenges facing the carbon removal industry? We conducted structured interviews with 37 stakeholders to understand how they perceive market barriers."
+ },
+ {
+ "page": "research/cmip6-downscaling-explainer",
+ "type": "article",
+ "date": "2022-06-30",
+ "title": "Open data and tools for multiple methods of global climate downscaling",
+ "summary": "Downscaled datasets form the basis of climate impacts and risk analysis, but there are many ways to downscale. We’re releasing data and tools for this foundational step in the climate change planning process."
+ },
+ {
+ "page": "research/toucan-crypto-offsets",
+ "type": "article",
+ "date": "2022-04-07",
+ "title": "Zombies on the blockchain",
+ "summary": "We analyzed the flow of carbon offset credits from conventional registries to the blockchain. Our work shows that nearly all of these credits have been excluded from conventional markets."
+ },
+ {
+ "page": "research/fire-forests-inventories",
+ "type": "article",
+ "date": "2022-03-30",
+ "title": "Fire, forests, and greenhouse gas inventories in California",
+ "summary": "Should policymakers track net greenhouse gas emissions across the energy and lands sectors, and if so, how? We explored the complex choices required to account for forests and power plants in the same emissions inventory."
+ },
+ {
+ "page": "research/seaweed-farming-explainer",
+ "type": "article",
+ "date": "2022-03-16",
+ "title": "Mapping seaweed farming potential",
+ "summary": "We developed an interactive tool for mapping the potential of seaweed farming for carbon removal and biomass products. Read this article, explore the interactive map, or read the associated preprints to learn more."
+ },
+ {
+ "page": "research/ton-year-explainer",
+ "type": "article",
+ "date": "2022-01-31",
+ "title": "Unpacking ton-year accounting",
+ "summary": "Ton-year accounting is used to quantify the value of temporary carbon storage — a task for which we lack a clear intellectual framework. We explain how ton-year accounting methods work and highlight crucial differences between prominent ton-year accounting methods."
+ },
+ {
+ "page": "research/soil-protocols-explainer",
+ "type": "article",
+ "date": "2021-07-15",
+ "title": "A buyer’s guide to soil carbon offsets",
+ "summary": "We systematically reviewed protocols used to credit soil carbon in voluntary markets. Explore our database of protocols or read the article for key takeaways."
+ },
+ {
+ "page": "research/soil-depth-sampling",
+ "type": "article",
+ "date": "2021-06-17",
+ "title": "Depth matters for soil carbon accounting",
+ "summary": "Estimating soil carbon based on samples is tricky to get right. We explored the role of sampling depth when estimating soil carbon, to show why it matters, and how to avoid common pitfalls."
+ },
+ {
+ "page": "research/stripe-2021-insights",
+ "type": "article",
+ "date": "2021-05-26",
+ "title": "New lessons from reviewing carbon removal proposals",
+ "summary": "We analyzed project proposals submitted for Stripe's Spring 2021 Carbon Removal Purchase. Read this article or explore our updated database of project reports for our takeaways and lessons learned."
+ },
+ {
+ "page": "research/forest-risks-explainer",
+ "type": "article",
+ "date": "2021-05-20",
+ "title": "Risks to forest carbon in a changing climate",
+ "summary": "Forests in the United States are already at risk from wildfire, drought, and insects, and climate change is making it worse. We combined satellite and ecological data with climate models to project future risks to forest carbon. Along with a preprint, we are releasing open data, open software, and an interactive web map."
+ },
+ {
+ "page": "research/forest-offsets-explainer",
+ "type": "article",
+ "date": "2021-04-29",
+ "title": "Systematic over-crediting of forest offsets",
+ "summary": "California's forest offset program is worth over $2 billion. We analyzed detailed public records to show how statistical flaws in the program's design have led to over-crediting — at a scale of tens of millions of tCO₂ and hundreds of millions of dollars."
+ },
+ {
+ "page": "research/microsoft-2021-insights",
+ "type": "article",
+ "date": "2021-03-17",
+ "title": "Insights from analyzing a new round of carbon removal projects",
+ "summary": "We analyzed project proposals submitted for Microsoft's 2021 Carbon Removal Purchase. Read this article or explore our updated database of project reports for our takeaways and lessons learned."
+ },
+ {
+ "page": "research/dac-calculator-explainer",
+ "type": "article",
+ "date": "2021-02-01",
+ "title": "The cost of direct air capture",
+ "summary": "We developed an interactive tool for exploring the cost of direct air capture (DAC) coupled to stand alone energy sources. Read this article, explore the calculator tool, or read the associated publication to learn more."
+ },
+ {
+ "page": "research/permanence-calculator-explainer",
+ "type": "article",
+ "date": "2020-12-09",
+ "title": "The cost of temporary carbon removal",
+ "summary": "We built an interactive tool to help compare the long-term cost of temporary and permanent carbon removal. Read this article or try the calculator tool to learn about the methods and implications."
+ },
+ {
+ "page": "research/offset-project-fire",
+ "type": "article",
+ "date": "2020-09-17",
+ "title": "Carbon offsets burning",
+ "summary": "Fire poses a key risk to the permanence of forest carbon. We analyzed a large fire during the 2020 fire season and analyzed its impact on a forest carbon offset project."
+ },
+ {
+ "page": "research/carbon-removal-mechanisms",
+ "type": "article",
+ "date": "2020-07-24",
+ "title": "Carbon removal mechanisms",
+ "summary": "Carbon removal is confusing because there are many approaches, and all affect the carbon cycle in different ways. In this article we develop and explain a typology for comparing approaches."
+ },
+ {
+ "page": "research/soil-carbon-comment",
+ "type": "article",
+ "date": "2020-06-01",
+ "title": "Getting soil carbon right",
+ "summary": "There are good reasons to be excited about soil carbon sequestration, but rigorous quantification remains a challenge. We analyzed a carbon offset protocol and wrote multiple letters raising concerns related to program design and scientific integrity."
+ },
+ {
+ "page": "research/stripe-2020-insights",
+ "type": "article",
+ "date": "2020-05-18",
+ "title": "Insights from our first project reports",
+ "summary": "We analyzed project proposals submitted for Stripe's 2020 Negative Emissions Purchase. Read this article or explore our database of project reports for our main takeaways and lessons learned."
+ },
+ {
+ "page": "research/verra-integrity-council",
+ "type": "commentary",
+ "date": "2022-09-29",
+ "title": "Verra’s broadside against the Integrity Council props up the status quo",
+ "summary": "A blistering critique from the carbon offset registry with a dominant ⅔ market share says more about its opposition to independent standards than the best way to pursue them."
+ },
+ {
+ "page": "research/data-financial-risk",
+ "type": "commentary",
+ "date": "2022-08-01",
+ "title": "Why climate data matters to climate-related financial risk assessments",
+ "summary": "Companies, government agencies, and consumers increasingly seek data on future physical climate risks. Better communication, transparency, and accessibility would help improve these physical financial risk assessments."
+ },
+ {
+ "page": "research/scoping-plan-comments",
+ "type": "commentary",
+ "date": "2022-05-17",
+ "title": "California’s draft climate change scoping plan is incomplete",
+ "summary": "California’s net-zero climate plan is long on carbon removal, short on details, and based on flawed analysis."
+ },
+ {
+ "page": "research/offset-disclosure-needs",
+ "type": "commentary",
+ "date": "2022-02-08",
+ "title": "Why carbon offset disclosure matters",
+ "summary": "Voluntary carbon markets don't provide investors with adequate data about who is using offset credits, nor what kinds of climate claims those credits justify. Simple disclosures would fix this gap."
+ },
+ {
+ "page": "research/ton-year-ncx",
+ "type": "commentary",
+ "date": "2022-01-31",
+ "title": "A critique of NCX’s carbon accounting methods",
+ "summary": "We review concerns with NCX’s use of discounted ton-year accounting methods to credit short-term timber harvests delays."
+ },
+ {
+ "page": "research/climate-financial-risks",
+ "type": "commentary",
+ "date": "2021-11-01",
+ "title": "Climate-related financial risk and corporate net-zero commitments",
+ "summary": "We discuss tensions and considerations at the nexus of climate risk disclosure and corporate net-zero strategies."
+ },
+ {
+ "page": "research/cdr-verification",
+ "type": "tool",
+ "title": "CDR Verification Framework",
+ "summary": "Interactive tool for understanding Verification Confidence Levels (VCLs) for carbon removal."
+ },
+ {
+ "page": "research/cmip6-downscaling",
+ "type": "tool",
+ "title": "CMIP6 Downscaling",
+ "summary": "Interactive mapping tool for global downscaled climate data."
+ },
+ {
+ "page": "research/seaweed-farming",
+ "type": "tool",
+ "title": "Seaweed Farming",
+ "summary": "Mapping the costs and climate benefits of farming seaweed."
+ },
+ {
+ "page": "research/cdr-database",
+ "type": "tool",
+ "title": "CDR Database",
+ "summary": "A database of reports on carbon dioxide removal project proposals."
+ },
+ {
+ "page": "research/permanence-calculator",
+ "type": "tool",
+ "title": "Permanence Calculator",
+ "summary": "Comparing costs for temporary and permanent carbon removal."
+ },
+ {
+ "page": "research/compliance-users",
+ "type": "tool",
+ "title": "Compliance users",
+ "summary": "Tracking the users of compliance offsets."
+ },
+ {
+ "page": "research/soil-protocols",
+ "type": "tool",
+ "title": "Soil Protocols",
+ "summary": "A database of protocols used to credit soil carbon."
+ },
+ {
+ "page": "research/forest-offsets-fires",
+ "type": "tool",
+ "title": "Offsets Fires",
+ "summary": "Mapping forest carbon offset projects and their intersections with fires."
+ },
+ {
+ "page": "research/forest-offsets-crediting",
+ "type": "tool",
+ "title": "Offsets Crediting",
+ "summary": "Mapping our over-crediting analysis of forest carbon offset projects."
+ },
+ {
+ "page": "research/forest-risks",
+ "type": "tool",
+ "title": "Forest Risks",
+ "summary": "Mapping risks to forest carbon under a changing climate"
+ },
+ {
+ "page": "research/forest-carbon",
+ "type": "tool",
+ "title": "Forest Carbon",
+ "summary": "Mapping emissions related to forest carbon."
+ },
+ {
+ "page": "research/dac-calculator",
+ "type": "tool",
+ "title": "DAC Cost Calculator",
+ "summary": "Explore key parameters affecting the cost of direct air capture."
+ },
+ {
+ "page": "research/cdr-verification-methods",
+ "type": "supplement",
+ "date": "2022-09-19",
+ "title": "CDR Verification Framework — Methods"
+ },
+ {
+ "page": "research/forest-offsets-explainer-faq",
+ "type": "supplement",
+ "date": "2021-05-12",
+ "title": "Systematic over-crediting of forest offsets FAQ"
+ },
+ {
+ "page": "research/soil-protocols-explainer-gold-standard-response",
+ "type": "supplement",
+ "date": "2021-08-04",
+ "title": "Response to Gold Standard"
+ },
+ {
+ "page": "blog"
+ },
+ {
+ "page": "blog/cdr-database-archived",
+ "type": "blog",
+ "date": "2022-09-20",
+ "title": "Archiving the CDR Database",
+ "summary": "Why we are archiving the CDR Database and shifting our attention to other priorities in the carbon removal ecosystem."
+ },
+ {
+ "page": "blog/klimadao-bct-response",
+ "type": "blog",
+ "date": "2022-09-14",
+ "title": "A response to KlimaDAO’s analysis of Base Carbon Tonne tokens",
+ "summary": "KlimaDAO sidesteps CarbonPlan’s criticisms of offset credit quality."
+ },
+ {
+ "page": "blog/cloud-downscaling-pipelines",
+ "type": "blog",
+ "date": "2022-09-02",
+ "title": "Building open source downscaling pipelines for the cloud",
+ "summary": "We describe our experiences building cloud-based data analysis pipelines for climate model downscaling, including specific challenges we faced and lessons we learned."
+ },
+ {
+ "page": "blog/physical-risk-workshop",
+ "type": "blog",
+ "date": "2022-08-19",
+ "title": "An interdisciplinary workshop on climate risk and financial regulation",
+ "summary": "We hosted a workshop with the Environmental Defense Fund (EDF) and the Initiative on Climate Risk and Resilience Law (ICRRL) on physical climate risk and financial regulation."
+ },
+ {
+ "page": "blog/scipy-conference-2022",
+ "type": "blog",
+ "date": "2022-08-08",
+ "title": "Highlights from attending SciPy 2022",
+ "summary": "We recently attended the 21st annual Scientific Computing with Python conference. Here we share highlights from the tutorials and presentations."
+ },
+ {
+ "page": "blog/sec-offset-disclosure",
+ "type": "blog",
+ "date": "2022-06-24",
+ "title": "Comments to the Securities and Exchange Commission on carbon offset disclosure",
+ "summary": "We summarize our comments to the SEC on the agency's proposed climate-risk disclosure rule. In our comments, we commend the rule's robust approach to carbon offsets and encourage the SEC to strengthen the proposed provisions for carbon removal."
+ },
+ {
+ "page": "blog/offsets-fires-update",
+ "type": "blog",
+ "date": "2022-06-16",
+ "title": "Monitoring forest carbon offsets for the 2022 fire season",
+ "summary": "We have updated our wildfire monitoring tool in preparation for the 2022 fire season."
+ },
+ {
+ "page": "blog/seaweed-farming-clarifications",
+ "type": "blog",
+ "date": "2022-05-20",
+ "title": "Scope, goals, and implications of our recent seaweed farming modeling work",
+ "summary": "Relying on public data, our recent seaweed farming modeling work made key assumptions about seaweed cultivation. We summarize why making these assumptions was necessary, and why as a result the modeled costs may not capture current advances taking place in the field."
+ },
+ {
+ "page": "blog/ton-year-verra",
+ "type": "blog",
+ "date": "2022-04-25",
+ "title": "Comments to Verra on ton-year accounting and NCX’s harvest deferral methodology",
+ "summary": "We summarize two recent comment letters about Verra’s proposed use of ton-year accounting to issue carbon offset credits — including via a proposed methodology developed by NCX which would credit harvest deferrals as short as a single year."
+ },
+ {
+ "page": "blog/occ-risk-comment",
+ "type": "blog",
+ "date": "2022-02-18",
+ "title": "Comments to the Office of the Comptroller of the Currency on climate-related financial risk",
+ "summary": "We welcome the OCC's draft climate-related financial risk management principles and point out core tensions that could arise in implementation."
+ },
+ {
+ "page": "blog/open-lidar-biomass",
+ "type": "blog",
+ "date": "2022-02-16",
+ "title": "Using LiDAR to estimate forest biomass",
+ "summary": "An open source implementation of forest biomass estimation using LiDAR."
+ },
+ {
+ "page": "blog/compliance-users-release",
+ "type": "blog",
+ "date": "2022-01-05",
+ "title": "Who is using which offsets in California?",
+ "summary": "A new tool for tracking the use of carbon offsets for compliance in California's cap-and-trade program."
+ },
+ {
+ "page": "blog/stripe-2021-additions",
+ "type": "blog",
+ "date": "2021-12-15",
+ "title": "Additions to our CDR database",
+ "summary": "Analysis of 11 new proposals from Stripe’s Fall 2021 CDR procurement."
+ },
+ {
+ "page": "blog/usda-csaf-comment",
+ "type": "blog",
+ "date": "2021-11-10",
+ "title": "Comments to the United States Department of Agriculture on climate-smart commodity markets",
+ "summary": "We encourage the USDA to directly procure \"climate-smart\" commodities instead of subsidizing carbon offsets."
+ },
+ {
+ "page": "blog/fsoc-open-data",
+ "type": "blog",
+ "date": "2021-11-04",
+ "title": "Open data and the Financial Stability Oversight Council",
+ "summary": "Why open data and analytics matter in addressing climate-related financial risk."
+ },
+ {
+ "page": "blog/soil-protocols-added",
+ "type": "blog",
+ "date": "2021-10-13",
+ "title": "Additions to our analysis of soil carbon protocols",
+ "summary": "We analyzed three new soil carbon protocols and added them our interactive database."
+ },
+ {
+ "page": "blog/maps-library-release",
+ "type": "blog",
+ "date": "2021-09-27",
+ "title": "A new toolkit for data-driven maps",
+ "summary": "Why rendering scientific data in web maps is so tough, and how we’re trying to solve it."
+ },
+ {
+ "page": "blog/climate-trace-release",
+ "type": "blog",
+ "date": "2021-09-16",
+ "title": "Climate TRACE release",
+ "summary": "Our contributions to the initial Climate TRACE data release, and what’s coming next."
+ },
+ {
+ "page": "blog/first-post-welcome",
+ "type": "blog",
+ "date": "2021-09-14",
+ "title": "Welcome to the blog",
+ "summary": "Why we made this and what you'll find here."
+ }
+]
diff --git a/package-lock.json b/package-lock.json
index ce771e3a..c8000ef8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,6 +18,7 @@
"@mdx-js/react": "^2.1.5",
"@stripe/stripe-js": "^1.13.2",
"@theme-ui/color": "^0.15.3",
+ "cmdk": "^0.1.20",
"d3-array": "^3.1.1",
"d3-format": "^3.1.0",
"d3-scale": "^4.0.2",
@@ -1617,6 +1618,215 @@
"node": ">= 10"
}
},
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz",
+ "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz",
+ "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz",
+ "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz",
+ "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.0",
+ "@radix-ui/react-compose-refs": "1.0.0",
+ "@radix-ui/react-context": "1.0.0",
+ "@radix-ui/react-dismissable-layer": "1.0.0",
+ "@radix-ui/react-focus-guards": "1.0.0",
+ "@radix-ui/react-focus-scope": "1.0.0",
+ "@radix-ui/react-id": "1.0.0",
+ "@radix-ui/react-portal": "1.0.0",
+ "@radix-ui/react-presence": "1.0.0",
+ "@radix-ui/react-primitive": "1.0.0",
+ "@radix-ui/react-slot": "1.0.0",
+ "@radix-ui/react-use-controllable-state": "1.0.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.5.4"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz",
+ "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.0",
+ "@radix-ui/react-compose-refs": "1.0.0",
+ "@radix-ui/react-primitive": "1.0.0",
+ "@radix-ui/react-use-callback-ref": "1.0.0",
+ "@radix-ui/react-use-escape-keydown": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz",
+ "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz",
+ "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.0",
+ "@radix-ui/react-primitive": "1.0.0",
+ "@radix-ui/react-use-callback-ref": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz",
+ "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz",
+ "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz",
+ "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.0",
+ "@radix-ui/react-use-layout-effect": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz",
+ "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-slot": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz",
+ "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz",
+ "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz",
+ "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz",
+ "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz",
+ "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
"node_modules/@sinonjs/commons": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
@@ -2126,6 +2336,26 @@
"sprintf-js": "~1.0.2"
}
},
+ "node_modules/aria-hidden": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.1.tgz",
+ "integrity": "sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.9.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -2481,6 +2711,19 @@
"wrap-ansi": "^7.0.0"
}
},
+ "node_modules/cmdk": {
+ "version": "0.1.20",
+ "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.1.20.tgz",
+ "integrity": "sha512-b05kPE+9jmGRibOf2h34d1ybCFfYYOiwsyylDtvhI0ptDSJ/gbPDQSq6DySL4b74ZnK/JH/WVP3UPuAYXRPypg==",
+ "dependencies": {
+ "@radix-ui/react-dialog": "1.0.0",
+ "command-score": "0.1.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
"node_modules/co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -2522,6 +2765,11 @@
"node": ">= 0.8"
}
},
+ "node_modules/command-score": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/command-score/-/command-score-0.1.2.tgz",
+ "integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w=="
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2759,6 +3007,11 @@
"node": ">=8"
}
},
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ },
"node_modules/diff-sequences": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
@@ -3069,6 +3322,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/get-package-type": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -3303,6 +3564,14 @@
"node": ">=12"
}
},
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -5925,6 +6194,73 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "node_modules/react-remove-scroll": {
+ "version": "2.5.4",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz",
+ "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.3",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz",
+ "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==",
+ "dependencies": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/regenerator-runtime": {
"version": "0.13.10",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz",
@@ -6539,6 +6875,47 @@
"requires-port": "^1.0.0"
}
},
+ "node_modules/use-callback-ref": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz",
+ "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/use-sync-external-store": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
@@ -7932,6 +8309,164 @@
"integrity": "sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA==",
"optional": true
},
+ "@radix-ui/primitive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz",
+ "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-compose-refs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz",
+ "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-context": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz",
+ "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-dialog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz",
+ "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.0",
+ "@radix-ui/react-compose-refs": "1.0.0",
+ "@radix-ui/react-context": "1.0.0",
+ "@radix-ui/react-dismissable-layer": "1.0.0",
+ "@radix-ui/react-focus-guards": "1.0.0",
+ "@radix-ui/react-focus-scope": "1.0.0",
+ "@radix-ui/react-id": "1.0.0",
+ "@radix-ui/react-portal": "1.0.0",
+ "@radix-ui/react-presence": "1.0.0",
+ "@radix-ui/react-primitive": "1.0.0",
+ "@radix-ui/react-slot": "1.0.0",
+ "@radix-ui/react-use-controllable-state": "1.0.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.5.4"
+ }
+ },
+ "@radix-ui/react-dismissable-layer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz",
+ "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.0",
+ "@radix-ui/react-compose-refs": "1.0.0",
+ "@radix-ui/react-primitive": "1.0.0",
+ "@radix-ui/react-use-callback-ref": "1.0.0",
+ "@radix-ui/react-use-escape-keydown": "1.0.0"
+ }
+ },
+ "@radix-ui/react-focus-guards": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz",
+ "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-focus-scope": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz",
+ "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.0",
+ "@radix-ui/react-primitive": "1.0.0",
+ "@radix-ui/react-use-callback-ref": "1.0.0"
+ }
+ },
+ "@radix-ui/react-id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz",
+ "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "1.0.0"
+ }
+ },
+ "@radix-ui/react-portal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz",
+ "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.0"
+ }
+ },
+ "@radix-ui/react-presence": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz",
+ "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.0",
+ "@radix-ui/react-use-layout-effect": "1.0.0"
+ }
+ },
+ "@radix-ui/react-primitive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz",
+ "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-slot": "1.0.0"
+ }
+ },
+ "@radix-ui/react-slot": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz",
+ "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.0"
+ }
+ },
+ "@radix-ui/react-use-callback-ref": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz",
+ "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-use-controllable-state": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz",
+ "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.0"
+ }
+ },
+ "@radix-ui/react-use-escape-keydown": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz",
+ "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.0"
+ }
+ },
+ "@radix-ui/react-use-layout-effect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz",
+ "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
"@sinonjs/commons": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
@@ -8392,6 +8927,14 @@
"sprintf-js": "~1.0.2"
}
},
+ "aria-hidden": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.1.tgz",
+ "integrity": "sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A==",
+ "requires": {
+ "tslib": "^2.0.0"
+ }
+ },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -8658,6 +9201,15 @@
"wrap-ansi": "^7.0.0"
}
},
+ "cmdk": {
+ "version": "0.1.20",
+ "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.1.20.tgz",
+ "integrity": "sha512-b05kPE+9jmGRibOf2h34d1ybCFfYYOiwsyylDtvhI0ptDSJ/gbPDQSq6DySL4b74ZnK/JH/WVP3UPuAYXRPypg==",
+ "requires": {
+ "@radix-ui/react-dialog": "1.0.0",
+ "command-score": "0.1.2"
+ }
+ },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -8692,6 +9244,11 @@
"delayed-stream": "~1.0.0"
}
},
+ "command-score": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/command-score/-/command-score-0.1.2.tgz",
+ "integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w=="
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -8875,6 +9432,11 @@
"integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
"dev": true
},
+ "detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ },
"diff-sequences": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
@@ -9103,6 +9665,11 @@
"has-symbols": "^1.0.3"
}
},
+ "get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="
+ },
"get-package-type": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -9270,6 +9837,14 @@
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
"integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
},
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -11205,6 +11780,37 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "react-remove-scroll": {
+ "version": "2.5.4",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz",
+ "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==",
+ "requires": {
+ "react-remove-scroll-bar": "^2.3.3",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ }
+ },
+ "react-remove-scroll-bar": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz",
+ "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==",
+ "requires": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ }
+ },
+ "react-style-singleton": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+ "requires": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^2.0.0"
+ }
+ },
"regenerator-runtime": {
"version": "0.13.10",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz",
@@ -11658,6 +12264,23 @@
"requires-port": "^1.0.0"
}
},
+ "use-callback-ref": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz",
+ "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==",
+ "requires": {
+ "tslib": "^2.0.0"
+ }
+ },
+ "use-sidecar": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "requires": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ }
+ },
"use-sync-external-store": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
diff --git a/package.json b/package.json
index 6b84ed87..83279418 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
"@mdx-js/react": "^2.1.5",
"@stripe/stripe-js": "^1.13.2",
"@theme-ui/color": "^0.15.3",
+ "cmdk": "^0.1.20",
"d3-array": "^3.1.1",
"d3-format": "^3.1.0",
"d3-scale": "^4.0.2",
diff --git a/pages/_app.js b/pages/_app.js
index 4fb49b2e..65a5c6a4 100644
--- a/pages/_app.js
+++ b/pages/_app.js
@@ -2,10 +2,12 @@ import { ThemeProvider } from 'theme-ui'
import theme from '@carbonplan/theme'
import '@carbonplan/components/globals.css'
import '@carbonplan/components/fonts.css'
+import CommandMenu from '../components/command-menu'
export default function App({ Component, pageProps }) {
return (
+
)