@squiz/formatted-text-editor 1.21.1-alpha.4 → 1.21.1-alpha.41

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.
Files changed (118) hide show
  1. package/demo/App.tsx +52 -10
  2. package/demo/index.scss +11 -10
  3. package/jest.config.ts +0 -2
  4. package/lib/Editor/Editor.js +45 -7
  5. package/lib/Editor/EditorContext.d.ts +15 -0
  6. package/lib/Editor/EditorContext.js +15 -0
  7. package/lib/EditorToolbar/FloatingToolbar.js +11 -5
  8. package/lib/EditorToolbar/Tools/Image/Form/ImageForm.d.ts +9 -8
  9. package/lib/EditorToolbar/Tools/Image/Form/ImageForm.js +91 -23
  10. package/lib/EditorToolbar/Tools/Image/ImageButton.d.ts +4 -1
  11. package/lib/EditorToolbar/Tools/Image/ImageButton.js +22 -14
  12. package/lib/EditorToolbar/Tools/Image/ImageModal.js +8 -5
  13. package/lib/EditorToolbar/Tools/Link/Form/LinkForm.d.ts +14 -5
  14. package/lib/EditorToolbar/Tools/Link/Form/LinkForm.js +66 -14
  15. package/lib/EditorToolbar/Tools/Link/LinkButton.js +21 -13
  16. package/lib/EditorToolbar/Tools/Link/LinkModal.js +12 -5
  17. package/lib/EditorToolbar/Tools/Link/RemoveLinkButton.js +1 -8
  18. package/lib/Extensions/CommandsExtension/CommandsExtension.d.ts +20 -0
  19. package/lib/Extensions/CommandsExtension/CommandsExtension.js +52 -0
  20. package/lib/Extensions/Extensions.d.ts +12 -5
  21. package/lib/Extensions/Extensions.js +42 -20
  22. package/lib/Extensions/ImageExtension/AssetImageExtension.d.ts +17 -0
  23. package/lib/Extensions/ImageExtension/AssetImageExtension.js +92 -0
  24. package/lib/Extensions/ImageExtension/ImageExtension.d.ts +4 -0
  25. package/lib/Extensions/ImageExtension/ImageExtension.js +11 -0
  26. package/lib/Extensions/LinkExtension/AssetLinkExtension.d.ts +26 -0
  27. package/lib/Extensions/LinkExtension/AssetLinkExtension.js +102 -0
  28. package/lib/Extensions/LinkExtension/LinkExtension.d.ts +19 -12
  29. package/lib/Extensions/LinkExtension/LinkExtension.js +56 -66
  30. package/lib/Extensions/LinkExtension/common.d.ts +7 -0
  31. package/lib/Extensions/LinkExtension/common.js +14 -0
  32. package/lib/Extensions/PreformattedExtension/PreformattedExtension.d.ts +1 -1
  33. package/lib/hooks/index.d.ts +1 -0
  34. package/lib/hooks/index.js +1 -0
  35. package/lib/hooks/useExpandedSelection.d.ts +23 -0
  36. package/lib/hooks/useExpandedSelection.js +37 -0
  37. package/lib/index.css +58 -23
  38. package/lib/index.d.ts +5 -2
  39. package/lib/index.js +9 -3
  40. package/lib/types.d.ts +3 -0
  41. package/lib/types.js +2 -0
  42. package/lib/ui/Button/Button.d.ts +2 -1
  43. package/lib/ui/Button/Button.js +4 -5
  44. package/lib/ui/Fields/Input/Input.d.ts +1 -0
  45. package/lib/ui/Fields/Input/Input.js +9 -3
  46. package/lib/ui/Modal/Modal.js +5 -3
  47. package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.d.ts +9 -0
  48. package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.js +174 -0
  49. package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.d.ts +9 -0
  50. package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.js +138 -0
  51. package/lib/utils/resolveMatrixAssetUrl.d.ts +1 -0
  52. package/lib/utils/resolveMatrixAssetUrl.js +10 -0
  53. package/lib/utils/undefinedIfEmpty.d.ts +1 -0
  54. package/lib/utils/undefinedIfEmpty.js +7 -0
  55. package/package.json +10 -4
  56. package/src/Editor/Editor.spec.tsx +78 -18
  57. package/src/Editor/Editor.tsx +28 -9
  58. package/src/Editor/EditorContext.spec.tsx +26 -0
  59. package/src/Editor/EditorContext.ts +26 -0
  60. package/src/Editor/_editor.scss +20 -4
  61. package/src/EditorToolbar/FloatingToolbar.spec.tsx +26 -7
  62. package/src/EditorToolbar/FloatingToolbar.tsx +15 -6
  63. package/src/EditorToolbar/Tools/Image/Form/ImageForm.spec.tsx +81 -6
  64. package/src/EditorToolbar/Tools/Image/Form/ImageForm.tsx +167 -47
  65. package/src/EditorToolbar/Tools/Image/ImageButton.spec.tsx +216 -1
  66. package/src/EditorToolbar/Tools/Image/ImageButton.tsx +29 -16
  67. package/src/EditorToolbar/Tools/Image/ImageModal.spec.tsx +47 -8
  68. package/src/EditorToolbar/Tools/Image/ImageModal.tsx +11 -10
  69. package/src/EditorToolbar/Tools/Link/Form/LinkForm.spec.tsx +37 -9
  70. package/src/EditorToolbar/Tools/Link/Form/LinkForm.tsx +96 -26
  71. package/src/EditorToolbar/Tools/Link/LinkButton.spec.tsx +116 -26
  72. package/src/EditorToolbar/Tools/Link/LinkButton.tsx +28 -19
  73. package/src/EditorToolbar/Tools/Link/LinkModal.tsx +13 -6
  74. package/src/EditorToolbar/Tools/Link/RemoveLinkButton.spec.tsx +27 -26
  75. package/src/EditorToolbar/Tools/Link/RemoveLinkButton.tsx +2 -10
  76. package/src/EditorToolbar/Tools/Undo/UndoButton.spec.tsx +22 -1
  77. package/src/EditorToolbar/_floating-toolbar.scss +4 -5
  78. package/src/EditorToolbar/_toolbar.scss +1 -1
  79. package/src/Extensions/CommandsExtension/CommandsExtension.ts +54 -0
  80. package/src/Extensions/Extensions.ts +42 -18
  81. package/src/Extensions/ImageExtension/AssetImageExtension.spec.ts +76 -0
  82. package/src/Extensions/ImageExtension/AssetImageExtension.ts +111 -0
  83. package/src/Extensions/ImageExtension/ImageExtension.ts +17 -1
  84. package/src/Extensions/LinkExtension/AssetLinkExtension.spec.ts +104 -0
  85. package/src/Extensions/LinkExtension/AssetLinkExtension.ts +128 -0
  86. package/src/Extensions/LinkExtension/LinkExtension.spec.ts +68 -0
  87. package/src/Extensions/LinkExtension/LinkExtension.ts +71 -85
  88. package/src/Extensions/LinkExtension/common.ts +10 -0
  89. package/src/hooks/index.ts +1 -0
  90. package/src/hooks/useExpandedSelection.ts +44 -0
  91. package/src/index.ts +5 -2
  92. package/src/types.ts +5 -0
  93. package/src/ui/Button/Button.tsx +10 -6
  94. package/src/ui/Button/_button.scss +1 -1
  95. package/src/ui/Fields/Input/Input.spec.tsx +7 -1
  96. package/src/ui/Fields/Input/Input.tsx +23 -4
  97. package/src/ui/Modal/Modal.spec.tsx +15 -0
  98. package/src/ui/Modal/Modal.tsx +8 -4
  99. package/src/ui/ToolbarDropdown/_toolbar-dropdown.scss +1 -1
  100. package/src/ui/_forms.scss +14 -0
  101. package/src/utils/converters/mocks/squizNodeJson.mock.ts +271 -0
  102. package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.spec.ts +480 -0
  103. package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.ts +212 -0
  104. package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.spec.ts +341 -0
  105. package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.ts +159 -0
  106. package/src/utils/resolveMatrixAssetUrl.spec.ts +26 -0
  107. package/src/utils/resolveMatrixAssetUrl.ts +7 -0
  108. package/src/utils/undefinedIfEmpty.spec.ts +12 -0
  109. package/src/utils/undefinedIfEmpty.ts +3 -0
  110. package/tailwind.config.cjs +3 -0
  111. package/tests/renderWithEditor.tsx +28 -15
  112. package/tsconfig.json +1 -1
  113. package/lib/FormattedTextEditor.d.ts +0 -2
  114. package/lib/FormattedTextEditor.js +0 -7
  115. package/src/Editor/Editor.mock.tsx +0 -43
  116. package/src/FormattedTextEditor.spec.tsx +0 -10
  117. package/src/FormattedTextEditor.tsx +0 -3
  118. /package/tests/{select.tsx → select.ts} +0 -0
package/src/types.ts ADDED
@@ -0,0 +1,5 @@
1
+ export type DeepPartial<T> = T extends Record<string, unknown>
2
+ ? {
3
+ [P in keyof T]?: DeepPartial<T[P]>;
4
+ }
5
+ : T;
@@ -8,9 +8,10 @@ type ButtonProps = {
8
8
  label: string;
9
9
  text?: string;
10
10
  icon?: ReactElement;
11
+ className?: string;
11
12
  };
12
13
 
13
- const Button = ({ handleOnClick, isDisabled, isActive, label, text, icon }: ButtonProps) => {
14
+ const Button = ({ handleOnClick, isDisabled, isActive, label, text, icon, className }: ButtonProps) => {
14
15
  return (
15
16
  <button
16
17
  aria-label={label}
@@ -18,12 +19,15 @@ const Button = ({ handleOnClick, isDisabled, isActive, label, text, icon }: Butt
18
19
  type="button"
19
20
  onClick={handleOnClick}
20
21
  disabled={isDisabled}
21
- className={clsx('squiz-fte-btn', isActive && 'squiz-fte-btn--is-active', icon && ' squiz-fte-btn--is-icon')}
22
+ className={clsx(
23
+ 'squiz-fte-btn',
24
+ isActive && 'squiz-fte-btn--is-active',
25
+ icon && ' squiz-fte-btn--is-icon',
26
+ className,
27
+ )}
22
28
  >
23
- <>
24
- {text && <span>{text}</span>}
25
- {icon && icon}
26
- </>
29
+ {text && <span>{text}</span>}
30
+ {icon && icon}
27
31
  </button>
28
32
  );
29
33
  };
@@ -1,5 +1,5 @@
1
1
  .squiz-fte-btn {
2
- @apply font-normal rounded ease-linear transition-all bg-white text-gray-600 duration-150;
2
+ @apply font-bold rounded ease-linear transition-all bg-white text-gray-600 duration-150;
3
3
  display: flex;
4
4
  align-items: center;
5
5
  text-align: center;
@@ -7,7 +7,7 @@ describe('Input', () => {
7
7
  const mockOnChange = jest.fn();
8
8
 
9
9
  const InputComponent = () => {
10
- return <Input name="text-input" defaultValue="Water" label="Text input" onChange={mockOnChange} />;
10
+ return <Input name="text-input" defaultValue="Water" label="Text input" onChange={mockOnChange} required />;
11
11
  };
12
12
 
13
13
  it('Renders the label', () => {
@@ -40,4 +40,10 @@ describe('Input', () => {
40
40
  fireEvent.change(input, { target: { value: 'Wine' } });
41
41
  expect(mockOnChange).toHaveBeenCalled();
42
42
  });
43
+
44
+ it('If the field is declared required, it is marked as such', () => {
45
+ render(<InputComponent />);
46
+ const requiredMarker = screen.getByLabelText('Required field');
47
+ expect(requiredMarker).toBeInTheDocument();
48
+ });
43
49
  });
@@ -1,19 +1,38 @@
1
1
  import React, { ForwardedRef, forwardRef, InputHTMLAttributes } from 'react';
2
+ import clsx from 'clsx';
2
3
 
3
4
  type InputProps = InputHTMLAttributes<HTMLInputElement> & {
4
5
  label?: string;
6
+ error?: string;
5
7
  };
6
8
 
7
- const InputInternal = ({ name, label, type = 'text', ...rest }: InputProps, ref: ForwardedRef<HTMLInputElement>) => {
9
+ const InputInternal = (
10
+ { name, label, type = 'text', error, required, ...rest }: InputProps,
11
+ ref: ForwardedRef<HTMLInputElement>,
12
+ ) => {
8
13
  return (
9
- <>
14
+ <div className={clsx(error && 'squiz-fte-invalid-form-field')}>
10
15
  {label && (
11
16
  <label htmlFor={name} className="squiz-fte-form-label">
12
17
  {label}
13
18
  </label>
14
19
  )}
15
- <input ref={ref} id={name} name={name} type={type} className="squiz-fte-form-control" {...rest} />
16
- </>
20
+ {required && (
21
+ <span className="text-gray-600" aria-label="Required field">
22
+ *
23
+ </span>
24
+ )}
25
+ <input
26
+ ref={ref}
27
+ id={name}
28
+ name={name}
29
+ type={type}
30
+ aria-invalid={!!error}
31
+ className="squiz-fte-form-control"
32
+ {...rest}
33
+ />
34
+ {error && <div className="squiz-fte-form-error">{error}</div>}
35
+ </div>
17
36
  );
18
37
  };
19
38
 
@@ -2,6 +2,8 @@ import '@testing-library/jest-dom';
2
2
  import { render, screen, fireEvent } from '@testing-library/react';
3
3
  import React from 'react';
4
4
  import Modal from './Modal';
5
+ import { Select } from '../Fields/Select/Select';
6
+ import { Input } from '../Fields/Input/Input';
5
7
 
6
8
  describe('Modal', () => {
7
9
  const mockOnCancel = jest.fn();
@@ -110,4 +112,17 @@ describe('Modal', () => {
110
112
 
111
113
  expect(screen.getByLabelText('My input')).toHaveFocus();
112
114
  });
115
+
116
+ it('Auto-focuses on the first select field on mount', () => {
117
+ render(
118
+ <Modal title="Modal title" onCancel={mockOnCancel} onSubmit={mockOnSubmit}>
119
+ <>
120
+ <Select label="Dropdown" name="select" options={{}} />
121
+ <Input label="Input" name="input" />
122
+ </>
123
+ </Modal>,
124
+ );
125
+
126
+ expect(screen.getByLabelText('Dropdown')).toHaveFocus();
127
+ });
113
128
  });
@@ -1,7 +1,8 @@
1
- import React, { ForwardedRef, forwardRef, ReactElement, useEffect, useMemo } from 'react';
1
+ import React, { ForwardedRef, forwardRef, ReactElement, useEffect, useMemo, useRef } from 'react';
2
2
  import { createPortal } from 'react-dom';
3
3
  import CloseRoundedIcon from '@mui/icons-material/CloseRounded';
4
4
  import { FocusTrap } from '@mui/base';
5
+ import clsx from 'clsx';
5
6
 
6
7
  export type ModalProps = {
7
8
  title: string;
@@ -15,6 +16,7 @@ const Modal = (
15
16
  { children, title, onCancel, onSubmit, className }: ModalProps,
16
17
  ref: ForwardedRef<HTMLDivElement>,
17
18
  ): ReactElement => {
19
+ const content = useRef<HTMLDivElement>(null);
18
20
  const container = useMemo(() => {
19
21
  const element = document.createElement('div');
20
22
  element.classList.add('squiz-fte-scope');
@@ -37,7 +39,7 @@ const Modal = (
37
39
 
38
40
  // add/remove the modal container from the DOM and focus on the first input
39
41
  useEffect(() => {
40
- const firstInput = container.querySelector('input:not([type=hidden])') as HTMLInputElement;
42
+ const firstInput = content.current?.querySelector('input:not([type=hidden]), button') as HTMLElement;
41
43
 
42
44
  document.body.appendChild(container);
43
45
  firstInput?.focus();
@@ -50,7 +52,7 @@ const Modal = (
50
52
  return createPortal(
51
53
  <>
52
54
  <FocusTrap open>
53
- <div ref={ref} className={`squiz-fte-modal-wrapper ${className ? className : ''}`} tabIndex={-1}>
55
+ <div ref={ref} className={clsx('squiz-fte-modal-wrapper', className)} tabIndex={-1}>
54
56
  <div className="w-modal-sm my-6 mx-auto">
55
57
  <div className="squiz-fte-modal">
56
58
  <div className="squiz-fte-modal-header p-6 pb-2">
@@ -64,7 +66,9 @@ const Modal = (
64
66
  <CloseRoundedIcon />
65
67
  </button>
66
68
  </div>
67
- <div className="squiz-fte-modal-content">{children}</div>
69
+ <div className="squiz-fte-modal-content" ref={content}>
70
+ {children}
71
+ </div>
68
72
  <div className="squiz-fte-modal-footer p-6 pt-3">
69
73
  <button
70
74
  className="squiz-fte-modal-footer__button bg-gray-200 text-gray-700 mr-2 hover:bg-gray-300"
@@ -1,6 +1,6 @@
1
1
  .toolbar-dropdown {
2
2
  &__button {
3
- @apply flex items-center font-base text-md font-semibold text-gray-600;
3
+ @apply flex items-center font-base text-md font-semibold text-gray-600 rounded;
4
4
  align-self: center;
5
5
 
6
6
  height: 2rem;
@@ -13,4 +13,18 @@
13
13
  box-shadow: none;
14
14
  }
15
15
  }
16
+ &-invalid-form-field {
17
+ .squiz-fte-form-control {
18
+ @apply border-red-300 bg-no-repeat pr-8;
19
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0ibm9uZSIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiPjxwYXRoIGQ9Ik00LjQ3IDIxaDE1LjA2YzEuNTQgMCAyLjUtMS42NyAxLjczLTNMMTMuNzMgNC45OWMtLjc3LTEuMzMtMi42OS0xLjMzLTMuNDYgMEwyLjc0IDE4Yy0uNzcgMS4zMy4xOSAzIDEuNzMgM3pNMTIgMTRjLS41NSAwLTEtLjQ1LTEtMXYtMmMwLS41NS40NS0xIDEtMXMxIC40NSAxIDF2MmMwIC41NS0uNDUgMS0xIDF6bTEgNGgtMnYtMmgydjJ6IiBjbGFzcz0ic2VsZWN0ZWQiIGZpbGw9IiNkNzIzMjEiLz48L2c+PC9zdmc+');
20
+ background-position: top 0.25rem right 0.25rem;
21
+ background-size: 1.5rem;
22
+ }
23
+ }
24
+ &-form-error {
25
+ @apply text-red-300;
26
+ font-size: 13px;
27
+ line-height: 1.23;
28
+ padding-top: 0.25rem;
29
+ }
16
30
  }
@@ -0,0 +1,271 @@
1
+ import { FORMATTED_TEXT_MODELS as FormattedTextModels } from '@squiz/dx-json-schema-lib';
2
+ import { RemirrorJSON } from '@remirror/core';
3
+
4
+ export const mockSquizNodeJson: FormattedTextModels.v1.FormattedText = [
5
+ {
6
+ children: [
7
+ {
8
+ type: 'text',
9
+ value: 'Hello ',
10
+ },
11
+ {
12
+ children: [
13
+ {
14
+ type: 'text',
15
+ value: 'Mr Bean',
16
+ },
17
+ ],
18
+ attributes: {
19
+ href: 'https://www.google.com',
20
+ },
21
+ font: {
22
+ bold: true,
23
+ },
24
+ type: 'tag',
25
+ tag: 'a',
26
+ },
27
+ {
28
+ type: 'text',
29
+ value: ', nice to ',
30
+ },
31
+ {
32
+ children: [
33
+ {
34
+ type: 'text',
35
+ value: 'meet you',
36
+ },
37
+ ],
38
+ attributes: {
39
+ href: 'https://www.google.com',
40
+ },
41
+ type: 'tag',
42
+ tag: 'a',
43
+ },
44
+ {
45
+ type: 'text',
46
+ value: '.',
47
+ },
48
+ {
49
+ children: [],
50
+ attributes: {
51
+ alt: 'Test',
52
+ height: '150',
53
+ width: '200',
54
+ src: 'https://media2.giphy.com/media/3o6ozsIxg5legYvggo/giphy.gif',
55
+ title: '',
56
+ resizable: 'false',
57
+ },
58
+ type: 'tag',
59
+ tag: 'img',
60
+ },
61
+ ],
62
+ type: 'tag',
63
+ tag: 'p',
64
+ },
65
+ ];
66
+
67
+ export const mockSquizNodeTextJson: FormattedTextModels.v1.FormattedText = [
68
+ {
69
+ value: 'Hello world!',
70
+ type: 'text',
71
+ },
72
+ {
73
+ value: 'Another one...',
74
+ type: 'text',
75
+ },
76
+ ];
77
+
78
+ type NodeExample = {
79
+ description: string;
80
+ remirrorNode: RemirrorJSON;
81
+ squizNode: FormattedTextModels.v1.FormattedText;
82
+ };
83
+
84
+ export const sharedNodeExamples: NodeExample[] = [
85
+ {
86
+ description: 'Asset link',
87
+ remirrorNode: {
88
+ type: 'text',
89
+ text: 'Hello',
90
+ marks: [
91
+ {
92
+ type: 'assetLink',
93
+ attrs: {
94
+ target: '_blank',
95
+ matrixAssetId: '123',
96
+ matrixDomain: 'https://my-matrix.squiz.net',
97
+ matrixIdentifier: 'matrix-api-identifier',
98
+ },
99
+ },
100
+ ],
101
+ },
102
+ squizNode: [
103
+ {
104
+ type: 'link-to-matrix-asset',
105
+ target: '_blank',
106
+ matrixAssetId: '123',
107
+ matrixDomain: 'https://my-matrix.squiz.net',
108
+ matrixIdentifier: 'matrix-api-identifier',
109
+ children: [{ type: 'text', value: 'Hello' }],
110
+ },
111
+ ],
112
+ },
113
+ {
114
+ description: 'Asset link with formatting applied inside of the link',
115
+ remirrorNode: {
116
+ type: 'text',
117
+ text: 'Hello',
118
+ marks: [
119
+ { type: 'bold' },
120
+ {
121
+ type: 'assetLink',
122
+ attrs: {
123
+ target: '_blank',
124
+ matrixAssetId: '123',
125
+ matrixDomain: 'https://my-matrix.squiz.net',
126
+ matrixIdentifier: 'matrix-api-identifier',
127
+ },
128
+ },
129
+ ],
130
+ },
131
+ squizNode: [
132
+ {
133
+ type: 'link-to-matrix-asset',
134
+ target: '_blank',
135
+ matrixAssetId: '123',
136
+ matrixDomain: 'https://my-matrix.squiz.net',
137
+ matrixIdentifier: 'matrix-api-identifier',
138
+ children: [
139
+ {
140
+ type: 'tag',
141
+ tag: 'span',
142
+ font: { bold: true },
143
+ children: [{ type: 'text', value: 'Hello' }],
144
+ },
145
+ ],
146
+ },
147
+ ],
148
+ },
149
+ {
150
+ description: 'Asset image',
151
+ remirrorNode: {
152
+ type: 'assetImage',
153
+ attrs: {
154
+ matrixAssetId: '123',
155
+ matrixDomain: 'https://my-matrix.squiz.net',
156
+ matrixIdentifier: 'matrix-api-identifier',
157
+ },
158
+ },
159
+ squizNode: [
160
+ {
161
+ type: 'matrix-image',
162
+ matrixAssetId: '123',
163
+ matrixDomain: 'https://my-matrix.squiz.net',
164
+ matrixIdentifier: 'matrix-api-identifier',
165
+ },
166
+ ],
167
+ },
168
+ ];
169
+
170
+ export const squizOnlyNodeExamples: NodeExample[] = [
171
+ {
172
+ description: 'Asset link with formatting applied inside, outside and with multiple levels of nesting',
173
+ squizNode: [
174
+ {
175
+ type: 'tag',
176
+ tag: 'span',
177
+ font: { bold: true },
178
+ children: [
179
+ {
180
+ type: 'link-to-matrix-asset',
181
+ target: '_blank',
182
+ matrixAssetId: '123',
183
+ matrixDomain: 'https://my-matrix.squiz.net',
184
+ matrixIdentifier: 'matrix-api-identifier',
185
+ children: [
186
+ {
187
+ type: 'tag',
188
+ tag: 'span',
189
+ font: { italics: true },
190
+ children: [
191
+ {
192
+ type: 'tag',
193
+ tag: 'span',
194
+ font: { underline: true },
195
+ children: [{ type: 'text', value: 'Hello' }],
196
+ },
197
+ ],
198
+ },
199
+ ],
200
+ },
201
+ ],
202
+ },
203
+ ],
204
+ remirrorNode: {
205
+ // reverse operation covered by "Asset link with formatting applied inside of the link".
206
+ type: 'text',
207
+ text: 'Hello',
208
+ marks: [
209
+ { type: 'underline' },
210
+ { type: 'italic' },
211
+ {
212
+ type: 'assetLink',
213
+ attrs: {
214
+ target: '_blank',
215
+ matrixAssetId: '123',
216
+ matrixDomain: 'https://my-matrix.squiz.net',
217
+ matrixIdentifier: 'matrix-api-identifier',
218
+ },
219
+ },
220
+ { type: 'bold' },
221
+ ],
222
+ },
223
+ },
224
+ {
225
+ description: 'Asset link with multiple levels of un-necessary nesting',
226
+ squizNode: [
227
+ {
228
+ type: 'tag',
229
+ tag: 'span',
230
+ children: [
231
+ {
232
+ type: 'link-to-matrix-asset',
233
+ target: '_blank',
234
+ matrixAssetId: '123',
235
+ matrixDomain: 'https://my-matrix.squiz.net',
236
+ matrixIdentifier: 'matrix-api-identifier',
237
+ children: [
238
+ {
239
+ type: 'tag',
240
+ tag: 'span',
241
+ children: [
242
+ {
243
+ type: 'tag',
244
+ tag: 'span',
245
+ children: [{ type: 'text', value: 'Hello' }],
246
+ },
247
+ ],
248
+ },
249
+ ],
250
+ },
251
+ ],
252
+ },
253
+ ],
254
+ remirrorNode: {
255
+ // reverse operation covered by "Asset link".
256
+ type: 'text',
257
+ text: 'Hello',
258
+ marks: [
259
+ {
260
+ type: 'assetLink',
261
+ attrs: {
262
+ target: '_blank',
263
+ matrixAssetId: '123',
264
+ matrixDomain: 'https://my-matrix.squiz.net',
265
+ matrixIdentifier: 'matrix-api-identifier',
266
+ },
267
+ },
268
+ ],
269
+ },
270
+ },
271
+ ];