@statistikzh/leu 0.0.2

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 (141) hide show
  1. package/.editorconfig +29 -0
  2. package/.eslintrc.json +27 -0
  3. package/.github/workflows/publish.yml +19 -0
  4. package/.github/workflows/release-please.yml +19 -0
  5. package/.github/workflows/test.yml +38 -0
  6. package/.husky/commit-msg +4 -0
  7. package/.husky/pre-commit +4 -0
  8. package/.prettierignore +1 -0
  9. package/.storybook/main.js +11 -0
  10. package/.storybook/preview-head.html +5 -0
  11. package/.storybook/preview.js +23 -0
  12. package/CHANGELOG.md +63 -0
  13. package/CODE_OF_CONDUCT.md +128 -0
  14. package/CONTRIBUTING.md +31 -0
  15. package/LICENSE +21 -0
  16. package/README.md +170 -0
  17. package/commitlint.config.cjs +1 -0
  18. package/dist/Button-83c6df93.js +403 -0
  19. package/dist/Checkbox.js +144 -0
  20. package/dist/CheckboxGroup.js +82 -0
  21. package/dist/Chip-60af1402.js +162 -0
  22. package/dist/ChipGroup.js +79 -0
  23. package/dist/ChipLink.js +46 -0
  24. package/dist/ChipRemovable.js +43 -0
  25. package/dist/ChipSelectable.js +92 -0
  26. package/dist/Input.js +686 -0
  27. package/dist/Radio.js +156 -0
  28. package/dist/RadioGroup.js +194 -0
  29. package/dist/Select.js +859 -0
  30. package/dist/Table-72d305d7.js +506 -0
  31. package/dist/Table.js +8 -0
  32. package/dist/defineElement-47d4f665.js +15 -0
  33. package/dist/icon-b68c7e1e.js +202 -0
  34. package/dist/index.js +21 -0
  35. package/dist/leu-checkbox-group.js +6 -0
  36. package/dist/leu-checkbox.js +6 -0
  37. package/dist/leu-chip-group.js +5 -0
  38. package/dist/leu-chip-link.js +6 -0
  39. package/dist/leu-chip-removable.js +7 -0
  40. package/dist/leu-chip-selectable.js +6 -0
  41. package/dist/leu-input.js +9 -0
  42. package/dist/leu-radio-group.js +6 -0
  43. package/dist/leu-radio.js +5 -0
  44. package/dist/leu-select.js +12 -0
  45. package/dist/leu-table.js +10 -0
  46. package/dist/theme.css +51 -0
  47. package/index.js +10 -0
  48. package/package.json +85 -0
  49. package/postcss.config.cjs +14 -0
  50. package/rollup.config.js +54 -0
  51. package/scripts/generate-component/generate.js +167 -0
  52. package/scripts/generate-component/templates/[Name].js +33 -0
  53. package/scripts/generate-component/templates/[name].css +11 -0
  54. package/scripts/generate-component/templates/[namespace]-[name].js +3 -0
  55. package/scripts/generate-component/templates/stories/[name].stories.js +13 -0
  56. package/scripts/generate-component/templates/test/[name].test.js +22 -0
  57. package/src/components/button/Button.js +150 -0
  58. package/src/components/button/button.css +232 -0
  59. package/src/components/button/leu-button.js +3 -0
  60. package/src/components/button/stories/button.stories.js +333 -0
  61. package/src/components/button/test/button.test.js +22 -0
  62. package/src/components/button-group/ButtonGroup.js +63 -0
  63. package/src/components/button-group/button-group.css +10 -0
  64. package/src/components/button-group/leu-button-group.js +3 -0
  65. package/src/components/button-group/stories/button-group.stories.js +41 -0
  66. package/src/components/button-group/test/button-group.test.js +22 -0
  67. package/src/components/checkbox/Checkbox.js +142 -0
  68. package/src/components/checkbox/CheckboxGroup.js +80 -0
  69. package/src/components/checkbox/leu-checkbox-group.js +3 -0
  70. package/src/components/checkbox/leu-checkbox.js +3 -0
  71. package/src/components/checkbox/stories/checkbox-group.stories.js +52 -0
  72. package/src/components/checkbox/stories/checkbox.stories.js +43 -0
  73. package/src/components/checkbox/test/checkbox.test.js +101 -0
  74. package/src/components/chip/Chip.js +24 -0
  75. package/src/components/chip/ChipGroup.js +71 -0
  76. package/src/components/chip/ChipLink.js +45 -0
  77. package/src/components/chip/ChipRemovable.js +42 -0
  78. package/src/components/chip/ChipSelectable.js +91 -0
  79. package/src/components/chip/chip-group.css +5 -0
  80. package/src/components/chip/chip.css +130 -0
  81. package/src/components/chip/exports.js +10 -0
  82. package/src/components/chip/leu-chip-group.js +3 -0
  83. package/src/components/chip/leu-chip-link.js +3 -0
  84. package/src/components/chip/leu-chip-removable.js +3 -0
  85. package/src/components/chip/leu-chip-selectable.js +3 -0
  86. package/src/components/chip/stories/chip-group.stories.js +99 -0
  87. package/src/components/chip/stories/chip-link.stories.js +37 -0
  88. package/src/components/chip/stories/chip-removable.stories.js +28 -0
  89. package/src/components/chip/stories/chip-selectable.stories.js +46 -0
  90. package/src/components/chip/test/chip.test.js +22 -0
  91. package/src/components/dropdown/Dropdown.js +55 -0
  92. package/src/components/dropdown/dropdown.css +17 -0
  93. package/src/components/dropdown/leu-dropdown.js +3 -0
  94. package/src/components/dropdown/stories/dropdown.stories.js +25 -0
  95. package/src/components/dropdown/test/dropdown.test.js +31 -0
  96. package/src/components/icon/icon.js +201 -0
  97. package/src/components/input/Input.js +421 -0
  98. package/src/components/input/input.css +231 -0
  99. package/src/components/input/leu-input.js +3 -0
  100. package/src/components/input/stories/input.stories.js +185 -0
  101. package/src/components/input/test/input.test.js +22 -0
  102. package/src/components/menu/Menu.js +18 -0
  103. package/src/components/menu/MenuItem.js +95 -0
  104. package/src/components/menu/leu-menu-item.js +3 -0
  105. package/src/components/menu/leu-menu.js +3 -0
  106. package/src/components/menu/menu-item.css +72 -0
  107. package/src/components/menu/menu.css +14 -0
  108. package/src/components/menu/stories/menu-item.stories.js +51 -0
  109. package/src/components/menu/stories/menu.stories.js +21 -0
  110. package/src/components/menu/test/menu.test.js +22 -0
  111. package/src/components/pagination/Pagination.js +152 -0
  112. package/src/components/pagination/leu-pagination.js +3 -0
  113. package/src/components/pagination/pagination.css +49 -0
  114. package/src/components/pagination/stories/pagination.stories.js +82 -0
  115. package/src/components/pagination/test/pagination.test.js +22 -0
  116. package/src/components/radio/Radio.js +62 -0
  117. package/src/components/radio/RadioGroup.js +193 -0
  118. package/src/components/radio/leu-radio-group.js +3 -0
  119. package/src/components/radio/leu-radio.js +3 -0
  120. package/src/components/radio/radio.css +76 -0
  121. package/src/components/radio/stories/radio-group.stories.js +49 -0
  122. package/src/components/radio/stories/radio.stories.js +48 -0
  123. package/src/components/radio/test/radio.test.js +38 -0
  124. package/src/components/select/Select.js +350 -0
  125. package/src/components/select/leu-select.js +3 -0
  126. package/src/components/select/select.css +215 -0
  127. package/src/components/select/stories/select.stories.js +302 -0
  128. package/src/components/select/test/select.test.js +29 -0
  129. package/src/components/table/Table.js +301 -0
  130. package/src/components/table/leu-table.js +3 -0
  131. package/src/components/table/stories/table.stories.js +116 -0
  132. package/src/components/table/test/table.test.js +36 -0
  133. package/src/lib/defineElement.js +13 -0
  134. package/src/lib/hasSlotController.js +85 -0
  135. package/src/styles/custom-media.css +5 -0
  136. package/src/styles/custom-properties.css +51 -0
  137. package/src/styles/theme.css +1 -0
  138. package/stat_zh.png +0 -0
  139. package/stylelint.config.mjs +21 -0
  140. package/web-dev-server-storybook.config.mjs +19 -0
  141. package/web-test-runner.config.mjs +49 -0
@@ -0,0 +1,350 @@
1
+ import { html, LitElement, nothing } from "lit"
2
+ import { classMap } from "lit/directives/class-map.js"
3
+
4
+ import { map } from "lit/directives/map.js"
5
+ import { ifDefined } from "lit/directives/if-defined.js"
6
+ import { createRef, ref } from "lit/directives/ref.js"
7
+
8
+ import { Icon } from "../icon/icon.js"
9
+ import { defineElement } from "../../lib/defineElement.js"
10
+ import { HasSlotController } from "../../lib/hasSlotController.js"
11
+ import { defineButtonElements } from "../button/Button.js"
12
+ import { defineMenuElements } from "../menu/Menu.js"
13
+ import { defineMenuItemElements } from "../menu/MenuItem.js"
14
+ import { defineInputElements } from "../input/Input.js"
15
+
16
+ import styles from "./select.css"
17
+
18
+ /**
19
+ * @tagname leu-select
20
+ * @slot before - Optional content the appears before the option list
21
+ * @slot after - Optional content the appears after the option list
22
+ */
23
+ export class LeuSelect extends LitElement {
24
+ static styles = styles
25
+
26
+ static get properties() {
27
+ return {
28
+ open: { type: Boolean, attribute: "open" },
29
+
30
+ label: { type: String },
31
+ options: { type: Array },
32
+ value: { type: Array },
33
+ clearable: { type: Boolean, reflect: true },
34
+ disabled: { type: Boolean, reflect: true },
35
+ filterable: { type: Boolean, reflect: true },
36
+ multiple: { type: Boolean, reflect: true },
37
+ optionFilter: { type: String, state: true },
38
+ }
39
+ }
40
+
41
+ static getOptionLabel(option) {
42
+ if (typeof option === "object" && option !== null) {
43
+ return option.label
44
+ }
45
+ return option
46
+ }
47
+
48
+ /**
49
+ * @internal
50
+ */
51
+ hasSlotController = new HasSlotController(this, ["before", "after"])
52
+
53
+ constructor() {
54
+ super()
55
+ this.open = false
56
+ this.clearable = false
57
+ this.value = []
58
+ this.options = []
59
+
60
+ /** @internal */
61
+ this._arrowIcon = Icon("angleDropDown")
62
+
63
+ /** @internal */
64
+ this._clearIcon = Icon("clear")
65
+
66
+ /** @internal */
67
+ this.optionFilter = ""
68
+
69
+ /** @internal */
70
+ this.deferedChangeEvent = false
71
+
72
+ this.menuRef = createRef()
73
+ this.optionFilterRef = createRef()
74
+ this.toggleButtonRef = createRef()
75
+ }
76
+
77
+ updated(changedProperties) {
78
+ if (changedProperties.has("open") && this.open) {
79
+ if (this.multiple) {
80
+ this.optionFilterRef.value.focus()
81
+ } else {
82
+ this.menuRef.value.focus()
83
+ }
84
+ } else if (changedProperties.has("open") && !this.open) {
85
+ this.toggleButtonRef.value.focus()
86
+ }
87
+ }
88
+
89
+ /**
90
+ * @internal
91
+ * @param {KeyboardEvent} e
92
+ */
93
+ handleKeyDown = (event) => {
94
+ if (event.key === "Escape") {
95
+ this.closeDropdown()
96
+ }
97
+ }
98
+
99
+ getDisplayValue(value) {
100
+ if (this.multiple) {
101
+ return value.length === 0 ? `` : `${value.length} gewählt`
102
+ }
103
+
104
+ return LeuSelect.getOptionLabel(value[0])
105
+ }
106
+
107
+ getFilteredOptions() {
108
+ return this.filterable && this.optionFilter.length > 0
109
+ ? this.options.filter((option) => {
110
+ const label = LeuSelect.getOptionLabel(option)
111
+ return label.toLowerCase().includes(this.optionFilter.toLowerCase())
112
+ })
113
+ : this.options
114
+ }
115
+
116
+ emitUpdateEvents() {
117
+ this.emitInputEvent()
118
+ this.emitChangeEvent()
119
+ }
120
+
121
+ emitInputEvent() {
122
+ const inputevent = new CustomEvent("input", {
123
+ composed: true,
124
+ bubbles: true,
125
+ })
126
+ this.dispatchEvent(inputevent)
127
+ }
128
+
129
+ emitChangeEvent() {
130
+ const changeevent = new CustomEvent("change", {
131
+ composed: true,
132
+ bubbles: true,
133
+ })
134
+ this.dispatchEvent(changeevent)
135
+ }
136
+
137
+ clearValue(event) {
138
+ if (!this.disabled) {
139
+ event.stopPropagation()
140
+ this.value = []
141
+ }
142
+
143
+ this.emitUpdateEvents()
144
+ }
145
+
146
+ clearOptionFilter() {
147
+ // refocus before removing the button, otherwise closeDropdown is triggered
148
+ this.optionFilterRef.value.focus()
149
+ this.optionFilter = ""
150
+ }
151
+
152
+ toggleDropdown() {
153
+ if (!this.disabled) {
154
+ this.open = !this.open
155
+ }
156
+ }
157
+
158
+ openDropdown() {
159
+ this.open = true
160
+ }
161
+
162
+ closeDropdown() {
163
+ this.open = false
164
+
165
+ if (this.deferedChangeEvent) {
166
+ this.emitChangeEvent()
167
+ this.deferedChangeEvent = false
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Adds or replaces the given option in the options array.
173
+ *
174
+ * @param {*} option
175
+ */
176
+ selectOption(option) {
177
+ const isSelected = this.isSelected(option)
178
+
179
+ if (this.multiple) {
180
+ this.value = isSelected
181
+ ? this.value.filter((v) => v !== option)
182
+ : this.value.concat(option)
183
+
184
+ this.deferedChangeEvent = true
185
+ } else {
186
+ this.value = isSelected ? [] : [option]
187
+ }
188
+
189
+ this.emitInputEvent()
190
+
191
+ if (!this.multiple) {
192
+ this.closeDropdown()
193
+ }
194
+ }
195
+
196
+ handleApplyClick() {
197
+ this.closeDropdown()
198
+ }
199
+
200
+ handleFilterInput(event) {
201
+ this.optionFilter = event.target.value
202
+ }
203
+
204
+ isSelected(option) {
205
+ return this.value.includes(option)
206
+ }
207
+
208
+ renderMenu() {
209
+ const menuClasses = {
210
+ "select-menu": true,
211
+ multiple: this.multiple,
212
+ }
213
+
214
+ const filteredOptions = this.getFilteredOptions()
215
+
216
+ return html`
217
+ <leu-menu
218
+ role="listbox"
219
+ class=${classMap(menuClasses)}
220
+ aria-multiselectable="${this.multiple}"
221
+ aria-labelledby="select-label"
222
+ ref=${ref(this.menuRef)}
223
+ >
224
+ ${filteredOptions.length > 0
225
+ ? map(this.getFilteredOptions(), (option) => {
226
+ const isSelected = this.isSelected(option)
227
+ let beforeIcon
228
+
229
+ if (this.multiple && isSelected) {
230
+ beforeIcon = "check"
231
+ } else if (this.multiple) {
232
+ beforeIcon = "EMPTY"
233
+ }
234
+
235
+ return html`<leu-menu-item
236
+ before=${ifDefined(beforeIcon)}
237
+ @click=${() => this.selectOption(option)}
238
+ role="option"
239
+ ?active=${isSelected}
240
+ aria-selected=${isSelected}
241
+ >
242
+ ${LeuSelect.getOptionLabel(option)}
243
+ </leu-menu-item>`
244
+ })
245
+ : html`<leu-menu-item disabled>Keine Resultate</leu-menu-item>`}
246
+ </leu-menu>
247
+ `
248
+ }
249
+
250
+ renderFilterInput() {
251
+ if (this.filterable) {
252
+ return html` <leu-input
253
+ class="select-search"
254
+ size="small"
255
+ @input=${this.handleFilterInput}
256
+ clearable
257
+ >Nach Stichwort filtern</leu-input
258
+ >`
259
+ }
260
+
261
+ return nothing
262
+ }
263
+
264
+ renderApplyButton() {
265
+ if (this.multiple) {
266
+ return html`
267
+ <leu-button
268
+ type="button"
269
+ class="apply-button"
270
+ @click=${this.handleApplyClick}
271
+ label="Anwenden"
272
+ fluid
273
+ ></leu-button>
274
+ `
275
+ }
276
+
277
+ return nothing
278
+ }
279
+
280
+ renderToggleButton() {
281
+ const toggleClasses = {
282
+ "select-toggle": true,
283
+ open: this.open,
284
+ filled: this.value.length !== 0 && this.value !== null,
285
+ labeled: this.label !== "",
286
+ }
287
+
288
+ return html`<button
289
+ type="button"
290
+ class=${classMap(toggleClasses)}
291
+ @click=${this.toggleDropdown}
292
+ aria-controls="select-dialog"
293
+ aria-haspopup="dialog"
294
+ aria-expanded="${this.open}"
295
+ role="combobox"
296
+ ref=${ref(this.toggleButtonRef)}
297
+ >
298
+ <span class="label" id="select-label">${this.label}</span>
299
+ <span class="value"> ${this.getDisplayValue(this.value)} </span>
300
+ <span class="arrow-icon"> ${this._arrowIcon} </span>
301
+ ${this.clearable && this.value !== "" && this.value.length !== 0
302
+ ? html`<button
303
+ type="button"
304
+ class="clear-button"
305
+ @click=${this.clearValue}
306
+ aria-label=${`${this.label} zurücksetzen`}
307
+ ?disabled=${this.disabled}
308
+ >
309
+ ${this._clearIcon}
310
+ </button>`
311
+ : nothing}
312
+ </button>`
313
+ }
314
+
315
+ render() {
316
+ const selectClasses = {
317
+ select: true,
318
+ "select--has-before": this.hasSlotController.test("before"),
319
+ "select--has-after": this.hasSlotController.test("after"),
320
+ }
321
+
322
+ return html`<div
323
+ class=${classMap(selectClasses)}
324
+ ?disabled=${this.disabled}
325
+ aria-readonly="${this.disabled}"
326
+ aria-labelledby="select-label"
327
+ @keydown=${this.handleKeyDown}
328
+ >
329
+ ${this.renderToggleButton()}
330
+ <dialog
331
+ id="select-dialog"
332
+ class="select-menu-container"
333
+ ?open=${this.open}
334
+ >
335
+ <slot name="before" class="before"></slot>
336
+ ${this.renderFilterInput()} ${this.renderMenu()}
337
+ ${this.renderApplyButton()}
338
+ <slot name="after" class="after"></slot>
339
+ </dialog>
340
+ </div> `
341
+ }
342
+ }
343
+
344
+ export function defineSelectElements() {
345
+ defineButtonElements()
346
+ defineMenuElements()
347
+ defineMenuItemElements()
348
+ defineInputElements()
349
+ defineElement("select", LeuSelect)
350
+ }
@@ -0,0 +1,3 @@
1
+ import { defineSelectElements } from "./Select.js"
2
+
3
+ defineSelectElements()
@@ -0,0 +1,215 @@
1
+ :host,
2
+ :host * {
3
+ box-sizing: border-box;
4
+ }
5
+
6
+ :host {
7
+ --select-color: var(--leu-color-black-100);
8
+ --select-color-disabled: var(--leu-color-black-20);
9
+ --select-color-invalid: var(--leu-color-func-red);
10
+ --select-color-focus: var(--leu-color-func-cyan);
11
+ --select-border-width: 2px;
12
+
13
+ --select-label-color: var(--leu-color-black-100);
14
+ --select-label-color-disabled: var(--select-color-disabled);
15
+ --select-label-color-empty: var(--leu-color-black-60);
16
+
17
+ --select-option-color: var(--leu-color-black-60);
18
+ --select-option-color-focus: var(--select-color);
19
+
20
+ --select-border-color: var(--leu-color-black-40);
21
+ --select-border-color-focus: var(--select-color-focus);
22
+ --select-border-color-disabled: var(--leu-color-black-20);
23
+ --select-border-color-invalid: var(--select-color-invalid);
24
+
25
+ --select-error-color: var(--leu-color-black-0);
26
+
27
+ --select-clear-color: var(--leu-color-black-60);
28
+
29
+ --select-font-regular: var(--leu-font-regular);
30
+ --select-font-black: var(--leu-font-black);
31
+
32
+ --select-apply-button-color: var(--leu-color-black-100);
33
+ --select-apply-button-color-focus: var(--leu-color-black-80);
34
+ --select-apply-button-font-color: var(--leu-color-black-0);
35
+
36
+ --select-box-shadow-short: var(--leu-box-shadow-short);
37
+ --select-box-shadow-regular: var(--leu-box-shadow-regular);
38
+
39
+ position: relative;
40
+ display: block;
41
+
42
+ font-family: var(--select-font-regular);
43
+ }
44
+
45
+ .select[disabled] {
46
+ --select-color: var(--select-color-disabled);
47
+ --select-color-focus: var(--select-color-disabled);
48
+ --select-border-color: var(--select-border-color-disabled);
49
+ --select-label-color: var(--select-label-color-disabled);
50
+ --select-border-color-focus: var(--select-border-color-disabled);
51
+ --select-clear-color: var(--select-color-disabled);
52
+ }
53
+
54
+ .select-toggle {
55
+ min-height: 4.5rem;
56
+ display: block;
57
+ width: 100%;
58
+
59
+ appearance: none;
60
+ border: var(--select-border-width) solid var(--select-border-color);
61
+ border-radius: 2px;
62
+ font-size: 1rem;
63
+ line-height: 1.5;
64
+ padding: 1.375rem 3rem 1.375rem 1rem;
65
+
66
+ background: none;
67
+ overflow: hidden;
68
+ text-overflow: ellipsis;
69
+ white-space: nowrap;
70
+
71
+ cursor: pointer;
72
+ text-align: left;
73
+ }
74
+
75
+ .select-toggle:hover,
76
+ .select-toggle:focus {
77
+ border-color: var(--select-border-color-focus);
78
+ }
79
+
80
+ .select-toggle.filled.labeled {
81
+ padding-bottom: 0.75rem;
82
+ padding-top: 2rem;
83
+ color: var(--select-color);
84
+ }
85
+
86
+ .select-toggle:focus-visible {
87
+ outline: var(--select-border-width) solid var(--select-border-color-focus);
88
+ outline-offset: 2px;
89
+ }
90
+
91
+ .label {
92
+ position: absolute;
93
+ top: 1.5rem;
94
+ transition: top 0.1s ease;
95
+ font-family: var(--select-font-regular);
96
+ }
97
+
98
+ .clear-button {
99
+ --_length: 1.5rem;
100
+
101
+ width: var(--_length);
102
+ height: var(--_length);
103
+ padding: 0;
104
+
105
+ position: absolute;
106
+ top: calc(50% - var(--_length) / 2);
107
+ right: 2.6rem;
108
+
109
+ cursor: pointer;
110
+
111
+ background: none;
112
+ color: var(--select-clear-color);
113
+ border: none;
114
+
115
+ /* border-radius is only defined for a nice focus outline */
116
+ border-radius: 2px;
117
+ }
118
+
119
+ .clear-button:focus-visible {
120
+ outline: var(--select-border-width) solid var(--select-border-color-focus);
121
+ outline-offset: 2px;
122
+ }
123
+
124
+ .select[disabled] .select-toggle,
125
+ .select[disabled] .clear-button {
126
+ cursor: unset;
127
+ }
128
+
129
+ .select[disabled] .label {
130
+ color: var(--select-label-color);
131
+ }
132
+
133
+ .select-toggle.open .label,
134
+ .select-toggle.filled .label,
135
+ .select:not([disabled]) .select-toggle:focus .label,
136
+ .select:not([disabled]) .select-toggle:active:not([disabled]) .label {
137
+ color: var(--select-label-color);
138
+ font-family: var(--select-font-black);
139
+ font-size: 0.75rem;
140
+
141
+ top: 0.875rem;
142
+
143
+ transition: top 0.1s ease;
144
+ }
145
+
146
+ .arrow-icon {
147
+ --_length: 1.5rem;
148
+
149
+ width: var(--_length);
150
+ height: var(--_length);
151
+ padding: 0;
152
+
153
+ position: absolute;
154
+ top: calc(50% - var(--_length) / 2);
155
+ right: 1rem;
156
+
157
+ transform: rotate(0deg);
158
+ transition: transform 0.25s ease;
159
+
160
+ color: var(--select-color);
161
+ }
162
+
163
+ .select-toggle.open .arrow-icon {
164
+ transform: rotate(180deg);
165
+ }
166
+
167
+ .select-menu-container {
168
+ border-radius: 1px;
169
+ position: absolute;
170
+ left: 0;
171
+ width: 100%;
172
+ background-color: white;
173
+ border: 0 solid black;
174
+ padding: 0;
175
+ margin: 0;
176
+ top: calc(100% + 2px);
177
+ z-index: 10;
178
+ box-shadow: var(--select-box-shadow-regular), var(--select-box-shadow-short);
179
+ overflow: auto;
180
+ }
181
+
182
+ .select-menu {
183
+ display: block;
184
+ padding: 0;
185
+ margin: 0;
186
+ overflow: auto;
187
+ max-height: 24rem;
188
+ }
189
+
190
+ .select-menu.multiple {
191
+ max-height: 21rem;
192
+ }
193
+
194
+ .before,
195
+ .after {
196
+ display: block;
197
+ margin: 0.75rem;
198
+ }
199
+
200
+ .select:not(.select--has-before) .before {
201
+ display: none;
202
+ }
203
+
204
+ .select:not(.select--has-after) .after {
205
+ display: none;
206
+ }
207
+
208
+ .apply-button {
209
+ display: block;
210
+ margin: 0.75rem;
211
+ }
212
+
213
+ .select-search {
214
+ margin: 0.75rem;
215
+ }