ydb-embedded-ui 12.16.1 → 12.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/SyntaxHighlighter/YDBSyntaxHighlighter.js +37 -24
- package/dist/components/SyntaxHighlighter/YDBSyntaxHighlighter.js.map +1 -1
- package/dist/components/SyntaxHighlighter/YDBSyntaxHighlighter.scss +22 -0
- package/dist/components/SyntaxHighlighter/shikiHighlighter.d.ts +6 -0
- package/dist/components/SyntaxHighlighter/shikiHighlighter.js +98 -0
- package/dist/components/SyntaxHighlighter/shikiHighlighter.js.map +1 -0
- package/dist/components/SyntaxHighlighter/themes.d.ts +13 -5049
- package/dist/components/SyntaxHighlighter/themes.js +166 -122
- package/dist/components/SyntaxHighlighter/themes.js.map +1 -1
- package/dist/components/SyntaxHighlighter/types.d.ts +3 -1
- package/dist/components/TruncatedQuery/TruncatedQuery.js +1 -1
- package/dist/components/TruncatedQuery/TruncatedQuery.js.map +1 -1
- package/dist/components/TruncatedQuery/TruncatedQuery.scss +3 -0
- package/dist/containers/Tenants/Tenants.scss +1 -1
- package/package.json +2 -3
- package/dist/components/SyntaxHighlighter/yql.d.ts +0 -5
- package/dist/components/SyntaxHighlighter/yql.js +0 -77
- package/dist/components/SyntaxHighlighter/yql.js.map +0 -1
|
@@ -1,31 +1,38 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import {
|
|
4
|
-
import { PrismLight as ReactSyntaxHighlighter } from 'react-syntax-highlighter';
|
|
3
|
+
import { useThemeType } from '@gravity-ui/uikit';
|
|
5
4
|
import { ClipboardButton } from '../ClipboardButton/ClipboardButton';
|
|
6
5
|
import { b } from './shared';
|
|
7
|
-
import {
|
|
8
|
-
import { yql } from './yql';
|
|
6
|
+
import { highlightCode } from './shikiHighlighter';
|
|
9
7
|
import './YDBSyntaxHighlighter.scss';
|
|
10
|
-
async function registerLanguage(lang) {
|
|
11
|
-
if (lang === 'yql') {
|
|
12
|
-
ReactSyntaxHighlighter.registerLanguage('yql', yql);
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
const { default: syntax } = await import(`react-syntax-highlighter/dist/esm/languages/prism/${lang}`);
|
|
16
|
-
ReactSyntaxHighlighter.registerLanguage(lang, syntax);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
8
|
export function YDBSyntaxHighlighter({ text, language, className, transparentBackground = true, withClipboardButton, }) {
|
|
20
|
-
const [
|
|
21
|
-
const
|
|
9
|
+
const [highlightedHtml, setHighlightedHtml] = React.useState('');
|
|
10
|
+
const [isLoading, setIsLoading] = React.useState(true);
|
|
11
|
+
const themeType = useThemeType();
|
|
22
12
|
React.useEffect(() => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
13
|
+
let cancelled = false;
|
|
14
|
+
async function highlight() {
|
|
15
|
+
setIsLoading(true);
|
|
16
|
+
try {
|
|
17
|
+
const html = await highlightCode(text, language, themeType);
|
|
18
|
+
if (!cancelled) {
|
|
19
|
+
setHighlightedHtml(html);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
console.error('Failed to highlight code:', error);
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
if (!cancelled) {
|
|
27
|
+
setIsLoading(false);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
26
30
|
}
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
highlight();
|
|
32
|
+
return () => {
|
|
33
|
+
cancelled = true;
|
|
34
|
+
};
|
|
35
|
+
}, [text, language, themeType]);
|
|
29
36
|
const renderCopyButton = () => {
|
|
30
37
|
if (!withClipboardButton) {
|
|
31
38
|
return null;
|
|
@@ -37,13 +44,19 @@ export function YDBSyntaxHighlighter({ text, language, className, transparentBac
|
|
|
37
44
|
};
|
|
38
45
|
let paddingStyles = {};
|
|
39
46
|
if (withClipboardButton === null || withClipboardButton === void 0 ? void 0 : withClipboardButton.alwaysVisible) {
|
|
40
|
-
if (withClipboardButton.withLabel) {
|
|
41
|
-
paddingStyles = { paddingRight:
|
|
47
|
+
if (withClipboardButton.withLabel === false) {
|
|
48
|
+
paddingStyles = { paddingRight: 40 };
|
|
42
49
|
}
|
|
43
50
|
else {
|
|
44
|
-
paddingStyles = { paddingRight:
|
|
51
|
+
paddingStyles = { paddingRight: 80 };
|
|
45
52
|
}
|
|
46
53
|
}
|
|
47
|
-
|
|
54
|
+
const containerStyle = {
|
|
55
|
+
...paddingStyles,
|
|
56
|
+
};
|
|
57
|
+
if (transparentBackground) {
|
|
58
|
+
containerStyle.background = 'transparent';
|
|
59
|
+
}
|
|
60
|
+
return (_jsxs("div", { className: b(null, className), children: [renderCopyButton(), isLoading || !highlightedHtml ? (_jsx("div", { style: containerStyle, className: b('content', { transparent: transparentBackground }), children: _jsx("pre", { children: _jsx("code", { children: text }) }) })) : (_jsx("div", { className: b('content', { transparent: transparentBackground }), style: containerStyle, dangerouslySetInnerHTML: { __html: highlightedHtml } }))] }));
|
|
48
61
|
}
|
|
49
62
|
//# sourceMappingURL=YDBSyntaxHighlighter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YDBSyntaxHighlighter.js","sourceRoot":"","sources":["../../../src/components/SyntaxHighlighter/YDBSyntaxHighlighter.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"YDBSyntaxHighlighter.js","sourceRoot":"","sources":["../../../src/components/SyntaxHighlighter/YDBSyntaxHighlighter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,28 @@
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
&__content {
|
|
30
|
+
overflow: auto;
|
|
31
|
+
|
|
32
|
+
height: 100%;
|
|
33
|
+
|
|
34
|
+
background-color: var(--g-color-base-misc-light);
|
|
35
|
+
scrollbar-color: var(--g-color-scroll-handle) transparent;
|
|
36
|
+
|
|
37
|
+
pre {
|
|
38
|
+
margin: 0;
|
|
39
|
+
padding: var(--g-spacing-4) 0 var(--g-spacing-4) var(--g-spacing-4);
|
|
40
|
+
|
|
41
|
+
background: transparent !important;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
code {
|
|
45
|
+
white-space: pre-wrap;
|
|
46
|
+
word-break: break-word;
|
|
47
|
+
@include mixins.text-code-2();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
29
51
|
.data-table__row:hover &__copy,
|
|
30
52
|
.ydb-paginated-table__row:hover &__copy {
|
|
31
53
|
opacity: 1;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Language } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Highlight code with Shiki
|
|
4
|
+
* Uses a single highlighter instance with on-demand loading of languages and themes
|
|
5
|
+
*/
|
|
6
|
+
export declare function highlightCode(code: string, lang: Language, theme: 'light' | 'dark'): Promise<string>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { yqlDarkTheme, yqlLightTheme } from './themes';
|
|
2
|
+
import yqlGrammar from 'monaco-yql-languages/build/yql/YQL.tmLanguage.json';
|
|
3
|
+
// Custom themes for YQL
|
|
4
|
+
const YQL_LIGHT_THEME = 'yql-light';
|
|
5
|
+
const YQL_DARK_THEME = 'yql-dark';
|
|
6
|
+
// Standard themes for other languages
|
|
7
|
+
const STANDARD_LIGHT_THEME = 'github-light';
|
|
8
|
+
const STANDARD_DARK_THEME = 'github-dark';
|
|
9
|
+
// Cache the highlighter promise to prevent multiple instances
|
|
10
|
+
let highlighterPromise = null;
|
|
11
|
+
// Track what's already loaded
|
|
12
|
+
const loadedLanguages = new Set();
|
|
13
|
+
const loadedThemes = new Set();
|
|
14
|
+
/**
|
|
15
|
+
* Get or create the single highlighter instance
|
|
16
|
+
* Lazy loads the shiki library on first use
|
|
17
|
+
*/
|
|
18
|
+
async function getHighlighter() {
|
|
19
|
+
if (!highlighterPromise) {
|
|
20
|
+
// Dynamically import shiki library only when needed
|
|
21
|
+
highlighterPromise = (async () => {
|
|
22
|
+
const { createHighlighter } = await import('shiki');
|
|
23
|
+
return createHighlighter({
|
|
24
|
+
themes: [],
|
|
25
|
+
langs: [],
|
|
26
|
+
});
|
|
27
|
+
})();
|
|
28
|
+
}
|
|
29
|
+
return highlighterPromise;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Ensure language is loaded into the highlighter
|
|
33
|
+
*/
|
|
34
|
+
async function ensureLanguageLoaded(lang) {
|
|
35
|
+
if (loadedLanguages.has(lang)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const hl = await getHighlighter();
|
|
39
|
+
try {
|
|
40
|
+
if (lang === 'yql') {
|
|
41
|
+
await hl.loadLanguage(yqlGrammar);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
await hl.loadLanguage(lang);
|
|
45
|
+
}
|
|
46
|
+
loadedLanguages.add(lang);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error(`Failed to load language: ${lang}`, error);
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Ensure theme is loaded into the highlighter
|
|
55
|
+
*/
|
|
56
|
+
async function ensureThemeLoaded(themeName) {
|
|
57
|
+
if (loadedThemes.has(themeName)) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const hl = await getHighlighter();
|
|
61
|
+
try {
|
|
62
|
+
if (themeName === YQL_LIGHT_THEME) {
|
|
63
|
+
await hl.loadTheme(yqlLightTheme);
|
|
64
|
+
}
|
|
65
|
+
else if (themeName === YQL_DARK_THEME) {
|
|
66
|
+
await hl.loadTheme(yqlDarkTheme);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
await hl.loadTheme(themeName);
|
|
70
|
+
}
|
|
71
|
+
loadedThemes.add(themeName);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error(`Failed to load theme: ${themeName}`, error);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Highlight code with Shiki
|
|
80
|
+
* Uses a single highlighter instance with on-demand loading of languages and themes
|
|
81
|
+
*/
|
|
82
|
+
export async function highlightCode(code, lang, theme) {
|
|
83
|
+
// Determine theme name
|
|
84
|
+
const isYql = lang === 'yql';
|
|
85
|
+
const isDark = theme === 'dark';
|
|
86
|
+
let themeName = isDark ? STANDARD_DARK_THEME : STANDARD_LIGHT_THEME;
|
|
87
|
+
if (isYql) {
|
|
88
|
+
themeName = isDark ? YQL_DARK_THEME : YQL_LIGHT_THEME;
|
|
89
|
+
}
|
|
90
|
+
// Load language and theme if needed
|
|
91
|
+
await Promise.all([ensureLanguageLoaded(lang), ensureThemeLoaded(themeName)]);
|
|
92
|
+
const hl = await getHighlighter();
|
|
93
|
+
return hl.codeToHtml(code, {
|
|
94
|
+
lang,
|
|
95
|
+
theme: themeName,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=shikiHighlighter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shikiHighlighter.js","sourceRoot":"","sources":["../../../src/components/SyntaxHighlighter/shikiHighlighter.ts"],"names":[],"mappings":"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"}
|