@nectary/components 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/accordion/index.js +35 -10
  2. package/accordion/types.d.ts +3 -2
  3. package/accordion-item/index.js +8 -4
  4. package/action-menu/index.js +7 -8
  5. package/action-menu/types.d.ts +3 -3
  6. package/action-menu-option/index.js +23 -3
  7. package/action-menu-option/types.d.ts +2 -0
  8. package/alert/index.js +1 -1
  9. package/avatar/index.js +1 -1
  10. package/button/index.js +68 -4
  11. package/button/types.d.ts +6 -0
  12. package/checkbox/index.js +64 -6
  13. package/checkbox/types.d.ts +8 -2
  14. package/date-picker/index.js +37 -12
  15. package/date-picker/types.d.ts +4 -2
  16. package/dialog/index.d.ts +1 -0
  17. package/dialog/index.js +8 -12
  18. package/dialog/types.d.ts +3 -3
  19. package/dropdown/index.js +44 -28
  20. package/dropdown/types.d.ts +6 -4
  21. package/dropdown-checkbox-option/index.js +1 -1
  22. package/dropdown-checkbox-option/types.d.ts +0 -2
  23. package/dropdown-radio-option/index.js +1 -1
  24. package/dropdown-radio-option/types.d.ts +0 -2
  25. package/dropdown-text-option/index.js +1 -1
  26. package/dropdown-text-option/types.d.ts +0 -2
  27. package/horizontal-stepper/index.d.ts +13 -0
  28. package/horizontal-stepper/index.js +104 -0
  29. package/horizontal-stepper/types.d.ts +9 -0
  30. package/horizontal-stepper/types.js +1 -0
  31. package/horizontal-stepper-item/index.d.ts +13 -0
  32. package/horizontal-stepper-item/index.js +100 -0
  33. package/horizontal-stepper-item/types.d.ts +15 -0
  34. package/horizontal-stepper-item/types.js +1 -0
  35. package/horizontal-stepper-item/utils.d.ts +2 -0
  36. package/horizontal-stepper-item/utils.js +1 -0
  37. package/icon-button/index.js +67 -3
  38. package/icon-button/types.d.ts +6 -0
  39. package/icons/create-icon-class.js +1 -1
  40. package/icons/exclamation/index.d.ts +11 -0
  41. package/icons/exclamation/index.js +4 -0
  42. package/icons-branded/create-icon-class.js +3 -7
  43. package/icons-branded/types.d.ts +3 -0
  44. package/icons-channel/create-icon-class.js +3 -7
  45. package/icons-channel/types.d.ts +3 -0
  46. package/input/index.js +50 -19
  47. package/input/types.d.ts +8 -2
  48. package/link/index.js +81 -3
  49. package/link/types.d.ts +9 -0
  50. package/package.json +1 -1
  51. package/pagination/index.js +24 -8
  52. package/pagination/types.d.ts +3 -1
  53. package/popover/index.js +10 -13
  54. package/popover/types.d.ts +4 -3
  55. package/radio/index.js +36 -8
  56. package/radio/types.d.ts +3 -1
  57. package/radio-option/index.js +1 -1
  58. package/search/types.d.ts +0 -1
  59. package/segment-collapse/index.js +28 -12
  60. package/segment-collapse/types.d.ts +3 -1
  61. package/segmented-control/index.js +28 -23
  62. package/segmented-control/types.d.ts +3 -2
  63. package/segmented-control-option/index.js +59 -13
  64. package/segmented-control-option/types.d.ts +4 -0
  65. package/segmented-icon-control/index.js +27 -16
  66. package/segmented-icon-control/types.d.ts +5 -2
  67. package/segmented-icon-control-option/index.js +54 -12
  68. package/segmented-icon-control-option/types.d.ts +4 -0
  69. package/select/index.js +68 -9
  70. package/select/types.d.ts +41 -7
  71. package/stop-events/index.d.ts +1 -0
  72. package/stop-events/index.js +40 -0
  73. package/tabs/index.js +32 -8
  74. package/tabs/types.d.ts +3 -2
  75. package/tabs-option/index.js +2 -2
  76. package/textarea/index.js +58 -4
  77. package/textarea/types.d.ts +7 -2
  78. package/tile-control/index.d.ts +11 -0
  79. package/tile-control/index.js +181 -0
  80. package/tile-control/types.d.ts +38 -0
  81. package/tile-control/types.js +1 -0
  82. package/tile-control-option/index.d.ts +11 -0
  83. package/tile-control-option/index.js +161 -0
  84. package/tile-control-option/types.d.ts +37 -0
  85. package/tile-control-option/types.js +1 -0
  86. package/time-picker/index.js +17 -3
  87. package/time-picker/types.d.ts +4 -2
  88. package/toggle/index.js +63 -5
  89. package/toggle/types.d.ts +3 -1
  90. package/utils.d.ts +1 -0
  91. package/utils.js +3 -0
@@ -1,8 +1,7 @@
1
- import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
1
  import _classPrivateFieldGet from '@babel/runtime/helpers/classPrivateFieldGet';
3
2
  import _classPrivateFieldSet from '@babel/runtime/helpers/classPrivateFieldSet';
4
3
 
5
- var _$button;
4
+ var _$button, _onClick, _onChangeReactHandler;
6
5
 
7
6
  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
8
7
 
@@ -11,11 +10,11 @@ function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollect
11
10
  import '../icons/expand-less';
12
11
  import '../icons/expand-more';
13
12
  import '../icon-button';
14
- import { defineCustomElement, getBooleanAttribute, isAttrTrue, NectaryElement, updateBooleanAttribute, updateExplicitBooleanAttribute } from '../utils';
13
+ import { defineCustomElement, getBooleanAttribute, getReactEventHandler, isAttrTrue, NectaryElement, updateBooleanAttribute, updateExplicitBooleanAttribute } from '../utils';
15
14
  const templateHTML = '<style>:host{display:block;--sinch-size-icon:32px}#up{display:block}#down{display:none}:host([value]:not([value=false])) #up{display:none}:host([value]:not([value=false])) #down{display:block}</style><sinch-icon-button id="button" small><sinch-icon-expand-less id="up" slot="icon"></sinch-icon-expand-less><sinch-icon-expand-more id="down" slot="icon"></sinch-icon-expand-more></sinch-icon-button>';
16
15
  const template = document.createElement('template');
17
16
  template.innerHTML = templateHTML;
18
- defineCustomElement('sinch-segment-collapse', (_$button = new WeakMap(), class extends NectaryElement {
17
+ defineCustomElement('sinch-segment-collapse', (_$button = new WeakMap(), _onClick = new WeakMap(), _onChangeReactHandler = new WeakMap(), class extends NectaryElement {
19
18
  constructor() {
20
19
  super();
21
20
 
@@ -24,12 +23,25 @@ defineCustomElement('sinch-segment-collapse', (_$button = new WeakMap(), class e
24
23
  value: void 0
25
24
  });
26
25
 
27
- _defineProperty(this, 'onClick', e => {
28
- e.stopPropagation();
29
- this.dispatchEvent(new CustomEvent('change', {
30
- detail: !this.value,
31
- bubbles: true
32
- }));
26
+ _classPrivateFieldInitSpec(this, _onClick, {
27
+ writable: true,
28
+ value: () => {
29
+ const detail = !this.value;
30
+ this.dispatchEvent(new CustomEvent('change', {
31
+ detail,
32
+ bubbles: true
33
+ }));
34
+ this.dispatchEvent(new CustomEvent('-change', {
35
+ detail
36
+ }));
37
+ }
38
+ });
39
+
40
+ _classPrivateFieldInitSpec(this, _onChangeReactHandler, {
41
+ writable: true,
42
+ value: e => {
43
+ getReactEventHandler(this, 'on-change')?.(e);
44
+ }
33
45
  });
34
46
 
35
47
  const shadowRoot = this.attachShadow();
@@ -41,11 +53,15 @@ defineCustomElement('sinch-segment-collapse', (_$button = new WeakMap(), class e
41
53
  connectedCallback() {
42
54
  this.setAttribute('role', 'checkbox');
43
55
 
44
- _classPrivateFieldGet(this, _$button).addEventListener('click', this.onClick);
56
+ _classPrivateFieldGet(this, _$button).addEventListener('click', _classPrivateFieldGet(this, _onClick));
57
+
58
+ this.addEventListener('-change', _classPrivateFieldGet(this, _onChangeReactHandler));
45
59
  }
46
60
 
47
61
  disconnectedCallback() {
48
- _classPrivateFieldGet(this, _$button).removeEventListener('click', this.onClick);
62
+ _classPrivateFieldGet(this, _$button).removeEventListener('click', _classPrivateFieldGet(this, _onClick));
63
+
64
+ this.removeEventListener('-change', _classPrivateFieldGet(this, _onChangeReactHandler));
49
65
  }
50
66
 
51
67
  static get observedAttributes() {
@@ -3,10 +3,12 @@ import type { SyntheticEvent } from 'react';
3
3
  export declare type TSinchSegmentExpandElement = HTMLElement & {
4
4
  value: boolean;
5
5
  addEventListener(type: 'change', listener: (e: CustomEvent<boolean>) => void): void;
6
+ addEventListener(type: '-change', listener: (e: CustomEvent<boolean>) => void): void;
6
7
  setAttribute(name: 'value', value: string): void;
7
8
  };
8
9
  export declare type TSinchSegmentExpandReact = TSinchElementReact<TSinchSegmentExpandElement> & {
9
10
  value: boolean;
10
11
  'aria-label': string;
11
- onChange: (e: SyntheticEvent<TSinchSegmentExpandElement, CustomEvent<boolean>>) => void;
12
+ onChange?: (e: SyntheticEvent<TSinchSegmentExpandElement, CustomEvent<boolean>>) => void;
13
+ 'on-change'?: (e: CustomEvent<boolean>) => void;
12
14
  };
@@ -1,7 +1,7 @@
1
1
  import _classPrivateFieldGet from '@babel/runtime/helpers/classPrivateFieldGet';
2
2
  import _classPrivateFieldSet from '@babel/runtime/helpers/classPrivateFieldSet';
3
3
 
4
- var _$slot, _$sh, _onSlotChange, _onOptionChange, _onValueChange, _dispatchChangeEvent;
4
+ var _$slot, _onSlotChange, _onOptionChange, _onValueChange, _onChangeReactHandler;
5
5
 
6
6
  function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
7
7
 
@@ -11,16 +11,14 @@ function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollect
11
11
 
12
12
  function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
13
13
 
14
- import { defineCustomElement, getAttribute, getBooleanAttribute, NectaryElement, updateAttribute, updateBooleanAttribute } from '../utils';
14
+ import { defineCustomElement, getAttribute, getBooleanAttribute, getReactEventHandler, NectaryElement, updateAttribute, updateBooleanAttribute } from '../utils';
15
15
  const templateHTML = '<style>:host{display:block;outline:0}#wrapper{display:flex;flex-direction:row;width:100%;box-sizing:border-box}</style><div id="wrapper"><slot></slot></div>';
16
16
  const template = document.createElement('template');
17
17
  template.innerHTML = templateHTML;
18
- defineCustomElement('sinch-segmented-control', (_$slot = new WeakMap(), _$sh = new WeakMap(), _onSlotChange = new WeakMap(), _onOptionChange = new WeakMap(), _onValueChange = new WeakSet(), _dispatchChangeEvent = new WeakSet(), class extends NectaryElement {
18
+ defineCustomElement('sinch-segmented-control', (_$slot = new WeakMap(), _onSlotChange = new WeakMap(), _onOptionChange = new WeakMap(), _onValueChange = new WeakSet(), _onChangeReactHandler = new WeakMap(), class extends NectaryElement {
19
19
  constructor() {
20
20
  super();
21
21
 
22
- _classPrivateMethodInitSpec(this, _dispatchChangeEvent);
23
-
24
22
  _classPrivateMethodInitSpec(this, _onValueChange);
25
23
 
26
24
  _classPrivateFieldInitSpec(this, _$slot, {
@@ -28,11 +26,6 @@ defineCustomElement('sinch-segmented-control', (_$slot = new WeakMap(), _$sh = n
28
26
  value: void 0
29
27
  });
30
28
 
31
- _classPrivateFieldInitSpec(this, _$sh, {
32
- writable: true,
33
- value: void 0
34
- });
35
-
36
29
  _classPrivateFieldInitSpec(this, _onSlotChange, {
37
30
  writable: true,
38
31
  value: () => {
@@ -44,31 +37,46 @@ defineCustomElement('sinch-segmented-control', (_$slot = new WeakMap(), _$sh = n
44
37
  writable: true,
45
38
  value: e => {
46
39
  e.stopPropagation();
40
+ const detail = e.detail;
41
+ this.dispatchEvent(new CustomEvent('change', {
42
+ detail,
43
+ bubbles: true
44
+ }));
45
+ this.dispatchEvent(new CustomEvent('-change', {
46
+ detail
47
+ }));
48
+ }
49
+ });
47
50
 
48
- _classPrivateMethodGet(this, _dispatchChangeEvent, _dispatchChangeEvent2).call(this, e.detail);
51
+ _classPrivateFieldInitSpec(this, _onChangeReactHandler, {
52
+ writable: true,
53
+ value: e => {
54
+ getReactEventHandler(this, 'on-change')?.(e);
49
55
  }
50
56
  });
51
57
 
52
58
  const shadowRoot = this.attachShadow();
53
59
  shadowRoot.appendChild(template.content.cloneNode(true));
54
60
 
55
- _classPrivateFieldSet(this, _$sh, shadowRoot);
56
-
57
61
  _classPrivateFieldSet(this, _$slot, shadowRoot.querySelector('slot'));
58
62
  }
59
63
 
60
64
  connectedCallback() {
61
65
  this.setAttribute('role', 'tablist');
62
66
 
63
- _classPrivateFieldGet(this, _$sh).addEventListener('change', _classPrivateFieldGet(this, _onOptionChange));
67
+ _classPrivateFieldGet(this, _$slot).addEventListener('option-change', _classPrivateFieldGet(this, _onOptionChange));
64
68
 
65
69
  _classPrivateFieldGet(this, _$slot).addEventListener('slotchange', _classPrivateFieldGet(this, _onSlotChange));
70
+
71
+ this.addEventListener('-change', _classPrivateFieldGet(this, _onChangeReactHandler));
66
72
  }
67
73
 
68
74
  disconnectedCallback() {
69
- _classPrivateFieldGet(this, _$sh).removeEventListener('change', _classPrivateFieldGet(this, _onOptionChange));
75
+ _classPrivateFieldGet(this, _$slot).removeEventListener('option-change', _classPrivateFieldGet(this, _onOptionChange));
70
76
 
71
77
  _classPrivateFieldGet(this, _$slot).removeEventListener('slotchange', _classPrivateFieldGet(this, _onSlotChange));
78
+
79
+ this.removeEventListener('-change', _classPrivateFieldGet(this, _onChangeReactHandler));
72
80
  }
73
81
 
74
82
  static get observedAttributes() {
@@ -88,6 +96,10 @@ defineCustomElement('sinch-segmented-control', (_$slot = new WeakMap(), _$sh = n
88
96
  }
89
97
 
90
98
  attributeChangedCallback(name, oldVal, newVal) {
99
+ if (oldVal === newVal) {
100
+ return;
101
+ }
102
+
91
103
  switch (name) {
92
104
  case 'value':
93
105
  {
@@ -103,13 +115,6 @@ defineCustomElement('sinch-segmented-control', (_$slot = new WeakMap(), _$sh = n
103
115
  function _onValueChange2(value) {
104
116
  for (const $option of _classPrivateFieldGet(this, _$slot).assignedElements()) {
105
117
  const isChecked = !getBooleanAttribute($option, 'disabled') && value === getAttribute($option, 'value', '');
106
- updateBooleanAttribute($option, 'checked', isChecked);
118
+ updateBooleanAttribute($option, 'data-checked', isChecked);
107
119
  }
108
- }
109
-
110
- function _dispatchChangeEvent2(value) {
111
- this.dispatchEvent(new CustomEvent('change', {
112
- detail: value,
113
- bubbles: true
114
- }));
115
120
  }
@@ -2,11 +2,12 @@ import type { TSinchElementReact } from '../types';
2
2
  import type { SyntheticEvent } from 'react';
3
3
  export declare type TSinchSegmentedControlElement = HTMLElement & {
4
4
  value: string;
5
- addEventListener(type: 'change', listener: (e: CustomEvent<string>) => void): void;
5
+ addEventListener(type: '-change', listener: (e: CustomEvent<string>) => void): void;
6
6
  setAttribute(name: 'value', value: string): void;
7
7
  };
8
8
  export declare type TSinchSegmentedControlReact = TSinchElementReact<TSinchSegmentedControlElement> & {
9
9
  value: string;
10
10
  'aria-label': string;
11
- onChange: (event: SyntheticEvent<TSinchSegmentedControlElement, CustomEvent<string>>) => void;
11
+ onChange?: (event: SyntheticEvent<TSinchSegmentedControlElement, CustomEvent<string>>) => void;
12
+ 'on-change'?: (e: CustomEvent<string>) => void;
12
13
  };
@@ -1,17 +1,17 @@
1
1
  import _classPrivateFieldGet from '@babel/runtime/helpers/classPrivateFieldGet';
2
2
  import _classPrivateFieldSet from '@babel/runtime/helpers/classPrivateFieldSet';
3
3
 
4
- var _$button, _$label, _onClick;
4
+ var _$button, _$label, _onButtonClick, _onButtonFocus, _onButtonBlur, _onFocusReactHandler, _onBlurReactHandler;
5
5
 
6
6
  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
7
7
 
8
8
  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
9
9
 
10
- import { defineCustomElement, getAttribute, getBooleanAttribute, isAttrTrue, NectaryElement, updateAttribute, updateBooleanAttribute, updateExplicitBooleanAttribute } from '../utils';
11
- const templateHTML = '<style>:host{display:block;outline:0}#wrapper{display:flex;position:relative;flex-direction:row;align-items:center;gap:12px;width:100%;height:32px;padding:0 16px;box-sizing:border-box;border:1px solid var(--sinch-color-snow-600);border-left-width:0;border-right-width:0;color:var(--sinch-color-stormy-500);background-color:var(--sinch-color-snow-100);--sinch-color-icon:var(--sinch-color-stormy-500);--sinch-size-icon:16px}#wrapper:hover{background-color:var(--sinch-color-snow-500)}:host(:first-child) #wrapper{border-left-width:1px;border-top-left-radius:4px;border-bottom-left-radius:4px}:host(:last-child) #wrapper{border-right-width:1px;border-top-right-radius:4px;border-bottom-right-radius:4px}#content{font:var(--sinch-font-title-s);flex-shrink:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host([checked]:not([checked=false])) #wrapper{border-color:var(--sinch-color-stormy-500)}:host([checked]:not([checked=false]):not(:first-child)) #wrapper::before{content:"";width:1px;background-color:var(--sinch-color-stormy-500);position:absolute;left:0;top:-1px;bottom:-1px}:host([checked]:not([checked=false]):not(:last-child)) #wrapper::after{content:"";width:1px;background-color:var(--sinch-color-stormy-500);position:absolute;right:0;top:-1px;bottom:-1px}#button{all:initial;position:absolute;left:0;top:0;box-sizing:border-box;width:100%;height:100%;cursor:pointer;z-index:1}#button:disabled{cursor:unset}#button:focus::before{content:"";position:absolute;left:-3px;right:-3px;top:-4px;bottom:-4px;border-style:solid;border-color:var(--sinch-color-aqua-400);border-width:0}#button:focus-visible::before{border-width:2px}:host(:first-child) #button:focus::before{left:-4px;border-top-left-radius:6px;border-bottom-left-radius:6px}:host(:last-child) #button:focus::before{right:-4px;border-top-right-radius:6px;border-bottom-right-radius:6px}@supports not selector(:focus-visible){#button:focus::before{border-width:2px}}:host([disabled]:not([disabled=false])) #wrapper{background-color:var(--sinch-color-snow-100);color:var(--sinch-color-stormy-100);--sinch-color-icon:var(--sinch-color-stormy-100)}</style><div id="wrapper"><slot name="icon"></slot><label for="button" id="content"></label> <button id="button"></button></div>';
10
+ import { defineCustomElement, getAttribute, getBooleanAttribute, getReactEventHandler, isAttrTrue, NectaryElement, updateAttribute, updateBooleanAttribute, updateExplicitBooleanAttribute } from '../utils';
11
+ const templateHTML = '<style>:host{display:block;outline:0}#wrapper{display:flex;position:relative;flex-direction:row;align-items:center;gap:12px;width:100%;height:32px;padding:0 16px;box-sizing:border-box;border:1px solid var(--sinch-color-snow-600);border-left-width:0;border-right-width:0;color:var(--sinch-color-stormy-500);background-color:var(--sinch-color-snow-100);--sinch-color-icon:var(--sinch-color-stormy-500);--sinch-size-icon:16px}#wrapper:hover{background-color:var(--sinch-color-snow-500)}:host(:first-child) #wrapper{border-left-width:1px;border-top-left-radius:4px;border-bottom-left-radius:4px}:host(:last-child) #wrapper{border-right-width:1px;border-top-right-radius:4px;border-bottom-right-radius:4px}#content{font:var(--sinch-font-title-s);flex-shrink:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host([data-checked]) #wrapper{border-color:var(--sinch-color-stormy-500)}:host([data-checked]:not(:first-child)) #wrapper::before{content:"";width:1px;background-color:var(--sinch-color-stormy-500);position:absolute;left:0;top:-1px;bottom:-1px}:host([data-checked]:not(:last-child)) #wrapper::after{content:"";width:1px;background-color:var(--sinch-color-stormy-500);position:absolute;right:0;top:-1px;bottom:-1px}#button{all:initial;position:absolute;left:0;top:0;box-sizing:border-box;width:100%;height:100%;cursor:pointer;z-index:1}#button:disabled{cursor:unset}#button:focus::before{content:"";position:absolute;left:-3px;right:-3px;top:-4px;bottom:-4px;border-style:solid;border-color:var(--sinch-color-aqua-400);border-width:0}#button:focus-visible::before{border-width:2px}:host(:first-child) #button:focus::before{left:-4px;border-top-left-radius:6px;border-bottom-left-radius:6px}:host(:last-child) #button:focus::before{right:-4px;border-top-right-radius:6px;border-bottom-right-radius:6px}@supports not selector(:focus-visible){#button:focus::before{border-width:2px}}:host([disabled]:not([disabled=false])) #wrapper{background-color:var(--sinch-color-snow-100);color:var(--sinch-color-stormy-100);--sinch-color-icon:var(--sinch-color-stormy-100)}</style><div id="wrapper"><slot name="icon"></slot><label for="button" id="content"></label><button id="button"></button></div>';
12
12
  const template = document.createElement('template');
13
13
  template.innerHTML = templateHTML;
14
- defineCustomElement('sinch-segmented-control-option', (_$button = new WeakMap(), _$label = new WeakMap(), _onClick = new WeakMap(), class extends NectaryElement {
14
+ defineCustomElement('sinch-segmented-control-option', (_$button = new WeakMap(), _$label = new WeakMap(), _onButtonClick = new WeakMap(), _onButtonFocus = new WeakMap(), _onButtonBlur = new WeakMap(), _onFocusReactHandler = new WeakMap(), _onBlurReactHandler = new WeakMap(), class extends NectaryElement {
15
15
  constructor() {
16
16
  super();
17
17
 
@@ -25,17 +25,45 @@ defineCustomElement('sinch-segmented-control-option', (_$button = new WeakMap(),
25
25
  value: void 0
26
26
  });
27
27
 
28
- _classPrivateFieldInitSpec(this, _onClick, {
28
+ _classPrivateFieldInitSpec(this, _onButtonClick, {
29
29
  writable: true,
30
30
  value: e => {
31
31
  e.stopPropagation();
32
- this.dispatchEvent(new CustomEvent('change', {
33
- bubbles: true,
34
- detail: this.value
32
+ this.dispatchEvent(new CustomEvent('option-change', {
33
+ detail: this.value,
34
+ bubbles: true
35
35
  }));
36
36
  }
37
37
  });
38
38
 
39
+ _classPrivateFieldInitSpec(this, _onButtonFocus, {
40
+ writable: true,
41
+ value: () => {
42
+ this.dispatchEvent(new CustomEvent('-focus'));
43
+ }
44
+ });
45
+
46
+ _classPrivateFieldInitSpec(this, _onButtonBlur, {
47
+ writable: true,
48
+ value: () => {
49
+ this.dispatchEvent(new CustomEvent('-blur'));
50
+ }
51
+ });
52
+
53
+ _classPrivateFieldInitSpec(this, _onFocusReactHandler, {
54
+ writable: true,
55
+ value: () => {
56
+ getReactEventHandler(this, 'on-focus')?.();
57
+ }
58
+ });
59
+
60
+ _classPrivateFieldInitSpec(this, _onBlurReactHandler, {
61
+ writable: true,
62
+ value: () => {
63
+ getReactEventHandler(this, 'on-blur')?.();
64
+ }
65
+ });
66
+
39
67
  const shadowRoot = this.attachShadow();
40
68
  shadowRoot.appendChild(template.content.cloneNode(true));
41
69
 
@@ -47,15 +75,29 @@ defineCustomElement('sinch-segmented-control-option', (_$button = new WeakMap(),
47
75
  connectedCallback() {
48
76
  this.setAttribute('role', 'tab');
49
77
 
50
- _classPrivateFieldGet(this, _$button).addEventListener('click', _classPrivateFieldGet(this, _onClick));
78
+ _classPrivateFieldGet(this, _$button).addEventListener('click', _classPrivateFieldGet(this, _onButtonClick));
79
+
80
+ _classPrivateFieldGet(this, _$button).addEventListener('focus', _classPrivateFieldGet(this, _onButtonFocus));
81
+
82
+ _classPrivateFieldGet(this, _$button).addEventListener('blur', _classPrivateFieldGet(this, _onButtonBlur));
83
+
84
+ this.addEventListener('-focus', _classPrivateFieldGet(this, _onFocusReactHandler));
85
+ this.addEventListener('-blur', _classPrivateFieldGet(this, _onBlurReactHandler));
51
86
  }
52
87
 
53
88
  disconnectedCallback() {
54
- _classPrivateFieldGet(this, _$button).removeEventListener('click', _classPrivateFieldGet(this, _onClick));
89
+ _classPrivateFieldGet(this, _$button).removeEventListener('click', _classPrivateFieldGet(this, _onButtonClick));
90
+
91
+ _classPrivateFieldGet(this, _$button).removeEventListener('focus', _classPrivateFieldGet(this, _onButtonFocus));
92
+
93
+ _classPrivateFieldGet(this, _$button).removeEventListener('blur', _classPrivateFieldGet(this, _onButtonBlur));
94
+
95
+ this.removeEventListener('-focus', _classPrivateFieldGet(this, _onFocusReactHandler));
96
+ this.removeEventListener('-blur', _classPrivateFieldGet(this, _onBlurReactHandler));
55
97
  }
56
98
 
57
99
  static get observedAttributes() {
58
- return ['checked', 'disabled', 'text', 'value'];
100
+ return ['data-checked', 'disabled', 'text'];
59
101
  }
60
102
 
61
103
  set value(value) {
@@ -82,7 +124,11 @@ defineCustomElement('sinch-segmented-control-option', (_$button = new WeakMap(),
82
124
  return getAttribute(this, 'text', '');
83
125
  }
84
126
 
85
- attributeChangedCallback(name, _, newVal) {
127
+ attributeChangedCallback(name, oldVal, newVal) {
128
+ if (oldVal === newVal) {
129
+ return;
130
+ }
131
+
86
132
  switch (name) {
87
133
  case 'text':
88
134
  {
@@ -90,7 +136,7 @@ defineCustomElement('sinch-segmented-control-option', (_$button = new WeakMap(),
90
136
  break;
91
137
  }
92
138
 
93
- case 'checked':
139
+ case 'data-checked':
94
140
  {
95
141
  updateExplicitBooleanAttribute(this, 'aria-selected', isAttrTrue(newVal));
96
142
  break;
@@ -3,6 +3,8 @@ export declare type TSinchSegmentedControlOptionElement = HTMLElement & {
3
3
  value: string;
4
4
  disabled: boolean;
5
5
  text: string;
6
+ addEventListener(type: '-focus', listener: (e: CustomEvent<void>) => void): void;
7
+ addEventListener(type: '-blur', listener: (e: CustomEvent<void>) => void): void;
6
8
  setAttribute(name: 'value', value: string): void;
7
9
  setAttribute(name: 'text', value: string): void;
8
10
  setAttribute(name: 'disabled', value: ''): void;
@@ -12,4 +14,6 @@ export declare type TSinchSegmentedControlOptionReact = TSinchElementReact<TSinc
12
14
  text: string;
13
15
  disabled?: boolean;
14
16
  'aria-label': string;
17
+ 'on-focus'?: (e: CustomEvent<void>) => void;
18
+ 'on-blur'?: (e: CustomEvent<void>) => void;
15
19
  };
@@ -1,7 +1,7 @@
1
1
  import _classPrivateFieldGet from '@babel/runtime/helpers/classPrivateFieldGet';
2
2
  import _classPrivateFieldSet from '@babel/runtime/helpers/classPrivateFieldSet';
3
3
 
4
- var _$slot, _$sh, _onSlotChange, _onOptionChange, _onValueChange;
4
+ var _$slot, _onSlotChange, _onOptionChange, _onValueChange, _onChangeReactHandler;
5
5
 
6
6
  function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
7
7
 
@@ -11,11 +11,11 @@ function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollect
11
11
 
12
12
  function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
13
13
 
14
- import { defineCustomElement, getAttribute, getBooleanAttribute, getCsvSet, getFirstCsvValue, NectaryElement, updateAttribute, updateBooleanAttribute, updateCsv } from '../utils';
14
+ import { defineCustomElement, getAttribute, getBooleanAttribute, getCsvSet, getFirstCsvValue, getReactEventHandler, NectaryElement, updateAttribute, updateBooleanAttribute, updateCsv } from '../utils';
15
15
  const templateHTML = '<style>:host{display:block;outline:0}#wrapper{display:flex;flex-direction:row}</style><div id="wrapper"><slot></slot></div>';
16
16
  const template = document.createElement('template');
17
17
  template.innerHTML = templateHTML;
18
- defineCustomElement('sinch-segmented-icon-control', (_$slot = new WeakMap(), _$sh = new WeakMap(), _onSlotChange = new WeakMap(), _onOptionChange = new WeakMap(), _onValueChange = new WeakSet(), class extends NectaryElement {
18
+ defineCustomElement('sinch-segmented-icon-control', (_$slot = new WeakMap(), _onSlotChange = new WeakMap(), _onOptionChange = new WeakMap(), _onValueChange = new WeakSet(), _onChangeReactHandler = new WeakMap(), class extends NectaryElement {
19
19
  constructor() {
20
20
  super();
21
21
 
@@ -26,11 +26,6 @@ defineCustomElement('sinch-segmented-icon-control', (_$slot = new WeakMap(), _$s
26
26
  value: void 0
27
27
  });
28
28
 
29
- _classPrivateFieldInitSpec(this, _$sh, {
30
- writable: true,
31
- value: void 0
32
- });
33
-
34
29
  _classPrivateFieldInitSpec(this, _onSlotChange, {
35
30
  writable: true,
36
31
  value: () => {
@@ -44,19 +39,27 @@ defineCustomElement('sinch-segmented-icon-control', (_$slot = new WeakMap(), _$s
44
39
  e.stopPropagation();
45
40
  const $elem = e.target;
46
41
  const value = e.detail;
47
- const result = this.multiple ? updateCsv(this.value, value, !getBooleanAttribute($elem, 'checked')) : value;
42
+ const detail = this.multiple ? updateCsv(this.value, value, !getBooleanAttribute($elem, 'data-checked')) : value;
48
43
  this.dispatchEvent(new CustomEvent('change', {
49
- detail: result,
44
+ detail,
50
45
  bubbles: true
51
46
  }));
47
+ this.dispatchEvent(new CustomEvent('-change', {
48
+ detail
49
+ }));
50
+ }
51
+ });
52
+
53
+ _classPrivateFieldInitSpec(this, _onChangeReactHandler, {
54
+ writable: true,
55
+ value: e => {
56
+ getReactEventHandler(this, 'on-change')?.(e);
52
57
  }
53
58
  });
54
59
 
55
60
  const shadowRoot = this.attachShadow();
56
61
  shadowRoot.appendChild(template.content.cloneNode(true));
57
62
 
58
- _classPrivateFieldSet(this, _$sh, shadowRoot);
59
-
60
63
  _classPrivateFieldSet(this, _$slot, shadowRoot.querySelector('slot'));
61
64
  }
62
65
 
@@ -65,13 +68,17 @@ defineCustomElement('sinch-segmented-icon-control', (_$slot = new WeakMap(), _$s
65
68
 
66
69
  _classPrivateFieldGet(this, _$slot).addEventListener('slotchange', _classPrivateFieldGet(this, _onSlotChange));
67
70
 
68
- _classPrivateFieldGet(this, _$sh).addEventListener('change', _classPrivateFieldGet(this, _onOptionChange));
71
+ _classPrivateFieldGet(this, _$slot).addEventListener('option-change', _classPrivateFieldGet(this, _onOptionChange));
72
+
73
+ this.addEventListener('-change', _classPrivateFieldGet(this, _onChangeReactHandler));
69
74
  }
70
75
 
71
76
  disconnectedCallback() {
72
77
  _classPrivateFieldGet(this, _$slot).removeEventListener('slotchange', _classPrivateFieldGet(this, _onSlotChange));
73
78
 
74
- _classPrivateFieldGet(this, _$sh).removeEventListener('change', _classPrivateFieldGet(this, _onOptionChange));
79
+ _classPrivateFieldGet(this, _$slot).removeEventListener('option-change', _classPrivateFieldGet(this, _onOptionChange));
80
+
81
+ this.removeEventListener('-change', _classPrivateFieldGet(this, _onChangeReactHandler));
75
82
  }
76
83
 
77
84
  static get observedAttributes() {
@@ -99,6 +106,10 @@ defineCustomElement('sinch-segmented-icon-control', (_$slot = new WeakMap(), _$s
99
106
  }
100
107
 
101
108
  attributeChangedCallback(name, oldVal, newVal) {
109
+ if (oldVal === newVal) {
110
+ return;
111
+ }
112
+
102
113
  switch (name) {
103
114
  case 'value':
104
115
  {
@@ -117,14 +128,14 @@ function _onValueChange2(csv) {
117
128
 
118
129
  for (const $option of _classPrivateFieldGet(this, _$slot).assignedElements()) {
119
130
  const isChecked = !getBooleanAttribute($option, 'disabled') && values.has(getAttribute($option, 'value', ''));
120
- updateBooleanAttribute($option, 'checked', isChecked);
131
+ updateBooleanAttribute($option, 'data-checked', isChecked);
121
132
  }
122
133
  } else {
123
134
  const value = getFirstCsvValue(csv);
124
135
 
125
136
  for (const $option of _classPrivateFieldGet(this, _$slot).assignedElements()) {
126
137
  const isChecked = !getBooleanAttribute($option, 'disabled') && value === getAttribute($option, 'value', '');
127
- updateBooleanAttribute($option, 'checked', isChecked);
138
+ updateBooleanAttribute($option, 'data-checked', isChecked);
128
139
  }
129
140
  }
130
141
  }
@@ -3,11 +3,14 @@ import type { SyntheticEvent } from 'react';
3
3
  export declare type TSinchSegmentedIconControlElement = HTMLElement & {
4
4
  value: string;
5
5
  multiple: boolean;
6
- addEventListener(type: 'change', listener: (e: CustomEvent<string>) => void): void;
6
+ addEventListener(type: '-change', listener: (e: CustomEvent<string>) => void): void;
7
+ setAttribute(name: 'value', value: string): void;
8
+ setAttribute(name: 'multiple', value: ''): void;
7
9
  };
8
10
  export declare type TSinchSegmentedIconControlReact = TSinchElementReact<TSinchSegmentedIconControlElement> & {
9
11
  value: string;
10
12
  multiple?: boolean;
11
13
  'aria-label': string;
12
- onChange: (event: SyntheticEvent<TSinchSegmentedIconControlElement, CustomEvent<string>>) => void;
14
+ onChange?: (event: SyntheticEvent<TSinchSegmentedIconControlElement, CustomEvent<string>>) => void;
15
+ 'on-change'?: (e: CustomEvent<string>) => void;
13
16
  };
@@ -1,17 +1,17 @@
1
1
  import _classPrivateFieldGet from '@babel/runtime/helpers/classPrivateFieldGet';
2
2
  import _classPrivateFieldSet from '@babel/runtime/helpers/classPrivateFieldSet';
3
3
 
4
- var _$button, _onClick;
4
+ var _$button, _onButtonClick, _onButtonFocus, _onButtonBlur, _onFocusReactHandler, _onBlurReactHandler;
5
5
 
6
6
  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
7
7
 
8
8
  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
9
9
 
10
- import { defineCustomElement, getAttribute, getBooleanAttribute, isAttrTrue, NectaryElement, updateAttribute, updateBooleanAttribute, updateExplicitBooleanAttribute } from '../utils';
11
- const templateHTML = '<style>:host{display:block;outline:0}#wrapper{position:relative;width:56px;height:32px;padding:3px 16px;box-sizing:border-box;border:1px solid var(--sinch-color-snow-600);border-left-width:0;border-right-width:0;color:var(--sinch-color-stormy-500);background-color:var(--sinch-color-snow-100);--sinch-color-icon:var(--sinch-color-stormy-500);--sinch-size-icon:24px}#wrapper:hover{background-color:var(--sinch-color-snow-500)}:host(:first-child) #wrapper{border-left-width:1px;border-top-left-radius:4px;border-bottom-left-radius:4px}:host(:last-child) #wrapper{border-right-width:1px;border-top-right-radius:4px;border-bottom-right-radius:4px}:host([checked]:not([checked=false])) #wrapper{border-color:var(--sinch-color-stormy-500)}:host([checked]:not([checked=false]):not(:first-child)) #wrapper::before{content:"";width:1px;background-color:var(--sinch-color-stormy-500);position:absolute;left:-1px;top:-1px;bottom:-1px}:host([checked]:not([checked=false]):not(:last-child)) #wrapper::after{content:"";width:1px;background-color:var(--sinch-color-stormy-500);position:absolute;right:0;top:-1px;bottom:-1px}#button{all:initial;position:absolute;left:0;top:0;box-sizing:border-box;width:100%;height:100%;cursor:pointer;z-index:1}#button:disabled{cursor:unset}#button:focus::before{content:"";position:absolute;left:-4px;right:-3px;top:-4px;bottom:-4px;border-style:solid;border-color:var(--sinch-color-aqua-400);border-width:0}#button:focus-visible::before{border-width:2px}:host(:first-child) #button:focus::before{left:-4px;border-top-left-radius:6px;border-bottom-left-radius:6px}:host(:last-child) #button:focus::before{right:-4px;border-top-right-radius:6px;border-bottom-right-radius:6px}@supports not selector(:focus-visible){#button:focus::before{border-width:2px}}:host([disabled]:not([disabled=false])) #wrapper{background-color:var(--sinch-color-snow-100);color:var(--sinch-color-stormy-100);--sinch-color-icon:var(--sinch-color-stormy-100)}::slotted(*){display:block}</style><div id="wrapper"><slot name="icon"></slot><button id="button"></button></div>';
10
+ import { defineCustomElement, getAttribute, getBooleanAttribute, getReactEventHandler, isAttrTrue, NectaryElement, updateAttribute, updateBooleanAttribute, updateExplicitBooleanAttribute } from '../utils';
11
+ const templateHTML = '<style>:host{display:block;outline:0}#wrapper{position:relative;width:56px;height:32px;padding:3px 16px;box-sizing:border-box;border:1px solid var(--sinch-color-snow-600);border-left-width:0;border-right-width:0;color:var(--sinch-color-stormy-500);background-color:var(--sinch-color-snow-100);--sinch-color-icon:var(--sinch-color-stormy-500);--sinch-size-icon:24px}#wrapper:hover{background-color:var(--sinch-color-snow-500)}:host(:first-child) #wrapper{border-left-width:1px;border-top-left-radius:4px;border-bottom-left-radius:4px}:host(:last-child) #wrapper{border-right-width:1px;border-top-right-radius:4px;border-bottom-right-radius:4px}:host([data-checked]) #wrapper{border-color:var(--sinch-color-stormy-500)}:host([data-checked]:not(:first-child)) #wrapper::before{content:"";width:1px;background-color:var(--sinch-color-stormy-500);position:absolute;left:-1px;top:-1px;bottom:-1px}:host([data-checked]:not(:last-child)) #wrapper::after{content:"";width:1px;background-color:var(--sinch-color-stormy-500);position:absolute;right:0;top:-1px;bottom:-1px}#button{all:initial;position:absolute;left:0;top:0;box-sizing:border-box;width:100%;height:100%;cursor:pointer;z-index:1}#button:disabled{cursor:unset}#button:focus::before{content:"";position:absolute;left:-4px;right:-3px;top:-4px;bottom:-4px;border-style:solid;border-color:var(--sinch-color-aqua-400);border-width:0}#button:focus-visible::before{border-width:2px}:host(:first-child) #button:focus::before{left:-4px;border-top-left-radius:6px;border-bottom-left-radius:6px}:host(:last-child) #button:focus::before{right:-4px;border-top-right-radius:6px;border-bottom-right-radius:6px}@supports not selector(:focus-visible){#button:focus::before{border-width:2px}}:host([disabled]:not([disabled=false])) #wrapper{background-color:var(--sinch-color-snow-100);color:var(--sinch-color-stormy-100);--sinch-color-icon:var(--sinch-color-stormy-100)}::slotted(*){display:block}</style><div id="wrapper"><slot name="icon"></slot><button id="button"></button></div>';
12
12
  const template = document.createElement('template');
13
13
  template.innerHTML = templateHTML;
14
- defineCustomElement('sinch-segmented-icon-control-option', (_$button = new WeakMap(), _onClick = new WeakMap(), class extends NectaryElement {
14
+ defineCustomElement('sinch-segmented-icon-control-option', (_$button = new WeakMap(), _onButtonClick = new WeakMap(), _onButtonFocus = new WeakMap(), _onButtonBlur = new WeakMap(), _onFocusReactHandler = new WeakMap(), _onBlurReactHandler = new WeakMap(), class extends NectaryElement {
15
15
  constructor() {
16
16
  super();
17
17
 
@@ -20,17 +20,45 @@ defineCustomElement('sinch-segmented-icon-control-option', (_$button = new WeakM
20
20
  value: void 0
21
21
  });
22
22
 
23
- _classPrivateFieldInitSpec(this, _onClick, {
23
+ _classPrivateFieldInitSpec(this, _onButtonClick, {
24
24
  writable: true,
25
25
  value: e => {
26
26
  e.stopPropagation();
27
- this.dispatchEvent(new CustomEvent('change', {
28
- bubbles: true,
29
- detail: this.value
27
+ this.dispatchEvent(new CustomEvent('option-change', {
28
+ detail: this.value,
29
+ bubbles: true
30
30
  }));
31
31
  }
32
32
  });
33
33
 
34
+ _classPrivateFieldInitSpec(this, _onButtonFocus, {
35
+ writable: true,
36
+ value: () => {
37
+ this.dispatchEvent(new CustomEvent('-focus'));
38
+ }
39
+ });
40
+
41
+ _classPrivateFieldInitSpec(this, _onButtonBlur, {
42
+ writable: true,
43
+ value: () => {
44
+ this.dispatchEvent(new CustomEvent('-blur'));
45
+ }
46
+ });
47
+
48
+ _classPrivateFieldInitSpec(this, _onFocusReactHandler, {
49
+ writable: true,
50
+ value: () => {
51
+ getReactEventHandler(this, 'on-focus')?.();
52
+ }
53
+ });
54
+
55
+ _classPrivateFieldInitSpec(this, _onBlurReactHandler, {
56
+ writable: true,
57
+ value: () => {
58
+ getReactEventHandler(this, 'on-blur')?.();
59
+ }
60
+ });
61
+
34
62
  const shadowRoot = this.attachShadow();
35
63
  shadowRoot.appendChild(template.content.cloneNode(true));
36
64
 
@@ -40,15 +68,29 @@ defineCustomElement('sinch-segmented-icon-control-option', (_$button = new WeakM
40
68
  connectedCallback() {
41
69
  this.setAttribute('role', 'tab');
42
70
 
43
- _classPrivateFieldGet(this, _$button).addEventListener('click', _classPrivateFieldGet(this, _onClick));
71
+ _classPrivateFieldGet(this, _$button).addEventListener('click', _classPrivateFieldGet(this, _onButtonClick));
72
+
73
+ _classPrivateFieldGet(this, _$button).addEventListener('focus', _classPrivateFieldGet(this, _onButtonFocus));
74
+
75
+ _classPrivateFieldGet(this, _$button).addEventListener('blur', _classPrivateFieldGet(this, _onButtonBlur));
76
+
77
+ this.addEventListener('-focus', _classPrivateFieldGet(this, _onFocusReactHandler));
78
+ this.addEventListener('-blur', _classPrivateFieldGet(this, _onBlurReactHandler));
44
79
  }
45
80
 
46
81
  disconnectedCallback() {
47
- _classPrivateFieldGet(this, _$button).removeEventListener('click', _classPrivateFieldGet(this, _onClick));
82
+ _classPrivateFieldGet(this, _$button).removeEventListener('click', _classPrivateFieldGet(this, _onButtonClick));
83
+
84
+ _classPrivateFieldGet(this, _$button).removeEventListener('focus', _classPrivateFieldGet(this, _onButtonFocus));
85
+
86
+ _classPrivateFieldGet(this, _$button).removeEventListener('blur', _classPrivateFieldGet(this, _onButtonBlur));
87
+
88
+ this.removeEventListener('-focus', _classPrivateFieldGet(this, _onFocusReactHandler));
89
+ this.removeEventListener('-blur', _classPrivateFieldGet(this, _onBlurReactHandler));
48
90
  }
49
91
 
50
92
  static get observedAttributes() {
51
- return ['checked', 'disabled', 'value'];
93
+ return ['data-checked', 'disabled'];
52
94
  }
53
95
 
54
96
  set value(value) {
@@ -69,7 +111,7 @@ defineCustomElement('sinch-segmented-icon-control-option', (_$button = new WeakM
69
111
 
70
112
  attributeChangedCallback(name, _, newVal) {
71
113
  switch (name) {
72
- case 'checked':
114
+ case 'data-checked':
73
115
  {
74
116
  updateExplicitBooleanAttribute(this, 'aria-selected', isAttrTrue(newVal));
75
117
  break;
@@ -2,6 +2,8 @@ import type { TSinchElementReact } from '../types';
2
2
  export declare type TSinchSegmentedIconControlOptionElement = HTMLElement & {
3
3
  value: string;
4
4
  disabled: boolean;
5
+ addEventListener(type: '-focus', listener: (e: CustomEvent<void>) => void): void;
6
+ addEventListener(type: '-blur', listener: (e: CustomEvent<void>) => void): void;
5
7
  setAttribute(name: 'value', value: string): void;
6
8
  setAttribute(name: 'disabled', value: ''): void;
7
9
  };
@@ -9,4 +11,6 @@ export declare type TSinchSegmentedIconControlOptionReact = TSinchElementReact<T
9
11
  value: string;
10
12
  disabled?: boolean;
11
13
  'aria-label': string;
14
+ 'on-focus'?: (e: CustomEvent<void>) => void;
15
+ 'on-blur'?: (e: CustomEvent<void>) => void;
12
16
  };