| 138 | } |
| 139 | |
| 140 | export const CodeEditor = ({ |
| 141 | className, |
| 142 | wrapperClassName, |
| 143 | language = "yaml", |
| 144 | lineNumbers = true, |
| 145 | ...props |
| 146 | }: Props) => { |
| 147 | const { resolvedTheme } = useTheme(); |
| 148 | return ( |
| 149 | <div className={cn("overflow-auto", wrapperClassName)}> |
| 150 | <CodeMirror |
| 151 | basicSetup={{ |
| 152 | lineNumbers, |
| 153 | foldGutter: true, |
| 154 | highlightSelectionMatches: true, |
| 155 | highlightActiveLine: !props.disabled, |
| 156 | allowMultipleSelections: true, |
| 157 | }} |
| 158 | theme={resolvedTheme === "dark" ? githubDark : githubLight} |
| 159 | extensions={[ |
| 160 | search(), |
| 161 | keymap.of(searchKeymap), |
| 162 | language === "yaml" |
| 163 | ? yaml() |
| 164 | : language === "json" |
| 165 | ? json() |
| 166 | : language === "css" |
| 167 | ? css() |
| 168 | : language === "shell" |
| 169 | ? StreamLanguage.define(shell) |
| 170 | : StreamLanguage.define({ |
| 171 | ...properties, |
| 172 | // The legacy properties mode lacks comment metadata, so |
| 173 | // CodeMirror's toggle-comment shortcut (Mod-/) has no comment |
| 174 | // token to use. Declare `#` as the line comment for env editors. |
| 175 | languageData: { commentTokens: { line: "#" } }, |
| 176 | }), |
| 177 | props.lineWrapping ? EditorView.lineWrapping : [], |
| 178 | language === "yaml" |
| 179 | ? autocompletion({ |
| 180 | override: [dockerComposeComplete], |
| 181 | }) |
| 182 | : [], |
| 183 | ]} |
| 184 | {...props} |
| 185 | editable={!props.disabled} |
| 186 | className={cn( |
| 187 | "w-full h-full text-sm leading-relaxed relative", |
| 188 | `cm-theme-${resolvedTheme}`, |
| 189 | className, |
| 190 | )} |
| 191 | > |
| 192 | {props.disabled && ( |
| 193 | <div className="absolute top-0 rounded-md left-0 w-full h-full flex items-center justify-center z-[10] [background:var(--overlay)] h-full" /> |
| 194 | )} |
| 195 | </CodeMirror> |
| 196 | </div> |
| 197 | ); |