diff --git a/cursorless-nx/apps/cheatsheet-local/src/index.html b/cursorless-nx/apps/cheatsheet-local/src/index.html index bfa6febee4..38f2c16449 100644 --- a/cursorless-nx/apps/cheatsheet-local/src/index.html +++ b/cursorless-nx/apps/cheatsheet-local/src/index.html @@ -9,6 +9,17 @@ +
diff --git a/cursorless-nx/apps/cheatsheet-local/tailwind.config.js b/cursorless-nx/apps/cheatsheet-local/tailwind.config.js index e0eeaeeed2..db78c9cbc9 100644 --- a/cursorless-nx/apps/cheatsheet-local/tailwind.config.js +++ b/cursorless-nx/apps/cheatsheet-local/tailwind.config.js @@ -11,4 +11,5 @@ module.exports = { extend: {}, }, plugins: [], + darkMode: 'class', }; diff --git a/cursorless-nx/libs/cheatsheet/src/lib/cheatsheet.tsx b/cursorless-nx/libs/cheatsheet/src/lib/cheatsheet.tsx index 522dd7a221..fa572676a1 100644 --- a/cursorless-nx/libs/cheatsheet/src/lib/cheatsheet.tsx +++ b/cursorless-nx/libs/cheatsheet/src/lib/cheatsheet.tsx @@ -1,46 +1,65 @@ -import * as React from 'react'; +import React, { useState } from 'react'; import CheatsheetListComponent from './components/CheatsheetListComponent'; import CheatsheetLegendComponent from './components/CheatsheetLegendComponent'; import cheatsheetLegend from './cheatsheetLegend'; import Helmet from 'react-helmet'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faCircleQuestion } from '@fortawesome/free-solid-svg-icons'; +import { faCircleQuestion, faGear } from '@fortawesome/free-solid-svg-icons'; import CheatsheetNotesComponent from './components/CheatsheetNotesComponent'; import SmartLink from './components/SmartLink'; import { CheatsheetInfo } from './CheatsheetInfo'; +import { SettingsProvider } from './components/Settings/SettingsContext'; +import { DarkModeToggle } from './components/DarkModeToggle'; +import { SettingsControls } from './components/Settings/SettingsControls'; +import { IconButton } from './components/IconButton'; type CheatsheetPageProps = { cheatsheetInfo: CheatsheetInfo; }; -// markup export const CheatsheetPage: React.FC = ({ cheatsheetInfo, }) => { + const [settingsOpen, setSettingsOpen] = useState(false); + return ( -
- -

- Cursorless Cheatsheet{' '} - - - - - - - See the{' '} - - full documentation - {' '} - to learn more. - -

- -
+ +
+ +
+ setSettingsOpen((v) => !v)} + /> + +
+

+ Cursorless Cheatsheet{' '} + + + + + + + See the{' '} + + full documentation + {' '} + to learn more. + +

+ setSettingsOpen(false)} + open={settingsOpen} + /> + +
+
); }; diff --git a/cursorless-nx/libs/cheatsheet/src/lib/components/CheatsheetListComponent.tsx b/cursorless-nx/libs/cheatsheet/src/lib/components/CheatsheetListComponent.tsx index 852c8d0798..b1dd7a44da 100644 --- a/cursorless-nx/libs/cheatsheet/src/lib/components/CheatsheetListComponent.tsx +++ b/cursorless-nx/libs/cheatsheet/src/lib/components/CheatsheetListComponent.tsx @@ -1,6 +1,10 @@ -import * as React from 'react'; +import React, { useEffect, useState } from 'react'; import useIsHighlighted from '../hooks/useIsHighlighted'; import { CheatsheetSection } from '../CheatsheetInfo'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faChevronUp } from '@fortawesome/free-solid-svg-icons'; +import clsx from 'clsx'; +import { useSettings } from './Settings/SettingsContext'; type Props = { section: CheatsheetSection; @@ -10,13 +14,35 @@ export default function CheatsheetListComponent({ section, }: Props): JSX.Element { const isHighlighted = useIsHighlighted(section.id); + const { modeConfig, ...settings } = useSettings(); - const variations = section.items.flatMap((item) => item.variations); + const collapseItemIds = modeConfig.defaultCommands[section.id]; + const collapsible = !!collapseItemIds; + const collapseDefault = collapsible && modeConfig.collapseByDefault; - variations.sort((form1, form2) => - form1.spokenForm.localeCompare(form2.spokenForm) + const [collapsed, setCollapsed] = useState(collapseDefault); + + useEffect( + () => setCollapsed(collapseDefault), + [modeConfig.collapseByDefault] ); + const toggleCollapse = () => setCollapsed((current) => !current); + + const variations = section.items + .filter((item) => !collapsed || collapseItemIds?.includes(item.id)) + .flatMap((item) => item.variations); + + variations.sort((form1, form2) => { + switch (settings.order) { + case 'alphabetical': + return form1.spokenForm.localeCompare(form2.spokenForm); + case 'functional': + // TODO add more meaningful grouping to sort by + return form1.description.localeCompare(form2.description); + } + }); + const borderClassName = isHighlighted ? 'border-violet-500 dark:border-violet-400' : 'border-stone-300 dark:border-stone-500'; @@ -26,7 +52,29 @@ export default function CheatsheetListComponent({ id={section.id} className={`border ${borderClassName} rounded-lg bg-stone-100 dark:bg-stone-700`} > -

{section.name}

+

+ +

@@ -37,17 +85,19 @@ export default function CheatsheetListComponent({ - {variations.map(({ spokenForm, description }) => ( + {variations.map((variation) => ( - + ))} diff --git a/cursorless-nx/libs/cheatsheet/src/lib/components/DarkModeToggle.tsx b/cursorless-nx/libs/cheatsheet/src/lib/components/DarkModeToggle.tsx new file mode 100644 index 0000000000..4751e9ea0f --- /dev/null +++ b/cursorless-nx/libs/cheatsheet/src/lib/components/DarkModeToggle.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { faMoon, faSun } from '@fortawesome/free-solid-svg-icons'; +import { useSettings } from './Settings/SettingsContext'; +import { IconButton } from './IconButton'; + +export const DarkModeToggle: React.FC = () => { + const settings = useSettings(); + + return ( + settings.setTheme(settings.darkMode ? 'light' : 'dark')} + title={settings.darkMode ? 'Light mode' : 'Dark mode'} + icon={settings.darkMode ? faSun : faMoon} + /> + ); +}; diff --git a/cursorless-nx/libs/cheatsheet/src/lib/components/IconButton.tsx b/cursorless-nx/libs/cheatsheet/src/lib/components/IconButton.tsx new file mode 100644 index 0000000000..f979c4867c --- /dev/null +++ b/cursorless-nx/libs/cheatsheet/src/lib/components/IconButton.tsx @@ -0,0 +1,19 @@ +import { IconProp } from '@fortawesome/fontawesome-svg-core'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import React from 'react'; + +export type IconButtonProps = { + icon: IconProp; +} & React.HTMLAttributes; + +export const IconButton: React.FC = (props) => { + const { icon, className, ...buttonProps } = props; + return ( + + ); +}; diff --git a/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/ModeConfig.ts b/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/ModeConfig.ts new file mode 100644 index 0000000000..3989928039 --- /dev/null +++ b/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/ModeConfig.ts @@ -0,0 +1,162 @@ +import { Mode } from './settings'; + +export type ModeConfig = { + [mode in Mode]: { + collapseByDefault: boolean; + defaultCommands: { [section: string]: string[] | undefined }; + }; +}; + +export const ModeConfig: ModeConfig = { + default: { + collapseByDefault: false, + defaultCommands: { + actions: [ + 'cutToClipboard', + 'remove', + 'copyToClipboard', + 'setSelectionAfter', + 'setSelectionBefore', + 'setSelection', + 'pasteFromClipboard', + 'nextHomophone', + 'rename', + 'replaceWithTarget', + 'moveToTarget', + ], + scopes: [ + 'argumentOrParameter', + 'class', + 'comment', + 'namedFunction', + 'ifStatement', + 'collectionItem', + 'list', + 'map', + 'statement', + 'type', + 'value', + 'line', + 'nonWhitespaceSequence', + 'token', + 'word', + 'character', + ], + pairedDelimiters: [ + 'whitespace', + 'curlyBrackets', + 'angleBrackets', + 'doubleQuotes', + 'parentheses', + 'backtickQuotes', + 'squareBrackets', + 'singleQuotes', + ], + }, + }, + beginner: { + collapseByDefault: true, + defaultCommands: { + actions: [ + 'cutToClipboard', + 'remove', + 'copyToClipboard', + 'setSelectionAfter', + 'setSelectionBefore', + 'setSelection', + 'pasteFromClipboard', + 'nextHomophone', + 'rename', + 'replaceWithTarget', + 'moveToTarget', + ], + scopes: [ + 'argumentOrParameter', + 'class', + 'comment', + 'namedFunction', + 'ifStatement', + 'collectionItem', + 'list', + 'map', + 'statement', + 'type', + 'value', + 'line', + 'nonWhitespaceSequence', + 'token', + 'word', + 'character', + ], + pairedDelimiters: [ + 'whitespace', + 'curlyBrackets', + 'angleBrackets', + 'doubleQuotes', + 'parentheses', + 'backtickQuotes', + 'squareBrackets', + 'singleQuotes', + ], + }, + }, + text: { + collapseByDefault: true, + defaultCommands: { + actions: [ + 'scrollToBottom', + 'cutToClipboard', + 'scrollToCenter', + 'remove', + 'clearAndSetSelection', + 'insertCopyBefore', + 'insertCopyAfter', + 'copyToClipboard', + 'scrollToTop', + 'outdentLine', + 'editNewLineBefore', + 'insertEmptyLineBefore', + 'insertEmptyLineAfter', + 'followLink', + 'deselect', + 'highlight', + 'indentLine', + 'setSelectionAfter', + 'editNewLineAfter', + 'setSelectionBefore', + 'insertEmptyLinesAround', + 'findInWorkspace', + 'setSelection', + 'pasteFromClipboard', + 'findInDocument', + 'nextHomophone', + 'rename', + 'replaceWithTarget', + 'moveToTarget', + 'swapTargets', + 'applyFormatter', + ], + scopes: [ + 'section', + 'paragraph', + 'document', + 'line', + 'nonWhitespaceSequence', + 'boundedNonWhitespaceSequence', + 'url', + 'word', + 'character', + ], + pairedDelimiters: [ + 'whitespace', + 'curlyBrackets', + 'angleBrackets', + 'doubleQuotes', + 'parentheses', + 'backtickQuotes', + 'squareBrackets', + 'singleQuotes', + ], + }, + }, +}; diff --git a/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/SettingsContext.tsx b/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/SettingsContext.tsx new file mode 100644 index 0000000000..4715e728ab --- /dev/null +++ b/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/SettingsContext.tsx @@ -0,0 +1,69 @@ +import React, { createContext, useContext, useEffect } from 'react'; +import { useLocalStorage } from '../../hooks/useLocalStorage'; +import { ModeConfig } from './ModeConfig'; +import { Mode, Order, Theme } from './settings'; + +export interface SettingsContext { + darkMode: boolean; + mode: Mode; + modeConfig: ModeConfig[Mode]; + order: Order; + setMode: React.Dispatch>; + setOrder: React.Dispatch>; + setTheme: React.Dispatch>; + theme: Theme; +} + +export const SettingsContext = createContext(null); + +export type SettingsProviderProps = { + children: React.ReactNode; +}; + +export const SettingsProvider: React.FC = (props) => { + const [mode, setMode] = useLocalStorage('mode', 'default'); + const [order, setOrder] = useLocalStorage('order', 'alphabetical'); + const [theme, setTheme] = useLocalStorage('theme', 'system'); + + const systemDarkMode = window.matchMedia( + '(prefers-color-scheme: dark)' + ).matches; + + const darkMode = theme === 'system' ? systemDarkMode : theme === 'dark'; + + useEffect(() => { + if (darkMode) { + document.documentElement.classList.add('dark'); + } else { + document.documentElement.classList.remove('dark'); + } + }, [darkMode]); + + const modeConfig = ModeConfig[mode]; + const value = { + darkMode, + mode, + modeConfig, + order, + setMode, + setOrder, + setTheme, + theme, + }; + + return ( + + {props.children} + + ); +}; + +export const useSettings = () => { + const contextValue = useContext(SettingsContext); + if (contextValue === null) { + throw new Error( + 'SettingsContext value is null. Is it being used outside of a provider?' + ); + } + return contextValue; +}; diff --git a/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/SettingsControls.tsx b/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/SettingsControls.tsx new file mode 100644 index 0000000000..25b72f5ee1 --- /dev/null +++ b/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/SettingsControls.tsx @@ -0,0 +1,101 @@ +import clsx from 'clsx'; +import React from 'react'; +import { useSettings } from './SettingsContext'; +import { MODES, ORDERS, SettingOption, THEMES } from './settings'; +import { IconButton } from '../IconButton'; +import { faClose } from '@fortawesome/free-solid-svg-icons'; + +type RadioOptionProps = { + name: string; + option: SettingOption; + checked: boolean; + onChange: React.ChangeEventHandler; +}; + +const RadioOption: React.FC = (props) => { + return ( + + ); +}; + +export type SettingsControlsProps = { + open: boolean; + onClose: React.MouseEventHandler; +}; + +export const SettingsControls: React.FC = (props) => { + const settings = useSettings(); + + return ( +
+
+ +
+
+

Mode

+ {MODES.map((option) => ( + settings.setMode(option.id)} + /> + ))} +
+ +
+

Command order

+ {ORDERS.map((option) => ( + settings.setOrder(option.id)} + /> + ))} +
+ +
+

Theme

+ {THEMES.map((option) => ( + settings.setTheme(option.id)} + /> + ))} +
+
+
+
+ ); +}; diff --git a/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/settings.ts b/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/settings.ts new file mode 100644 index 0000000000..d3881be91e --- /dev/null +++ b/cursorless-nx/libs/cheatsheet/src/lib/components/Settings/settings.ts @@ -0,0 +1,60 @@ +export type SettingId = T[number]['id']; + +export type SettingOption = { + id: string; + name: string; + description?: string; +}; + +export const MODES = [ + { + id: 'default', + name: 'Default', + description: 'Shows all available commands.', + }, + { + id: 'beginner', + name: 'Beginner', + description: 'Shows limited set of the most common commands.', + }, + { + id: 'text', + name: 'Text', + description: 'Shows commands useful for editing plain text.', + }, +] as const; + +export type Mode = SettingId; + +export const ORDERS = [ + { + id: 'alphabetical', + name: 'Alphabetical', + description: 'Order alphabetically by spoken form.', + }, + { + id: 'functional', + name: 'Functional', + description: 'Group commands by function.', + }, +] as const; + +export type Order = SettingId; + +export const THEMES = [ + { + id: 'light', + name: 'Light', + }, + { + id: 'dark', + name: 'Dark', + }, + { + id: 'system', + name: 'System', + description: 'Use system color scheme.', + }, +] as const; + +export type Theme = SettingId; diff --git a/cursorless-nx/libs/cheatsheet/src/lib/hooks/useLocalStorage.ts b/cursorless-nx/libs/cheatsheet/src/lib/hooks/useLocalStorage.ts new file mode 100644 index 0000000000..a0e7f514aa --- /dev/null +++ b/cursorless-nx/libs/cheatsheet/src/lib/hooks/useLocalStorage.ts @@ -0,0 +1,26 @@ +import { useEffect, useState } from 'react'; + +function getStoredValue(key: string): T | null { + const stored = localStorage.getItem(key); + try { + return stored ? JSON.parse(stored) : null; + } catch (error) { + console.warn(error); + return null; + } +} + +export function useLocalStorage( + key: string, + defaultValue: T +): [T, React.Dispatch>] { + const [value, setValue] = useState(() => { + return getStoredValue(key) ?? defaultValue; + }); + + useEffect(() => { + localStorage.setItem(key, JSON.stringify(value)); + }, [key, value]); + + return [value, setValue]; +} diff --git a/cursorless-nx/package-lock.json b/cursorless-nx/package-lock.json index cb8768c361..0ce4fb7264 100644 --- a/cursorless-nx/package-lock.json +++ b/cursorless-nx/package-lock.json @@ -13,6 +13,7 @@ "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", "autoprefixer": "^10.4.7", + "clsx": "^1.2.1", "core-js": "^3.6.5", "postcss": "^8.4.13", "react": "18.1.0", @@ -1925,7 +1926,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -1937,7 +1938,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2886,7 +2887,7 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6.0.0" } @@ -2928,7 +2929,7 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.14", @@ -5114,25 +5115,25 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "devOptional": true }, "node_modules/@types/aria-query": { "version": "4.2.2", @@ -5378,7 +5379,7 @@ "version": "18.0.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==", - "dev": true + "devOptional": true }, "node_modules/@types/npmlog": { "version": "4.1.4", @@ -6018,7 +6019,7 @@ "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -7466,6 +7467,14 @@ "node": ">=0.10.0" } }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -7838,7 +7847,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "devOptional": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -8621,7 +8630,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.3.1" } @@ -14669,7 +14678,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "devOptional": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -19101,7 +19110,7 @@ "version": "10.8.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.2.tgz", "integrity": "sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==", - "dev": true, + "devOptional": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -19144,7 +19153,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.4.0" } @@ -19153,7 +19162,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "devOptional": true }, "node_modules/tsconfig-paths": { "version": "3.14.1", @@ -19378,7 +19387,7 @@ "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19622,7 +19631,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "devOptional": true }, "node_modules/v8-to-istanbul": { "version": "8.1.1", @@ -20352,7 +20361,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -21660,7 +21669,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -21669,7 +21678,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -22395,7 +22404,7 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", - "dev": true + "devOptional": true }, "@jridgewell/set-array": { "version": "1.1.2", @@ -22430,7 +22439,7 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "devOptional": true }, "@jridgewell/trace-mapping": { "version": "0.3.14", @@ -23763,49 +23772,57 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-transform-svg-component": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-preset": { "version": "6.2.0", @@ -23977,25 +23994,25 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "devOptional": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "devOptional": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "devOptional": true }, "@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "devOptional": true }, "@types/aria-query": { "version": "4.2.2", @@ -24241,7 +24258,7 @@ "version": "18.0.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==", - "dev": true + "devOptional": true }, "@types/npmlog": { "version": "4.1.4", @@ -24764,7 +24781,7 @@ "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true + "devOptional": true }, "acorn-globals": { "version": "6.0.0", @@ -24788,13 +24805,15 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "dev": true, + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "acorn-node": { "version": "1.8.2", @@ -24882,7 +24901,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-colors": { "version": "4.1.3", @@ -25826,6 +25846,11 @@ } } }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -26119,7 +26144,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "devOptional": true }, "cross-spawn": { "version": "7.0.3", @@ -26147,7 +26172,8 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true + "dev": true, + "requires": {} }, "css-in-js-utils": { "version": "2.0.1", @@ -26325,7 +26351,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true + "dev": true, + "requires": {} }, "csso": { "version": "4.2.0", @@ -26696,7 +26723,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "devOptional": true }, "diff-sequences": { "version": "27.5.1", @@ -27247,7 +27274,8 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.6", @@ -27494,7 +27522,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", - "dev": true + "dev": true, + "requires": {} }, "eslint-scope": { "version": "7.1.1", @@ -28788,7 +28817,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "identity-obj-proxy": { "version": "3.0.0", @@ -30008,7 +30038,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "27.5.1", @@ -31228,7 +31259,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "devOptional": true }, "makeerror": { "version": "1.0.12", @@ -32218,25 +32249,29 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-import": { "version": "14.1.0", @@ -32360,7 +32395,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -32403,7 +32439,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true + "dev": true, + "requires": {} }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -32805,7 +32842,8 @@ "react-side-effect": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", - "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==" + "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", + "requires": {} } } }, @@ -32889,7 +32927,8 @@ "react-universal-interface": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", - "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==" + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "requires": {} } } }, @@ -33201,7 +33240,8 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/rollup-plugin-peer-deps-external/-/rollup-plugin-peer-deps-external-2.2.4.tgz", "integrity": "sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==", - "dev": true + "dev": true, + "requires": {} }, "rollup-plugin-postcss": { "version": "4.0.2", @@ -33345,7 +33385,8 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz", "integrity": "sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw==", - "dev": true + "dev": true, + "requires": {} }, "safe-buffer": { "version": "5.1.2", @@ -34007,7 +34048,8 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true + "dev": true, + "requires": {} }, "stylehacks": { "version": "5.1.0", @@ -34491,7 +34533,7 @@ "version": "10.8.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.2.tgz", "integrity": "sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==", - "dev": true, + "devOptional": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -34512,13 +34554,13 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true + "devOptional": true }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "devOptional": true } } }, @@ -34700,7 +34742,7 @@ "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true + "devOptional": true }, "unbox-primitive": { "version": "1.0.2", @@ -34868,7 +34910,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "devOptional": true }, "v8-to-istanbul": { "version": "8.1.1", @@ -35156,7 +35198,8 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -35336,7 +35379,8 @@ "version": "7.5.8", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", - "dev": true + "dev": true, + "requires": {} }, "xml-name-validator": { "version": "3.0.0", @@ -35407,7 +35451,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "devOptional": true }, "yocto-queue": { "version": "0.1.0", diff --git a/cursorless-nx/package.json b/cursorless-nx/package.json index 4bd0a81272..f7e286d5be 100644 --- a/cursorless-nx/package.json +++ b/cursorless-nx/package.json @@ -50,6 +50,7 @@ "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", "autoprefixer": "^10.4.7", + "clsx": "^1.2.1", "core-js": "^3.6.5", "postcss": "^8.4.13", "react": "18.1.0",
- {spokenForm} + {variation.spokenForm} {description} + {variation.description} +