@sellmate/design-system 1.0.21 → 1.0.22

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 (161) hide show
  1. package/dist/cjs/{select-keyboard-navigation-CtstKOb3.js → base-dropdown-event-BTPlZ1KF.js} +0 -38
  2. package/dist/cjs/component.button-C6xBMwHf.js +115 -0
  3. package/dist/cjs/design-system.cjs.js +1 -1
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/sd-button-v2.cjs.entry.js +86 -0
  6. package/dist/cjs/sd-button-v2.config-BK45EPK_.js +203 -0
  7. package/dist/cjs/sd-button_21.cjs.entry.js +119 -65
  8. package/dist/cjs/sd-card.cjs.entry.js +1 -1
  9. package/dist/cjs/sd-date-picker.cjs.entry.js +1 -1
  10. package/dist/cjs/sd-dropdown-button.cjs.entry.js +274 -0
  11. package/dist/cjs/sd-file-picker.cjs.entry.js +3 -3
  12. package/dist/cjs/sd-guide.cjs.entry.js +2 -2
  13. package/dist/cjs/sd-popover.cjs.entry.js +2 -2
  14. package/dist/cjs/sd-progress.cjs.entry.js +2 -2
  15. package/dist/cjs/sd-select-multiple-group.cjs.entry.js +3 -2
  16. package/dist/cjs/sd-select-multiple.cjs.entry.js +4 -3
  17. package/dist/cjs/sd-select-option-group.cjs.entry.js +3 -3
  18. package/dist/cjs/sd-toggle-button.cjs.entry.js +1 -1
  19. package/dist/cjs/sd-toggle.cjs.entry.js +1 -1
  20. package/dist/cjs/select-keyboard-navigation-s2wP37xZ.js +40 -0
  21. package/dist/collection/collection-manifest.json +3 -1
  22. package/dist/collection/components/sd-button-v2/sd-button-v2.config.js +190 -0
  23. package/dist/collection/components/sd-button-v2/sd-button-v2.css +120 -0
  24. package/dist/collection/components/sd-button-v2/sd-button-v2.js +249 -0
  25. package/dist/collection/components/sd-card/sd-card.js +1 -1
  26. package/dist/collection/components/sd-date-picker/sd-date-picker.js +1 -1
  27. package/dist/collection/components/sd-date-range-picker/sd-date-range-picker.js +2 -2
  28. package/dist/collection/components/sd-dropdown-button/sd-dropdown-button.config.js +62 -0
  29. package/dist/collection/components/sd-dropdown-button/sd-dropdown-button.css +171 -0
  30. package/dist/collection/components/sd-dropdown-button/sd-dropdown-button.js +384 -0
  31. package/dist/collection/components/sd-field/sd-field.js +3 -3
  32. package/dist/collection/components/sd-file-picker/sd-file-picker.js +3 -3
  33. package/dist/collection/components/sd-floating-portal/sd-floating-portal.js +1 -1
  34. package/dist/collection/components/sd-guide/sd-guide.js +2 -2
  35. package/dist/collection/components/sd-icon/sd-icon.js +1 -1
  36. package/dist/collection/components/sd-input/sd-input.js +1 -1
  37. package/dist/collection/components/sd-loading-spinner/sd-loading-spinner.js +1 -1
  38. package/dist/collection/components/sd-number-input/sd-number-input.js +4 -4
  39. package/dist/collection/components/sd-pagination/sd-pagination.js +2 -2
  40. package/dist/collection/components/sd-popover/sd-popover.js +2 -2
  41. package/dist/collection/components/sd-portal/sd-portal.js +89 -19
  42. package/dist/collection/components/sd-progress/sd-progress.js +2 -2
  43. package/dist/collection/components/sd-select/sd-select-dropdown/sd-select-dropdown.js +2 -2
  44. package/dist/collection/components/sd-select/sd-select-option/sd-select-option.js +1 -1
  45. package/dist/collection/components/sd-select/sd-select-search-input/sd-select-search-input.js +3 -3
  46. package/dist/collection/components/sd-select-multiple/sd-select-multiple.js +1 -1
  47. package/dist/collection/components/sd-select-multiple-group/sd-select-option-group/sd-select-option-group.js +3 -3
  48. package/dist/collection/components/sd-textarea/sd-textarea.js +2 -2
  49. package/dist/collection/components/sd-toggle/sd-toggle.js +1 -1
  50. package/dist/collection/components/sd-toggle-button/sd-toggle-button.js +1 -1
  51. package/dist/components/{p-D0U1cMbs.js → p-B4p2JGMI.js} +1 -1
  52. package/dist/components/p-Bd9o9P1x.js +1 -0
  53. package/dist/components/{p-rn5S2icF.js → p-BsQEKShq.js} +1 -1
  54. package/dist/components/{p-CbQobmaB.js → p-CAJmL8nc.js} +1 -1
  55. package/dist/components/p-CWlCxabU.js +1 -0
  56. package/dist/components/p-Cy6HMEsK.js +1 -0
  57. package/dist/components/{p-C1XPuuO-.js → p-CysnHGj4.js} +1 -1
  58. package/dist/components/{p-qSu-ayDy.js → p-D4kmO3k7.js} +1 -1
  59. package/dist/components/{p-DdOM8yc2.js → p-DB52ADSW.js} +1 -1
  60. package/dist/components/{p-J-Yn0oS3.js → p-DExqkuUY.js} +1 -1
  61. package/dist/components/{p-MmKik3mL.js → p-DF2wExtn.js} +1 -1
  62. package/dist/components/{p-D35gOcGh.js → p-DFgtwoFG.js} +1 -1
  63. package/dist/components/{p-BVFlD1Lp.js → p-DYsHXden.js} +1 -1
  64. package/dist/components/{p-CWg2auF3.js → p-DZqrfwuw.js} +1 -1
  65. package/dist/components/p-Dc4UTGgQ.js +1 -0
  66. package/dist/components/{p-CU5TiEeI.js → p-DyeU47vV.js} +1 -1
  67. package/dist/components/p-Hvt2oWRk.js +1 -0
  68. package/dist/components/{p-Cef06v8S.js → p-JyVgfdnC.js} +1 -1
  69. package/dist/components/p-VKF2AWs1.js +1 -0
  70. package/dist/components/sd-button-v2.d.ts +11 -0
  71. package/dist/components/sd-button-v2.js +1 -0
  72. package/dist/components/sd-button.js +1 -1
  73. package/dist/components/sd-card.js +1 -1
  74. package/dist/components/sd-checkbox.js +1 -1
  75. package/dist/components/sd-date-picker.js +1 -1
  76. package/dist/components/sd-date-range-picker.js +1 -1
  77. package/dist/components/sd-dropdown-button.d.ts +11 -0
  78. package/dist/components/sd-dropdown-button.js +1 -0
  79. package/dist/components/sd-field.js +1 -1
  80. package/dist/components/sd-file-picker.js +1 -1
  81. package/dist/components/sd-floating-portal.js +1 -1
  82. package/dist/components/sd-guide.js +1 -1
  83. package/dist/components/sd-icon.js +1 -1
  84. package/dist/components/sd-input.js +1 -1
  85. package/dist/components/sd-loading-spinner.js +1 -1
  86. package/dist/components/sd-modal-card.js +1 -1
  87. package/dist/components/sd-number-input.js +1 -1
  88. package/dist/components/sd-pagination.js +1 -1
  89. package/dist/components/sd-popover.js +1 -1
  90. package/dist/components/sd-portal.js +1 -1
  91. package/dist/components/sd-progress.js +1 -1
  92. package/dist/components/sd-select-dropdown.js +1 -1
  93. package/dist/components/sd-select-multiple-group.js +1 -1
  94. package/dist/components/sd-select-multiple.js +1 -1
  95. package/dist/components/sd-select-option-group.js +1 -1
  96. package/dist/components/sd-select-option.js +1 -1
  97. package/dist/components/sd-select-search-input.js +1 -1
  98. package/dist/components/sd-select.js +1 -1
  99. package/dist/components/sd-table.js +1 -1
  100. package/dist/components/sd-textarea.js +1 -1
  101. package/dist/components/sd-toast.js +1 -1
  102. package/dist/components/sd-toggle-button.js +1 -1
  103. package/dist/components/sd-toggle.js +1 -1
  104. package/dist/components/sd-tooltip.js +1 -1
  105. package/dist/design-system/design-system.esm.js +1 -1
  106. package/dist/design-system/p-2ca338f9.entry.js +1 -0
  107. package/dist/design-system/p-322dbf53.entry.js +1 -0
  108. package/dist/design-system/p-3885ca10.entry.js +1 -0
  109. package/dist/design-system/{p-d6b38732.entry.js → p-40da6e22.entry.js} +1 -1
  110. package/dist/design-system/{p-679e4367.entry.js → p-47d37199.entry.js} +1 -1
  111. package/dist/design-system/{p-3301c280.entry.js → p-6c34df5b.entry.js} +1 -1
  112. package/dist/design-system/p-7d35c7a7.entry.js +1 -0
  113. package/dist/design-system/{p-3d03b19e.entry.js → p-938940a7.entry.js} +1 -1
  114. package/dist/design-system/p-9650c304.entry.js +1 -0
  115. package/dist/design-system/{p-8f99cd66.entry.js → p-9ad83ffb.entry.js} +1 -1
  116. package/dist/design-system/p-CRdYeSBK.js +1 -0
  117. package/dist/design-system/p-Dc4UTGgQ.js +1 -0
  118. package/dist/design-system/p-VKF2AWs1.js +1 -0
  119. package/dist/design-system/{p-d344fa9d.entry.js → p-a547f366.entry.js} +1 -1
  120. package/dist/design-system/{p-3e07e92a.entry.js → p-b2ab1c50.entry.js} +1 -1
  121. package/dist/design-system/p-d38f59b3.entry.js +1 -0
  122. package/dist/design-system/{p-822233ee.entry.js → p-e5c3927f.entry.js} +1 -1
  123. package/dist/design-system/p-xxEHPVkL.js +1 -0
  124. package/dist/esm/{select-keyboard-navigation-D8-D-mJX.js → base-dropdown-event-CRdYeSBK.js} +1 -37
  125. package/dist/esm/component.button-Dc4UTGgQ.js +113 -0
  126. package/dist/esm/design-system.js +1 -1
  127. package/dist/esm/loader.js +1 -1
  128. package/dist/esm/sd-button-v2.config-BWmcscrt.js +193 -0
  129. package/dist/esm/sd-button-v2.entry.js +84 -0
  130. package/dist/esm/sd-button_21.entry.js +114 -60
  131. package/dist/esm/sd-card.entry.js +1 -1
  132. package/dist/esm/sd-date-picker.entry.js +1 -1
  133. package/dist/esm/sd-dropdown-button.entry.js +272 -0
  134. package/dist/esm/sd-file-picker.entry.js +3 -3
  135. package/dist/esm/sd-guide.entry.js +2 -2
  136. package/dist/esm/sd-popover.entry.js +2 -2
  137. package/dist/esm/sd-progress.entry.js +2 -2
  138. package/dist/esm/sd-select-multiple-group.entry.js +2 -1
  139. package/dist/esm/sd-select-multiple.entry.js +3 -2
  140. package/dist/esm/sd-select-option-group.entry.js +3 -3
  141. package/dist/esm/sd-toggle-button.entry.js +1 -1
  142. package/dist/esm/sd-toggle.entry.js +1 -1
  143. package/dist/esm/select-keyboard-navigation-xxEHPVkL.js +37 -0
  144. package/dist/types/components/sd-button-v2/sd-button-v2.config.d.ts +178 -0
  145. package/dist/types/components/sd-button-v2/sd-button-v2.d.ts +18 -0
  146. package/dist/types/components/sd-dropdown-button/sd-dropdown-button.config.d.ts +55 -0
  147. package/dist/types/components/sd-dropdown-button/sd-dropdown-button.d.ts +34 -0
  148. package/dist/types/components/sd-portal/sd-portal.d.ts +9 -0
  149. package/dist/types/components.d.ts +153 -0
  150. package/dist/types/index.d.ts +2 -0
  151. package/hydrate/index.js +881 -148
  152. package/hydrate/index.mjs +881 -148
  153. package/package.json +2 -2
  154. package/dist/components/p-B82gJZ4z.js +0 -1
  155. package/dist/components/p-C6J-ZZxF.js +0 -1
  156. package/dist/components/p-CHAh-_qx.js +0 -1
  157. package/dist/design-system/p-103de692.entry.js +0 -1
  158. package/dist/design-system/p-55c13597.entry.js +0 -1
  159. package/dist/design-system/p-D8-D-mJX.js +0 -1
  160. package/dist/design-system/p-de339565.entry.js +0 -1
  161. package/dist/design-system/p-fc0e636b.entry.js +0 -1
@@ -0,0 +1,62 @@
1
+ import buttonTokens from "../../tokens/generated/component.button.json";
2
+ import systemTokens from "../../tokens/generated/system.json";
3
+ import { BUTTON_CONFIG, PRESET_BORDER_COLORS as BUTTON_PRESET_BORDER_COLORS, PRESET_CONTENT_COLORS as BUTTON_PRESET_CONTENT_COLORS, PRESET_HOVER_BACKGROUNDS as BUTTON_PRESET_HOVER_BACKGROUNDS, getPresetName, } from "../sd-button-v2/sd-button-v2.config";
4
+ const UNSUPPORTED_DROPDOWN_BUTTON_NAMES = new Set([
5
+ 'neutral_xs',
6
+ 'neutral_sm',
7
+ 'neutral_md',
8
+ ]);
9
+ const DROPDOWN_BUTTON_NAMES = Object.keys(BUTTON_CONFIG).filter((name) => !name.endsWith('_lg') && !UNSUPPORTED_DROPDOWN_BUTTON_NAMES.has(name));
10
+ export const DROPDOWN_BUTTON_CONFIG = Object.fromEntries(DROPDOWN_BUTTON_NAMES.map(name => [name, BUTTON_CONFIG[name]]));
11
+ export const DROPDOWN_BUTTON_MIN_WIDTHS = {
12
+ xs: buttonTokens.dropdown.xs.minWidth,
13
+ sm: buttonTokens.dropdown.sm.minWidth,
14
+ md: buttonTokens.dropdown.md.minWidth,
15
+ };
16
+ export const PRESET_HOVER_BACKGROUNDS = BUTTON_PRESET_HOVER_BACKGROUNDS;
17
+ export const PRESET_CONTENT_COLORS = BUTTON_PRESET_CONTENT_COLORS;
18
+ export const PRESET_BORDER_COLORS = BUTTON_PRESET_BORDER_COLORS;
19
+ export const PRESET_DIVIDER_COLORS = {
20
+ primary: buttonTokens.brand.strong.dropdown.divider,
21
+ secondary: buttonTokens.brand.subtle.dropdown.divider,
22
+ primary_outline: PRESET_BORDER_COLORS.primary_outline,
23
+ neutral: buttonTokens.neutral.outline.border,
24
+ neutral_outline: PRESET_BORDER_COLORS.neutral_outline,
25
+ danger: buttonTokens.danger.strong.dropdown.divider,
26
+ danger_outline: PRESET_BORDER_COLORS.danger_outline,
27
+ };
28
+ const MENU_ITEM_COLOR = systemTokens.color.text.secondary;
29
+ const MENU_ITEM_ACTIVE_BACKGROUND = systemTokens.color.bg.accent.default;
30
+ const MENU_ITEM_ACTIVE_COLOR = systemTokens.color.text.inverse;
31
+ export const PRESET_MENU_ITEM_COLORS = {
32
+ primary: MENU_ITEM_COLOR,
33
+ secondary: MENU_ITEM_COLOR,
34
+ primary_outline: MENU_ITEM_COLOR,
35
+ neutral: MENU_ITEM_COLOR,
36
+ neutral_outline: MENU_ITEM_COLOR,
37
+ danger: MENU_ITEM_COLOR,
38
+ danger_outline: MENU_ITEM_COLOR,
39
+ };
40
+ export const PRESET_MENU_ITEM_ACTIVE_BACKGROUNDS = {
41
+ primary: MENU_ITEM_ACTIVE_BACKGROUND,
42
+ secondary: MENU_ITEM_ACTIVE_BACKGROUND,
43
+ primary_outline: MENU_ITEM_ACTIVE_BACKGROUND,
44
+ neutral: MENU_ITEM_ACTIVE_BACKGROUND,
45
+ neutral_outline: MENU_ITEM_ACTIVE_BACKGROUND,
46
+ danger: MENU_ITEM_ACTIVE_BACKGROUND,
47
+ danger_outline: MENU_ITEM_ACTIVE_BACKGROUND,
48
+ };
49
+ export const PRESET_MENU_ITEM_ACTIVE_COLORS = {
50
+ primary: MENU_ITEM_ACTIVE_COLOR,
51
+ secondary: MENU_ITEM_ACTIVE_COLOR,
52
+ primary_outline: MENU_ITEM_ACTIVE_COLOR,
53
+ neutral: MENU_ITEM_ACTIVE_COLOR,
54
+ neutral_outline: MENU_ITEM_ACTIVE_COLOR,
55
+ danger: MENU_ITEM_ACTIVE_COLOR,
56
+ danger_outline: MENU_ITEM_ACTIVE_COLOR,
57
+ };
58
+ export const DROPDOWN_DISABLED_BACKGROUND = buttonTokens.bg.disabled;
59
+ export const DROPDOWN_DISABLED_CONTENT = buttonTokens.content.disabled;
60
+ export const DROPDOWN_DISABLED_BORDER = buttonTokens.border.disabled;
61
+ export const isDropdownButtonName = (value) => value in DROPDOWN_BUTTON_CONFIG;
62
+ export const getDropdownButtonPreset = (value) => getPresetName(value);
@@ -0,0 +1,171 @@
1
+ sd-dropdown-button {
2
+ display: inline-flex;
3
+ width: fit-content;
4
+ height: fit-content;
5
+ }
6
+
7
+ .sd-dropdown-button {
8
+ display: inline-flex;
9
+ position: relative;
10
+ }
11
+
12
+ .sd-dropdown-button__trigger {
13
+ --sd-dropdown-button-height: var(--sd-button-md-height, 34px);
14
+ --sd-dropdown-button-padding-x: var(--sd-button-md-padding-x, 20px);
15
+ --sd-dropdown-button-gap: var(--sd-button-md-gap, 8px);
16
+ --sd-dropdown-button-font-family: var(--sd-button-md-typography-font-family, inherit);
17
+ --sd-dropdown-button-font-size: var(--sd-button-md-typography-font-size, 12px);
18
+ --sd-dropdown-button-font-weight: var(--sd-button-md-typography-font-weight, 500);
19
+ --sd-dropdown-button-text-decoration: var(--sd-button-md-typography-text-decoration, none);
20
+ --sd-dropdown-button-bg: #025497;
21
+ --sd-dropdown-button-bg-hover: #004177;
22
+ --sd-dropdown-button-border: transparent;
23
+ --sd-dropdown-button-content: #ffffff;
24
+ --sd-dropdown-button-divider: #006ac1;
25
+ --sd-dropdown-button-accent: #006ac1;
26
+ --sd-dropdown-button-min-width: 106px;
27
+ --sd-dropdown-button-disabled-bg: var(--sd-button-bg-disabled, $grey_30);
28
+ --sd-dropdown-button-disabled-content: var(--sd-button-content-disabled, $grey_65);
29
+ --sd-dropdown-button-disabled-border: var(--sd-button-border-disabled, $grey_45);
30
+ display: inline-flex;
31
+ align-items: stretch;
32
+ justify-content: space-between;
33
+ min-width: var(--sd-dropdown-button-min-width);
34
+ min-height: var(--sd-dropdown-button-height);
35
+ padding: 0;
36
+ border: var(--sd-button-border-width-default, 1px) solid var(--sd-dropdown-button-border);
37
+ border-radius: var(--sd-button-radius-default, 4px);
38
+ background: var(--sd-dropdown-button-bg);
39
+ color: var(--sd-dropdown-button-content);
40
+ cursor: pointer;
41
+ box-sizing: border-box;
42
+ font-family: var(--sd-dropdown-button-font-family);
43
+ font-size: var(--sd-dropdown-button-font-size);
44
+ font-weight: var(--sd-dropdown-button-font-weight);
45
+ line-height: 1;
46
+ text-decoration: var(--sd-dropdown-button-text-decoration);
47
+ transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease;
48
+ white-space: nowrap;
49
+ }
50
+ .sd-dropdown-button__trigger:hover:not(.sd-dropdown-button__trigger--disabled) {
51
+ background: var(--sd-dropdown-button-bg-hover);
52
+ }
53
+ .sd-dropdown-button__trigger:focus-visible {
54
+ outline: 0;
55
+ box-shadow: 0 0 0 2px var(--sd-dropdown-button-accent);
56
+ }
57
+ .sd-dropdown-button__trigger--xs {
58
+ --sd-dropdown-button-height: var(--sd-button-xs-height, 24px);
59
+ --sd-dropdown-button-padding-x: var(--sd-button-xs-padding-x, 8px);
60
+ --sd-dropdown-button-gap: var(--sd-button-xs-gap, 4px);
61
+ --sd-dropdown-button-font-family: var(--sd-button-xs-typography-font-family, inherit);
62
+ --sd-dropdown-button-font-size: var(--sd-button-xs-typography-font-size, 12px);
63
+ --sd-dropdown-button-font-weight: var(--sd-button-xs-typography-font-weight, 500);
64
+ --sd-dropdown-button-text-decoration: var(--sd-button-xs-typography-text-decoration, none);
65
+ }
66
+ .sd-dropdown-button__trigger--sm {
67
+ --sd-dropdown-button-height: var(--sd-button-sm-height, 28px);
68
+ --sd-dropdown-button-padding-x: var(--sd-button-sm-padding-x, 12px);
69
+ --sd-dropdown-button-gap: var(--sd-button-sm-gap, 6px);
70
+ --sd-dropdown-button-font-family: var(--sd-button-sm-typography-font-family, inherit);
71
+ --sd-dropdown-button-font-size: var(--sd-button-sm-typography-font-size, 12px);
72
+ --sd-dropdown-button-font-weight: var(--sd-button-sm-typography-font-weight, 500);
73
+ --sd-dropdown-button-text-decoration: var(--sd-button-sm-typography-text-decoration, none);
74
+ }
75
+ .sd-dropdown-button__trigger--md {
76
+ --sd-dropdown-button-height: var(--sd-button-md-height, 34px);
77
+ --sd-dropdown-button-padding-x: var(--sd-button-md-padding-x, 20px);
78
+ --sd-dropdown-button-gap: var(--sd-button-md-gap, 8px);
79
+ --sd-dropdown-button-font-family: var(--sd-button-md-typography-font-family, inherit);
80
+ --sd-dropdown-button-font-size: var(--sd-button-md-typography-font-size, 16px);
81
+ --sd-dropdown-button-font-weight: var(--sd-button-md-typography-font-weight, 500);
82
+ --sd-dropdown-button-text-decoration: var(--sd-button-md-typography-text-decoration, none);
83
+ }
84
+ .sd-dropdown-button__trigger--disabled {
85
+ border-color: var(--sd-dropdown-button-disabled-border);
86
+ background: var(--sd-dropdown-button-disabled-bg);
87
+ color: var(--sd-dropdown-button-disabled-content);
88
+ cursor: not-allowed;
89
+ }
90
+ .sd-dropdown-button__trigger--disabled .sd-dropdown-button__trigger-divider {
91
+ background: var(--sd-dropdown-button-disabled-border);
92
+ }
93
+
94
+ .sd-dropdown-button__trigger-label,
95
+ .sd-dropdown-button__trigger-icon {
96
+ display: inline-flex;
97
+ align-items: center;
98
+ justify-content: center;
99
+ }
100
+
101
+ .sd-dropdown-button__trigger-label {
102
+ flex: 1 1 auto;
103
+ min-width: 0;
104
+ padding: 0 var(--sd-dropdown-button-padding-x);
105
+ }
106
+
107
+ .sd-dropdown-button__trigger-divider {
108
+ align-self: stretch;
109
+ width: 1px;
110
+ height: auto;
111
+ background: var(--sd-dropdown-button-divider);
112
+ opacity: 0.9;
113
+ }
114
+
115
+ .sd-dropdown-button__trigger-icon {
116
+ flex: 0 0 auto;
117
+ min-width: calc(var(--sd-dropdown-button-height) - 2px);
118
+ padding: 0 calc(var(--sd-dropdown-button-gap) + 2px);
119
+ }
120
+
121
+ .sd-dropdown-button__menu {
122
+ display: grid;
123
+ width: max-content;
124
+ min-width: max-content;
125
+ max-width: calc(100vw - 24px);
126
+ padding: 4px 0;
127
+ border: 0;
128
+ border-radius: 4px;
129
+ background: #FFFFFF;
130
+ box-shadow: 2px 2px 12px 2px rgba(0, 0, 0, 0.1019607843);
131
+ box-sizing: border-box;
132
+ overflow: hidden;
133
+ }
134
+
135
+ .sd-dropdown-button__menu-item {
136
+ display: inline-flex;
137
+ align-items: center;
138
+ gap: 8px;
139
+ min-height: 28px;
140
+ width: 100%;
141
+ padding: 0 12px;
142
+ border: 0;
143
+ border-radius: 0;
144
+ background: transparent;
145
+ color: var(--sd-dropdown-button-menu-item-color);
146
+ cursor: pointer;
147
+ box-sizing: border-box;
148
+ font: inherit;
149
+ text-align: left;
150
+ transition: background-color 0.15s ease, color 0.15s ease;
151
+ }
152
+ .sd-dropdown-button__menu-item--active {
153
+ background: var(--sd-dropdown-button-menu-item-active-bg);
154
+ color: var(--sd-dropdown-button-menu-item-active-color);
155
+ }
156
+ .sd-dropdown-button__menu-item--disabled {
157
+ color: var(--sd-dropdown-button-disabled-content);
158
+ cursor: not-allowed;
159
+ }
160
+
161
+ .sd-dropdown-button__menu-item-icon {
162
+ flex: 0 0 auto;
163
+ }
164
+
165
+ .sd-dropdown-button__menu-item-label {
166
+ display: inline-flex;
167
+ align-items: center;
168
+ min-width: 0;
169
+ white-space: nowrap;
170
+ font-size: 12px;
171
+ }
@@ -0,0 +1,384 @@
1
+ import { h, } from "@stencil/core";
2
+ import { BaseDropdownEvent } from "../../utils/base-dropdown-event";
3
+ import { BUTTON_FOCUS_RING_COLOR } from "../sd-button-v2/sd-button-v2.config";
4
+ import { DROPDOWN_BUTTON_CONFIG, DROPDOWN_BUTTON_MIN_WIDTHS, DROPDOWN_DISABLED_BACKGROUND, DROPDOWN_DISABLED_BORDER, DROPDOWN_DISABLED_CONTENT, PRESET_BORDER_COLORS, PRESET_CONTENT_COLORS, PRESET_DIVIDER_COLORS, PRESET_HOVER_BACKGROUNDS, PRESET_MENU_ITEM_ACTIVE_BACKGROUNDS, PRESET_MENU_ITEM_ACTIVE_COLORS, PRESET_MENU_ITEM_COLORS, getDropdownButtonPreset, isDropdownButtonName, } from "./sd-dropdown-button.config";
5
+ export class SdDropdownButton extends BaseDropdownEvent {
6
+ constructor() {
7
+ super();
8
+ }
9
+ el;
10
+ name = 'primary_sm';
11
+ label = '';
12
+ items = [];
13
+ disabled = false;
14
+ isOpen = false;
15
+ itemIndex = -1;
16
+ triggerRef;
17
+ menuRef;
18
+ click;
19
+ dropDownShow;
20
+ handleOpenChange(isOpen) {
21
+ this.onDropdownToggle(isOpen);
22
+ this.dropDownShow.emit({ isOpen });
23
+ if (!isOpen) {
24
+ this.itemIndex = -1;
25
+ }
26
+ }
27
+ componentWillLoad() {
28
+ this.initializeEvent();
29
+ }
30
+ disconnectedCallback() {
31
+ this.cleanupEvent();
32
+ }
33
+ async sdOpen() {
34
+ if (this.disabled || this.items.length === 0)
35
+ return;
36
+ this.isOpen = true;
37
+ }
38
+ async sdClose() {
39
+ this.closeDropdown();
40
+ }
41
+ closeDropdown = () => {
42
+ this.isOpen = false;
43
+ };
44
+ handleDocumentClick(event) {
45
+ const target = event.target;
46
+ if (!target)
47
+ return;
48
+ if (this.el.contains(target))
49
+ return;
50
+ if (this.menuRef?.contains(target))
51
+ return;
52
+ this.closeDropdown();
53
+ }
54
+ handleDocumentKeydown(event) {
55
+ if (!this.isOpen)
56
+ return;
57
+ const targetKeys = ['ArrowDown', 'ArrowUp', 'Enter', 'Escape'];
58
+ if (!targetKeys.includes(event.key))
59
+ return;
60
+ event.preventDefault();
61
+ event.stopPropagation();
62
+ switch (event.key) {
63
+ case 'ArrowDown':
64
+ this.itemIndex = this.getNextEnabledIndex(1);
65
+ break;
66
+ case 'ArrowUp':
67
+ this.itemIndex = this.getNextEnabledIndex(-1);
68
+ break;
69
+ case 'Enter':
70
+ if (this.itemIndex < 0)
71
+ return;
72
+ this.selectItem(this.items[this.itemIndex]);
73
+ break;
74
+ case 'Escape':
75
+ this.closeDropdown();
76
+ break;
77
+ }
78
+ }
79
+ get resolvedConfig() {
80
+ if (!isDropdownButtonName(this.name)) {
81
+ throw new Error(`Invalid sd-dropdown-button name: ${this.name}`);
82
+ }
83
+ const config = DROPDOWN_BUTTON_CONFIG[this.name];
84
+ const preset = getDropdownButtonPreset(this.name);
85
+ return {
86
+ config,
87
+ preset,
88
+ };
89
+ }
90
+ getNextEnabledIndex(direction) {
91
+ const enabledIndices = this.items.reduce((acc, item, index) => {
92
+ if (!item.disabled) {
93
+ acc.push(index);
94
+ }
95
+ return acc;
96
+ }, []);
97
+ if (enabledIndices.length === 0) {
98
+ return -1;
99
+ }
100
+ const currentPosition = enabledIndices.indexOf(this.itemIndex);
101
+ if (currentPosition === -1) {
102
+ return direction === 1 ? enabledIndices[0] : enabledIndices[enabledIndices.length - 1];
103
+ }
104
+ const nextPosition = (currentPosition + direction + enabledIndices.length) % enabledIndices.length;
105
+ return enabledIndices[nextPosition];
106
+ }
107
+ toggleDropdown = (event) => {
108
+ event.stopPropagation();
109
+ if (this.disabled || this.items.length === 0) {
110
+ return;
111
+ }
112
+ this.isOpen = !this.isOpen;
113
+ };
114
+ selectItem(item, event) {
115
+ event?.stopPropagation();
116
+ if (!item || item.disabled) {
117
+ return;
118
+ }
119
+ this.click.emit(item.value);
120
+ this.closeDropdown();
121
+ }
122
+ getTriggerClasses(preset, size, disabled, isOpen) {
123
+ const classes = [
124
+ 'sd-dropdown-button__trigger',
125
+ `sd-dropdown-button__trigger--${preset}`,
126
+ `sd-dropdown-button__trigger--${size}`,
127
+ ];
128
+ if (disabled) {
129
+ classes.push('sd-dropdown-button__trigger--disabled');
130
+ }
131
+ if (isOpen) {
132
+ classes.push('sd-dropdown-button__trigger--open');
133
+ }
134
+ return classes.join(' ');
135
+ }
136
+ getMenuItemClasses(isActive, isDisabled) {
137
+ const classes = ['sd-dropdown-button__menu-item'];
138
+ if (isActive) {
139
+ classes.push('sd-dropdown-button__menu-item--active');
140
+ }
141
+ if (isDisabled) {
142
+ classes.push('sd-dropdown-button__menu-item--disabled');
143
+ }
144
+ return classes.join(' ');
145
+ }
146
+ renderDropdown(preset) {
147
+ if (!this.isOpen || !this.triggerRef)
148
+ return null;
149
+ return (h("sd-portal", { open: this.isOpen, parentRef: this.triggerRef, onSdClose: this.closeDropdown }, h("div", { class: "sd-dropdown-button__menu", role: "menu", ref: el => (this.menuRef = el), style: {
150
+ '--sd-dropdown-button-menu-item-color': PRESET_MENU_ITEM_COLORS[preset],
151
+ '--sd-dropdown-button-menu-item-active-bg': PRESET_MENU_ITEM_ACTIVE_BACKGROUNDS[preset],
152
+ '--sd-dropdown-button-menu-item-active-color': PRESET_MENU_ITEM_ACTIVE_COLORS[preset],
153
+ '--sd-dropdown-button-menu-border': PRESET_BORDER_COLORS[preset] === 'transparent'
154
+ ? PRESET_DIVIDER_COLORS[preset]
155
+ : PRESET_BORDER_COLORS[preset],
156
+ } }, this.items.map((item, index) => {
157
+ const isActive = this.itemIndex === index && !item.disabled;
158
+ const iconColor = item.disabled
159
+ ? DROPDOWN_DISABLED_CONTENT
160
+ : isActive
161
+ ? PRESET_MENU_ITEM_ACTIVE_COLORS[preset]
162
+ : PRESET_MENU_ITEM_COLORS[preset];
163
+ return (h("button", { type: "button", role: "menuitem", class: this.getMenuItemClasses(isActive, Boolean(item.disabled)), disabled: item.disabled, onClick: event => this.selectItem(item, event), onMouseEnter: () => {
164
+ if (!item.disabled) {
165
+ this.itemIndex = index;
166
+ }
167
+ } }, item.icon && (h("sd-icon", { class: "sd-dropdown-button__menu-item-icon", name: item.icon, size: 12, color: iconColor })), h("span", { class: "sd-dropdown-button__menu-item-label", innerHTML: item.label })));
168
+ }))));
169
+ }
170
+ render() {
171
+ const { config, preset } = this.resolvedConfig;
172
+ const chevronColor = this.disabled ? DROPDOWN_DISABLED_CONTENT : PRESET_CONTENT_COLORS[preset];
173
+ return (h("div", { key: '0bd454e599c8eb56b88f63a5f74e1d9db4b568f9', class: "sd-dropdown-button" }, h("button", { key: '804dd19dc0d49969e89d0742e71f61fe610e3f3d', type: "button", class: this.getTriggerClasses(preset, config.size, this.disabled, this.isOpen), disabled: this.disabled, "aria-haspopup": "menu", "aria-expanded": String(this.isOpen), onClick: this.toggleDropdown, ref: el => (this.triggerRef = el), style: {
174
+ '--sd-dropdown-button-min-width': `${DROPDOWN_BUTTON_MIN_WIDTHS[config.size]}px`,
175
+ '--sd-dropdown-button-bg': config.color,
176
+ '--sd-dropdown-button-bg-hover': PRESET_HOVER_BACKGROUNDS[preset],
177
+ '--sd-dropdown-button-border': PRESET_BORDER_COLORS[preset],
178
+ '--sd-dropdown-button-content': PRESET_CONTENT_COLORS[preset],
179
+ '--sd-dropdown-button-divider': PRESET_DIVIDER_COLORS[preset],
180
+ '--sd-dropdown-button-accent': BUTTON_FOCUS_RING_COLOR,
181
+ '--sd-dropdown-button-disabled-bg': DROPDOWN_DISABLED_BACKGROUND,
182
+ '--sd-dropdown-button-disabled-content': DROPDOWN_DISABLED_CONTENT,
183
+ '--sd-dropdown-button-disabled-border': DROPDOWN_DISABLED_BORDER,
184
+ } }, h("span", { key: '038dd3ad8c7c07d3ebb435a6fec27dd31b8fdba0', class: "sd-dropdown-button__trigger-label" }, this.label), h("span", { key: 'c5c2c0fffa200a4772d7e448e1a1b95745be4faa', class: "sd-dropdown-button__trigger-divider", "aria-hidden": "true" }), h("span", { key: 'a6f1db25929c10b9dc9ccbae2655eed3c67dff22', class: "sd-dropdown-button__trigger-icon", "aria-hidden": "true" }, h("sd-icon", { key: '4c1533a7efd5a7d695e460bad9dfc2b8a7fe5740', name: this.isOpen ? 'arrowUp' : 'arrowDown', size: 12, color: chevronColor }))), this.renderDropdown(preset)));
185
+ }
186
+ static get is() { return "sd-dropdown-button"; }
187
+ static get originalStyleUrls() {
188
+ return {
189
+ "$": ["sd-dropdown-button.scss"]
190
+ };
191
+ }
192
+ static get styleUrls() {
193
+ return {
194
+ "$": ["sd-dropdown-button.css"]
195
+ };
196
+ }
197
+ static get properties() {
198
+ return {
199
+ "name": {
200
+ "type": "string",
201
+ "mutable": false,
202
+ "complexType": {
203
+ "original": "DropdownButtonName",
204
+ "resolved": "\"danger_md\" | \"danger_outline_md\" | \"danger_outline_sm\" | \"danger_outline_xs\" | \"danger_sm\" | \"danger_xs\" | \"neutral_outline_md\" | \"neutral_outline_sm\" | \"neutral_outline_xs\" | \"primary_md\" | \"primary_outline_md\" | \"primary_outline_sm\" | \"primary_outline_xs\" | \"primary_sm\" | \"primary_xs\" | \"secondary_md\" | \"secondary_sm\" | \"secondary_xs\"",
205
+ "references": {
206
+ "DropdownButtonName": {
207
+ "location": "import",
208
+ "path": "./sd-dropdown-button.config",
209
+ "id": "src/components/sd-dropdown-button/sd-dropdown-button.config.ts::DropdownButtonName",
210
+ "referenceLocation": "DropdownButtonName"
211
+ }
212
+ }
213
+ },
214
+ "required": false,
215
+ "optional": false,
216
+ "docs": {
217
+ "tags": [],
218
+ "text": ""
219
+ },
220
+ "getter": false,
221
+ "setter": false,
222
+ "reflect": false,
223
+ "attribute": "name",
224
+ "defaultValue": "'primary_sm'"
225
+ },
226
+ "label": {
227
+ "type": "string",
228
+ "mutable": false,
229
+ "complexType": {
230
+ "original": "string",
231
+ "resolved": "string",
232
+ "references": {}
233
+ },
234
+ "required": false,
235
+ "optional": false,
236
+ "docs": {
237
+ "tags": [],
238
+ "text": ""
239
+ },
240
+ "getter": false,
241
+ "setter": false,
242
+ "reflect": false,
243
+ "attribute": "label",
244
+ "defaultValue": "''"
245
+ },
246
+ "items": {
247
+ "type": "unknown",
248
+ "mutable": false,
249
+ "complexType": {
250
+ "original": "DropdownButtonItem[]",
251
+ "resolved": "DropdownButtonItem[]",
252
+ "references": {
253
+ "DropdownButtonItem": {
254
+ "location": "import",
255
+ "path": "./sd-dropdown-button.config",
256
+ "id": "src/components/sd-dropdown-button/sd-dropdown-button.config.ts::DropdownButtonItem",
257
+ "referenceLocation": "DropdownButtonItem"
258
+ }
259
+ }
260
+ },
261
+ "required": false,
262
+ "optional": false,
263
+ "docs": {
264
+ "tags": [],
265
+ "text": ""
266
+ },
267
+ "getter": false,
268
+ "setter": false,
269
+ "defaultValue": "[]"
270
+ },
271
+ "disabled": {
272
+ "type": "boolean",
273
+ "mutable": false,
274
+ "complexType": {
275
+ "original": "boolean",
276
+ "resolved": "boolean",
277
+ "references": {}
278
+ },
279
+ "required": false,
280
+ "optional": false,
281
+ "docs": {
282
+ "tags": [],
283
+ "text": ""
284
+ },
285
+ "getter": false,
286
+ "setter": false,
287
+ "reflect": false,
288
+ "attribute": "disabled",
289
+ "defaultValue": "false"
290
+ }
291
+ };
292
+ }
293
+ static get states() {
294
+ return {
295
+ "isOpen": {},
296
+ "itemIndex": {}
297
+ };
298
+ }
299
+ static get events() {
300
+ return [{
301
+ "method": "click",
302
+ "name": "sdClick",
303
+ "bubbles": true,
304
+ "cancelable": true,
305
+ "composed": true,
306
+ "docs": {
307
+ "tags": [],
308
+ "text": ""
309
+ },
310
+ "complexType": {
311
+ "original": "DropdownButtonValue",
312
+ "resolved": "number | string",
313
+ "references": {
314
+ "DropdownButtonValue": {
315
+ "location": "import",
316
+ "path": "./sd-dropdown-button.config",
317
+ "id": "src/components/sd-dropdown-button/sd-dropdown-button.config.ts::DropdownButtonValue",
318
+ "referenceLocation": "DropdownButtonValue"
319
+ }
320
+ }
321
+ }
322
+ }, {
323
+ "method": "dropDownShow",
324
+ "name": "sdDropDownShow",
325
+ "bubbles": true,
326
+ "cancelable": true,
327
+ "composed": true,
328
+ "docs": {
329
+ "tags": [],
330
+ "text": ""
331
+ },
332
+ "complexType": {
333
+ "original": "{ isOpen: boolean }",
334
+ "resolved": "{ isOpen: boolean; }",
335
+ "references": {}
336
+ }
337
+ }];
338
+ }
339
+ static get methods() {
340
+ return {
341
+ "sdOpen": {
342
+ "complexType": {
343
+ "signature": "() => Promise<void>",
344
+ "parameters": [],
345
+ "references": {
346
+ "Promise": {
347
+ "location": "global",
348
+ "id": "global::Promise"
349
+ }
350
+ },
351
+ "return": "Promise<void>"
352
+ },
353
+ "docs": {
354
+ "text": "",
355
+ "tags": []
356
+ }
357
+ },
358
+ "sdClose": {
359
+ "complexType": {
360
+ "signature": "() => Promise<void>",
361
+ "parameters": [],
362
+ "references": {
363
+ "Promise": {
364
+ "location": "global",
365
+ "id": "global::Promise"
366
+ }
367
+ },
368
+ "return": "Promise<void>"
369
+ },
370
+ "docs": {
371
+ "text": "",
372
+ "tags": []
373
+ }
374
+ }
375
+ };
376
+ }
377
+ static get elementRef() { return "el"; }
378
+ static get watchers() {
379
+ return [{
380
+ "propName": "isOpen",
381
+ "methodName": "handleOpenChange"
382
+ }];
383
+ }
384
+ }
@@ -114,15 +114,15 @@ export class SdField {
114
114
  }
115
115
  }
116
116
  render() {
117
- return (h("div", { key: '3c69abe493110b5665795706a9ae0e525f213aca', class: {
117
+ return (h("div", { key: '83d20191373b759f18d25e25330ead65217dea4f', class: {
118
118
  'sd-field': true,
119
119
  'sd-field--has-label': !!this.label,
120
120
  'sd-field--has-label-inside': !!this.label && this.insideLabel,
121
121
  [this.fieldStatus]: !!this.fieldStatus,
122
- } }, h("div", { key: 'decc6821b7172f5ecc2343472014c08674725904', class: "sd-field__wrapper" }, this.renderLabel(this.label), h("div", { key: 'ca5e93f049db10ecaaaab091fdf394ac4b55e292', class: {
122
+ } }, h("div", { key: '2f04e19997c077c32843173c85dc04840f8fa0f6', class: "sd-field__wrapper" }, this.renderLabel(this.label), h("div", { key: 'c7fa5c334cd4dc0b99919850b3059a35a77ea5c6', class: {
123
123
  'sd-field__control': true,
124
124
  'sd-field__control--label-inside ': !!this.label && this.insideLabel,
125
- } }, h("slot", { key: '7ee38983d32985f4b4a035830bcdca0e14b2cf71' }))), this.errorMsg && h("div", { key: 'c2d6ef860ced48657b906806f2618594b094ea79', class: "sd-field__error-message" }, this.errorMsg)));
125
+ } }, h("slot", { key: '15f7bd40ca6ed1667f97f6362be914e203c491af' }))), this.errorMsg && h("div", { key: 'd940bca4d3074e8051bc5392aad36be4c58f88af', class: "sd-field__error-message" }, this.errorMsg)));
126
126
  }
127
127
  renderLabel(label) {
128
128
  if (!label)
@@ -91,15 +91,15 @@ export class SdFilePicker {
91
91
  render() {
92
92
  const hasFiles = this.hasFiles();
93
93
  const displayText = this.getDisplayText();
94
- return (h("div", { key: '659ab6f0e1fedadfbef1838def391aab28ae6e62', class: {
94
+ return (h("div", { key: 'dfdb1f7cc4793c23cfb1ae97464981833263421e', class: {
95
95
  'sd-file-picker': true,
96
96
  [this.getStatusClass()]: true,
97
97
  'sd-file-picker--inline': this.inline,
98
- }, onClick: this.handleClick, onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false) }, h("input", { key: '55ffb6c1b3ff502b555cb48a31301ac9b30701a4', ref: el => (this.fileInputRef = el), type: "file", class: "sd-file-picker__input", disabled: this.disabled, multiple: this.multiple, accept: this.accept, onInput: this.handleFileChange, "aria-label": this.placeholder }), h("sd-icon", { key: 'b7755876e0f327d15a886a86592cd59bd3435202', name: "attachFile", size: 16, color: this.getIconColor(), class: "sd-file-picker__icon" }), h("div", { key: 'e1e2004c64166eb2b611c48ca51cc793fb90434c', ref: el => (this.fileNamesRef = el), class: {
98
+ }, onClick: this.handleClick, onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false) }, h("input", { key: 'bd4a072a517391b63116de1561aaf6606b1a8343', ref: el => (this.fileInputRef = el), type: "file", class: "sd-file-picker__input", disabled: this.disabled, multiple: this.multiple, accept: this.accept, onInput: this.handleFileChange, "aria-label": this.placeholder }), h("sd-icon", { key: '12280a64236d3fd9b63a9d15be11426efdd81629', name: "attachFile", size: 16, color: this.getIconColor(), class: "sd-file-picker__icon" }), h("div", { key: '935a7d98ee034d59f16b410eb1495cd009ce6024', ref: el => (this.fileNamesRef = el), class: {
99
99
  'sd-file-picker__text': true,
100
100
  'sd-file-picker__text--placeholder': !hasFiles,
101
101
  'sd-file-picker__text--active': hasFiles,
102
- } }, displayText), !this.disabled && hasFiles && (h("sd-icon", { key: '0a3c122382cab2148a88fbd4fdc9ff1f7cde757b', name: "close", size: 12, color: "#888888", class: "sd-file-picker__clear-icon", onClick: this.handleClear })), this.showTooltip && hasFiles && this.hovered && (h("div", { key: '628717309bf16c0906e9ac21ecbf14a416eea8d8', class: "sd-file-picker__tooltip" }, displayText))));
102
+ } }, displayText), !this.disabled && hasFiles && (h("sd-icon", { key: '08f38161be5d1754b4f5b1bba185a29976ffd1dd', name: "close", size: 12, color: "#888888", class: "sd-file-picker__clear-icon", onClick: this.handleClear })), this.showTooltip && hasFiles && this.hovered && (h("div", { key: 'db6edfa98b3832276b320a6f3b4e195cfaeff4d6', class: "sd-file-picker__tooltip" }, displayText))));
103
103
  }
104
104
  static get is() { return "sd-file-picker"; }
105
105
  static get originalStyleUrls() {
@@ -144,7 +144,7 @@ export class SdFloatingPopover {
144
144
  this.close.emit();
145
145
  }
146
146
  render() {
147
- return h("slot", { key: '2f33d335a7cf00ace576aed610a0e77d711a5b10' });
147
+ return h("slot", { key: 'd8bdd90d00b52153d1144bbea871ace4888e37e4' });
148
148
  }
149
149
  static get is() { return "sd-floating-portal"; }
150
150
  static get originalStyleUrls() {