kempo-ui 0.3.7 → 0.3.8
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/components/Accordion.js +5 -5
- package/dist/components/Aside.js +16 -16
- package/dist/components/Card.js +3 -3
- package/dist/components/ColorPicker.js +4 -4
- package/dist/components/ContentSlider.js +3 -3
- package/dist/components/Context.js +1 -1
- package/dist/components/Dialog.js +7 -7
- package/dist/components/Dropdown.js +7 -4
- package/dist/components/FilterItem.js +2 -2
- package/dist/components/FilterList.js +2 -2
- package/dist/components/FocusCapture.js +2 -2
- package/dist/components/HtmlEditor.js +62 -39
- package/dist/components/HybridComponent.js +1 -1
- package/dist/components/Icon.js +2 -2
- package/dist/components/Import.js +1 -1
- package/dist/components/LightComponent.js +1 -1
- package/dist/components/Main.js +3 -3
- package/dist/components/Nav.js +2 -2
- package/dist/components/NavSpacer.js +6 -0
- package/dist/components/PhotoViewer.js +3 -3
- package/dist/components/Resize.js +3 -3
- package/dist/components/ShadowComponent.js +1 -1
- package/dist/components/ShowMore.js +3 -3
- package/dist/components/Sortable.js +3 -3
- package/dist/components/Spinner.js +2 -2
- package/dist/components/Split.js +3 -3
- package/dist/components/Table.js +27 -27
- package/dist/components/Tabs.js +7 -7
- package/dist/components/Tags.js +4 -4
- package/dist/components/ThemeSelect.js +4 -4
- package/dist/components/ThemeSwitcher.js +5 -5
- package/dist/components/Timestamp.js +1 -1
- package/dist/components/Toast.js +3 -3
- package/dist/components/Toggle.js +3 -3
- package/dist/components/Tree.js +10 -10
- package/dist/components/htmlEditorControls/AlignCenter.js +4 -4
- package/dist/components/htmlEditorControls/AlignJustify.js +4 -4
- package/dist/components/htmlEditorControls/AlignLeft.js +4 -4
- package/dist/components/htmlEditorControls/AlignRight.js +4 -4
- package/dist/components/htmlEditorControls/Bold.js +4 -4
- package/dist/components/htmlEditorControls/BulletList.js +4 -4
- package/dist/components/htmlEditorControls/CharacterCount.js +3 -3
- package/dist/components/htmlEditorControls/ClearFormatting.js +4 -4
- package/dist/components/htmlEditorControls/CodeBlock.js +3 -3
- package/dist/components/htmlEditorControls/ControlGroup.js +2 -2
- package/dist/components/htmlEditorControls/ControlSpacer.js +2 -2
- package/dist/components/htmlEditorControls/CreateLink.js +3 -3
- package/dist/components/htmlEditorControls/DropdownControl.js +3 -3
- package/dist/components/htmlEditorControls/FormatBlock.js +4 -4
- package/dist/components/htmlEditorControls/HtmlEditorControl.js +2 -2
- package/dist/components/htmlEditorControls/InlineCode.js +3 -3
- package/dist/components/htmlEditorControls/InsertTable.js +3 -3
- package/dist/components/htmlEditorControls/Italic.js +4 -4
- package/dist/components/htmlEditorControls/Mode.js +3 -3
- package/dist/components/htmlEditorControls/NumberList.js +4 -4
- package/dist/components/htmlEditorControls/Strikethrough.js +4 -4
- package/dist/components/htmlEditorControls/TextBackgroundColor.js +6 -6
- package/dist/components/htmlEditorControls/TextColor.js +7 -7
- package/dist/components/htmlEditorControls/Underline.js +4 -4
- package/dist/components/htmlEditorControls/WordCount.js +3 -3
- package/dist/components/htmlEditorNodes/HtmlComment.js +24 -0
- package/dist/components/tableControls/DeleteRecord.js +2 -2
- package/dist/components/tableControls/DeleteSelected.js +2 -2
- package/dist/components/tableControls/Edit.js +4 -4
- package/dist/components/tableControls/ExportCSV.js +2 -2
- package/dist/components/tableControls/ExportJson.js +2 -2
- package/dist/components/tableControls/FieldSortHide.js +4 -4
- package/dist/components/tableControls/Filters.js +17 -17
- package/dist/components/tableControls/FirstPage.js +2 -2
- package/dist/components/tableControls/HiddenCount.js +2 -2
- package/dist/components/tableControls/Hide.js +2 -2
- package/dist/components/tableControls/LastPage.js +2 -2
- package/dist/components/tableControls/NextPage.js +2 -2
- package/dist/components/tableControls/PageSelect.js +4 -4
- package/dist/components/tableControls/PageSize.js +3 -3
- package/dist/components/tableControls/PrevPage.js +2 -2
- package/dist/components/tableControls/Search.js +2 -2
- package/dist/components/tableControls/ShowAll.js +2 -2
- package/dist/components/tableControls/TableControl.js +2 -2
- package/dist/utils/context.js +1 -1
- package/dist/utils/debounce.js +1 -1
- package/dist/utils/object.js +1 -1
- package/dist/utils/theme.js +1 -1
- package/dist/utils/wait.js +0 -1
- package/docs/components/accordion.html +2 -0
- package/docs/components/aside.html +9 -8
- package/docs/components/card.html +2 -0
- package/docs/components/color-picker.html +2 -0
- package/docs/components/content-slider.html +2 -0
- package/docs/components/context.html +2 -0
- package/docs/components/dialog.html +2 -0
- package/docs/components/dropdown.html +2 -0
- package/docs/components/filter-list.html +2 -0
- package/docs/components/focus-capture.html +2 -0
- package/docs/components/html-editor.html +54 -6
- package/docs/components/hybrid-component.html +2 -0
- package/docs/components/icon.html +2 -0
- package/docs/components/import.html +2 -0
- package/docs/components/light-component.html +2 -0
- package/docs/components/nav-spacer.html +315 -0
- package/docs/components/nav.html +2 -0
- package/docs/components/photo-viewer.html +2 -0
- package/docs/components/resize.html +2 -0
- package/docs/components/shadow-component.html +2 -0
- package/docs/components/show-more.html +2 -0
- package/docs/components/sortable.html +2 -0
- package/docs/components/spinner.html +2 -0
- package/docs/components/split.html +2 -0
- package/docs/components/table.html +2 -0
- package/docs/components/tableControls.html +2 -0
- package/docs/components/tableCustomFields.html +2 -0
- package/docs/components/tableFetchRecords.html +2 -0
- package/docs/components/tableFieldSortHide.html +2 -0
- package/docs/components/tablePagination.html +2 -0
- package/docs/components/tablePlaceholder.html +2 -0
- package/docs/components/tableRecordEditing.html +2 -0
- package/docs/components/tableRecordFiltering.html +2 -0
- package/docs/components/tableRecordHiding.html +2 -0
- package/docs/components/tableRecordSearching.html +2 -0
- package/docs/components/tableRecordSelection.html +2 -0
- package/docs/components/tableRowControls.html +2 -0
- package/docs/components/tableServerSync.html +2 -0
- package/docs/components/tableSorting.html +2 -0
- package/docs/components/tabs.html +2 -0
- package/docs/components/tags.html +2 -0
- package/docs/components/theme-select.html +2 -0
- package/docs/components/theme-switcher.html +2 -0
- package/docs/components/timestamp.html +2 -0
- package/docs/components/toast.html +2 -0
- package/docs/components/toggle.html +2 -0
- package/docs/components/tree.html +2 -0
- package/docs/icons/comment.svg +1 -0
- package/docs/index.html +8 -0
- package/docs/src/components/Accordion.js +5 -5
- package/docs/src/components/Aside.js +16 -16
- package/docs/src/components/Card.js +3 -3
- package/docs/src/components/ColorPicker.js +4 -4
- package/docs/src/components/ContentSlider.js +3 -3
- package/docs/src/components/Context.js +1 -1
- package/docs/src/components/Dialog.js +7 -7
- package/docs/src/components/Dropdown.js +7 -4
- package/docs/src/components/FilterItem.js +2 -2
- package/docs/src/components/FilterList.js +2 -2
- package/docs/src/components/FocusCapture.js +2 -2
- package/docs/src/components/HtmlEditor.js +62 -39
- package/docs/src/components/HybridComponent.js +1 -1
- package/docs/src/components/Icon.js +2 -2
- package/docs/src/components/Import.js +1 -1
- package/docs/src/components/LightComponent.js +1 -1
- package/docs/src/components/Main.js +3 -3
- package/docs/src/components/Nav.js +2 -2
- package/docs/src/components/NavSpacer.js +6 -0
- package/docs/src/components/PhotoViewer.js +3 -3
- package/docs/src/components/Resize.js +3 -3
- package/docs/src/components/ShadowComponent.js +1 -1
- package/docs/src/components/ShowMore.js +3 -3
- package/docs/src/components/Sortable.js +3 -3
- package/docs/src/components/Spinner.js +2 -2
- package/docs/src/components/Split.js +3 -3
- package/docs/src/components/Table.js +27 -27
- package/docs/src/components/Tabs.js +7 -7
- package/docs/src/components/Tags.js +4 -4
- package/docs/src/components/ThemeSelect.js +4 -4
- package/docs/src/components/ThemeSwitcher.js +5 -5
- package/docs/src/components/Timestamp.js +1 -1
- package/docs/src/components/Toast.js +3 -3
- package/docs/src/components/Toggle.js +3 -3
- package/docs/src/components/Tree.js +10 -10
- package/docs/src/components/htmlEditorControls/AlignCenter.js +4 -4
- package/docs/src/components/htmlEditorControls/AlignJustify.js +4 -4
- package/docs/src/components/htmlEditorControls/AlignLeft.js +4 -4
- package/docs/src/components/htmlEditorControls/AlignRight.js +4 -4
- package/docs/src/components/htmlEditorControls/Bold.js +4 -4
- package/docs/src/components/htmlEditorControls/BulletList.js +4 -4
- package/docs/src/components/htmlEditorControls/CharacterCount.js +3 -3
- package/docs/src/components/htmlEditorControls/ClearFormatting.js +4 -4
- package/docs/src/components/htmlEditorControls/CodeBlock.js +3 -3
- package/docs/src/components/htmlEditorControls/ControlGroup.js +2 -2
- package/docs/src/components/htmlEditorControls/ControlSpacer.js +2 -2
- package/docs/src/components/htmlEditorControls/CreateLink.js +3 -3
- package/docs/src/components/htmlEditorControls/DropdownControl.js +3 -3
- package/docs/src/components/htmlEditorControls/FormatBlock.js +4 -4
- package/docs/src/components/htmlEditorControls/HtmlEditorControl.js +2 -2
- package/docs/src/components/htmlEditorControls/InlineCode.js +3 -3
- package/docs/src/components/htmlEditorControls/InsertTable.js +3 -3
- package/docs/src/components/htmlEditorControls/Italic.js +4 -4
- package/docs/src/components/htmlEditorControls/Mode.js +3 -3
- package/docs/src/components/htmlEditorControls/NumberList.js +4 -4
- package/docs/src/components/htmlEditorControls/Strikethrough.js +4 -4
- package/docs/src/components/htmlEditorControls/TextBackgroundColor.js +6 -6
- package/docs/src/components/htmlEditorControls/TextColor.js +7 -7
- package/docs/src/components/htmlEditorControls/Underline.js +4 -4
- package/docs/src/components/htmlEditorControls/WordCount.js +3 -3
- package/docs/src/components/htmlEditorNodes/HtmlComment.js +24 -0
- package/docs/src/components/tableControls/DeleteRecord.js +2 -2
- package/docs/src/components/tableControls/DeleteSelected.js +2 -2
- package/docs/src/components/tableControls/Edit.js +4 -4
- package/docs/src/components/tableControls/ExportCSV.js +2 -2
- package/docs/src/components/tableControls/ExportJson.js +2 -2
- package/docs/src/components/tableControls/FieldSortHide.js +4 -4
- package/docs/src/components/tableControls/Filters.js +17 -17
- package/docs/src/components/tableControls/FirstPage.js +2 -2
- package/docs/src/components/tableControls/HiddenCount.js +2 -2
- package/docs/src/components/tableControls/Hide.js +2 -2
- package/docs/src/components/tableControls/LastPage.js +2 -2
- package/docs/src/components/tableControls/NextPage.js +2 -2
- package/docs/src/components/tableControls/PageSelect.js +4 -4
- package/docs/src/components/tableControls/PageSize.js +3 -3
- package/docs/src/components/tableControls/PrevPage.js +2 -2
- package/docs/src/components/tableControls/Search.js +2 -2
- package/docs/src/components/tableControls/ShowAll.js +2 -2
- package/docs/src/components/tableControls/TableControl.js +2 -2
- package/docs/src/utils/context.js +1 -1
- package/docs/src/utils/debounce.js +1 -1
- package/docs/src/utils/object.js +1 -1
- package/docs/src/utils/theme.js +1 -1
- package/docs/src/utils/wait.js +0 -1
- package/docs/utils/context.html +2 -0
- package/docs/utils/cookie.html +2 -0
- package/docs/utils/debounce.html +2 -0
- package/docs/utils/drag.html +2 -0
- package/docs/utils/elevation.html +2 -0
- package/docs/utils/formatTimestamp.html +2 -0
- package/docs/utils/object.html +2 -0
- package/docs/utils/propConverters.html +2 -0
- package/docs/utils/string.html +2 -0
- package/docs/utils/theme.html +2 -0
- package/docs/utils/toTitleCase.html +2 -0
- package/docs/utils/type.html +2 -0
- package/docs/utils/wait.html +2 -0
- package/docs-src/components/aside.page.html +7 -8
- package/docs-src/components/html-editor.page.html +52 -6
- package/docs-src/components/nav-spacer.page.html +65 -0
- package/docs-src/index.page.html +6 -0
- package/docs-src/nav.fragment.html +2 -0
- package/icons/comment.svg +1 -0
- package/llm.txt +1 -0
- package/package.json +1 -1
- package/scripts/build.js +1 -1
- package/src/components/Accordion.js +1 -1
- package/src/components/Dropdown.js +7 -3
- package/src/components/HtmlEditor.js +699 -1206
- package/src/components/NavSpacer.js +55 -0
- package/src/components/htmlEditorControls/AlignCenter.js +5 -5
- package/src/components/htmlEditorControls/AlignJustify.js +5 -5
- package/src/components/htmlEditorControls/AlignLeft.js +5 -5
- package/src/components/htmlEditorControls/AlignRight.js +5 -5
- package/src/components/htmlEditorControls/Bold.js +5 -5
- package/src/components/htmlEditorControls/BulletList.js +5 -5
- package/src/components/htmlEditorControls/ClearFormatting.js +5 -5
- package/src/components/htmlEditorControls/CodeBlock.js +16 -8
- package/src/components/htmlEditorControls/CreateLink.js +3 -7
- package/src/components/htmlEditorControls/FormatBlock.js +5 -5
- package/src/components/htmlEditorControls/InlineCode.js +1 -13
- package/src/components/htmlEditorControls/InsertTable.js +43 -44
- package/src/components/htmlEditorControls/Italic.js +5 -5
- package/src/components/htmlEditorControls/Mode.js +1 -1
- package/src/components/htmlEditorControls/NumberList.js +5 -5
- package/src/components/htmlEditorControls/Strikethrough.js +5 -5
- package/src/components/htmlEditorControls/Underline.js +5 -5
- package/src/components/htmlEditorNodes/HtmlComment.js +118 -0
- package/tests/components/Accordion.browser-test.js +154 -0
- package/tests/components/Dropdown.browser-test.js +85 -0
- package/tests/components/HtmlComment.browser-test.js +115 -0
- package/tests/components/HtmlEditor.browser-test.js +379 -0
- package/tests/components/NavSpacer.browser-test.js +81 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import ShadowComponent from './ShadowComponent.js';
|
|
2
|
+
import { html, css } from '../lit-all.min.js';
|
|
3
|
+
|
|
4
|
+
export default class NavSpacer extends ShadowComponent {
|
|
5
|
+
#resizeObserver = null;
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
Lifecycle Callbacks
|
|
9
|
+
*/
|
|
10
|
+
connectedCallback() {
|
|
11
|
+
super.connectedCallback();
|
|
12
|
+
this.#observe();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
disconnectedCallback() {
|
|
16
|
+
super.disconnectedCallback();
|
|
17
|
+
this.#resizeObserver?.disconnect();
|
|
18
|
+
this.#resizeObserver = null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/*
|
|
22
|
+
Utility Functions
|
|
23
|
+
*/
|
|
24
|
+
#observe() {
|
|
25
|
+
this.#resizeObserver?.disconnect();
|
|
26
|
+
const nav = document.querySelector('k-nav[fixed]');
|
|
27
|
+
if(!nav) {
|
|
28
|
+
this.style.height = '0px';
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.#resizeObserver = new ResizeObserver(entries => {
|
|
32
|
+
this.style.height = `${entries[0].contentRect.height}px`;
|
|
33
|
+
});
|
|
34
|
+
this.#resizeObserver.observe(nav);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/*
|
|
38
|
+
Rendering
|
|
39
|
+
*/
|
|
40
|
+
render() {
|
|
41
|
+
return html``;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
Styles
|
|
46
|
+
*/
|
|
47
|
+
static styles = css`
|
|
48
|
+
:host {
|
|
49
|
+
display: block;
|
|
50
|
+
margin-bottom: var(--spacer);
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
customElements.define('k-nav-spacer', NavSpacer);
|
|
@@ -31,10 +31,10 @@ export default class AlignCenter extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.alignCenter();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class AlignCenter extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_align_center"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -31,10 +31,10 @@ export default class AlignJustify extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.alignJustify();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class AlignJustify extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_align_justify"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -31,10 +31,10 @@ export default class AlignLeft extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.alignLeft();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class AlignLeft extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_align_left"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -31,10 +31,10 @@ export default class AlignRight extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.alignRight();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class AlignRight extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_align_right"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -31,10 +31,10 @@ export default class Bold extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.bold();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class Bold extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_bold"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -31,10 +31,10 @@ export default class BulletList extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.unorderedList();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class BulletList extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_list_bulleted"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -31,10 +31,10 @@ export default class ClearFormatting extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.removeFormat();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class ClearFormatting extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_clear"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -32,18 +32,26 @@ export default class CodeBlock extends HtmlEditorControl {
|
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
34
|
handleMouseDown = (e) => {
|
|
35
|
-
const savedSelection = window.getSelection()?.toString();
|
|
36
35
|
e.preventDefault();
|
|
37
36
|
e.stopPropagation();
|
|
38
|
-
if(this.editor)
|
|
39
|
-
|
|
40
|
-
this.editor.wrapSelection('<pre>', '</pre>', savedSelection);
|
|
41
|
-
} else {
|
|
42
|
-
this.editor.formatBlock('pre');
|
|
43
|
-
}
|
|
44
|
-
}
|
|
37
|
+
if(!this.editor) return;
|
|
38
|
+
this.editor.formatBlock(this.isInCodeBlock() ? 'p' : 'pre');
|
|
45
39
|
};
|
|
46
40
|
|
|
41
|
+
isInCodeBlock() {
|
|
42
|
+
if(!this.editor?.lexicalEditor) return false;
|
|
43
|
+
let result = false;
|
|
44
|
+
const { lexical, code } = this.editor.lx;
|
|
45
|
+
this.editor.lexicalEditor.getEditorState().read(() => {
|
|
46
|
+
const sel = lexical.$getSelection();
|
|
47
|
+
if(!lexical.$isRangeSelection(sel)) return;
|
|
48
|
+
const node = sel.anchor.getNode();
|
|
49
|
+
const topLevel = node.getTopLevelElementOrThrow();
|
|
50
|
+
result = code.$isCodeNode(topLevel);
|
|
51
|
+
});
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
|
|
47
55
|
/*
|
|
48
56
|
Utility Functions
|
|
49
57
|
*/
|
|
@@ -77,14 +77,10 @@ export default class CreateLink extends HtmlEditorControl {
|
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
linkEl.textContent = text || url;
|
|
83
|
-
|
|
84
|
-
if(this.editor.selection){
|
|
85
|
-
this.editor.replaceSelectionWithElement(linkEl, true);
|
|
80
|
+
if(this.editor.selection && (!text || text === selectedText)){
|
|
81
|
+
this.editor.createLink(url);
|
|
86
82
|
} else {
|
|
87
|
-
this.editor.
|
|
83
|
+
this.editor.createLinkWithText(url, text || url);
|
|
88
84
|
}
|
|
89
85
|
}
|
|
90
86
|
});
|
|
@@ -42,10 +42,10 @@ export default class FormatBlock extends HtmlEditorControl {
|
|
|
42
42
|
/*
|
|
43
43
|
Event Handlers
|
|
44
44
|
*/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
handleMouseDown = (e) => {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
e.stopPropagation();
|
|
48
|
+
if(this.editor) this.editor.formatBlock(this.tag);
|
|
49
49
|
};
|
|
50
50
|
|
|
51
51
|
/*
|
|
@@ -66,7 +66,7 @@ export default class FormatBlock extends HtmlEditorControl {
|
|
|
66
66
|
const iconName = this.getDefaultIcon();
|
|
67
67
|
|
|
68
68
|
return html`
|
|
69
|
-
<button class="${this.buttonClasses}" @
|
|
69
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
70
70
|
<slot name="icon">
|
|
71
71
|
<k-icon name="${iconName}"></k-icon>
|
|
72
72
|
</slot>
|
|
@@ -32,21 +32,9 @@ export default class InlineCode extends HtmlEditorControl {
|
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
34
|
handleMouseDown = (e) => {
|
|
35
|
-
if(!this.editor) return;
|
|
36
|
-
|
|
37
35
|
e.preventDefault();
|
|
38
36
|
e.stopPropagation();
|
|
39
|
-
|
|
40
|
-
const codeEl = document.createElement('code');
|
|
41
|
-
|
|
42
|
-
const markerData = this.editor.getValueWithSelectionMarkers();
|
|
43
|
-
if(markerData.hasSelection){
|
|
44
|
-
codeEl.textContent = markerData.selectedText;
|
|
45
|
-
this.editor.replaceSelectionWithElement(codeEl, true);
|
|
46
|
-
} else {
|
|
47
|
-
codeEl.textContent = '\u200B';
|
|
48
|
-
this.editor.insertElementAtCursor(codeEl, true);
|
|
49
|
-
}
|
|
37
|
+
if(this.editor) this.editor.lexicalFormat('code');
|
|
50
38
|
};
|
|
51
39
|
|
|
52
40
|
/*
|
|
@@ -36,54 +36,45 @@ export default class InsertTable extends HtmlEditorControl {
|
|
|
36
36
|
e.preventDefault();
|
|
37
37
|
e.stopPropagation();
|
|
38
38
|
|
|
39
|
-
// Check if cursor is in a table
|
|
40
|
-
|
|
41
|
-
let currentTable = null;
|
|
42
|
-
let cellData = null;
|
|
43
|
-
|
|
44
|
-
if(sel.rangeCount){
|
|
45
|
-
let node = sel.getRangeAt(0).startContainer;
|
|
46
|
-
if(node.nodeType === Node.TEXT_NODE){
|
|
47
|
-
node = node.parentElement;
|
|
48
|
-
}
|
|
49
|
-
currentTable = node.closest('table');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Determine if we're editing or inserting
|
|
53
|
-
const isEditing = !!currentTable;
|
|
39
|
+
// Check if cursor is in a table using Lexical
|
|
40
|
+
let isEditing = false;
|
|
54
41
|
let defaultRows = 3;
|
|
55
42
|
let defaultCols = 3;
|
|
56
43
|
let defaultHeaders = true;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
44
|
+
let cellData = null;
|
|
45
|
+
let tableNodeKey = null;
|
|
46
|
+
|
|
47
|
+
if(this.editor.lexicalEditor){
|
|
48
|
+
const { lexical, table } = this.editor.lx;
|
|
49
|
+
this.editor.lexicalEditor.getEditorState().read(() => {
|
|
50
|
+
const sel = lexical.$getSelection();
|
|
51
|
+
if(!lexical.$isRangeSelection(sel)) return;
|
|
52
|
+
let node = sel.anchor.getNode();
|
|
53
|
+
while(node){
|
|
54
|
+
if(table.$isTableNode(node)){
|
|
55
|
+
isEditing = true;
|
|
56
|
+
tableNodeKey = node.getKey();
|
|
57
|
+
cellData = [];
|
|
58
|
+
const rows = node.getChildren();
|
|
59
|
+
let hasHeaders = false;
|
|
60
|
+
rows.forEach((row, rowIndex) => {
|
|
61
|
+
const rowData = [];
|
|
62
|
+
row.getChildren().forEach(cell => {
|
|
63
|
+
if(rowIndex === 0 && table.$isTableCellNode(cell) && cell.getHeaderStyles() === table.TableCellHeaderStates.ROW){
|
|
64
|
+
hasHeaders = true;
|
|
65
|
+
}
|
|
66
|
+
rowData.push(cell.getTextContent());
|
|
67
|
+
});
|
|
68
|
+
cellData.push(rowData);
|
|
69
|
+
if(rowData.length > defaultCols) defaultCols = rowData.length;
|
|
70
|
+
});
|
|
71
|
+
defaultHeaders = hasHeaders;
|
|
72
|
+
defaultRows = hasHeaders ? rows.length - 1 : rows.length;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
node = node.getParent();
|
|
76
|
+
}
|
|
80
77
|
});
|
|
81
|
-
|
|
82
|
-
defaultRows = bodyRows.length;
|
|
83
|
-
defaultHeaders = hasHeaders;
|
|
84
|
-
|
|
85
|
-
// Remove the existing table
|
|
86
|
-
currentTable.remove();
|
|
87
78
|
}
|
|
88
79
|
|
|
89
80
|
// Create dialog inputs
|
|
@@ -134,6 +125,14 @@ export default class InsertTable extends HtmlEditorControl {
|
|
|
134
125
|
const cols = parseInt(colsInput.value) || 3;
|
|
135
126
|
const includeHeaders = headersCheckbox.checked;
|
|
136
127
|
|
|
128
|
+
if(isEditing && tableNodeKey){
|
|
129
|
+
const { lexical } = this.editor.lx;
|
|
130
|
+
this.editor.lexicalEditor.update(() => {
|
|
131
|
+
const tableNode = lexical.$getNodeByKey(tableNodeKey);
|
|
132
|
+
if(tableNode) tableNode.remove();
|
|
133
|
+
}, { discrete: true });
|
|
134
|
+
}
|
|
135
|
+
|
|
137
136
|
this.editor.insertTable(rows, cols, includeHeaders, cellData);
|
|
138
137
|
}
|
|
139
138
|
});
|
|
@@ -31,10 +31,10 @@ export default class Italic extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.italic();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class Italic extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_italic"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -31,10 +31,10 @@ export default class NumberList extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.orderedList();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class NumberList extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_list_numbered"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -31,10 +31,10 @@ export default class Strikethrough extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.strikethrough();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class Strikethrough extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="strikethrough_s"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -31,10 +31,10 @@ export default class Underline extends HtmlEditorControl {
|
|
|
31
31
|
/*
|
|
32
32
|
Event Handlers
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
handleMouseDown = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
if(this.editor) this.editor.underline();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
/*
|
|
@@ -52,7 +52,7 @@ export default class Underline extends HtmlEditorControl {
|
|
|
52
52
|
this.hidden = this.editorMode === 'code';
|
|
53
53
|
|
|
54
54
|
return html`
|
|
55
|
-
<button class="${this.buttonClasses}" @
|
|
55
|
+
<button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
|
|
56
56
|
<slot name="icon">
|
|
57
57
|
<k-icon name="format_underlined"></k-icon>
|
|
58
58
|
</slot>
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { html, render } from '../../lit-all.min.js';
|
|
2
|
+
import '../Icon.js';
|
|
3
|
+
import '../Dropdown.js';
|
|
4
|
+
const LEXICAL_VERSION = '0.43.0';
|
|
5
|
+
const { DecoratorNode, $applyNodeReplacement, $getNodeByKey } = await import(`https://esm.sh/lexical@${LEXICAL_VERSION}`);
|
|
6
|
+
|
|
7
|
+
class HtmlCommentLexicalNode extends DecoratorNode {
|
|
8
|
+
static getType() { return 'html-comment'; }
|
|
9
|
+
|
|
10
|
+
static clone(node) { return new HtmlCommentLexicalNode(node.__comment, node.__key); }
|
|
11
|
+
|
|
12
|
+
static isVisualCompatible(domNode) {
|
|
13
|
+
return domNode.nodeType === Node.COMMENT_NODE;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
static preprocessHtml(htmlString) {
|
|
17
|
+
return htmlString.replace(/<!--(.*?)-->/gs, (_, text) => `<span data-html-comment="${text.replace(/"/g, '"')}"></span>`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static importDOM() {
|
|
21
|
+
return {
|
|
22
|
+
span: domNode => {
|
|
23
|
+
if(!domNode.hasAttribute('data-html-comment')) return null;
|
|
24
|
+
return {
|
|
25
|
+
conversion: n => ({ node: $createHtmlCommentNode(n.getAttribute('data-html-comment') || '') }),
|
|
26
|
+
priority: 2
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static importJSON(json) { return $createHtmlCommentNode(json.comment || ''); }
|
|
33
|
+
|
|
34
|
+
constructor(comment = '', key) {
|
|
35
|
+
super(key);
|
|
36
|
+
this.__comment = comment;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
getComment() { return this.getLatest().__comment; }
|
|
40
|
+
|
|
41
|
+
setComment(comment) {
|
|
42
|
+
const self = this.getWritable();
|
|
43
|
+
self.__comment = comment;
|
|
44
|
+
return self;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
createDOM(config, editor) {
|
|
48
|
+
const container = document.createElement('span');
|
|
49
|
+
const key = this.__key;
|
|
50
|
+
render(html`
|
|
51
|
+
<k-dropdown close-on-select="false" open-direction="down left"
|
|
52
|
+
contenteditable="false"
|
|
53
|
+
data-html-comment=${this.__comment}
|
|
54
|
+
title=${this.__comment || 'HTML Comment (empty)'}
|
|
55
|
+
@mousedown=${e => e.stopPropagation()}
|
|
56
|
+
>
|
|
57
|
+
<k-icon slot="trigger" name="comment" class="tc-muted"
|
|
58
|
+
style="cursor:pointer"
|
|
59
|
+
@mousedown=${e => { e.preventDefault(); e.stopPropagation(); }}
|
|
60
|
+
></k-icon>
|
|
61
|
+
<div class="pq">
|
|
62
|
+
<div class="small tc-muted mbh">HTML Comment</div>
|
|
63
|
+
<textarea class="ff-mono full p0"
|
|
64
|
+
style="resize: both"
|
|
65
|
+
.value=${this.__comment}
|
|
66
|
+
@input=${e => {
|
|
67
|
+
const host = e.target.closest('[data-html-comment]');
|
|
68
|
+
if(host) { host.setAttribute('data-html-comment', e.target.value); host.title = e.target.value; }
|
|
69
|
+
}}
|
|
70
|
+
@blur=${e => {
|
|
71
|
+
editor.update(() => {
|
|
72
|
+
const node = $getNodeByKey(key);
|
|
73
|
+
if(node) node.setComment(e.target.value);
|
|
74
|
+
});
|
|
75
|
+
}}
|
|
76
|
+
@keydown=${e => e.stopPropagation()}
|
|
77
|
+
@beforeinput=${e => e.stopPropagation()}
|
|
78
|
+
></textarea>
|
|
79
|
+
</div>
|
|
80
|
+
</k-dropdown>
|
|
81
|
+
`, container);
|
|
82
|
+
return container.firstElementChild;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
updateDOM(prevNode, dom) {
|
|
86
|
+
if(prevNode.__comment !== this.__comment){
|
|
87
|
+
dom.setAttribute('data-html-comment', this.__comment);
|
|
88
|
+
dom.title = this.__comment || 'HTML Comment (empty)';
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
exportDOM() {
|
|
94
|
+
return { element: document.createComment(this.__comment) };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
exportJSON() {
|
|
98
|
+
return { ...super.exportJSON(), type: 'html-comment', comment: this.__comment };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
isInline() { return true; }
|
|
102
|
+
|
|
103
|
+
isKeyboardSelectable() { return true; }
|
|
104
|
+
|
|
105
|
+
decorate() { return null; }
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const $createHtmlCommentNode = (comment = '') => $applyNodeReplacement(new HtmlCommentLexicalNode(comment));
|
|
109
|
+
|
|
110
|
+
const $isHtmlCommentNode = node => node instanceof HtmlCommentLexicalNode;
|
|
111
|
+
|
|
112
|
+
export { HtmlCommentLexicalNode, $createHtmlCommentNode, $isHtmlCommentNode };
|
|
113
|
+
|
|
114
|
+
export default class HenHtmlComment extends HTMLElement {
|
|
115
|
+
static lexicalNode = HtmlCommentLexicalNode;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
customElements.define('k-hen-html-comment', HenHtmlComment);
|