@awes-io/ui 2.107.0 → 2.108.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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,29 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.108.1](https://github.com/awes-io/client/compare/@awes-io/ui@2.108.0...@awes-io/ui@2.108.1) (2024-08-07)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **aw-code:** auto suggestion pastes all digits ([0032b66](https://github.com/awes-io/client/commit/0032b6643f4075839132e2c7c9847520ba8611fe))
12
+
13
+
14
+
15
+
16
+
17
+ # [2.108.0](https://github.com/awes-io/client/compare/@awes-io/ui@2.107.0...@awes-io/ui@2.108.0) (2024-07-30)
18
+
19
+
20
+ ### Features
21
+
22
+ * **aw-code:** component style updated ([dbd8ce2](https://github.com/awes-io/client/commit/dbd8ce2b3e8d6a8b6b3755cf2172b89433e810df))
23
+ * update menu layout ([89ee43f](https://github.com/awes-io/client/commit/89ee43ffe8bd9f23118a1f57220665c2c898c823))
24
+
25
+
26
+
27
+
28
+
6
29
  # [2.107.0](https://github.com/awes-io/client/compare/@awes-io/ui@2.106.2...@awes-io/ui@2.107.0) (2024-07-12)
7
30
 
8
31
 
@@ -27,7 +27,7 @@
27
27
 
28
28
  @import './chip.css';
29
29
  @import './chip-select';
30
-
30
+ @import './code.css';
31
31
  @import './cropper.css';
32
32
  @import './chart.css';
33
33
 
@@ -1,19 +1,39 @@
1
1
  .aw-badge {
2
+ vertical-align: middle;
3
+
4
+ &__pulse {
5
+ flex: none;
6
+ background: currentColor;
7
+ width: 0.25rem;
8
+ height: 0.25rem;
9
+ border-radius: 100%;
10
+ animation: pulse 1s infinite alternate;
11
+ }
12
+
2
13
  &__text {
3
14
  display: inline-flex;
4
15
  align-items: center;
5
16
  justify-content: center;
6
17
 
7
- min-height: 1.375rem;
8
- min-width: 1.375rem;
9
- padding: theme('spacing.1', 0.25rem) 0;
10
- margin: 0 theme('spacing.1', 0.25rem);
18
+ min-height: 1.5rem;
19
+ min-width: 1.5rem;
20
+ padding: 0 0.5rem;
21
+ margin: 0;
11
22
 
12
- border-radius: 999rem;
23
+ border-radius: 0.25rem;
13
24
  whitespace: no-wrap;
14
25
 
15
- font-size: theme('fontSize.xs', 0.75rem);
16
- line-height: 1;
17
- font-weight: 600;
26
+ font-size: 0.625rem;
27
+ line-height: 1.25rem;
28
+ font-weight: 700;
29
+ }
30
+ }
31
+
32
+ @keyframes pulse {
33
+ 0% {
34
+ transform: scale(1);
35
+ }
36
+ 100% {
37
+ transform: scale(1.5);
18
38
  }
19
39
  }
@@ -0,0 +1,21 @@
1
+ .aw-code {
2
+ &__wrapper {
3
+ display: flex;
4
+ align-items: center;
5
+ gap: 0.5rem;
6
+
7
+ &--compact {
8
+ justify-content: center;
9
+ }
10
+ }
11
+
12
+ &__item {
13
+ &--compact {
14
+ max-width: 3.5rem;
15
+ }
16
+ /* &--filled.aw-text-field,
17
+ &--filled .aw-text-field__element {
18
+ background-color: var(--c-mono-900);
19
+ } */
20
+ }
21
+ }
@@ -5,16 +5,38 @@
5
5
  min-height: var(--viewport-height, 100vh);
6
6
  padding-bottom: 9.5rem;
7
7
 
8
+ &__buttons {
9
+ display: flex;
10
+ justify-content: space-between;
11
+ gap: 1rem;
12
+ padding: 0.5rem 1.5rem 0;
13
+ padding-top: calc(0.5rem + env(safe-area-inset-top, 0px));
14
+ }
15
+
16
+ &__user-profile {
17
+ position: relative;
18
+ padding-bottom: 2.5rem;
19
+
20
+ &:after {
21
+ @apply bg-mono-800;
22
+ content: '';
23
+ display: block;
24
+ height: 1px;
25
+
26
+ position: absolute;
27
+ bottom: calc(0.75rem - 1px);
28
+ left: 1.5rem;
29
+ right: 1.5rem;
30
+ }
31
+ }
32
+
8
33
  &__profile {
9
34
  display: flex;
10
35
  justify-content: center;
11
36
  align-items: center;
12
37
  flex-direction: column;
13
38
 
14
- background: var(--c-surface);
15
- border-radius: 0.9375rem;
16
- padding: 2rem 1.5rem 1.5rem;
17
- padding-top: calc(2rem + env(safe-area-inset-top, 0px));
39
+ padding: 1rem 1.5rem 1rem;
18
40
  }
19
41
 
20
42
  &__theme {
@@ -24,7 +46,7 @@
24
46
  align-items: center;
25
47
  position: relative;
26
48
 
27
- padding: 0.8125rem 1.5rem;
49
+ padding: 0.75rem 1.5rem;
28
50
 
29
51
  &-icon {
30
52
  color: var(--c-mono-300);
@@ -43,7 +65,7 @@
43
65
  padding-bottom: 0;
44
66
 
45
67
  .aw-switch-field__switch {
46
- margin: 0.1875rem;
68
+ margin: 0 0 0 0.1875rem;
47
69
  }
48
70
  }
49
71
  }
@@ -1,9 +1,10 @@
1
1
  .aw-refresh-wrapper {
2
2
  &__loader {
3
- display: flex;
4
- justify-content: center;
5
- align-items: center;
6
- width: 100%;
7
- z-index: 9999;
8
- }
3
+ fill: currentColor;
4
+ display: flex;
5
+ justify-content: center;
6
+ align-items: center;
7
+ width: 100%;
8
+ z-index: 9999;
9
+ }
9
10
  }
@@ -57,9 +57,8 @@
57
57
  display: flex;
58
58
  align-items: center;
59
59
 
60
- padding: 0.4375rem 1rem;
60
+ padding: 0.5rem 1rem;
61
61
  color: var(--c-on-surface);
62
- border-bottom-width: 1px;
63
62
 
64
63
  &-icon {
65
64
  color: var(--c-mono-400);
@@ -85,7 +85,9 @@ export const ICONS = {
85
85
  warning: [
86
86
  'M12 14.9c.47 0 .86-.4.86-.87V8.88a.86.86 0 0 0-1.72 0v5.15c0 .48.39.86.86.86ZM12 18.33a.86.86 0 1 0 0-1.72.86.86 0 0 0 0 1.72Z',
87
87
  'M9 3.75a3.44 3.44 0 0 1 6 0v.01l7.56 13.75a3.43 3.43 0 0 1-3 5.12H4.44a3.44 3.44 0 0 1-3-5.12L9 3.76Zm1.5.84L2.94 18.34a1.72 1.72 0 0 0 1.5 2.56h15.12a1.72 1.72 0 0 0 1.5-2.55v-.01L13.5 4.59a1.72 1.72 0 0 0-3 0Z'
88
- ]
88
+ ],
89
+ profile:
90
+ 'M8.965 13.132c-1.907-1.229-3.012-2.93-3.095-5.202-.061-1.706.53-3.197 1.707-4.43a6.134 6.134 0 0 1 8.763-.2c1.445 1.397 2.082 3.134 1.866 5.134-.216 2-1.26 3.51-2.94 4.631.231.087.432.165.632.242a10.198 10.198 0 0 1 3.758 2.518 10.155 10.155 0 0 1 2.811 7.016.71.71 0 0 1-.72.714.713.713 0 0 1-.714-.714 8.77 8.77 0 0 0-.406-2.657 8.665 8.665 0 0 0-2.426-3.814 8.652 8.652 0 0 0-4.323-2.17 8.717 8.717 0 0 0-2.451-.117c-1.712.164-3.26.76-4.61 1.83-1.635 1.29-2.69 2.95-3.162 4.985a9.06 9.06 0 0 0-.221 1.933c-.005.303-.149.53-.421.647-.273.124-.535.077-.766-.113-.185-.159-.247-.37-.247-.606a10.173 10.173 0 0 1 1.167-4.631 10.27 10.27 0 0 1 2.23-2.868 10.417 10.417 0 0 1 3.408-2.04.448.448 0 0 1 .16-.088Zm7.843-5.377a4.734 4.734 0 0 0-4.672-4.76 4.75 4.75 0 0 0-4.842 4.75 4.741 4.741 0 0 0 4.683 4.765 4.73 4.73 0 0 0 4.831-4.755Z'
89
91
  }
90
92
 
91
93
  /* export const ICONS = {
@@ -23,6 +23,7 @@
23
23
  @load="onLoad"
24
24
  @error="onLoadError"
25
25
  />
26
+
26
27
  <span
27
28
  v-if="
28
29
  (imageError || !src) &&
@@ -17,13 +17,18 @@
17
17
  :class="{ 'px-2': props.text }"
18
18
  class="aw-badge__text"
19
19
  >
20
- {{ props.text }}
21
- <Component
22
- :is="$options.components.AwIcon"
23
- v-if="props.icon"
24
- :name="props.icon"
25
- size="14"
26
- />
20
+ <span v-if="props.pulse" class="aw-badge__pulse" />
21
+
22
+ <template v-else>
23
+ {{ props.text }}
24
+
25
+ <Component
26
+ :is="$options.components.AwIcon"
27
+ v-if="props.icon"
28
+ :name="props.icon"
29
+ size="14"
30
+ />
31
+ </template>
27
32
  </span>
28
33
  </span>
29
34
  </template>
@@ -61,7 +66,9 @@ export default {
61
66
  hideIfEmpty: {
62
67
  type: Boolean,
63
68
  default: false
64
- }
69
+ },
70
+
71
+ pulse: Boolean
65
72
  }
66
73
  }
67
74
  </script>
@@ -1,9 +1,5 @@
1
1
  <template>
2
- <div
3
- :class="wrapperClasses"
4
- v-tooltip.show.prepend="errorTooltip"
5
- class="flex items-center -mx-1"
6
- >
2
+ <div class="aw-code" v-tooltip.show.prepend="errorTooltip">
7
3
  <input
8
4
  class="sr-only"
9
5
  v-bind="$attrs"
@@ -12,31 +8,47 @@
12
8
  ref="element"
13
9
  tabindex="-1"
14
10
  />
15
- <template v-for="(char, i) in pattern">
16
- <span v-if="char === '-'" :key="`d-${i}`" class="mx-1">-</span>
17
- <div v-else :key="`i-${i}`" class="mx-1 flex-1">
18
- <input
19
- ref="fields"
20
- type="tel"
21
- inputmode="numeric"
22
- pattern="[0-9]*"
23
- maxlength="1"
24
- autocomplete="off"
25
- :value="codeValue[i]"
26
- :class="[elClasses.element, 'text-center p-3']"
27
- v-bind="skipAttr"
28
- @input="_onInput($event, i)"
29
- @keydown.left="_focus($event.target, -1)"
30
- @keydown.right="_focus($event.target)"
31
- @keydown.backspace="_focus($event.target, -1)"
32
- @paste.prevent="_onPaste"
33
- />
34
- </div>
35
- </template>
11
+ <div
12
+ class="aw-code__wrapper"
13
+ :class="{ 'aw-code__wrapper--compact': compact }"
14
+ >
15
+ <template v-for="(char, i) in pattern">
16
+ <span v-if="char === '-'" :key="`d-${i}`">-</span>
17
+ <div
18
+ v-else
19
+ :key="`i-${i}`"
20
+ class="aw-code__item"
21
+ :class="[
22
+ wrapperClasses,
23
+ {
24
+ 'aw-code__item--filled': !!codeValue[i],
25
+ 'aw-code__item--compact': compact
26
+ }
27
+ ]"
28
+ >
29
+ <input
30
+ ref="fields"
31
+ type="tel"
32
+ inputmode="numeric"
33
+ pattern="[0-9]*"
34
+ autocomplete="off"
35
+ :value="codeValue[i]"
36
+ :class="[elClasses.element, 'text-center p-3']"
37
+ v-bind="skipAttr"
38
+ @input="_onInput($event, i)"
39
+ @keydown.left="_focus($event.target, -1)"
40
+ @keydown.right="_focus($event.target)"
41
+ @keydown.backspace="_focus($event.target, -1)"
42
+ @paste.prevent="_onPaste"
43
+ />
44
+ </div>
45
+ </template>
46
+ </div>
36
47
  </div>
37
48
  </template>
38
49
 
39
50
  <script>
51
+ import { clamp } from 'rambdax'
40
52
  import { conf } from '@AwUtils/component'
41
53
  import { getBemClasses } from '@AwUtils/css'
42
54
  import { AwCode as _config } from '@AwConfig'
@@ -45,6 +57,8 @@ import fieldMixin from '@AwMixins/field'
45
57
 
46
58
  const SPACER_RE = /-/g
47
59
 
60
+ const MAX_LENGTH = 1
61
+
48
62
  export default {
49
63
  name: 'AwCode',
50
64
 
@@ -65,6 +79,13 @@ export default {
65
79
  default() {
66
80
  return conf(this, 'pattern')
67
81
  }
82
+ },
83
+
84
+ compact: {
85
+ type: Boolean,
86
+ default() {
87
+ return conf(this, 'compact')
88
+ }
68
89
  }
69
90
  },
70
91
 
@@ -140,15 +161,20 @@ export default {
140
161
  methods: {
141
162
  _onInput($event, index) {
142
163
  const field = $event.target
143
- const parsed = field.value.replace(/\D/g, '')
144
-
145
- // immedate update to prevent blinking
146
- field.value = parsed
147
- this.$set(this.codeValue, index, parsed)
148
-
149
- // go to next field if current is not empty
150
- if (parsed.length === field.maxLength) {
151
- this._focus(field)
164
+ const parsed = this._parseValue($event.data)
165
+
166
+ // virtual keyboard auto-suggestion clicked
167
+ if (parsed.length > MAX_LENGTH) {
168
+ this._pasteValue(parsed)
169
+ } else {
170
+ // immedate update to prevent blinking
171
+ field.value = parsed
172
+ this.$set(this.codeValue, index, parsed)
173
+
174
+ // go to next field if current is not empty
175
+ if (parsed.length === MAX_LENGTH) {
176
+ this._focus(field)
177
+ }
152
178
  }
153
179
 
154
180
  // reset error if exists
@@ -170,9 +196,28 @@ export default {
170
196
  }
171
197
  },
172
198
 
199
+ _parseValue(str) {
200
+ return (str || '').replace(/\D/g, '')
201
+ },
202
+
173
203
  _onPaste($event) {
174
204
  // if (this.error && this.error.length) this.resetError()
175
- this.inputValue = $event.clipboardData.getData('text')
205
+ const value = this._parseValue($event.clipboardData.getData('text'))
206
+
207
+ this._pasteValue(value)
208
+ },
209
+
210
+ _pasteValue(value) {
211
+ this.inputValue = value
212
+
213
+ setTimeout(() => {
214
+ const field = this.$refs.fields[
215
+ clamp(0, this.length, value.length)
216
+ ]
217
+
218
+ field.focus()
219
+ field.setSelectionRange(MAX_LENGTH, MAX_LENGTH)
220
+ }, 10)
176
221
  }
177
222
  }
178
223
  }
@@ -43,7 +43,7 @@
43
43
  </span>
44
44
  </span>
45
45
 
46
- <AwBadge v-if="badge" v-bind="badge" class="mr-2" />
46
+ <AwBadge v-if="badge" v-bind="badge" />
47
47
 
48
48
  <AwIconSystemMono
49
49
  v-if="_linkExternal"
@@ -1,9 +1,13 @@
1
1
  <template>
2
- <nav v-if="items.length" class="aw-mobile-menu-nav" :class="{
3
- 'aw-mobile-menu-nav--default': theme === 'default',
4
- 'aw-mobile-menu-nav--primary': theme === 'primary',
5
- 'aw-mobile-menu-nav--island': theme === 'island'
6
- }">
2
+ <nav
3
+ v-if="items.length"
4
+ class="aw-mobile-menu-nav"
5
+ :class="{
6
+ 'aw-mobile-menu-nav--default': theme === 'default',
7
+ 'aw-mobile-menu-nav--primary': theme === 'primary',
8
+ 'aw-mobile-menu-nav--island': theme === 'island'
9
+ }"
10
+ >
7
11
  <h3 v-if="title || badge">
8
12
  {{ title }}
9
13
  <AwBadge v-if="badge" v-bind="badge" />
@@ -17,14 +21,20 @@
17
21
  :_getChildrenCount="_getChildrenCount"
18
22
  :isActive="isActive"
19
23
  >
20
- <li v-for="({ listeners, ...item }, i) in items" :key="i" v-show="!item.abstract">
24
+ <li
25
+ v-for="({ listeners, ...item }, i) in items"
26
+ :key="i"
27
+ v-show="!item.abstract"
28
+ >
21
29
  <AwMobileMenuItem
22
30
  v-bind="item"
23
31
  :class="[
24
32
  item.class,
25
33
  {
26
34
  'aw-mobile-menu-nav__item--divide':
27
- theme !== 'island' && (item.isDivide || allDivides) && i
35
+ theme !== 'island' &&
36
+ (item.isDivide || allDivides) &&
37
+ i
28
38
  }
29
39
  ]"
30
40
  :theme="theme"
@@ -23,7 +23,16 @@
23
23
  "
24
24
  @focus="openDropdown"
25
25
  >
26
+ <Component
27
+ v-if="userMenuAvatarComponent"
28
+ :is="userMenuAvatarComponent.is"
29
+ v-bind="[user, userMenuAvatarComponent.props]"
30
+ :size="outline ? 24 : 40"
31
+ tabindex="-1"
32
+ />
33
+
26
34
  <AwAvatar
35
+ v-else
27
36
  v-bind="user"
28
37
  :size="outline ? 24 : 40"
29
38
  tabindex="-1"
@@ -57,6 +66,23 @@
57
66
  <AwUserpic v-bind="user" big-image />
58
67
  </Component>
59
68
 
69
+ <AwNavItem
70
+ class="aw-user-menu__nav-item border-b"
71
+ :href="profileUrl"
72
+ hide-external-icon
73
+ >
74
+ <AwIcon
75
+ name="awesio/profile"
76
+ size="16"
77
+ class="text-mono-400"
78
+ :class="{ 'mr-2': vertical, 'mr-4': !vertical }"
79
+ />
80
+
81
+ <span class="aw-user-menu__nav-item-text">
82
+ {{ $t('My profile') }}
83
+ </span>
84
+ </AwNavItem>
85
+
60
86
  <span class="aw-user-menu__theme">
61
87
  <AwIconSystemMono
62
88
  :size="16"
@@ -75,7 +101,7 @@
75
101
  <AwSwitcher
76
102
  v-model="isDarkTheme"
77
103
  class="aw-user-menu__theme-switcher"
78
- size="sm"
104
+ size="md"
79
105
  />
80
106
  </span>
81
107
 
@@ -159,7 +185,7 @@ export default {
159
185
  },
160
186
 
161
187
  computed: {
162
- ...mapGetters('awesIo', ['user']),
188
+ ...mapGetters('awesIo', ['user', 'userMenuAvatarComponent']),
163
189
 
164
190
  isDesktop() {
165
191
  return this.$screen.lg
@@ -95,7 +95,8 @@ export const AwCalendar = {
95
95
 
96
96
  export const AwCode = {
97
97
  baseClass: 'aw-text-field',
98
- pattern: 'XXX-XXX'
98
+ pattern: 'XXXXXX',
99
+ compact: true
99
100
  }
100
101
 
101
102
  export const AwForm = {
@@ -1,7 +1,27 @@
1
1
  <template>
2
2
  <div class="aw-more">
3
+ <div class="aw-more__buttons">
4
+ <AwButton color="mono" icon="awesio/arrow" @click="onClickGoBack" />
5
+
6
+ <AwButton
7
+ v-if="user"
8
+ color="mono"
9
+ icon="awesio/edit"
10
+ :href="profileUrl"
11
+ back
12
+ />
13
+ </div>
14
+
3
15
  <div class="aw-more__profile" v-if="user">
4
- <AwAvatar :src="user.src" :name="user.name" size="112" />
16
+ <Component
17
+ v-if="userMenuAvatarComponent"
18
+ :is="userMenuAvatarComponent.is"
19
+ v-bind="userMenuAvatarComponent.props"
20
+ :name="user.name"
21
+ size="112"
22
+ />
23
+
24
+ <AwAvatar v-else :src="user.src" :name="user.name" size="112" />
5
25
 
6
26
  <AwHeadline tag="span" class="aw-more__profile-name mt-2">
7
27
  {{ user.name }}
@@ -14,13 +34,6 @@
14
34
  >
15
35
  {{ user.description }}
16
36
  </AwDescription>
17
-
18
- <AwButton
19
- class="mt-6 w-full"
20
- :text="$t('Your profile')"
21
- color="dark"
22
- :href="profileUrl"
23
- />
24
37
  </div>
25
38
 
26
39
  <slot name="before-mobile-menu">
@@ -42,6 +55,16 @@
42
55
 
43
56
  <AwMobileMenuNav :items="userMenu" theme="primary" class="mt-6">
44
57
  <template #before>
58
+ <li v-if="user">
59
+ <AwMobileMenuItem
60
+ :href="profileUrl"
61
+ arrow
62
+ icon="awesio/profile"
63
+ :text="$t('My profile')"
64
+ class="aw-more__user-profile"
65
+ />
66
+ </li>
67
+
45
68
  <li class="aw-more__theme">
46
69
  <AwIconSystemMono
47
70
  :size="24"
@@ -56,6 +79,7 @@
56
79
  <AwSwitcher
57
80
  v-model="isDarkTheme"
58
81
  class="aw-more__theme-switcher"
82
+ size="lg"
59
83
  />
60
84
  </li>
61
85
  </template>
@@ -105,6 +129,7 @@ export default {
105
129
  ...mapGetters('awesIo', [
106
130
  'user',
107
131
  'logoComponent',
132
+ 'userMenuAvatarComponent',
108
133
  'afterMobileMenuComponent',
109
134
  'beforeMobileMenuComponent'
110
135
  ]),
@@ -154,6 +179,12 @@ export default {
154
179
  this.$store.commit('awesIo/SET_DARK_THEME', val)
155
180
  }
156
181
  }
182
+ },
183
+
184
+ methods: {
185
+ onClickGoBack() {
186
+ this.$router.back()
187
+ }
157
188
  }
158
189
  }
159
190
  </script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awes-io/ui",
3
- "version": "2.107.0",
3
+ "version": "2.108.1",
4
4
  "description": "User Interface (UI) components",
5
5
  "keywords": [
6
6
  "ui",
@@ -114,5 +114,5 @@
114
114
  "rollup-plugin-visualizer": "^2.6.0",
115
115
  "rollup-plugin-vue": "^5.0.1"
116
116
  },
117
- "gitHead": "0b77fd4870688104b834fb60e538ee4e10e3b0ae"
117
+ "gitHead": "b58d7facd7085153fca846d87a7cf96f7f2d7aff"
118
118
  }
package/store/awesIo.js CHANGED
@@ -39,6 +39,7 @@ export const state = () => ({
39
39
  },
40
40
  mobileMenuOpened: false,
41
41
  beforeMobileMenu: null,
42
+ userMenuAvatar: null,
42
43
  afterMobileMenu: null,
43
44
  bottomBarAction: null,
44
45
 
@@ -131,6 +132,10 @@ export const getters = {
131
132
  return state.beforeMobileMenu
132
133
  },
133
134
 
135
+ userMenuAvatarComponent(state) {
136
+ return state.userMenuAvatar
137
+ },
138
+
134
139
  afterMobileMenuComponent(state) {
135
140
  return state.afterMobileMenu
136
141
  }
@@ -228,6 +233,12 @@ export const mutations = {
228
233
  }
229
234
  },
230
235
 
236
+ SET_USER_MENU_AVATAR(state, payload) {
237
+ if (payload && payload.component) {
238
+ state.userMenuAvatar = payload.component
239
+ }
240
+ },
241
+
231
242
  SET_AFTER_MOBILE_MENU(state, payload) {
232
243
  if (payload && payload.component) {
233
244
  state.afterMobileMenu = payload.component