@ni/nimble-components 20.1.10 → 20.1.12

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 (29) hide show
  1. package/dist/all-components-bundle.js +16199 -527
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +4777 -2673
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/esm/all-components.d.ts +1 -0
  6. package/dist/esm/all-components.js +1 -0
  7. package/dist/esm/all-components.js.map +1 -1
  8. package/dist/esm/rich-text-editor/index.d.ts +84 -0
  9. package/dist/esm/rich-text-editor/index.js +170 -0
  10. package/dist/esm/rich-text-editor/index.js.map +1 -1
  11. package/dist/esm/rich-text-editor/styles.js +142 -2
  12. package/dist/esm/rich-text-editor/styles.js.map +1 -1
  13. package/dist/esm/rich-text-editor/template.js +77 -2
  14. package/dist/esm/rich-text-editor/template.js.map +1 -1
  15. package/dist/esm/rich-text-editor/testing/rich-text-editor.pageobject.d.ts +47 -0
  16. package/dist/esm/rich-text-editor/testing/rich-text-editor.pageobject.js +143 -0
  17. package/dist/esm/rich-text-editor/testing/rich-text-editor.pageobject.js.map +1 -0
  18. package/dist/esm/rich-text-editor/testing/types.d.ts +7 -0
  19. package/dist/esm/rich-text-editor/testing/types.js +7 -0
  20. package/dist/esm/rich-text-editor/testing/types.js.map +1 -0
  21. package/dist/esm/rich-text-viewer/testing/rich-text-viewer.pageobject.d.ts +4 -0
  22. package/dist/esm/rich-text-viewer/testing/rich-text-viewer.pageobject.js +19 -0
  23. package/dist/esm/rich-text-viewer/testing/rich-text-viewer.pageobject.js.map +1 -1
  24. package/dist/esm/src/all-components.d.ts +1 -0
  25. package/dist/esm/src/rich-text-editor/index.d.ts +84 -0
  26. package/dist/esm/src/rich-text-editor/testing/rich-text-editor.pageobject.d.ts +47 -0
  27. package/dist/esm/src/rich-text-editor/testing/types.d.ts +7 -0
  28. package/dist/esm/src/rich-text-viewer/testing/rich-text-viewer.pageobject.d.ts +4 -0
  29. package/package.json +11 -1
@@ -39,6 +39,7 @@ import './tab';
39
39
  import './tab-panel';
40
40
  import './table';
41
41
  import './table-column/anchor';
42
+ import './table-column/date-text';
42
43
  import './table-column/enum-text';
43
44
  import './table-column/text';
44
45
  import './tabs';
@@ -39,6 +39,7 @@ import './tab';
39
39
  import './tab-panel';
40
40
  import './table';
41
41
  import './table-column/anchor';
42
+ import './table-column/date-text';
42
43
  import './table-column/enum-text';
43
44
  import './table-column/text';
44
45
  import './tabs';
@@ -1 +1 @@
1
- {"version":3,"file":"all-components.js","sourceRoot":"","sources":["../../src/all-components.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,UAAU,CAAC;AAClB,OAAO,iBAAiB,CAAC;AACzB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,cAAc,CAAC;AACtB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,UAAU,CAAC;AAClB,OAAO,cAAc,CAAC;AACtB,OAAO,mBAAmB,CAAC;AAC3B,OAAO,UAAU,CAAC;AAClB,OAAO,eAAe,CAAC;AACvB,OAAO,YAAY,CAAC;AACpB,OAAO,YAAY,CAAC;AACpB,OAAO,UAAU,CAAC;AAClB,OAAO,UAAU,CAAC;AAClB,OAAO,mBAAmB,CAAC;AAC3B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,wBAAwB,CAAC;AAChC,OAAO,eAAe,CAAC;AACvB,OAAO,gBAAgB,CAAC;AACxB,OAAO,QAAQ,CAAC;AAChB,OAAO,eAAe,CAAC;AACvB,OAAO,aAAa,CAAC;AACrB,OAAO,gBAAgB,CAAC;AACxB,OAAO,SAAS,CAAC;AACjB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,UAAU,CAAC;AAClB,OAAO,WAAW,CAAC;AACnB,OAAO,UAAU,CAAC;AAClB,OAAO,OAAO,CAAC;AACf,OAAO,aAAa,CAAC;AACrB,OAAO,SAAS,CAAC;AACjB,OAAO,uBAAuB,CAAC;AAC/B,OAAO,0BAA0B,CAAC;AAClC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,QAAQ,CAAC;AAChB,OAAO,gBAAgB,CAAC;AACxB,OAAO,aAAa,CAAC;AACrB,OAAO,cAAc,CAAC;AACtB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,iBAAiB,CAAC;AACzB,OAAO,WAAW,CAAC;AACnB,OAAO,WAAW,CAAC;AACnB,OAAO,aAAa,CAAC;AACrB,OAAO,aAAa,CAAC;AACrB,OAAO,aAAa,CAAC"}
1
+ {"version":3,"file":"all-components.js","sourceRoot":"","sources":["../../src/all-components.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,UAAU,CAAC;AAClB,OAAO,iBAAiB,CAAC;AACzB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,cAAc,CAAC;AACtB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,UAAU,CAAC;AAClB,OAAO,cAAc,CAAC;AACtB,OAAO,mBAAmB,CAAC;AAC3B,OAAO,UAAU,CAAC;AAClB,OAAO,eAAe,CAAC;AACvB,OAAO,YAAY,CAAC;AACpB,OAAO,YAAY,CAAC;AACpB,OAAO,UAAU,CAAC;AAClB,OAAO,UAAU,CAAC;AAClB,OAAO,mBAAmB,CAAC;AAC3B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,wBAAwB,CAAC;AAChC,OAAO,eAAe,CAAC;AACvB,OAAO,gBAAgB,CAAC;AACxB,OAAO,QAAQ,CAAC;AAChB,OAAO,eAAe,CAAC;AACvB,OAAO,aAAa,CAAC;AACrB,OAAO,gBAAgB,CAAC;AACxB,OAAO,SAAS,CAAC;AACjB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,UAAU,CAAC;AAClB,OAAO,WAAW,CAAC;AACnB,OAAO,UAAU,CAAC;AAClB,OAAO,OAAO,CAAC;AACf,OAAO,aAAa,CAAC;AACrB,OAAO,SAAS,CAAC;AACjB,OAAO,uBAAuB,CAAC;AAC/B,OAAO,0BAA0B,CAAC;AAClC,OAAO,0BAA0B,CAAC;AAClC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,QAAQ,CAAC;AAChB,OAAO,gBAAgB,CAAC;AACxB,OAAO,aAAa,CAAC;AACrB,OAAO,cAAc,CAAC;AACtB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,iBAAiB,CAAC;AACzB,OAAO,WAAW,CAAC;AACnB,OAAO,WAAW,CAAC;AACnB,OAAO,aAAa,CAAC;AACrB,OAAO,aAAa,CAAC;AACrB,OAAO,aAAa,CAAC"}
@@ -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;AAQlC;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,iBAAiB;CAAG;AAExD,MAAM,oBAAoB,GAAG,cAAc,CAAC,OAAO,CAAC;IAChD,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE;KACrB,UAAU,CAAC,QAAQ,CAAC;KACpB,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,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,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAE1E,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,MAAM,CAAC;;;gBAGL,QAAQ;iBACP,aAAa;;CAE7B,CAAC"}
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> Rich Text Editor here. </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;AAG/C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAgB;;CAE3C,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
+ }