@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.
@@ -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
- if (!this.enabled) {
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
- getIconSize(sizeParam = 'medium') {
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 sizeList = ['small', 'medium', 'large'];
212
+ const validSizes = ['small', 'medium', 'large'];
70
213
  const sizeLowerCase = (_a = this.size) === null || _a === void 0 ? void 0 : _a.toLowerCase();
71
- return sizeList.includes(sizeLowerCase) ? sizeLowerCase : sizeParam;
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
- resolveOffsetParentRect() {
89
- var _a, _b;
90
- const offsetParentRect = (_b = (_a = this.dropdownParent) === null || _a === void 0 ? void 0 : _a.offsetParent) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect();
91
- const scrollLeft = window.scrollX || document.documentElement.scrollLeft;
92
- const scrollTop = window.scrollY || document.documentElement.scrollTop;
93
- const rectWithoutScroll = {
94
- top: (offsetParentRect === null || offsetParentRect === void 0 ? void 0 : offsetParentRect.top) + scrollTop,
95
- left: (offsetParentRect === null || offsetParentRect === void 0 ? void 0 : offsetParentRect.left) + scrollLeft,
96
- bottom: (offsetParentRect === null || offsetParentRect === void 0 ? void 0 : offsetParentRect.bottom) + scrollTop,
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
- * Método responsável em posicionar o dropdown na tela.
105
- * Faz com que o dropdown se ajuste automaticamente ao espaco na tela
106
- */
107
- positionDropdown() {
108
- var _a, _b, _c, _d, _e, _f;
109
- const { rightButton: _rightButton, dropdownParent: _dropdownParent } = this;
110
- const rightButtonRect = _rightButton.getBoundingClientRect();
111
- const dropdownParentRect = _dropdownParent.getBoundingClientRect();
112
- const spaceBelow = window.innerHeight - (rightButtonRect.bottom + ((_a = this.offsetParentRect) === null || _a === void 0 ? void 0 : _a.top));
113
- const spaceAbove = rightButtonRect.top + ((_b = this.offsetParentRect) === null || _b === void 0 ? void 0 : _b.top);
114
- const spaceRight = window.innerWidth - (rightButtonRect.left + ((_c = this.offsetParentRect) === null || _c === void 0 ? void 0 : _c.left));
115
- const spaceLeft = rightButtonRect.left;
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
- if (this._element)
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
- const dataInfo = { id: 'embedded' };
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
- const dataInfo = { id: 'embedded' };
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
- componentDidUpdate() {
158
- this.positionDropdown();
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("div", { class: "label-icon" }, index.h("button", { class: `ez-split-button__left-button ${iconSize} ${this.mode}`, title: this.leftTitle || this.label, type: "button", disabled: !this.enabled, onClick: () => { this.handleButtonClick(); }, ref: el => (this.leftButton = el) }, hasIconButton && index.h("ez-icon", { href: this.image, iconName: this.iconName, size: iconSize }), hasLabelButton && index.h("label", { title: this.leftTitle || this.label }, this.label)), index.h("div", { class: "dropdown" }, index.h("button", { class: `ez-split-button__right-button ${iconSize} ez-split-button__right-button--${iconSize} ez-split-button__right-button--divider`, title: this.rightTitle || this.i18n("ez-split-button.moreOptions"), type: "button", disabled: !this.enabled, onClick: () => { this.toggleDropdown(); }, ref: el => (this.rightButton = el) }, index.h("ez-icon", { class: `ez-split-button__right-button-container ` + (iconSize ? `btn-icon--${iconSize}` : ''), iconName: 'chevron-down', size: iconSize })), index.h("div", { class: `dropdown-content dropdown-content--${this.size}`, ref: (ref) => (this.dropdownParent = ref) }, this.show && (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 }))))));
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
- shouldShowLabelOnLeftButton() {
167
- return ['icon-left', 'default'].includes(this.mode);
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
- shouldShowIconOnLeftButton() {
170
- return ['icon-left', 'icon-only'].includes(this.mode);
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
  };