@bethinkpl/design-system 30.4.3 → 31.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/design-system.css +1 -1
  2. package/dist/design-system.js +4274 -4286
  3. package/dist/design-system.js.map +1 -1
  4. package/dist/lib/js/components/Buttons/IconButton/IconButton.vue.d.ts +1 -0
  5. package/dist/lib/js/components/Cards/CardExpandable/CardExpandable.vue.d.ts +1 -0
  6. package/dist/lib/js/components/Chip/Chip.vue.d.ts +2 -0
  7. package/dist/lib/js/components/DatePickers/DateBox/DateBox.vue.d.ts +1 -0
  8. package/dist/lib/js/components/DatePickers/DatePicker/DatePicker.vue.d.ts +1 -0
  9. package/dist/lib/js/components/DatePickers/DateRangePicker/DateRangePicker.vue.d.ts +1 -0
  10. package/dist/lib/js/components/Drawer/DrawerHeader/DrawerHeader.vue.d.ts +4 -0
  11. package/dist/lib/js/components/Drawer/DrawerListItem/DrawerListItem.vue.d.ts +1 -0
  12. package/dist/lib/js/components/Drawer/DrawerSection/DrawerSection.vue.d.ts +3 -0
  13. package/dist/lib/js/components/Form/RadioButton/RadioButton.vue.d.ts +1 -0
  14. package/dist/lib/js/components/Headers/OverlayHeader/OverlayHeader.vue.d.ts +2 -0
  15. package/dist/lib/js/components/Headers/SectionHeader/SectionHeader.vue.d.ts +2 -0
  16. package/dist/lib/js/components/Icons/Icon/Icon.consts.d.ts +1 -0
  17. package/dist/lib/js/components/Menu/Menu/Menu.consts.d.ts +9 -0
  18. package/dist/lib/js/components/Menu/Menu/Menu.vue.d.ts +28 -0
  19. package/dist/lib/js/components/Menu/Menu/index.d.ts +4 -0
  20. package/dist/lib/js/components/Menu/MenuDivider/MenuDivider.vue.d.ts +71 -0
  21. package/dist/lib/js/components/Menu/MenuDivider/index.d.ts +3 -0
  22. package/dist/lib/js/components/Menu/MenuItem/MenuItem.consts.d.ts +23 -0
  23. package/dist/lib/js/components/Menu/MenuItem/MenuItem.vue.d.ts +68 -0
  24. package/dist/lib/js/components/Menu/MenuItem/index.d.ts +4 -0
  25. package/dist/lib/js/components/Modal/Modal.vue.d.ts +1 -0
  26. package/dist/lib/js/components/Modals/Modal/Modal.vue.d.ts +2 -0
  27. package/dist/lib/js/components/Modals/ModalDialog/ModalDialog.vue.d.ts +2 -0
  28. package/dist/lib/js/components/Pagination/Pagination.vue.d.ts +3 -0
  29. package/dist/lib/js/components/ProgressBar/ProgressBar.vue.d.ts +1 -0
  30. package/dist/lib/js/components/ProgressDonutChart/ProgressDonutChart.vue.d.ts +1 -0
  31. package/dist/lib/js/components/RichList/BasicRichListItem/BasicRichListItem.vue.d.ts +1 -0
  32. package/dist/lib/js/components/RichList/RichListItem/RichListItem.vue.d.ts +1 -0
  33. package/dist/lib/js/components/SelectList/SelectListItem/SelectListItem.vue.d.ts +1 -0
  34. package/dist/lib/js/components/SelectList/SelectListItemToggle/SelectListItemToggle.vue.d.ts +1 -0
  35. package/dist/lib/js/components/Statuses/AccessStatus/AccessStatus.vue.d.ts +1 -0
  36. package/dist/lib/js/components/Statuses/BlockadeStatus/BlockadeStatus.vue.d.ts +1 -0
  37. package/dist/lib/js/components/SurveyQuestions/SurveyQuestionOpenEnded/SurveyQuestionOpenEnded.vue.d.ts +3 -0
  38. package/dist/lib/js/components/SurveyQuestions/SurveyQuestionScale/SurveyQuestionScale.vue.d.ts +3 -0
  39. package/dist/lib/js/components/Switch/Switch.vue.d.ts +1 -0
  40. package/dist/lib/js/components/Tile/Tile.sb.shared.d.ts +1 -0
  41. package/dist/lib/js/components/Toggles/ToggleButton/ToggleButton.vue.d.ts +1 -0
  42. package/dist/lib/js/icons/fontawesome.d.ts +1 -0
  43. package/dist/lib/js/index.d.ts +8 -7
  44. package/lib/js/components/Menu/Menu/Menu.consts.ts +11 -0
  45. package/lib/js/components/Menu/Menu/Menu.spec.ts +134 -0
  46. package/lib/js/components/Menu/Menu/Menu.stories.ts +52 -0
  47. package/lib/js/components/Menu/Menu/Menu.vue +56 -0
  48. package/lib/js/components/Menu/Menu/index.ts +4 -0
  49. package/lib/js/components/{Outline/OutlineDivider/OutlineDivider.stories.ts → Menu/MenuDivider/MenuDivider.stories.ts} +7 -7
  50. package/lib/js/components/{Outline/OutlineDivider/OutlineDivider.vue → Menu/MenuDivider/MenuDivider.vue} +5 -4
  51. package/lib/js/components/Menu/MenuDivider/index.ts +3 -0
  52. package/lib/js/components/Menu/MenuItem/MenuItem.consts.ts +34 -0
  53. package/lib/js/components/Menu/MenuItem/MenuItem.spec.ts +424 -0
  54. package/lib/js/components/Menu/MenuItem/MenuItem.stories.ts +177 -0
  55. package/lib/js/components/Menu/MenuItem/MenuItem.vue +377 -0
  56. package/lib/js/components/Menu/MenuItem/index.ts +4 -0
  57. package/lib/js/icons/fontawesome.ts +2 -0
  58. package/lib/js/index.ts +8 -7
  59. package/package.json +1 -1
  60. package/dist/storybook/localhost:8080/node_modules/.vite/deps/@bethinkpl_design-system.js?v=62a0baa6 +0 -7919
  61. package/lib/js/components/Outline/OutlineDivider/index.ts +0 -3
  62. package/lib/js/components/Outline/OutlineItem/OutlineItem.consts.ts +0 -22
  63. package/lib/js/components/Outline/OutlineItem/OutlineItem.stories.ts +0 -120
  64. package/lib/js/components/Outline/OutlineItem/OutlineItem.vue +0 -325
  65. package/lib/js/components/Outline/OutlineItem/index.ts +0 -4
  66. package/lib/js/components/Outline/OutlineSectionHeader/OutlineSectionHeader.stories.ts +0 -35
  67. package/lib/js/components/Outline/OutlineSectionHeader/OutlineSectionHeader.vue +0 -30
  68. package/lib/js/components/Outline/OutlineSectionHeader/index.ts +0 -3
@@ -0,0 +1,377 @@
1
+ <template>
2
+ <li class="ds-menuItem__wrapper">
3
+ <component
4
+ :is="as"
5
+ v-if="shouldRenderComponent"
6
+ v-bind="bindings"
7
+ :class="[
8
+ 'ds-menuItem',
9
+ levelClass,
10
+ {
11
+ '-ds-disabled': isDisabled,
12
+ '-ds-medium': size === MENU_ITEM_SIZES.MEDIUM,
13
+ '-ds-selected': isSelected,
14
+ '-ds-hoverable': !isSelected || isSelectedInteractive,
15
+ '-ds-backgroundNeutral':
16
+ backgroundColor === MENU_ITEM_BACKGROUND_COLORS.NEUTRAL,
17
+ },
18
+ ]"
19
+ >
20
+ <span class="ds-menuItem__content">
21
+ <ds-icon
22
+ v-if="accessoryState === MENU_ITEM_ACCESSORY_STATES.DOT"
23
+ :class="['ds-menuItem__accessory', { '-ds-active': isSelected }]"
24
+ :icon="ICONS.FA_DOT_SOLID"
25
+ :size="ICON_SIZES.XXX_SMALL"
26
+ />
27
+ <span
28
+ v-if="index !== null"
29
+ class="ds-menuItem__index"
30
+ :class="{ '-ds-active': isSelected }"
31
+ >
32
+ {{ index }}.
33
+ </span>
34
+ <ds-icon
35
+ v-if="iconLeft"
36
+ class="ds-menuItem__icon"
37
+ :class="{
38
+ '-ds-active': isSelected && hasSelectedIconsColorPrimary,
39
+ }"
40
+ :icon="iconLeft"
41
+ :size="ICON_SIZES.X_SMALL"
42
+ />
43
+ <span class="ds-menuItem__text">
44
+ <span class="ds-menuItem__label" :class="{ '-ds-uppercase': isLabelUppercase }">
45
+ <template v-if="$slots.labelSlot">
46
+ <slot name="labelSlot" />
47
+ </template>
48
+ <template v-else>
49
+ {{ label }}
50
+ </template>
51
+ </span>
52
+ <span v-if="additionalText" class="ds-menuItem__additionalText">
53
+ {{ additionalText }}
54
+ </span>
55
+ </span>
56
+ </span>
57
+ <span
58
+ v-if="shouldRenderRightContent"
59
+ class="ds-menuItem__rightContent"
60
+ :class="{ '-ds-centeredContent': $slots.default }"
61
+ >
62
+ <template v-if="$slots.default">
63
+ <slot />
64
+ </template>
65
+ <ds-icon
66
+ v-if="isDone"
67
+ class="ds-menuItem__icon -ds-active"
68
+ :icon="ICONS.FA_CHECK_SOLID"
69
+ :size="ICON_SIZES.X_SMALL"
70
+ />
71
+ <ds-icon
72
+ v-else-if="iconRight"
73
+ class="ds-menuItem__icon"
74
+ :class="{
75
+ '-ds-active': isSelected && hasSelectedIconsColorPrimary,
76
+ }"
77
+ :icon="iconRight"
78
+ :size="ICON_SIZES.X_SMALL"
79
+ :rotation="iconRightRotation"
80
+ ></ds-icon>
81
+ </span>
82
+ </component>
83
+ <slot name="children" />
84
+ </li>
85
+ </template>
86
+
87
+ <style scoped lang="scss">
88
+ @import '../../../../styles/settings/radiuses';
89
+ @import '../../../../styles/settings/spacings';
90
+ @import '../../../../styles/settings/colors/tokens';
91
+ @import '../../../../styles/settings/typography/tokens';
92
+
93
+ .ds-menuItem {
94
+ $root: &;
95
+ $menu-item-padding: $space-xs;
96
+
97
+ @for $i from 2 through 6 {
98
+ &.-ds-level#{$i} {
99
+ padding-left: $menu-item-padding + ($i - 1) * $space-3xs;
100
+ }
101
+ }
102
+
103
+ background-color: $color-neutral-background-weak;
104
+ border-radius: $radius-s;
105
+ column-gap: $space-2xs;
106
+ display: flex;
107
+ justify-content: space-between;
108
+ padding: $menu-item-padding;
109
+ text-decoration: none;
110
+
111
+ &__wrapper {
112
+ list-style-type: none;
113
+ }
114
+
115
+ &__rightContent,
116
+ &__content {
117
+ align-items: flex-start;
118
+ display: flex;
119
+ max-width: 100%;
120
+ }
121
+
122
+ &__rightContent {
123
+ column-gap: $space-2xs;
124
+
125
+ &.-ds-centeredContent {
126
+ align-items: center;
127
+ }
128
+ }
129
+
130
+ &__content {
131
+ overflow-x: clip;
132
+ }
133
+
134
+ &__accessory {
135
+ color: $color-neutral-icon-weak;
136
+ padding: $space-4xs $space-5xs;
137
+
138
+ &.-ds-active {
139
+ color: $color-primary-icon;
140
+ }
141
+ }
142
+
143
+ &__index {
144
+ @include label-l-default-bold;
145
+
146
+ color: $color-neutral-text-weak;
147
+ margin-right: $space-3xs;
148
+
149
+ &.-ds-active {
150
+ color: $color-primary-text;
151
+ }
152
+ }
153
+
154
+ &__text {
155
+ @include label-l-default-regular; // it fixes whole component height
156
+
157
+ // To hide scrollbar in case Chrome renders __label higher than line-height - there are some problems with fraction of a pixel on Retina screens
158
+ // https://bethinkteam.slack.com/archives/C012R8RM3A4/p1727776466931369?thread_ts=1727775029.076259&cid=C012R8RM3A4
159
+ overflow: hidden;
160
+ }
161
+
162
+ &__label {
163
+ @include label-l-default-regular;
164
+
165
+ color: $color-neutral-text-heavy;
166
+
167
+ &.-ds-uppercase {
168
+ @include label-l-default-regular-uppercase;
169
+
170
+ #{$root}.-ds-selected & {
171
+ @include label-l-default-bold-uppercase;
172
+ }
173
+ }
174
+
175
+ #{$root}.-ds-selected & {
176
+ @include label-l-default-bold;
177
+ }
178
+ }
179
+
180
+ &__additionalText {
181
+ @include label-m-default-bold;
182
+
183
+ color: $color-neutral-text-weak;
184
+ margin-left: $space-4xs;
185
+ }
186
+
187
+ &__icon {
188
+ color: $color-neutral-icon-weak;
189
+ margin-right: $space-3xs;
190
+
191
+ &.-ds-active {
192
+ color: $color-primary-icon;
193
+ }
194
+ }
195
+
196
+ &.-ds-hoverable:hover {
197
+ background-color: $color-neutral-background-weak-hovered;
198
+ cursor: pointer;
199
+ }
200
+
201
+ &.-ds-selected {
202
+ background-color: $color-neutral-background;
203
+
204
+ &.-ds-hoverable:hover {
205
+ background-color: $color-neutral-background-hovered;
206
+ }
207
+ }
208
+
209
+ &.-ds-disabled {
210
+ pointer-events: none;
211
+
212
+ #{$root}__icon {
213
+ color: $color-neutral-icon-weak-disabled;
214
+
215
+ &.-ds-active {
216
+ color: $color-primary-icon-disabled;
217
+ }
218
+ }
219
+
220
+ #{$root}__index {
221
+ color: $color-neutral-text-weak-disabled;
222
+
223
+ &.-ds-active {
224
+ color: $color-primary-text-disabled;
225
+ }
226
+ }
227
+
228
+ #{$root}__label {
229
+ color: $color-neutral-text-heavy-disabled;
230
+ }
231
+ }
232
+
233
+ &.-ds-medium {
234
+ padding: $space-s $space-xs;
235
+
236
+ #{$root}__label {
237
+ @include label-l-default-bold;
238
+
239
+ &.-ds-uppercase {
240
+ @include label-l-default-bold-uppercase;
241
+ }
242
+ }
243
+ }
244
+
245
+ &.-ds-backgroundNeutral {
246
+ background-color: $color-neutral-background;
247
+
248
+ &.-ds-hoverable:hover {
249
+ background-color: $color-neutral-background-hovered;
250
+ }
251
+ }
252
+ }
253
+ </style>
254
+
255
+ <script setup lang="ts">
256
+ import { computed, inject, provide } from 'vue';
257
+ import DsIcon, { ICON_SIZES, IconItem, ICONS } from '../../Icons/Icon';
258
+ import {
259
+ MENU_ITEM_ACCESSORY_STATES,
260
+ MENU_ITEM_BACKGROUND_COLORS,
261
+ MENU_ITEM_LEVEL_INJECTION_KEY,
262
+ MENU_ITEM_SIZES,
263
+ MENU_ITEM_STATES,
264
+ type MenuItemAccessoryState,
265
+ type MenuItemBackgroundColor,
266
+ type MenuItemSize,
267
+ type MenuItemState,
268
+ } from './MenuItem.consts'; // DS don't have vue-router installed, so we define a loose type which should match RouteLocationRaw
269
+
270
+ // DS don't have vue-router installed, so we define a loose type which should match RouteLocationRaw
271
+ type RouterLocation = string | Record<string, unknown>;
272
+
273
+ const {
274
+ href = '',
275
+ to = '',
276
+ size = MENU_ITEM_SIZES.SMALL,
277
+ backgroundColor = MENU_ITEM_BACKGROUND_COLORS.NEUTRAL_WEAK,
278
+ iconLeft = null,
279
+ iconRight = null,
280
+ iconRightRotation = null,
281
+ index = null,
282
+ label = '',
283
+ isLabelUppercase = false,
284
+ additionalText = '',
285
+ state = MENU_ITEM_STATES.DEFAULT,
286
+ accessoryState = null,
287
+ isSelected = false,
288
+ isDone = false,
289
+ hasSelectedIconsColorPrimary = true,
290
+ isSelectedInteractive = false,
291
+ level = null,
292
+ } = defineProps<{
293
+ href?: string;
294
+ to?: RouterLocation;
295
+ size?: MenuItemSize;
296
+ backgroundColor?: MenuItemBackgroundColor;
297
+ iconLeft?: IconItem | null;
298
+ iconRight?: IconItem | null;
299
+ iconRightRotation?: 90 | 180 | 270 | null;
300
+ index?: number | null;
301
+ label?: string;
302
+ isLabelUppercase?: boolean;
303
+ additionalText?: string;
304
+ state?: MenuItemState;
305
+ accessoryState?: MenuItemAccessoryState | null;
306
+ isSelected?: boolean;
307
+ isDone?: boolean;
308
+ hasSelectedIconsColorPrimary?: boolean;
309
+ isSelectedInteractive?: boolean;
310
+ level?: number | null;
311
+ }>();
312
+
313
+ const slots = defineSlots<{
314
+ children?: () => any;
315
+ labelSlot?: () => any;
316
+ default?: () => any;
317
+ }>();
318
+
319
+ const as = computed(() => {
320
+ if (href) {
321
+ return 'a';
322
+ }
323
+ if (to) {
324
+ return 'router-link';
325
+ }
326
+ return 'span';
327
+ });
328
+
329
+ const bindings = computed(() => {
330
+ if (href) {
331
+ return { href };
332
+ }
333
+ if (to) {
334
+ return { to };
335
+ }
336
+ return {};
337
+ });
338
+
339
+ const isDisabled = computed(() => {
340
+ return state === MENU_ITEM_STATES.DISABLED;
341
+ });
342
+
343
+ const levelComputed = computed(() => {
344
+ const injectedLevel = inject(MENU_ITEM_LEVEL_INJECTION_KEY, null);
345
+
346
+ if (level !== null) {
347
+ return level;
348
+ }
349
+
350
+ if (injectedLevel !== null) {
351
+ return injectedLevel;
352
+ }
353
+
354
+ return 1;
355
+ });
356
+
357
+ const shouldRenderRightContent = computed(() => slots.default || isDone || iconRight);
358
+
359
+ const shouldRenderComponent = computed(
360
+ () =>
361
+ label ||
362
+ additionalText ||
363
+ slots.labelSlot ||
364
+ accessoryState ||
365
+ index !== null ||
366
+ iconLeft ||
367
+ shouldRenderRightContent.value,
368
+ );
369
+
370
+ const levelClass = computed(() => {
371
+ const limitedLevel = levelComputed.value > 6 ? 6 : levelComputed.value;
372
+
373
+ return `-ds-level${limitedLevel}`;
374
+ });
375
+
376
+ provide(MENU_ITEM_LEVEL_INJECTION_KEY, levelComputed.value + 1);
377
+ </script>
@@ -0,0 +1,4 @@
1
+ import MenuItem from './MenuItem.vue';
2
+
3
+ export default MenuItem;
4
+ export * from './MenuItem.consts';
@@ -222,6 +222,7 @@ import { faUserDoctor as fasUserDoctor } from '@fortawesome/pro-solid-svg-icons/
222
222
  import { faVideo as fasVideo } from '@fortawesome/pro-solid-svg-icons/faVideo';
223
223
  import { faVolumeHigh as fasVolumeHigh } from '@fortawesome/pro-solid-svg-icons/faVolumeHigh';
224
224
  import { faCircleDot as fasCircleDot } from '@fortawesome/pro-solid-svg-icons/faCircleDot';
225
+ import { faDot as fasDot } from '@fortawesome/pro-solid-svg-icons/faDot';
225
226
  import { faFlagCheckered as fasFlagCheckered } from '@fortawesome/pro-solid-svg-icons/faFlagCheckered';
226
227
 
227
228
  import { faChevronLeft as falChevronLeft } from '@fortawesome/pro-light-svg-icons/faChevronLeft';
@@ -343,6 +344,7 @@ export const FONTAWESOME_ICONS = {
343
344
  FA_CREDIT_CARD: faCreditCard,
344
345
  FA_DNA_SOLID: fasDna,
345
346
  FA_DOT_CIRCLE_SOLID: fasCircleDot,
347
+ FA_DOT_SOLID: fasDot,
346
348
  FA_EARTH_AMERICAS: faEarthAmericas,
347
349
  FA_ELLIPSIS_VERTICAL: faEllipsisVertical,
348
350
  FA_ELLIPSIS: faEllipsis,
package/lib/js/index.ts CHANGED
@@ -100,13 +100,14 @@ export { default as DrawerTile } from './components/Drawer/DrawerTile/DrawerTile
100
100
  export { default as DsDrawerTile } from './components/Drawer/DrawerTile/DrawerTile.vue';
101
101
  export { default as DrawerSection } from './components/Drawer/DrawerSection/DrawerSection.vue';
102
102
  export { default as DsDrawerSection } from './components/Drawer/DrawerSection/DrawerSection.vue';
103
- export { default as OutlineItem } from './components/Outline/OutlineItem';
104
- export { default as DsOutlineItem } from './components/Outline/OutlineItem';
105
- export * from './components/Outline/OutlineItem/OutlineItem.consts';
106
- export { default as OutlineDivider } from './components/Outline/OutlineDivider';
107
- export { default as DsOutlineDivider } from './components/Outline/OutlineDivider';
108
- export { default as OutlineSectionHeader } from './components/Outline/OutlineSectionHeader';
109
- export { default as DsOutlineSectionHeader } from './components/Outline/OutlineSectionHeader';
103
+ export { default as Menu } from './components/Menu/Menu';
104
+ export { default as DsMenu } from './components/Menu/Menu';
105
+ export * from './components/Menu/Menu/Menu.consts';
106
+ export { default as MenuItem } from './components/Menu/MenuItem';
107
+ export { default as DsMenuItem } from './components/Menu/MenuItem';
108
+ export * from './components/Menu/MenuItem/MenuItem.consts';
109
+ export { default as MenuDivider } from './components/Menu/MenuDivider';
110
+ export { default as DsMenuDivider } from './components/Menu/MenuDivider';
110
111
  export { default as Chip } from './components/Chip';
111
112
  export { default as DsChip } from './components/Chip';
112
113
  export * from './components/Chip/Chip.consts';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bethinkpl/design-system",
3
- "version": "30.4.3",
3
+ "version": "31.0.0",
4
4
  "description": "Bethink universe design-system",
5
5
  "repository": {
6
6
  "type": "git",