@nectary/components 0.44.0 → 0.45.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 (111) hide show
  1. package/accordion-item/index.js +1 -1
  2. package/action-menu/index.js +3 -11
  3. package/alert/index.js +3 -1
  4. package/avatar/index.js +12 -13
  5. package/avatar/types.d.ts +4 -4
  6. package/avatar/utils.d.ts +1 -4
  7. package/avatar/utils.js +4 -7
  8. package/badge/index.js +9 -7
  9. package/badge/types.d.ts +4 -4
  10. package/badge/utils.d.ts +1 -4
  11. package/badge/utils.js +0 -6
  12. package/button/index.js +88 -23
  13. package/button/types.d.ts +12 -11
  14. package/button/utils.d.ts +4 -1
  15. package/button/utils.js +9 -1
  16. package/card-container/index.js +1 -1
  17. package/chat-block/index.js +1 -1
  18. package/chat-bubble/index.js +1 -1
  19. package/checkbox/index.js +4 -2
  20. package/chip/index.js +7 -6
  21. package/color-menu/index.js +9 -18
  22. package/color-swatch/index.js +5 -7
  23. package/date-picker/index.js +1 -1
  24. package/dialog/index.js +4 -7
  25. package/emoji/index.js +2 -6
  26. package/emoji-picker/data.json +1 -0
  27. package/emoji-picker/index.js +6 -14
  28. package/field/index.js +1 -1
  29. package/file-status/index.js +4 -2
  30. package/flag/index.d.ts +11 -0
  31. package/flag/index.js +43 -0
  32. package/flag/types.d.ts +11 -0
  33. package/flag/types.js +1 -0
  34. package/flag/utils.d.ts +1 -0
  35. package/flag/utils.js +19 -0
  36. package/icon/index.js +1 -1
  37. package/icon-button/index.js +77 -9
  38. package/icon-button/types.d.ts +14 -6
  39. package/icon-button/utils.d.ts +5 -0
  40. package/icon-button/utils.js +9 -0
  41. package/icons/create-icon-class.js +1 -1
  42. package/inline-alert/index.js +3 -1
  43. package/input/index.d.ts +3 -0
  44. package/input/index.js +148 -71
  45. package/input/types.d.ts +7 -0
  46. package/link/index.js +1 -1
  47. package/package.json +4 -6
  48. package/pagination/index.js +1 -1
  49. package/pop/index.js +15 -37
  50. package/popover/index.js +7 -9
  51. package/radio-option/index.js +1 -1
  52. package/segment/index.js +10 -6
  53. package/segment/types.d.ts +4 -4
  54. package/segment/utils.d.ts +3 -5
  55. package/segment/utils.js +14 -4
  56. package/segment-collapse/index.js +1 -1
  57. package/segmented-control-option/index.js +1 -1
  58. package/segmented-icon-control-option/index.js +1 -1
  59. package/select-button/index.js +93 -28
  60. package/select-button/types.d.ts +8 -1
  61. package/select-menu/index.d.ts +5 -0
  62. package/select-menu/index.js +46 -17
  63. package/select-menu-option/index.d.ts +1 -0
  64. package/select-menu-option/index.js +3 -0
  65. package/select-menu-option/types.d.ts +1 -0
  66. package/spinner/index.js +52 -7
  67. package/spinner/types.d.ts +4 -5
  68. package/stop-events/index.js +9 -5
  69. package/table/index.js +1 -1
  70. package/tag/index.js +2 -6
  71. package/text/index.js +3 -1
  72. package/textarea/index.js +1 -1
  73. package/theme/button.css +146 -0
  74. package/{theme.css → theme/contextual.css} +3 -25
  75. package/theme/elevation.css +1 -1
  76. package/theme/flag.css +4 -0
  77. package/theme/fonts.css +0 -33
  78. package/theme/fonts.json +0 -33
  79. package/theme/icon-button.css +68 -0
  80. package/theme/index.css +4 -0
  81. package/theme/index.d.ts +21 -0
  82. package/theme/index.js +21 -0
  83. package/theme/input.css +7 -0
  84. package/theme/select-button.css +7 -0
  85. package/theme/shapes.css +4 -3
  86. package/theme/size.css +9 -0
  87. package/theme/spinner.css +7 -0
  88. package/theme/typography.css +7 -7
  89. package/tile-control-option/index.js +1 -1
  90. package/time-picker/index.js +1 -1
  91. package/title/index.js +7 -3
  92. package/toast/index.js +3 -1
  93. package/toggle/index.js +1 -1
  94. package/tooltip/index.js +8 -6
  95. package/utils/context.d.ts +14 -9
  96. package/utils/context.js +60 -26
  97. package/utils/countries.d.ts +5 -0
  98. package/utils/countries.js +2 -0
  99. package/utils/countries.json +998 -0
  100. package/utils/debounce.d.ts +4 -0
  101. package/utils/debounce.js +21 -0
  102. package/utils/element.d.ts +4 -0
  103. package/utils/element.js +10 -0
  104. package/utils/index.d.ts +1 -0
  105. package/utils/index.js +1 -0
  106. package/utils/size.d.ts +10 -0
  107. package/utils/size.js +19 -0
  108. package/utils/throttle.d.ts +2 -2
  109. package/utils/throttle.js +4 -9
  110. package/spinner/utils.d.ts +0 -2
  111. package/spinner/utils.js +0 -1
package/tooltip/index.js CHANGED
@@ -21,7 +21,6 @@ defineCustomElement('sinch-tooltip', class extends NectaryElement {
21
21
  #tooltipState;
22
22
  #animation = null;
23
23
  #shouldReduceMotion = false;
24
- #isConnected = false;
25
24
  #isSubscribed = false;
26
25
  constructor() {
27
26
  super();
@@ -44,7 +43,7 @@ defineCustomElement('sinch-tooltip', class extends NectaryElement {
44
43
  });
45
44
  }
46
45
  connectedCallback() {
47
- this.#isConnected = true;
46
+ super.connectedCallback();
48
47
  this.#controller = new AbortController();
49
48
  const options = {
50
49
  signal: this.#controller.signal
@@ -54,6 +53,7 @@ defineCustomElement('sinch-tooltip', class extends NectaryElement {
54
53
  this.#updateText();
55
54
  }
56
55
  disconnectedCallback() {
56
+ super.disconnectedCallback();
57
57
  this.#controller.abort();
58
58
  this.#tooltipState.destroy();
59
59
  }
@@ -93,8 +93,10 @@ defineCustomElement('sinch-tooltip', class extends NectaryElement {
93
93
  }
94
94
  case 'orientation':
95
95
  {
96
- assertOrientation(newVal);
97
- updateAttribute(this.#$pop, 'orientation', getPopOrientation(newVal));
96
+ if ('production' !== 'production') {
97
+ assertOrientation(newVal);
98
+ }
99
+ updateAttribute(this.#$pop, 'orientation', getPopOrientation(this.orientation));
98
100
  if (this.#isOpen()) {
99
101
  this.#resetTipOrientation();
100
102
  this.#updateTipOrientation();
@@ -178,7 +180,7 @@ defineCustomElement('sinch-tooltip', class extends NectaryElement {
178
180
  setClass(this.#$tip, 'hidden', rectOverlap(targetRect, contentRect));
179
181
  };
180
182
  #updateText() {
181
- if (!this.#isConnected) {
183
+ if (!this.isConnected) {
182
184
  return;
183
185
  }
184
186
  const value = this.text;
@@ -194,7 +196,7 @@ defineCustomElement('sinch-tooltip', class extends NectaryElement {
194
196
  this.#subscribeMouseEnterEvent();
195
197
  }
196
198
  #subscribeMouseEnterEvent() {
197
- if (!this.#isConnected || this.#isSubscribed) {
199
+ if (!this.isConnected || this.#isSubscribed) {
198
200
  return;
199
201
  }
200
202
  this.#$target.addEventListener('mouseenter', this.#onMouseEnter, {
@@ -1,15 +1,20 @@
1
- export declare type TContextName = 'visibility' | 'keydown';
2
- export declare type TContextKeyboard = {
1
+ export declare type TContextName = 'visibility' | 'keydown' | 'size';
2
+ export declare type TContextKeydown = {
3
3
  code: string;
4
4
  preventDefault: () => void;
5
5
  };
6
6
  export declare type TContextVisibility = boolean;
7
- export declare class Context {
7
+ export declare type TContextSize = string;
8
+ declare type TContextDataType = {
9
+ visibility: TContextVisibility;
10
+ keydown: TContextKeydown;
11
+ size: TContextSize;
12
+ };
13
+ export declare class Context<T extends TContextName> {
8
14
  #private;
9
- constructor($element: Element, name: TContextName);
10
- get elements(): Iterable<Element>;
11
- subscribe(): void;
12
- unsubscribe(): void;
15
+ constructor($element: Element, name: T);
16
+ listen(signal: AbortSignal): void;
17
+ dispatch(contextValue: TContextDataType[T]): void;
13
18
  }
14
- export declare const dispatchContextConnectEvent: (el: Element, name: TContextName) => void;
15
- export declare const dispatchContextDisconnectEvent: (el: Element, name: TContextName) => void;
19
+ export declare const subscribeContext: <T extends TContextName>($el: Element, name: T, cb: (e: CustomEvent<TContextDataType[T]>) => void, signal: AbortSignal) => void;
20
+ export {};
package/utils/context.js CHANGED
@@ -1,51 +1,85 @@
1
+ const contextNameToEventMap = {
2
+ keydown: '-keydown',
3
+ visibility: '-visibility',
4
+ size: '-size'
5
+ };
6
+ const shouldPersistContextValue = {
7
+ keydown: false,
8
+ visibility: true,
9
+ size: true
10
+ };
1
11
  export class Context {
2
12
  #$root;
3
13
  #listeners = new Set();
4
14
  #name;
5
- #isSubscribed = false;
15
+ #isListening = false;
16
+ #lastContextValue = null;
6
17
  constructor($element, name) {
7
18
  this.#$root = $element;
8
19
  this.#name = name;
9
20
  }
10
- get elements() {
11
- return this.#listeners;
12
- }
13
- subscribe() {
14
- if (this.#isSubscribed) {
21
+ listen(signal) {
22
+ if (this.#isListening) {
15
23
  return;
16
24
  }
17
- this.#$root.addEventListener(`-context-connect-${this.#name}`, this.#onConnect);
18
- this.#$root.addEventListener(`-context-disconnect-${this.#name}`, this.#onDisconnect);
19
- this.#isSubscribed = true;
25
+ this.#$root.addEventListener(`-context-connect-${this.#name}`, this.#onListenerConnect, {
26
+ signal
27
+ });
28
+ this.#$root.addEventListener(`-context-disconnect-${this.#name}`, this.#onListenerDisconnect, {
29
+ signal
30
+ });
31
+ this.#isListening = true;
32
+ signal.addEventListener('abort', () => {
33
+ this.#listeners.clear();
34
+ this.#isListening = false;
35
+ this.#lastContextValue = null;
36
+ }, {
37
+ once: true
38
+ });
20
39
  }
21
- unsubscribe() {
22
- this.#listeners.clear();
23
- this.#$root.removeEventListener(`-context-connect-${this.#name}`, this.#onConnect);
24
- this.#$root.removeEventListener(`-context-disconnect-${this.#name}`, this.#onDisconnect);
25
- this.#isSubscribed = false;
40
+ dispatch(contextValue) {
41
+ for (const el of this.#listeners) {
42
+ el.dispatchEvent(new CustomEvent(contextNameToEventMap[this.#name], {
43
+ detail: contextValue
44
+ }));
45
+ }
46
+ if (shouldPersistContextValue[this.#name]) {
47
+ this.#lastContextValue = contextValue;
48
+ }
26
49
  }
27
- #onConnect = e => {
50
+ #onListenerConnect = e => {
28
51
  e.stopPropagation();
29
52
  this.#listeners.add(e.detail);
53
+ if (this.#lastContextValue !== null) {
54
+ e.detail.dispatchEvent(new CustomEvent(contextNameToEventMap[this.#name], {
55
+ detail: this.#lastContextValue
56
+ }));
57
+ }
30
58
  };
31
- #onDisconnect = e => {
59
+ #onListenerDisconnect = e => {
32
60
  e.stopPropagation();
33
61
  this.#listeners.delete(e.detail);
34
62
  };
35
63
  }
36
- export const dispatchContextConnectEvent = (el, name) => {
64
+ export const subscribeContext = ($el, name, cb, signal) => {
37
65
  requestAnimationFrame(() => {
38
- el.dispatchEvent(new CustomEvent(`-context-connect-${name}`, {
66
+ $el.dispatchEvent(new CustomEvent(`-context-connect-${name}`, {
39
67
  bubbles: true,
40
68
  composed: true,
41
- detail: el
69
+ detail: $el
42
70
  }));
43
71
  });
44
- };
45
- export const dispatchContextDisconnectEvent = (el, name) => {
46
- el.dispatchEvent(new CustomEvent(`-context-disconnect-${name}`, {
47
- bubbles: true,
48
- composed: true,
49
- detail: el
50
- }));
72
+
73
+ $el.addEventListener(contextNameToEventMap[name], cb, {
74
+ signal
75
+ });
76
+ signal.addEventListener('abort', () => {
77
+ $el.dispatchEvent(new CustomEvent(`-context-disconnect-${name}`, {
78
+ bubbles: true,
79
+ composed: true,
80
+ detail: $el
81
+ }));
82
+ }, {
83
+ once: true
84
+ });
51
85
  };
@@ -0,0 +1,5 @@
1
+ export declare type TSinchCountry = {
2
+ name: string;
3
+ phoneCode: string;
4
+ };
5
+ export declare const countries: Record<string, TSinchCountry>;
@@ -0,0 +1,2 @@
1
+ import countriesJson from './countries.json';
2
+ export const countries = countriesJson;