ydb-embedded-ui 12.16.1 → 12.17.1

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.
@@ -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 { nanoid } from '@reduxjs/toolkit';
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 { useSyntaxHighlighterStyle } from './themes';
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 [highlighterKey, setHighlighterKey] = React.useState('');
21
- const style = useSyntaxHighlighterStyle(transparentBackground);
9
+ const [highlightedHtml, setHighlightedHtml] = React.useState('');
10
+ const [isLoading, setIsLoading] = React.useState(true);
11
+ const themeType = useThemeType();
22
12
  React.useEffect(() => {
23
- async function registerLangAndUpdateKey() {
24
- await registerLanguage(language);
25
- setHighlighterKey(nanoid());
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
- registerLangAndUpdateKey();
28
- }, [language]);
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: 80 };
47
+ if (withClipboardButton.withLabel === false) {
48
+ paddingStyles = { paddingRight: 40 };
42
49
  }
43
50
  else {
44
- paddingStyles = { paddingRight: 40 };
51
+ paddingStyles = { paddingRight: 80 };
45
52
  }
46
53
  }
47
- return (_jsxs("div", { className: b(null, className), children: [renderCopyButton(), _jsx(ReactSyntaxHighlighter, { language: language, style: style, customStyle: { height: '100%', ...paddingStyles }, children: text }, highlighterKey)] }));
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":"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"}
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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"}