@kubex/zinc 1.0.8 → 1.0.10

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 (38) hide show
  1. package/dist/custom-elements.json +229 -10
  2. package/dist/vscode.html-custom-data.json +15 -2
  3. package/dist/web-types.json +64 -5
  4. package/dist/zn.d.ts +40 -2
  5. package/dist/zn.min.css +1 -1
  6. package/dist/zn.min.js +385 -372
  7. package/docs/pages/components/button.md +14 -0
  8. package/docs/pages/components/dropdown.md +6 -1
  9. package/docs/pages/components/table.md +1 -1
  10. package/package.json +1 -1
  11. package/scss/themes/_light.scss +1 -1
  12. package/src/components/button/button.component.ts +12 -20
  13. package/src/components/button/button.scss +3 -33
  14. package/src/components/button-menu/button-menu.component.ts +1 -0
  15. package/src/components/content-block/content-block.scss +54 -0
  16. package/src/components/data-table/data-table.component.ts +22 -3
  17. package/src/components/editor/editor.component.ts +110 -55
  18. package/src/components/editor/editor.scss +0 -1
  19. package/src/components/editor/modules/context-menu/context-menu-component.ts +1 -0
  20. package/src/components/editor/modules/context-menu/context-menu.scss +1 -1
  21. package/src/components/editor/modules/context-menu/context-menu.ts +58 -26
  22. package/src/components/editor/modules/context-menu/quick-action/quick-action.component.ts +1 -0
  23. package/src/components/editor/modules/toolbar/toolbar.component.ts +61 -33
  24. package/src/components/editor/modules/toolbar/toolbar.ts +19 -4
  25. package/src/components/header/header.scss +1 -0
  26. package/src/components/menu/menu.component.ts +2 -1
  27. package/src/components/menu-item/menu-item.component.ts +4 -0
  28. package/src/components/note/note.component.ts +2 -25
  29. package/src/components/note/note.scss +0 -7
  30. package/src/components/order-table/order-table.scss +16 -10
  31. package/src/components/panel/panel.component.ts +9 -3
  32. package/src/components/panel/panel.scss +8 -0
  33. package/src/components/popup/popup.component.ts +11 -21
  34. package/src/components/settings-container/settings-container.component.ts +22 -16
  35. package/src/components/settings-container/settings-container.scss +5 -4
  36. package/src/components/tabs/tabs.component.ts +24 -6
  37. package/src/components/tooltip/tooltip.component.ts +7 -7
  38. package/src/internal/form.ts +41 -3
@@ -1,5 +1,6 @@
1
1
  import {classMap} from "lit/directives/class-map.js";
2
2
  import {type CSSResultGroup, html, unsafeCSS} from 'lit';
3
+ import {deepQuerySelectorAll} from "../../utilities/query";
3
4
  import {property, state} from "lit/decorators.js";
4
5
  import {Store} from "../../internal/storage";
5
6
  import {type ZnChangeEvent} from "../../events/zn-change";
@@ -7,7 +8,6 @@ import ZincElement from '../../internal/zinc-element';
7
8
  import type ZnCheckbox from "../checkbox";
8
9
 
9
10
  import styles from './settings-container.scss';
10
- import {deepQuerySelectorAll} from "../../utilities/query";
11
11
 
12
12
  interface SettingsContainerFilter {
13
13
  attribute: string;
@@ -202,25 +202,31 @@ export default class ZnSettingsContainer extends ZincElement {
202
202
  </div>
203
203
  <zn-dropdown placement="${placement}" class="${classMap({
204
204
  'setting-container__dropdown': true,
205
- 'setting-container__dropdown--top-end': this.position === 'top-end',
206
- 'setting-container__dropdown--top-start': this.position === 'top-start',
207
- 'setting-container__dropdown--bottom-end': this.position === 'bottom-end',
208
- 'setting-container__dropdown--bottom-start': this.position === 'bottom-start',
205
+ [`setting-container__dropdown--${this.position}`]: true,
209
206
  })}">
210
207
  <zn-icon class="setting-container__toggle-button" slot="trigger" size="24" src="settings" round></zn-icon>
211
- <div class="settings-container__dropdown-content">
212
- <slot name="filter" style="display: none;" @slotchange="${this.handleFiltersSlotChange}"></slot>
213
- ${this.filters.map(filter => html`
214
- <zn-checkbox class="settings-container__dropdown-item"
215
- data-attribute="${filter.attribute}"
216
- ?checked="${filter.checked}"
217
- @zn-change="${this.updateFilter}">
218
- ${filter.label}
219
- </zn-checkbox>
220
- `)}
221
- </div>
208
+ ${this.getDropdownContent()}
222
209
  </zn-dropdown>
223
210
  </div>
224
211
  `;
225
212
  }
213
+
214
+ private getDropdownContent() {
215
+ const hasDropdownContent = this.querySelector('[slot="dropdown-content"]');
216
+ if (hasDropdownContent) {
217
+ return html`
218
+ <slot name="dropdown-content"></slot>`;
219
+ }
220
+ return html`
221
+ <div class="settings-container__dropdown-content">
222
+ <slot name="filter" style="display: none;" @slotchange="${this.handleFiltersSlotChange}"></slot>
223
+ ${this.filters.map(filter => html`
224
+ <zn-checkbox class="settings-container__dropdown-item"
225
+ data-attribute="${filter.attribute}"
226
+ .checked=${filter.checked}
227
+ @zn-change=${this.updateFilter}>
228
+ ${filter.label}
229
+ </zn-checkbox>`)}
230
+ </div>`;
231
+ }
226
232
  }
@@ -31,7 +31,6 @@
31
31
  padding: 4px;
32
32
  background: rgba(var(--zn-panel, 0.8));
33
33
  box-shadow: var(--zn-shadow-small);
34
- transition: bottom 0.2s ease;
35
34
  opacity: 0.7;
36
35
  transition-duration: 0.3s;
37
36
  transition-property: opacity;
@@ -70,13 +69,15 @@
70
69
  opacity: 1;
71
70
  }
72
71
 
72
+ .setting-container__toggle-button::part(icon) {
73
+ rotate: 0deg;
74
+ transition: rotate 0.9s ease-in-out, color 0.9s ease-in-out;
75
+ }
76
+
73
77
  .setting-container__dropdown[open] .setting-container__toggle-button::part(icon), .setting-container__toggle-button:hover::part(icon) {
74
78
  color: rgb(var(--zn-primary));
75
79
  cursor: pointer;
76
- transition-duration: 0.9s;
77
- transition-property: rotate, color;
78
80
  rotate: 380deg;
79
- transition-timing-function: ease-in-out;
80
81
  }
81
82
 
82
83
  zn-button {
@@ -295,7 +295,6 @@ export default class ZnTabs extends ZincElement {
295
295
  let hasActive = false;
296
296
  this._tabs.forEach(tab => {
297
297
 
298
-
299
298
  if (tab.hasAttribute('tab-uri') && this._knownUri.has(tab.getAttribute('tab-uri')!)) {
300
299
  tab.setAttribute('tab', this._knownUri.get(tab.getAttribute('tab-uri')!)!);
301
300
  }
@@ -407,19 +406,38 @@ export default class ZnTabs extends ZincElement {
407
406
  }
408
407
 
409
408
  removeTabAndPanel(tabId: string) {
410
- if (this._panels.has(tabId)) {
411
- this._panels.delete(tabId);
409
+ if (this._current === tabId) {
410
+ this.setActiveTab('', true, false);
412
411
  }
413
412
 
414
413
  for (const tab of this._tabs) {
415
414
  if (tab.getAttribute('tab') === tabId) {
416
- tab.remove();
415
+
416
+ if (tab.hasAttribute('tab-uri')) {
417
+ const tabUri = tab.getAttribute('tab-uri')!;
418
+ if (this._knownUri.has(tabUri)) {
419
+ this._knownUri.delete(tabUri);
420
+ }
421
+ }
422
+
423
+ //tab.remove();
424
+ tab.parentElement?.removeChild(tab)
417
425
  this._tabs.splice(this._tabs.indexOf(tab), 1);
418
426
  }
419
427
  }
420
428
 
421
- if (this._current === tabId) {
422
- this.setActiveTab('', true, false);
429
+ if (this._panels.has(tabId)) {
430
+ const panel = this._panels.get(tabId);
431
+ if (panel instanceof HTMLElement) {
432
+ panel.remove();
433
+ } else if (panel instanceof Array) {
434
+ panel.forEach((item) => {
435
+ if (item instanceof HTMLElement) {
436
+ item.remove();
437
+ }
438
+ })
439
+ }
440
+ this._panels.delete(tabId);
423
441
  }
424
442
  }
425
443
 
@@ -191,14 +191,14 @@ export default class ZnTooltip extends ZincElement {
191
191
  <zn-popup
192
192
  part="base"
193
193
  exportparts="popup:base__popup,arrow:base__arrow"
194
- class=${classMap({
194
+ class="${classMap({
195
195
  tooltip: true,
196
196
  'tooltip--open': this.open
197
- })}
198
- placement=${this.placement}
199
- distance=${this.distance}
200
- skidding=${this.skidding}
201
- strategy=${this.hoist ? 'fixed' : 'absolute'}
197
+ })}"
198
+ placement="${this.placement}"
199
+ distance="${this.distance}"
200
+ skidding="${this.skidding}"
201
+ strategy="${this.hoist ? 'fixed' : 'absolute'}"
202
202
  flip
203
203
  shift
204
204
  arrow
@@ -206,7 +206,7 @@ export default class ZnTooltip extends ZincElement {
206
206
  <slot slot="anchor"></slot>
207
207
  <div part="body" id="tooltip" class="tooltip__body"
208
208
  role="tooltip"
209
- aria-live=${this.open ? 'polite' : 'off'}
209
+ aria-live="${this.open ? 'polite' : 'off'}"
210
210
  aria-label="tooltip">
211
211
  <slot name="content">${this.content}</slot>
212
212
  </div>
@@ -235,12 +235,50 @@ export class FormControlController implements ReactiveController {
235
235
  name.length > 0 &&
236
236
  typeof value !== 'undefined'
237
237
  ) {
238
- if (Array.isArray(value)) {
238
+ const appendPrimitive = (val: string | number | boolean) => {
239
+ event.formData.append(name, val.toString());
240
+ };
241
+ const appendFile = (file: Blob, filename?: string) => {
242
+ // If a filename is provided or it's a File (has name), FormData will use it properly
243
+ const maybeFile = file as unknown as File;
244
+ const fname = filename ?? (typeof maybeFile.name === 'string' ? maybeFile.name : undefined);
245
+ // Overloads: append(name, blob, filename?)
246
+ if (typeof fname === 'string') {
247
+ event.formData.append(name, file, fname);
248
+ } else {
249
+ event.formData.append(name, file);
250
+ }
251
+ };
252
+
253
+ const isFileList = (val: unknown): val is FileList => typeof FileList !== 'undefined' && val instanceof FileList;
254
+ const isBlob = (val: unknown): val is Blob => typeof Blob !== 'undefined' && val instanceof Blob;
255
+
256
+ if (isFileList(value)) {
257
+ // Match native input[type=file] behavior: append each File; if empty, append nothing
258
+ if (value.length > 0) {
259
+ for (let i = 0; i < value.length; i++) {
260
+ const f = value.item(i);
261
+ if (f) appendFile(f, f.name);
262
+ }
263
+ }
264
+ } else if (isBlob(value)) {
265
+ appendFile(value, (value as unknown as File).name);
266
+ } else if (Array.isArray(value)) {
239
267
  (value as unknown[]).forEach(val => {
240
- event.formData.append(name, (val as string | number | boolean).toString());
268
+ if (isBlob(val)) {
269
+ appendFile(val as Blob, (val as unknown as File).name);
270
+ } else if (isFileList(val)) {
271
+ const fl = val as FileList;
272
+ for (let i = 0; i < fl.length; i++) {
273
+ const f = fl.item(i);
274
+ if (f) appendFile(f, f.name);
275
+ }
276
+ } else {
277
+ appendPrimitive(val as string | number | boolean);
278
+ }
241
279
  });
242
280
  } else {
243
- event.formData.append(name, (value as string | number | boolean).toString());
281
+ appendPrimitive(value as string | number | boolean);
244
282
  }
245
283
 
246
284
  this.host.dispatchEvent(new CustomEvent('zn-formdata', {bubbles: true, composed: true}));