@editora/ui-core 0.1.21 → 0.1.22
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/accordion.cjs.js +3 -3
- package/dist/accordion.esm.js +3 -3
- package/dist/alert-dialog.cjs.js +32 -32
- package/dist/alert-dialog.esm.js +95 -75
- package/dist/alert.cjs.js +6 -6
- package/dist/alert.esm.js +6 -6
- package/dist/animated-list.cjs.js +4 -4
- package/dist/animated-list.esm.js +4 -4
- package/dist/animated-text.cjs.js +4 -4
- package/dist/animated-text.esm.js +4 -4
- package/dist/app-header.cjs.js +3 -3
- package/dist/app-header.esm.js +3 -3
- package/dist/aspect-ratio.cjs.js +3 -3
- package/dist/aspect-ratio.esm.js +3 -3
- package/dist/avatar.cjs.js +14 -14
- package/dist/avatar.esm.js +31 -29
- package/dist/badge.cjs.js +4 -4
- package/dist/badge.esm.js +4 -4
- package/dist/block-controls.cjs.js +4 -4
- package/dist/block-controls.esm.js +4 -4
- package/dist/box.cjs.js +2 -2
- package/dist/box.esm.js +2 -2
- package/dist/breadcrumb.cjs.js +5 -5
- package/dist/breadcrumb.esm.js +5 -5
- package/dist/button.cjs.js +1 -1
- package/dist/button.esm.js +1 -1
- package/dist/{calendar-DLY4acgn.mjs → calendar-DbxYRdlv.mjs} +227 -183
- package/dist/{calendar-Dkof-FTK.js → calendar-Qa-cFOp3.js} +74 -35
- package/dist/calendar.cjs.js +1 -1
- package/dist/calendar.esm.js +1 -1
- package/dist/card.cjs.js +8 -8
- package/dist/card.esm.js +63 -20
- package/dist/chart.cjs.js +4 -4
- package/dist/chart.esm.js +6 -6
- package/dist/checkbox.cjs.js +2 -2
- package/dist/checkbox.esm.js +2 -2
- package/dist/collapsible.cjs.js +7 -7
- package/dist/collapsible.esm.js +7 -7
- package/dist/color-picker.cjs.js +30 -10
- package/dist/color-picker.esm.js +82 -60
- package/dist/combobox.cjs.js +29 -27
- package/dist/combobox.esm.js +51 -45
- package/dist/command.cjs.js +2 -2
- package/dist/command.esm.js +2 -2
- package/dist/components/ui-alert-dialog.d.ts +1 -0
- package/dist/components/ui-alert-dialog.d.ts.map +1 -1
- package/dist/components/ui-avatar.d.ts +1 -0
- package/dist/components/ui-avatar.d.ts.map +1 -1
- package/dist/components/ui-button.d.ts +1 -0
- package/dist/components/ui-button.d.ts.map +1 -1
- package/dist/components/ui-calendar.d.ts.map +1 -1
- package/dist/components/ui-card.d.ts +3 -0
- package/dist/components/ui-card.d.ts.map +1 -1
- package/dist/components/ui-checkbox.d.ts.map +1 -1
- package/dist/components/ui-color-picker.d.ts.map +1 -1
- package/dist/components/ui-combobox.d.ts.map +1 -1
- package/dist/components/ui-data-table.d.ts.map +1 -1
- package/dist/components/ui-date-field.d.ts.map +1 -1
- package/dist/components/ui-date-picker.d.ts.map +1 -1
- package/dist/components/ui-date-range-picker.d.ts.map +1 -1
- package/dist/components/ui-date-range-time-picker.d.ts.map +1 -1
- package/dist/components/ui-date-time-picker.d.ts.map +1 -1
- package/dist/components/ui-dock.d.ts +1 -0
- package/dist/components/ui-dock.d.ts.map +1 -1
- package/dist/components/ui-drawer.d.ts.map +1 -1
- package/dist/components/ui-dropdown.d.ts.map +1 -1
- package/dist/components/ui-field.d.ts.map +1 -1
- package/dist/components/ui-file-upload.d.ts.map +1 -1
- package/dist/components/ui-gantt.d.ts.map +1 -1
- package/dist/components/ui-input.d.ts.map +1 -1
- package/dist/components/ui-menu.d.ts.map +1 -1
- package/dist/components/ui-multi-select.d.ts.map +1 -1
- package/dist/components/ui-number-field.d.ts.map +1 -1
- package/dist/components/ui-password-field.d.ts.map +1 -1
- package/dist/components/ui-pin-input.d.ts +1 -0
- package/dist/components/ui-pin-input.d.ts.map +1 -1
- package/dist/components/ui-placement-grid.d.ts.map +1 -1
- package/dist/components/ui-progress.d.ts.map +1 -1
- package/dist/components/ui-radio.d.ts.map +1 -1
- package/dist/components/ui-rating.d.ts +1 -0
- package/dist/components/ui-rating.d.ts.map +1 -1
- package/dist/components/ui-select.d.ts.map +1 -1
- package/dist/components/ui-sortable.d.ts.map +1 -1
- package/dist/components/ui-switch.d.ts.map +1 -1
- package/dist/components/ui-table.d.ts.map +1 -1
- package/dist/components/ui-tabs.d.ts +1 -0
- package/dist/components/ui-tabs.d.ts.map +1 -1
- package/dist/components/ui-tags-input.d.ts +1 -0
- package/dist/components/ui-tags-input.d.ts.map +1 -1
- package/dist/components/ui-textarea.d.ts.map +1 -1
- package/dist/components/ui-time-field.d.ts.map +1 -1
- package/dist/components/ui-toggle-group.d.ts.map +1 -1
- package/dist/components/ui-toggle.d.ts.map +1 -1
- package/dist/components/ui-tree.d.ts.map +1 -1
- package/dist/components/ui-wizard.d.ts.map +1 -1
- package/dist/context-menu.cjs.js +3 -3
- package/dist/context-menu.esm.js +4 -4
- package/dist/control-name-BmoI1m3a.js +1 -0
- package/dist/control-name-Bpj7F34X.mjs +48 -0
- package/dist/data-table.cjs.js +5 -2
- package/dist/data-table.esm.js +145 -142
- package/dist/date-field.cjs.js +5 -5
- package/dist/date-field.esm.js +34 -31
- package/dist/date-picker.cjs.js +16 -16
- package/dist/date-picker.esm.js +48 -44
- package/dist/date-range-picker.cjs.js +5 -5
- package/dist/date-range-picker.esm.js +120 -118
- package/dist/date-range-time-picker.cjs.js +22 -22
- package/dist/date-range-time-picker.esm.js +88 -84
- package/dist/date-time-picker.cjs.js +23 -23
- package/dist/date-time-picker.esm.js +102 -98
- package/dist/{date-time-utils-Dmost5Ee.js → date-time-utils-BzfTpeU-.js} +1 -1
- package/dist/{date-time-utils-y1N2gvG2.mjs → date-time-utils-Cps2aSu2.mjs} +1 -1
- package/dist/description.cjs.js +3 -3
- package/dist/description.esm.js +3 -3
- package/dist/dialog.cjs.js +2 -2
- package/dist/dialog.esm.js +2 -2
- package/dist/dock.cjs.js +12 -12
- package/dist/dock.esm.js +72 -74
- package/dist/drawer.cjs.js +19 -19
- package/dist/drawer.esm.js +58 -58
- package/dist/dropdown.cjs.js +13 -13
- package/dist/dropdown.esm.js +49 -48
- package/dist/empty-state.cjs.js +3 -3
- package/dist/empty-state.esm.js +3 -3
- package/dist/field-error.cjs.js +1 -1
- package/dist/field-error.esm.js +1 -1
- package/dist/field.cjs.js +12 -12
- package/dist/field.esm.js +84 -75
- package/dist/fieldset.cjs.js +4 -4
- package/dist/fieldset.esm.js +4 -4
- package/dist/file-upload.cjs.js +3 -3
- package/dist/file-upload.esm.js +5 -3
- package/dist/floating-toolbar.cjs.js +8 -8
- package/dist/floating-toolbar.esm.js +9 -9
- package/dist/form.cjs.js +11 -11
- package/dist/form.esm.js +11 -11
- package/dist/gantt.cjs.js +43 -32
- package/dist/gantt.esm.js +99 -88
- package/dist/icon-cloud.cjs.js +3 -3
- package/dist/icon-cloud.esm.js +3 -3
- package/dist/icon.cjs.js +1 -1
- package/dist/icon.esm.js +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +121 -118
- package/dist/inline-edit.cjs.js +1 -1
- package/dist/inline-edit.esm.js +1 -1
- package/dist/input.cjs.js +14 -14
- package/dist/input.esm.js +39 -32
- package/dist/label.cjs.js +3 -3
- package/dist/label.esm.js +3 -3
- package/dist/{listbox-B6QgECax.js → listbox-CTpRpuF7.js} +1 -1
- package/dist/{listbox-DJamVeFj.mjs → listbox-hMVOhKHC.mjs} +1 -1
- package/dist/listbox.cjs.js +1 -1
- package/dist/listbox.esm.js +1 -1
- package/dist/marquee.cjs.js +3 -3
- package/dist/marquee.esm.js +3 -3
- package/dist/{menu-item-styles-CbNUEwP2.js → menu-item-styles-B4onAr4C.js} +3 -3
- package/dist/{menu-item-styles-CZiPwPwl.mjs → menu-item-styles-IGSFLAHu.mjs} +3 -3
- package/dist/menu.cjs.js +7 -7
- package/dist/menu.esm.js +29 -28
- package/dist/menubar.cjs.js +1 -1
- package/dist/menubar.esm.js +2 -2
- package/dist/meter.cjs.js +1 -1
- package/dist/meter.esm.js +1 -1
- package/dist/multi-select.cjs.js +17 -17
- package/dist/multi-select.esm.js +51 -43
- package/dist/navigation-menu.cjs.js +1 -1
- package/dist/navigation-menu.esm.js +1 -1
- package/dist/number-field.cjs.js +11 -13
- package/dist/number-field.esm.js +29 -27
- package/dist/number-ticker.cjs.js +4 -4
- package/dist/number-ticker.esm.js +4 -4
- package/dist/odometer.cjs.js +2 -2
- package/dist/odometer.esm.js +2 -2
- package/dist/orbiter.cjs.js +3 -3
- package/dist/orbiter.esm.js +3 -3
- package/dist/pagination.cjs.js +1 -1
- package/dist/pagination.esm.js +1 -1
- package/dist/password-field.cjs.js +23 -23
- package/dist/password-field.esm.js +48 -47
- package/dist/pin-input.cjs.js +8 -6
- package/dist/pin-input.esm.js +21 -15
- package/dist/placement-grid.cjs.js +4 -4
- package/dist/placement-grid.esm.js +58 -58
- package/dist/plugin-panel.cjs.js +1 -1
- package/dist/plugin-panel.esm.js +1 -1
- package/dist/popover.cjs.js +5 -5
- package/dist/popover.esm.js +4 -4
- package/dist/primitives/control-name.d.ts +30 -0
- package/dist/primitives/control-name.d.ts.map +1 -0
- package/dist/primitives/trigger.d.ts +2 -0
- package/dist/primitives/trigger.d.ts.map +1 -0
- package/dist/progress.cjs.js +4 -4
- package/dist/progress.esm.js +20 -18
- package/dist/quick-actions.cjs.js +3 -3
- package/dist/quick-actions.esm.js +3 -3
- package/dist/radio-group.cjs.js +1 -1
- package/dist/radio-group.esm.js +1 -1
- package/dist/radio.cjs.js +2 -2
- package/dist/radio.esm.js +2 -2
- package/dist/rating.cjs.js +17 -16
- package/dist/rating.esm.js +91 -92
- package/dist/{runtime-D1gFh1fS.mjs → runtime-CFnK53iC.mjs} +133 -94
- package/dist/runtime-DwE-tizc.js +1 -0
- package/dist/runtime.cjs.js +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.esm.js +29 -26
- package/dist/select.cjs.js +20 -19
- package/dist/select.esm.js +36 -32
- package/dist/selection-popup.cjs.js +2 -2
- package/dist/selection-popup.esm.js +2 -2
- package/dist/separator.cjs.js +7 -7
- package/dist/separator.esm.js +7 -7
- package/dist/sidebar.cjs.js +7 -7
- package/dist/sidebar.esm.js +7 -7
- package/dist/skeleton.cjs.js +7 -7
- package/dist/skeleton.esm.js +7 -7
- package/dist/slider.cjs.js +3 -3
- package/dist/slider.esm.js +3 -3
- package/dist/slot.cjs.js +3 -3
- package/dist/slot.esm.js +3 -3
- package/dist/sortable.cjs.js +41 -42
- package/dist/sortable.esm.js +98 -99
- package/dist/spinning-text.cjs.js +3 -3
- package/dist/spinning-text.esm.js +3 -3
- package/dist/split-button.cjs.js +1 -1
- package/dist/split-button.esm.js +1 -1
- package/dist/stepper.cjs.js +1 -1
- package/dist/stepper.esm.js +1 -1
- package/dist/switch.cjs.js +10 -12
- package/dist/switch.esm.js +10 -12
- package/dist/table.cjs.js +9 -6
- package/dist/table.esm.js +46 -43
- package/dist/tabs.cjs.js +20 -21
- package/dist/tabs.esm.js +70 -66
- package/dist/tags-input.cjs.js +9 -9
- package/dist/tags-input.esm.js +32 -25
- package/dist/textarea.cjs.js +10 -10
- package/dist/textarea.esm.js +30 -21
- package/dist/theme.d.ts +18 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/time-field.cjs.js +5 -5
- package/dist/time-field.esm.js +21 -18
- package/dist/time-picker.cjs.js +4 -4
- package/dist/time-picker.esm.js +5 -5
- package/dist/timeline.cjs.js +2 -2
- package/dist/timeline.esm.js +4 -4
- package/dist/toast.cjs.js +6 -6
- package/dist/toast.esm.js +13 -13
- package/dist/toggle-group.cjs.js +5 -6
- package/dist/toggle-group.esm.js +63 -60
- package/dist/toggle.cjs.js +18 -18
- package/dist/toggle.esm.js +32 -31
- package/dist/tooltip.cjs.js +4 -4
- package/dist/tooltip.esm.js +4 -4
- package/dist/transfer-list.cjs.js +3 -3
- package/dist/transfer-list.esm.js +3 -3
- package/dist/tree-7qbVnpGp.js +39 -0
- package/dist/{tree-B3kE8ESs.mjs → tree-Deoft-kO.mjs} +34 -33
- package/dist/tree.cjs.js +1 -1
- package/dist/tree.esm.js +1 -1
- package/dist/trigger-BjnxLCeQ.mjs +9 -0
- package/dist/trigger-DkPsKxsP.js +1 -0
- package/dist/{ui-button-rXQOS9QJ.js → ui-button-BInsgSbr.js} +27 -26
- package/dist/{ui-button-Q0GNNWKC.mjs → ui-button-rfiuUnUD.mjs} +65 -48
- package/dist/{ui-icon-YI6lyuqU.mjs → ui-icon-BSi_GtqO.mjs} +2 -2
- package/dist/{ui-icon-BzVNC_lr.js → ui-icon-Bvt9oIIR.js} +5 -5
- package/dist/wizard.cjs.js +12 -13
- package/dist/wizard.esm.js +17 -15
- package/package.json +1 -1
- package/dist/runtime-CTaOSmBj.js +0 -1
- package/dist/tree-Dx_kv_ih.js +0 -39
package/dist/field.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as
|
|
2
|
-
const
|
|
1
|
+
import { E as $ } from "./ElementBase-YlTLMsGk.mjs";
|
|
2
|
+
const N = `
|
|
3
3
|
:host {
|
|
4
4
|
--ui-field-gap: 8px;
|
|
5
5
|
--ui-field-label-width: 192px;
|
|
@@ -7,8 +7,8 @@ const E = `
|
|
|
7
7
|
--ui-field-bg: var(--ui-color-surface, var(--ui-surface, #ffffff));
|
|
8
8
|
--ui-field-color: var(--ui-color-text, var(--ui-text, #0f172a));
|
|
9
9
|
--ui-field-label-color: var(--ui-color-text, var(--ui-text, #0f172a));
|
|
10
|
-
--ui-field-description-color: var(--ui-color-muted, var(--ui-muted, #
|
|
11
|
-
--ui-field-error-color: var(--ui-color-danger, var(--ui-error, #
|
|
10
|
+
--ui-field-description-color: var(--ui-color-muted, var(--ui-muted, #526175));
|
|
11
|
+
--ui-field-error-color: var(--ui-color-danger, var(--ui-error, #c81e1e));
|
|
12
12
|
--ui-field-border-color: color-mix(in srgb, var(--ui-color-border, #cbd5e1) 72%, transparent);
|
|
13
13
|
--ui-field-border: 1px solid var(--ui-field-border-color);
|
|
14
14
|
--ui-field-shadow:
|
|
@@ -217,7 +217,7 @@ const E = `
|
|
|
217
217
|
|
|
218
218
|
:host([tone="danger"]) {
|
|
219
219
|
--ui-field-accent: #dc2626;
|
|
220
|
-
--ui-field-error-color: #
|
|
220
|
+
--ui-field-error-color: #c81e1e;
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
:host([density="compact"]) {
|
|
@@ -372,29 +372,29 @@ const E = `
|
|
|
372
372
|
}
|
|
373
373
|
}
|
|
374
374
|
`;
|
|
375
|
-
function
|
|
376
|
-
return
|
|
375
|
+
function C(r) {
|
|
376
|
+
return r.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
377
377
|
}
|
|
378
|
-
function
|
|
379
|
-
if (!
|
|
380
|
-
const
|
|
381
|
-
return
|
|
378
|
+
function A(r) {
|
|
379
|
+
if (!r) return !1;
|
|
380
|
+
const t = r.assignedNodes({ flatten: !0 });
|
|
381
|
+
return t.length ? t.some((i) => i.nodeType === Node.TEXT_NODE ? !!i.textContent?.trim() : i.nodeType === Node.ELEMENT_NODE) : !1;
|
|
382
382
|
}
|
|
383
|
-
function
|
|
384
|
-
if (
|
|
385
|
-
const
|
|
386
|
-
return !(
|
|
383
|
+
function x(r) {
|
|
384
|
+
if (r.hasAttribute("disabled") || r.getAttribute("aria-disabled") === "true" || r.getAttribute("tabindex") === "-1") return !1;
|
|
385
|
+
const t = window.getComputedStyle(r);
|
|
386
|
+
return !(t.display === "none" || t.visibility === "hidden");
|
|
387
387
|
}
|
|
388
|
-
function
|
|
389
|
-
return !!
|
|
388
|
+
function D(r) {
|
|
389
|
+
return !!r.closest(
|
|
390
390
|
'button, a, input, select, textarea, summary, [contenteditable=""], [contenteditable="true"], [role="button"]'
|
|
391
391
|
);
|
|
392
392
|
}
|
|
393
|
-
function
|
|
394
|
-
return Array.from(new Set(
|
|
393
|
+
function k(r) {
|
|
394
|
+
return Array.from(new Set(r.filter(Boolean)));
|
|
395
395
|
}
|
|
396
|
-
const S = 'ui-input, ui-textarea, ui-select, ui-combobox, input, textarea, select, button, [tabindex]:not([tabindex="-1"])';
|
|
397
|
-
class
|
|
396
|
+
const _ = "data-ui-field-label", S = "data-ui-field-description", L = 'ui-input, ui-textarea, ui-select, ui-combobox, input, textarea, select, button, [tabindex]:not([tabindex="-1"])';
|
|
397
|
+
class M extends $ {
|
|
398
398
|
constructor() {
|
|
399
399
|
super(), this._uid = Math.random().toString(36).slice(2, 9), this._controlCache = null, this._stateSyncQueued = !1, this._onRootClick = this._onRootClick.bind(this), this._onSlotChange = this._onSlotChange.bind(this);
|
|
400
400
|
}
|
|
@@ -422,25 +422,25 @@ class k extends A {
|
|
|
422
422
|
disconnectedCallback() {
|
|
423
423
|
this.root.removeEventListener("click", this._onRootClick), this.root.removeEventListener("slotchange", this._onSlotChange), super.disconnectedCallback();
|
|
424
424
|
}
|
|
425
|
-
attributeChangedCallback(
|
|
426
|
-
if (
|
|
427
|
-
if (
|
|
428
|
-
const
|
|
429
|
-
|
|
425
|
+
attributeChangedCallback(t, i, l) {
|
|
426
|
+
if (i !== l) {
|
|
427
|
+
if (t === "for" && this._invalidateControlCache(), t === "label-width") {
|
|
428
|
+
const o = this.getAttribute("label-width");
|
|
429
|
+
o ? this.style.setProperty("--ui-field-label-width", o) : this.style.removeProperty("--ui-field-label-width");
|
|
430
430
|
}
|
|
431
|
-
if (
|
|
431
|
+
if (t === "label" || t === "description" || t === "error" || t === "required" || t === "for") {
|
|
432
432
|
this.isConnected && this.requestRender();
|
|
433
433
|
return;
|
|
434
434
|
}
|
|
435
|
-
|
|
435
|
+
t === "invalid" && this._scheduleDerivedStateSync();
|
|
436
436
|
}
|
|
437
437
|
}
|
|
438
438
|
_onSlotChange() {
|
|
439
439
|
this._invalidateControlCache(), this._scheduleDerivedStateSync();
|
|
440
440
|
}
|
|
441
|
-
_onRootClick(
|
|
442
|
-
const
|
|
443
|
-
|
|
441
|
+
_onRootClick(t) {
|
|
442
|
+
const i = t.target;
|
|
443
|
+
i && i.closest(".label") && (D(i) || this._focusControl());
|
|
444
444
|
}
|
|
445
445
|
_invalidateControlCache() {
|
|
446
446
|
this._controlCache = null;
|
|
@@ -451,66 +451,75 @@ class k extends A {
|
|
|
451
451
|
}));
|
|
452
452
|
}
|
|
453
453
|
_focusControl() {
|
|
454
|
-
const
|
|
455
|
-
if (
|
|
454
|
+
const t = this._resolveControlElement();
|
|
455
|
+
if (t)
|
|
456
456
|
try {
|
|
457
|
-
|
|
457
|
+
t.focus({ preventScroll: !0 });
|
|
458
458
|
} catch {
|
|
459
|
-
|
|
459
|
+
t.focus();
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
_resolveControlElement() {
|
|
463
|
-
if (this._controlCache && this._controlCache.isConnected &&
|
|
463
|
+
if (this._controlCache && this._controlCache.isConnected && x(this._controlCache))
|
|
464
464
|
return this._controlCache;
|
|
465
|
-
const
|
|
466
|
-
if (
|
|
467
|
-
const
|
|
468
|
-
if (
|
|
469
|
-
return this._controlCache =
|
|
465
|
+
const t = this.getAttribute("for");
|
|
466
|
+
if (t) {
|
|
467
|
+
const e = document.getElementById(t);
|
|
468
|
+
if (e instanceof HTMLElement && x(e))
|
|
469
|
+
return this._controlCache = e, e;
|
|
470
470
|
}
|
|
471
471
|
const l = this.root.querySelector("slot:not([name])")?.assignedElements({ flatten: !0 }) || [];
|
|
472
|
-
for (const
|
|
473
|
-
if (!(
|
|
474
|
-
if (
|
|
475
|
-
return this._controlCache =
|
|
476
|
-
const
|
|
477
|
-
if (
|
|
478
|
-
return this._controlCache =
|
|
472
|
+
for (const e of l) {
|
|
473
|
+
if (!(e instanceof HTMLElement)) continue;
|
|
474
|
+
if (x(e))
|
|
475
|
+
return this._controlCache = e, e;
|
|
476
|
+
const a = e.querySelector(L);
|
|
477
|
+
if (a && x(a))
|
|
478
|
+
return this._controlCache = a, a;
|
|
479
479
|
}
|
|
480
|
-
const
|
|
481
|
-
return
|
|
480
|
+
const o = this.querySelector(L);
|
|
481
|
+
return o && x(o) ? (this._controlCache = o, o) : null;
|
|
482
482
|
}
|
|
483
483
|
_syncDerivedState() {
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
484
|
+
const t = this.root.querySelector('slot[name="label"]'), i = this.root.querySelector('slot[name="actions"]'), l = this.root.querySelector('slot[name="description"]'), o = this.root.querySelector('slot[name="error"]'), e = (this.getAttribute("label") || "").trim(), a = (this.getAttribute("description") || "").trim(), y = (this.getAttribute("error") || "").trim(), n = !!e || A(t), d = A(i), h = !!a || A(l), b = !!y || A(o), w = n || d || h, E = n || d, c = this.root.querySelector(".meta"), p = this.root.querySelector(".label-row"), g = this.root.querySelector(".label"), m = this.root.querySelector(".actions"), u = this.root.querySelector(".description"), v = this.root.querySelector(".error");
|
|
485
|
+
c && (w ? c.removeAttribute("hidden") : c.setAttribute("hidden", "")), p && (E ? p.removeAttribute("hidden") : p.setAttribute("hidden", "")), g && (n ? g.removeAttribute("hidden") : g.setAttribute("hidden", "")), m && (d ? m.removeAttribute("hidden") : m.setAttribute("hidden", "")), u && (h ? u.removeAttribute("hidden") : u.setAttribute("hidden", "")), v && (b ? v.removeAttribute("hidden") : v.setAttribute("hidden", ""));
|
|
486
|
+
const q = t ? t.assignedNodes({ flatten: !0 }).map((f) => f.textContent || "").join(" ") : "", s = (f) => f.replace(/\s+/g, " ").trim(), T = (f) => f ? f.assignedNodes({ flatten: !0 }).map((B) => B.textContent || "").join(" ") : "", I = h ? s(a || T(l)) : "", R = b ? s(y || T(o)) : "";
|
|
487
|
+
this._syncControlA11y(
|
|
488
|
+
n,
|
|
489
|
+
s(e || q),
|
|
490
|
+
[I, R].filter(Boolean).join(" "),
|
|
491
|
+
b
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
_syncControlA11y(t, i, l, o) {
|
|
495
|
+
const e = this._resolveControlElement();
|
|
496
|
+
if (!e) return;
|
|
497
|
+
const a = `${this._uid}-label`, y = `${this._uid}-description`, n = `${this._uid}-error`, d = (e.getAttribute("aria-labelledby") || "").split(/\s+/).filter((s) => s && s !== a), h = e.getRootNode(), b = d.some((s) => !!h.getElementById?.(s)), w = k(d);
|
|
498
|
+
w.length ? e.setAttribute("aria-labelledby", w.join(" ")) : e.removeAttribute("aria-labelledby");
|
|
499
|
+
const E = e.hasAttribute("aria-label") && !e.hasAttribute(_), c = e.labels, p = (e.getAttribute("label") || "").trim().length > 0, g = (e.textContent || "").trim().length > 0, m = b || E || p || g || !!(c && c.length > 0);
|
|
500
|
+
t && i && !m ? (e.setAttribute("aria-label", i), e.setAttribute(_, "")) : e.hasAttribute(_) && (e.removeAttribute("aria-label"), e.removeAttribute(_));
|
|
501
|
+
const u = k(
|
|
502
|
+
(e.getAttribute("aria-describedby") || "").split(/\s+/).filter((s) => s && s !== y && s !== n)
|
|
503
|
+
);
|
|
504
|
+
u.length ? e.setAttribute("aria-describedby", u.join(" ")) : e.removeAttribute("aria-describedby");
|
|
505
|
+
const v = e.hasAttribute("aria-description") && !e.hasAttribute(S);
|
|
506
|
+
l && !v ? (e.setAttribute("aria-description", l), e.setAttribute(S, "")) : e.hasAttribute(S) && (e.removeAttribute("aria-description"), e.removeAttribute(S)), this.hasAttribute("invalid") || o ? e.setAttribute("aria-invalid", "true") : e.removeAttribute("aria-invalid"), this.hasAttribute("required") ? e.setAttribute("aria-required", "true") : e.removeAttribute("aria-required");
|
|
498
507
|
}
|
|
499
508
|
render() {
|
|
500
|
-
const
|
|
509
|
+
const t = this.getAttribute("label") || "", i = this.getAttribute("description") || "", l = this.getAttribute("error") || "", o = this.hasAttribute("required"), e = this.getAttribute("for") || "";
|
|
501
510
|
this.setContent(`
|
|
502
|
-
<style>${
|
|
511
|
+
<style>${N}</style>
|
|
503
512
|
<div class="frame" part="field">
|
|
504
513
|
<div class="meta" part="meta">
|
|
505
514
|
<div class="label-row" part="top">
|
|
506
|
-
<label class="label" id="${this._uid}-label" ${
|
|
507
|
-
<slot name="label">${
|
|
508
|
-
${
|
|
515
|
+
<label class="label" id="${this._uid}-label" ${e ? `for="${C(e)}"` : ""}>
|
|
516
|
+
<slot name="label">${C(t)}</slot>
|
|
517
|
+
${o ? '<span class="required" aria-hidden="true">*</span>' : ""}
|
|
509
518
|
</label>
|
|
510
519
|
<div class="actions" part="actions"><slot name="actions"></slot></div>
|
|
511
520
|
</div>
|
|
512
521
|
<p class="description" id="${this._uid}-description" part="description">
|
|
513
|
-
<slot name="description">${
|
|
522
|
+
<slot name="description">${C(i)}</slot>
|
|
514
523
|
</p>
|
|
515
524
|
</div>
|
|
516
525
|
|
|
@@ -519,17 +528,17 @@ class k extends A {
|
|
|
519
528
|
<div class="control" part="control"><slot></slot></div>
|
|
520
529
|
</div>
|
|
521
530
|
<p class="error" id="${this._uid}-error" part="error" aria-live="polite">
|
|
522
|
-
<slot name="error">${
|
|
531
|
+
<slot name="error">${C(l)}</slot>
|
|
523
532
|
</p>
|
|
524
533
|
</div>
|
|
525
534
|
</div>
|
|
526
535
|
`), this._invalidateControlCache(), this._scheduleDerivedStateSync();
|
|
527
536
|
}
|
|
528
|
-
shouldRenderOnAttributeChange(
|
|
529
|
-
return
|
|
537
|
+
shouldRenderOnAttributeChange(t, i, l) {
|
|
538
|
+
return t === "label" || t === "description" || t === "error" || t === "required" || t === "for";
|
|
530
539
|
}
|
|
531
540
|
}
|
|
532
|
-
typeof customElements < "u" && !customElements.get("ui-field") && customElements.define("ui-field",
|
|
541
|
+
typeof customElements < "u" && !customElements.get("ui-field") && customElements.define("ui-field", M);
|
|
533
542
|
export {
|
|
534
|
-
|
|
543
|
+
M as UIField
|
|
535
544
|
};
|
package/dist/fieldset.cjs.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
--ui-fieldset-radius: 16px;
|
|
5
5
|
--ui-fieldset-bg: var(--ui-color-surface, var(--ui-surface, #ffffff));
|
|
6
6
|
--ui-fieldset-color: var(--ui-color-text, var(--ui-text, #0f172a));
|
|
7
|
-
--ui-fieldset-muted: var(--ui-color-muted, var(--ui-muted, #
|
|
8
|
-
--ui-fieldset-error: var(--ui-color-danger, var(--ui-error, #
|
|
7
|
+
--ui-fieldset-muted: var(--ui-color-muted, var(--ui-muted, #526175));
|
|
8
|
+
--ui-fieldset-error: var(--ui-color-danger, var(--ui-error, #c81e1e));
|
|
9
9
|
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-border, #cbd5e1) 68%, transparent);
|
|
10
10
|
--ui-fieldset-border: 1px solid var(--ui-fieldset-border-color);
|
|
11
11
|
--ui-fieldset-shadow: none;
|
|
@@ -131,11 +131,11 @@
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
:host([tone="success"]) {
|
|
134
|
-
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-success, #
|
|
134
|
+
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-success, #15803d) 40%, transparent);
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
:host([tone="warning"]) {
|
|
138
|
-
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-warning, #
|
|
138
|
+
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-warning, #b45309) 40%, transparent);
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
:host([tone="danger"]),
|
package/dist/fieldset.esm.js
CHANGED
|
@@ -5,8 +5,8 @@ const S = `
|
|
|
5
5
|
--ui-fieldset-radius: 16px;
|
|
6
6
|
--ui-fieldset-bg: var(--ui-color-surface, var(--ui-surface, #ffffff));
|
|
7
7
|
--ui-fieldset-color: var(--ui-color-text, var(--ui-text, #0f172a));
|
|
8
|
-
--ui-fieldset-muted: var(--ui-color-muted, var(--ui-muted, #
|
|
9
|
-
--ui-fieldset-error: var(--ui-color-danger, var(--ui-error, #
|
|
8
|
+
--ui-fieldset-muted: var(--ui-color-muted, var(--ui-muted, #526175));
|
|
9
|
+
--ui-fieldset-error: var(--ui-color-danger, var(--ui-error, #c81e1e));
|
|
10
10
|
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-border, #cbd5e1) 68%, transparent);
|
|
11
11
|
--ui-fieldset-border: 1px solid var(--ui-fieldset-border-color);
|
|
12
12
|
--ui-fieldset-shadow: none;
|
|
@@ -132,11 +132,11 @@ const S = `
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
:host([tone="success"]) {
|
|
135
|
-
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-success, #
|
|
135
|
+
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-success, #15803d) 40%, transparent);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
:host([tone="warning"]) {
|
|
139
|
-
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-warning, #
|
|
139
|
+
--ui-fieldset-border-color: color-mix(in srgb, var(--ui-color-warning, #b45309) 40%, transparent);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
:host([tone="danger"]),
|
package/dist/file-upload.cjs.js
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
--ui-file-upload-radius: var(--ui-radius, 12px);
|
|
6
6
|
--ui-file-upload-bg: var(--ui-color-surface, #ffffff);
|
|
7
7
|
--ui-file-upload-text: var(--ui-color-text, #0f172a);
|
|
8
|
-
--ui-file-upload-muted: var(--ui-color-muted, #
|
|
8
|
+
--ui-file-upload-muted: var(--ui-color-muted, #526175);
|
|
9
9
|
--ui-file-upload-focus: var(--ui-color-focus-ring, #2563eb);
|
|
10
10
|
--ui-file-upload-danger: var(--ui-color-danger, #dc2626);
|
|
11
|
-
--ui-file-upload-success: var(--ui-color-success, #
|
|
11
|
+
--ui-file-upload-success: var(--ui-color-success, #15803d);
|
|
12
12
|
display: block;
|
|
13
13
|
inline-size: 100%;
|
|
14
14
|
min-inline-size: 0;
|
|
@@ -350,4 +350,4 @@
|
|
|
350
350
|
</div>
|
|
351
351
|
<div class="list" part="list" hidden></div>
|
|
352
352
|
</div>
|
|
353
|
-
`),this._surfaceEl=this.root.querySelector(".surface"),this._inputEl=this.root.querySelector(".input"),this._listEl=this.root.querySelector(".list"),this._errorEl=this.root.querySelector(".error"),this._actionsEl=this.root.querySelector(".actions"),this._surfaceEl?.addEventListener("click",this._onClick),this._surfaceEl?.addEventListener("keydown",this._onKeyDown),this._surfaceEl?.addEventListener("dragenter",this._onDragEnter),this._surfaceEl?.addEventListener("dragleave",this._onDragLeave),this._surfaceEl?.addEventListener("dragover",this._onDragOver),this._surfaceEl?.addEventListener("drop",this._onDrop),this._inputEl?.addEventListener("change",this._onInputChange),this._syncUi()}_disabled(){return this.hasAttribute("disabled")&&this.getAttribute("disabled")!=="false"}_maxFiles(){const e=this.getAttribute("max-files");if(!e)return null;const t=Number(e);return Number.isFinite(t)&&t>0?Math.floor(t):null}_maxSize(){const e=this.getAttribute("max-size");if(!e)return null;const t=Number(e);return Number.isFinite(t)&&t>0?t:null}_appendFiles(e,t){this._applyFiles(e,t,!1)}_applyFiles(e,t,i){const s=this.hasAttribute("multiple"),a=i?[]:s?[...this._files]:[],r=[],n=[],m=this.getAttribute("accept")||"",_=this._maxFiles(),v=this._maxSize(),x=new Set(a.map(o=>this._fileKey(o)));e.forEach(o=>{const b=this._fileKey(o);if(!x.has(b)){if(!W(o,m)){n.push({file:o,reason:"accept"});return}if(v!=null&&o.size>v){n.push({file:o,reason:"max-size"});return}if(_!=null&&a.length+r.length>=_){n.push({file:o,reason:"max-files"});return}x.add(b),r.push(o)}}),i&&(this.cancelUploads(),this._uploadState.clear()),this._files=[...a,...r],!s&&this._files.length>1&&(this._files=[this._files[this._files.length-1]]);const w=new Set(this._files.map(o=>this._fileKey(o)));Array.from(this._uploadState.keys()).forEach(o=>{w.has(o)||this._uploadState.delete(o)}),this._files.forEach(o=>{const b=this._fileKey(o);this._uploadState.has(b)||this._uploadState.set(b,{state:"pending",progress:null})}),this._syncUi(),this._emit("change",{files:this.files,source:t}),n.length?(this._emit("reject",{rejected:n,source:t}),this.setAttribute("data-error",n[0].reason==="accept"?"One or more files do not match the accepted types":n[0].reason==="max-size"?"One or more files exceed the size limit":"Too many files selected")):this.removeAttribute("data-error"),r.length&&this.hasAttribute("upload-on-select")&&this.uploadRequest&&this.startUpload(),this._syncUi()}_emit(e,t){this.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}_fileKey(e){return`${e.name}::${e.size}::${e.lastModified}`}_setUploadEntry(e,t){this._uploadState.set(e,t),this._syncUi()}async _runUpload(e,t){if(!this.uploadRequest)return;const i=this._fileKey(e),s=new AbortController;this._uploadControllers.set(i,s),this._setUploadEntry(i,{state:"uploading",progress:0});const a=r=>{const n=this._uploadState.get(i);if(!n||n.state!=="uploading")return;const m=Number.isFinite(r)?Math.max(0,Math.min(100,r)):0;this._uploadState.set(i,{...n,progress:m}),this._emit("upload-progress",{file:e,fileKey:i,progress:m,requestId:t}),this._syncUi()};try{const r=await this.uploadRequest({file:e,files:this.files,signal:s.signal,setProgress:a});s.signal.aborted?(this._uploadState.set(i,{state:"canceled",progress:null}),this._emit("upload-cancel",{file:e,fileKey:i,requestId:t})):(this._uploadState.set(i,{state:"success",progress:100,result:r}),this._emit("upload-success",{file:e,fileKey:i,requestId:t,result:r}))}catch(r){if(s.signal.aborted)this._uploadState.set(i,{state:"canceled",progress:null}),this._emit("upload-cancel",{file:e,fileKey:i,requestId:t});else{const n=r instanceof Error?r.message:"Upload failed";this._uploadState.set(i,{state:"error",progress:null,error:n}),this._emit("upload-error",{file:e,fileKey:i,requestId:t,error:n})}}finally{this._uploadControllers.delete(i),this._syncUi()}}_parseProgress(){const e=this.getAttribute("progress");if(!e)return{};try{const t=JSON.parse(e);return!t||typeof t!="object"||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).map(([i,s])=>{const a=Number(s);return[i,Number.isFinite(a)?Math.max(0,Math.min(100,a)):0]}))}catch{return{}}}_statusLabel(e){switch(e){case"uploading":return"Uploading";case"success":return"Uploaded";case"error":return"Failed";case"canceled":return"Canceled";default:return"Pending"}}_actionSummary(){const e=this._files.map(a=>this._uploadState.get(this._fileKey(a))||{state:"pending",progress:null}),t=e.filter(a=>a.state==="uploading").length,i=e.filter(a=>a.state==="error").length,s=e.filter(a=>a.state==="success").length;return t>0?{title:"Upload in progress",subtitle:`${t} file${t===1?"":"s"} still uploading`}:i>0?{title:"Retry required",subtitle:`${i} file${i===1?"":"s"} failed to upload`}:s>0&&s===this._files.length?{title:"Uploads complete",subtitle:`${s} file${s===1?"":"s"} uploaded successfully`}:{title:"Ready to upload",subtitle:`${this._files.length} file${this._files.length===1?"":"s"} queued`}}_getPreviewUrl(e){if(!this.hasAttribute("show-previews")||typeof URL>"u"||typeof URL.createObjectURL!="function"||!e.type.startsWith("image/"))return null;const t=this._fileKey(e),i=this._previewUrls.get(t);if(i)return i;const s=URL.createObjectURL(e);return this._previewUrls.set(t,s),s}_revokePreviewUrls(e=new Set){this._previewUrls.forEach((t,i)=>{if(!e.has(i)){try{URL.revokeObjectURL(t)}catch{}this._previewUrls.delete(i)}})}_syncUi(){if(!this._surfaceEl||!this._inputEl||!this._listEl||!this._errorEl||!this._actionsEl)return;const e=(this.getAttribute("label")||"").trim(),t=(this.getAttribute("description")||"").trim(),i=this.hasAttribute("required"),s=this._disabled(),a=this.getAttribute("drop-label")||"Drag files here or browse from your device",r=this.getAttribute("button-text")||"Choose files",n=this.getAttribute("upload-button-text")||"Start upload",m=(this.getAttribute("data-error")||"").trim(),_=this._parseProgress(),v=this.root.querySelector(".label"),x=this.root.querySelector(".description"),w=this.root.querySelector(".meta"),o=this.root.querySelector(".headline"),b=this.root.querySelector(".subline"),D=this.root.querySelector(".cta"),R=this.root.querySelector(".required"),B=this.root.querySelector(".actions-title"),I=this.root.querySelector(".actions-subtitle"),k=this.root.querySelector(".actions-row");v.hidden=!e,v.querySelector(".label-text").textContent=e,R.hidden=!i,x.hidden=!t,x.textContent=t,w.hidden=!e&&!t,o.textContent=this._files.length?`${this._files.length} file${this._files.length===1?"":"s"} selected`:a,b.textContent=this._files.length?this._files.map(p=>p.name).join(", "):this.getAttribute("accept")?`Accepted: ${this.getAttribute("accept")}`:"Supports click, keyboard, and drag-and-drop upload",D.textContent=r,D.disabled=s,this._surfaceEl.setAttribute("data-dragging",this._dragging?"true":"false"),this._surfaceEl.setAttribute("aria-disabled",s?"true":"false"),this._inputEl.disabled=s,this._inputEl.multiple=this.hasAttribute("multiple"),this._inputEl.name=this.getAttribute("name")||"",this._inputEl.accept=this.getAttribute("accept")||"",this._errorEl.hidden=!m,this._errorEl.textContent=m;const L=!!this.uploadRequest&&this._files.length>0,N=this._actionSummary();if(this._actionsEl.hidden=!L,B.textContent=N.title,I.textContent=N.subtitle,k.replaceChildren(),L){const p=this._files.some(l=>{const h=this._uploadState.get(this._fileKey(l))?.state||"pending";return h==="pending"||h==="error"||h==="canceled"}),f=document.createElement("button");if(f.type="button",f.className="file-remove",f.dataset.variant="primary",f.textContent=this.uploading?"Uploading…":p?n:"Upload complete",f.disabled=s||this.uploading||!p,f.addEventListener("click",l=>{l.stopPropagation(),this.startUpload()}),k.append(f),this.uploading){const l=document.createElement("button");l.type="button",l.className="file-remove",l.dataset.tone="danger",l.textContent="Cancel uploads",l.disabled=s,l.addEventListener("click",h=>{h.stopPropagation(),this.cancelUploads()}),k.append(l)}}const P=new Set;this._listEl.hidden=this._files.length===0,this._listEl.replaceChildren(...this._files.map((p,f)=>{const l=document.createElement("div");l.className="file";const h=this._fileKey(p);P.add(h);const c=this._uploadState.get(h)||{state:"pending",progress:null},y=document.createElement("div");y.className="preview";const K=this._getPreviewUrl(p);if(K){const d=document.createElement("img");d.src=K,d.alt="",y.append(d)}else y.textContent=p.name.split(".").pop()?.slice(0,4).toUpperCase()||"FILE";const S=document.createElement("div");S.className="file-text";const C=document.createElement("div");C.className="file-name",C.textContent=p.name;const E=document.createElement("div");E.className="file-meta",E.textContent=O(p.size);const U=document.createElement("span");U.className="status",U.dataset.state=c.state,U.textContent=this._statusLabel(c.state),E.append(U),S.append(C,E);const u=document.createElement("button");u.type="button",u.className="file-remove",u.disabled=s,c.state==="uploading"?(u.textContent="Cancel",u.dataset.tone="danger",u.addEventListener("click",d=>{d.stopPropagation(),this.cancelUpload(h)})):c.state==="error"?(u.textContent="Retry",u.dataset.variant="primary",u.addEventListener("click",d=>{d.stopPropagation(),this._uploadState.set(h,{state:"pending",progress:null}),this._syncUi(),this.startUpload()})):(u.textContent="Remove",u.addEventListener("click",d=>{d.stopPropagation(),this.removeFile(f)})),l.append(y,S,u);const A=typeof c.progress=="number"?c.progress:_[h]??_[p.name];if(typeof A=="number"){const d=document.createElement("div");d.className="progress";const z=document.createElement("div");z.className="progress-track";const F=document.createElement("div");F.className="progress-bar",F.style.inlineSize=`${A}%`,z.append(F);const q=document.createElement("div");q.className="progress-text",q.textContent=c.state==="success"?"Upload complete":c.state==="error"?c.error||"Upload failed":c.state==="canceled"?"Upload canceled":`Uploading ${Math.round(A)}%`,d.append(z,q),l.append(d)}else if(c.state==="error"&&c.error){const d=document.createElement("div");d.className="file-error",d.textContent=c.error,l.append(d)}return l})),this._revokePreviewUrls(P)}_registerWithForm(){this._formUnregister&&(this._formUnregister(),this._formUnregister=null);try{const s=this.getRootNode().host?.closest?.("ui-form")||null||this.closest("ui-form"),a=this.getAttribute("name");s&&typeof s.registerField=="function"&&a&&(this._formUnregister=s.registerField(a,{name:a,getValue:()=>this.files,setValue:r=>{Array.isArray(r)&&r.every(n=>n instanceof File)&&this.setFiles(r)},validate:async()=>this.hasAttribute("required")&&this._files.length===0?{valid:!1,message:"At least one file is required"}:{valid:!0},setError:r=>{r?this.setAttribute("data-error",r):this.removeAttribute("data-error"),this._syncUi()}}))}catch{}}_onClick(e){e.target?.closest(".file-remove")||this.openPicker()}_onKeyDown(e){e.key!=="Enter"&&e.key!==" "||(e.preventDefault(),this.openPicker())}_onInputChange(){const e=Array.from(this._inputEl?.files||[]);e.length&&(this._appendFiles(e,"picker"),this._inputEl&&(this._inputEl.value=""))}_onDragEnter(e){this._disabled()||(e.preventDefault(),this._dragDepth+=1,this._dragging=!0,this._syncUi())}_onDragLeave(e){if(!this._surfaceEl)return;const t=e.relatedTarget;t&&this._surfaceEl.contains(t)||(this._dragDepth=Math.max(0,this._dragDepth-1),!(this._dragDepth>0)&&(this._dragging=!1,this._syncUi()))}_onDragOver(e){this._disabled()||e.preventDefault()}_onDrop(e){if(this._disabled())return;e.preventDefault(),this._dragDepth=0,this._dragging=!1;const t=Array.from(e.dataTransfer?.files||[]);t.length&&this._appendFiles(t,"drop"),this._syncUi()}}typeof customElements<"u"&&!customElements.get("ui-file-upload")&&customElements.define("ui-file-upload",M);exports.UIFileUpload=M;
|
|
353
|
+
`),this._surfaceEl=this.root.querySelector(".surface"),this._inputEl=this.root.querySelector(".input"),this._listEl=this.root.querySelector(".list"),this._errorEl=this.root.querySelector(".error"),this._actionsEl=this.root.querySelector(".actions"),this._surfaceEl?.addEventListener("click",this._onClick),this._surfaceEl?.addEventListener("keydown",this._onKeyDown),this._surfaceEl?.addEventListener("dragenter",this._onDragEnter),this._surfaceEl?.addEventListener("dragleave",this._onDragLeave),this._surfaceEl?.addEventListener("dragover",this._onDragOver),this._surfaceEl?.addEventListener("drop",this._onDrop),this._inputEl?.addEventListener("change",this._onInputChange),this._syncUi()}_disabled(){return this.hasAttribute("disabled")&&this.getAttribute("disabled")!=="false"}_maxFiles(){const e=this.getAttribute("max-files");if(!e)return null;const t=Number(e);return Number.isFinite(t)&&t>0?Math.floor(t):null}_maxSize(){const e=this.getAttribute("max-size");if(!e)return null;const t=Number(e);return Number.isFinite(t)&&t>0?t:null}_appendFiles(e,t){this._applyFiles(e,t,!1)}_applyFiles(e,t,i){const s=this.hasAttribute("multiple"),a=i?[]:s?[...this._files]:[],r=[],n=[],m=this.getAttribute("accept")||"",_=this._maxFiles(),v=this._maxSize(),x=new Set(a.map(o=>this._fileKey(o)));e.forEach(o=>{const b=this._fileKey(o);if(!x.has(b)){if(!W(o,m)){n.push({file:o,reason:"accept"});return}if(v!=null&&o.size>v){n.push({file:o,reason:"max-size"});return}if(_!=null&&a.length+r.length>=_){n.push({file:o,reason:"max-files"});return}x.add(b),r.push(o)}}),i&&(this.cancelUploads(),this._uploadState.clear()),this._files=[...a,...r],!s&&this._files.length>1&&(this._files=[this._files[this._files.length-1]]);const w=new Set(this._files.map(o=>this._fileKey(o)));Array.from(this._uploadState.keys()).forEach(o=>{w.has(o)||this._uploadState.delete(o)}),this._files.forEach(o=>{const b=this._fileKey(o);this._uploadState.has(b)||this._uploadState.set(b,{state:"pending",progress:null})}),this._syncUi(),this._emit("change",{files:this.files,source:t}),n.length?(this._emit("reject",{rejected:n,source:t}),this.setAttribute("data-error",n[0].reason==="accept"?"One or more files do not match the accepted types":n[0].reason==="max-size"?"One or more files exceed the size limit":"Too many files selected")):this.removeAttribute("data-error"),r.length&&this.hasAttribute("upload-on-select")&&this.uploadRequest&&this.startUpload(),this._syncUi()}_emit(e,t){this.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}_fileKey(e){return`${e.name}::${e.size}::${e.lastModified}`}_setUploadEntry(e,t){this._uploadState.set(e,t),this._syncUi()}async _runUpload(e,t){if(!this.uploadRequest)return;const i=this._fileKey(e),s=new AbortController;this._uploadControllers.set(i,s),this._setUploadEntry(i,{state:"uploading",progress:0});const a=r=>{const n=this._uploadState.get(i);if(!n||n.state!=="uploading")return;const m=Number.isFinite(r)?Math.max(0,Math.min(100,r)):0;this._uploadState.set(i,{...n,progress:m}),this._emit("upload-progress",{file:e,fileKey:i,progress:m,requestId:t}),this._syncUi()};try{const r=await this.uploadRequest({file:e,files:this.files,signal:s.signal,setProgress:a});s.signal.aborted?(this._uploadState.set(i,{state:"canceled",progress:null}),this._emit("upload-cancel",{file:e,fileKey:i,requestId:t})):(this._uploadState.set(i,{state:"success",progress:100,result:r}),this._emit("upload-success",{file:e,fileKey:i,requestId:t,result:r}))}catch(r){if(s.signal.aborted)this._uploadState.set(i,{state:"canceled",progress:null}),this._emit("upload-cancel",{file:e,fileKey:i,requestId:t});else{const n=r instanceof Error?r.message:"Upload failed";this._uploadState.set(i,{state:"error",progress:null,error:n}),this._emit("upload-error",{file:e,fileKey:i,requestId:t,error:n})}}finally{this._uploadControllers.delete(i),this._syncUi()}}_parseProgress(){const e=this.getAttribute("progress");if(!e)return{};try{const t=JSON.parse(e);return!t||typeof t!="object"||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).map(([i,s])=>{const a=Number(s);return[i,Number.isFinite(a)?Math.max(0,Math.min(100,a)):0]}))}catch{return{}}}_statusLabel(e){switch(e){case"uploading":return"Uploading";case"success":return"Uploaded";case"error":return"Failed";case"canceled":return"Canceled";default:return"Pending"}}_actionSummary(){const e=this._files.map(a=>this._uploadState.get(this._fileKey(a))||{state:"pending",progress:null}),t=e.filter(a=>a.state==="uploading").length,i=e.filter(a=>a.state==="error").length,s=e.filter(a=>a.state==="success").length;return t>0?{title:"Upload in progress",subtitle:`${t} file${t===1?"":"s"} still uploading`}:i>0?{title:"Retry required",subtitle:`${i} file${i===1?"":"s"} failed to upload`}:s>0&&s===this._files.length?{title:"Uploads complete",subtitle:`${s} file${s===1?"":"s"} uploaded successfully`}:{title:"Ready to upload",subtitle:`${this._files.length} file${this._files.length===1?"":"s"} queued`}}_getPreviewUrl(e){if(!this.hasAttribute("show-previews")||typeof URL>"u"||typeof URL.createObjectURL!="function"||!e.type.startsWith("image/"))return null;const t=this._fileKey(e),i=this._previewUrls.get(t);if(i)return i;const s=URL.createObjectURL(e);return this._previewUrls.set(t,s),s}_revokePreviewUrls(e=new Set){this._previewUrls.forEach((t,i)=>{if(!e.has(i)){try{URL.revokeObjectURL(t)}catch{}this._previewUrls.delete(i)}})}_syncUi(){if(!this._surfaceEl||!this._inputEl||!this._listEl||!this._errorEl||!this._actionsEl)return;const e=(this.getAttribute("label")||"").trim(),t=(this.getAttribute("description")||"").trim(),i=this.hasAttribute("required"),s=this._disabled();this._inputEl.setAttribute("aria-label",e||(this.getAttribute("aria-label")||"").trim()||"Choose files");const a=this.getAttribute("drop-label")||"Drag files here or browse from your device",r=this.getAttribute("button-text")||"Choose files",n=this.getAttribute("upload-button-text")||"Start upload",m=(this.getAttribute("data-error")||"").trim(),_=this._parseProgress(),v=this.root.querySelector(".label"),x=this.root.querySelector(".description"),w=this.root.querySelector(".meta"),o=this.root.querySelector(".headline"),b=this.root.querySelector(".subline"),D=this.root.querySelector(".cta"),R=this.root.querySelector(".required"),B=this.root.querySelector(".actions-title"),I=this.root.querySelector(".actions-subtitle"),k=this.root.querySelector(".actions-row");v.hidden=!e,v.querySelector(".label-text").textContent=e,R.hidden=!i,x.hidden=!t,x.textContent=t,w.hidden=!e&&!t,o.textContent=this._files.length?`${this._files.length} file${this._files.length===1?"":"s"} selected`:a,b.textContent=this._files.length?this._files.map(p=>p.name).join(", "):this.getAttribute("accept")?`Accepted: ${this.getAttribute("accept")}`:"Supports click, keyboard, and drag-and-drop upload",D.textContent=r,D.disabled=s,this._surfaceEl.setAttribute("data-dragging",this._dragging?"true":"false"),this._surfaceEl.setAttribute("aria-disabled",s?"true":"false"),this._inputEl.disabled=s,this._inputEl.multiple=this.hasAttribute("multiple"),this._inputEl.name=this.getAttribute("name")||"",this._inputEl.accept=this.getAttribute("accept")||"",this._errorEl.hidden=!m,this._errorEl.textContent=m;const L=!!this.uploadRequest&&this._files.length>0,N=this._actionSummary();if(this._actionsEl.hidden=!L,B.textContent=N.title,I.textContent=N.subtitle,k.replaceChildren(),L){const p=this._files.some(l=>{const h=this._uploadState.get(this._fileKey(l))?.state||"pending";return h==="pending"||h==="error"||h==="canceled"}),f=document.createElement("button");if(f.type="button",f.className="file-remove",f.dataset.variant="primary",f.textContent=this.uploading?"Uploading…":p?n:"Upload complete",f.disabled=s||this.uploading||!p,f.addEventListener("click",l=>{l.stopPropagation(),this.startUpload()}),k.append(f),this.uploading){const l=document.createElement("button");l.type="button",l.className="file-remove",l.dataset.tone="danger",l.textContent="Cancel uploads",l.disabled=s,l.addEventListener("click",h=>{h.stopPropagation(),this.cancelUploads()}),k.append(l)}}const P=new Set;this._listEl.hidden=this._files.length===0,this._listEl.replaceChildren(...this._files.map((p,f)=>{const l=document.createElement("div");l.className="file";const h=this._fileKey(p);P.add(h);const c=this._uploadState.get(h)||{state:"pending",progress:null},y=document.createElement("div");y.className="preview";const K=this._getPreviewUrl(p);if(K){const d=document.createElement("img");d.src=K,d.alt="",y.append(d)}else y.textContent=p.name.split(".").pop()?.slice(0,4).toUpperCase()||"FILE";const S=document.createElement("div");S.className="file-text";const C=document.createElement("div");C.className="file-name",C.textContent=p.name;const E=document.createElement("div");E.className="file-meta",E.textContent=O(p.size);const U=document.createElement("span");U.className="status",U.dataset.state=c.state,U.textContent=this._statusLabel(c.state),E.append(U),S.append(C,E);const u=document.createElement("button");u.type="button",u.className="file-remove",u.disabled=s,c.state==="uploading"?(u.textContent="Cancel",u.dataset.tone="danger",u.addEventListener("click",d=>{d.stopPropagation(),this.cancelUpload(h)})):c.state==="error"?(u.textContent="Retry",u.dataset.variant="primary",u.addEventListener("click",d=>{d.stopPropagation(),this._uploadState.set(h,{state:"pending",progress:null}),this._syncUi(),this.startUpload()})):(u.textContent="Remove",u.addEventListener("click",d=>{d.stopPropagation(),this.removeFile(f)})),l.append(y,S,u);const A=typeof c.progress=="number"?c.progress:_[h]??_[p.name];if(typeof A=="number"){const d=document.createElement("div");d.className="progress";const z=document.createElement("div");z.className="progress-track";const F=document.createElement("div");F.className="progress-bar",F.style.inlineSize=`${A}%`,z.append(F);const q=document.createElement("div");q.className="progress-text",q.textContent=c.state==="success"?"Upload complete":c.state==="error"?c.error||"Upload failed":c.state==="canceled"?"Upload canceled":`Uploading ${Math.round(A)}%`,d.append(z,q),l.append(d)}else if(c.state==="error"&&c.error){const d=document.createElement("div");d.className="file-error",d.textContent=c.error,l.append(d)}return l})),this._revokePreviewUrls(P)}_registerWithForm(){this._formUnregister&&(this._formUnregister(),this._formUnregister=null);try{const s=this.getRootNode().host?.closest?.("ui-form")||null||this.closest("ui-form"),a=this.getAttribute("name");s&&typeof s.registerField=="function"&&a&&(this._formUnregister=s.registerField(a,{name:a,getValue:()=>this.files,setValue:r=>{Array.isArray(r)&&r.every(n=>n instanceof File)&&this.setFiles(r)},validate:async()=>this.hasAttribute("required")&&this._files.length===0?{valid:!1,message:"At least one file is required"}:{valid:!0},setError:r=>{r?this.setAttribute("data-error",r):this.removeAttribute("data-error"),this._syncUi()}}))}catch{}}_onClick(e){e.target?.closest(".file-remove")||this.openPicker()}_onKeyDown(e){e.key!=="Enter"&&e.key!==" "||(e.preventDefault(),this.openPicker())}_onInputChange(){const e=Array.from(this._inputEl?.files||[]);e.length&&(this._appendFiles(e,"picker"),this._inputEl&&(this._inputEl.value=""))}_onDragEnter(e){this._disabled()||(e.preventDefault(),this._dragDepth+=1,this._dragging=!0,this._syncUi())}_onDragLeave(e){if(!this._surfaceEl)return;const t=e.relatedTarget;t&&this._surfaceEl.contains(t)||(this._dragDepth=Math.max(0,this._dragDepth-1),!(this._dragDepth>0)&&(this._dragging=!1,this._syncUi()))}_onDragOver(e){this._disabled()||e.preventDefault()}_onDrop(e){if(this._disabled())return;e.preventDefault(),this._dragDepth=0,this._dragging=!1;const t=Array.from(e.dataTransfer?.files||[]);t.length&&this._appendFiles(t,"drop"),this._syncUi()}}typeof customElements<"u"&&!customElements.get("ui-file-upload")&&customElements.define("ui-file-upload",M);exports.UIFileUpload=M;
|
package/dist/file-upload.esm.js
CHANGED
|
@@ -6,10 +6,10 @@ const M = `
|
|
|
6
6
|
--ui-file-upload-radius: var(--ui-radius, 12px);
|
|
7
7
|
--ui-file-upload-bg: var(--ui-color-surface, #ffffff);
|
|
8
8
|
--ui-file-upload-text: var(--ui-color-text, #0f172a);
|
|
9
|
-
--ui-file-upload-muted: var(--ui-color-muted, #
|
|
9
|
+
--ui-file-upload-muted: var(--ui-color-muted, #526175);
|
|
10
10
|
--ui-file-upload-focus: var(--ui-color-focus-ring, #2563eb);
|
|
11
11
|
--ui-file-upload-danger: var(--ui-color-danger, #dc2626);
|
|
12
|
-
--ui-file-upload-success: var(--ui-color-success, #
|
|
12
|
+
--ui-file-upload-success: var(--ui-color-success, #15803d);
|
|
13
13
|
display: block;
|
|
14
14
|
inline-size: 100%;
|
|
15
15
|
min-inline-size: 0;
|
|
@@ -600,7 +600,9 @@ class W extends I {
|
|
|
600
600
|
}
|
|
601
601
|
_syncUi() {
|
|
602
602
|
if (!this._surfaceEl || !this._inputEl || !this._listEl || !this._errorEl || !this._actionsEl) return;
|
|
603
|
-
const e = (this.getAttribute("label") || "").trim(), t = (this.getAttribute("description") || "").trim(), i = this.hasAttribute("required"), s = this._disabled()
|
|
603
|
+
const e = (this.getAttribute("label") || "").trim(), t = (this.getAttribute("description") || "").trim(), i = this.hasAttribute("required"), s = this._disabled();
|
|
604
|
+
this._inputEl.setAttribute("aria-label", e || (this.getAttribute("aria-label") || "").trim() || "Choose files");
|
|
605
|
+
const a = this.getAttribute("drop-label") || "Drag files here or browse from your device", r = this.getAttribute("button-text") || "Choose files", n = this.getAttribute("upload-button-text") || "Start upload", m = (this.getAttribute("data-error") || "").trim(), _ = this._parseProgress(), v = this.root.querySelector(".label"), x = this.root.querySelector(".description"), w = this.root.querySelector(".meta"), o = this.root.querySelector(".headline"), b = this.root.querySelector(".subline"), D = this.root.querySelector(".cta"), R = this.root.querySelector(".required"), $ = this.root.querySelector(".actions-title"), B = this.root.querySelector(".actions-subtitle"), k = this.root.querySelector(".actions-row");
|
|
604
606
|
v.hidden = !e, v.querySelector(".label-text").textContent = e, R.hidden = !i, x.hidden = !t, x.textContent = t, w.hidden = !e && !t, o.textContent = this._files.length ? `${this._files.length} file${this._files.length === 1 ? "" : "s"} selected` : a, b.textContent = this._files.length ? this._files.map((p) => p.name).join(", ") : this.getAttribute("accept") ? `Accepted: ${this.getAttribute("accept")}` : "Supports click, keyboard, and drag-and-drop upload", D.textContent = r, D.disabled = s, this._surfaceEl.setAttribute("data-dragging", this._dragging ? "true" : "false"), this._surfaceEl.setAttribute("aria-disabled", s ? "true" : "false"), this._inputEl.disabled = s, this._inputEl.multiple = this.hasAttribute("multiple"), this._inputEl.name = this.getAttribute("name") || "", this._inputEl.accept = this.getAttribute("accept") || "", this._errorEl.hidden = !m, this._errorEl.textContent = m;
|
|
605
607
|
const L = !!this.uploadRequest && this._files.length > 0, N = this._actionSummary();
|
|
606
608
|
if (this._actionsEl.hidden = !L, $.textContent = N.title, B.textContent = N.subtitle, k.replaceChildren(), L) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const h=require("./ElementBase-EV6mVBUV.js"),d=require("./positioner-D_fqyx_j.js"),
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const h=require("./ElementBase-EV6mVBUV.js"),d=require("./positioner-D_fqyx_j.js"),b=`
|
|
2
2
|
:host {
|
|
3
3
|
position: fixed;
|
|
4
4
|
inset: 0;
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
--ui-floating-toolbar-bg: var(--ui-color-surface, #ffffff);
|
|
11
11
|
--ui-floating-toolbar-color: var(--ui-color-text, #0f172a);
|
|
12
|
-
--ui-floating-toolbar-muted: var(--ui-color-muted, #
|
|
12
|
+
--ui-floating-toolbar-muted: var(--ui-color-muted, #526175);
|
|
13
13
|
--ui-floating-toolbar-border-color: color-mix(in srgb, var(--ui-color-border, #cbd5e1) 72%, transparent);
|
|
14
14
|
--ui-floating-toolbar-border: 1px solid var(--ui-floating-toolbar-border-color);
|
|
15
15
|
--ui-floating-toolbar-radius: 12px;
|
|
@@ -146,11 +146,11 @@
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
:host([tone="success"]) {
|
|
149
|
-
--ui-floating-toolbar-accent: var(--ui-color-success, #
|
|
149
|
+
--ui-floating-toolbar-accent: var(--ui-color-success, #15803d);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
:host([tone="warning"]) {
|
|
153
|
-
--ui-floating-toolbar-accent: var(--ui-color-warning, #
|
|
153
|
+
--ui-floating-toolbar-accent: var(--ui-color-warning, #b45309);
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
:host([tone="danger"]) {
|
|
@@ -200,14 +200,14 @@
|
|
|
200
200
|
transition: none !important;
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
|
-
`;function
|
|
204
|
-
<style>${
|
|
205
|
-
<
|
|
203
|
+
`;function c(o,t){if(o==null||o==="")return t;const e=Number(o);return Number.isFinite(e)?e:t}function a(o,t){if(o==null)return t;const e=o.trim().toLowerCase();return e!=="false"&&e!=="0"&&e!=="off"}function f(o){if(!document.body.contains(o))return!1;const t=window.getComputedStyle(o);return!(t.display==="none"||t.visibility==="hidden"||Number.parseFloat(t.opacity||"1")<=0)}function p(o){return o==="top"||o==="bottom"?o:"auto"}function g(o){return o==="start"||o==="end"?o:"center"}function _(o,t){const e=o==="top"?"top":"bottom";return t==="start"?`${e}-start`:t==="end"?`${e}-end`:e}function m(o){const t='button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])',e=[];return o.forEach(i=>{i instanceof HTMLElement&&(i.matches(t)&&e.push(i),e.push(...Array.from(i.querySelectorAll(t))))}),Array.from(new Set(e))}class l extends h.ElementBase{constructor(){super(...arguments),this._anchor=null,this._panel=null,this._toolbarSlot=null,this._defaultSlot=null,this._raf=null,this._resizeObserver=null,this._mutationObserver=null,this._positioner=null,this._positionerPlacement=null,this._positionerOffset=0,this._globalListenersBound=!1,this._isOpen=!1,this._closeReason="programmatic",this._onWindowChangeBound=this._onWindowChange.bind(this),this._onDocumentPointerDownBound=this._onDocumentPointerDown.bind(this),this._onDocumentKeyDownBound=this._onDocumentKeyDown.bind(this),this._onPanelKeyDownBound=this._onPanelKeyDown.bind(this),this._onSlotChangeBound=this._onSlotChange.bind(this)}static get observedAttributes(){return["open","anchor-id","headless","disabled","placement","align","offset","close-on-outside","close-on-escape","aria-label","aria-labelledby","variant","density","shape","elevation","tone"]}connectedCallback(){super.connectedCallback(),this._syncAnchorFromAttribute(),this._syncOpenState(),this._schedulePosition()}disconnectedCallback(){this._unbindGlobalListeners(),this._teardownObservers(),this._positioner?.destroy(),this._positioner=null,this._raf!=null&&(cancelAnimationFrame(this._raf),this._raf=null),super.disconnectedCallback()}attributeChangedCallback(t,e,i){if(e!==i){if(t==="anchor-id"){this._syncAnchorFromAttribute(),this.hasAttribute("open")&&!this._anchor&&this._requestClose("anchor-missing"),this._schedulePosition();return}if(t==="open"){this._syncOpenState(),this._schedulePosition();return}if(t==="disabled"){this.hasAttribute("disabled")&&this.hasAttribute("open")&&this._requestClose("disabled");return}if(t==="headless"){this._syncOpenState(),this._schedulePosition();return}if(t==="aria-label"||t==="aria-labelledby"){this._syncPanelA11y();return}(t==="placement"||t==="align"||t==="offset")&&this._schedulePosition()}}showForAnchorId(t){if(this.hasAttribute("disabled")||!t)return;const e=document.getElementById(t);if(!e){this._requestClose("anchor-missing");return}this._anchor=e,this.setAttribute("anchor-id",t),this.openToolbar()}hide(){this.closeToolbar("programmatic")}openToolbar(){this.hasAttribute("disabled")||(this.hasAttribute("open")||this.setAttribute("open",""),this._schedulePosition())}closeToolbar(t="programmatic"){this.hasAttribute("open")&&(this._closeReason=t,this.removeAttribute("open"))}_syncOpenState(){const t=this.hasAttribute("open")&&!this.hasAttribute("headless")&&!this.hasAttribute("disabled");if(t===this._isOpen){t&&this._schedulePosition();return}if(this._isOpen=t,t){this._bindGlobalListeners(),this._ensureObservers(),this._dispatchOpenEvents(),this._schedulePosition();return}this._unbindGlobalListeners(),this._teardownObservers(),this._positioner?.destroy(),this._positioner=null,this._positionerPlacement=null,this._positionerOffset=0,this._raf!=null&&(cancelAnimationFrame(this._raf),this._raf=null),this._dispatchCloseEvents(this._closeReason),this._closeReason="programmatic"}_dispatchOpenEvents(){this.dispatchEvent(new CustomEvent("open",{bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{open:!0}}))}_dispatchCloseEvents(t){this.dispatchEvent(new CustomEvent("close",{bubbles:!0,composed:!0,detail:{reason:t}})),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{open:!1,reason:t}}))}_requestClose(t){if(!this.hasAttribute("open"))return;const e=new CustomEvent("request-close",{detail:{reason:t},bubbles:!0,composed:!0,cancelable:!0});this.dispatchEvent(e);const i=new CustomEvent("ui-request-close",{detail:{reason:t},bubbles:!0,composed:!0,cancelable:!0});this.dispatchEvent(i),!(e.defaultPrevented||i.defaultPrevented)&&this.closeToolbar(t)}_syncAnchorFromAttribute(){const t=this.getAttribute("anchor-id");if(!t){this._anchor=null;return}this._anchor=document.getElementById(t)}_schedulePosition(){!this.hasAttribute("open")||this.hasAttribute("headless")||this.hasAttribute("disabled")||(this._raf!=null&&cancelAnimationFrame(this._raf),this._raf=requestAnimationFrame(()=>{this._raf=null,this._position()}))}_ensureObservers(){if(!(this._resizeObserver&&this._mutationObserver)){if(typeof ResizeObserver<"u"){if(this._resizeObserver=new ResizeObserver(()=>this._schedulePosition()),this._panel)try{this._resizeObserver.observe(this._panel)}catch{}if(this._anchor)try{this._resizeObserver.observe(this._anchor)}catch{}}if(typeof MutationObserver<"u"&&this._anchor){this._mutationObserver=new MutationObserver(()=>this._schedulePosition());try{this._mutationObserver.observe(this._anchor,{attributes:!0,childList:!1,subtree:!1})}catch{}}}}_teardownObservers(){this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=null),this._mutationObserver&&(this._mutationObserver.disconnect(),this._mutationObserver=null)}_refreshObservers(){this._isOpen&&(this._teardownObservers(),this._ensureObservers())}_bindGlobalListeners(){this._globalListenersBound||(window.addEventListener("scroll",this._onWindowChangeBound,{passive:!0,capture:!0}),window.addEventListener("resize",this._onWindowChangeBound),document.addEventListener("pointerdown",this._onDocumentPointerDownBound,!0),document.addEventListener("keydown",this._onDocumentKeyDownBound,!0),this._globalListenersBound=!0)}_unbindGlobalListeners(){this._globalListenersBound&&(window.removeEventListener("scroll",this._onWindowChangeBound,!0),window.removeEventListener("resize",this._onWindowChangeBound),document.removeEventListener("pointerdown",this._onDocumentPointerDownBound,!0),document.removeEventListener("keydown",this._onDocumentKeyDownBound,!0),this._globalListenersBound=!1)}_position(){if(!this.hasAttribute("open")||this.hasAttribute("headless")||this.hasAttribute("disabled"))return;if(!this._anchor){this._requestClose("anchor-missing");return}if(!f(this._anchor)){this._requestClose("anchor-hidden");return}if(!this._panel)return;const t=Math.max(0,c(this.getAttribute("offset"),8)),e=p(this.getAttribute("placement")),i=g(this.getAttribute("align")),r=_(e,i);if(!this._positioner||this._positionerPlacement!==r||this._positionerOffset!==t){this._positioner?.destroy(),this._positioner=d.createPositioner({anchor:this._anchor,floating:this._panel,placement:r,strategy:"fixed",offset:t,flip:!0,shift:!0,boundaryPadding:8,observeWindowResize:!1,observeScroll:!1,observeAncestorScroll:!1,observeAncestorResize:!1,observeLayoutShift:!1,observeAnchorResize:!1,observeFloatingResize:!1,onUpdate:s=>{const u=s.placement.startsWith("top")?"top":"bottom";this.style.setProperty("--ui-floating-toolbar-origin-x",i==="start"?"0%":i==="end"?"100%":"50%"),this._panel?.setAttribute("data-side",u)}}),this._positionerPlacement=r,this._positionerOffset=t;return}this._positioner?.update()}_onWindowChange(){this.hasAttribute("open")&&this._schedulePosition()}_onDocumentPointerDown(t){if(!this.hasAttribute("open")||!a(this.getAttribute("close-on-outside"),!0))return;const e=t.composedPath();e.includes(this)||this._anchor&&e.includes(this._anchor)||this._requestClose("outside")}_onDocumentKeyDown(t){this.hasAttribute("open")&&t.key==="Escape"&&a(this.getAttribute("close-on-escape"),!0)&&(t.preventDefault(),this._requestClose("escape"))}_onPanelKeyDown(t){if(!this._panel||!["ArrowRight","ArrowLeft","Home","End"].includes(t.key))return;const e=this._getFocusableItems();if(e.length===0)return;const i=document.activeElement,r=i?e.indexOf(i):-1;let n=r;t.key==="Home"?n=0:t.key==="End"?n=e.length-1:t.key==="ArrowRight"?n=r<0?0:(r+1)%e.length:t.key==="ArrowLeft"&&(n=r<0?e.length-1:(r-1+e.length)%e.length);const s=e[n];s&&(t.preventDefault(),s.focus())}_getFocusableItems(){const t=this._toolbarSlot?.assignedElements({flatten:!0})||[],e=this._defaultSlot?.assignedElements({flatten:!0})||[];return m([...t,...e])}_onSlotChange(){this._syncRowVisibility(),this._schedulePosition()}_syncRowVisibility(){const t=this.root.querySelector(".row-toolbar"),e=this.root.querySelector(".row-default");if(!t||!e)return;const i=(this._toolbarSlot?.assignedNodes({flatten:!0})||[]).some(n=>n.nodeType===Node.TEXT_NODE?!!n.textContent?.trim():n.nodeType===Node.ELEMENT_NODE),r=(this._defaultSlot?.assignedNodes({flatten:!0})||[]).some(n=>n.nodeType===Node.TEXT_NODE?!!n.textContent?.trim():n.nodeType===Node.ELEMENT_NODE);i?t.removeAttribute("hidden"):t.setAttribute("hidden",""),r?e.removeAttribute("hidden"):e.setAttribute("hidden","")}_syncPanelA11y(){if(!this._panel)return;const t=this.getAttribute("aria-labelledby"),e=this.getAttribute("aria-label")||(t?null:"Floating toolbar");t?this._panel.setAttribute("aria-labelledby",t):this._panel.removeAttribute("aria-labelledby"),e?this._panel.setAttribute("aria-label",e):this._panel.removeAttribute("aria-label")}render(){this.setContent(`
|
|
204
|
+
<style>${b}</style>
|
|
205
|
+
<div class="panel" part="panel" role="toolbar" aria-orientation="horizontal" tabindex="-1">
|
|
206
206
|
<div class="row row-toolbar" part="row-toolbar">
|
|
207
207
|
<slot name="toolbar"></slot>
|
|
208
208
|
</div>
|
|
209
209
|
<div class="row row-default" part="row-default">
|
|
210
210
|
<slot></slot>
|
|
211
211
|
</div>
|
|
212
|
-
</
|
|
212
|
+
</div>
|
|
213
213
|
`),this._panel=this.root.querySelector(".panel"),this._toolbarSlot=this.root.querySelector('slot[name="toolbar"]'),this._defaultSlot=this.root.querySelector("slot:not([name])"),this._panel?.removeEventListener("keydown",this._onPanelKeyDownBound),this._panel?.addEventListener("keydown",this._onPanelKeyDownBound),this._toolbarSlot?.removeEventListener("slotchange",this._onSlotChangeBound),this._defaultSlot?.removeEventListener("slotchange",this._onSlotChangeBound),this._toolbarSlot?.addEventListener("slotchange",this._onSlotChangeBound),this._defaultSlot?.addEventListener("slotchange",this._onSlotChangeBound),this._syncPanelA11y(),this._syncRowVisibility(),this._refreshObservers(),this._schedulePosition()}}typeof customElements<"u"&&!customElements.get("ui-floating-toolbar")&&customElements.define("ui-floating-toolbar",l);exports.UIFloatingToolbar=l;
|
|
@@ -11,7 +11,7 @@ const d = `
|
|
|
11
11
|
|
|
12
12
|
--ui-floating-toolbar-bg: var(--ui-color-surface, #ffffff);
|
|
13
13
|
--ui-floating-toolbar-color: var(--ui-color-text, #0f172a);
|
|
14
|
-
--ui-floating-toolbar-muted: var(--ui-color-muted, #
|
|
14
|
+
--ui-floating-toolbar-muted: var(--ui-color-muted, #526175);
|
|
15
15
|
--ui-floating-toolbar-border-color: color-mix(in srgb, var(--ui-color-border, #cbd5e1) 72%, transparent);
|
|
16
16
|
--ui-floating-toolbar-border: 1px solid var(--ui-floating-toolbar-border-color);
|
|
17
17
|
--ui-floating-toolbar-radius: 12px;
|
|
@@ -148,11 +148,11 @@ const d = `
|
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
:host([tone="success"]) {
|
|
151
|
-
--ui-floating-toolbar-accent: var(--ui-color-success, #
|
|
151
|
+
--ui-floating-toolbar-accent: var(--ui-color-success, #15803d);
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
:host([tone="warning"]) {
|
|
155
|
-
--ui-floating-toolbar-accent: var(--ui-color-warning, #
|
|
155
|
+
--ui-floating-toolbar-accent: var(--ui-color-warning, #b45309);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
:host([tone="danger"]) {
|
|
@@ -203,7 +203,7 @@ const d = `
|
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
205
|
`;
|
|
206
|
-
function
|
|
206
|
+
function b(o, t) {
|
|
207
207
|
if (o == null || o === "") return t;
|
|
208
208
|
const e = Number(o);
|
|
209
209
|
return Number.isFinite(e) ? e : t;
|
|
@@ -213,7 +213,7 @@ function a(o, t) {
|
|
|
213
213
|
const e = o.trim().toLowerCase();
|
|
214
214
|
return e !== "false" && e !== "0" && e !== "off";
|
|
215
215
|
}
|
|
216
|
-
function
|
|
216
|
+
function c(o) {
|
|
217
217
|
if (!document.body.contains(o)) return !1;
|
|
218
218
|
const t = window.getComputedStyle(o);
|
|
219
219
|
return !(t.display === "none" || t.visibility === "hidden" || Number.parseFloat(t.opacity || "1") <= 0);
|
|
@@ -414,12 +414,12 @@ class m extends u {
|
|
|
414
414
|
this._requestClose("anchor-missing");
|
|
415
415
|
return;
|
|
416
416
|
}
|
|
417
|
-
if (!
|
|
417
|
+
if (!c(this._anchor)) {
|
|
418
418
|
this._requestClose("anchor-hidden");
|
|
419
419
|
return;
|
|
420
420
|
}
|
|
421
421
|
if (!this._panel) return;
|
|
422
|
-
const t = Math.max(0,
|
|
422
|
+
const t = Math.max(0, b(this.getAttribute("offset"), 8)), e = f(this.getAttribute("placement")), i = p(this.getAttribute("align")), r = g(e, i);
|
|
423
423
|
if (!this._positioner || this._positionerPlacement !== r || this._positionerOffset !== t) {
|
|
424
424
|
this._positioner?.destroy(), this._positioner = h({
|
|
425
425
|
anchor: this._anchor,
|
|
@@ -488,14 +488,14 @@ class m extends u {
|
|
|
488
488
|
render() {
|
|
489
489
|
this.setContent(`
|
|
490
490
|
<style>${d}</style>
|
|
491
|
-
<
|
|
491
|
+
<div class="panel" part="panel" role="toolbar" aria-orientation="horizontal" tabindex="-1">
|
|
492
492
|
<div class="row row-toolbar" part="row-toolbar">
|
|
493
493
|
<slot name="toolbar"></slot>
|
|
494
494
|
</div>
|
|
495
495
|
<div class="row row-default" part="row-default">
|
|
496
496
|
<slot></slot>
|
|
497
497
|
</div>
|
|
498
|
-
</
|
|
498
|
+
</div>
|
|
499
499
|
`), this._panel = this.root.querySelector(".panel"), this._toolbarSlot = this.root.querySelector('slot[name="toolbar"]'), this._defaultSlot = this.root.querySelector("slot:not([name])"), this._panel?.removeEventListener("keydown", this._onPanelKeyDownBound), this._panel?.addEventListener("keydown", this._onPanelKeyDownBound), this._toolbarSlot?.removeEventListener("slotchange", this._onSlotChangeBound), this._defaultSlot?.removeEventListener("slotchange", this._onSlotChangeBound), this._toolbarSlot?.addEventListener("slotchange", this._onSlotChangeBound), this._defaultSlot?.addEventListener("slotchange", this._onSlotChangeBound), this._syncPanelA11y(), this._syncRowVisibility(), this._refreshObservers(), this._schedulePosition();
|
|
500
500
|
}
|
|
501
501
|
}
|