From 93d8e592ccc83c9fd36e9a271bbfb084ca9d86ab Mon Sep 17 00:00:00 2001 From: ngc2207 Date: Tue, 7 Jan 2025 22:18:24 +0800 Subject: [PATCH] feat: add support for C, C++, and Java languages with corresponding configurations and UI components --- code-editor/bun.lockb | Bin 118263 -> 159263 bytes code-editor/package.json | 7 + code-editor/src/App.tsx | 77 ++++++- code-editor/src/components/ui/scroll-area.tsx | 46 ++++ code-editor/src/components/ui/select.tsx | 157 ++++++++++++++ code-editor/src/components/ui/tabs.tsx | 53 +++++ code-editor/src/config/index.ts | 43 ++++ code-editor/src/constants/languages.ts | 24 +++ code-editor/src/constants/themes.ts | 202 ++++++++++++++++++ code-editor/src/lib/shiki.ts | 16 ++ 10 files changed, 624 insertions(+), 1 deletion(-) create mode 100644 code-editor/src/components/ui/scroll-area.tsx create mode 100644 code-editor/src/components/ui/select.tsx create mode 100644 code-editor/src/components/ui/tabs.tsx create mode 100644 code-editor/src/config/index.ts create mode 100644 code-editor/src/constants/languages.ts create mode 100644 code-editor/src/constants/themes.ts create mode 100644 code-editor/src/lib/shiki.ts diff --git a/code-editor/bun.lockb b/code-editor/bun.lockb index a2f63c713ffa2cc63ba9e46a4a8b80ee51654de7..8e46a5111942dbcd5b46bdc7da79cfff7c9d775c 100755 GIT binary patch delta 47599 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 delta 20065 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 + + + + + + + + + + + + { + shikiToMonaco(highlighter, monaco); + }} + /> + + + { + shikiToMonaco(highlighter, monaco); + }} + /> + + + + ); } export default App; diff --git a/code-editor/src/components/ui/scroll-area.tsx b/code-editor/src/components/ui/scroll-area.tsx new file mode 100644 index 0000000..cf253cf --- /dev/null +++ b/code-editor/src/components/ui/scroll-area.tsx @@ -0,0 +1,46 @@ +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/code-editor/src/components/ui/select.tsx b/code-editor/src/components/ui/select.tsx new file mode 100644 index 0000000..a84242c --- /dev/null +++ b/code-editor/src/components/ui/select.tsx @@ -0,0 +1,157 @@ +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className + )} + {...props} + > + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} diff --git a/code-editor/src/components/ui/tabs.tsx b/code-editor/src/components/ui/tabs.tsx new file mode 100644 index 0000000..85d83be --- /dev/null +++ b/code-editor/src/components/ui/tabs.tsx @@ -0,0 +1,53 @@ +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/code-editor/src/config/index.ts b/code-editor/src/config/index.ts new file mode 100644 index 0000000..65077d7 --- /dev/null +++ b/code-editor/src/config/index.ts @@ -0,0 +1,43 @@ +import { SupportedEditorLanguage } from "@/constants/languages"; + +export const DEFAULT_EDITOR_THEME = "vitesse-dark"; + +export const DEFAULT_EDITOR_LANGUAGE: SupportedEditorLanguage = "c"; + +export const DEFAULT_FILES: Record< + SupportedEditorLanguage, + { + path: string; + language: SupportedEditorLanguage; + value: string; + } +> = { + c: { + path: "playground/main.c", + language: "c", + value: `#include +int main() { + printf("Hello, World!"); + return 0; +}`, + }, + cpp: { + path: "playground/main.cpp", + language: "cpp", + value: `#include +using namespace std; +int main() { + cout << "Hello, World!"; + return 0; +}`, + }, + java: { + path: "playground/Main.java", + language: "java", + value: `public class Main { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +}`, + }, +}; diff --git a/code-editor/src/constants/languages.ts b/code-editor/src/constants/languages.ts new file mode 100644 index 0000000..2ddf2cc --- /dev/null +++ b/code-editor/src/constants/languages.ts @@ -0,0 +1,24 @@ +import { COriginal, CplusplusOriginal, JavaOriginal } from "devicons-react"; + +export const SUPPORTED_EDITOR_LANGUAGES = ["c", "cpp", "java"]; + +export const SUPPORTED_EDITOR_LANGUAGES_CONFIG = { + c: { + id: "c", + label: "C", + icon: COriginal, + }, + cpp: { + id: "cpp", + label: "C++", + icon: CplusplusOriginal, + }, + java: { + id: "java", + label: "Java", + icon: JavaOriginal, + }, +}; + +export type SupportedEditorLanguage = + (typeof SUPPORTED_EDITOR_LANGUAGES)[number]; diff --git a/code-editor/src/constants/themes.ts b/code-editor/src/constants/themes.ts new file mode 100644 index 0000000..3ab0087 --- /dev/null +++ b/code-editor/src/constants/themes.ts @@ -0,0 +1,202 @@ +export const SUPPORTED_EDITOR_THEMES = [ + { + id: "andromeeda", + label: "Andromeeda", + }, + { + id: "aurora-x", + label: "Aurora X", + }, + { + id: "ayu-dark", + label: "Ayu Dark", + }, + { + id: "catppuccin-frappe", + label: "Catppuccin Frappé", + }, + { + id: "catppuccin-latte", + label: "Catppuccin Latte", + }, + { + id: "catppuccin-macchiato", + label: "Catppuccin Macchiato", + }, + { + id: "catppuccin-mocha", + label: "Catppuccin Mocha", + }, + { + id: "dark-plus", + label: "Dark Plus", + }, + { + id: "dracula", + label: "Dracula", + }, + { + id: "dracula-soft", + label: "Dracula Soft", + }, + { + id: "everforest-dark", + label: "Everforest Dark", + }, + { + id: "everforest-light", + label: "Everforest Light", + }, + { + id: "github-dark", + label: "GitHub Dark", + }, + { + id: "github-light", + label: "GitHub Light", + }, + { + id: "github-light-default", + label: "GitHub Light Default", + }, + { + id: "github-light-high-contrast", + label: "GitHub Light High Contrast", + }, + { + id: "houston", + label: "Houston", + }, + { + id: "kanagawa-dragon", + label: "Kanagawa Dragon", + }, + { + id: "kanagawa-lotus", + label: "Kanagawa Lotus", + }, + { + id: "kanagawa-wave", + label: "Kanagawa Wave", + }, + { + id: "laserwave", + label: "Laserwave", + }, + { + id: "light-plus", + label: "Light Plus", + }, + { + id: "material-theme", + label: "Material Theme", + }, + { + id: "material-theme-darker", + label: "Material Theme Darker", + }, + { + id: "material-theme-lighter", + label: "Material Theme Lighter", + }, + { + id: "material-theme-ocean", + label: "Material Theme Ocean", + }, + { + id: "material-theme-palenight", + label: "Material Theme Palenight", + }, + { + id: "min-dark", + label: "Min Dark", + }, + { + id: "min-light", + label: "Min Light", + }, + { + id: "monokai", + label: "Monokai", + }, + { + id: "night-owl", + label: "Night Owl", + }, + { + id: "nord", + label: "Nord", + }, + { + id: "one-dark-pro", + label: "One Dark Pro", + }, + { + id: "one-light", + label: "One Light", + }, + { + id: "plastic", + label: "Plastic", + }, + { + id: "poimandres", + label: "Poimandres", + }, + { + id: "red", + label: "Red", + }, + { + id: "rose-pine", + label: "Rosé Pine", + }, + { + id: "rose-pine-dawn", + label: "Rosé Pine Dawn", + }, + { + id: "rose-pine-moon", + label: "Rosé Pine Moon", + }, + { + id: "slack-dark", + label: "Slack Dark", + }, + { + id: "slack-ochin", + label: "Slack Ochin", + }, + { + id: "snazzy-light", + label: "Snazzy Light", + }, + { + id: "solarized-dark", + label: "Solarized Dark", + }, + { + id: "solarized-light", + label: "Solarized Light", + }, + { + id: "synthwave-84", + label: "Synthwave '84", + }, + { + id: "tokyo-night", + label: "Tokyo Night", + }, + { + id: "vitesse-black", + label: "Vitesse Black", + }, + { + id: "vitesse-dark", + label: "Vitesse Dark", + }, + { + id: "vitesse-light", + label: "Vitesse Light", + }, +]; diff --git a/code-editor/src/lib/shiki.ts b/code-editor/src/lib/shiki.ts new file mode 100644 index 0000000..c57cc31 --- /dev/null +++ b/code-editor/src/lib/shiki.ts @@ -0,0 +1,16 @@ +import { createHighlighter } from "shiki"; +import { SUPPORTED_EDITOR_THEMES } from "@/constants/themes"; +import { SUPPORTED_EDITOR_LANGUAGES_CONFIG } from "@/constants/languages"; + +const SUPPORTED_EDITOR_THEMES_ID = SUPPORTED_EDITOR_THEMES.map( + (theme) => theme.id +); + +const SUPPORTED_EDITOR_LANGUAGES_ID = Object.values( + SUPPORTED_EDITOR_LANGUAGES_CONFIG +).map((language: { id: string }) => language.id); + +export const highlighter = await createHighlighter({ + themes: SUPPORTED_EDITOR_THEMES_ID, + langs: SUPPORTED_EDITOR_LANGUAGES_ID, +});