@sankhyalabs/ezui 6.5.0-dev.5 → 6.5.0-dev.6
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/cjs/ez-split-button.cjs.entry.js +244 -69
- package/dist/cjs/ezui.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/components/ez-split-button/ez-split-button.css +256 -116
- package/dist/collection/components/ez-split-button/ez-split-button.js +390 -76
- package/dist/collection/components/ez-split-button/test/dropdownItems.js +4 -4
- package/dist/custom-elements/index.js +245 -70
- package/dist/esm/ez-split-button.entry.js +245 -70
- package/dist/esm/ezui.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/ezui/ezui.esm.js +1 -1
- package/dist/ezui/p-ac215c95.entry.js +1 -0
- package/dist/types/components/ez-split-button/ez-split-button.d.ts +93 -8
- package/dist/types/components.d.ts +114 -4
- package/package.json +1 -1
- package/dist/ezui/p-f1e1f8f8.entry.js +0 -1
|
@@ -6,17 +6,75 @@ const index = require('./index-a7b0c73d.js');
|
|
|
6
6
|
const core = require('@sankhyalabs/core');
|
|
7
7
|
const index$1 = require('./index-4ae2f4f6.js');
|
|
8
8
|
|
|
9
|
-
const ezSplitButtonCss = ":host{--ez-split-button--min-width:24;--ez-split-button--width:'auto';--ez-split-button__medium--height:32px;--ez-split-button__large--height:42px;--ez-split-button__medium-icon--width:40px;--ez-split-button__large-icon--width:44px;--ez-split-button__inline__icon--gap:6px;--ez-split-button__label--padding-top:0px;--ez-split-button__label--padding-bottom:0px;--ez-split-button__right-button--padding-left:8px;--ez-split-button--color:var(--title--primary, #2B3A54);--ez-split-button--font-size:var(--text--small, 12px);--ez-split-button--font-family:var(--font-pattern, Arial);--ez-split-button--font-weight:var(--text-weight--large);--ez-split-button--background-color:var(--background--light, #ffffff);--ez-split-button--border-radius:var(--border--radius-large, 24px);--ez-split-button--border:1px solid var(--color--strokes);--ez-split-button--justify-content:center;--ez-split-button--hover-color:var(--color--primary-600, #007a5a);--ez-split-button--hover--background-color:var(--background--light, #ffffff);--ez-split-button--disabled-color:var(--text--primary);--ez-split-button--disabled--background-color:var(--background--medium);--ez-split-button--focus--border:var(--border--medium, 2px) var(--color--primary-300);--ez-split-button--focus--box-shadow:none;--ez-split-button--active-color:var(--color--primary-700);--ez-split-button--active--background-color:var(--background--strong)}ez-icon{--ez-icon--color:inherit}button{position:relative;display:flex;align-items:center;margin:0;cursor:pointer;transition:background-color 0.2s linear;white-space:nowrap;min-width:var(--ez-split-button--min-width);width:var(--ez-split-button--width);height:var(--ez-split-button__medium--height);font-family:var(--ez-split-button--font-family);font-size:var(--ez-split-button--font-size);font-weight:var(--ez-split-button--font-weight);padding:var(--ez-split-button__label--padding-top) 0 var(--ez-split-button__label--padding-bottom) 0;border-top-left-radius:var(--ez-split-button--border-radius);border-bottom-left-radius:var(--ez-split-button--border-radius);background-color:var(--ez-split-button--background-color);color:var(--ez-split-button--color);fill:var(--ez-split-button--color);border:none;justify-content:var(--ez-split-button--justify-content)}label{cursor:pointer}button:active{outline:none;box-shadow:none;background-color:var(--ez-split-button--active--background-color);color:var(--ez-split-button--active-color);fill:var(--ez-split-button--active-color);--ez-icon--color:var(--ez-split-button--active-color)}.ez-split-button__left-button{border:var(--ez-split-button--border);border-right:none;outline:none}.ez-split-button__right-button{border:var(--ez-split-button--border);border-left:none;outline:none}.ez-split-button__left-button:focus{box-shadow:0 0 0 2px var(--color--primary-300), \n 0 2px 0 0 var(--color--primary-300), \n 0 -2px 0 0 var(--color--primary-300);}.ez-split-button__right-button:focus{box-shadow:2px 0 0 0 var(--color--primary-300), \n 0 2px 0 0 var(--color--primary-300), \n 0 -2px 0 0 var(--color--primary-300);}.ez-split-button__left-button:hover,.ez-split-button__right-button:hover{outline:none;background-color:var(--ez-split-button--hover--background-color);color:var(--ez-split-button--hover-color);fill:var(--ez-split-button--hover-color);--ez-icon--color:var(--ez-split-button--hover-color)}.ez-split-button__left-button:active,.ez-split-button__right-button:active{outline:none;box-shadow:none;background-color:var(--ez-split-button--active--background-color);color:var(--ez-split-button--active-color);fill:var(--ez-split-button--active-color);--ez-icon--color:var(--ez-split-button--active-color)}.ez-split-button__left-button:disabled,.ez-split-button__left-button:disabled label,.ez-split-button__right-button:disabled{background-color:var(--ez-split-button--disabled--background-color);color:var(--ez-split-button--disabled-color);fill:var(--ez-split-button--disabled-color);border:none;--ez-icon--color:var(--ez-split-button--disabled-color);cursor:not-allowed}.ez-split-button__left-button:disabled{border:var(--ez-split-button--disabled-border);border-right:none}.ez-split-button__right-button:disabled{border:var(--ez-split-button--disabled-border);border-left:none}button.large{height:var(--ez-split-button__large--height)}button.medium{height:var(--ez-split-button__medium--height)}.default label{padding:var(--ez-split-button__label--padding-top) 12px var(--ez-split-button__label--padding-bottom) 20px}.icon-left{gap:var(--ez-split-button__inline__icon--gap)}.icon-left label{padding-right:12px}.icon-left ez-icon{padding-left:20px}.icon-only{padding-left:12px;padding-right:12px}.ez-split-button__right-button{border-top-right-radius:var(--ez-split-button--border-radius);border-bottom-right-radius:var(--ez-split-button--border-radius);border-top-left-radius:0;border-bottom-left-radius:0;border-right:var(--ez-split-button--border)}.ez-split-button__right-button--medium{min-width:var(--ez-split-button__medium-icon--width)}.ez-split-button__right-button--large{min-width:var(--ez-split-button__large-icon--width)}.ez-split-button__right-button--divider{top:10%;bottom:10%}.ez-split-button__right-button--divider:before{content:\"\";position:absolute;left:0;border-left:1px solid rgba(0, 0, 0, 20%);border-radius:2px;height:75%}.btn-icon--medium{min-width:--ez-split-button__medium-icon--width}.btn-icon--large{min-width:--ez-split-button__large-icon--width}.ez-split-button__right-button-container{position:absolute;left:0;padding-left:var(--ez-split-button__right-button--padding-left)}.label-icon{display:flex;flex-direction:row;align-items:center;color:var(--ez-split-button--color)}.label-icon:active{color:var(--ez-split-button--active-color);fill:var(--ez-split-button--active-color);--ez-icon--color:var(--ez-split-button--active-color)}.dropdown{display:flex}.dropdown-content{display:block;position:absolute;background-color:#f1f1f1;min-width:160px;z-index:var(--ez-elevation--8);border-radius:var(--ez-split-button--border-radius)}.dropdown-content>ez-dropdown{position:relative}";
|
|
9
|
+
const ezSplitButtonCss = ":host{--ez-split-button--min-width:var(--space--40, 40px);--ez-split-button--width:auto;--ez-split-button--height:var(--space--32, 32px);--ez-split-button__medium-icon--width:var(--space--40, 40px);--ez-split-button__large-icon--width:var(--space--44, 44px);--ez-split-button__label--padding-top:var(--space--0, 0px);--ez-split-button__label--padding-bottom:var(--space--0, 0px);--ez-split-button__right-button--padding-left:var(--space--8, 8px);--ez-split-button__right-button--padding-right:var(--space--12, 12px);--ez-split-button--color:var(--color--ocean-green-600, #008561);--ez-split-button__left-icon--color:var(--color--ocean-green-600, #008561);--ez-split-button__right-icon--color:var(--color--ocean-green-600, #008561);--ez-split-button--background-color:var(--color--gray-70, #FFFFFF);--ez-split-button--border:1px solid var(--color--gray-90, #EAEAEA);--ez-split-button--font-size:var(--font-size--default, 14px);--ez-split-button--line-height:var(--line-height--28, 28px);--ez-split-button--font-family:var(--font-pattern, Arial);--ez-split-button--font-weight:var(--font-weight--regular,400);--ez-split-button--border-radius:var(--border--radius-24, 24px);--ez-split-button--hover-color:var(--color--primary-600, #007a5a);--ez-split-button--hover--background-color:var(--color--gray-80, #F9F9F9);--ez-split-button--disabled-color:var(--color--gray-400, #77777A);--ez-split-button--disabled--background-color:var(--color--gray-80, #F9F9F9);--ez-split-button--focus--border:var(--border--medium, 2px) var(--color--primary-300);--ez-split-button--focus--box-shadow:none;display:flex;width:fit-content}:host(.ez-split-button--primary){--ez-split-button--color:var(--color--gray-70);--ez-split-button--background-color:var(--color--ocean-green-500);--ez-split-button--font-weight:var(--font-weight--regular);--ez-split-button--border:none;--ez-split-button__left-icon--color:var(--color--gray-70);--ez-split-button__right-icon--color:var(--color--gray-70);--ez-split-button--hover-color:var(--color--gray-70);--ez-split-button--hover--background-color:var(--color--ocean-green-700);--ez-split-button--hover--border:none;--ez-split-button--left-icon--hover-color:var(--color--gray-70);--ez-split-button--right-icon--hover-color:var(--color--gray-70);--ez-split-button--disabled-color:var(--color--gray-70);--ez-split-button--disabled--background-color:var(--color--gray-400);--ez-split-button--disabled--border:none;--ez-split-button--disabled-icon-color:var(--color--gray-200);--ez-split-button__left-icon--disabled-color:var(--color--gray-200);--ez-split-button__right-icon--disabled-color:var(--color--gray-200)}:host(.ez-split-button--secondary){--ez-split-button--color:var(--color--ocean-green-600);--ez-split-button--background-color:var(--color--gray-70);--ez-split-button--border:1px solid var(--color--gray-90);--ez-split-button--left-icon--color:var(--color--ocean-green-600);--ez-split-button--right-icon--color:var(--color--ocean-green-600);--ez-split-button--hover-color:var(--color--ocean-green-600);--ez-split-button--hover--background-color:var(--color--gray-80);--ez-split-button--hover--border:1px solid var(--color--gray-90);--ez-split-button--left-icon--hover-color:var(--color--ocean-green-600);--ez-split-button--right-icon--hover-color:var(--color--ocean-green-600);--ez-split-button--disabled-color:var(--color--gray-400);--ez-split-button--disabled--background-color:var(--color--gray-80);--ez-split-button--disabled--border:1px solid var(--color--gray-200);--ez-split-button--disabled-icon-color:var(--color--gray-400);--ez-split-button__left-icon--disabled-color:var(--color--gray-300);--ez-split-button__right-icon--disabled-color:var(--color--gray-300)}:host(.ez-split-button--tertiary){--ez-split-button--color:var(--color--ocean-green-600);--ez-split-button--background-color:transparent;--ez-split-button--font-weight:var(--font-weight--regular);--ez-split-button--border:none;--ez-split-button--left-icon--color:var(--color--ocean-green-600);--ez-split-button--right-icon--color:var(--color--ocean-green-600);--ez-split-button--hover-color:var(--color--ocean-green-800);--ez-split-button--hover--background-color:transparent;--ez-split-button--hover--border:none;--ez-split-button--left-icon--hover-color:var(--color--ocean-green-800);--ez-split-button--right-icon--hover-color:var(--color--ocean-green-800);--ez-split-button--disabled-color:var(--color--gray-400);--ez-split-button--disabled--background-color:transparent;--ez-split-button--disabled--border:transparent;--ez-split-button--disabled-icon-color:var(--color--gray-200);--ez-split-button__left-icon--disabled-color:var(--color--gray-200);--ez-split-button__right-icon--disabled-color:var(--color--gray-200)}.ez-split-button.large{--ez-split-button--height:var(--space--42, 42px)}.ez-split-button.medium{--ez-split-button--height:var(--space--32, 32px)}ez-icon{--ez-icon--color:inherit}button{position:relative;display:flex;align-items:center;margin:0;cursor:pointer;transition:background-color 0.2s linear, transform 0.15s ease;white-space:nowrap;overflow:hidden;transform:scale(1);min-width:var(--ez-split-button--min-width);width:var(--ez-split-button--width);height:var(--ez-split-button--height);font-family:var(--ez-split-button--font-family);font-size:var(--ez-split-button--font-size);font-weight:var(--ez-split-button--font-weight);padding:var(--ez-split-button__label--padding-top) 0 var(--ez-split-button__label--padding-bottom) 0;border-top-left-radius:var(--ez-split-button--border-radius);border-bottom-left-radius:var(--ez-split-button--border-radius);background-color:var(--ez-split-button--background-color);color:var(--ez-split-button--color);fill:var(--ez-split-button--color);border:none}label{cursor:pointer;line-height:var(--ez-split-button--line-height)}.ez-split-button__left-button{border:var(--ez-split-button--border);border-right:none;outline:none;gap:var(--space--8, 8px);padding-left:var(--space--12, 12px);padding-right:var(--space--8, 8px)}.ez-split-button__right-button{border:var(--ez-split-button--border);border-left:none;outline:none}.ez-split-button__left-button.force-focus-visible,.ez-split-button__left-button:focus-visible{box-shadow:-1px 1px 0px 1px var(--color--gray-70), \n -1px -1px 0px 1px var(--color--gray-70), \n -2px -2px 0px 2px var(--color--ocean-green-200), \n -2px 2px 0px 2px var(--color--ocean-green-200), \n 0px -2px 0px 2px var(--color--ocean-green-200), \n 0px 2px 0px 2px var(--color--ocean-green-200)}.ez-split-button__right-button.force-focus-visible,.ez-split-button__right-button:focus-visible{box-shadow:1px 1px 0px 1px var(--color--gray-70), \n 1px -1px 0px 1px var(--color--gray-70), \n 2px -2px 0px 2px var(--color--ocean-green-200), \n 2px 2px 0px 2px var(--color--ocean-green-200), \n 0px -2px 0px 2px var(--color--ocean-green-200), \n 0px 2px 0px 2px var(--color--ocean-green-200)}.ez-split-button__left-button[aria-disabled].force-focus-visible,.ez-split-button__left-button[aria-disabled]:focus-visible{box-shadow:-1px 1px 0px 1px var(--color--gray-70), \n -1px -1px 0px 1px var(--color--gray-70), \n -2px -2px 0px 2px var(--color--petroleum-100), \n -2px 2px 0px 2px var(--color--petroleum-100), \n 0px -2px 0px 2px var(--color--petroleum-100), \n 0px 2px 0px 2px var(--color--petroleum-100)}.ez-split-button__right-button[aria-disabled].force-focus-visible,.ez-split-button__right-button[aria-disabled]:focus-visible{box-shadow:1px 1px 0px 1px var(--color--gray-70), \n 1px -1px 0px 1px var(--color--gray-70), \n 2px -2px 0px 2px var(--color--petroleum-100), \n 2px 2px 0px 2px var(--color--petroleum-100), \n 0px -2px 0px 2px var(--color--petroleum-100), \n 0px 2px 0px 2px var(--color--petroleum-100)}.ez-split-button__left-button:hover,.ez-split-button__right-button:hover{outline:none;background-color:var(--ez-split-button--hover--background-color);color:var(--ez-split-button--hover-color);fill:var(--ez-split-button--hover-color);--ez-icon--color:var(--ez-split-button--hover-color)}.ez-split-button__left-button:disabled,.ez-split-button__left-button[aria-disabled],.ez-split-button__left-button:disabled label,.ez-split-button__left-button[aria-disabled] label,.ez-split-button__right-button:disabled,.ez-split-button__right-button[aria-disabled]{background-color:var(--ez-split-button--disabled--background-color);color:var(--ez-split-button--disabled-color);fill:var(--ez-split-button--disabled-color);border:none;--ez-icon--color:var(--ez-split-button__left-icon--disabled-color);cursor:not-allowed}.ez-split-button__left-button:disabled,.ez-split-button__left-button[aria-disabled]{--ez-icon--color:var(--ez-split-button__left-icon--disabled-color);border:var(--ez-split-button--disabled-border);border-right:none}.ez-split-button__right-button:disabled,.ez-split-button__right-button[aria-disabled]{--ez-icon--color:var(--ez-split-button__right-icon--disabled-color);border:var(--ez-split-button--disabled-border);border-left:none}.ez-split-button__right-button{border-top-right-radius:var(--ez-split-button--border-radius);border-bottom-right-radius:var(--ez-split-button--border-radius);border-top-left-radius:0;border-bottom-left-radius:0;border-right:var(--ez-split-button--border)}.ez-split-button__divider{width:1px;box-sizing:border-box;position:relative;background-color:var(--ez-split-button--background-color);height:var(--ez-split-button--height);border-top:var(--ez-split-button--border);border-bottom:var(--ez-split-button--border)}.ez-split-button__divider[aria-disabled],.ez-split-button__divider.disabled{cursor:not-allowed;background-color:var(--ez-split-button--disabled--background-color);border-top:var(--ez-split-button--disabled--border);border-bottom:var(--ez-split-button--disabled--border)}.ez-split-button__divider:before{content:\"\";position:absolute;left:0;border-left:1px solid rgba(0, 0, 0, 10%);border-radius:2px;height:75%;top:10%;bottom:10%}.btn-icon--medium{min-width:--ez-split-button__medium-icon--width}.btn-icon--large{min-width:--ez-split-button__large-icon--width}.ez-split-button__right-button-container{position:absolute;left:0;padding-left:var(--ez-split-button__right-button--padding-left);padding-right:var(--ez-split-button__right-button--padding-right)}.ez-split-button{display:flex;flex-direction:row;align-items:center;color:var(--ez-split-button--color)}.dropdown{display:flex}.dropdown-content{display:block;position:absolute;background-color:#f1f1f1;min-width:160px;z-index:var(--ez-elevation--8);border-radius:var(--ez-split-button--border-radius)}.dropdown-content>ez-dropdown{position:relative}.ripple{position:absolute;width:20px;height:20px;border-radius:50%;background:rgba(255, 255, 255, 0.3);pointer-events:none;transform:scale(0);animation:ripple-animation 0.6s linear;z-index:0}@keyframes ripple-animation{to{transform:scale(4);opacity:0}}:host .ripple,:host(.ez-split-button--secondary) .ripple{background:rgba(0, 133, 97, 0.2)}:host(.ez-split-button--primary) .ripple{background:rgba(255, 255, 255, 0.3)}:host(.ez-split-button--tertiary) .ripple{background:rgba(0, 133, 97, 0.15)}.ez-split-button__left-button.pressed,.ez-split-button__right-button.pressed{transform:scale(0.98)}.ez-split-button__left-button>*:not(.ripple),.ez-split-button__right-button>*:not(.ripple){position:relative;z-index:1}.ez-split-button__left-button:disabled .ripple,.ez-split-button__left-button[aria-disabled] .ripple,.ez-split-button__right-button:disabled .ripple,.ez-split-button__right-button[aria-disabled] .ripple{display:none}.ez-split-button__left-button:disabled,.ez-split-button__left-button[aria-disabled],.ez-split-button__right-button:disabled,.ez-split-button__right-button[aria-disabled]{transform:scale(1) !important}";
|
|
10
10
|
|
|
11
|
+
const ANIMATION_TIMINGS = {
|
|
12
|
+
PRESSED_DURATION: 150,
|
|
13
|
+
RIPPLE_DURATION: 600
|
|
14
|
+
};
|
|
11
15
|
const EzSplitButton = class {
|
|
12
16
|
constructor(hostRef) {
|
|
13
17
|
index.registerInstance(this, hostRef);
|
|
14
18
|
this.buttonClick = index.createEvent(this, "buttonClick", 7);
|
|
15
19
|
this.dropdownItemClick = index.createEvent(this, "dropdownItemClick", 7);
|
|
16
20
|
this.dropdownSubActionClick = index.createEvent(this, "dropdownSubActionClick", 7);
|
|
21
|
+
this.rippleCounter = 0;
|
|
22
|
+
this.eventListeners = new WeakMap();
|
|
23
|
+
this.createRipple = (event, isLeftButton) => {
|
|
24
|
+
const button = isLeftButton ? this.leftButton : this.rightButton;
|
|
25
|
+
if (!button || this.isButtonDisabled || this.suppressAnimation)
|
|
26
|
+
return;
|
|
27
|
+
const coordinates = this.getEventCoordinates(event);
|
|
28
|
+
const rect = button.getBoundingClientRect();
|
|
29
|
+
const ripplePosition = {
|
|
30
|
+
x: coordinates.x - rect.left,
|
|
31
|
+
y: coordinates.y - rect.top
|
|
32
|
+
};
|
|
33
|
+
const newRipple = Object.assign(Object.assign({}, ripplePosition), { id: ++this.rippleCounter });
|
|
34
|
+
this.addRippleToButton(newRipple, isLeftButton);
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Método responsável em posicionar o dropdown na tela.
|
|
38
|
+
* Faz com que o dropdown se ajuste automaticamente ao espaco na tela
|
|
39
|
+
*/
|
|
40
|
+
this.positionDropdown = () => {
|
|
41
|
+
if (!this.rightButton || !this.dropdownParent)
|
|
42
|
+
return;
|
|
43
|
+
requestAnimationFrame(() => {
|
|
44
|
+
const { rightButton, dropdownParent } = this;
|
|
45
|
+
const rightButtonRect = rightButton.getBoundingClientRect();
|
|
46
|
+
const dropdownRect = dropdownParent.getBoundingClientRect();
|
|
47
|
+
const viewportHeight = window.innerHeight;
|
|
48
|
+
const viewportWidth = window.innerWidth;
|
|
49
|
+
// Calcule posições de forma mais eficiente
|
|
50
|
+
const spaceBelow = viewportHeight - rightButtonRect.bottom;
|
|
51
|
+
const spaceAbove = rightButtonRect.top;
|
|
52
|
+
const spaceRight = viewportWidth - rightButtonRect.left;
|
|
53
|
+
const spaceLeft = rightButtonRect.left;
|
|
54
|
+
const shouldOpenUpward = spaceBelow < dropdownRect.height && spaceAbove > dropdownRect.height;
|
|
55
|
+
const shouldOpenLeftward = spaceRight < dropdownRect.width && spaceLeft > dropdownRect.width;
|
|
56
|
+
const styles = this.calculateDropdownPosition(rightButtonRect, dropdownRect, shouldOpenUpward, shouldOpenLeftward);
|
|
57
|
+
Object.assign(dropdownParent.style, styles);
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
this.removeForcedFocusVisibleLeft = () => {
|
|
61
|
+
var _a;
|
|
62
|
+
(_a = this.leftButton) === null || _a === void 0 ? void 0 : _a.classList.remove('force-focus-visible');
|
|
63
|
+
};
|
|
64
|
+
this.removeForcedFocusVisibleRight = () => {
|
|
65
|
+
var _a;
|
|
66
|
+
(_a = this.rightButton) === null || _a === void 0 ? void 0 : _a.classList.remove('force-focus-visible');
|
|
67
|
+
};
|
|
68
|
+
this.leftRipples = [];
|
|
69
|
+
this.rightRipples = [];
|
|
70
|
+
this.isLeftPressed = false;
|
|
71
|
+
this.isRightPressed = false;
|
|
17
72
|
this.show = false;
|
|
18
73
|
this.enabled = true;
|
|
74
|
+
this.isDisabled = false;
|
|
19
75
|
this.iconName = undefined;
|
|
76
|
+
this.leftIconName = undefined;
|
|
77
|
+
this.rightIconName = undefined;
|
|
20
78
|
this.image = undefined;
|
|
21
79
|
this.items = undefined;
|
|
22
80
|
this.label = undefined;
|
|
@@ -24,6 +82,8 @@ const EzSplitButton = class {
|
|
|
24
82
|
this.rightTitle = undefined;
|
|
25
83
|
this.mode = 'default';
|
|
26
84
|
this.size = 'medium';
|
|
85
|
+
this.variant = undefined;
|
|
86
|
+
this.suppressAnimation = false;
|
|
27
87
|
this.itemBuilder = undefined;
|
|
28
88
|
}
|
|
29
89
|
/**
|
|
@@ -38,12 +98,14 @@ const EzSplitButton = class {
|
|
|
38
98
|
*/
|
|
39
99
|
async setLeftButtonFocus() {
|
|
40
100
|
this.leftButton.focus();
|
|
101
|
+
this.leftButton.classList.add("force-focus-visible");
|
|
41
102
|
}
|
|
42
103
|
/**
|
|
43
104
|
* Aplica o foco no botão do dropdown.
|
|
44
|
-
|
|
105
|
+
*/
|
|
45
106
|
async setRightButtonFocus() {
|
|
46
107
|
this.rightButton.focus();
|
|
108
|
+
this.rightButton.classList.add("force-focus-visible");
|
|
47
109
|
}
|
|
48
110
|
/**
|
|
49
111
|
* Abre ou Fecha o dropdown do Split Button.
|
|
@@ -57,18 +119,99 @@ const EzSplitButton = class {
|
|
|
57
119
|
async isOpenedDropdown() {
|
|
58
120
|
return this.show;
|
|
59
121
|
}
|
|
122
|
+
getEventCoordinates(event) {
|
|
123
|
+
if (event instanceof MouseEvent) {
|
|
124
|
+
return { x: event.clientX, y: event.clientY };
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
x: event.touches[0].clientX,
|
|
128
|
+
y: event.touches[0].clientY
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
addRippleToButton(ripple, isLeftButton) {
|
|
132
|
+
if (isLeftButton) {
|
|
133
|
+
this.leftRipples = [...this.leftRipples, ripple];
|
|
134
|
+
this.setButtonPressed(true, true);
|
|
135
|
+
this.scheduleRippleCleanup(ripple, true);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
this.rightRipples = [...this.rightRipples, ripple];
|
|
139
|
+
this.setButtonPressed(false, true);
|
|
140
|
+
this.scheduleRippleCleanup(ripple, false);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
setButtonPressed(isLeftButton, pressed) {
|
|
144
|
+
if (isLeftButton) {
|
|
145
|
+
this.isLeftPressed = pressed;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
this.isRightPressed = pressed;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
scheduleRippleCleanup(ripple, isLeftButton) {
|
|
152
|
+
setTimeout(() => {
|
|
153
|
+
this.setButtonPressed(isLeftButton, false);
|
|
154
|
+
}, ANIMATION_TIMINGS.PRESSED_DURATION);
|
|
155
|
+
setTimeout(() => {
|
|
156
|
+
this.removeRipple(ripple.id, isLeftButton);
|
|
157
|
+
}, ANIMATION_TIMINGS.RIPPLE_DURATION);
|
|
158
|
+
}
|
|
159
|
+
removeRipple(rippleId, isLeftButton) {
|
|
160
|
+
if (isLeftButton) {
|
|
161
|
+
this.leftRipples = this.leftRipples.filter(ripple => ripple.id !== rippleId);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this.rightRipples = this.rightRipples.filter(ripple => ripple.id !== rippleId);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
onMouseDown(event) {
|
|
168
|
+
const composedPath = event.composedPath();
|
|
169
|
+
const isLeftButton = composedPath.includes(this.leftButton);
|
|
170
|
+
const isRightButton = composedPath.includes(this.rightButton);
|
|
171
|
+
if (isLeftButton) {
|
|
172
|
+
this.createRipple(event, true);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (isRightButton) {
|
|
176
|
+
this.createRipple(event, false);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
onTouchStart(event) {
|
|
181
|
+
const composedPath = event.composedPath();
|
|
182
|
+
const isLeftButton = composedPath.includes(this.leftButton);
|
|
183
|
+
const isRightButton = composedPath.includes(this.rightButton);
|
|
184
|
+
if (isLeftButton) {
|
|
185
|
+
this.createRipple(event, true);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (isRightButton) {
|
|
189
|
+
this.createRipple(event, false);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
60
193
|
clickListener(evt) {
|
|
61
|
-
|
|
194
|
+
const isDisabled = !this.enabled ||
|
|
195
|
+
this.isDisabled === true ||
|
|
196
|
+
this.isDisabled === "" ||
|
|
197
|
+
this.isDisabled === "full";
|
|
198
|
+
if (isDisabled) {
|
|
62
199
|
evt.preventDefault();
|
|
63
200
|
evt.stopPropagation();
|
|
64
201
|
evt.stopImmediatePropagation();
|
|
65
202
|
}
|
|
66
203
|
}
|
|
67
|
-
|
|
204
|
+
shouldShowLabelOnLeftButton() {
|
|
205
|
+
return this.mode !== 'icon-only';
|
|
206
|
+
}
|
|
207
|
+
shouldShowIconOnLeftButton() {
|
|
208
|
+
return this.mode !== 'default';
|
|
209
|
+
}
|
|
210
|
+
getIconSize(defaultSize = 'medium') {
|
|
68
211
|
var _a;
|
|
69
|
-
const
|
|
212
|
+
const validSizes = ['small', 'medium', 'large'];
|
|
70
213
|
const sizeLowerCase = (_a = this.size) === null || _a === void 0 ? void 0 : _a.toLowerCase();
|
|
71
|
-
return
|
|
214
|
+
return validSizes.includes(sizeLowerCase) ? sizeLowerCase : defaultSize;
|
|
72
215
|
}
|
|
73
216
|
closeDropdown() {
|
|
74
217
|
this.show = false;
|
|
@@ -79,95 +222,127 @@ const EzSplitButton = class {
|
|
|
79
222
|
handleDropdownItemClick(evt) {
|
|
80
223
|
this.dropdownItemClick.emit(evt.detail);
|
|
81
224
|
evt.stopPropagation();
|
|
225
|
+
this.closeDropdown();
|
|
82
226
|
}
|
|
83
227
|
handleDropdownSubActionClick(evt) {
|
|
84
228
|
this.dropdownSubActionClick.emit(evt.detail);
|
|
85
229
|
evt.stopPropagation();
|
|
86
230
|
this.closeDropdown();
|
|
87
231
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
right: (offsetParentRect === null || offsetParentRect === void 0 ? void 0 : offsetParentRect.right) + scrollLeft,
|
|
98
|
-
width: offsetParentRect === null || offsetParentRect === void 0 ? void 0 : offsetParentRect.width,
|
|
99
|
-
height: offsetParentRect === null || offsetParentRect === void 0 ? void 0 : offsetParentRect.height
|
|
232
|
+
calculateDropdownPosition(buttonRect, dropdownRect, openUpward, openLeftward) {
|
|
233
|
+
const baseOffset = this.offsetParentRect || { top: 0, left: 0 };
|
|
234
|
+
return {
|
|
235
|
+
top: openUpward ? 'auto' : `${buttonRect.bottom - baseOffset.top + window.scrollY}px`,
|
|
236
|
+
bottom: openUpward ? `${window.innerHeight - buttonRect.top - window.scrollY}px` : 'auto',
|
|
237
|
+
left: openLeftward
|
|
238
|
+
? `${buttonRect.right - dropdownRect.width - baseOffset.left + window.scrollX}px`
|
|
239
|
+
: `${buttonRect.left - baseOffset.left + window.scrollX}px`,
|
|
240
|
+
maxHeight: openUpward ? `${buttonRect.top - baseOffset.top}px` : 'none'
|
|
100
241
|
};
|
|
101
|
-
this.offsetParentRect = rectWithoutScroll;
|
|
102
242
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const hasSpaceBelow = spaceBelow < dropdownParentRect.height && spaceAbove > dropdownParentRect.height;
|
|
117
|
-
const hasSpaceRight = spaceRight < dropdownParentRect.width && spaceLeft > dropdownParentRect.width;
|
|
118
|
-
let top = `${rightButtonRect.bottom - ((_d = this.offsetParentRect) === null || _d === void 0 ? void 0 : _d.top) + window.scrollY}px`;
|
|
119
|
-
let left = `${rightButtonRect.left - ((_e = this.offsetParentRect) === null || _e === void 0 ? void 0 : _e.left) + window.scrollX}px`;
|
|
120
|
-
let bottom = 'auto';
|
|
121
|
-
if (hasSpaceBelow) {
|
|
122
|
-
bottom = `${window.innerHeight - rightButtonRect.top - window.scrollY}px`;
|
|
123
|
-
top = 'auto';
|
|
124
|
-
_dropdownParent.style.maxHeight = `${spaceAbove}px`;
|
|
125
|
-
}
|
|
126
|
-
if (hasSpaceRight) {
|
|
127
|
-
left = `${rightButtonRect.right - dropdownParentRect.width - ((_f = this.offsetParentRect) === null || _f === void 0 ? void 0 : _f.left) + window.scrollX}px`;
|
|
128
|
-
}
|
|
129
|
-
_dropdownParent.style.top = top;
|
|
130
|
-
_dropdownParent.style.bottom = bottom;
|
|
131
|
-
_dropdownParent.style.left = left;
|
|
132
|
-
}
|
|
133
|
-
setEvents() {
|
|
134
|
-
window.removeEventListener('scroll', this.positionDropdown.bind(this));
|
|
135
|
-
window.addEventListener('scroll', this.positionDropdown.bind(this));
|
|
243
|
+
setupEventListeners() {
|
|
244
|
+
const controller = new AbortController();
|
|
245
|
+
const { signal } = controller;
|
|
246
|
+
window.addEventListener('scroll', this.positionDropdown, { signal, passive: true });
|
|
247
|
+
window.addEventListener('resize', this.positionDropdown, { signal, passive: true });
|
|
248
|
+
this.eventListeners.set(this._element, controller);
|
|
249
|
+
}
|
|
250
|
+
cleanupEventListeners() {
|
|
251
|
+
const controller = this.eventListeners.get(this._element);
|
|
252
|
+
if (controller) {
|
|
253
|
+
controller.abort();
|
|
254
|
+
this.eventListeners.delete(this._element);
|
|
255
|
+
}
|
|
136
256
|
}
|
|
137
257
|
async componentWillLoad() {
|
|
138
258
|
this.i18n = await index$1.initI18n();
|
|
139
|
-
this.setEvents();
|
|
140
|
-
}
|
|
141
|
-
componentWillRender() {
|
|
142
|
-
this.resolveOffsetParentRect();
|
|
143
259
|
}
|
|
144
260
|
componentDidLoad() {
|
|
145
|
-
|
|
261
|
+
this.addElementIDs();
|
|
262
|
+
this.setupEventListeners();
|
|
263
|
+
this.addBlurListeners();
|
|
264
|
+
setTimeout(() => this.positionDropdown(), 0);
|
|
265
|
+
}
|
|
266
|
+
disconnectedCallback() {
|
|
267
|
+
this.cleanupEventListeners();
|
|
268
|
+
this.removeBlurListeners();
|
|
269
|
+
}
|
|
270
|
+
componentDidUpdate() {
|
|
271
|
+
if (this.show) {
|
|
272
|
+
this.positionDropdown();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
addElementIDs() {
|
|
276
|
+
if (this._element) {
|
|
146
277
|
core.ElementIDUtils.addIDInfo(this._element);
|
|
278
|
+
}
|
|
147
279
|
if (this.leftButton) {
|
|
148
|
-
|
|
149
|
-
core.ElementIDUtils.addIDInfo(this.leftButton, 'left-button', dataInfo);
|
|
280
|
+
core.ElementIDUtils.addIDInfo(this.leftButton, 'leftButton', { id: 'embedded' });
|
|
150
281
|
}
|
|
151
282
|
if (this.rightButton) {
|
|
152
|
-
|
|
153
|
-
core.ElementIDUtils.addIDInfo(this.rightButton, 'right-button', dataInfo);
|
|
283
|
+
core.ElementIDUtils.addIDInfo(this.rightButton, 'rightButton', { id: 'embedded' });
|
|
154
284
|
}
|
|
155
|
-
this.positionDropdown();
|
|
156
285
|
}
|
|
157
|
-
|
|
158
|
-
|
|
286
|
+
renderRipples(ripples) {
|
|
287
|
+
return ripples.map((ripple) => (index.h("span", { key: ripple.id, class: "ripple", style: {
|
|
288
|
+
left: `${ripple.x - 10}px`,
|
|
289
|
+
top: `${ripple.y - 10}px`,
|
|
290
|
+
} })));
|
|
159
291
|
}
|
|
160
292
|
render() {
|
|
161
293
|
const hasIconButton = this.shouldShowIconOnLeftButton();
|
|
162
294
|
const hasLabelButton = this.shouldShowLabelOnLeftButton();
|
|
163
295
|
const iconSize = this.getIconSize();
|
|
164
|
-
return (index.h(
|
|
296
|
+
return (index.h(index.Host, { class: this.variant ? `ez-split-button--${this.variant}` : '' }, index.h("div", { class: `ez-split-button ${this.size} ${this.mode}` }, this.renderLeftButton(hasIconButton, hasLabelButton, iconSize), this.renderDivider(), this.renderDropdownSection(iconSize))));
|
|
165
297
|
}
|
|
166
|
-
|
|
167
|
-
return
|
|
298
|
+
renderLeftButton(hasIconButton, hasLabelButton, iconSize) {
|
|
299
|
+
return (index.h("button", { class: `ez-split-button__left-button ${iconSize} ${this.mode} ${this.isLeftPressed ? 'pressed' : ''}`, title: this.leftTitle || this.label, type: "button", disabled: this.isButtonDisabled, "aria-disabled": this.isButtonAriaDisabled, onClick: () => this.handleButtonClick(), ref: el => (this.leftButton = el) }, hasIconButton && this.renderLeftIcon(iconSize), hasLabelButton && this.renderLabel(), !this.suppressAnimation && this.renderRipples(this.leftRipples)));
|
|
168
300
|
}
|
|
169
|
-
|
|
170
|
-
return
|
|
301
|
+
renderDivider() {
|
|
302
|
+
return index.h("div", { class: `ez-split-button__divider ${this.mode} ez-split-button__divider--${this.size} ${this.isButtonDisabled ? 'disabled' : ''}`, "aria-disabled": this.isButtonAriaDisabled });
|
|
303
|
+
}
|
|
304
|
+
renderDropdownSection(iconSize) {
|
|
305
|
+
return (index.h("div", { class: "dropdown" }, this.renderRightButton(iconSize), this.renderDropdownContent()));
|
|
306
|
+
}
|
|
307
|
+
renderRightButton(iconSize) {
|
|
308
|
+
return (index.h("button", { class: `ez-split-button__right-button ${iconSize} ez-split-button__right-button--${iconSize} ${this.isRightPressed ? 'pressed' : ''}`, title: this.rightTitle || this.i18n("ez-split-button.moreOptions"), type: "button", disabled: this.isButtonDisabled, "aria-disabled": this.isButtonAriaDisabled, onClick: () => this.toggleDropdown(), ref: el => (this.rightButton = el) }, this.renderRightIcon(iconSize), !this.suppressAnimation && this.renderRipples(this.rightRipples)));
|
|
309
|
+
}
|
|
310
|
+
renderDropdownContent() {
|
|
311
|
+
return (index.h("div", { class: `dropdown-content dropdown-content--${this.size}`, ref: (ref) => (this.dropdownParent = ref) }, this.show && this.renderDropdown()));
|
|
312
|
+
}
|
|
313
|
+
renderLeftIcon(iconSize) {
|
|
314
|
+
return (index.h("ez-icon", { href: this.image, iconName: this.leftIconName || this.iconName, size: iconSize }));
|
|
315
|
+
}
|
|
316
|
+
renderLabel() {
|
|
317
|
+
return index.h("label", { title: this.leftTitle || this.label }, this.label);
|
|
318
|
+
}
|
|
319
|
+
renderRightIcon(iconSize) {
|
|
320
|
+
const iconName = this.rightIconName || 'chevron-down';
|
|
321
|
+
const containerClass = `ez-split-button__right-button-container ${iconSize ? `btn-icon--${iconSize}` : ''}`;
|
|
322
|
+
return (index.h("ez-icon", { class: containerClass, iconName: iconName, size: iconSize }));
|
|
323
|
+
}
|
|
324
|
+
renderDropdown() {
|
|
325
|
+
return (index.h("ez-dropdown", { items: this.items, onClick: evt => evt.stopPropagation(), onEzOutsideClick: () => this.closeDropdown(), onEzClick: evt => this.handleDropdownItemClick(evt), onEzSubActionClick: evt => this.handleDropdownSubActionClick(evt), itemBuilder: this.itemBuilder }));
|
|
326
|
+
}
|
|
327
|
+
addBlurListeners() {
|
|
328
|
+
var _a, _b;
|
|
329
|
+
this.removeBlurListeners();
|
|
330
|
+
(_a = this.leftButton) === null || _a === void 0 ? void 0 : _a.addEventListener('blur', this.removeForcedFocusVisibleLeft);
|
|
331
|
+
(_b = this.rightButton) === null || _b === void 0 ? void 0 : _b.addEventListener('blur', this.removeForcedFocusVisibleRight);
|
|
332
|
+
}
|
|
333
|
+
removeBlurListeners() {
|
|
334
|
+
var _a, _b;
|
|
335
|
+
(_a = this.leftButton) === null || _a === void 0 ? void 0 : _a.removeEventListener('blur', this.removeForcedFocusVisibleLeft);
|
|
336
|
+
(_b = this.rightButton) === null || _b === void 0 ? void 0 : _b.removeEventListener('blur', this.removeForcedFocusVisibleRight);
|
|
337
|
+
}
|
|
338
|
+
connectedCallback() {
|
|
339
|
+
this.addBlurListeners();
|
|
340
|
+
}
|
|
341
|
+
get isButtonDisabled() {
|
|
342
|
+
return this.isDisabled === "full" || !this.enabled;
|
|
343
|
+
}
|
|
344
|
+
get isButtonAriaDisabled() {
|
|
345
|
+
return this.isDisabled === true || this.isDisabled === "";
|
|
171
346
|
}
|
|
172
347
|
get _element() { return index.getElement(this); }
|
|
173
348
|
};
|