@snack-uikit/markdown 0.4.10 → 0.4.11-preview-580e8472.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/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "Markdown",
7
- "version": "0.4.10",
7
+ "version": "0.4.11-preview-580e8472.0",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -35,7 +35,7 @@
35
35
  "license": "Apache-2.0",
36
36
  "scripts": {},
37
37
  "dependencies": {
38
- "@snack-uikit/code-editor": "0.6.4",
38
+ "@snack-uikit/code-editor": "0.6.5-preview-580e8472.0",
39
39
  "@snack-uikit/divider": "3.2.6",
40
40
  "@snack-uikit/fields": "0.44.0",
41
41
  "@snack-uikit/link": "0.17.1",
@@ -46,5 +46,5 @@
46
46
  "react-markdown": "7.1.1",
47
47
  "remark-gfm": "3.0.1"
48
48
  },
49
- "gitHead": "98d8215a4c461746557441b6a31b109ebe43ce5c"
49
+ "gitHead": "83474111057d185ee911d5bb4489288c89f1490f"
50
50
  }
@@ -1,6 +1,7 @@
1
- import ReactMarkdown from 'react-markdown';
1
+ import ReactMarkdown, { Components } from 'react-markdown';
2
2
  import remarkGfm from 'remark-gfm';
3
3
 
4
+ import { CodeEditorProps } from '@snack-uikit/code-editor';
4
5
  import { extractSupportProps, WithSupportProps } from '@snack-uikit/utils';
5
6
 
6
7
  import { Blockquote, Code, Divider, Link, Table } from '../../helperComponents';
@@ -11,9 +12,13 @@ export type MarkdownProps = WithSupportProps<{
11
12
  value?: string;
12
13
  /** CSS-класс */
13
14
  className?: string;
15
+ /** Переопределение компонентов по умолчанию и добавление новых в CodeEditor*/
16
+ components?: Components;
17
+ /** Действие при клике на кнопку копирования кода*/
18
+ onCopyClick?: CodeEditorProps['onCopyClick'];
14
19
  }>;
15
20
 
16
- export function Markdown({ value, className, ...rest }: MarkdownProps) {
21
+ export function Markdown({ value, className, onCopyClick, components = {}, ...rest }: MarkdownProps) {
17
22
  return (
18
23
  <div className={className} {...extractSupportProps(rest)}>
19
24
  {value && (
@@ -22,11 +27,12 @@ export function Markdown({ value, className, ...rest }: MarkdownProps) {
22
27
  remarkPlugins={[remarkGfm]}
23
28
  skipHtml
24
29
  components={{
25
- code: Code,
30
+ code: props => <Code {...props} onClick={onCopyClick} />,
26
31
  table: Table,
27
32
  hr: Divider,
28
33
  blockquote: Blockquote,
29
34
  a: Link,
35
+ ...components,
30
36
  }}
31
37
  >
32
38
  {value}
@@ -1,6 +1,8 @@
1
1
  import cn from 'classnames';
2
2
  import { useEffect, useState } from 'react';
3
+ import { Components } from 'react-markdown';
3
4
 
5
+ import { CodeEditorProps } from '@snack-uikit/code-editor';
4
6
  import { FieldDecorator, FieldTextArea, VALIDATION_STATE } from '@snack-uikit/fields';
5
7
  import { Switch } from '@snack-uikit/toggles';
6
8
  import { Typography } from '@snack-uikit/typography';
@@ -30,6 +32,10 @@ export type MarkdownEditorProps = WithSupportProps<{
30
32
  required?: boolean;
31
33
  /** Может ли ли пользователь изменять размеры поля (если св-во не включено, поле автоматически меняет свой размер) */
32
34
  resizable?: boolean;
35
+ /** Действие при клике на кнопку копирования кода*/
36
+ onCodeCopyClick?: CodeEditorProps['onCopyClick'];
37
+ /** Переопределение компонентов по умолчанию и добавление новых в CodeEditor*/
38
+ components?: Components;
33
39
  }>;
34
40
 
35
41
  export function MarkdownEditor({
@@ -42,30 +48,34 @@ export function MarkdownEditor({
42
48
  placeholder,
43
49
  required,
44
50
  resizable,
51
+ onCodeCopyClick,
52
+ components,
45
53
  ...rest
46
54
  }: MarkdownEditorProps) {
47
- const [viewMode, setViewMode] = useState<boolean>(false);
55
+ const [isViewMode, setIsViewMode] = useState<boolean>(false);
48
56
 
49
57
  useEffect(() => {
50
- setViewMode(defaultMode === MODE.View);
58
+ setIsViewMode(defaultMode === MODE.View);
51
59
  }, [defaultMode]);
52
60
 
53
61
  return (
54
62
  <div className={cn(styles.editor, className)} {...extractSupportProps(rest)}>
55
63
  <div className={styles.control}>
56
64
  <div className={styles.switchWrapper}>
57
- <Switch checked={viewMode} onChange={setViewMode} />
65
+ <Switch checked={isViewMode} onChange={setIsViewMode} />
58
66
  <Typography.SansBodyM>Предпросмотр</Typography.SansBodyM>
59
67
  </div>
60
68
 
61
69
  <Typography.SansBodyS className={styles.tip}>Поддерживается Markdown</Typography.SansBodyS>
62
70
  </div>
63
71
 
64
- {viewMode ? (
72
+ {isViewMode ? (
65
73
  <FieldDecorator label={label} required={required} error={error} size='m'>
66
74
  <Markdown
67
75
  value={value}
76
+ onCopyClick={onCodeCopyClick}
68
77
  className={styles.viewWrapper}
78
+ components={components}
69
79
  data-validation={error ? VALIDATION_STATE.Error : VALIDATION_STATE.Default}
70
80
  />
71
81
  </FieldDecorator>
@@ -1,28 +1,37 @@
1
1
  import { ReactNode } from 'react';
2
2
 
3
- import { CodeEditor } from '@snack-uikit/code-editor';
3
+ import { CodeEditor, CodeEditorProps } from '@snack-uikit/code-editor';
4
4
 
5
5
  import styles from './styles.module.scss';
6
6
 
7
- type CodeProps = { inline?: boolean; className?: string; children: ReactNode & ReactNode[] };
7
+ type CodeProps = {
8
+ inline?: boolean;
9
+ className?: string;
10
+ children: ReactNode & ReactNode[];
11
+ onClick?: CodeEditorProps['onCopyClick'];
12
+ };
8
13
 
9
- export function Code({ inline, className, children }: CodeProps) {
14
+ export function Code({ inline, className, children, onClick }: CodeProps) {
10
15
  const language = /language-(\w+)/.exec(className || '')?.[1];
16
+ const value = String(children).replace(/\n$/, '');
11
17
 
12
18
  if (!inline) {
13
19
  return (
14
- <CodeEditor
15
- className={styles.wrapper}
16
- height={200}
17
- language={language}
18
- value={String(children).replace(/\n$/, '')}
19
- options={{
20
- readOnly: true,
21
- minimap: {
22
- enabled: false,
23
- },
24
- }}
25
- />
20
+ <div className={styles.wrapper}>
21
+ <CodeEditor
22
+ onCopyClick={onClick}
23
+ height={200}
24
+ className={styles.editor}
25
+ language={language}
26
+ value={value}
27
+ options={{
28
+ readOnly: true,
29
+ minimap: {
30
+ enabled: false,
31
+ },
32
+ }}
33
+ />
34
+ </div>
26
35
  );
27
36
  }
28
37
 
@@ -3,8 +3,7 @@
3
3
  .wrapper {
4
4
  @include styles-tokens-markdown.composite-var(styles-tokens-markdown.$markdown-syntax-code-editor);
5
5
 
6
- display: flex;
7
- max-height: 200px;
6
+ max-height: 230px;
8
7
  }
9
8
 
10
9
  .code {