-
-
-
-
- setTitle(e.target.value)}
- required
- minLength={3}
- maxLength={100}
- placeholder="My awesome theme"
+ height="min(44vh, 440px)"
+ maxLength={type === "customCss" ? 16_384 : undefined}
+ description={
+ type === "customWidget"
+ ? "Paste exported widget JSON. The title and description are filled from its metadata."
+ : "Paste the stylesheet that users will import into their board settings."
+ }
/>
-
-
-
-
);
@@ -544,22 +550,21 @@ const StepMedia = ({
{previews.length > 0 && (
-
- {previews.map((src, i) => (
-
-

-
-
- ))}
+
+
+ {previews.map((src, i) => (
+
+

+
+
+ ))}
+
)}
diff --git a/packages/custom-widgets/package.json b/packages/custom-widgets/package.json
index 86133e38d..5f3eeb3cd 100644
--- a/packages/custom-widgets/package.json
+++ b/packages/custom-widgets/package.json
@@ -39,6 +39,7 @@
"dependencies": {
"@codemirror/autocomplete": "catalog:",
"@codemirror/commands": "catalog:",
+ "@codemirror/lang-css": "catalog:",
"@codemirror/lang-javascript": "catalog:",
"@codemirror/lang-json": "catalog:",
"@codemirror/lint": "catalog:",
diff --git a/packages/custom-widgets/src/workbench/code-editor-toolbar.tsx b/packages/custom-widgets/src/workbench/code-editor-toolbar.tsx
index 8019ac0f4..833b4b047 100644
--- a/packages/custom-widgets/src/workbench/code-editor-toolbar.tsx
+++ b/packages/custom-widgets/src/workbench/code-editor-toolbar.tsx
@@ -46,7 +46,11 @@ export function CodeEditorToolbar({
- {props.language === "jsx" ? props.messages.languageJsx : props.messages.languageJson}
+ {props.language === "jsx"
+ ? props.messages.languageJsx
+ : props.language === "css"
+ ? "CSS"
+ : props.messages.languageJson}
@@ -102,7 +106,7 @@ export function CodeEditorToolbar({
variant="subtle"
leftSection={}
onClick={onFormat}
- disabled={props.language === "json" && formattedValue === props.value}
+ disabled={props.language !== "jsx" && formattedValue === props.value}
>
{props.messages.format}
diff --git a/packages/custom-widgets/src/workbench/code-editor-types.ts b/packages/custom-widgets/src/workbench/code-editor-types.ts
index c795204f9..6bde1815b 100644
--- a/packages/custom-widgets/src/workbench/code-editor-types.ts
+++ b/packages/custom-widgets/src/workbench/code-editor-types.ts
@@ -43,7 +43,7 @@ export interface CustomWidgetCodeEditorProps {
messages: CustomWidgetEditorMessages;
description?: string;
placeholder?: string;
- language: "jsx" | "json";
+ language: "jsx" | "json" | "css";
diagnostics?: EditorDiagnostic[];
error?: ReactNode;
required?: boolean;
diff --git a/packages/custom-widgets/src/workbench/code-editor.tsx b/packages/custom-widgets/src/workbench/code-editor.tsx
index 2184be9ef..3030e9e0a 100644
--- a/packages/custom-widgets/src/workbench/code-editor.tsx
+++ b/packages/custom-widgets/src/workbench/code-editor.tsx
@@ -256,7 +256,7 @@ function EditorLoader() {
);
}
-function formatCode(value: string, language: "jsx" | "json") {
+function formatCode(value: string, language: "jsx" | "json" | "css") {
if (language === "json") {
try {
return `${JSON.stringify(JSON.parse(value) as unknown, null, 2)}\n`;
diff --git a/packages/custom-widgets/src/workbench/direct-code-mirror.tsx b/packages/custom-widgets/src/workbench/direct-code-mirror.tsx
index 657f9367c..c324fcdb9 100644
--- a/packages/custom-widgets/src/workbench/direct-code-mirror.tsx
+++ b/packages/custom-widgets/src/workbench/direct-code-mirror.tsx
@@ -2,6 +2,7 @@
import { autocompletion } from "@codemirror/autocomplete";
import { indentWithTab } from "@codemirror/commands";
+import { css } from "@codemirror/lang-css";
import { javascript } from "@codemirror/lang-javascript";
import { json } from "@codemirror/lang-json";
import { linter } from "@codemirror/lint";
@@ -18,7 +19,7 @@ import type { EditorDiagnostic } from "./analyzer";
interface DirectCodeMirrorProps {
value: string;
- language: "jsx" | "json";
+ language: "jsx" | "json" | "css";
diagnostics: EditorDiagnostic[];
completions: Completion[];
id: string;
@@ -103,7 +104,9 @@ function createExtensions(instanceId: string, props: DirectCodeMirrorProps) {
autocompletion({ override: [createCustomJsxCompletionSource(props.completions)] }),
customJsxComponentHover,
]
- : [json()];
+ : props.language === "css"
+ ? [css()]
+ : [json()];
return [
basicSetup,
...language,
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 82a21661d..51522ff57 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18,6 +18,9 @@ catalogs:
'@codemirror/commands':
specifier: ^6.10.3
version: 6.10.3
+ '@codemirror/lang-css':
+ specifier: ^6.3.1
+ version: 6.3.1
'@codemirror/lang-javascript':
specifier: ^6.2.5
version: 6.2.5
@@ -1731,6 +1734,9 @@ importers:
'@codemirror/commands':
specifier: 'catalog:'
version: 6.10.3
+ '@codemirror/lang-css':
+ specifier: 'catalog:'
+ version: 6.3.1
'@codemirror/lang-javascript':
specifier: 'catalog:'
version: 6.2.5
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 1a2106464..aa96fe08a 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -5,6 +5,7 @@ packages:
catalog:
"@codemirror/autocomplete": ^6.20.3
"@codemirror/commands": ^6.10.3
+ "@codemirror/lang-css": ^6.3.1
"@codemirror/lang-javascript": ^6.2.5
"@codemirror/lang-json": ^6.0.2
"@codemirror/lint": ^6.9.6