@ni/nimble-components 20.1.9 → 20.1.11
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/all-components-bundle.js +15837 -473
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +4754 -2664
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/rich-text-editor/index.d.ts +84 -0
- package/dist/esm/rich-text-editor/index.js +170 -0
- package/dist/esm/rich-text-editor/index.js.map +1 -1
- package/dist/esm/rich-text-editor/styles.js +142 -2
- package/dist/esm/rich-text-editor/styles.js.map +1 -1
- package/dist/esm/rich-text-editor/template.js +77 -2
- package/dist/esm/rich-text-editor/template.js.map +1 -1
- package/dist/esm/rich-text-editor/testing/rich-text-editor.pageobject.d.ts +47 -0
- package/dist/esm/rich-text-editor/testing/rich-text-editor.pageobject.js +143 -0
- package/dist/esm/rich-text-editor/testing/rich-text-editor.pageobject.js.map +1 -0
- package/dist/esm/rich-text-editor/testing/types.d.ts +7 -0
- package/dist/esm/rich-text-editor/testing/types.js +7 -0
- package/dist/esm/rich-text-editor/testing/types.js.map +1 -0
- package/dist/esm/rich-text-viewer/testing/rich-text-viewer.pageobject.d.ts +4 -0
- package/dist/esm/rich-text-viewer/testing/rich-text-viewer.pageobject.js +19 -0
- package/dist/esm/rich-text-viewer/testing/rich-text-viewer.pageobject.js.map +1 -1
- package/dist/esm/src/rich-text-editor/index.d.ts +84 -0
- package/dist/esm/src/rich-text-editor/testing/rich-text-editor.pageobject.d.ts +47 -0
- package/dist/esm/src/rich-text-editor/testing/types.d.ts +7 -0
- package/dist/esm/src/rich-text-viewer/testing/rich-text-viewer.pageobject.d.ts +4 -0
- package/dist/esm/src/table-column/number-text/cell-view/index.d.ts +16 -0
- package/dist/esm/src/table-column/number-text/group-header-view/index.d.ts +17 -0
- package/dist/esm/src/table-column/number-text/index.d.ts +26 -0
- package/dist/esm/src/table-column/number-text/models/default-formatter.d.ts +14 -0
- package/dist/esm/src/table-column/number-text/models/number-formatter.d.ts +11 -0
- package/dist/esm/src/table-column/number-text/models/round-to-integer-formatter.d.ts +8 -0
- package/dist/esm/src/table-column/number-text/types.d.ts +8 -0
- package/dist/esm/table-column/number-text/cell-view/index.d.ts +16 -0
- package/dist/esm/table-column/number-text/cell-view/index.js +27 -0
- package/dist/esm/table-column/number-text/cell-view/index.js.map +1 -0
- package/dist/esm/table-column/number-text/group-header-view/index.d.ts +17 -0
- package/dist/esm/table-column/number-text/group-header-view/index.js +29 -0
- package/dist/esm/table-column/number-text/group-header-view/index.js.map +1 -0
- package/dist/esm/table-column/number-text/index.d.ts +26 -0
- package/dist/esm/table-column/number-text/index.js +60 -0
- package/dist/esm/table-column/number-text/index.js.map +1 -0
- package/dist/esm/table-column/number-text/models/default-formatter.d.ts +14 -0
- package/dist/esm/table-column/number-text/models/default-formatter.js +58 -0
- package/dist/esm/table-column/number-text/models/default-formatter.js.map +1 -0
- package/dist/esm/table-column/number-text/models/number-formatter.d.ts +11 -0
- package/dist/esm/table-column/number-text/models/number-formatter.js +21 -0
- package/dist/esm/table-column/number-text/models/number-formatter.js.map +1 -0
- package/dist/esm/table-column/number-text/models/round-to-integer-formatter.d.ts +8 -0
- package/dist/esm/table-column/number-text/models/round-to-integer-formatter.js +18 -0
- package/dist/esm/table-column/number-text/models/round-to-integer-formatter.js.map +1 -0
- package/dist/esm/table-column/number-text/types.d.ts +8 -0
- package/dist/esm/table-column/number-text/types.js +8 -0
- package/dist/esm/table-column/number-text/types.js.map +1 -0
- package/package.json +11 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { FoundationElement } from '@microsoft/fast-foundation';
|
|
2
|
+
import type { ToggleButton } from '../toggle-button';
|
|
2
3
|
declare global {
|
|
3
4
|
interface HTMLElementTagNameMap {
|
|
4
5
|
'nimble-rich-text-editor': RichTextEditor;
|
|
@@ -8,5 +9,88 @@ declare global {
|
|
|
8
9
|
* A nimble styled rich text editor
|
|
9
10
|
*/
|
|
10
11
|
export declare class RichTextEditor extends FoundationElement {
|
|
12
|
+
/**
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
boldButton: ToggleButton;
|
|
16
|
+
/**
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
italicsButton: ToggleButton;
|
|
20
|
+
/**
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
bulletListButton: ToggleButton;
|
|
24
|
+
/**
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
numberedListButton: ToggleButton;
|
|
28
|
+
/**
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
editor: HTMLDivElement;
|
|
32
|
+
private tiptapEditor;
|
|
33
|
+
/**
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
connectedCallback(): void;
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
disconnectedCallback(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Toggle the bold mark and focus back to the editor
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
boldButtonClick(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Toggle the bold mark and focus back to the editor
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
boldButtonKeyDown(event: KeyboardEvent): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Toggle the italics mark and focus back to the editor
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
italicsButtonClick(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Toggle the italics mark and focus back to the editor
|
|
58
|
+
* @internal
|
|
59
|
+
*/
|
|
60
|
+
italicsButtonKeyDown(event: KeyboardEvent): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Toggle the unordered list node and focus back to the editor
|
|
63
|
+
* @internal
|
|
64
|
+
*/
|
|
65
|
+
bulletListButtonClick(): void;
|
|
66
|
+
/**
|
|
67
|
+
* Toggle the unordered list node and focus back to the editor
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
bulletListButtonKeyDown(event: KeyboardEvent): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Toggle the ordered list node and focus back to the editor
|
|
73
|
+
* @internal
|
|
74
|
+
*/
|
|
75
|
+
numberedListButtonClick(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Toggle the ordered list node and focus back to the editor
|
|
78
|
+
* @internal
|
|
79
|
+
*/
|
|
80
|
+
numberedListButtonKeyDown(event: KeyboardEvent): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* @internal
|
|
83
|
+
*/
|
|
84
|
+
stopEventPropagation(event: Event): boolean;
|
|
85
|
+
private initializeEditor;
|
|
86
|
+
/**
|
|
87
|
+
* Binding the "transaction" event to the editor allows continuous monitoring the events and updating the button state in response to
|
|
88
|
+
* various actions such as mouse events, keyboard events, changes in the editor content etc,.
|
|
89
|
+
* https://tiptap.dev/api/events#transaction
|
|
90
|
+
*/
|
|
91
|
+
private bindEditorTransactionEvent;
|
|
92
|
+
private unbindEditorTransactionEvent;
|
|
93
|
+
private updateEditorButtonsState;
|
|
94
|
+
private keyActivatesButton;
|
|
11
95
|
}
|
|
12
96
|
export declare const richTextEditorTag: string;
|
|
@@ -1,11 +1,181 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { observable } from '@microsoft/fast-element';
|
|
1
3
|
import { DesignSystem, FoundationElement } from '@microsoft/fast-foundation';
|
|
4
|
+
import { keyEnter, keySpace } from '@microsoft/fast-web-utilities';
|
|
5
|
+
import { Editor } from '@tiptap/core';
|
|
6
|
+
import Bold from '@tiptap/extension-bold';
|
|
7
|
+
import BulletList from '@tiptap/extension-bullet-list';
|
|
8
|
+
import Document from '@tiptap/extension-document';
|
|
9
|
+
import History from '@tiptap/extension-history';
|
|
10
|
+
import Italic from '@tiptap/extension-italic';
|
|
11
|
+
import ListItem from '@tiptap/extension-list-item';
|
|
12
|
+
import OrderedList from '@tiptap/extension-ordered-list';
|
|
13
|
+
import Paragraph from '@tiptap/extension-paragraph';
|
|
14
|
+
import Text from '@tiptap/extension-text';
|
|
2
15
|
import { template } from './template';
|
|
3
16
|
import { styles } from './styles';
|
|
4
17
|
/**
|
|
5
18
|
* A nimble styled rich text editor
|
|
6
19
|
*/
|
|
7
20
|
export class RichTextEditor extends FoundationElement {
|
|
21
|
+
/**
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
connectedCallback() {
|
|
25
|
+
super.connectedCallback();
|
|
26
|
+
this.initializeEditor();
|
|
27
|
+
this.bindEditorTransactionEvent();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
disconnectedCallback() {
|
|
33
|
+
super.disconnectedCallback();
|
|
34
|
+
this.unbindEditorTransactionEvent();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Toggle the bold mark and focus back to the editor
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
boldButtonClick() {
|
|
41
|
+
this.tiptapEditor.chain().focus().toggleBold().run();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Toggle the bold mark and focus back to the editor
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
boldButtonKeyDown(event) {
|
|
48
|
+
if (this.keyActivatesButton(event)) {
|
|
49
|
+
this.tiptapEditor.chain().focus().toggleBold().run();
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Toggle the italics mark and focus back to the editor
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
italicsButtonClick() {
|
|
59
|
+
this.tiptapEditor.chain().focus().toggleItalic().run();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Toggle the italics mark and focus back to the editor
|
|
63
|
+
* @internal
|
|
64
|
+
*/
|
|
65
|
+
italicsButtonKeyDown(event) {
|
|
66
|
+
if (this.keyActivatesButton(event)) {
|
|
67
|
+
this.tiptapEditor.chain().focus().toggleItalic().run();
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Toggle the unordered list node and focus back to the editor
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
bulletListButtonClick() {
|
|
77
|
+
this.tiptapEditor.chain().focus().toggleBulletList().run();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Toggle the unordered list node and focus back to the editor
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
83
|
+
bulletListButtonKeyDown(event) {
|
|
84
|
+
if (this.keyActivatesButton(event)) {
|
|
85
|
+
this.tiptapEditor.chain().focus().toggleBulletList().run();
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Toggle the ordered list node and focus back to the editor
|
|
92
|
+
* @internal
|
|
93
|
+
*/
|
|
94
|
+
numberedListButtonClick() {
|
|
95
|
+
this.tiptapEditor.chain().focus().toggleOrderedList().run();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Toggle the ordered list node and focus back to the editor
|
|
99
|
+
* @internal
|
|
100
|
+
*/
|
|
101
|
+
numberedListButtonKeyDown(event) {
|
|
102
|
+
if (this.keyActivatesButton(event)) {
|
|
103
|
+
this.tiptapEditor.chain().focus().toggleOrderedList().run();
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @internal
|
|
110
|
+
*/
|
|
111
|
+
stopEventPropagation(event) {
|
|
112
|
+
// Don't bubble the 'change' event from the toggle button because
|
|
113
|
+
// all the formatting button has its own 'toggle' event through 'click' and 'keydown'.
|
|
114
|
+
event.stopPropagation();
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
initializeEditor() {
|
|
118
|
+
/**
|
|
119
|
+
* For more information on the extensions for the supported formatting options, refer to the links below.
|
|
120
|
+
* Tiptap marks: https://tiptap.dev/api/marks
|
|
121
|
+
* Tiptap nodes: https://tiptap.dev/api/nodes
|
|
122
|
+
*/
|
|
123
|
+
this.tiptapEditor = new Editor({
|
|
124
|
+
element: this.editor,
|
|
125
|
+
extensions: [
|
|
126
|
+
Document,
|
|
127
|
+
Paragraph,
|
|
128
|
+
Text,
|
|
129
|
+
BulletList,
|
|
130
|
+
OrderedList,
|
|
131
|
+
ListItem,
|
|
132
|
+
Bold,
|
|
133
|
+
Italic,
|
|
134
|
+
History
|
|
135
|
+
]
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Binding the "transaction" event to the editor allows continuous monitoring the events and updating the button state in response to
|
|
140
|
+
* various actions such as mouse events, keyboard events, changes in the editor content etc,.
|
|
141
|
+
* https://tiptap.dev/api/events#transaction
|
|
142
|
+
*/
|
|
143
|
+
bindEditorTransactionEvent() {
|
|
144
|
+
this.tiptapEditor.on('transaction', () => {
|
|
145
|
+
this.updateEditorButtonsState();
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
unbindEditorTransactionEvent() {
|
|
149
|
+
this.tiptapEditor.off('transaction');
|
|
150
|
+
}
|
|
151
|
+
updateEditorButtonsState() {
|
|
152
|
+
this.boldButton.checked = this.tiptapEditor.isActive('bold');
|
|
153
|
+
this.italicsButton.checked = this.tiptapEditor.isActive('italic');
|
|
154
|
+
this.bulletListButton.checked = this.tiptapEditor.isActive('bulletList');
|
|
155
|
+
this.numberedListButton.checked = this.tiptapEditor.isActive('orderedList');
|
|
156
|
+
}
|
|
157
|
+
keyActivatesButton(event) {
|
|
158
|
+
switch (event.key) {
|
|
159
|
+
case keySpace:
|
|
160
|
+
case keyEnter:
|
|
161
|
+
return true;
|
|
162
|
+
default:
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
8
166
|
}
|
|
167
|
+
__decorate([
|
|
168
|
+
observable
|
|
169
|
+
], RichTextEditor.prototype, "boldButton", void 0);
|
|
170
|
+
__decorate([
|
|
171
|
+
observable
|
|
172
|
+
], RichTextEditor.prototype, "italicsButton", void 0);
|
|
173
|
+
__decorate([
|
|
174
|
+
observable
|
|
175
|
+
], RichTextEditor.prototype, "bulletListButton", void 0);
|
|
176
|
+
__decorate([
|
|
177
|
+
observable
|
|
178
|
+
], RichTextEditor.prototype, "numberedListButton", void 0);
|
|
9
179
|
const nimbleRichTextEditor = RichTextEditor.compose({
|
|
10
180
|
baseName: 'rich-text-editor',
|
|
11
181
|
template,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rich-text-editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rich-text-editor/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,152 @@
|
|
|
1
1
|
import { css } from '@microsoft/fast-element';
|
|
2
2
|
import { display } from '@microsoft/fast-foundation';
|
|
3
|
-
import { bodyFont, bodyFontColor } from '../theme-provider/design-tokens';
|
|
3
|
+
import { bodyFont, bodyFontColor, borderHoverColor, borderRgbPartialColor, borderWidth, smallDelay, standardPadding } from '../theme-provider/design-tokens';
|
|
4
4
|
export const styles = css `
|
|
5
|
-
${display('flex')}
|
|
5
|
+
${display('inline-flex')}
|
|
6
6
|
|
|
7
7
|
:host {
|
|
8
8
|
font: ${bodyFont};
|
|
9
|
+
outline: none;
|
|
9
10
|
color: ${bodyFontColor};
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
--ni-private-rich-text-editor-hover-indicator-width: calc(
|
|
13
|
+
${borderWidth} + 1px
|
|
14
|
+
);
|
|
15
|
+
--ni-private-rich-text-editor-footer-section-height: 40px;
|
|
16
|
+
${
|
|
17
|
+
/** Minimum width is added to accommodate all the possible buttons in the toolbar and to support the mobile width. */ ''}
|
|
18
|
+
min-width: 360px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.container {
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
position: relative;
|
|
25
|
+
height: 100%;
|
|
26
|
+
border: ${borderWidth} solid rgba(${borderRgbPartialColor}, 0.3);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.container::after {
|
|
30
|
+
display: block;
|
|
31
|
+
content: ' ';
|
|
32
|
+
position: absolute;
|
|
33
|
+
bottom: calc(-1 * ${borderWidth});
|
|
34
|
+
width: 0px;
|
|
35
|
+
height: 0px;
|
|
36
|
+
left: 50%;
|
|
37
|
+
transform: translate(-50%, 50%);
|
|
38
|
+
border-bottom: ${borderHoverColor}
|
|
39
|
+
var(--ni-private-rich-text-editor-hover-indicator-width) solid;
|
|
40
|
+
transition: width ${smallDelay} ease-in;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.container:focus-within {
|
|
44
|
+
border-bottom-color: ${borderHoverColor};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@media (prefers-reduced-motion) {
|
|
48
|
+
.container::after {
|
|
49
|
+
transition-duration: 0s;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
:host(:hover) .container::after {
|
|
54
|
+
width: 100%;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.editor {
|
|
58
|
+
border: ${borderWidth} solid transparent;
|
|
59
|
+
border-radius: 0px;
|
|
60
|
+
height: calc(
|
|
61
|
+
100% - var(--ni-private-rich-text-editor-footer-section-height)
|
|
62
|
+
);
|
|
63
|
+
overflow: auto;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.ProseMirror {
|
|
67
|
+
${
|
|
68
|
+
/**
|
|
69
|
+
* Min height represents the one line space for the initial view and max height is referred from the visual design.
|
|
70
|
+
* However, max height will be `fit-content` when the `fit-to-content` attribute for the editor component is implemented.
|
|
71
|
+
*/ ''}
|
|
72
|
+
min-height: 32px;
|
|
73
|
+
max-height: 132px;
|
|
74
|
+
height: 100%;
|
|
75
|
+
border: ${borderWidth} solid transparent;
|
|
76
|
+
border-radius: 0px;
|
|
77
|
+
background-color: transparent;
|
|
78
|
+
font: inherit;
|
|
79
|
+
padding: 8px;
|
|
80
|
+
box-sizing: border-box;
|
|
81
|
+
position: relative;
|
|
82
|
+
color: inherit;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
${
|
|
86
|
+
/**
|
|
87
|
+
* Below are the styles from prosemirror-view as the Prose mirror expects the "white-space" to be set. The recommendation is to load the style from the below package.
|
|
88
|
+
* However, the other classes used in the below file like ".ProseMirror-selectednode", ".ProseMirror-hideselection" were not used anywhere in the ".Prosemirror" content editable div in the DOM. So added only the necessary styles below.
|
|
89
|
+
*
|
|
90
|
+
* https://github.com/ProseMirror/prosemirror-view/blob/db2223a88b540a8f381fc2720198342e29a60566/style/prosemirror.css#L5C1-L12C2
|
|
91
|
+
*/ ''}
|
|
92
|
+
.ProseMirror {
|
|
93
|
+
word-wrap: break-word;
|
|
94
|
+
white-space: pre-wrap;
|
|
95
|
+
-webkit-font-variant-ligatures: none;
|
|
96
|
+
font-variant-ligatures: none;
|
|
97
|
+
font-feature-settings: 'liga' 0;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.ProseMirror pre {
|
|
101
|
+
white-space: pre-wrap;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.ProseMirror li {
|
|
105
|
+
position: relative;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
${ /** End of Prose Mirror defined styles from prosemirror-view */''}
|
|
109
|
+
|
|
110
|
+
.ProseMirror-focused {
|
|
111
|
+
outline: none;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.ProseMirror > :first-child {
|
|
115
|
+
margin-block-start: 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.ProseMirror > :last-child {
|
|
119
|
+
margin-block-end: 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
li > p {
|
|
123
|
+
margin-block: 0;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.footer-section {
|
|
127
|
+
display: flex;
|
|
128
|
+
justify-content: space-between;
|
|
129
|
+
border: ${borderWidth} solid transparent;
|
|
130
|
+
border-top-color: rgba(${borderRgbPartialColor}, 0.1);
|
|
131
|
+
height: var(--ni-private-rich-text-editor-footer-section-height);
|
|
132
|
+
overflow: hidden;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
nimble-toolbar::part(positioning-region) {
|
|
136
|
+
background: transparent;
|
|
137
|
+
padding-right: 8px;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
nimble-toolbar::part(start) {
|
|
141
|
+
gap: 8px;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.footer-actions {
|
|
145
|
+
display: flex;
|
|
146
|
+
justify-content: flex-end;
|
|
147
|
+
margin-inline-end: ${standardPadding};
|
|
148
|
+
gap: ${standardPadding};
|
|
149
|
+
place-items: center;
|
|
10
150
|
}
|
|
11
151
|
`;
|
|
12
152
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/rich-text-editor/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/rich-text-editor/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EACH,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,eAAe,EAClB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,aAAa,CAAC;;;gBAGZ,QAAQ;;iBAEP,aAAa;;;cAGhB,WAAW;;;UAGf;AACE,qHAAqH,CAAC,EAC1H;;;;;;;;;kBASU,WAAW,eAAe,qBAAqB;;;;;;;4BAOrC,WAAW;;;;;yBAKd,gBAAgB;;4BAEb,UAAU;;;;+BAIP,gBAAgB;;;;;;;;;;;;;;kBAc7B,WAAW;;;;;;;;;UASnB;AACE;;;GAGG,CAAC,EACR;;;;kBAIU,WAAW;;;;;;;;;;MAUvB;AACE;;;;;GAKG,CAAC,EACR;;;;;;;;;;;;;;;;;MAiBE,CAAA,+DAAgE,EAAE;;;;;;;;;;;;;;;;;;;;;kBAqBtD,WAAW;iCACI,qBAAqB;;;;;;;;;;;;;;;;;6BAiBzB,eAAe;eAC7B,eAAe;;;CAG7B,CAAC"}
|
|
@@ -1,5 +1,80 @@
|
|
|
1
|
-
import { html } from '@microsoft/fast-element';
|
|
1
|
+
import { html, ref } from '@microsoft/fast-element';
|
|
2
|
+
import { toolbarTag } from '../toolbar';
|
|
3
|
+
import { toggleButtonTag } from '../toggle-button';
|
|
4
|
+
import { iconBoldBTag } from '../icons/bold-b';
|
|
5
|
+
import { iconItalicITag } from '../icons/italic-i';
|
|
6
|
+
import { iconListTag } from '../icons/list';
|
|
7
|
+
import { iconNumberListTag } from '../icons/number-list';
|
|
8
|
+
// prettier-ignore
|
|
2
9
|
export const template = html `
|
|
3
|
-
<template>
|
|
10
|
+
<template>
|
|
11
|
+
<div class="container">
|
|
12
|
+
<section
|
|
13
|
+
${ref('editor')}
|
|
14
|
+
class="editor"
|
|
15
|
+
role="textbox"
|
|
16
|
+
aria-multiline="true">
|
|
17
|
+
</section>
|
|
18
|
+
<section class="footer-section" part="footer-section">
|
|
19
|
+
<${toolbarTag}>
|
|
20
|
+
<${toggleButtonTag}
|
|
21
|
+
${ref('boldButton')}
|
|
22
|
+
appearance="ghost"
|
|
23
|
+
content-hidden
|
|
24
|
+
slot="start"
|
|
25
|
+
title="Bold"
|
|
26
|
+
@click=${x => x.boldButtonClick()}
|
|
27
|
+
@change=${(x, c) => x.stopEventPropagation(c.event)}
|
|
28
|
+
@keydown=${(x, c) => x.boldButtonKeyDown(c.event)}
|
|
29
|
+
>
|
|
30
|
+
Bold
|
|
31
|
+
<${iconBoldBTag} slot="start"></${iconBoldBTag}>
|
|
32
|
+
</${toggleButtonTag}>
|
|
33
|
+
<${toggleButtonTag}
|
|
34
|
+
${ref('italicsButton')}
|
|
35
|
+
appearance="ghost"
|
|
36
|
+
content-hidden
|
|
37
|
+
slot="start"
|
|
38
|
+
title="Italics"
|
|
39
|
+
@click=${x => x.italicsButtonClick()}
|
|
40
|
+
@change=${(x, c) => x.stopEventPropagation(c.event)}
|
|
41
|
+
@keydown=${(x, c) => x.italicsButtonKeyDown(c.event)}
|
|
42
|
+
>
|
|
43
|
+
Italics
|
|
44
|
+
<${iconItalicITag} slot="start"></${iconItalicITag}>
|
|
45
|
+
</${toggleButtonTag}>
|
|
46
|
+
<${toggleButtonTag}
|
|
47
|
+
${ref('bulletListButton')}
|
|
48
|
+
appearance="ghost"
|
|
49
|
+
content-hidden
|
|
50
|
+
slot="start"
|
|
51
|
+
title="Bullet List"
|
|
52
|
+
@click=${x => x.bulletListButtonClick()}
|
|
53
|
+
@change=${(x, c) => x.stopEventPropagation(c.event)}
|
|
54
|
+
@keydown=${(x, c) => x.bulletListButtonKeyDown(c.event)}
|
|
55
|
+
>
|
|
56
|
+
Bullet List
|
|
57
|
+
<${iconListTag} slot="start"></${iconListTag}>
|
|
58
|
+
</${toggleButtonTag}>
|
|
59
|
+
<${toggleButtonTag}
|
|
60
|
+
${ref('numberedListButton')}
|
|
61
|
+
appearance="ghost"
|
|
62
|
+
content-hidden
|
|
63
|
+
slot="start"
|
|
64
|
+
title="Numbered List"
|
|
65
|
+
@click=${x => x.numberedListButtonClick()}
|
|
66
|
+
@change=${(x, c) => x.stopEventPropagation(c.event)}
|
|
67
|
+
@keydown=${(x, c) => x.numberedListButtonKeyDown(c.event)}
|
|
68
|
+
>
|
|
69
|
+
Numbered List
|
|
70
|
+
<${iconNumberListTag} slot="start"></${iconNumberListTag}>
|
|
71
|
+
</${toggleButtonTag}>
|
|
72
|
+
</${toolbarTag}>
|
|
73
|
+
<span class="footer-actions" part="footer-actions">
|
|
74
|
+
<slot name="footer-actions"></slot>
|
|
75
|
+
</span>
|
|
76
|
+
</section>
|
|
77
|
+
</div>
|
|
78
|
+
</template>
|
|
4
79
|
`;
|
|
5
80
|
//# sourceMappingURL=template.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/rich-text-editor/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/rich-text-editor/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,kBAAkB;AAClB,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAgB;;;;kBAI1B,GAAG,CAAC,QAAQ,CAAC;;;;;;mBAMZ,UAAU;uBACN,eAAe;0BACZ,GAAG,CAAC,YAAY,CAAC;;;;;iCAKV,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE;kCACvB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC;mCACxC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAsB,CAAC;;;2BAG/D,YAAY,mBAAmB,YAAY;wBAC9C,eAAe;uBAChB,eAAe;0BACZ,GAAG,CAAC,eAAe,CAAC;;;;;iCAKb,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,EAAE;kCAC1B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC;mCACxC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAsB,CAAC;;;2BAGlE,cAAc,mBAAmB,cAAc;wBAClD,eAAe;uBAChB,eAAe;0BACZ,GAAG,CAAC,kBAAkB,CAAC;;;;;iCAKhB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,EAAE;kCAC7B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC;mCACxC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAsB,CAAC;;;2BAGrE,WAAW,mBAAmB,WAAW;wBAC5C,eAAe;uBAChB,eAAe;0BACZ,GAAG,CAAC,oBAAoB,CAAC;;;;;iCAKlB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,EAAE;kCAC/B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC;mCACxC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,KAAsB,CAAC;;;2BAGvE,iBAAiB,mBAAmB,iBAAiB;wBACxD,eAAe;oBACnB,UAAU;;;;;;;CAO7B,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { RichTextEditor } from '..';
|
|
2
|
+
/**
|
|
3
|
+
* Page object for the `nimble-rich-text-editor` component.
|
|
4
|
+
*/
|
|
5
|
+
export declare class RichTextEditorPageObject {
|
|
6
|
+
private readonly richTextEditorElement;
|
|
7
|
+
constructor(richTextEditorElement: RichTextEditor);
|
|
8
|
+
editorSectionHasChildNodes(): boolean;
|
|
9
|
+
getEditorSectionFirstElementChildClassName(): string;
|
|
10
|
+
clickEditorShortcutKeys(shortcutKey: string, isShiftKey: boolean): Promise<void>;
|
|
11
|
+
pressEnterKeyInEditor(): Promise<void>;
|
|
12
|
+
pressTabKeyInEditor(): Promise<void>;
|
|
13
|
+
pressShiftTabKeysInEditor(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* To click a formatting button in the footer section, pass its position value as an index (starting from '0')
|
|
16
|
+
* @param buttonIndex can be imported from an enum for each button using the `ButtonIndex`.
|
|
17
|
+
*/
|
|
18
|
+
clickFooterButton(buttonIndex: number): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* To retrieve the checked state of the button, provide its position value as an index (starting from '0')
|
|
21
|
+
* @param buttonIndex can be imported from an enum for each button using the `ButtonIndex`.
|
|
22
|
+
*/
|
|
23
|
+
getButtonCheckedState(buttonIndex: number): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* To retrieve the tab index of the button, provide its position value as an index (starting from '0')
|
|
26
|
+
* @param buttonIndex can be imported from an enum for each button using the `ButtonIndex`.
|
|
27
|
+
*/
|
|
28
|
+
getButtonTabIndex(buttonIndex: number): number;
|
|
29
|
+
/**
|
|
30
|
+
* To trigger a space key press for the button, provide its position value as an index (starting from '0')
|
|
31
|
+
* @param buttonIndex can be imported from an enum for each button using the `ButtonIndex`.
|
|
32
|
+
*/
|
|
33
|
+
spaceKeyActivatesButton(buttonIndex: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* To trigger a enter key press for the button, provide its position value as an index (starting from '0')
|
|
36
|
+
* @param buttonIndex can be imported from an enum for each button using the `ButtonIndex`.
|
|
37
|
+
*/
|
|
38
|
+
enterKeyActivatesButton(buttonIndex: number): void;
|
|
39
|
+
setEditorTextContent(value: string): Promise<void>;
|
|
40
|
+
getEditorFirstChildTagName(): string;
|
|
41
|
+
getEditorFirstChildTextContent(): string;
|
|
42
|
+
getEditorTagNames(): string[];
|
|
43
|
+
getEditorLeafContents(): string[];
|
|
44
|
+
private getEditorSection;
|
|
45
|
+
private getTiptapEditor;
|
|
46
|
+
private getFormattingButton;
|
|
47
|
+
}
|