@nectary/components 0.35.0 → 0.36.1

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 (39) hide show
  1. package/alert/index.d.ts +4 -0
  2. package/alert/index.js +17 -32
  3. package/alert/types.d.ts +1 -7
  4. package/alert/utils.d.ts +3 -0
  5. package/alert/utils.js +6 -1
  6. package/button/index.js +2 -2
  7. package/horizontal-stepper/types.d.ts +4 -0
  8. package/horizontal-stepper-item/types.d.ts +9 -0
  9. package/icon-button/index.js +9 -3
  10. package/inline-alert/index.d.ts +17 -0
  11. package/inline-alert/index.js +154 -0
  12. package/inline-alert/types.d.ts +15 -0
  13. package/inline-alert/utils.d.ts +5 -0
  14. package/inline-alert/utils.js +6 -0
  15. package/package.json +1 -1
  16. package/popover/index.js +82 -72
  17. package/select/index.js +1 -1
  18. package/select/types.d.ts +4 -0
  19. package/select-option/types.d.ts +26 -3
  20. package/tag/index.js +1 -1
  21. package/text/index.js +1 -1
  22. package/time-picker/index.js +9 -1
  23. package/vertical-stepper/index.d.ts +13 -0
  24. package/vertical-stepper/index.js +95 -0
  25. package/vertical-stepper/types.d.ts +13 -0
  26. package/vertical-stepper/types.js +1 -0
  27. package/vertical-stepper-item/index.d.ts +13 -0
  28. package/vertical-stepper-item/index.js +100 -0
  29. package/vertical-stepper-item/types.d.ts +24 -0
  30. package/vertical-stepper-item/utils.d.ts +2 -0
  31. package/vertical-stepper-item/utils.js +1 -0
  32. package/alert-button/index.d.ts +0 -11
  33. package/alert-button/index.js +0 -59
  34. package/alert-button/types.d.ts +0 -8
  35. package/alert-close/index.d.ts +0 -12
  36. package/alert-close/index.js +0 -38
  37. package/alert-close/types.d.ts +0 -3
  38. /package/{alert-button → inline-alert}/types.js +0 -0
  39. /package/{alert-close → vertical-stepper-item}/types.js +0 -0
package/alert/index.d.ts CHANGED
@@ -1,3 +1,7 @@
1
+ import '../icons/report-problem';
2
+ import '../icons/report';
3
+ import '../icons/info';
4
+ import '../text';
1
5
  import type { TSinchAlertElement, TSinchAlertReact } from './types';
2
6
  declare global {
3
7
  namespace JSX {
package/alert/index.js CHANGED
@@ -1,18 +1,22 @@
1
1
  import _classPrivateFieldGet from '@babel/runtime/helpers/classPrivateFieldGet';
2
2
  import _classPrivateFieldSet from '@babel/runtime/helpers/classPrivateFieldSet';
3
3
 
4
- var _$text, _$caption;
4
+ var _$text;
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, getBooleanAttribute, getAttribute, getLiteralAttribute, updateBooleanAttribute, updateAttribute, updateLiteralAttribute, NectaryElement } from '../utils';
11
- const templateHTML = '<style>:host{--sinch-color-alert-info-background:#D5E5F8;--sinch-color-alert-success-background:#D7F1D8;--sinch-color-alert-warn-background:#FFE8D6;--sinch-color-alert-error-background:#FCD7D4;display:block}#wrapper{display:flex;flex-direction:row;column-gap:12px;align-items:center;position:relative;padding:12px 18px;border-radius:var(--sinch-shape-radius-l);font:var(--sinch-font-body);color:var(--sinch-color-stormy-600);background-color:var(--sinch-color-alert-info-background);box-sizing:border-box;width:100%;min-height:56px}#body-wrapper{display:flex;flex-direction:row;align-items:center;column-gap:12px;flex:1;min-width:0}#caption{display:none;font:var(--sinch-font-title-s);margin:0;margin-bottom:4px}#text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0;flex:1;min-width:0}:is(#icon-info,#icon-success,#icon-warn,#icon-error){display:none}:host([type=success]) #wrapper{background-color:var(--sinch-color-alert-success-background)}:host([type=warn]) #wrapper{background-color:var(--sinch-color-alert-warn-background)}:host([type=error]) #wrapper{background-color:var(--sinch-color-alert-error-background)}:host([type=info]) #wrapper{background-color:var(--sinch-color-alert-info-background)}:host([type=success]) #icon-success{display:block}:host([type=warn]) #icon-warn{display:block}:host([type=error]) #icon-error{display:block}:host(:is([type=info],:not([type]))) #icon-info{display:block}:host([multiline]:not([multiline=false])) #wrapper{align-items:flex-start;padding:16px 18px}:host([multiline]:not([multiline=false])) #body-wrapper{flex-direction:column;align-items:flex-start}:host([multiline]:not([multiline=false])) #caption{display:block}:host([multiline]:not([multiline=false])) :is(#icon-info,#icon-success,#icon-warn,#icon-error){margin-top:2px}:host([multiline]:not([multiline=false])) #text{overflow:unset;text-overflow:unset;white-space:unset}:host([multiline]:not([multiline=false])) ::slotted(sinch-alert-button){margin-top:10px}</style><div id="wrapper"><svg id="icon-info" width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M10 0C4.48 0 0 4.48 0 10s4.48 10 10 10 10-4.48 10-10S15.52 0 10 0Zm0 15c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1s1 .45 1 1v4c0 .55-.45 1-1 1Zm1-8H9V5h2v2Z" fill="#2071CE"/></svg><svg id="icon-success" width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M10 0C4.48 0 0 4.48 0 10s4.48 10 10 10 10-4.48 10-10S15.52 0 10 0ZM7.29 14.29 3.7 10.7a.996.996 0 1 1 1.41-1.41L8 12.17l6.88-6.88a.996.996 0 1 1 1.41 1.41L8.7 14.29a.996.996 0 0 1-1.41 0Z" fill="#2E8540"/></svg><svg id="icon-warn" width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M2.47 18h15.06c1.54 0 2.5-1.67 1.73-3L11.73 1.99c-.77-1.33-2.69-1.33-3.46 0L.74 15c-.77 1.33.19 3 1.73 3ZM10 11c-.55 0-1-.45-1-1V8c0-.55.45-1 1-1s1 .45 1 1v2c0 .55-.45 1-1 1Zm1 4H9v-2h2v2Z" fill="#FF8C34"/></svg><svg id="icon-error" width="20" height="20" viewBox="0 0 18 18" aria-hidden="true"><path d="M12.32 0H5.68c-.26 0-.52.11-.7.29L.29 4.98c-.18.18-.29.44-.29.7v6.63c0 .27.11.52.29.71l4.68 4.68c.19.19.45.3.71.3h6.63c.27 0 .52-.11.71-.29l4.68-4.68a.99.99 0 0 0 .29-.71V5.68c0-.27-.11-.52-.29-.71L13.02.29c-.18-.18-.44-.29-.7-.29ZM9 14.3c-.72 0-1.3-.58-1.3-1.3 0-.72.58-1.3 1.3-1.3.72 0 1.3.58 1.3 1.3 0 .72-.58 1.3-1.3 1.3ZM9 10c-.55 0-1-.45-1-1V5c0-.55.45-1 1-1s1 .45 1 1v4c0 .55-.45 1-1 1Z" fill="#E31C3D"/></svg><div id="body-wrapper"><p id="caption"></p><p id="text"></p><slot name="button"></slot></div><slot name="close"></slot></div>';
12
- import { typeValues } from './utils';
10
+ import '../icons/report-problem';
11
+ import '../icons/report';
12
+ import '../icons/info';
13
+ import '../text';
14
+ import { defineCustomElement, getAttribute, getLiteralAttribute, updateAttribute, updateLiteralAttribute, NectaryElement } from '../utils';
15
+ const templateHTML = '<style>#wrapper{display:flex;flex-direction:row;gap:8px;align-items:center;padding:0 16px;box-sizing:border-box;width:100%;height:48px}#text{color:var(--sinch-color-stormy-500);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}#icon-error,#icon-info,#icon-warn{display:none}:host([type=warn]) #wrapper{background-color:var(--sinch-color-warning-200)}:host([type=error]) #wrapper{background-color:var(--sinch-color-error-200)}:host([type=info]) #wrapper{background-color:var(--sinch-color-informative-200)}:host([type=warn]) #icon-warn{display:block;--sinch-color-icon:var(--sinch-color-warning-500)}:host([type=error]) #icon-error{display:block;--sinch-color-icon:var(--sinch-color-error-500)}:host([type=info]) #icon-info{display:block;--sinch-color-icon:var(--sinch-color-informative-500)}</style><div id="wrapper"><sinch-icon-info id="icon-info"></sinch-icon-info><sinch-icon-report-problem id="icon-warn"></sinch-icon-report-problem><sinch-icon-report id="icon-error"></sinch-icon-report><sinch-text id="text" type="m"></sinch-text><slot name="action"></slot><slot name="close"></slot></div>';
16
+ import { assertType, typeValues } from './utils';
13
17
  const template = document.createElement('template');
14
18
  template.innerHTML = templateHTML;
15
- defineCustomElement('sinch-alert', (_$text = new WeakMap(), _$caption = new WeakMap(), class extends NectaryElement {
19
+ defineCustomElement('sinch-alert', (_$text = new WeakMap(), class extends NectaryElement {
16
20
  constructor() {
17
21
  super();
18
22
 
@@ -21,17 +25,14 @@ defineCustomElement('sinch-alert', (_$text = new WeakMap(), _$caption = new Weak
21
25
  value: void 0
22
26
  });
23
27
 
24
- _classPrivateFieldInitSpec(this, _$caption, {
25
- writable: true,
26
- value: void 0
27
- });
28
-
29
28
  const shadowRoot = this.attachShadow();
30
29
  shadowRoot.appendChild(template.content.cloneNode(true));
31
30
 
32
31
  _classPrivateFieldSet(this, _$text, shadowRoot.querySelector('#text'));
32
+ }
33
33
 
34
- _classPrivateFieldSet(this, _$caption, shadowRoot.querySelector('#caption'));
34
+ connectedCallback() {
35
+ this.setAttribute('role', 'alert');
35
36
  }
36
37
 
37
38
  get type() {
@@ -50,37 +51,21 @@ defineCustomElement('sinch-alert', (_$text = new WeakMap(), _$caption = new Weak
50
51
  updateAttribute(this, 'text', value);
51
52
  }
52
53
 
53
- get caption() {
54
- return getAttribute(this, 'caption', '');
55
- }
56
-
57
- set caption(value) {
58
- updateAttribute(this, 'caption', value);
59
- }
60
-
61
- get multiline() {
62
- return getBooleanAttribute(this, 'multiline');
63
- }
64
-
65
- set multiline(isMultiline) {
66
- updateBooleanAttribute(this, 'multiline', isMultiline);
67
- }
68
-
69
54
  static get observedAttributes() {
70
- return ['text', 'caption'];
55
+ return ['text', 'type'];
71
56
  }
72
57
 
73
58
  attributeChangedCallback(name, _, newVal) {
74
59
  switch (name) {
75
- case 'text':
60
+ case 'type':
76
61
  {
77
- _classPrivateFieldGet(this, _$text).textContent = newVal;
62
+ assertType(newVal);
78
63
  break;
79
64
  }
80
65
 
81
- case 'caption':
66
+ case 'text':
82
67
  {
83
- _classPrivateFieldGet(this, _$caption).textContent = newVal;
68
+ _classPrivateFieldGet(this, _$text).textContent = newVal;
84
69
  break;
85
70
  }
86
71
  }
package/alert/types.d.ts CHANGED
@@ -1,18 +1,12 @@
1
1
  import type { TSinchElementReact } from '../types';
2
- export declare type TSinchAlertType = 'info' | 'success' | 'warn' | 'error';
2
+ export declare type TSinchAlertType = 'info' | 'warn' | 'error';
3
3
  export declare type TSinchAlertElement = HTMLElement & {
4
4
  type: TSinchAlertType;
5
5
  text: string;
6
- caption: string;
7
- multiline: boolean;
8
6
  setAttribute(name: 'type', value: TSinchAlertType): void;
9
7
  setAttribute(name: 'text', value: string): void;
10
- setAttribute(name: 'caption', value: string): void;
11
- setAttribute(name: 'multiline', value: ''): void;
12
8
  };
13
9
  export declare type TSinchAlertReact = TSinchElementReact<TSinchAlertElement> & {
14
10
  type: TSinchAlertType;
15
11
  text: string;
16
- caption?: string;
17
- multiline?: boolean;
18
12
  };
package/alert/utils.d.ts CHANGED
@@ -1,2 +1,5 @@
1
1
  import type { TSinchAlertType } from './types';
2
2
  export declare const typeValues: readonly TSinchAlertType[];
3
+ declare type TAssertType = (value: string | null) => asserts value is TSinchAlertType;
4
+ export declare const assertType: TAssertType;
5
+ export {};
package/alert/utils.js CHANGED
@@ -1 +1,6 @@
1
- export const typeValues = ['info', 'success', 'warn', 'error'];
1
+ export const typeValues = ['info', 'warn', 'error'];
2
+ export const assertType = value => {
3
+ if (value === null || !typeValues.includes(value)) {
4
+ throw new Error(`sinch-alert: invalid type attribute: ${value}`);
5
+ }
6
+ };
package/button/index.js CHANGED
@@ -8,7 +8,7 @@ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedec
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
10
  import { defineCustomElement, getBooleanAttribute, getAttribute, getLiteralAttribute, isAttrTrue, updateBooleanAttribute, updateAttribute, updateLiteralAttribute, NectaryElement, getReactEventHandler } from '../utils';
11
- const templateHTML = '<style>:host{--sinch-color-button-background:var(--sinch-color-tropical-500);--sinch-color-button-background-hover:var(--sinch-color-tropical-400);--sinch-color-button-background-focus:var(--sinch-color-tropical-500);--sinch-color-button-background-active:var(--sinch-color-tropical-600);--sinch-color-button-background-disabled:var(--sinch-color-tropical-100);--sinch-color-button-text:var(--sinch-color-text-inverted);--sinch-color-button-text-disabled:var(--sinch-color-text-inverted);--sinch-color-button-border:var(--sinch-color-transparent);--sinch-color-button-border-hover:var(--sinch-color-transparent);--sinch-color-button-border-focus:var(--sinch-color-tropical-700);--sinch-color-button-border-active:var(--sinch-color-transparent);--sinch-color-button-border-disabled:var(--sinch-color-transparent);--sinch-color-spinner-bg:var(--sinch-color-tropical-300);--sinch-color-spinner-fg:var(--sinch-color-snow-100);--sinch-color-icon:var(--sinch-color-text-inverted);display:inline-block;vertical-align:middle;outline:0}:host([type=secondary]){--sinch-color-button-background:var(--sinch-color-snow-100);--sinch-color-button-background-hover:var(--sinch-color-tropical-100);--sinch-color-button-background-focus:var(--sinch-color-snow-100);--sinch-color-button-background-active:var(--sinch-color-tropical-100);--sinch-color-button-background-disabled:var(--sinch-color-snow-100);--sinch-color-button-text:var(--sinch-color-tropical-500);--sinch-color-button-text-disabled:var(--sinch-color-tropical-100);--sinch-color-button-border:var(--sinch-color-tropical-500);--sinch-color-button-border-hover:var(--sinch-color-tropical-500);--sinch-color-button-border-focus:var(--sinch-color-tropical-700);--sinch-color-button-border-active:var(--sinch-color-tropical-500);--sinch-color-button-border-disabled:var(--sinch-color-tropical-100);--sinch-color-spinner-bg:var(--sinch-color-tropical-100);--sinch-color-spinner-fg:var(--sinch-color-tropical-500);--sinch-color-icon:var(--sinch-color-tropical-500)}:host([type=secondary]) button:is(:hover,:active){--sinch-color-spinner-bg:var(--sinch-color-tropical-300);--sinch-color-spinner-fg:var(--sinch-color-snow-100)}:host([type=secondary]) button:disabled{--sinch-color-spinner-bg:var(--sinch-color-tropical-200);--sinch-color-spinner-fg:var(--sinch-color-tropical-400)}:host([type=cta-primary]){--sinch-color-button-background:var(--sinch-color-honey-500);--sinch-color-button-background-hover:var(--sinch-color-honey-400);--sinch-color-button-background-focus:var(--sinch-color-honey-500);--sinch-color-button-background-active:var(--sinch-color-honey-600);--sinch-color-button-background-disabled:var(--sinch-color-honey-100);--sinch-color-button-text:var(--sinch-color-text-default);--sinch-color-button-text-disabled:var(--sinch-color-stormy-300);--sinch-color-button-border:var(--sinch-color-transparent);--sinch-color-button-border-hover:var(--sinch-color-transparent);--sinch-color-button-border-focus:var(--sinch-color-text-default);--sinch-color-button-border-active:var(--sinch-color-transparent);--sinch-color-button-border-disabled:var(--sinch-color-transparent);--sinch-color-spinner-bg:var(--sinch-color-honey-700);--sinch-color-spinner-fg:var(--sinch-color-stormy-600);--sinch-color-icon:var(--sinch-color-text-default)}:host([type=cta-primary]) button:disabled{--sinch-color-spinner-bg:var(--sinch-color-snow-100);--sinch-color-spinner-fg:var(--sinch-color-stormy-300)}:host([type=cta-secondary]){--sinch-color-button-background:var(--sinch-color-snow-100);--sinch-color-button-background-hover:var(--sinch-color-snow-500);--sinch-color-button-background-focus:var(--sinch-color-snow-100);--sinch-color-button-background-active:var(--sinch-color-snow-500);--sinch-color-button-background-disabled:var(--sinch-color-snow-100);--sinch-color-button-text:var(--sinch-color-stormy-500);--sinch-color-button-text-disabled:var(--sinch-color-stormy-200);--sinch-color-button-border:var(--sinch-color-stormy-500);--sinch-color-button-border-hover:var(--sinch-color-stormy-500);--sinch-color-button-border-focus:var(--sinch-color-stormy-500);--sinch-color-button-border-active:var(--sinch-color-stormy-500);--sinch-color-button-border-disabled:var(--sinch-color-stormy-200);--sinch-color-spinner-bg:var(--sinch-color-snow-800);--sinch-color-spinner-fg:var(--sinch-color-stormy-600);--sinch-color-icon:var(--sinch-color-stormy-500)}:host([type=cta-secondary]) button:disabled{--sinch-color-spinner-bg:var(--sinch-color-snow-600);--sinch-color-spinner-fg:var(--sinch-color-stormy-200);--sinch-color-icon:var(--sinch-color-stormy-200)}:host([type=destructive]){--sinch-color-button-background:var(--sinch-color-snow-100);--sinch-color-button-background-hover:var(--sinch-color-error-200);--sinch-color-button-background-focus:var(--sinch-color-snow-100);--sinch-color-button-background-active:var(--sinch-color-error-200);--sinch-color-button-background-disabled:var(--sinch-color-snow-100);--sinch-color-button-text:var(--sinch-color-text-invalid);--sinch-color-button-text-disabled:var(--sinch-color-error-200);--sinch-color-button-border:var(--sinch-color-error-500);--sinch-color-button-border-hover:var(--sinch-color-error-500);--sinch-color-button-border-focus:var(--sinch-color-error-800);--sinch-color-button-border-active:var(--sinch-color-error-500);--sinch-color-button-border-disabled:var(--sinch-color-error-200);--sinch-color-spinner-bg:var(--sinch-color-raspberry-100);--sinch-color-spinner-fg:var(--sinch-color-raspberry-500);--sinch-color-icon:var(--sinch-color-text-invalid)}:host([type=destructive]) button:is(:hover,:active){--sinch-color-spinner-bg:var(--sinch-color-raspberry-200);--sinch-color-spinner-fg:var(--sinch-color-raspberry-500)}:host([type=destructive]) button:disabled{--sinch-color-spinner-bg:var(--sinch-color-raspberry-100);--sinch-color-spinner-fg:var(--sinch-color-raspberry-500)}button{all:initial;position:relative;display:flex;align-items:center;justify-content:center;gap:12px;box-sizing:border-box;width:100%;height:48px;padding:12px;border-radius:var(--sinch-shape-radius-s);font:var(--sinch-font-title-s);color:var(--sinch-color-button-text);background-color:var(--sinch-color-button-background);cursor:pointer;--sinch-size-icon:24px}button::before{content:"";position:absolute;left:0;top:0;bottom:0;right:0;border:1px solid var(--sinch-color-button-border);border-radius:var(--sinch-shape-radius-s);pointer-events:none}button:focus{background-color:var(--sinch-color-button-background-focus)}button:focus::before{border-color:var(--sinch-color-button-border-focus);border-width:2px}button:hover{background-color:var(--sinch-color-button-background-hover)}button:hover::before{border-color:var(--sinch-color-button-border-hover);border-width:1px}button:active{background-color:var(--sinch-color-button-background-active)}button:active::before{border-color:var(--sinch-color-button-border-active);border-width:2px}button:disabled{color:var(--sinch-color-button-text-disabled);background-color:var(--sinch-color-button-background-disabled);cursor:initial;--sinch-color-spinner-bg:var(--sinch-color-snow-100);--sinch-color-spinner-fg:var(--sinch-color-tropical-200);--sinch-color-icon:var(--sinch-color-button-text-disabled)}button:disabled::before{border-color:var(--sinch-color-button-border-disabled)}button>*{pointer-events:none}#text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;display:none}:host([text]:not([text=""])) #text{display:initial}:host([text]:not([text=""])) button{padding:12px 24px}:host([small]:not([small=false]))>button{height:32px;padding:8px;line-height:16px;font-size:14px;gap:8px;border-radius:var(--sinch-shape-radius-s);--sinch-size-icon:16px}:host([small]:not([small=false]))>button::before{border-radius:var(--sinch-shape-radius-s)}:host([text]:not([text=""])[small]:not([small=false])) button{padding:8px 16px}</style><button><slot name="left-icon"></slot><span id="text"></span><slot name="right-icon"></slot></button>';
11
+ const templateHTML = '<style>:host{--sinch-button-color-background:var(--sinch-color-tropical-500);--sinch-button-color-background-hover:var(--sinch-color-tropical-400);--sinch-button-color-background-active:var(--sinch-color-tropical-600);--sinch-button-color-background-disabled:var(--sinch-color-tropical-100);--sinch-button-color-border:var(--sinch-color-transparent);--sinch-button-color-border-disabled:var(--sinch-color-transparent);--sinch-button-color-text:var(--sinch-color-snow-100);--sinch-button-color-text-disabled:var(--sinch-color-snow-100);--sinch-button-shape-radius:var(--sinch-shape-radius-l);display:inline-block;vertical-align:middle;outline:0}#button{--sinch-color-icon:var(--sinch-button-color-text);--sinch-color-spinner-bg:var(--sinch-color-tropical-300);--sinch-color-spinner-fg:var(--sinch-color-snow-100)}#button:disabled{--sinch-color-icon:var(--sinch-button-color-text-disabled);--sinch-color-spinner-bg:var(--sinch-color-snow-100);--sinch-color-spinner-fg:var(--sinch-color-tropical-200)}:host([small]:not([small=false])){--sinch-button-shape-radius:var(--sinch-shape-radius-m)}:host([type=secondary]){--sinch-button-color-background:var(--sinch-color-snow-100);--sinch-button-color-background-hover:var(--sinch-color-tropical-100);--sinch-button-color-background-active:var(--sinch-color-tropical-100);--sinch-button-color-background-disabled:var(--sinch-color-snow-100);--sinch-button-color-border:var(--sinch-color-tropical-500);--sinch-button-color-border-disabled:var(--sinch-color-tropical-200);--sinch-button-color-text:var(--sinch-color-tropical-500);--sinch-button-color-text-disabled:var(--sinch-color-tropical-200)}:host([type=secondary])>#button{--sinch-color-spinner-bg:var(--sinch-color-tropical-500);--sinch-color-spinner-fg:var(--sinch-color-tropical-100)}:host([type=secondary]) #button:enabled:active,:host([type=secondary]) #button:enabled:hover{--sinch-color-spinner-fg:var(--sinch-color-tropical-200)}:host([type=secondary]) #button:disabled{--sinch-color-spinner-bg:var(--sinch-color-tropical-200)}:host([type=cta-primary]){--sinch-button-color-background:var(--sinch-color-honey-500);--sinch-button-color-background-hover:var(--sinch-color-honey-400);--sinch-button-color-background-active:var(--sinch-color-honey-600);--sinch-button-color-background-disabled:var(--sinch-color-honey-200);--sinch-button-color-text:var(--sinch-color-stormy-500);--sinch-button-color-text-disabled:var(--sinch-color-stormy-300)}:host([type=cta-primary])>#button{--sinch-color-spinner-bg:var(--sinch-color-honey-700);--sinch-color-spinner-fg:var(--sinch-color-stormy-500)}:host([type=cta-primary])>#button:disabled{--sinch-color-spinner-bg:var(--sinch-color-honey-100);--sinch-color-spinner-fg:var(--sinch-color-stormy-300)}:host([type=cta-secondary]){--sinch-button-color-background:transparent;--sinch-button-color-background-hover:var(--sinch-color-snow-500);--sinch-button-color-background-active:var(--sinch-color-snow-500);--sinch-button-color-background-disabled:transparent;--sinch-button-color-text:var(--sinch-color-stormy-500);--sinch-button-color-text-disabled:var(--sinch-color-stormy-100);--sinch-button-color-border:var(--sinch-color-stormy-500);--sinch-button-color-border-disabled:var(--sinch-color-stormy-100)}:host([type=cta-secondary])>#button{--sinch-color-spinner-bg:var(--sinch-color-snow-700);--sinch-color-spinner-fg:var(--sinch-color-stormy-500)}:host([type=cta-secondary])>#button:disabled{--sinch-color-spinner-bg:var(--sinch-color-snow-500);--sinch-color-spinner-fg:var(--sinch-color-stormy-100)}:host([type=cta-secondary])>#button::before{mix-blend-mode:multiply}:host([type=destructive]){--sinch-button-color-background:var(--sinch-color-snow-100);--sinch-button-color-background-hover:var(--sinch-color-raspberry-100);--sinch-button-color-background-active:var(--sinch-color-raspberry-100);--sinch-button-color-background-disabled:var(--sinch-color-snow-100);--sinch-button-color-text:var(--sinch-color-raspberry-500);--sinch-button-color-text-disabled:var(--sinch-color-raspberry-200);--sinch-button-color-border:var(--sinch-color-raspberry-500);--sinch-button-color-border-disabled:var(--sinch-color-raspberry-200)}:host([type=destructive])>#button{--sinch-color-spinner-bg:var(--sinch-color-raspberry-100);--sinch-color-spinner-fg:var(--sinch-color-raspberry-500)}:host([type=destructive])>#button:enabled:active,:host([type=destructive])>#button:enabled:hover{--sinch-color-spinner-bg:var(--sinch-color-raspberry-200);--sinch-color-spinner-fg:var(--sinch-color-raspberry-500)}:host([type=destructive])>#button:disabled{--sinch-color-spinner-bg:var(--sinch-color-raspberry-100);--sinch-color-spinner-fg:var(--sinch-color-raspberry-200)}#button{all:initial;display:block;position:relative;width:100%;height:48px;font:var(--sinch-font-title-s);color:var(--sinch-button-color-text);cursor:pointer;--sinch-size-icon:24px}#button::before{content:"";position:absolute;left:0;top:0;bottom:0;right:0;border:1px solid var(--sinch-button-color-border);border-radius:var(--sinch-button-shape-radius);background-color:var(--sinch-button-color-background);box-shadow:var(--sinch-elevation-level-1);pointer-events:none}#button:focus-visible::after{position:absolute;content:"";left:-4px;top:-4px;right:-4px;bottom:-4px;border:2px solid var(--sinch-color-aqua-400);border-radius:calc(var(--sinch-button-shape-radius) + 4px);pointer-events:none}@supports not selector(:focus-visible){#button:focus::after{position:absolute;content:"";left:-4px;top:-4px;right:-4px;bottom:-4px;border:2px solid var(--sinch-color-aqua-400);border-radius:calc(var(--sinch-button-shape-radius) + 4px);pointer-events:none}}#button:enabled:hover::before{background-color:var(--sinch-button-color-background-hover)}#button:enabled:active::before{background-color:var(--sinch-button-color-background-active);border-width:2px;box-shadow:var(--sinch-elevation-level-0)}#button:disabled{color:var(--sinch-button-color-text-disabled);cursor:initial}#button:disabled::before{background-color:var(--sinch-button-color-background-disabled);border-color:var(--sinch-button-color-border-disabled)}:host([type=cta-primary])>#button::before,:host([type=primary])>#button::before{border-width:0}#content{position:relative;display:flex;align-items:center;justify-content:center;gap:12px;width:100%;height:100%;padding:0 16px;box-sizing:border-box;pointer-events:none}:host([small]:not([small=false]))>#button{font:var(--sinch-font-title-xs);height:32px;--sinch-size-icon:16px}:host([small]:not([small=false])) #content{padding:0 12px;gap:8px}#text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex-shrink:1;min-width:0}</style><button id="button"><div id="content"><slot name="left-icon"></slot><span id="text"></span><slot name="right-icon"></slot></div></button>';
12
12
  import { buttonTypes } from './utils';
13
13
  const template = document.createElement('template');
14
14
  template.innerHTML = templateHTML;
@@ -71,7 +71,7 @@ defineCustomElement('sinch-button', (_$button = new WeakMap(), _$text = new Weak
71
71
  const shadowRoot = this.attachShadow();
72
72
  shadowRoot.appendChild(template.content.cloneNode(true));
73
73
 
74
- _classPrivateFieldSet(this, _$button, shadowRoot.querySelector('button'));
74
+ _classPrivateFieldSet(this, _$button, shadowRoot.querySelector('#button'));
75
75
 
76
76
  _classPrivateFieldSet(this, _$text, shadowRoot.querySelector('#text'));
77
77
  }
@@ -1,9 +1,13 @@
1
1
  import type { TSinchElementReact } from '../types';
2
2
  export declare type TSinchHorizontalStepperElement = HTMLElement & {
3
+ /** Current item index, starting from 1 */
3
4
  index: string;
5
+ /** Current item index, starting from 1 */
4
6
  setAttribute(name: 'index', value: string): void;
5
7
  };
6
8
  export declare type TSinchHorizontalStepperReact = TSinchElementReact<TSinchHorizontalStepperElement> & {
9
+ /** Current item index, starting from 1 */
7
10
  index: string;
11
+ /** Label that is used for a11y */
8
12
  'aria-label': string;
9
13
  };
@@ -1,15 +1,24 @@
1
1
  import type { TSinchElementReact } from '../types';
2
2
  export declare type TSinchHorizontalStepperStatusType = 'error' | 'skip';
3
3
  export declare type TSinchHorizontalStepperItemElement = HTMLElement & {
4
+ /** Label */
4
5
  label: string;
6
+ /** Description */
5
7
  description: string | null;
8
+ /** Status */
6
9
  status: TSinchHorizontalStepperStatusType | null;
10
+ /** Label */
7
11
  setAttribute(name: 'label', value: string): void;
12
+ /** Description */
8
13
  setAttribute(name: 'description', value: string): void;
14
+ /** Status */
9
15
  setAttribute(name: 'status', value: TSinchHorizontalStepperStatusType): void;
10
16
  };
11
17
  export declare type TSinchHorizontalStepperItemReact = TSinchElementReact<TSinchHorizontalStepperItemElement> & {
18
+ /** Label */
12
19
  label: string;
20
+ /** Description */
13
21
  description?: string;
22
+ /** Status */
14
23
  status?: TSinchHorizontalStepperStatusType;
15
24
  };
@@ -7,8 +7,8 @@ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedec
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, getBooleanAttribute, getReactEventHandler, isAttrTrue, NectaryElement, updateBooleanAttribute } from '../utils';
11
- const templateHTML = '<style>:host{display:inline-block;vertical-align:middle;outline:0}button{all:initial;position:relative;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:48px;height:48px;border-radius:var(--sinch-shape-radius-s);border:1px solid transparent;background-color:transparent;cursor:pointer;--sinch-size-icon:24px;--sinch-color-icon:var(--sinch-icon-button-color, var(--sinch-color-stormy-500))}button:focus-visible::before{position:absolute;content:"";left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;padding:2px;border:1px solid var(--sinch-color-aqua-400);border-radius:calc(var(--sinch-shape-radius-s) + 2px)}@supports not selector(:focus-visible){button:focus::before{position:absolute;content:"";left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;padding:2px;border:1px solid var(--sinch-color-aqua-400);border-radius:calc(var(--sinch-shape-radius-s) + 2px)}}button:hover{background-color:var(--sinch-color-snow-500)}button:active{background-color:var(--sinch-color-snow-600)}button:disabled{background-color:transparent;cursor:initial;--sinch-color-spinner-bg:var(--sinch-color-snow-200);--sinch-color-spinner-fg:var(--sinch-color-stormy-200);--sinch-color-icon:var(--sinch-color-stormy-100)}:host([small]:not([small=false]))>button{width:32px;height:32px}button>*{pointer-events:none}</style><button><slot name="icon"></slot></button>';
10
+ import { defineCustomElement, getBooleanAttribute, getReactEventHandler, isAttrTrue, NectaryElement, updateAttribute, updateBooleanAttribute } from '../utils';
11
+ const templateHTML = '<style>:host{display:inline-block;vertical-align:middle;outline:0}button{all:initial;position:relative;display:flex;align-items:center;justify-content:center;width:48px;height:48px;cursor:pointer;contain:size;--sinch-size-icon:24px;--sinch-color-icon:var(--sinch-icon-button-color, var(--sinch-color-stormy-500));--sinch-icon-button-shape-radius:var(--sinch-shape-radius-l)}button::before{content:"";position:absolute;left:0;top:0;width:100%;height:100%;border-radius:var(--sinch-icon-button-shape-radius);pointer-events:none;box-sizing:border-box;border:1px solid transparent;background-color:transparent;mix-blend-mode:multiply}button:focus-visible::after{position:absolute;content:"";left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;padding:2px;border:2px solid var(--sinch-color-aqua-400);border-radius:calc(var(--sinch-icon-button-shape-radius) + 4px);pointer-events:none}@supports not selector(:focus-visible){button:focus::after{position:absolute;content:"";left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;padding:2px;border:2px solid var(--sinch-color-aqua-400);border-radius:calc(var(--sinch-icon-button-shape-radius) + 4px);pointer-events:none}}button:enabled:hover::before{background-color:var(--sinch-color-snow-500)}button:enabled:active::before{background-color:var(--sinch-color-snow-600)}button:disabled{background-color:transparent;cursor:initial;--sinch-color-spinner-bg:var(--sinch-color-snow-200);--sinch-color-spinner-fg:var(--sinch-color-stormy-200);--sinch-color-icon:var(--sinch-color-stormy-100)}:host([small]:not([small=false]))>button{width:32px;height:32px;--sinch-icon-button-shape-radius:var(--sinch-shape-radius-m)}button>*{pointer-events:none}</style><button><slot name="icon"></slot></button>';
12
12
  const template = document.createElement('template');
13
13
  template.innerHTML = templateHTML;
14
14
  defineCustomElement('sinch-icon-button', (_$button = new WeakMap(), _onButtonClick = new WeakMap(), _onButtonFocus = new WeakMap(), _onButtonBlur = new WeakMap(), _onFocusReactHandler = new WeakMap(), _onBlurReactHandler = new WeakMap(), _onClickReactHandler = new WeakMap(), class extends NectaryElement {
@@ -95,7 +95,7 @@ defineCustomElement('sinch-icon-button', (_$button = new WeakMap(), _onButtonCli
95
95
  }
96
96
 
97
97
  static get observedAttributes() {
98
- return ['disabled'];
98
+ return ['disabled', 'aria-label'];
99
99
  }
100
100
 
101
101
  attributeChangedCallback(name, _, newVal) {
@@ -107,6 +107,12 @@ defineCustomElement('sinch-icon-button', (_$button = new WeakMap(), _onButtonCli
107
107
  updateBooleanAttribute(this, 'disabled', isDisabled);
108
108
  break;
109
109
  }
110
+
111
+ case 'aria-label':
112
+ {
113
+ updateAttribute(this, 'title', newVal);
114
+ break;
115
+ }
110
116
  }
111
117
  }
112
118
 
@@ -0,0 +1,17 @@
1
+ import '../icons/report-problem';
2
+ import '../icons/report';
3
+ import '../icons/check-circle';
4
+ import '../icons/info';
5
+ import '../title';
6
+ import '../text';
7
+ import type { TSinchInlineAlertElement, TSinchInlineAlertReact } from './types';
8
+ declare global {
9
+ namespace JSX {
10
+ interface IntrinsicElements {
11
+ 'sinch-inline-alert': TSinchInlineAlertReact;
12
+ }
13
+ }
14
+ interface HTMLElementTagNameMap {
15
+ 'sinch-inline-alert': TSinchInlineAlertElement;
16
+ }
17
+ }
@@ -0,0 +1,154 @@
1
+ import _classPrivateFieldGet from '@babel/runtime/helpers/classPrivateFieldGet';
2
+ import _classPrivateFieldSet from '@babel/runtime/helpers/classPrivateFieldSet';
3
+
4
+ var _$text, _$caption, _$closeWrapper, _$closeSlot, _$actionWrapper, _$actionSlot, _onCloseSlotChange, _onActionSlotChange;
5
+
6
+ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
7
+
8
+ function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
9
+
10
+ import '../icons/report-problem';
11
+ import '../icons/report';
12
+ import '../icons/check-circle';
13
+ import '../icons/info';
14
+ import '../title';
15
+ import '../text';
16
+ import { defineCustomElement, getAttribute, getLiteralAttribute, updateAttribute, updateLiteralAttribute, NectaryElement, setClass } from '../utils';
17
+ const templateHTML = '<style>#wrapper{display:flex;flex-direction:row;align-items:flex-start;padding:16px;border-radius:var(--sinch-shape-radius-l);background-color:var(--sinch-color-alert-info-background);box-sizing:border-box;width:100%}#body-wrapper{display:flex;flex-direction:column;align-items:flex-start;margin-left:8px;min-width:0;flex:1}#caption{color:var(--sinch-color-stormy-500)}#text{color:var(--sinch-color-stormy-500);margin-top:4px}#icon-error,#icon-info,#icon-success,#icon-warn{display:none}:host([type=success]) #wrapper{background-color:var(--sinch-color-success-200)}:host([type=warn]) #wrapper{background-color:var(--sinch-color-warning-200)}:host([type=error]) #wrapper{background-color:var(--sinch-color-error-200)}:host([type=info]) #wrapper{background-color:var(--sinch-color-informative-200)}:host([type=success]) #icon-success{display:block;--sinch-color-icon:var(--sinch-color-success-500)}:host([type=warn]) #icon-warn{display:block;--sinch-color-icon:var(--sinch-color-warning-500)}:host([type=error]) #icon-error{display:block;--sinch-color-icon:var(--sinch-color-error-500)}:host([type=info]) #icon-info{display:block;--sinch-color-icon:var(--sinch-color-informative-500)}#action{display:flex;margin-top:16px;min-width:0}#action.empty{display:none}#close{margin-left:16px}#close.empty{display:none}</style><div id="wrapper"><sinch-icon-info id="icon-info"></sinch-icon-info><sinch-icon-check-circle id="icon-success"></sinch-icon-check-circle><sinch-icon-report-problem id="icon-warn"></sinch-icon-report-problem><sinch-icon-report id="icon-error"></sinch-icon-report><div id="body-wrapper"><sinch-title id="caption" level="3" type="s"></sinch-title><sinch-text id="text" type="m"></sinch-text><div id="action"><slot name="action"></slot></div></div><div id="close"><slot name="close"></slot></div></div>';
18
+ import { assertType, typeValues } from './utils';
19
+ const template = document.createElement('template');
20
+ template.innerHTML = templateHTML;
21
+ defineCustomElement('sinch-inline-alert', (_$text = new WeakMap(), _$caption = new WeakMap(), _$closeWrapper = new WeakMap(), _$closeSlot = new WeakMap(), _$actionWrapper = new WeakMap(), _$actionSlot = new WeakMap(), _onCloseSlotChange = new WeakMap(), _onActionSlotChange = new WeakMap(), class extends NectaryElement {
22
+ constructor() {
23
+ super();
24
+
25
+ _classPrivateFieldInitSpec(this, _$text, {
26
+ writable: true,
27
+ value: void 0
28
+ });
29
+
30
+ _classPrivateFieldInitSpec(this, _$caption, {
31
+ writable: true,
32
+ value: void 0
33
+ });
34
+
35
+ _classPrivateFieldInitSpec(this, _$closeWrapper, {
36
+ writable: true,
37
+ value: void 0
38
+ });
39
+
40
+ _classPrivateFieldInitSpec(this, _$closeSlot, {
41
+ writable: true,
42
+ value: void 0
43
+ });
44
+
45
+ _classPrivateFieldInitSpec(this, _$actionWrapper, {
46
+ writable: true,
47
+ value: void 0
48
+ });
49
+
50
+ _classPrivateFieldInitSpec(this, _$actionSlot, {
51
+ writable: true,
52
+ value: void 0
53
+ });
54
+
55
+ _classPrivateFieldInitSpec(this, _onCloseSlotChange, {
56
+ writable: true,
57
+ value: () => {
58
+ setClass(_classPrivateFieldGet(this, _$closeWrapper), 'empty', _classPrivateFieldGet(this, _$closeSlot).assignedElements().length === 0);
59
+ }
60
+ });
61
+
62
+ _classPrivateFieldInitSpec(this, _onActionSlotChange, {
63
+ writable: true,
64
+ value: () => {
65
+ setClass(_classPrivateFieldGet(this, _$actionWrapper), 'empty', _classPrivateFieldGet(this, _$actionSlot).assignedElements().length === 0);
66
+ }
67
+ });
68
+
69
+ const shadowRoot = this.attachShadow();
70
+ shadowRoot.appendChild(template.content.cloneNode(true));
71
+
72
+ _classPrivateFieldSet(this, _$text, shadowRoot.querySelector('#text'));
73
+
74
+ _classPrivateFieldSet(this, _$caption, shadowRoot.querySelector('#caption'));
75
+
76
+ _classPrivateFieldSet(this, _$closeWrapper, shadowRoot.querySelector('#close'));
77
+
78
+ _classPrivateFieldSet(this, _$closeSlot, shadowRoot.querySelector('slot[name="close"]'));
79
+
80
+ _classPrivateFieldSet(this, _$actionWrapper, shadowRoot.querySelector('#action'));
81
+
82
+ _classPrivateFieldSet(this, _$actionSlot, shadowRoot.querySelector('slot[name="action"]'));
83
+ }
84
+
85
+ connectedCallback() {
86
+ this.setAttribute('aria-atomic', 'true');
87
+ this.setAttribute('aria-live', 'polite');
88
+
89
+ _classPrivateFieldGet(this, _$closeSlot).addEventListener('slotchange', _classPrivateFieldGet(this, _onCloseSlotChange));
90
+
91
+ _classPrivateFieldGet(this, _$actionSlot).addEventListener('slotchange', _classPrivateFieldGet(this, _onActionSlotChange));
92
+
93
+ _classPrivateFieldGet(this, _onCloseSlotChange).call(this);
94
+
95
+ _classPrivateFieldGet(this, _onActionSlotChange).call(this);
96
+ }
97
+
98
+ disconnectedCallback() {
99
+ _classPrivateFieldGet(this, _$closeSlot).removeEventListener('slotchange', _classPrivateFieldGet(this, _onCloseSlotChange));
100
+
101
+ _classPrivateFieldGet(this, _$actionSlot).removeEventListener('slotchange', _classPrivateFieldGet(this, _onActionSlotChange));
102
+ }
103
+
104
+ get type() {
105
+ return getLiteralAttribute(this, typeValues, 'type');
106
+ }
107
+
108
+ set type(value) {
109
+ updateLiteralAttribute(this, typeValues, 'type', value);
110
+ }
111
+
112
+ get text() {
113
+ return getAttribute(this, 'text', '');
114
+ }
115
+
116
+ set text(value) {
117
+ updateAttribute(this, 'text', value);
118
+ }
119
+
120
+ get caption() {
121
+ return getAttribute(this, 'caption', '');
122
+ }
123
+
124
+ set caption(value) {
125
+ updateAttribute(this, 'caption', value);
126
+ }
127
+
128
+ static get observedAttributes() {
129
+ return ['text', 'caption', 'type'];
130
+ }
131
+
132
+ attributeChangedCallback(name, _, newVal) {
133
+ switch (name) {
134
+ case 'type':
135
+ {
136
+ assertType(newVal);
137
+ break;
138
+ }
139
+
140
+ case 'text':
141
+ {
142
+ _classPrivateFieldGet(this, _$text).textContent = newVal;
143
+ break;
144
+ }
145
+
146
+ case 'caption':
147
+ {
148
+ updateAttribute(_classPrivateFieldGet(this, _$caption), 'text', newVal);
149
+ break;
150
+ }
151
+ }
152
+ }
153
+
154
+ }));
@@ -0,0 +1,15 @@
1
+ import type { TSinchElementReact } from '../types';
2
+ export declare type TSinchInlineAlertType = 'info' | 'success' | 'warn' | 'error';
3
+ export declare type TSinchInlineAlertElement = HTMLElement & {
4
+ type: TSinchInlineAlertType;
5
+ text: string;
6
+ caption: string;
7
+ setAttribute(name: 'type', value: TSinchInlineAlertType): void;
8
+ setAttribute(name: 'text', value: string): void;
9
+ setAttribute(name: 'caption', value: string): void;
10
+ };
11
+ export declare type TSinchInlineAlertReact = TSinchElementReact<TSinchInlineAlertElement> & {
12
+ type: TSinchInlineAlertType;
13
+ text: string;
14
+ caption: string;
15
+ };
@@ -0,0 +1,5 @@
1
+ import type { TSinchInlineAlertType } from './types';
2
+ export declare const typeValues: readonly TSinchInlineAlertType[];
3
+ declare type TAssertType = (value: string | null) => asserts value is TSinchInlineAlertType;
4
+ export declare const assertType: TAssertType;
5
+ export {};
@@ -0,0 +1,6 @@
1
+ export const typeValues = ['info', 'success', 'warn', 'error'];
2
+ export const assertType = value => {
3
+ if (value === null || !typeValues.includes(value)) {
4
+ throw new Error(`sinch-inline-alert: invalid type attribute: ${value}`);
5
+ }
6
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nectary/components",
3
- "version": "0.35.0",
3
+ "version": "0.36.1",
4
4
  "files": [
5
5
  "theme.css",
6
6
  "**/*/*.js",