diff --git a/changelog/2025-02-addedLanguagesToDocs.md b/changelog/2025-02-addedLanguagesToDocs.md
new file mode 100644
index 0000000000..f94812f99c
--- /dev/null
+++ b/changelog/2025-02-addedLanguagesToDocs.md
@@ -0,0 +1,6 @@
+---
+tags: [documentation]
+pullRequest: 2859
+---
+
+- Added languages sidebar to documents page. Here you can see the supported scope facets for each language.
diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts
index 49599e44f2..488f87ce3f 100644
--- a/packages/common/src/index.ts
+++ b/packages/common/src/index.ts
@@ -93,6 +93,7 @@ export * from "./types/TreeSitter";
export * from "./types/tutorial.types";
export * from "./util";
export * from "./util/camelCaseToAllDown";
+export * from "./util/capitalize";
export * from "./util/clientSupportsFallback";
export * from "./util/CompositeKeyDefaultMap";
export * from "./util/CompositeKeyMap";
diff --git a/packages/common/src/util/capitalize.ts b/packages/common/src/util/capitalize.ts
new file mode 100644
index 0000000000..7519095d07
--- /dev/null
+++ b/packages/common/src/util/capitalize.ts
@@ -0,0 +1,3 @@
+export function capitalize(str: string) {
+ return str.charAt(0).toUpperCase() + str.slice(1);
+}
diff --git a/packages/cursorless-org-docs/src/css/custom.css b/packages/cursorless-org-docs/src/css/custom.css
index f6b6fa3065..e85ded5046 100644
--- a/packages/cursorless-org-docs/src/css/custom.css
+++ b/packages/cursorless-org-docs/src/css/custom.css
@@ -28,3 +28,23 @@
.hidden {
display: none;
}
+
+.card {
+ border: 1px solid rgba(0, 0, 0, 0.175);
+ margin-bottom: 1rem;
+}
+
+.card-header {
+ background-color: #f8f9fa;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+ padding: 0.5rem 1rem;
+ cursor: pointer;
+}
+
+.card-body {
+ padding: 1rem;
+}
+
+.facet-name {
+ font-weight: 600;
+}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx
deleted file mode 100644
index d291f722d1..0000000000
--- a/packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import {
- ScopeSupportFacetLevel,
- languageScopeSupport,
- scopeSupportFacets,
- type ScopeSupportFacet,
-} from "@cursorless/common";
-import React from "react";
-
-interface Props {
- languageId: string;
-}
-
-export default function ScopeSupport({ languageId }: Props) {
- const scopesSorted = [...scopeSupportFacets].sort();
- const scopeSupport = languageScopeSupport[languageId] ?? {};
-
- const supportedScopes = scopesSorted.filter(
- (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supported,
- );
- const supportedLegacyScopes = scopesSorted.filter(
- (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supportedLegacy,
- );
- const unsupportedScopes = scopesSorted.filter(
- (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.unsupported,
- );
- const unspecifiedScopes = scopesSorted.filter(
- (facet) => scopeSupport[facet] == null,
- );
-
- return (
- <>
- {getContentForSupportLevel(
- supportedScopes,
- "Supported facets",
- "These facets are supported",
- )}
- {getContentForSupportLevel(
- supportedLegacyScopes,
- "Supported Legacy facets",
- "These facets are supported with the legacy implementation and should be migrated to the new implementation",
- )}
- {getContentForSupportLevel(
- unsupportedScopes,
- "Unsupported facets",
- "These facets are not supported yet and needs a developer to implement them",
- )}
- {getContentForSupportLevel(
- unspecifiedScopes,
- "Unspecified facets",
- <>
- These facets are unspecified
-
- Note that in many instances we actually do support these scopes, but
- we have not yet updated `languageScopeSupport` to reflect this fact
-
- >,
- )}
- >
- );
-}
-
-function getContentForSupportLevel(
- facets: ScopeSupportFacet[],
- title: string,
- description: React.ReactNode,
-) {
- if (facets.length === 0) {
- return null;
- }
- return (
-
-
{title}
-
{description}
-
-
- {facets.map((facet) => (
- - {facet}
- ))}
-
-
- );
-}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/_category_.json b/packages/cursorless-org-docs/src/docs/user/languages/_category_.json
deleted file mode 100644
index e7b327b868..0000000000
--- a/packages/cursorless-org-docs/src/docs/user/languages/_category_.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "className": "hidden"
-}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/c.mdx b/packages/cursorless-org-docs/src/docs/user/languages/c.mdx
index 561b32b48f..ce075f921b 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/c.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/c.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# C
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx b/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx
index a430ed47e4..55c123d0c4 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Clojure
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/Language.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/Language.tsx
similarity index 55%
rename from packages/cursorless-org-docs/src/docs/user/languages/Language.tsx
rename to packages/cursorless-org-docs/src/docs/user/languages/components/Language.tsx
index 811d3377ee..1fa19d671d 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/Language.tsx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/components/Language.tsx
@@ -1,10 +1,10 @@
import React from "react";
-import ScopeSupport from "./ScopeSupport";
+import { ScopeSupport } from "./ScopeSupport";
interface Props {
languageId: string;
}
-export default function Language({ languageId }: Props) {
+export function Language({ languageId }: Props) {
return ;
}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx
new file mode 100644
index 0000000000..fc344857a4
--- /dev/null
+++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx
@@ -0,0 +1,80 @@
+import {
+ ScopeSupportFacetLevel,
+ languageScopeSupport,
+ scopeSupportFacets,
+} from "@cursorless/common";
+import React from "react";
+import { ScopeSupportForLevel } from "./ScopeSupportForLevel";
+
+interface Props {
+ languageId: string;
+}
+
+export function ScopeSupport({ languageId }: Props): JSX.Element {
+ const scopesSorted = [...scopeSupportFacets].sort();
+ const scopeSupport = languageScopeSupport[languageId] ?? {};
+
+ const supportedScopes = scopesSorted.filter(
+ (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supported,
+ );
+ const supportedLegacyScopes = scopesSorted.filter(
+ (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supportedLegacy,
+ );
+ const unsupportedScopes = scopesSorted.filter(
+ (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.unsupported,
+ );
+ const unspecifiedScopes = scopesSorted.filter(
+ (facet) => scopeSupport[facet] == null,
+ );
+
+ return (
+ <>
+ Scopes
+
+
+
+
+
+
+ We would happily accept{" "}
+
+ contributions
+
+ >
+ }
+ />
+
+
+ Note that in many instances we actually do support these scopes and
+ facets, but we have not yet updated 'languageScopeSupport' to
+ reflect this fact.
+
+ We would happily accept{" "}
+
+ contributions
+
+ >
+ }
+ />
+ >
+ );
+}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx
new file mode 100644
index 0000000000..1026ea64d9
--- /dev/null
+++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx
@@ -0,0 +1,119 @@
+import {
+ camelCaseToAllDown,
+ capitalize,
+ groupBy,
+ type ScopeSupportFacet,
+ type ScopeSupportFacetInfo,
+ scopeSupportFacetInfos,
+ type ScopeType,
+ type SimpleScopeTypeType,
+} from "@cursorless/common";
+import React, { useState } from "react";
+
+interface Props {
+ facets: ScopeSupportFacet[];
+ title: string;
+ subtitle: string;
+ description?: React.ReactNode;
+ expanded?: boolean;
+}
+
+export function ScopeSupportForLevel({
+ facets,
+ title,
+ subtitle,
+ description,
+ expanded: expandedProp,
+}: Props): JSX.Element | null {
+ const [expanded, setExpanded] = useState(expandedProp ?? false);
+
+ if (facets.length === 0) {
+ return null;
+ }
+
+ const renderBody = () => {
+ if (!expanded) {
+ return null;
+ }
+
+ const facetInfos = facets.map(
+ (facet): AugmentedFacetInfo => ({
+ facet,
+ ...scopeSupportFacetInfos[facet],
+ }),
+ );
+ const scopeGroups: Map = groupBy(
+ facetInfos,
+ (facetInfo) => serializeScopeType(facetInfo.scopeType),
+ );
+ const scopeTypes = Array.from(scopeGroups.keys()).sort();
+
+ return (
+
+ {description &&
{description}
}
+
+ {scopeTypes.map((scopeType) => {
+ const facetInfos = scopeGroups.get(scopeType) ?? [];
+ return (
+
+
{prettifyScopeType(scopeType)}
+
+ {facetInfos.map((facetInfo) => {
+ return (
+ -
+
+ {prettifyFacet(facetInfo.facet)}
+
+ : {facetInfo.description}
+
+ );
+ })}
+
+
+ );
+ })}
+
+ );
+ };
+
+ return (
+
+
setExpanded(!expanded)}>
+
{title}
+ {subtitle}
+
+
+ {renderBody()}
+
+ );
+}
+
+interface AugmentedFacetInfo extends ScopeSupportFacetInfo {
+ facet: ScopeSupportFacet;
+}
+
+function prettifyScopeType(scopeType: string): string {
+ return capitalize(camelCaseToAllDown(scopeType));
+}
+
+function prettifyFacet(facet: ScopeSupportFacet): string {
+ const parts = facet.split(".").map(camelCaseToAllDown);
+ if (parts.length === 1) {
+ return capitalize(parts[0]);
+ }
+ const isIteration = parts[parts.length - 1] === "iteration";
+ if (isIteration) {
+ parts.pop();
+ }
+ const name = capitalize(parts.slice(1).join(" "));
+ return isIteration ? `${name} (iteration)` : name;
+}
+
+function serializeScopeType(
+ scopeType: SimpleScopeTypeType | ScopeType,
+): string {
+ if (typeof scopeType === "string") {
+ return scopeType;
+ }
+ return scopeType.type;
+}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx b/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx
index f4fd89dd05..86f2175a9d 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# C++
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx b/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx
index 2352ae98c8..64cbda64f4 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# C#
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/css.mdx b/packages/cursorless-org-docs/src/docs/user/languages/css.mdx
index c68e63f9cd..cb6de3f8a9 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/css.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/css.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# CSS
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx b/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx
index fe37a25c4f..7b18b06670 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx
@@ -1,5 +1,5 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
-# dart
+# Dart
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/go.mdx b/packages/cursorless-org-docs/src/docs/user/languages/go.mdx
index f4da2f5dec..3c0b9c041e 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/go.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/go.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Go
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/html.mdx b/packages/cursorless-org-docs/src/docs/user/languages/html.mdx
index 603c34f00d..34304c31e1 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/html.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/html.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# HTML
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/java.mdx b/packages/cursorless-org-docs/src/docs/user/languages/java.mdx
index bc895469cb..77d64f7276 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/java.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/java.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Java
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx b/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx
index 66b80498ab..4a86aa892d 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Javascript
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx b/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx
index 6f9b4b8779..72272270cc 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Javascript react
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/json.mdx b/packages/cursorless-org-docs/src/docs/user/languages/json.mdx
index 732709bfe9..076ad1aebb 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/json.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/json.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# JSON
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx b/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx
index a83af5d7bd..d9d32c3ac5 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# JSON with comments (JSONC)
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx b/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx
index 03614b7850..5e5cb9851a 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# JSON lines (JSONL)
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx b/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx
index c56cfbccfa..2122e8b23b 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Latex
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx b/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx
index f0722123cf..f76d593649 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Lua
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx b/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx
index 4b53715921..e6a256e223 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Markdown
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/php.mdx b/packages/cursorless-org-docs/src/docs/user/languages/php.mdx
index f46cb45e51..9551cb922e 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/php.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/php.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# PHP
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/python.mdx b/packages/cursorless-org-docs/src/docs/user/languages/python.mdx
index f84d93f9b2..250536d69d 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/python.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/python.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Python
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx b/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx
index 434490a711..9f9215458b 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Ruby
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx b/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx
index f4bd8d55ab..d0b1f73959 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Rust
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx b/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx
index 921ad69194..ffba794182 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Scala
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx b/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx
index 2c6e3d7a44..cca1d1e187 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Tree sitter query language (scm)
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx b/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx
index 44891422a4..e86ec7e2a3 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# SCSS
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx b/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx
index 9072d500ed..47c6cc1c98 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Talon
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx b/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx
index 855dfa95f1..c8588b5f63 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Typescript
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx b/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx
index e8af5501f9..fe16d1c820 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Typescript react
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx b/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx
index a6176bec74..b61d67a423 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# XML
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx b/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx
index b44892f5ac..9ba23a4a87 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
# Yaml
diff --git a/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts b/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts
index e20fbe3649..57c3b6e82c 100644
--- a/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts
+++ b/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts
@@ -14,7 +14,7 @@ export function updateLanguageMdxConfig(
}
const expected = `
-import Language from "./Language";
+import { Language } from "./components/Language";
# ${languageId}
diff --git a/packages/test-case-recorder/src/TestCaseRecorder.ts b/packages/test-case-recorder/src/TestCaseRecorder.ts
index d70ace7e79..fb6dd24c6b 100644
--- a/packages/test-case-recorder/src/TestCaseRecorder.ts
+++ b/packages/test-case-recorder/src/TestCaseRecorder.ts
@@ -12,6 +12,7 @@ import type {
TextEditorOptions,
} from "@cursorless/common";
import {
+ capitalize,
DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST,
extractTargetedMarks,
getKey,
@@ -507,10 +508,6 @@ function camelize(str: string) {
.join("");
}
-function capitalize(str: string) {
- return str.charAt(0).toUpperCase() + str.slice(1);
-}
-
async function readJsonIfExists(
path: string,
): Promise {