@nectary/components 0.40.0 → 0.41.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 (74) hide show
  1. package/accordion-item/index.js +4 -0
  2. package/action-menu/index.js +11 -13
  3. package/action-menu-option/index.js +2 -1
  4. package/button/index.js +5 -1
  5. package/button/types.d.ts +1 -1
  6. package/checkbox/index.js +4 -0
  7. package/chip/index.js +18 -15
  8. package/chip/types.d.ts +3 -4
  9. package/color-menu/index.d.ts +1 -0
  10. package/color-menu/index.js +37 -51
  11. package/color-menu/types.d.ts +5 -6
  12. package/color-menu/utils.d.ts +1 -0
  13. package/color-menu/utils.js +15 -0
  14. package/color-swatch/index.js +8 -7
  15. package/color-swatch/types.d.ts +3 -4
  16. package/colors.json +14 -10
  17. package/date-picker/index.js +1 -1
  18. package/field/index.js +22 -5
  19. package/file-drop/index.js +1 -1
  20. package/file-picker/index.js +1 -1
  21. package/help-tooltip/index.js +10 -27
  22. package/icon-button/index.d.ts +1 -0
  23. package/icon-button/index.js +26 -15
  24. package/icon-button/types.d.ts +16 -2
  25. package/input/index.js +4 -0
  26. package/link/index.js +5 -1
  27. package/package.json +1 -1
  28. package/pagination/index.js +4 -0
  29. package/pop/index.d.ts +11 -0
  30. package/pop/index.js +429 -0
  31. package/pop/types.d.ts +35 -0
  32. package/pop/utils.d.ts +7 -0
  33. package/pop/utils.js +18 -0
  34. package/popover/index.d.ts +1 -0
  35. package/popover/index.js +91 -230
  36. package/popover/types.d.ts +8 -1
  37. package/popover/utils.d.ts +5 -0
  38. package/popover/utils.js +17 -1
  39. package/radio-option/index.js +4 -0
  40. package/segment-collapse/index.js +4 -0
  41. package/segmented-control-option/index.js +5 -1
  42. package/segmented-icon-control-option/index.js +5 -1
  43. package/select-button/index.js +6 -1
  44. package/select-menu/index.js +12 -13
  45. package/tabs-option/index.js +4 -0
  46. package/tag/index.js +13 -15
  47. package/tag/types.d.ts +3 -4
  48. package/textarea/index.js +4 -0
  49. package/theme.css +76 -10
  50. package/tile-control-option/index.js +5 -1
  51. package/time-picker/index.js +1 -1
  52. package/toggle/index.js +5 -1
  53. package/tooltip/index.d.ts +2 -0
  54. package/tooltip/index.js +160 -17
  55. package/tooltip/types.d.ts +13 -0
  56. package/tooltip/utils.d.ts +5 -0
  57. package/tooltip/utils.js +25 -1
  58. package/types.d.ts +0 -7
  59. package/utils/animation.d.ts +17 -0
  60. package/utils/animation.js +142 -0
  61. package/utils/colors.d.ts +4 -9
  62. package/utils/colors.js +4 -120
  63. package/utils/context.d.ts +15 -0
  64. package/utils/context.js +57 -0
  65. package/utils/index.d.ts +5 -9
  66. package/utils/index.js +49 -50
  67. package/dropdown-checkbox-option/index.d.ts +0 -11
  68. package/dropdown-checkbox-option/index.js +0 -74
  69. package/dropdown-checkbox-option/types.d.ts +0 -15
  70. package/dropdown-radio-option/index.d.ts +0 -11
  71. package/dropdown-radio-option/index.js +0 -74
  72. package/dropdown-radio-option/types.d.ts +0 -15
  73. package/dropdown-radio-option/types.js +0 -1
  74. /package/{dropdown-checkbox-option → pop}/types.js +0 -0
@@ -110,6 +110,10 @@ defineCustomElement('sinch-accordion-item', class extends NectaryElement {
110
110
  }));
111
111
  };
112
112
 
113
+ get focusable() {
114
+ return true;
115
+ }
116
+
113
117
  focus() {
114
118
  this.#$button.focus();
115
119
  }
@@ -1,5 +1,6 @@
1
1
  import { isSinchActionMenuOption } from '../action-menu-option/utils';
2
2
  import { attrValueToPixels, defineCustomElement, getBooleanAttribute, getIntegerAttribute, NectaryElement, updateBooleanAttribute, updateIntegerAttribute } from '../utils';
3
+ import { dispatchContextConnectEvent, dispatchContextDisconnectEvent } from '../utils/context';
3
4
  const templateHTML = '<style>:host{display:block;outline:0}#listbox{overflow-y:auto}</style><div id="listbox" role="presentation"><slot></slot></div>';
4
5
  const ITEM_HEIGHT = 40;
5
6
  const template = document.createElement('template');
@@ -7,7 +8,7 @@ template.innerHTML = templateHTML;
7
8
  defineCustomElement('sinch-action-menu', class extends NectaryElement {
8
9
  #$optionSlot;
9
10
  #$listbox;
10
- #controller = new AbortController();
11
+ #controller = null;
11
12
 
12
13
  constructor() {
13
14
  super();
@@ -18,6 +19,7 @@ defineCustomElement('sinch-action-menu', class extends NectaryElement {
18
19
  }
19
20
 
20
21
  connectedCallback() {
22
+ this.#controller = new AbortController();
21
23
  const {
22
24
  signal
23
25
  } = this.#controller;
@@ -38,21 +40,13 @@ defineCustomElement('sinch-action-menu', class extends NectaryElement {
38
40
  this.#$listbox.addEventListener('click', this.#onListboxClick, {
39
41
  signal
40
42
  });
41
- this.dispatchEvent(new CustomEvent('-context-connect-keydown', {
42
- bubbles: true
43
- }));
44
- this.dispatchEvent(new CustomEvent('-context-connect-visibility', {
45
- bubbles: true
46
- }));
43
+ dispatchContextConnectEvent(this, 'keydown');
44
+ dispatchContextConnectEvent(this, 'visibility');
47
45
  }
48
46
 
49
47
  disconnectedCallback() {
50
- this.dispatchEvent(new CustomEvent('-context-disconnect-keydown', {
51
- bubbles: true
52
- }));
53
- this.dispatchEvent(new CustomEvent('-context-disconnect-visibility', {
54
- bubbles: true
55
- }));
48
+ dispatchContextDisconnectEvent(this, 'keydown');
49
+ dispatchContextDisconnectEvent(this, 'visibility');
56
50
  this.#controller.abort();
57
51
  }
58
52
 
@@ -248,4 +242,8 @@ defineCustomElement('sinch-action-menu', class extends NectaryElement {
248
242
  return null;
249
243
  }
250
244
 
245
+ get focusable() {
246
+ return true;
247
+ }
248
+
251
249
  });
@@ -6,7 +6,7 @@ template.innerHTML = templateHTML;
6
6
  defineCustomElement('sinch-action-menu-option', class ActionMenuOption extends NectaryElement {
7
7
  #$wrapper;
8
8
  #$content;
9
- #controller = new AbortController();
9
+ #controller = null;
10
10
 
11
11
  constructor() {
12
12
  super();
@@ -17,6 +17,7 @@ defineCustomElement('sinch-action-menu-option', class ActionMenuOption extends N
17
17
  }
18
18
 
19
19
  connectedCallback() {
20
+ this.#controller = new AbortController();
20
21
  const {
21
22
  signal
22
23
  } = this.#controller;
package/button/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { defineCustomElement, getBooleanAttribute, getAttribute, getLiteralAttribute, isAttrTrue, updateBooleanAttribute, updateAttribute, updateLiteralAttribute, NectaryElement, getReactEventHandler } from '../utils';
2
- 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:#F1F3F4;--sinch-button-color-background-active:#E3E6E8;--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>';
2
+ 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:#F1F3F4;--sinch-button-color-background-active:#E3E6E8;--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-border-focus);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-border-focus);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>';
3
3
  import { buttonTypes } from './utils';
4
4
  const template = document.createElement('template');
5
5
  template.innerHTML = templateHTML;
@@ -88,6 +88,10 @@ defineCustomElement('sinch-button', class extends NectaryElement {
88
88
  return getBooleanAttribute(this, 'small');
89
89
  }
90
90
 
91
+ get focusable() {
92
+ return true;
93
+ }
94
+
91
95
  focus() {
92
96
  this.#$button.focus();
93
97
  }
package/button/types.d.ts CHANGED
@@ -29,7 +29,7 @@ export declare type TSinchButtonReact = TSinchElementReact<TSinchButtonElement>
29
29
  type: TSinchButtonType;
30
30
  /** Text content */
31
31
  text: string;
32
- /** Label that is used for a11y – might be different from `label` */
32
+ /** Label that is used for a11y */
33
33
  'aria-label': string;
34
34
  /** Disabled */
35
35
  disabled?: boolean;
package/checkbox/index.js CHANGED
@@ -111,6 +111,10 @@ defineCustomElement('sinch-checkbox', class extends NectaryElement {
111
111
  }
112
112
  }
113
113
 
114
+ get focusable() {
115
+ return true;
116
+ }
117
+
114
118
  focus() {
115
119
  this.#$input.focus();
116
120
  }
package/chip/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import '../text';
2
2
  import '../icons/cancel';
3
- import { defineCustomElement, getBooleanAttribute, getAttribute, getLiteralAttribute, updateBooleanAttribute, updateAttribute, updateLiteralAttribute, NectaryElement, setClass, getReactEventHandler } from '../utils';
4
- import { assertColorNameValue, colorMap, colorNameValues, NO_COLOR } from '../utils/colors';
5
- const templateHTML = '<style>:host{display:inline-block;vertical-align:middle;outline:0}#button{all:initial;position:relative;display:flex;flex-direction:row;align-items:center;gap:4px;width:100%;height:24px;padding:0 5px 0 12px;border-radius:12px;color:var(--sinch-color-text-default);box-sizing:border-box;cursor:pointer;--sinch-color-icon:var(--sinch-color-stormy-500);--sinch-size-icon:16px}#button:focus-visible::after{content:"";position:absolute;inset:-4px;border-radius:16px;border:2px solid var(--sinch-color-border-focus);pointer-events:none}@supports not selector(:focus-visible){#button:focus::after{content:"";position:absolute;inset:-4px;border-radius:16px;border:2px solid var(--sinch-color-border-focus);pointer-events:none}:host([small]:not([small=false])) #button:focus::after{border-radius:14px}}#button.no-color{background-color:var(--sinch-color-snow-500)}#button.inverted{color:var(--sinch-color-text-inverted);--sinch-color-icon:var(--sinch-color-snow-100)}#text{flex:1}:host([small]:not([small=false])) #button{height:20px;border-radius:10px;padding:0 3px 0 8px}:host([small]:not([small=false])) #button:focus-visible::after{border-radius:14px}::slotted(*){margin-left:-4px}:host([small]:not([small=false])) ::slotted(*){margin-left:-2px}</style><button id="button"><slot name="icon"></slot><sinch-text id="text" type="xs" ellipsis></sinch-text><sinch-icon-cancel id="close"></sinch-icon-cancel></button>';
3
+ import { defineCustomElement, getBooleanAttribute, getAttribute, updateBooleanAttribute, updateAttribute, NectaryElement, getReactEventHandler } from '../utils';
4
+ import { NO_COLOR } from '../utils/colors';
5
+ const templateHTML = '<style>:host{display:inline-block;vertical-align:middle;outline:0}#button{all:initial;position:relative;display:flex;flex-direction:row;align-items:center;gap:4px;width:100%;height:24px;padding:0 5px 0 9px;border-radius:12px;background-color:var(--sinch-color-snow-500);color:var(--sinch-color-text-default);box-sizing:border-box;cursor:pointer;--sinch-color-icon:var(--sinch-color-stormy-500);--sinch-size-icon:16px}#button:focus-visible::after{content:"";position:absolute;inset:-4px;border-radius:16px;border:2px solid var(--sinch-color-border-focus);pointer-events:none}@supports not selector(:focus-visible){#button:focus::after{content:"";position:absolute;inset:-4px;border-radius:16px;border:2px solid var(--sinch-color-border-focus);pointer-events:none}:host([small]:not([small=false])) #button:focus::after{border-radius:14px}}#text{flex:1}:host([small]:not([small=false])) #button{height:20px;border-radius:10px;padding:0 3px 0 7px}:host([small]:not([small=false])) #button:focus-visible::after{border-radius:14px}::slotted(*){margin-left:-4px}</style><button id="button"><slot name="icon"></slot><sinch-text id="text" type="xs" ellipsis></sinch-text><sinch-icon-cancel id="close"></sinch-icon-cancel></button>';
6
6
  const template = document.createElement('template');
7
7
  template.innerHTML = templateHTML;
8
8
  defineCustomElement('sinch-chip', class extends NectaryElement {
9
9
  #$text;
10
10
  #$button;
11
- #controller = new AbortController();
11
+ #controller = null;
12
12
 
13
13
  constructor() {
14
14
  super();
@@ -19,6 +19,7 @@ defineCustomElement('sinch-chip', class extends NectaryElement {
19
19
  }
20
20
 
21
21
  connectedCallback() {
22
+ this.#controller = new AbortController();
22
23
  const {
23
24
  signal
24
25
  } = this.#controller;
@@ -49,11 +50,11 @@ defineCustomElement('sinch-chip', class extends NectaryElement {
49
50
  }
50
51
 
51
52
  get color() {
52
- return getLiteralAttribute(this, colorNameValues, 'color', null);
53
+ return getAttribute(this, 'color');
53
54
  }
54
55
 
55
56
  set color(value) {
56
- updateLiteralAttribute(this, colorNameValues, 'color', value);
57
+ updateAttribute(this, 'color', value);
57
58
  }
58
59
 
59
60
  get text() {
@@ -80,7 +81,6 @@ defineCustomElement('sinch-chip', class extends NectaryElement {
80
81
  switch (name) {
81
82
  case 'color':
82
83
  {
83
- assertColorNameValue(newVal);
84
84
  this.#updateColor();
85
85
  break;
86
86
  }
@@ -95,17 +95,20 @@ defineCustomElement('sinch-chip', class extends NectaryElement {
95
95
 
96
96
  #updateColor() {
97
97
  const colorName = this.color ?? NO_COLOR;
98
- const {
99
- value,
100
- isInverted
101
- } = colorMap[colorName];
102
98
 
103
- if (value !== NO_COLOR) {
104
- this.#$button.style.backgroundColor = `var(--sinch-color-${value})`;
99
+ if (colorName !== NO_COLOR) {
100
+ this.#$button.style.setProperty('background-color', `var(--sinch-color-map-${colorName}-bg)`);
101
+ this.#$button.style.setProperty('color', `var(--sinch-color-map-${colorName}-fg)`);
102
+ this.#$button.style.setProperty('--sinch-color-icon', `var(--sinch-color-map-${colorName}-fg)`);
103
+ } else {
104
+ this.#$button.style.removeProperty('background-color');
105
+ this.#$button.style.removeProperty('color');
106
+ this.#$button.style.removeProperty('--sinch-color-icon');
105
107
  }
108
+ }
106
109
 
107
- setClass(this.#$button, 'no-color', value === NO_COLOR);
108
- setClass(this.#$button, 'inverted', isInverted);
110
+ get focusable() {
111
+ return true;
109
112
  }
110
113
 
111
114
  focus() {
package/chip/types.d.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  import type { TSinchElementReact } from '../types';
2
- import type { TSinchColorName } from '../utils/colors';
3
2
  export declare type TSinchChipElement = HTMLElement & {
4
3
  /** Text */
5
4
  text: string;
6
5
  /** Color, gray by default */
7
- color: TSinchColorName | null;
6
+ color: string | null;
8
7
  /** Small */
9
8
  small: boolean;
10
9
  /** Click event */
@@ -16,7 +15,7 @@ export declare type TSinchChipElement = HTMLElement & {
16
15
  /** Text */
17
16
  setAttribute(name: 'text', value: string): void;
18
17
  /** Color, gray by default */
19
- setAttribute(name: 'color', value: TSinchColorName): void;
18
+ setAttribute(name: 'color', value: string): void;
20
19
  /** Small */
21
20
  setAttribute(name: 'small', value: ''): void;
22
21
  };
@@ -24,7 +23,7 @@ export declare type TSinchChipReact = TSinchElementReact<TSinchChipElement> & {
24
23
  /** Text */
25
24
  text: string;
26
25
  /** Color, gray by default */
27
- color?: TSinchColorName;
26
+ color?: string;
28
27
  /** Small */
29
28
  small?: boolean;
30
29
  /** Click event handler */
@@ -1,4 +1,5 @@
1
1
  import '../color-swatch';
2
+ import '../tooltip';
2
3
  import '../icons/check';
3
4
  import type { TSinchSelectMenuElement, TSinchSelectMenuReact } from './types';
4
5
  declare global {
@@ -1,9 +1,12 @@
1
1
  import '../color-swatch';
2
+ import '../tooltip';
2
3
  import '../icons/check';
3
- import { attrValueToPixels, defineCustomElement, getAttribute, getBooleanAttribute, getCsvSet, getIntegerAttribute, getLiteralAttribute, getReactEventHandler, getRect, NectaryElement, setClass, updateAttribute, updateBooleanAttribute, updateExplicitBooleanAttribute, updateIntegerAttribute, updateLiteralAttribute } from '../utils';
4
- import { assertColorNameValue, colorMap, colorNameValues, NO_COLOR } from '../utils/colors';
5
- const optionTemplateHTML = '<div class="option" role="option"><sinch-color-swatch></sinch-color-swatch></div>';
6
- const templateHTML = '<style>:host{display:block;outline:0}#listbox{display:flex;flex-direction:row;flex-wrap:wrap;padding:4px 10px;overflow-y:auto}#listbox:empty{display:none}#check{position:absolute;left:10px;top:16px;--sinch-color-icon:var(--sinch-color-stormy-500);--sinch-size-icon:24px}#check.inverted{--sinch-color-icon:var(--sinch-color-snow-100)}.option{position:relative;cursor:pointer;width:32px;height:32px;padding:12px 6px}.option::after{content:"";position:absolute;width:34px;height:34px;inset:9px 3px;border:2px solid transparent;border-radius:50%;pointer-events:none}.option[data-selected]:not([data-checked])::after{border-color:var(--sinch-color-aqua-400)}.option *{pointer-events:none}</style><sinch-icon-check id="check"></sinch-icon-check><div id="listbox" role="presentation"></div>';
4
+ import { attrValueToPixels, defineCustomElement, getAttribute, getBooleanAttribute, getCsvSet, getIntegerAttribute, getReactEventHandler, getRect, NectaryElement, updateAttribute, updateBooleanAttribute, updateExplicitBooleanAttribute, updateIntegerAttribute } from '../utils';
5
+ import { lightColorNames, darkColorNames, vibrantColorNames, NO_COLOR } from '../utils/colors';
6
+ import { dispatchContextConnectEvent, dispatchContextDisconnectEvent } from '../utils/context';
7
+ const optionTemplateHTML = '<div class="option" role="option"><sinch-tooltip inverted class="tooltip"><div class="swatch-wrapper"><sinch-color-swatch class="swatch"></sinch-color-swatch><sinch-icon-check class="check"></sinch-icon-check></div></sinch-tooltip></div>';
8
+ const templateHTML = '<style>:host{display:block;outline:0}#listbox{display:flex;flex-direction:row;flex-wrap:wrap;padding:4px 10px;overflow-y:auto}#listbox:empty{display:none}.option{padding:12px 6px;--sinch-color-icon:var(--sinch-color-stormy-500)}.swatch-wrapper{position:relative;cursor:pointer;width:32px;height:32px}.swatch-wrapper::after{content:"";position:absolute;width:34px;height:34px;inset:-3px;border:2px solid transparent;border-radius:50%;pointer-events:none}.option[data-selected]:not([data-checked]) .swatch-wrapper::after{border-color:var(--sinch-color-border-focus)}.check{display:none;position:absolute;left:4px;top:4px;pointer-events:none;--sinch-size-icon:24px}.option[data-checked] .check{display:block}</style><div id="listbox" role="presentation"></div>';
9
+ import { getParentOption } from './utils';
7
10
  const NUM_COLS_DEFAULT = 5;
8
11
  const ITEM_WIDTH = 44;
9
12
  const ITEM_HEIGHT = 56;
@@ -13,8 +16,7 @@ template.innerHTML = templateHTML;
13
16
  optionTemplate.innerHTML = optionTemplateHTML;
14
17
  defineCustomElement('sinch-color-menu', class extends NectaryElement {
15
18
  #$listbox;
16
- #$checkIcon;
17
- #controller = new AbortController();
19
+ #controller = null;
18
20
  #prevColorsValue = '';
19
21
  #isConnected = false;
20
22
 
@@ -23,10 +25,10 @@ defineCustomElement('sinch-color-menu', class extends NectaryElement {
23
25
  const shadowRoot = this.attachShadow();
24
26
  shadowRoot.appendChild(template.content.cloneNode(true));
25
27
  this.#$listbox = shadowRoot.querySelector('#listbox');
26
- this.#$checkIcon = shadowRoot.querySelector('#check');
27
28
  }
28
29
 
29
30
  connectedCallback() {
31
+ this.#controller = new AbortController();
30
32
  const {
31
33
  signal
32
34
  } = this.#controller;
@@ -50,25 +52,17 @@ defineCustomElement('sinch-color-menu', class extends NectaryElement {
50
52
  this.addEventListener('-visibility', this.#onContextVisibility, {
51
53
  signal
52
54
  });
53
- this.dispatchEvent(new CustomEvent('-context-connect-keydown', {
54
- bubbles: true
55
- }));
56
- this.dispatchEvent(new CustomEvent('-context-connect-visibility', {
57
- bubbles: true
58
- }));
55
+ dispatchContextConnectEvent(this, 'visibility');
56
+ dispatchContextConnectEvent(this, 'keydown');
59
57
  requestAnimationFrame(this.#onMount);
60
58
  }
61
59
 
62
60
  disconnectedCallback() {
63
61
  this.#isConnected = false;
64
62
  this.#prevColorsValue = null;
63
+ dispatchContextDisconnectEvent(this, 'visibility');
64
+ dispatchContextDisconnectEvent(this, 'keydown');
65
65
  this.#controller.abort();
66
- this.dispatchEvent(new CustomEvent('-context-disconnect-keydown', {
67
- bubbles: true
68
- }));
69
- this.dispatchEvent(new CustomEvent('-context-disconnect-visibility', {
70
- bubbles: true
71
- }));
72
66
  }
73
67
 
74
68
  static get observedAttributes() {
@@ -76,11 +70,11 @@ defineCustomElement('sinch-color-menu', class extends NectaryElement {
76
70
  }
77
71
 
78
72
  set value(value) {
79
- updateLiteralAttribute(this, colorNameValues, 'value', value);
73
+ updateAttribute(this, 'value', value);
80
74
  }
81
75
 
82
76
  get value() {
83
- return getLiteralAttribute(this, colorNameValues, 'value', NO_COLOR);
77
+ return getAttribute(this, 'value', NO_COLOR);
84
78
  }
85
79
 
86
80
  set colors(value) {
@@ -107,11 +101,11 @@ defineCustomElement('sinch-color-menu', class extends NectaryElement {
107
101
  return getIntegerAttribute(this, 'cols', null);
108
102
  }
109
103
 
110
- nthItemRect(index) {
111
- if (index < 0 || index >= colorNameValues.length) {
112
- return null;
113
- }
104
+ get focusable() {
105
+ return true;
106
+ }
114
107
 
108
+ nthItemRect(index) {
115
109
  const $item = this.#$listbox.children[index];
116
110
 
117
111
  if ($item != null) {
@@ -130,7 +124,6 @@ defineCustomElement('sinch-color-menu', class extends NectaryElement {
130
124
  case 'value':
131
125
  {
132
126
  if (this.#isConnected) {
133
- assertColorNameValue(newVal);
134
127
  this.#onValueChange();
135
128
  }
136
129
 
@@ -171,20 +164,22 @@ defineCustomElement('sinch-color-menu', class extends NectaryElement {
171
164
  }
172
165
 
173
166
  this.#prevColorsValue = colorsValue;
174
- const colorNames = colorsValue !== null ? getCsvSet(colorsValue) : colorNameValues;
167
+ const colorNames = getCsvSet(colorsValue ?? `${lightColorNames},${vibrantColorNames},${darkColorNames}`);
175
168
  const fragment = document.createDocumentFragment();
176
169
 
177
- for (const col of colorNames) {
178
- if (col === NO_COLOR) {
170
+ for (const color of colorNames) {
171
+ if (color === NO_COLOR) {
179
172
  continue;
180
173
  }
181
174
 
182
175
  const optFrag = optionTemplate.content.cloneNode(true);
183
- const $opt = optFrag.querySelector('.option');
184
- const $swatch = optFrag.querySelector('sinch-color-swatch');
185
- updateAttribute($opt, 'data-value', col);
186
- updateAttribute($opt, 'title', col);
187
- updateAttribute($swatch, 'name', col);
176
+ const $option = optFrag.querySelector('.option');
177
+ const $swatch = optFrag.querySelector('.swatch');
178
+ const $tooltip = optFrag.querySelector('.tooltip');
179
+ updateAttribute($option, 'data-value', color);
180
+ updateAttribute($tooltip, 'text', color);
181
+ updateAttribute($swatch, 'name', color);
182
+ $option.style.setProperty('--sinch-color-icon', `var(--sinch-color-map-${color}-fg)`);
188
183
  fragment.appendChild(optFrag);
189
184
  }
190
185
 
@@ -226,8 +221,9 @@ defineCustomElement('sinch-color-menu', class extends NectaryElement {
226
221
  return;
227
222
  }
228
223
 
229
- this.#dispatchChangeEvent($elem);
230
- this.#selectOption($elem);
224
+ const $option = getParentOption($elem);
225
+ this.#dispatchChangeEvent($option);
226
+ this.#selectOption($option);
231
227
  };
232
228
  #onContextVisibility = e => {
233
229
  if (e.detail) {
@@ -289,22 +285,10 @@ defineCustomElement('sinch-color-menu', class extends NectaryElement {
289
285
  }
290
286
 
291
287
  #onValueChange() {
292
- if (!this.hasAttribute('value')) {
293
- this.#$checkIcon.remove();
294
- return;
295
- }
296
-
297
288
  const value = this.value;
298
- this.#$checkIcon.remove();
299
289
 
300
290
  for (const $option of this.#getOptionElements()) {
301
291
  const isChecked = value === getAttribute($option, 'data-value', '');
302
-
303
- if (isChecked) {
304
- $option.appendChild(this.#$checkIcon);
305
- setClass(this.#$checkIcon, 'inverted', colorMap[value].isInverted);
306
- }
307
-
308
292
  updateBooleanAttribute($option, 'data-checked', isChecked);
309
293
  updateExplicitBooleanAttribute($option, 'aria-selected', isChecked);
310
294
  }
@@ -453,9 +437,11 @@ defineCustomElement('sinch-color-menu', class extends NectaryElement {
453
437
  return;
454
438
  }
455
439
 
456
- this.dispatchEvent(new CustomEvent('-change', {
457
- detail: getAttribute($opt, 'data-value')
458
- }));
440
+ if ($opt !== null) {
441
+ this.dispatchEvent(new CustomEvent('-change', {
442
+ detail: getAttribute($opt, 'data-value')
443
+ }));
444
+ }
459
445
  }
460
446
 
461
447
  #onChangeReactHandler = e => {
@@ -1,8 +1,7 @@
1
1
  import type { TRect, TSinchElementReact } from '../types';
2
- import type { TSinchColorName } from '../utils/colors';
3
2
  export declare type TSinchSelectMenuElement = HTMLElement & {
4
3
  /** Value */
5
- value: TSinchColorName;
4
+ value: string;
6
5
  /** How many rows to show and scroll the rest */
7
6
  rows: number | null;
8
7
  /** How many cols to show and scroll the rest */
@@ -11,11 +10,11 @@ export declare type TSinchSelectMenuElement = HTMLElement & {
11
10
  colors: string | null;
12
11
  nthItemRect(index: number): TRect | null;
13
12
  /** Change event */
14
- addEventListener(type: '-change', listener: (e: CustomEvent<TSinchColorName>) => void): void;
13
+ addEventListener(type: '-change', listener: (e: CustomEvent<string>) => void): void;
15
14
  /** Comma-separated color names, all colors by default */
16
15
  setAttribute(name: 'colors', value: string): void;
17
16
  /** Value */
18
- setAttribute(name: 'value', value: TSinchColorName): void;
17
+ setAttribute(name: 'value', value: string): void;
19
18
  /** How many rows to show and scroll the rest */
20
19
  setAttribute(name: 'rows', value: string): void;
21
20
  /** How many cols to show and scroll the rest */
@@ -23,7 +22,7 @@ export declare type TSinchSelectMenuElement = HTMLElement & {
23
22
  };
24
23
  export declare type TSinchSelectMenuReact = TSinchElementReact<TSinchSelectMenuElement> & {
25
24
  /** Value */
26
- value: TSinchColorName;
25
+ value: string;
27
26
  /** How many rows to show and scroll the rest */
28
27
  rows?: number;
29
28
  /** How many cols to show and scroll the rest */
@@ -33,5 +32,5 @@ export declare type TSinchSelectMenuReact = TSinchElementReact<TSinchSelectMenuE
33
32
  /** Label that is used for a11y */
34
33
  'aria-label': string;
35
34
  /** Change event handler */
36
- 'on-change'?: (e: CustomEvent<TSinchColorName>) => void;
35
+ 'on-change'?: (e: CustomEvent<string>) => void;
37
36
  };
@@ -0,0 +1 @@
1
+ export declare const getParentOption: ($element: Element) => Element | null;
@@ -0,0 +1,15 @@
1
+ export const getParentOption = $element => {
2
+ let $el = $element;
3
+
4
+ while (!$el.hasAttribute('data-value')) {
5
+ const parent = $el.parentElement;
6
+
7
+ if (parent === null) {
8
+ return null;
9
+ }
10
+
11
+ $el = parent;
12
+ }
13
+
14
+ return $el;
15
+ };
@@ -1,8 +1,8 @@
1
1
  import '../icons/cancel';
2
2
  import '../text';
3
- import { defineCustomElement, getLiteralAttribute, updateLiteralAttribute, NectaryElement, setClass } from '../utils';
4
- import { assertColorNameValue, colorMap, colorNameValues, NO_COLOR } from '../utils/colors';
5
- const templateHTML = '<style>:host{display:inline-block;vertical-align:middle}#wrapper{width:var(--sinch-size-icon,32px);height:var(--sinch-size-icon,32px);border-radius:50%}#wrapper.no-color{background:linear-gradient(45deg,var(--sinch-color-berry-200),var(--sinch-color-orange-200),var(--sinch-color-bolt-200),var(--sinch-color-grass-200),var(--sinch-color-aqua-200),var(--sinch-color-night-200),var(--sinch-color-violet-200))}</style><div id="wrapper"></div>';
3
+ import { defineCustomElement, NectaryElement, setClass, getAttribute, updateAttribute } from '../utils';
4
+ import { NO_COLOR } from '../utils/colors';
5
+ const templateHTML = '<style>:host{display:inline-block;vertical-align:middle}#wrapper{width:var(--sinch-size-icon,32px);height:var(--sinch-size-icon,32px);border-radius:50%}#wrapper.no-color{background:linear-gradient(45deg,var(--sinch-color-map-light-orange-bg),var(--sinch-color-map-light-yellow-bg),var(--sinch-color-map-light-green-bg),var(--sinch-color-map-light-blue-bg),var(--sinch-color-map-light-violet-bg))}</style><div id="wrapper"></div>';
6
6
  const template = document.createElement('template');
7
7
  template.innerHTML = templateHTML;
8
8
  defineCustomElement('sinch-color-swatch', class extends NectaryElement {
@@ -20,11 +20,11 @@ defineCustomElement('sinch-color-swatch', class extends NectaryElement {
20
20
  }
21
21
 
22
22
  get name() {
23
- return getLiteralAttribute(this, colorNameValues, 'name', NO_COLOR);
23
+ return getAttribute(this, 'name', NO_COLOR);
24
24
  }
25
25
 
26
26
  set name(value) {
27
- updateLiteralAttribute(this, colorNameValues, 'name', value);
27
+ updateAttribute(this, 'name', value);
28
28
  }
29
29
 
30
30
  static get observedAttributes() {
@@ -39,7 +39,6 @@ defineCustomElement('sinch-color-swatch', class extends NectaryElement {
39
39
  switch (name) {
40
40
  case 'name':
41
41
  {
42
- assertColorNameValue(newVal);
43
42
  this.#updateColor();
44
43
  break;
45
44
  }
@@ -50,7 +49,9 @@ defineCustomElement('sinch-color-swatch', class extends NectaryElement {
50
49
  const colorName = this.name;
51
50
 
52
51
  if (colorName !== NO_COLOR) {
53
- this.#$wrapper.style.backgroundColor = `var(--sinch-color-${colorMap[colorName].value})`;
52
+ this.#$wrapper.style.setProperty('background-color', `var(--sinch-color-map-${colorName}-bg)`);
53
+ } else {
54
+ this.#$wrapper.style.removeProperty('background-color');
54
55
  }
55
56
 
56
57
  setClass(this.#$wrapper, 'no-color', colorName === NO_COLOR);
@@ -1,12 +1,11 @@
1
1
  import type { TSinchElementReact } from '../types';
2
- import type { TSinchColorName } from '../utils/colors';
3
2
  export declare type TSinchColorSwatchElement = HTMLElement & {
4
3
  /** Color name */
5
- name: TSinchColorName;
4
+ name: string;
6
5
  /** Color name */
7
- setAttribute(name: 'name', value: TSinchColorName): void;
6
+ setAttribute(name: 'name', value: string): void;
8
7
  };
9
8
  export declare type TSinchColorSwatchReact = TSinchElementReact<TSinchColorSwatchElement> & {
10
9
  /** Color name */
11
- name: TSinchColorName;
10
+ name: string;
12
11
  };
package/colors.json CHANGED
@@ -43,24 +43,28 @@
43
43
  "colorRaspberry200": "#FBD5D5",
44
44
  "colorRaspberry100": "#FFE8E4",
45
45
  "colorRaspberry50": "#FFF6F5",
46
+ "colorNight700": "#1223a1",
46
47
  "colorNight400": "#3247E9",
47
48
  "colorNight200": "#D1D6FA",
48
- "colorAqua400": "#3AA7EA",
49
- "colorAqua200": "#A1D5F5",
49
+ "colorGrass700": "#006602",
50
50
  "colorGrass400": "#39B93D",
51
51
  "colorGrass200": "#B4E4B5",
52
+ "colorDirt700": "#363230",
52
53
  "colorDirt400": "#828282",
53
54
  "colorDirt200": "#E0DDDC",
54
- "colorBerry400": "#EF5858",
55
- "colorBerry200": "#FFB8B8",
55
+ "colorCandy700": "#981b77",
56
56
  "colorCandy400": "#E467C3",
57
57
  "colorCandy200": "#F6CBEA",
58
+ "colorMud700": "#6d4e46",
58
59
  "colorMud400": "#8B6559",
59
60
  "colorMud200": "#D7C6C1",
61
+ "colorOrange700": "#974302",
60
62
  "colorOrange400": "#FF8C34",
61
63
  "colorOrange200": "#FFD4B3",
64
+ "colorBolt700": "#805500",
62
65
  "colorBolt400": "#FFBE3C",
63
66
  "colorBolt200": "#FFE6B3",
67
+ "colorViolet700": "#4F1B98",
64
68
  "colorViolet400": "#9E67E4",
65
69
  "colorViolet200": "#DECBF6",
66
70
  "colorError700": "#882024",
@@ -75,10 +79,10 @@
75
79
  "colorWarning700": "#9C2E00",
76
80
  "colorWarning500": "#F35B1C",
77
81
  "colorWarning200": "#FFE8D6",
78
- "colorColorSkinTone10": "#FFCC4D",
79
- "colorColorSkinTone20": "#F7DECE",
80
- "colorColorSkinTone30": "#F3D2A2",
81
- "colorColorSkinTone40": "#D4AB88",
82
- "colorColorSkinTone50": "#AF7E57",
83
- "colorColorSkinTone60": "#7C533E"
82
+ "colorColorSkinTone0": "#FFCC4D",
83
+ "colorColorSkinTone10": "#F7DECE",
84
+ "colorColorSkinTone20": "#F3D2A2",
85
+ "colorColorSkinTone30": "#D4AB88",
86
+ "colorColorSkinTone40": "#AF7E57",
87
+ "colorColorSkinTone50": "#7C533E"
84
88
  }