kempo-ui 0.0.3 → 0.0.5

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 (193) hide show
  1. package/.github/workflows/publish-major.yml +39 -0
  2. package/.github/workflows/publish-minor.yml +39 -0
  3. package/.github/workflows/{publish-npm.yml → publish-patch.yml} +1 -1
  4. package/.vscode/settings.json +2 -0
  5. package/dist/kempo-hljs.css +1 -0
  6. package/dist/src/components/Accordion.js +36 -0
  7. package/dist/src/components/Card.js +37 -0
  8. package/dist/src/components/Collapsible.js +41 -0
  9. package/dist/src/components/ContentSlider.js +44 -0
  10. package/dist/src/components/Dialog.js +120 -0
  11. package/dist/src/components/Icon.js +2 -2
  12. package/dist/src/components/PersistantCollapsible.js +1 -0
  13. package/dist/src/components/PhotoViewer.js +135 -0
  14. package/dist/src/components/Resize.js +96 -0
  15. package/dist/src/components/ShadowComponent.js +1 -1
  16. package/dist/src/components/ShowMore.js +42 -0
  17. package/dist/src/components/SideMenu.js +1 -1
  18. package/dist/src/components/Sortable.js +45 -0
  19. package/dist/src/components/Split.js +84 -0
  20. package/dist/src/components/Table.js +151 -0
  21. package/dist/src/components/Tabs.js +155 -0
  22. package/dist/src/components/Tags.js +69 -0
  23. package/dist/src/components/ThemeSwitcher.js +23 -0
  24. package/dist/src/components/Timestamp.js +1 -0
  25. package/dist/src/components/Toast.js +141 -0
  26. package/dist/src/components/Toggle.js +74 -0
  27. package/dist/src/components/tableControls/DeleteRecord.js +7 -0
  28. package/dist/src/components/tableControls/Edit.js +18 -0
  29. package/dist/src/components/tableControls/ExportCSV.js +8 -0
  30. package/dist/src/components/tableControls/ExportJson.js +8 -0
  31. package/dist/src/components/tableControls/FieldSortHide.js +26 -0
  32. package/dist/src/components/tableControls/Filters.js +47 -0
  33. package/dist/src/components/tableControls/FirstPage.js +9 -0
  34. package/dist/src/components/tableControls/HiddenCount.js +3 -0
  35. package/dist/src/components/tableControls/Hide.js +5 -0
  36. package/dist/src/components/tableControls/LastPage.js +9 -0
  37. package/dist/src/components/tableControls/NextPage.js +9 -0
  38. package/dist/src/components/tableControls/PageSelect.js +22 -0
  39. package/dist/src/components/tableControls/PageSize.js +5 -0
  40. package/dist/src/components/tableControls/PrevPage.js +9 -0
  41. package/dist/src/components/tableControls/Search.js +9 -0
  42. package/dist/src/components/tableControls/ShowAll.js +5 -0
  43. package/dist/src/components/tableControls/TableControl.js +16 -0
  44. package/dist/src/utils/debounce.js +1 -0
  45. package/dist/src/utils/drag.js +1 -0
  46. package/dist/src/utils/formatTimestamp.js +1 -0
  47. package/dist/src/utils/propConverters.js +1 -0
  48. package/dist/src/utils/toTitleCase.js +1 -0
  49. package/dist/src/utils/watchWindowSize.js +1 -0
  50. package/docs/components/accordion.html +69 -25
  51. package/docs/components/card.html +6 -5
  52. package/docs/components/collapsible.html +198 -0
  53. package/docs/components/content-slider.html +56 -26
  54. package/docs/components/dialog.html +54 -48
  55. package/docs/components/focus-capture.html +59 -15
  56. package/docs/components/hybrid-component.html +112 -0
  57. package/docs/components/icon.html +5 -10
  58. package/docs/components/import.html +1 -6
  59. package/docs/components/light-component.html +99 -0
  60. package/docs/components/persistant-collapsible.html +123 -0
  61. package/docs/components/photo-viewer.html +226 -0
  62. package/docs/components/resize.html +44 -18
  63. package/docs/components/shadow-component.html +88 -0
  64. package/docs/components/show-more.html +12 -6
  65. package/docs/components/side-menu.html +3 -12
  66. package/docs/components/sortable.html +91 -55
  67. package/docs/components/split.html +26 -5
  68. package/docs/components/tablePagination.html +4 -4
  69. package/docs/components/tableRecordFiltering.html +16 -3
  70. package/docs/components/tableRecordSelection.html +2 -2
  71. package/docs/components/tabs.html +24 -7
  72. package/docs/components/tags.html +24 -8
  73. package/docs/components/theme-switcher.html +3 -6
  74. package/docs/components/timestamp.html +20 -24
  75. package/docs/components/toast.html +23 -32
  76. package/docs/components/toggle.html +4 -3
  77. package/docs/icons/error.svg +1 -1
  78. package/docs/icons/warning.svg +1 -1
  79. package/docs/index.html +197 -5
  80. package/docs/kempo-hljs.css +1 -0
  81. package/docs/kempo.min.css +1 -1
  82. package/docs/media/civic.jpg +0 -0
  83. package/docs/media/corvette.jpg +0 -0
  84. package/docs/media/evo.jpg +0 -0
  85. package/docs/media/gtr.jpg +0 -0
  86. package/docs/media/nsx.jpg +0 -0
  87. package/docs/nav.inc.html +19 -24
  88. package/docs/src/components/Accordion.js +36 -0
  89. package/docs/src/components/Card.js +37 -0
  90. package/docs/src/components/Collapsible.js +41 -0
  91. package/docs/src/components/ContentSlider.js +44 -0
  92. package/docs/src/components/Dialog.js +120 -0
  93. package/docs/src/components/Icon.js +2 -2
  94. package/docs/src/components/PersistantCollapsible.js +1 -0
  95. package/docs/src/components/PhotoViewer.js +135 -0
  96. package/docs/src/components/Resize.js +96 -0
  97. package/docs/src/components/ShadowComponent.js +1 -1
  98. package/docs/src/components/ShowMore.js +42 -0
  99. package/docs/src/components/SideMenu.js +1 -1
  100. package/docs/src/components/Sortable.js +45 -0
  101. package/docs/src/components/Split.js +84 -0
  102. package/docs/src/components/Table.js +151 -0
  103. package/docs/src/components/Tabs.js +155 -0
  104. package/docs/src/components/Tags.js +69 -0
  105. package/docs/src/components/ThemeSwitcher.js +23 -0
  106. package/docs/src/components/Timestamp.js +1 -0
  107. package/docs/src/components/Toast.js +141 -0
  108. package/docs/src/components/Toggle.js +74 -0
  109. package/docs/src/components/tableControls/DeleteRecord.js +7 -0
  110. package/docs/src/components/tableControls/Edit.js +18 -0
  111. package/docs/src/components/tableControls/ExportCSV.js +8 -0
  112. package/docs/src/components/tableControls/ExportJson.js +8 -0
  113. package/docs/src/components/tableControls/FieldSortHide.js +26 -0
  114. package/docs/src/components/tableControls/Filters.js +47 -0
  115. package/docs/src/components/tableControls/FirstPage.js +9 -0
  116. package/docs/src/components/tableControls/HiddenCount.js +3 -0
  117. package/docs/src/components/tableControls/Hide.js +5 -0
  118. package/docs/src/components/tableControls/LastPage.js +9 -0
  119. package/docs/src/components/tableControls/NextPage.js +9 -0
  120. package/docs/src/components/tableControls/PageSelect.js +22 -0
  121. package/docs/src/components/tableControls/PageSize.js +5 -0
  122. package/docs/src/components/tableControls/PrevPage.js +9 -0
  123. package/docs/src/components/tableControls/Search.js +9 -0
  124. package/docs/src/components/tableControls/ShowAll.js +5 -0
  125. package/docs/src/components/tableControls/TableControl.js +16 -0
  126. package/docs/src/utils/debounce.js +1 -0
  127. package/docs/src/utils/drag.js +1 -0
  128. package/docs/src/utils/formatTimestamp.js +1 -0
  129. package/docs/src/utils/propConverters.js +1 -0
  130. package/docs/src/utils/toTitleCase.js +1 -0
  131. package/docs/src/utils/watchWindowSize.js +1 -0
  132. package/docs/utils/debounce.html +78 -0
  133. package/docs/utils/drag.html +89 -0
  134. package/docs/utils/formatTimestamp.html +114 -0
  135. package/docs/utils/propConverters.html +132 -0
  136. package/docs/utils/toTitleCase.html +71 -0
  137. package/docs/utils/watchWindowSize.html +166 -0
  138. package/icons/error.svg +1 -1
  139. package/icons/warning.svg +1 -1
  140. package/package.json +1 -1
  141. package/scripts/build.js +4 -1
  142. package/scripts/docs.js +4 -2
  143. package/src/components/Accordion.js +229 -0
  144. package/src/components/Collapsible.js +109 -0
  145. package/src/components/ContentSlider.js +205 -0
  146. package/src/components/Dialog.js +376 -0
  147. package/src/components/PersistantCollapsible.js +69 -0
  148. package/src/components/PhotoViewer.js +368 -0
  149. package/src/components/Resize.js +210 -0
  150. package/src/components/ShadowComponent.js +3 -1
  151. package/src/components/ShowMore.js +109 -0
  152. package/src/components/Sortable.js +193 -0
  153. package/src/components/Split.js +192 -0
  154. package/src/components/Table.js +1202 -0
  155. package/src/components/Tabs.js +428 -0
  156. package/src/components/Tags.js +253 -0
  157. package/src/components/Timestamp.js +31 -0
  158. package/src/components/Toast.js +454 -0
  159. package/src/components/Toggle.js +173 -0
  160. package/src/components/tableControls/DeleteRecord.js +29 -0
  161. package/src/components/tableControls/Edit.js +88 -0
  162. package/src/components/tableControls/ExportCSV.js +71 -0
  163. package/src/components/tableControls/ExportJson.js +55 -0
  164. package/src/components/tableControls/FieldSortHide.js +76 -0
  165. package/src/components/tableControls/Filters.js +114 -0
  166. package/src/components/tableControls/FirstPage.js +65 -0
  167. package/src/components/tableControls/HiddenCount.js +45 -0
  168. package/src/components/tableControls/Hide.js +34 -0
  169. package/src/components/tableControls/LastPage.js +65 -0
  170. package/src/components/tableControls/NextPage.js +65 -0
  171. package/src/components/tableControls/PageSelect.js +109 -0
  172. package/src/components/tableControls/PageSize.js +68 -0
  173. package/src/components/tableControls/PrevPage.js +65 -0
  174. package/src/components/tableControls/Search.js +58 -0
  175. package/src/components/tableControls/ShowAll.js +34 -0
  176. package/src/components/tableControls/TableControl.js +105 -0
  177. package/src/utils/debounce.js +9 -0
  178. package/src/utils/drag.js +80 -0
  179. package/src/utils/formatTimestamp.js +27 -0
  180. package/src/utils/toTitleCase.js +9 -0
  181. package/src/utils/watchWindowSize.js +16 -0
  182. package/dist/src/utils/cli.js +0 -1
  183. package/dist/src/utils/fs-utils.js +0 -1
  184. package/docs/components/component.html +0 -90
  185. package/docs/components/directory-viewer.html +0 -90
  186. package/docs/components/lazy-component.html +0 -84
  187. package/docs/components/reactive-component.html +0 -69
  188. package/docs/components/reactive-lazy-component.html +0 -69
  189. package/docs/components/search.html +0 -102
  190. package/docs/src/utils/cli.js +0 -1
  191. package/docs/src/utils/fs-utils.js +0 -1
  192. package/src/utils/cli.js +0 -43
  193. package/src/utils/fs-utils.js +0 -41
@@ -0,0 +1,454 @@
1
+ import { html, css } from '../lit-all.min.js';
2
+ import ShadowComponent from './ShadowComponent.js';
3
+ import './Icon.js';
4
+
5
+ export default class Toast extends ShadowComponent {
6
+ static properties = {
7
+ actionHtml: { type: String, reflect: true, attribute: 'action-html' },
8
+ closeHtml: { type: String, reflect: true, attribute: 'close-html' },
9
+ timeout: { type: Number, reflect: true },
10
+ opened: { type: Boolean, reflect: true },
11
+ hasAction: { type: Boolean, reflect: true, attribute: 'has-action' },
12
+ hasClose: { type: Boolean, reflect: true, attribute: 'has-close' },
13
+ hasIcon: { type: Boolean, reflect: true, attribute: 'has-icon' },
14
+ position: { type: String, reflect: true },
15
+ animating: { type: String, reflect: true }
16
+ };
17
+
18
+ static styles = css`
19
+ @keyframes toast-show-bottom {
20
+ from { opacity: 0; transform: translateY(20px); }
21
+ to { opacity: 1; transform: translateY(0); }
22
+ }
23
+ @keyframes toast-hide-bottom {
24
+ from { opacity: 1; transform: translateY(0); }
25
+ to { opacity: 0; transform: translateY(20px); }
26
+ }
27
+ @keyframes toast-show-top {
28
+ from { opacity: 0; transform: translateY(-20px); }
29
+ to { opacity: 1; transform: translateY(0); }
30
+ }
31
+ @keyframes toast-hide-top {
32
+ from { opacity: 1; transform: translateY(0); }
33
+ to { opacity: 0; transform: translateY(-20px); }
34
+ }
35
+ @keyframes toast-show-left {
36
+ from { opacity: 0; transform: translateX(-20px); }
37
+ to { opacity: 1; transform: translateX(0); }
38
+ }
39
+ @keyframes toast-hide-left {
40
+ from { opacity: 1; transform: translateX(0); }
41
+ to { opacity: 0; transform: translateX(-20px); }
42
+ }
43
+ @keyframes toast-show-right {
44
+ from { opacity: 0; transform: translateX(20px); }
45
+ to { opacity: 1; transform: translateX(0); }
46
+ }
47
+ @keyframes toast-hide-right {
48
+ from { opacity: 1; transform: translateX(0); }
49
+ to { opacity: 0; transform: translateX(20px); }
50
+ }
51
+
52
+ :host {
53
+ display: none;
54
+ min-width: 16rem;
55
+ max-width: calc(100% - (2 * var(--spacer, 1rem)));
56
+ background-color: var(--c_bg, #ffffff);
57
+ border-radius: var(--radius, 0.375rem);
58
+ }
59
+
60
+ :host([opened]) {
61
+ display: flex;
62
+ }
63
+
64
+ :host([animating="in"][position*="bottom"]) {
65
+ animation: toast-show-bottom var(--animation_ms, 300ms) ease forwards;
66
+ }
67
+ :host([animating="out"][position*="bottom"]) {
68
+ animation: toast-hide-bottom var(--animation_ms, 300ms) ease forwards;
69
+ }
70
+ :host([animating="in"][position*="top"]) {
71
+ animation: toast-show-top var(--animation_ms, 300ms) ease forwards;
72
+ }
73
+ :host([animating="out"][position*="top"]) {
74
+ animation: toast-hide-top var(--animation_ms, 300ms) ease forwards;
75
+ }
76
+ :host([animating="in"][position*="left"]:not([position*="top"]):not([position*="bottom"])) {
77
+ animation: toast-show-left var(--animation_ms, 300ms) ease forwards;
78
+ }
79
+ :host([animating="out"][position*="left"]:not([position*="top"]):not([position*="bottom"])) {
80
+ animation: toast-hide-left var(--animation_ms, 300ms) ease forwards;
81
+ }
82
+ :host([animating="in"][position*="right"]:not([position*="top"]):not([position*="bottom"])) {
83
+ animation: toast-show-right var(--animation_ms, 300ms) ease forwards;
84
+ }
85
+ :host([animating="out"][position*="right"]:not([position*="top"]):not([position*="bottom"])) {
86
+ animation: toast-hide-right var(--animation_ms, 300ms) ease forwards;
87
+ }
88
+
89
+ #icon {
90
+ padding: var(--spacer, 1rem);
91
+ padding-right: 0;
92
+ }
93
+
94
+ #message {
95
+ padding: var(--spacer, 1rem);
96
+ flex: 1 1 auto;
97
+ }
98
+
99
+ :host(:not([has-close])) #close,
100
+ :host(:not([has-action])) #action,
101
+ :host(:not([has-icon])) #icon {
102
+ display: none;
103
+ }
104
+
105
+ #action {
106
+ background: transparent;
107
+ border: none;
108
+ color: var(--tc_primary, blue);
109
+ cursor: pointer;
110
+ padding: var(--spacer, 1rem);
111
+ }
112
+
113
+ #action:hover {
114
+ color: var(--tc_primary__hover, lightblue);
115
+ }
116
+
117
+ #close {
118
+ background: transparent;
119
+ border: none;
120
+ cursor: pointer;
121
+ padding: var(--spacer, 1rem);
122
+ opacity: 0.7;
123
+ transition: opacity var(--animation_ms, 300ms);
124
+ }
125
+
126
+ #close:hover {
127
+ opacity: 1;
128
+ }
129
+
130
+ /* Theme classes */
131
+ :host(.bg-success) {
132
+ background-color: var(--c_success, #dcfce7);
133
+ color: var(--tc_on_success, #166534);
134
+ }
135
+
136
+ :host(.bg-warning) {
137
+ background-color: var(--c_warning, #fef3c7);
138
+ color: var(--tc_on_warning, #92400e);
139
+ }
140
+
141
+ :host(.bg-danger) {
142
+ background-color: var(--c_danger, #fee2e2);
143
+ color: var(--tc_on_danger, #991b1b);
144
+ }
145
+ `;
146
+
147
+ constructor() {
148
+ super();
149
+ this.actionHtml = '';
150
+ this.closeHtml = '';
151
+ this.timeout = 0;
152
+ this.opened = false;
153
+ this.hasAction = false;
154
+ this.hasClose = false;
155
+ this.hasIcon = false;
156
+ this.position = 'bottom center';
157
+ this.animating = '';
158
+ this.actionCallback = () => {};
159
+ this.closeCallback = () => {};
160
+ this.timeoutId = null;
161
+ this.closing = false;
162
+ }
163
+
164
+ /*
165
+ Lifecycle Methods
166
+ */
167
+ updated(changedProperties) {
168
+ super.updated(changedProperties);
169
+
170
+ if (changedProperties.has('opened') && this.opened) {
171
+ this.hasAction = !!this.querySelector('[slot="action"]');
172
+ this.hasClose = !!this.querySelector('[slot="close"]');
173
+ this.hasIcon = !!this.querySelector('[slot="icon"]');
174
+ }
175
+ }
176
+
177
+ connectedCallback() {
178
+ super.connectedCallback();
179
+ this.addEventListener('animationend', this.handleAnimationEnd);
180
+ }
181
+
182
+ disconnectedCallback() {
183
+ super.disconnectedCallback();
184
+ this.removeEventListener('animationend', this.handleAnimationEnd);
185
+ clearTimeout(this.timeoutId);
186
+ }
187
+
188
+ /*
189
+ Event Handlers
190
+ */
191
+ handleActionClick = () => {
192
+ if (this.actionCallback() !== false) {
193
+ this.close();
194
+ }
195
+ };
196
+
197
+ handleCloseClick = () => {
198
+ this.close();
199
+ };
200
+
201
+ handleAnimationEnd = (e) => {
202
+ if (e.animationName.includes('toast-hide')) {
203
+ this.animating = '';
204
+ this.opened = false;
205
+ this.dispatchEvent(new CustomEvent('close'));
206
+ this.dispatchEvent(new CustomEvent('openchange'));
207
+ this.closeCallback();
208
+ this.closing = false;
209
+ } else if (e.animationName.includes('toast-show')) {
210
+ this.animating = '';
211
+ }
212
+ };
213
+
214
+ /*
215
+ Public Methods
216
+ */
217
+ open() {
218
+ this.closing = false;
219
+ this.animating = 'in';
220
+ this.opened = true;
221
+
222
+ if (this.timeout) {
223
+ clearTimeout(this.timeoutId);
224
+ this.timeoutId = setTimeout(() => {
225
+ this.close();
226
+ }, this.timeout);
227
+ }
228
+
229
+ this.dispatchEvent(new CustomEvent('open'));
230
+ this.dispatchEvent(new CustomEvent('openchange'));
231
+ }
232
+
233
+ close() {
234
+ clearTimeout(this.timeoutId);
235
+ if (this.opened && !this.closing) {
236
+ this.closing = true;
237
+ this.animating = 'out';
238
+ // opened will be set to false in the animation end handler
239
+ }
240
+ }
241
+
242
+ /*
243
+ Rendering Logic
244
+ */
245
+ render() {
246
+ return html`
247
+ <div id="icon">
248
+ <slot name="icon"></slot>
249
+ </div>
250
+ <div id="message">
251
+ <slot></slot>
252
+ </div>
253
+ <button id="action" class="no-style" @click="${this.handleActionClick}">
254
+ <slot name="action"></slot>
255
+ </button>
256
+ <button id="close" class="no-style" @click="${this.handleCloseClick}">
257
+ <slot name="close"></slot>
258
+ </button>
259
+ `;
260
+ }
261
+
262
+ /*
263
+ Static Methods
264
+ */
265
+ static create(message, options = {}) {
266
+ let {
267
+ position = 'auto',
268
+ removeOnClose = true,
269
+ closeCallback = () => {},
270
+ action = false,
271
+ close = false,
272
+ icon = false,
273
+ timeout = 5000
274
+ } = options;
275
+
276
+ if (position === 'auto') {
277
+ position = window.innerWidth <= 768 ? 'bottom center' : 'top right';
278
+ }
279
+
280
+ let container = document.querySelector(`k-toast-container[position="${position}"]`);
281
+ if (!container) {
282
+ container = new ToastContainer(position);
283
+ document.body.appendChild(container);
284
+ }
285
+
286
+ const toast = new Toast();
287
+ toast.position = position;
288
+ toast.timeout = timeout;
289
+ toast.innerHTML = message;
290
+
291
+ // Set callbacks
292
+ toast.actionCallback = options.actionCallback || (() => {});
293
+ const originalCloseCallback = closeCallback;
294
+ toast.closeCallback = (...args) => {
295
+ if (removeOnClose) {
296
+ toast.remove();
297
+ if (container.children.length === 0) {
298
+ container.remove();
299
+ }
300
+ }
301
+ originalCloseCallback(...args);
302
+ };
303
+
304
+ // Add icon
305
+ if (icon) {
306
+ const iconElement = document.createElement('span');
307
+ iconElement.slot = 'icon';
308
+ if (icon instanceof HTMLElement) {
309
+ iconElement.appendChild(icon);
310
+ } else {
311
+ iconElement.innerHTML = icon;
312
+ }
313
+ toast.appendChild(iconElement);
314
+ }
315
+
316
+ // Add action
317
+ if (action) {
318
+ const actionElement = document.createElement('span');
319
+ actionElement.slot = 'action';
320
+ if (action instanceof HTMLElement) {
321
+ actionElement.appendChild(action);
322
+ } else {
323
+ actionElement.innerHTML = action;
324
+ }
325
+ toast.appendChild(actionElement);
326
+ }
327
+
328
+ // Add close
329
+ if (close) {
330
+ const closeElement = document.createElement('span');
331
+ closeElement.slot = 'close';
332
+ if (close instanceof HTMLElement) {
333
+ closeElement.appendChild(close);
334
+ } else {
335
+ closeElement.innerHTML = close;
336
+ }
337
+ toast.appendChild(closeElement);
338
+ }
339
+
340
+ container.appendChild(toast);
341
+ toast.open();
342
+ return toast;
343
+ }
344
+
345
+ static success(message, options = {}) {
346
+ const toast = Toast.create(message, {
347
+ icon: '<k-icon name="check"></k-icon>',
348
+ ...options
349
+ });
350
+ toast.classList.add('bg-success');
351
+ return toast;
352
+ }
353
+
354
+ static warning(message, options = {}) {
355
+ const toast = Toast.create(message, {
356
+ icon: '<k-icon name="warning"></k-icon>',
357
+ ...options
358
+ });
359
+ toast.classList.add('bg-warning');
360
+ return toast;
361
+ }
362
+
363
+ static error(message, options = {}) {
364
+ const toast = Toast.create(message, {
365
+ icon: '<k-icon name="error"></k-icon>',
366
+ ...options
367
+ });
368
+ toast.classList.add('bg-danger');
369
+ return toast;
370
+ }
371
+ }
372
+
373
+ class ToastContainer extends HTMLElement {
374
+ constructor(position = 'bottom center') {
375
+ super();
376
+ this.position = position.toLowerCase();
377
+ this.setAttribute('position', this.position);
378
+ this.applyStyles();
379
+ }
380
+
381
+ applyStyles() {
382
+ this.style.cssText = `
383
+ position: fixed;
384
+ display: flex;
385
+ flex-direction: column;
386
+ gap: 8px;
387
+ z-index: 1000;
388
+ pointer-events: auto;
389
+ padding: 32px;
390
+ box-sizing: border-box;
391
+ max-width: 100%;
392
+ max-height: 100%;
393
+ overflow: visible;
394
+ `;
395
+
396
+ const observer = new MutationObserver(() => {
397
+ Array.from(this.children).forEach(toast => {
398
+ if (toast.tagName === 'K-TOAST') {
399
+ toast.style.filter = 'drop-shadow(0 10px 15px rgba(0, 0, 0, 0.1)) drop-shadow(0 4px 6px rgba(0, 0, 0, 0.05))';
400
+ }
401
+ });
402
+ });
403
+
404
+ observer.observe(this, { childList: true });
405
+
406
+ // Apply to existing children
407
+ Array.from(this.children).forEach(toast => {
408
+ if (toast.tagName === 'K-TOAST') {
409
+ toast.style.filter = 'drop-shadow(0 10px 15px rgba(0, 0, 0, 0.1)) drop-shadow(0 4px 6px rgba(0, 0, 0, 0.05))';
410
+ }
411
+ });
412
+
413
+ const [vertical, horizontal] = this.position.split(' ');
414
+
415
+ // Vertical positioning
416
+ if (vertical === 'top') {
417
+ this.style.top = '0';
418
+ } else {
419
+ this.style.bottom = '0';
420
+ }
421
+
422
+ // Horizontal positioning
423
+ if (horizontal === 'left') {
424
+ this.style.left = '0';
425
+ this.style.alignItems = 'flex-start';
426
+ } else if (horizontal === 'right') {
427
+ this.style.right = '0';
428
+ this.style.alignItems = 'flex-end';
429
+ } else if (horizontal === 'center') {
430
+ if (vertical === 'top' || vertical === 'bottom') {
431
+ this.style.left = '50%';
432
+ this.style.transform = 'translateX(-50%)';
433
+ this.style.alignItems = 'center';
434
+ } else {
435
+ this.style.top = '50%';
436
+ this.style.left = '50%';
437
+ this.style.transform = 'translate(-50%, -50%)';
438
+ }
439
+ }
440
+ }
441
+
442
+ static getContainer(position) {
443
+ let container = document.querySelector(`k-toast-container[position="${position}"]`);
444
+ if (!container) {
445
+ container = new ToastContainer(position);
446
+ document.body.appendChild(container);
447
+ }
448
+ return container;
449
+ }
450
+ }
451
+
452
+ // Register custom elements
453
+ window.customElements.define('k-toast', Toast);
454
+ window.customElements.define('k-toast-container', ToastContainer);
@@ -0,0 +1,173 @@
1
+ import { html, css } from '../lit-all.min.js';
2
+ import ShadowComponent from './ShadowComponent.js';
3
+
4
+ export default class Toggle extends ShadowComponent {
5
+ static properties = {
6
+ value: { type: Boolean, reflect: true }
7
+ };
8
+
9
+ static styles = css`
10
+ :host {
11
+ --switch_height: 2rem;
12
+ --switch_width: 3rem;
13
+ --switch_border: 1px solid var(--c_border);
14
+ --switch_background__off: var(--c_bg__alt);
15
+ --switch_background__on: var(--c_success);
16
+ --handle_size__off: 1rem;
17
+ --handle_size__on: 1.5rem;
18
+ --handle_border: 1px solid var(--c_border);
19
+ --handle_background__off: var(--c_border);
20
+ --handle_background__on: white;
21
+
22
+ display: flex;
23
+ align-items: center;
24
+ cursor: pointer;
25
+ margin-bottom: var(--spacer);
26
+ border-radius: 999rem;
27
+ outline: none;
28
+ }
29
+
30
+ :host(:focus) {
31
+ outline: 2px solid var(--c_primary, blue);
32
+ outline-offset: 2px;
33
+ }
34
+
35
+ #switch {
36
+ display: flex;
37
+ align-items: center;
38
+ width: var(--switch_width);
39
+ height: var(--switch_height);
40
+ border: var(--switch_border);
41
+ background: var(--switch_background__off);
42
+ border-radius: 999rem;
43
+ margin-right: var(--spacer);
44
+ }
45
+
46
+ #handle {
47
+ --margin: calc( (var(--switch_height) - var(--handle_size__off)) / 2);
48
+ width: var(--handle_size__off);
49
+ height: var(--handle_size__off);
50
+ border: var(--handle_border);
51
+ background: var(--handle_background__off);
52
+ border-radius: 999rem;
53
+ transform: translateX(var(--margin));
54
+ transition: width var(--animation_ms, 256ms), height var(--animation_ms, 256ms), transform var(--animation_ms, 256ms);
55
+ }
56
+
57
+ :host([value]) #switch {
58
+ background: var(--switch_background__on);
59
+ }
60
+
61
+ :host([value]) #handle {
62
+ --m: calc( (var(--switch_height) - var(--handle_size__on)) / 2);
63
+ --d: calc( var(--switch_width) - var(--handle_size__on) - var(--m));
64
+ width: var(--handle_size__on);
65
+ height: var(--handle_size__on);
66
+ background: var(--handle_background__on);
67
+ transform: translateX(var(--d));
68
+ }
69
+
70
+ #label {
71
+ display: block;
72
+ flex: 1 1 auto;
73
+ padding: 0;
74
+ }
75
+ `;
76
+
77
+ constructor() {
78
+ super();
79
+ this.value = false;
80
+ this.tabIndex = 0;
81
+ }
82
+
83
+ /*
84
+ Lifecycle Methods
85
+ */
86
+ updated(changedProperties) {
87
+ super.updated(changedProperties);
88
+
89
+ if (changedProperties.has('value')) {
90
+ this.dispatchEvent(new CustomEvent('change', {
91
+ detail: { value: this.value },
92
+ bubbles: true
93
+ }));
94
+ }
95
+ }
96
+
97
+ connectedCallback() {
98
+ super.connectedCallback();
99
+ this.addEventListener('click', this.handleClick);
100
+ this.addEventListener('keydown', this.handleKeyDown);
101
+ }
102
+
103
+ disconnectedCallback() {
104
+ super.disconnectedCallback();
105
+ this.removeEventListener('click', this.handleClick);
106
+ this.removeEventListener('keydown', this.handleKeyDown);
107
+ }
108
+
109
+ /*
110
+ Event Handlers
111
+ */
112
+ handleClick = () => {
113
+ this.toggle();
114
+ };
115
+
116
+ handleKeyDown = (event) => {
117
+ if (['Space', 'Enter'].includes(event.code)) {
118
+ event.preventDefault();
119
+ this.toggle();
120
+ }
121
+ };
122
+
123
+ /*
124
+ Public Methods
125
+ */
126
+ on() {
127
+ this.value = true;
128
+ this.dispatchEvent(new CustomEvent('on', {
129
+ detail: { value: true },
130
+ bubbles: true
131
+ }));
132
+ return this;
133
+ }
134
+
135
+ off() {
136
+ this.value = false;
137
+ this.dispatchEvent(new CustomEvent('off', {
138
+ detail: { value: false },
139
+ bubbles: true
140
+ }));
141
+ return this;
142
+ }
143
+
144
+ toggle() {
145
+ if (this.value) {
146
+ this.off();
147
+ } else {
148
+ this.on();
149
+ }
150
+ this.dispatchEvent(new CustomEvent('toggle', {
151
+ detail: { value: this.value },
152
+ bubbles: true
153
+ }));
154
+ return this;
155
+ }
156
+
157
+ /*
158
+ Rendering Logic
159
+ */
160
+ render() {
161
+ return html`
162
+ <div id="switch">
163
+ <div id="handle"></div>
164
+ </div>
165
+ <label id="label">
166
+ <slot></slot>
167
+ </label>
168
+ `;
169
+ }
170
+ }
171
+
172
+ // Register custom element
173
+ window.customElements.define('k-toggle', Toggle);
@@ -0,0 +1,29 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+
5
+ export default class DeleteRecord extends TableControl {
6
+ /*
7
+ Public Methods
8
+ */
9
+ delete = () => {
10
+ if(this.record) {
11
+ this.table.deleteRecord(this.record);
12
+ }
13
+ };
14
+
15
+ /*
16
+ Rendering
17
+ */
18
+ render() {
19
+ return html`
20
+ <button class="no-btn icon-btn" @click="${this.delete}">
21
+ <slot>
22
+ <k-icon name="delete"></k-icon>
23
+ </slot>
24
+ </button>
25
+ `;
26
+ }
27
+ }
28
+
29
+ customElements.define('k-tc-delete-record', DeleteRecord);