@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.
- package/dist/custom-elements.json +229 -10
- package/dist/vscode.html-custom-data.json +15 -2
- package/dist/web-types.json +64 -5
- package/dist/zn.d.ts +40 -2
- package/dist/zn.min.css +1 -1
- package/dist/zn.min.js +385 -372
- package/docs/pages/components/button.md +14 -0
- package/docs/pages/components/dropdown.md +6 -1
- package/docs/pages/components/table.md +1 -1
- package/package.json +1 -1
- package/scss/themes/_light.scss +1 -1
- package/src/components/button/button.component.ts +12 -20
- package/src/components/button/button.scss +3 -33
- package/src/components/button-menu/button-menu.component.ts +1 -0
- package/src/components/content-block/content-block.scss +54 -0
- package/src/components/data-table/data-table.component.ts +22 -3
- package/src/components/editor/editor.component.ts +110 -55
- package/src/components/editor/editor.scss +0 -1
- package/src/components/editor/modules/context-menu/context-menu-component.ts +1 -0
- package/src/components/editor/modules/context-menu/context-menu.scss +1 -1
- package/src/components/editor/modules/context-menu/context-menu.ts +58 -26
- package/src/components/editor/modules/context-menu/quick-action/quick-action.component.ts +1 -0
- package/src/components/editor/modules/toolbar/toolbar.component.ts +61 -33
- package/src/components/editor/modules/toolbar/toolbar.ts +19 -4
- package/src/components/header/header.scss +1 -0
- package/src/components/menu/menu.component.ts +2 -1
- package/src/components/menu-item/menu-item.component.ts +4 -0
- package/src/components/note/note.component.ts +2 -25
- package/src/components/note/note.scss +0 -7
- package/src/components/order-table/order-table.scss +16 -10
- package/src/components/panel/panel.component.ts +9 -3
- package/src/components/panel/panel.scss +8 -0
- package/src/components/popup/popup.component.ts +11 -21
- package/src/components/settings-container/settings-container.component.ts +22 -16
- package/src/components/settings-container/settings-container.scss +5 -4
- package/src/components/tabs/tabs.component.ts +24 -6
- package/src/components/tooltip/tooltip.component.ts +7 -7
- 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
|
-
|
|
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
|
-
|
|
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.
|
|
411
|
-
this.
|
|
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
|
-
|
|
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.
|
|
422
|
-
this.
|
|
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
|
|
194
|
+
class="${classMap({
|
|
195
195
|
tooltip: true,
|
|
196
196
|
'tooltip--open': this.open
|
|
197
|
-
})}
|
|
198
|
-
placement
|
|
199
|
-
distance
|
|
200
|
-
skidding
|
|
201
|
-
strategy
|
|
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
|
|
209
|
+
aria-live="${this.open ? 'polite' : 'off'}"
|
|
210
210
|
aria-label="tooltip">
|
|
211
211
|
<slot name="content">${this.content}</slot>
|
|
212
212
|
</div>
|
package/src/internal/form.ts
CHANGED
|
@@ -235,12 +235,50 @@ export class FormControlController implements ReactiveController {
|
|
|
235
235
|
name.length > 0 &&
|
|
236
236
|
typeof value !== 'undefined'
|
|
237
237
|
) {
|
|
238
|
-
|
|
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
|
-
|
|
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
|
-
|
|
281
|
+
appendPrimitive(value as string | number | boolean);
|
|
244
282
|
}
|
|
245
283
|
|
|
246
284
|
this.host.dispatchEvent(new CustomEvent('zn-formdata', {bubbles: true, composed: true}));
|