kempo-ui 0.0.43 → 0.0.63

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 (194) hide show
  1. package/.github/copilot-instructions.md +11 -0
  2. package/.github/workflows/publish.yml +66 -0
  3. package/CONTRIBUTING.md +70 -0
  4. package/dist/components/Dialog.js +9 -8
  5. package/dist/components/HtmlEditor.js +91 -0
  6. package/dist/components/Icon.js +2 -2
  7. package/dist/components/Main.js +5 -9
  8. package/dist/components/ShadowComponent.js +1 -1
  9. package/dist/components/SideMenu.js +1 -1
  10. package/dist/components/SidePanel.js +46 -35
  11. package/dist/components/htmlEditorControls/AlignCenter.js +12 -0
  12. package/dist/components/htmlEditorControls/AlignJustify.js +12 -0
  13. package/dist/components/htmlEditorControls/AlignLeft.js +12 -0
  14. package/dist/components/htmlEditorControls/AlignRight.js +12 -0
  15. package/dist/components/htmlEditorControls/Bold.js +12 -0
  16. package/dist/components/htmlEditorControls/BulletList.js +12 -0
  17. package/dist/components/htmlEditorControls/CharacterCount.js +18 -0
  18. package/dist/components/htmlEditorControls/ClearFormatting.js +12 -0
  19. package/dist/components/htmlEditorControls/CodeBlock.js +12 -0
  20. package/dist/components/htmlEditorControls/ControlGroup.js +14 -0
  21. package/dist/components/htmlEditorControls/ControlSpacer.js +6 -0
  22. package/dist/components/htmlEditorControls/CreateLink.js +15 -0
  23. package/dist/components/htmlEditorControls/DropdownControl.js +57 -0
  24. package/dist/components/htmlEditorControls/FormatBlock.js +12 -0
  25. package/dist/components/htmlEditorControls/HtmlEditorControl.js +44 -0
  26. package/dist/components/htmlEditorControls/InlineCode.js +12 -0
  27. package/dist/components/htmlEditorControls/InsertTable.js +15 -0
  28. package/dist/components/htmlEditorControls/Italic.js +12 -0
  29. package/dist/components/htmlEditorControls/Mode.js +9 -0
  30. package/dist/components/htmlEditorControls/NumberList.js +12 -0
  31. package/dist/components/htmlEditorControls/Strikethrough.js +12 -0
  32. package/dist/components/htmlEditorControls/TextBackgroundColor.js +97 -0
  33. package/dist/components/htmlEditorControls/TextColor.js +97 -0
  34. package/dist/components/htmlEditorControls/Underline.js +12 -0
  35. package/dist/components/htmlEditorControls/WordCount.js +18 -0
  36. package/dist/utils/formatCode.js +1 -0
  37. package/docs/components/dropdown.html +2 -2
  38. package/docs/components/html-editor.html +442 -0
  39. package/docs/components/icon.html +2 -7
  40. package/docs/components/photo-viewer.html +14 -14
  41. package/docs/components/side-menu.html +32 -0
  42. package/docs/components/side-panel-dual.html +70 -0
  43. package/docs/components/side-panel-scroll.html +176 -0
  44. package/docs/components/side-panel.html +41 -1
  45. package/docs/icons/arrow_drop_down.svg +1 -0
  46. package/docs/icons/circle.svg +1 -0
  47. package/docs/icons/code.svg +1 -0
  48. package/docs/icons/code_blocks.svg +1 -0
  49. package/docs/icons/copy.svg +1 -0
  50. package/docs/icons/dot.svg +1 -0
  51. package/docs/icons/format_align_center.svg +1 -0
  52. package/docs/icons/format_align_justify.svg +1 -0
  53. package/docs/icons/format_align_left.svg +1 -0
  54. package/docs/icons/format_align_right.svg +1 -0
  55. package/docs/icons/format_bold.svg +1 -0
  56. package/docs/icons/format_clear.svg +1 -0
  57. package/docs/icons/format_color_fill.svg +1 -0
  58. package/docs/icons/format_color_text.svg +1 -0
  59. package/docs/icons/format_h1.svg +1 -0
  60. package/docs/icons/format_h2.svg +1 -0
  61. package/docs/icons/format_h3.svg +1 -0
  62. package/docs/icons/format_h4.svg +1 -0
  63. package/docs/icons/format_h5.svg +1 -0
  64. package/docs/icons/format_h6.svg +1 -0
  65. package/docs/icons/format_italic.svg +1 -0
  66. package/docs/icons/format_list_bulleted.svg +1 -0
  67. package/docs/icons/format_list_numbered.svg +1 -0
  68. package/docs/icons/format_paragraph.svg +1 -0
  69. package/docs/icons/format_underlined.svg +1 -0
  70. package/docs/icons/help.svg +1 -0
  71. package/docs/icons/link.svg +1 -0
  72. package/docs/icons/more_vert.svg +1 -0
  73. package/docs/icons/strikethrough_s.svg +1 -0
  74. package/docs/icons/table.svg +1 -0
  75. package/docs/icons/wysiwyg.svg +1 -0
  76. package/docs/index.html +6 -0
  77. package/docs/nav-1.inc.html +1 -0
  78. package/docs/nav.inc.html +1 -0
  79. package/docs/src/components/Dialog.js +9 -8
  80. package/docs/src/components/HtmlEditor.js +91 -0
  81. package/docs/src/components/Icon.js +2 -2
  82. package/docs/src/components/Main.js +5 -9
  83. package/docs/src/components/ShadowComponent.js +1 -1
  84. package/docs/src/components/SideMenu.js +1 -1
  85. package/docs/src/components/SidePanel.js +46 -35
  86. package/docs/src/components/htmlEditorControls/AlignCenter.js +12 -0
  87. package/docs/src/components/htmlEditorControls/AlignJustify.js +12 -0
  88. package/docs/src/components/htmlEditorControls/AlignLeft.js +12 -0
  89. package/docs/src/components/htmlEditorControls/AlignRight.js +12 -0
  90. package/docs/src/components/htmlEditorControls/Bold.js +12 -0
  91. package/docs/src/components/htmlEditorControls/BulletList.js +12 -0
  92. package/docs/src/components/htmlEditorControls/CharacterCount.js +18 -0
  93. package/docs/src/components/htmlEditorControls/ClearFormatting.js +12 -0
  94. package/docs/src/components/htmlEditorControls/CodeBlock.js +12 -0
  95. package/docs/src/components/htmlEditorControls/ControlGroup.js +14 -0
  96. package/docs/src/components/htmlEditorControls/ControlSpacer.js +6 -0
  97. package/docs/src/components/htmlEditorControls/CreateLink.js +15 -0
  98. package/docs/src/components/htmlEditorControls/DropdownControl.js +57 -0
  99. package/docs/src/components/htmlEditorControls/FormatBlock.js +12 -0
  100. package/docs/src/components/htmlEditorControls/HtmlEditorControl.js +44 -0
  101. package/docs/src/components/htmlEditorControls/InlineCode.js +12 -0
  102. package/docs/src/components/htmlEditorControls/InsertTable.js +15 -0
  103. package/docs/src/components/htmlEditorControls/Italic.js +12 -0
  104. package/docs/src/components/htmlEditorControls/Mode.js +9 -0
  105. package/docs/src/components/htmlEditorControls/NumberList.js +12 -0
  106. package/docs/src/components/htmlEditorControls/Strikethrough.js +12 -0
  107. package/docs/src/components/htmlEditorControls/TextBackgroundColor.js +97 -0
  108. package/docs/src/components/htmlEditorControls/TextColor.js +97 -0
  109. package/docs/src/components/htmlEditorControls/Underline.js +12 -0
  110. package/docs/src/components/htmlEditorControls/WordCount.js +18 -0
  111. package/docs/src/utils/formatCode.js +1 -0
  112. package/icons/arrow_drop_down.svg +1 -0
  113. package/icons/circle.svg +1 -0
  114. package/icons/code.svg +1 -0
  115. package/icons/code_blocks.svg +1 -0
  116. package/icons/copy.svg +1 -0
  117. package/icons/dot.svg +1 -0
  118. package/icons/format_align_center.svg +1 -0
  119. package/icons/format_align_justify.svg +1 -0
  120. package/icons/format_align_left.svg +1 -0
  121. package/icons/format_align_right.svg +1 -0
  122. package/icons/format_bold.svg +1 -0
  123. package/icons/format_clear.svg +1 -0
  124. package/icons/format_color_fill.svg +1 -0
  125. package/icons/format_color_text.svg +1 -0
  126. package/icons/format_h1.svg +1 -0
  127. package/icons/format_h2.svg +1 -0
  128. package/icons/format_h3.svg +1 -0
  129. package/icons/format_h4.svg +1 -0
  130. package/icons/format_h5.svg +1 -0
  131. package/icons/format_h6.svg +1 -0
  132. package/icons/format_italic.svg +1 -0
  133. package/icons/format_list_bulleted.svg +1 -0
  134. package/icons/format_list_numbered.svg +1 -0
  135. package/icons/format_paragraph.svg +1 -0
  136. package/icons/format_underlined.svg +1 -0
  137. package/icons/help.svg +1 -0
  138. package/icons/link.svg +1 -0
  139. package/icons/more_vert.svg +1 -0
  140. package/icons/strikethrough_s.svg +1 -0
  141. package/icons/table.svg +1 -0
  142. package/icons/wysiwyg.svg +1 -0
  143. package/package.json +6 -5
  144. package/scripts/getIcon.js +52 -0
  145. package/src/components/Dialog.js +25 -10
  146. package/src/components/HtmlEditor.js +1548 -0
  147. package/src/components/Icon.js +6 -3
  148. package/src/components/Main.js +22 -23
  149. package/src/components/ShadowComponent.js +0 -1
  150. package/src/components/SideMenu.js +10 -0
  151. package/src/components/SidePanel.js +78 -37
  152. package/src/components/htmlEditorControls/AlignCenter.js +65 -0
  153. package/src/components/htmlEditorControls/AlignJustify.js +65 -0
  154. package/src/components/htmlEditorControls/AlignLeft.js +65 -0
  155. package/src/components/htmlEditorControls/AlignRight.js +65 -0
  156. package/src/components/htmlEditorControls/Bold.js +65 -0
  157. package/src/components/htmlEditorControls/BulletList.js +65 -0
  158. package/src/components/htmlEditorControls/CharacterCount.js +75 -0
  159. package/src/components/htmlEditorControls/ClearFormatting.js +65 -0
  160. package/src/components/htmlEditorControls/CodeBlock.js +72 -0
  161. package/src/components/htmlEditorControls/ControlGroup.js +95 -0
  162. package/src/components/htmlEditorControls/ControlSpacer.js +23 -0
  163. package/src/components/htmlEditorControls/CreateLink.js +121 -0
  164. package/src/components/htmlEditorControls/DropdownControl.js +149 -0
  165. package/src/components/htmlEditorControls/FormatBlock.js +108 -0
  166. package/src/components/htmlEditorControls/HtmlEditorControl.js +126 -0
  167. package/src/components/htmlEditorControls/InlineCode.js +77 -0
  168. package/src/components/htmlEditorControls/InsertTable.js +171 -0
  169. package/src/components/htmlEditorControls/Italic.js +65 -0
  170. package/src/components/htmlEditorControls/Mode.js +66 -0
  171. package/src/components/htmlEditorControls/NumberList.js +65 -0
  172. package/src/components/htmlEditorControls/Strikethrough.js +65 -0
  173. package/src/components/htmlEditorControls/TextBackgroundColor.js +195 -0
  174. package/src/components/htmlEditorControls/TextColor.js +195 -0
  175. package/src/components/htmlEditorControls/Underline.js +65 -0
  176. package/src/components/htmlEditorControls/WordCount.js +76 -0
  177. package/src/utils/formatCode.js +87 -0
  178. package/tests/components/Main.browser-test.js +166 -105
  179. package/tests/components/SidePanel.browser-test.js +62 -8
  180. package/.github/workflows/publish-major.yml +0 -39
  181. package/.github/workflows/publish-minor.yml +0 -39
  182. package/.github/workflows/publish-patch.yml +0 -45
  183. package/docs/icons/arrow-back.svg +0 -1
  184. package/docs/icons/arrow-down-double.svg +0 -1
  185. package/docs/icons/arrow-down.svg +0 -1
  186. package/docs/icons/arrow-forward.svg +0 -1
  187. package/docs/icons/arrow-menu-close.svg +0 -1
  188. package/docs/icons/arrow-menu-open.svg +0 -1
  189. package/docs/icons/arrow-right.svg +0 -1
  190. package/docs/icons/arrow-up-double.svg +0 -1
  191. package/docs/icons/arrow-up.svg +0 -1
  192. package/docs/icons/chevron-left.svg +0 -1
  193. package/docs/icons/chevron-right.svg +0 -1
  194. package/docs/icons/chevron-up.svg +0 -1
@@ -1,8 +1,8 @@
1
- import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-all.min.js";import"./Icon.js";class SidePanel extends ShadowComponent{static properties={collapsed:{type:Boolean,reflect:!0},side:{type:String,reflect:!0}};constructor(){super(),this.collapsed=!1,this.side="left"}toggleClick=()=>this.toggle();updated(e){if(super.updated(e),e.has("collapsed")){const e=this.collapsed?"collapse":"expand";this.dispatchEvent(new CustomEvent(e)),this.dispatchEvent(new CustomEvent("change",{detail:e})),window.dispatchEvent(new CustomEvent("side-panel-change",{detail:{collapsed:this.collapsed,width:this.collapsed?"3.5rem":"16rem",side:this.side}}))}}expand=()=>this.collapsed=!1;collapse=()=>this.collapsed=!0;toggle(){this.collapsed=!this.collapsed,this.dispatchEvent(new CustomEvent("toggle"))}render(){return html`
1
+ import ShadowComponent from"./ShadowComponent.js";import{html,css,nothing}from"../lit-all.min.js";import"./Icon.js";class SidePanel extends ShadowComponent{static properties={collapsed:{type:Boolean,reflect:!0},side:{type:String,reflect:!0}};constructor(){super(),this.collapsed=!1,this.side="left"}toggleClick=()=>this.toggle();updated(e){if(super.updated(e),e.has("collapsed")){const e=this.collapsed?"collapse":"expand";this.dispatchEvent(new CustomEvent(e)),this.dispatchEvent(new CustomEvent("change",{detail:e})),window.dispatchEvent(new CustomEvent("side-panel-change",{detail:{collapsed:this.collapsed,width:this.collapsed?"3.5rem":"16rem",side:this.side}}))}}expand=()=>this.collapsed=!1;collapse=()=>this.collapsed=!0;toggle(){this.collapsed=!this.collapsed,this.dispatchEvent(new CustomEvent("toggle"))}render(){return html`
2
2
  <div id="header">
3
3
  <slot name="logo"></slot>
4
4
  <button id="toggle" @click=${this.toggleClick} aria-label="${this.collapsed?"Expand panel":"Collapse panel"}">
5
- <k-icon name="arrow-line" direction="${this.collapsed?"right":"left"}"></k-icon>
5
+ <k-icon name="arrow-line" direction="${(()=>"right"===this.side?this.collapsed?"left":"right":this.collapsed?"right":"left")()}"></k-icon>
6
6
  </button>
7
7
  </div>
8
8
  <div id="content">
@@ -12,9 +12,9 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
12
12
  :host {
13
13
  --bg: var(--c_bg);
14
14
  --width-expanded: 16rem;
15
- --width-collapsed: 3.5rem;
16
15
  --transition-duration: var(--animation_ms, 256ms);
17
- display: block;
16
+ display: flex;
17
+ flex-direction: column;
18
18
  position: fixed;
19
19
  top: 0;
20
20
  left: 0;
@@ -26,7 +26,7 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
26
26
  z-index: 1000;
27
27
  }
28
28
  :host([collapsed]) {
29
- width: var(--width-collapsed);
29
+ width: auto;
30
30
  }
31
31
  :host([side="right"]) {
32
32
  left: auto;
@@ -41,20 +41,17 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
41
41
  gap: var(--spacer_h);
42
42
  padding: var(--spacer_h);
43
43
  border-bottom: 1px solid var(--c_border);
44
+ flex-shrink: 0;
44
45
  }
45
46
  ::slotted([slot="logo"]) {
46
47
  margin-right: auto;
47
- }
48
- ::slotted([slot="logo"]) {
49
48
  flex: 1;
50
49
  min-width: 0;
51
50
  opacity: 1;
52
51
  transition: opacity var(--transition-duration);
53
52
  }
54
53
  :host([collapsed]) ::slotted([slot="logo"]) {
55
- opacity: 0;
56
- width: 0;
57
- overflow: hidden;
54
+ display: none;
58
55
  }
59
56
  #toggle {
60
57
  flex-shrink: 0;
@@ -73,23 +70,31 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
73
70
  background: var(--c_bg_hover);
74
71
  }
75
72
  #content {
76
- height: calc(100% - 3rem);
73
+ flex: 1;
74
+ min-height: 0;
77
75
  overflow-y: auto;
78
76
  overflow-x: hidden;
79
77
  display: flex;
80
78
  flex-direction: column;
81
79
  }
82
- `}class SidePanelItem extends ShadowComponent{static properties={icon:{type:String},href:{type:String},active:{type:Boolean,reflect:!0}};constructor(){super(),this.icon="",this.href="#",this.active=!1,this.collapsed=!1}connectedCallback(){super.connectedCallback(),this.panel=this.closest("k-side-panel"),this.panel&&(this.collapsed=this.panel.collapsed,this.panel.addEventListener("collapse",this.handleCollapse),this.panel.addEventListener("expand",this.handleExpand))}disconnectedCallback(){super.disconnectedCallback(),this.panel&&(this.panel.removeEventListener("collapse",this.handleCollapse),this.panel.removeEventListener("expand",this.handleExpand))}handleCollapse=()=>{this.collapsed=!0,this.requestUpdate()};handleExpand=()=>{this.collapsed=!1,this.requestUpdate()};render(){return html`
83
- <a href="${this.href}" class="item ${this.active?"active bg-primary":""}">
84
- ${this.icon?html`<k-icon name="${this.icon}"></k-icon>`:""}
85
- <span class="label ${this.collapsed?"hidden":""}">
86
- <slot></slot>
87
- </span>
80
+ :host([collapsed]) #content {
81
+ align-items: flex-start;
82
+ }
83
+ :host(:not([collapsed])) #content {
84
+ /* scrollbar-gutter: stable; */
85
+ }
86
+ `}class SidePanelItem extends ShadowComponent{static properties={icon:{type:String},href:{type:String},active:{type:Boolean,reflect:!0},collapsed:{type:Boolean,reflect:!0},"no-expand":{type:Boolean,attribute:"no-expand"},"hide-when-collapsed":{type:Boolean,attribute:"hide-when-collapsed"}};constructor(){super(),this.icon="",this.href="#",this.active=!1,this.collapsed=!1,this["no-expand"]=!1,this["hide-when-collapsed"]=!1}connectedCallback(){super.connectedCallback(),this.panel=this.closest("k-side-panel"),this.panel&&(this.collapsed=this.panel.collapsed,this.panel.addEventListener("collapse",this.handleCollapse),this.panel.addEventListener("expand",this.handleExpand))}disconnectedCallback(){super.disconnectedCallback(),this.panel&&(this.panel.removeEventListener("collapse",this.handleCollapse),this.panel.removeEventListener("expand",this.handleExpand))}handleCollapse=()=>{this.collapsed=!0,this.requestUpdate()};handleExpand=()=>{this.collapsed=!1,this.requestUpdate()};handleClick=e=>{this.collapsed&&!this["no-expand"]&&this.panel&&(e.preventDefault(),this.panel.expand())};render(){return html`
87
+ <a href="${this.href}" class="item ${this.active?"active bg-primary":""}" @click=${this.handleClick}>
88
+ ${this.icon?html`<k-icon name="${this.icon}"></k-icon>`:this.collapsed?html`<k-icon name="dot"></k-icon>`:nothing}
89
+ ${this.collapsed?nothing:html`<span class="label"><slot></slot></span>`}
88
90
  </a>
89
91
  `}static styles=css`
90
92
  :host {
91
93
  display: block;
92
94
  }
95
+ :host([collapsed][hide-when-collapsed]) {
96
+ display: none;
97
+ }
93
98
  .item {
94
99
  display: flex;
95
100
  align-items: center;
@@ -102,6 +107,8 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
102
107
  transition: background var(--animation_ms), color var(--animation_ms);
103
108
  white-space: nowrap;
104
109
  }
110
+ :host([collapsed]) .item {
111
+ }
105
112
  .item:hover {
106
113
  background: var(--c_bg_hover);
107
114
  }
@@ -119,18 +126,16 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
119
126
  min-width: 0;
120
127
  overflow: hidden;
121
128
  text-overflow: ellipsis;
122
- opacity: 1;
123
- transition: opacity var(--animation_ms);
124
- }
125
- .label.hidden {
126
- opacity: 0;
127
- width: 0;
128
129
  }
129
- `}class SidePanelLabel extends ShadowComponent{constructor(){super(),this.collapsed=!1}connectedCallback(){super.connectedCallback(),this.panel=this.closest("k-side-panel"),this.panel&&(this.collapsed=this.panel.collapsed,this.panel.addEventListener("collapse",this.handleCollapse),this.panel.addEventListener("expand",this.handleExpand))}disconnectedCallback(){super.disconnectedCallback(),this.panel&&(this.panel.removeEventListener("collapse",this.handleCollapse),this.panel.removeEventListener("expand",this.handleExpand))}handleCollapse=()=>{this.collapsed=!0,this.requestUpdate()};handleExpand=()=>{this.collapsed=!1,this.requestUpdate()};render(){return this.collapsed?html`<hr>`:html`<div class="label"><slot></slot></div>`}static styles=css`
130
+ `}class SidePanelLabel extends ShadowComponent{static properties={collapsed:{type:Boolean,reflect:!0}};constructor(){super(),this.collapsed=!1}connectedCallback(){super.connectedCallback(),this.panel=this.closest("k-side-panel"),this.panel&&(this.collapsed=this.panel.collapsed,this.panel.addEventListener("collapse",this.handleCollapse),this.panel.addEventListener("expand",this.handleExpand))}disconnectedCallback(){super.disconnectedCallback(),this.panel&&(this.panel.removeEventListener("collapse",this.handleCollapse),this.panel.removeEventListener("expand",this.handleExpand))}handleCollapse=()=>{this.collapsed=!0,this.requestUpdate()};handleExpand=()=>{this.collapsed=!1,this.requestUpdate()};render(){return this.collapsed?html`<hr>`:html`<div class="label"><slot></slot></div>`}static styles=css`
130
131
  :host {
131
132
  display: block;
132
133
  margin: var(--spacer_h) 0;
133
134
  }
135
+ :host([collapsed]) {
136
+ margin: 0 var(--spacer_h);
137
+ align-self: stretch;
138
+ }
134
139
  .label {
135
140
  padding: 0 var(--spacer);
136
141
  font-size: 0.75rem;
@@ -144,12 +149,15 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
144
149
  border-top: 1px solid var(--c_border);
145
150
  margin: var(--spacer_h) var(--spacer);
146
151
  }
147
- `}class SidePanelMenu extends ShadowComponent{static properties={icon:{type:String},label:{type:String},open:{type:Boolean,reflect:!0}};constructor(){super(),this.icon="",this.label="",this.open=!1,this.collapsed=!1}connectedCallback(){super.connectedCallback(),this.panel=this.closest("k-side-panel"),this.panel&&(this.collapsed=this.panel.collapsed,this.panel.addEventListener("collapse",this.handleCollapse),this.panel.addEventListener("expand",this.handleExpand))}disconnectedCallback(){super.disconnectedCallback(),this.panel&&(this.panel.removeEventListener("collapse",this.handleCollapse),this.panel.removeEventListener("expand",this.handleExpand))}handleCollapse=()=>{this.collapsed=!0,this.open=!1,this.requestUpdate()};handleExpand=()=>{this.collapsed=!1,this.requestUpdate()};toggleMenu=()=>{this.collapsed||(this.open=!this.open)};render(){return html`
152
+ :host([collapsed]) hr {
153
+ margin: var(--spacer_h) 0;
154
+ }
155
+ `}class SidePanelMenu extends ShadowComponent{static properties={icon:{type:String},label:{type:String},open:{type:Boolean,reflect:!0},collapsed:{type:Boolean,reflect:!0},"no-expand":{type:Boolean,attribute:"no-expand"},"hide-when-collapsed":{type:Boolean,attribute:"hide-when-collapsed"}};constructor(){super(),this.icon="",this.label="",this.open=!1,this.collapsed=!1,this["no-expand"]=!1,this["hide-when-collapsed"]=!1}connectedCallback(){super.connectedCallback(),this.panel=this.closest("k-side-panel"),this.panel&&(this.collapsed=this.panel.collapsed,this.panel.addEventListener("collapse",this.handleCollapse),this.panel.addEventListener("expand",this.handleExpand))}disconnectedCallback(){super.disconnectedCallback(),this.panel&&(this.panel.removeEventListener("collapse",this.handleCollapse),this.panel.removeEventListener("expand",this.handleExpand))}handleCollapse=()=>{this.collapsed=!0,this.open=!1,this.requestUpdate()};handleExpand=()=>{this.collapsed=!1,this.requestUpdate()};toggleMenu=()=>{this.collapsed&&!this["no-expand"]&&this.panel?this.panel.expand():this.collapsed||(this.open=!this.open)};render(){return html`
148
156
  <div class="menu-container">
149
- <button class="menu-header ${this.open?"open":""}" @click=${this.toggleMenu}>
150
- ${this.icon?html`<k-icon name="${this.icon}"></k-icon>`:""}
151
- <span class="label ${this.collapsed?"hidden":""}">${this.label}</span>
152
- ${this.collapsed?"":html`<k-icon class="chevron" name="chevron" direction="${this.open?"down":"right"}"></k-icon>`}
157
+ <button class="no-btn menu-header ${this.open?"open":""}" @click=${this.toggleMenu}>
158
+ ${this.icon?html`<k-icon name="${this.icon}"></k-icon>`:this.collapsed?html`<k-icon name="dot"></k-icon>`:nothing}
159
+ ${this.collapsed?nothing:html`<span class="label">${this.label}</span>`}
160
+ ${this.collapsed?nothing:html`<k-icon class="chevron" name="chevron" direction="${this.open?"down":"right"}"></k-icon>`}
153
161
  </button>
154
162
  <div class="menu-content ${this.open&&!this.collapsed?"open":""}">
155
163
  <slot></slot>
@@ -159,6 +167,9 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
159
167
  :host {
160
168
  display: block;
161
169
  }
170
+ :host([collapsed][hide-when-collapsed]) {
171
+ display: none;
172
+ }
162
173
  .menu-container {
163
174
  margin: 0;
164
175
  }
@@ -181,6 +192,9 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
181
192
  white-space: nowrap;
182
193
  transition: background var(--animation_ms);
183
194
  }
195
+ :host([collapsed]) .menu-header {
196
+ width: auto;
197
+ }
184
198
  .menu-header:hover {
185
199
  background: var(--c_bg_hover);
186
200
  }
@@ -192,12 +206,6 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
192
206
  min-width: 0;
193
207
  overflow: hidden;
194
208
  text-overflow: ellipsis;
195
- opacity: 1;
196
- transition: opacity var(--animation_ms);
197
- }
198
- .label.hidden {
199
- opacity: 0;
200
- width: 0;
201
209
  }
202
210
  .chevron {
203
211
  transition: transform var(--animation_ms);
@@ -208,6 +216,9 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
208
216
  transition: max-height var(--animation_ms);
209
217
  padding-left: calc(var(--spacer_h) * 2);
210
218
  }
219
+ :host([collapsed]) .menu-content {
220
+ padding-left: 0;
221
+ }
211
222
  .menu-content.open {
212
223
  max-height: 500px;
213
224
  }
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class AlignCenter extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.alignCenter()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="format_align_center"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-align-center",AlignCenter);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class AlignJustify extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.alignJustify()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="format_align_justify"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-align-justify",AlignJustify);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class AlignLeft extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.alignLeft()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="format_align_left"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-align-left",AlignLeft);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class AlignRight extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.alignRight()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="format_align_right"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-align-right",AlignRight);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class Bold extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.bold()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="format_bold"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-bold",Bold);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class BulletList extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.unorderedList()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="format_list_bulleted"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-bullet-list",BulletList);
@@ -0,0 +1,18 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";export default class CharacterCount extends HtmlEditorControl{static properties={count:{type:Number,state:!0}};constructor(){super(),this.count=0}connectedCallback(){super.connectedCallback(),this.editor&&(this.editor.addEventListener("ready",()=>{this.updateCount()}),this.editor.addEventListener("change",()=>{this.updateCount()}),setTimeout(()=>this.updateCount(),0))}updateCount=()=>{if(!this.editor)return;const t=(new DOMParser).parseFromString(this.editor.getValue(),"text/html").body.innerText||"";this.count=t.length};render(){return html`
2
+ <span class="character-count">
3
+ <slot name="label">Characters:</slot> ${this.count}
4
+ </span>
5
+ `}static styles=[HtmlEditorControl.styles,css`
6
+ :host {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ padding: 0 0.5rem;
10
+ font-size: 0.875rem;
11
+ color: var(--text-color-secondary, #666);
12
+ }
13
+ .character-count {
14
+ display: flex;
15
+ align-items: center;
16
+ gap: 0.25rem;
17
+ }
18
+ `]}customElements.define("k-hec-character-count",CharacterCount);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class ClearFormatting extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.removeFormat()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="format_clear"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-clear-formatting",ClearFormatting);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class CodeBlock extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleMouseDown=t=>{const o=window.getSelection()?.toString();t.preventDefault(),t.stopPropagation(),this.editor&&(o?this.editor.wrapSelection("<pre>","</pre>",o):this.editor.formatBlock("pre"))};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
7
+ <slot name="icon">
8
+ <k-icon name="code_blocks"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-code-block",CodeBlock);
@@ -0,0 +1,14 @@
1
+ import ShadowComponent from"../ShadowComponent.js";import{html,css}from"../../lit-all.min.js";export default class ControlGroup extends ShadowComponent{static properties={editorMode:{type:String,state:!0},hidden:{type:Boolean,reflect:!0}};constructor(){super()}connectedCallback(){super.connectedCallback(),this.hasAttribute("class")||this.setAttribute("class","b r mq"),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}get editor(){return this.closest("k-html-editor")}updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode,this.requestUpdate())}hasVisibleChildren(){return Array.from(this.children).filter(t=>t.tagName.startsWith("K-HEC-")&&"K-HEC-SPACER"!==t.tagName).some(t=>{if(!1===t.hidden||void 0===t.hidden){return"none"!==window.getComputedStyle(t).display}return!1})}static styles=css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+
6
+ :host([hidden]) {
7
+ display: none !important;
8
+ }
9
+
10
+ ::slotted(*) {
11
+ margin-top: -1px;
12
+ margin-bottom: -1px;
13
+ }
14
+ `;render(){return html`<slot></slot>`}updated(){super.updated(),requestAnimationFrame(()=>{this.hidden=!this.hasVisibleChildren()})}}customElements.define("k-hec-group",ControlGroup);
@@ -0,0 +1,6 @@
1
+ import ShadowComponent from"../ShadowComponent.js";import{html,css}from"../../lit-all.min.js";export default class ControlSpacer extends ShadowComponent{static styles=css`
2
+ :host {
3
+ display: inline-flex;
4
+ flex: 1;
5
+ }
6
+ `;render(){return html``}}customElements.define("k-hec-spacer",ControlSpacer);
@@ -0,0 +1,15 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";import Dialog from"../Dialog.js";export default class CreateLink extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};constructor(){super()}connectedCallback(){super.connectedCallback(),this.editor&&(this.editorMode=this.editor.mode,this.editor?.addEventListener("mode-changed",()=>{this.editor&&(this.editorMode=this.editor.mode)}))}handleMouseDown=t=>{if(!this.editor)return;t.preventDefault(),t.stopPropagation();const e=this.editor.selection?.text||"",o=document.createElement("input");o.type="text",o.placeholder="https://example.com",o.style.cssText="padding: 0.5rem; border: 1px solid var(--border-color, #ccc); border-radius: 4px; font-size: 1rem;";const i=document.createElement("input");i.type="text",i.placeholder="Enter link text",i.value=e,i.style.cssText="padding: 0.5rem; border: 1px solid var(--border-color, #ccc); border-radius: 4px; font-size: 1rem;";const n=document.createElement("div");n.className="p",n.style.cssText="display: flex; flex-direction: column; gap: 1rem;",n.innerHTML='\n\t\t\t<div style="display: flex; flex-direction: column; gap: 0.5rem;">\n\t\t\t\t<label style="font-weight: bold;">URL</label>\n\t\t\t</div>\n\t\t\t<div style="display: flex; flex-direction: column; gap: 0.5rem;">\n\t\t\t\t<label style="font-weight: bold;">Link Text</label>\n\t\t\t</div>\n\t\t',n.children[0].appendChild(o),n.children[1].appendChild(i),Dialog.create(n,{title:"Create Link",cancelText:"Cancel",confirmText:"Insert Link",confirmClasses:"success ml",confirmAction:t=>{const e=o.value.trim(),n=i.value.trim();if(!e)return void(t.keepDialogOpen=!0);const l=document.createElement("a");l.href=e,l.textContent=n||e,this.editor.selection?this.editor.replaceSelectionWithElement(l,!0):this.editor.insertElementAtCursor(l,!0)}})};render(){return this.hidden="code"===this.editorMode,html`
2
+ <button
3
+ class="${this.buttonClasses}"
4
+ @mousedown="${this.handleMouseDown}"
5
+ >
6
+ <slot name="icon">
7
+ <k-icon name="link"></k-icon>
8
+ </slot>
9
+ <slot></slot>
10
+ </button>
11
+ `}static styles=[HtmlEditorControl.styles,css`
12
+ :host {
13
+ display: inline-flex;
14
+ }
15
+ `]}customElements.define("k-hec-create-link",CreateLink);
@@ -0,0 +1,57 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Dropdown.js";import"../Icon.js";export default class DropdownControl extends HtmlEditorControl{static properties={opened:{type:Boolean,reflect:!0},editorMode:{type:String,state:!0}};constructor(){super(),this.opened=!1}connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}updated(t){super.updated(t),t.has("editorMode")&&requestAnimationFrame(()=>{this.hidden="code"===this.editorMode&&!this.hasVisibleChildren()})}updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}hasVisibleChildren(){return Array.from(this.children).filter(t=>!t.hasAttribute("slot")).some(t=>{if(!1===t.hidden||void 0===t.hidden){return"none"!==window.getComputedStyle(t).display}return!1})}static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+
6
+ k-dropdown {
7
+ display: inline-flex;
8
+ }
9
+
10
+ /* Override fixed sizing for dropdown trigger */
11
+ button[slot="trigger"] {
12
+ width: auto !important;
13
+ height: auto !important;
14
+ min-width: 40px;
15
+ min-height: 40px;
16
+ }
17
+
18
+ /* Style slotted items (not icon or label) */
19
+ ::slotted(:not([slot="icon"]):not([slot="label"])) {
20
+ display: block !important;
21
+ }
22
+
23
+ ::slotted(:not([slot="icon"]):not([slot="label"])) .icon-btn,
24
+ ::slotted(:not([slot="icon"]):not([slot="label"])) button {
25
+ display: flex !important;
26
+ width: 100% !important;
27
+ height: auto !important;
28
+ justify-content: flex-start !important;
29
+ padding: 0.5rem 0.75rem !important;
30
+ margin: 0 !important;
31
+ border: none !important;
32
+ border-radius: 0 !important;
33
+ border-bottom: 1px solid var(--c_border) !important;
34
+ }
35
+
36
+ ::slotted(:not([slot="icon"]):not([slot="label"]):last-of-type) .icon-btn,
37
+ ::slotted(:not([slot="icon"]):not([slot="label"]):last-of-type) button {
38
+ border-bottom: none !important;
39
+ }
40
+ `];handleToggle=()=>{this.opened=!this.opened};handleOpened=()=>{this.opened=!0};handleClosed=()=>{this.opened=!1};render(){return html`
41
+ <k-dropdown
42
+ ?opened=${this.opened}
43
+ @opened=${this.handleOpened}
44
+ @closed=${this.handleClosed}
45
+ >
46
+ <button
47
+ slot="trigger"
48
+ class="${this.buttonClasses}"
49
+ >
50
+ <slot name="icon">
51
+ <k-icon name="arrow_drop_down"></k-icon>
52
+ </slot>
53
+ <slot name="label"></slot>
54
+ </button>
55
+ <slot></slot>
56
+ </k-dropdown>
57
+ `}}customElements.define("k-hec-dropdown",DropdownControl);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class FormatBlock extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0},tag:{type:String},label:{type:String}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];constructor(){super(),this.tag="p",this.label=""}connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.formatBlock(this.tag)};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){this.hidden="code"===this.editorMode;this.label||this.getDefaultLabel();const t=this.getDefaultIcon();return html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="${t}"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}getDefaultLabel(){return{h1:"Heading 1",h2:"Heading 2",h3:"Heading 3",h4:"Heading 4",h5:"Heading 5",h6:"Heading 6",p:"Paragraph"}[this.tag]||this.tag.toUpperCase()}getDefaultIcon(){return{h1:"format_h1",h2:"format_h2",h3:"format_h3",h4:"format_h4",h5:"format_h5",h6:"format_h6",p:"format_paragraph"}[this.tag]||"format_paragraph"}}customElements.define("k-hec-format-block",FormatBlock);
@@ -0,0 +1,44 @@
1
+ import ShadowComponent from"../ShadowComponent.js";import{html,css}from"../../lit-all.min.js";export default class HtmlEditorControl extends ShadowComponent{static properties={btnClass:{type:String,attribute:"btn-class"},groupBtnClass:{type:String,attribute:"group-btn-class"},groupLastBtnClass:{type:String,attribute:"group-last-btn-class"},hidden:{type:Boolean,reflect:!0}};constructor(){super(),this.btnClass="b r mq ph",this.groupBtnClass="br ph",this.groupLastBtnClass="ph"}get editor(){let t=this.getRootNode();for(;t instanceof ShadowRoot;){const o=t.host,n=o.closest("k-html-editor");if(n)return n;t=o.getRootNode()}return this.closest("k-html-editor")}get isInGroup(){const t=this.parentElement;return t&&"K-HEC-GROUP"===t.tagName}get isInDropdown(){const t=this.parentElement;return t&&"K-HEC-DROPDOWN"===t.tagName}get isLastInGroup(){if(!this.isInGroup)return!1;const t=this.parentElement,o=Array.from(t.children).filter(t=>t.tagName.startsWith("K-HEC-")&&"K-HEC-SPACER"!==t.tagName);return o[o.length-1]===this}get buttonClasses(){let t;return t=this.isInDropdown?"dropdown-item":this.isInGroup?this.isLastInGroup?this.groupLastBtnClass:this.groupBtnClass:this.btnClass,`no-btn icon-btn ${t}`.trim()}static styles=css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+
6
+ :host([hidden]) {
7
+ display: none !important;
8
+ }
9
+
10
+ .icon-btn {
11
+ display: inline-flex !important;
12
+ align-items: center;
13
+ justify-content: center;
14
+ width: 40px;
15
+ height: 40px;
16
+ gap: 0.5rem;
17
+ }
18
+ .icon-btn:disabled {
19
+ opacity: 0.6;
20
+ }
21
+
22
+ .icon-btn:has(slot:not([name])) {
23
+ width: auto;
24
+ padding-left: 0.75rem;
25
+ padding-right: 0.75rem;
26
+ }
27
+
28
+ /* Styles for controls in dropdown */
29
+ .icon-btn.dropdown-item {
30
+ display: flex !important;
31
+ width: 100% !important;
32
+ height: auto !important;
33
+ justify-content: flex-start !important;
34
+ padding: 0.5rem 0.75rem !important;
35
+ margin: 0 !important;
36
+ border: none !important;
37
+ border-radius: 0 !important;
38
+ border-bottom: 1px solid var(--c_border) !important;
39
+ }
40
+
41
+ :host(:last-child) .icon-btn.dropdown-item {
42
+ border-bottom: none !important;
43
+ }
44
+ `}customElements.define("k-html-editor-control",HtmlEditorControl);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class InlineCode extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleMouseDown=t=>{if(!this.editor)return;t.preventDefault(),t.stopPropagation();const e=document.createElement("code"),o=this.editor.getValueWithSelectionMarkers();o.hasSelection?(e.textContent=o.selectedText,this.editor.replaceSelectionWithElement(e,!0)):(e.textContent="​",this.editor.insertElementAtCursor(e,!0))};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @mousedown="${this.handleMouseDown}">
7
+ <slot name="icon">
8
+ <k-icon name="code_blocks"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-inline-code",InlineCode);
@@ -0,0 +1,15 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";import Dialog from"../Dialog.js";export default class InsertTable extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};constructor(){super()}connectedCallback(){super.connectedCallback(),this.editor&&(this.editorMode=this.editor.mode,this.editor?.addEventListener("mode-changed",()=>{this.editor&&(this.editorMode=this.editor.mode)}))}handleMouseDown=e=>{if(!this.editor)return;e.preventDefault(),e.stopPropagation();const t=this.editor.shadowRoot.getSelection()||window.getSelection();let o=null,l=null;if(t.rangeCount){let e=t.getRangeAt(0).startContainer;e.nodeType===Node.TEXT_NODE&&(e=e.parentElement),o=e.closest("table")}const n=!!o;let r=3,s=3,i=!0;if(n){const e=o.querySelector("thead"),t=o.querySelector("tbody"),n=!!e;if(l=[],n){const t=e.querySelector("tr"),o=Array.from(t.cells).map(e=>e.innerHTML);l.push(o),s=o.length}const d=t.querySelectorAll("tr");d.forEach(e=>{const t=Array.from(e.cells).map(e=>e.innerHTML);l.push(t),t.length>s&&(s=t.length)}),r=d.length,i=n,o.remove()}const d=document.createElement("input");d.type="number",d.min="1",d.max="20",d.value=r.toString(),d.style.cssText="padding: 0.5rem; border: 1px solid var(--border-color, #ccc); border-radius: 4px; font-size: 1rem;";const c=document.createElement("input");c.type="number",c.min="1",c.max="10",c.value=s.toString(),c.style.cssText="padding: 0.5rem; border: 1px solid var(--border-color, #ccc); border-radius: 4px; font-size: 1rem;";const a=document.createElement("input");a.type="checkbox",a.checked=i,a.id="table-headers-checkbox";const m=document.createElement("div");m.className="p",m.style.cssText="display: flex; flex-direction: column; gap: 1rem;",m.innerHTML='\n\t\t\t<div style="display: flex; flex-direction: column; gap: 0.5rem;">\n\t\t\t\t<label style="font-weight: bold;">Rows</label>\n\t\t\t</div>\n\t\t\t<div style="display: flex; flex-direction: column; gap: 0.5rem;">\n\t\t\t\t<label style="font-weight: bold;">Columns</label>\n\t\t\t</div>\n\t\t\t<div style="display: flex; align-items: center; gap: 0.5rem;">\n\t\t\t\t<label for="table-headers-checkbox" style="font-weight: bold;">Include Headers</label>\n\t\t\t</div>\n\t\t',m.children[0].appendChild(d),m.children[1].appendChild(c),m.children[2].insertBefore(a,m.children[2].firstChild),Dialog.create(m,{title:n?"Edit Table":"Insert Table",cancelText:"Cancel",confirmText:n?"Update Table":"Insert Table",confirmClasses:"success",confirmAction:()=>{const e=parseInt(d.value)||3,t=parseInt(c.value)||3,o=a.checked;this.editor.insertTable(e,t,o,l)}})};render(){return this.hidden="code"===this.editorMode,html`
2
+ <button
3
+ class="${this.buttonClasses}"
4
+ @mousedown="${this.handleMouseDown}"
5
+ >
6
+ <slot name="icon">
7
+ <k-icon name="table"></k-icon>
8
+ </slot>
9
+ <slot></slot>
10
+ </button>
11
+ `}static styles=[HtmlEditorControl.styles,css`
12
+ :host {
13
+ display: inline-flex;
14
+ }
15
+ `]}customElements.define("k-hec-insert-table",InsertTable);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class Italic extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.italic()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="format_italic"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-italic",Italic);
@@ -0,0 +1,9 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class Mode extends HtmlEditorControl{static properties={mode:{type:String,reflect:!0}};connectedCallback(){super.connectedCallback(),this.updateMode(),this.editor?.addEventListener("mode-changed",()=>this.updateMode())}handleClick=()=>{this.editor&&(this.editor.mode="visual"===this.editor.mode?"code":"visual")};updateMode(){this.editor&&(this.mode=this.editor.mode)}static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];render(){const t="code"===this.mode?`${this.buttonClasses} bg-primary`:this.buttonClasses;return html`
6
+ <button class="${t}" @click="${this.handleClick}">
7
+ <k-icon name="code"></k-icon>
8
+ </button>
9
+ `}}customElements.define("k-hec-mode",Mode);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class NumberList extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.orderedList()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="format_list_numbered"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-number-list",NumberList);
@@ -0,0 +1,12 @@
1
+ import HtmlEditorControl from"./HtmlEditorControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class Strikethrough extends HtmlEditorControl{static properties={editorMode:{type:String,state:!0}};static styles=[HtmlEditorControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+ `];connectedCallback(){super.connectedCallback(),this.updateEditorMode(),this.editor?.addEventListener("mode-changed",()=>this.updateEditorMode())}handleClick=()=>{this.editor&&this.editor.strikethrough()};updateEditorMode(){this.editor&&(this.editorMode=this.editor.mode)}render(){return this.hidden="code"===this.editorMode,html`
6
+ <button class="${this.buttonClasses}" @click="${this.handleClick}">
7
+ <slot name="icon">
8
+ <k-icon name="strikethrough_s"></k-icon>
9
+ </slot>
10
+ <slot></slot>
11
+ </button>
12
+ `}}customElements.define("k-hec-strikethrough",Strikethrough);