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.
Files changed (266) hide show
  1. package/dist/components/Accordion.js +5 -5
  2. package/dist/components/Aside.js +16 -16
  3. package/dist/components/Card.js +3 -3
  4. package/dist/components/ColorPicker.js +4 -4
  5. package/dist/components/ContentSlider.js +3 -3
  6. package/dist/components/Context.js +1 -1
  7. package/dist/components/Dialog.js +7 -7
  8. package/dist/components/Dropdown.js +7 -4
  9. package/dist/components/FilterItem.js +2 -2
  10. package/dist/components/FilterList.js +2 -2
  11. package/dist/components/FocusCapture.js +2 -2
  12. package/dist/components/HtmlEditor.js +62 -39
  13. package/dist/components/HybridComponent.js +1 -1
  14. package/dist/components/Icon.js +2 -2
  15. package/dist/components/Import.js +1 -1
  16. package/dist/components/LightComponent.js +1 -1
  17. package/dist/components/Main.js +3 -3
  18. package/dist/components/Nav.js +2 -2
  19. package/dist/components/NavSpacer.js +6 -0
  20. package/dist/components/PhotoViewer.js +3 -3
  21. package/dist/components/Resize.js +3 -3
  22. package/dist/components/ShadowComponent.js +1 -1
  23. package/dist/components/ShowMore.js +3 -3
  24. package/dist/components/Sortable.js +3 -3
  25. package/dist/components/Spinner.js +2 -2
  26. package/dist/components/Split.js +3 -3
  27. package/dist/components/Table.js +27 -27
  28. package/dist/components/Tabs.js +7 -7
  29. package/dist/components/Tags.js +4 -4
  30. package/dist/components/ThemeSelect.js +4 -4
  31. package/dist/components/ThemeSwitcher.js +5 -5
  32. package/dist/components/Timestamp.js +1 -1
  33. package/dist/components/Toast.js +3 -3
  34. package/dist/components/Toggle.js +3 -3
  35. package/dist/components/Tree.js +10 -10
  36. package/dist/components/htmlEditorControls/AlignCenter.js +4 -4
  37. package/dist/components/htmlEditorControls/AlignJustify.js +4 -4
  38. package/dist/components/htmlEditorControls/AlignLeft.js +4 -4
  39. package/dist/components/htmlEditorControls/AlignRight.js +4 -4
  40. package/dist/components/htmlEditorControls/Bold.js +4 -4
  41. package/dist/components/htmlEditorControls/BulletList.js +4 -4
  42. package/dist/components/htmlEditorControls/CharacterCount.js +3 -3
  43. package/dist/components/htmlEditorControls/ClearFormatting.js +4 -4
  44. package/dist/components/htmlEditorControls/CodeBlock.js +3 -3
  45. package/dist/components/htmlEditorControls/ControlGroup.js +2 -2
  46. package/dist/components/htmlEditorControls/ControlSpacer.js +2 -2
  47. package/dist/components/htmlEditorControls/CreateLink.js +3 -3
  48. package/dist/components/htmlEditorControls/DropdownControl.js +3 -3
  49. package/dist/components/htmlEditorControls/FormatBlock.js +4 -4
  50. package/dist/components/htmlEditorControls/HtmlEditorControl.js +2 -2
  51. package/dist/components/htmlEditorControls/InlineCode.js +3 -3
  52. package/dist/components/htmlEditorControls/InsertTable.js +3 -3
  53. package/dist/components/htmlEditorControls/Italic.js +4 -4
  54. package/dist/components/htmlEditorControls/Mode.js +3 -3
  55. package/dist/components/htmlEditorControls/NumberList.js +4 -4
  56. package/dist/components/htmlEditorControls/Strikethrough.js +4 -4
  57. package/dist/components/htmlEditorControls/TextBackgroundColor.js +6 -6
  58. package/dist/components/htmlEditorControls/TextColor.js +7 -7
  59. package/dist/components/htmlEditorControls/Underline.js +4 -4
  60. package/dist/components/htmlEditorControls/WordCount.js +3 -3
  61. package/dist/components/htmlEditorNodes/HtmlComment.js +24 -0
  62. package/dist/components/tableControls/DeleteRecord.js +2 -2
  63. package/dist/components/tableControls/DeleteSelected.js +2 -2
  64. package/dist/components/tableControls/Edit.js +4 -4
  65. package/dist/components/tableControls/ExportCSV.js +2 -2
  66. package/dist/components/tableControls/ExportJson.js +2 -2
  67. package/dist/components/tableControls/FieldSortHide.js +4 -4
  68. package/dist/components/tableControls/Filters.js +17 -17
  69. package/dist/components/tableControls/FirstPage.js +2 -2
  70. package/dist/components/tableControls/HiddenCount.js +2 -2
  71. package/dist/components/tableControls/Hide.js +2 -2
  72. package/dist/components/tableControls/LastPage.js +2 -2
  73. package/dist/components/tableControls/NextPage.js +2 -2
  74. package/dist/components/tableControls/PageSelect.js +4 -4
  75. package/dist/components/tableControls/PageSize.js +3 -3
  76. package/dist/components/tableControls/PrevPage.js +2 -2
  77. package/dist/components/tableControls/Search.js +2 -2
  78. package/dist/components/tableControls/ShowAll.js +2 -2
  79. package/dist/components/tableControls/TableControl.js +2 -2
  80. package/dist/utils/context.js +1 -1
  81. package/dist/utils/debounce.js +1 -1
  82. package/dist/utils/object.js +1 -1
  83. package/dist/utils/theme.js +1 -1
  84. package/dist/utils/wait.js +0 -1
  85. package/docs/components/accordion.html +2 -0
  86. package/docs/components/aside.html +9 -8
  87. package/docs/components/card.html +2 -0
  88. package/docs/components/color-picker.html +2 -0
  89. package/docs/components/content-slider.html +2 -0
  90. package/docs/components/context.html +2 -0
  91. package/docs/components/dialog.html +2 -0
  92. package/docs/components/dropdown.html +2 -0
  93. package/docs/components/filter-list.html +2 -0
  94. package/docs/components/focus-capture.html +2 -0
  95. package/docs/components/html-editor.html +54 -6
  96. package/docs/components/hybrid-component.html +2 -0
  97. package/docs/components/icon.html +2 -0
  98. package/docs/components/import.html +2 -0
  99. package/docs/components/light-component.html +2 -0
  100. package/docs/components/nav-spacer.html +315 -0
  101. package/docs/components/nav.html +2 -0
  102. package/docs/components/photo-viewer.html +2 -0
  103. package/docs/components/resize.html +2 -0
  104. package/docs/components/shadow-component.html +2 -0
  105. package/docs/components/show-more.html +2 -0
  106. package/docs/components/sortable.html +2 -0
  107. package/docs/components/spinner.html +2 -0
  108. package/docs/components/split.html +2 -0
  109. package/docs/components/table.html +2 -0
  110. package/docs/components/tableControls.html +2 -0
  111. package/docs/components/tableCustomFields.html +2 -0
  112. package/docs/components/tableFetchRecords.html +2 -0
  113. package/docs/components/tableFieldSortHide.html +2 -0
  114. package/docs/components/tablePagination.html +2 -0
  115. package/docs/components/tablePlaceholder.html +2 -0
  116. package/docs/components/tableRecordEditing.html +2 -0
  117. package/docs/components/tableRecordFiltering.html +2 -0
  118. package/docs/components/tableRecordHiding.html +2 -0
  119. package/docs/components/tableRecordSearching.html +2 -0
  120. package/docs/components/tableRecordSelection.html +2 -0
  121. package/docs/components/tableRowControls.html +2 -0
  122. package/docs/components/tableServerSync.html +2 -0
  123. package/docs/components/tableSorting.html +2 -0
  124. package/docs/components/tabs.html +2 -0
  125. package/docs/components/tags.html +2 -0
  126. package/docs/components/theme-select.html +2 -0
  127. package/docs/components/theme-switcher.html +2 -0
  128. package/docs/components/timestamp.html +2 -0
  129. package/docs/components/toast.html +2 -0
  130. package/docs/components/toggle.html +2 -0
  131. package/docs/components/tree.html +2 -0
  132. package/docs/icons/comment.svg +1 -0
  133. package/docs/index.html +8 -0
  134. package/docs/src/components/Accordion.js +5 -5
  135. package/docs/src/components/Aside.js +16 -16
  136. package/docs/src/components/Card.js +3 -3
  137. package/docs/src/components/ColorPicker.js +4 -4
  138. package/docs/src/components/ContentSlider.js +3 -3
  139. package/docs/src/components/Context.js +1 -1
  140. package/docs/src/components/Dialog.js +7 -7
  141. package/docs/src/components/Dropdown.js +7 -4
  142. package/docs/src/components/FilterItem.js +2 -2
  143. package/docs/src/components/FilterList.js +2 -2
  144. package/docs/src/components/FocusCapture.js +2 -2
  145. package/docs/src/components/HtmlEditor.js +62 -39
  146. package/docs/src/components/HybridComponent.js +1 -1
  147. package/docs/src/components/Icon.js +2 -2
  148. package/docs/src/components/Import.js +1 -1
  149. package/docs/src/components/LightComponent.js +1 -1
  150. package/docs/src/components/Main.js +3 -3
  151. package/docs/src/components/Nav.js +2 -2
  152. package/docs/src/components/NavSpacer.js +6 -0
  153. package/docs/src/components/PhotoViewer.js +3 -3
  154. package/docs/src/components/Resize.js +3 -3
  155. package/docs/src/components/ShadowComponent.js +1 -1
  156. package/docs/src/components/ShowMore.js +3 -3
  157. package/docs/src/components/Sortable.js +3 -3
  158. package/docs/src/components/Spinner.js +2 -2
  159. package/docs/src/components/Split.js +3 -3
  160. package/docs/src/components/Table.js +27 -27
  161. package/docs/src/components/Tabs.js +7 -7
  162. package/docs/src/components/Tags.js +4 -4
  163. package/docs/src/components/ThemeSelect.js +4 -4
  164. package/docs/src/components/ThemeSwitcher.js +5 -5
  165. package/docs/src/components/Timestamp.js +1 -1
  166. package/docs/src/components/Toast.js +3 -3
  167. package/docs/src/components/Toggle.js +3 -3
  168. package/docs/src/components/Tree.js +10 -10
  169. package/docs/src/components/htmlEditorControls/AlignCenter.js +4 -4
  170. package/docs/src/components/htmlEditorControls/AlignJustify.js +4 -4
  171. package/docs/src/components/htmlEditorControls/AlignLeft.js +4 -4
  172. package/docs/src/components/htmlEditorControls/AlignRight.js +4 -4
  173. package/docs/src/components/htmlEditorControls/Bold.js +4 -4
  174. package/docs/src/components/htmlEditorControls/BulletList.js +4 -4
  175. package/docs/src/components/htmlEditorControls/CharacterCount.js +3 -3
  176. package/docs/src/components/htmlEditorControls/ClearFormatting.js +4 -4
  177. package/docs/src/components/htmlEditorControls/CodeBlock.js +3 -3
  178. package/docs/src/components/htmlEditorControls/ControlGroup.js +2 -2
  179. package/docs/src/components/htmlEditorControls/ControlSpacer.js +2 -2
  180. package/docs/src/components/htmlEditorControls/CreateLink.js +3 -3
  181. package/docs/src/components/htmlEditorControls/DropdownControl.js +3 -3
  182. package/docs/src/components/htmlEditorControls/FormatBlock.js +4 -4
  183. package/docs/src/components/htmlEditorControls/HtmlEditorControl.js +2 -2
  184. package/docs/src/components/htmlEditorControls/InlineCode.js +3 -3
  185. package/docs/src/components/htmlEditorControls/InsertTable.js +3 -3
  186. package/docs/src/components/htmlEditorControls/Italic.js +4 -4
  187. package/docs/src/components/htmlEditorControls/Mode.js +3 -3
  188. package/docs/src/components/htmlEditorControls/NumberList.js +4 -4
  189. package/docs/src/components/htmlEditorControls/Strikethrough.js +4 -4
  190. package/docs/src/components/htmlEditorControls/TextBackgroundColor.js +6 -6
  191. package/docs/src/components/htmlEditorControls/TextColor.js +7 -7
  192. package/docs/src/components/htmlEditorControls/Underline.js +4 -4
  193. package/docs/src/components/htmlEditorControls/WordCount.js +3 -3
  194. package/docs/src/components/htmlEditorNodes/HtmlComment.js +24 -0
  195. package/docs/src/components/tableControls/DeleteRecord.js +2 -2
  196. package/docs/src/components/tableControls/DeleteSelected.js +2 -2
  197. package/docs/src/components/tableControls/Edit.js +4 -4
  198. package/docs/src/components/tableControls/ExportCSV.js +2 -2
  199. package/docs/src/components/tableControls/ExportJson.js +2 -2
  200. package/docs/src/components/tableControls/FieldSortHide.js +4 -4
  201. package/docs/src/components/tableControls/Filters.js +17 -17
  202. package/docs/src/components/tableControls/FirstPage.js +2 -2
  203. package/docs/src/components/tableControls/HiddenCount.js +2 -2
  204. package/docs/src/components/tableControls/Hide.js +2 -2
  205. package/docs/src/components/tableControls/LastPage.js +2 -2
  206. package/docs/src/components/tableControls/NextPage.js +2 -2
  207. package/docs/src/components/tableControls/PageSelect.js +4 -4
  208. package/docs/src/components/tableControls/PageSize.js +3 -3
  209. package/docs/src/components/tableControls/PrevPage.js +2 -2
  210. package/docs/src/components/tableControls/Search.js +2 -2
  211. package/docs/src/components/tableControls/ShowAll.js +2 -2
  212. package/docs/src/components/tableControls/TableControl.js +2 -2
  213. package/docs/src/utils/context.js +1 -1
  214. package/docs/src/utils/debounce.js +1 -1
  215. package/docs/src/utils/object.js +1 -1
  216. package/docs/src/utils/theme.js +1 -1
  217. package/docs/src/utils/wait.js +0 -1
  218. package/docs/utils/context.html +2 -0
  219. package/docs/utils/cookie.html +2 -0
  220. package/docs/utils/debounce.html +2 -0
  221. package/docs/utils/drag.html +2 -0
  222. package/docs/utils/elevation.html +2 -0
  223. package/docs/utils/formatTimestamp.html +2 -0
  224. package/docs/utils/object.html +2 -0
  225. package/docs/utils/propConverters.html +2 -0
  226. package/docs/utils/string.html +2 -0
  227. package/docs/utils/theme.html +2 -0
  228. package/docs/utils/toTitleCase.html +2 -0
  229. package/docs/utils/type.html +2 -0
  230. package/docs/utils/wait.html +2 -0
  231. package/docs-src/components/aside.page.html +7 -8
  232. package/docs-src/components/html-editor.page.html +52 -6
  233. package/docs-src/components/nav-spacer.page.html +65 -0
  234. package/docs-src/index.page.html +6 -0
  235. package/docs-src/nav.fragment.html +2 -0
  236. package/icons/comment.svg +1 -0
  237. package/llm.txt +1 -0
  238. package/package.json +1 -1
  239. package/scripts/build.js +1 -1
  240. package/src/components/Accordion.js +1 -1
  241. package/src/components/Dropdown.js +7 -3
  242. package/src/components/HtmlEditor.js +699 -1206
  243. package/src/components/NavSpacer.js +55 -0
  244. package/src/components/htmlEditorControls/AlignCenter.js +5 -5
  245. package/src/components/htmlEditorControls/AlignJustify.js +5 -5
  246. package/src/components/htmlEditorControls/AlignLeft.js +5 -5
  247. package/src/components/htmlEditorControls/AlignRight.js +5 -5
  248. package/src/components/htmlEditorControls/Bold.js +5 -5
  249. package/src/components/htmlEditorControls/BulletList.js +5 -5
  250. package/src/components/htmlEditorControls/ClearFormatting.js +5 -5
  251. package/src/components/htmlEditorControls/CodeBlock.js +16 -8
  252. package/src/components/htmlEditorControls/CreateLink.js +3 -7
  253. package/src/components/htmlEditorControls/FormatBlock.js +5 -5
  254. package/src/components/htmlEditorControls/InlineCode.js +1 -13
  255. package/src/components/htmlEditorControls/InsertTable.js +43 -44
  256. package/src/components/htmlEditorControls/Italic.js +5 -5
  257. package/src/components/htmlEditorControls/Mode.js +1 -1
  258. package/src/components/htmlEditorControls/NumberList.js +5 -5
  259. package/src/components/htmlEditorControls/Strikethrough.js +5 -5
  260. package/src/components/htmlEditorControls/Underline.js +5 -5
  261. package/src/components/htmlEditorNodes/HtmlComment.js +118 -0
  262. package/tests/components/Accordion.browser-test.js +154 -0
  263. package/tests/components/Dropdown.browser-test.js +85 -0
  264. package/tests/components/HtmlComment.browser-test.js +115 -0
  265. package/tests/components/HtmlEditor.browser-test.js +379 -0
  266. 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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.alignCenter();
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}" @click="${this.handleClick}">
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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.alignJustify();
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}" @click="${this.handleClick}">
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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.alignLeft();
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}" @click="${this.handleClick}">
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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.alignRight();
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}" @click="${this.handleClick}">
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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.bold();
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}" @click="${this.handleClick}">
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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.unorderedList();
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}" @click="${this.handleClick}">
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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.removeFormat();
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}" @click="${this.handleClick}">
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
- if(savedSelection){
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
- const linkEl = document.createElement('a');
81
- linkEl.href = url;
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.insertElementAtCursor(linkEl, true);
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
- handleClick = () => {
46
- if(this.editor){
47
- this.editor.formatBlock(this.tag);
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}" @click="${this.handleClick}">
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
- const sel = this.editor.shadowRoot.getSelection() || window.getSelection();
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
- if(isEditing){
59
- // Extract existing table data
60
- const thead = currentTable.querySelector('thead');
61
- const tbody = currentTable.querySelector('tbody');
62
- const hasHeaders = !!thead;
63
-
64
- cellData = [];
65
-
66
- // Get header data
67
- if(hasHeaders){
68
- const headerRow = thead.querySelector('tr');
69
- const headers = Array.from(headerRow.cells).map(cell => cell.innerHTML);
70
- cellData.push(headers);
71
- defaultCols = headers.length;
72
- }
73
-
74
- // Get body data
75
- const bodyRows = tbody.querySelectorAll('tr');
76
- bodyRows.forEach(row => {
77
- const rowData = Array.from(row.cells).map(cell => cell.innerHTML);
78
- cellData.push(rowData);
79
- if(rowData.length > defaultCols) defaultCols = rowData.length;
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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.italic();
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}" @click="${this.handleClick}">
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>
@@ -25,7 +25,7 @@ export default class Mode extends HtmlEditorControl {
25
25
  */
26
26
  handleClick = () => {
27
27
  if(!this.editor) return;
28
- this.editor.mode = this.editor.mode === 'visual' ? 'code' : 'visual';
28
+ this.editor.toggleMode();
29
29
  };
30
30
 
31
31
  /*
@@ -31,10 +31,10 @@ export default class NumberList extends HtmlEditorControl {
31
31
  /*
32
32
  Event Handlers
33
33
  */
34
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.orderedList();
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}" @click="${this.handleClick}">
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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.strikethrough();
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}" @click="${this.handleClick}">
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
- handleClick = () => {
35
- if(this.editor){
36
- this.editor.underline();
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}" @click="${this.handleClick}">
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, '&quot;')}"></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);