@bethinkpl/design-system 22.2.1 → 23.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 (99) hide show
  1. package/.storybook/manager.js +3 -1
  2. package/dist/design-system.umd.js +5292 -441
  3. package/dist/design-system.umd.js.map +1 -1
  4. package/dist/lib/js/components/Banner/Banner.vue.d.ts +3 -1
  5. package/dist/lib/js/components/Buttons/Button/Button.vue.d.ts +3 -1
  6. package/dist/lib/js/components/Buttons/IconButton/IconButton.vue.d.ts +3 -1
  7. package/dist/lib/js/components/Cards/CardExpandable/CardExpandable.vue.d.ts +3 -1
  8. package/dist/lib/js/components/Chip/Chip.vue.d.ts +3 -1
  9. package/dist/lib/js/components/DatePickers/DatePicker/DatePicker.consts.d.ts +26 -0
  10. package/dist/lib/js/components/DatePickers/DatePicker/DatePicker.stories.d.ts +5 -0
  11. package/dist/lib/js/components/DatePickers/DatePicker/DatePicker.vue.d.ts +107 -0
  12. package/dist/lib/js/components/DatePickers/DatePicker/index.d.ts +3 -0
  13. package/dist/lib/js/components/DatePickers/DatePickerBox/DatePickerBox.vue.d.ts +270 -0
  14. package/dist/lib/js/components/DatePickers/DatePickerBox/index.d.ts +2 -0
  15. package/dist/lib/js/components/Drawer/DrawerSection/DrawerSection.vue.d.ts +3 -1
  16. package/dist/lib/js/components/Drawer/DrawerTile/DrawerTile.vue.d.ts +6 -2
  17. package/dist/lib/js/components/Form/Checkbox/Checkbox.vue.d.ts +3 -1
  18. package/dist/lib/js/components/Form/RadioButton/RadioButton.vue.d.ts +3 -1
  19. package/dist/lib/js/components/Headers/OverlayHeader/OverlayHeader.vue.d.ts +3 -1
  20. package/dist/lib/js/components/Headers/SectionHeader/SectionHeader.vue.d.ts +3 -1
  21. package/dist/lib/js/components/Icons/Icon/Icon.consts.d.ts +3 -1
  22. package/dist/lib/js/components/Image/Image.consts.d.ts +5 -0
  23. package/dist/lib/js/components/Image/Image.stories.d.ts +5 -0
  24. package/dist/lib/js/components/Image/Image.vue.d.ts +43 -0
  25. package/dist/lib/js/components/Image/index.d.ts +2 -0
  26. package/dist/lib/js/components/Modal/Modal.vue.d.ts +3 -1
  27. package/dist/lib/js/components/Modals/Modal/Modal.vue.d.ts +3 -1
  28. package/dist/lib/js/components/Outline/OutlineItem/OutlineItem.vue.d.ts +3 -1
  29. package/dist/lib/js/components/Pagination/Pagination.vue.d.ts +3 -1
  30. package/dist/lib/js/components/ProgressBar/ProgressBar.vue.d.ts +3 -1
  31. package/dist/lib/js/components/ProgressDonutChart/ProgressDonutChart.vue.d.ts +3 -1
  32. package/dist/lib/js/components/RichList/BasicRichListItem/BasicRichListItem.stories.d.ts +1 -0
  33. package/dist/lib/js/components/RichList/BasicRichListItem/BasicRichListItem.vue.d.ts +2 -1
  34. package/dist/lib/js/components/RichList/RichListItem/RichListItem.stories.d.ts +1 -0
  35. package/dist/lib/js/components/RichList/RichListItem/RichListItem.vue.d.ts +6 -2
  36. package/dist/lib/js/components/SelectList/SelectListItemDivider/SelectListItemDivider.vue.d.ts +8 -3
  37. package/dist/lib/js/components/SelectList/SelectListItemTile/SelectListItemTile.vue.d.ts +6 -2
  38. package/dist/lib/js/components/SelectionTile/SelectionTile.vue.d.ts +5 -3
  39. package/dist/lib/js/components/Skeleton/Skeleton.consts.d.ts +6 -0
  40. package/dist/lib/js/components/Skeleton/Skeleton.stories.d.ts +5 -0
  41. package/dist/lib/js/components/Skeleton/Skeleton.vue.d.ts +3 -0
  42. package/dist/lib/js/components/Skeleton/index.d.ts +2 -0
  43. package/dist/lib/js/components/Statuses/AccessStatus/AccessStatus.vue.d.ts +3 -1
  44. package/dist/lib/js/components/Statuses/BlockadeStatus/BlockadeStatus.vue.d.ts +3 -1
  45. package/dist/lib/js/components/SurveyQuestions/SurveyQuestionOpenEnded/SurveyQuestionOpenEnded.vue.d.ts +3 -262
  46. package/dist/lib/js/components/SurveyQuestions/SurveyQuestionScale/SurveyQuestionScale.vue.d.ts +3 -305
  47. package/dist/lib/js/components/SurveyToggle/SurveyToggle.vue.d.ts +3 -71
  48. package/dist/lib/js/components/Switch/Switch.vue.d.ts +3 -1
  49. package/dist/lib/js/components/Tile/Tile.consts.d.ts +3 -0
  50. package/dist/lib/js/components/Tile/Tile.sb.shared.d.ts +3 -1
  51. package/dist/lib/js/components/Tile/Tile.shared.d.ts +8 -3
  52. package/dist/lib/js/components/Tile/Tile.vue.d.ts +9 -3
  53. package/dist/lib/js/components/Toggles/ToggleButton/ToggleButton.vue.d.ts +3 -1
  54. package/dist/lib/js/icons/fontawesome.d.ts +2 -1
  55. package/dist/lib/js/index.d.ts +61 -0
  56. package/dist/tools/importers/helpers/modifiers.d.ts +9 -0
  57. package/docs/{39.bfc720d8.iframe.bundle.js → 39.0fa13ab1.iframe.bundle.js} +2 -2
  58. package/docs/532.68b5110d.iframe.bundle.js +2 -0
  59. package/docs/iframe.html +1 -1
  60. package/docs/index.html +1 -1
  61. package/docs/main.3325e139.iframe.bundle.js +2 -0
  62. package/docs/main.3325e139.iframe.bundle.js.LICENSE.txt +1 -0
  63. package/docs/main.ec4e5d4f1933fc03f588.manager.bundle.js +1 -0
  64. package/docs/project.json +1 -1
  65. package/docs/{runtime~main.b2826aa6.iframe.bundle.js → runtime~main.c8f2837a.iframe.bundle.js} +1 -1
  66. package/lib/images/icons/sidebar-flip-solid.svg +6 -0
  67. package/lib/js/components/DatePickers/DatePicker/DatePicker.consts.ts +33 -0
  68. package/lib/js/components/DatePickers/DatePicker/DatePicker.stories.ts +138 -0
  69. package/lib/js/components/DatePickers/DatePicker/DatePicker.vue +333 -0
  70. package/lib/js/components/DatePickers/DatePicker/index.ts +5 -0
  71. package/lib/js/components/DatePickers/DatePickerBox/DatePickerBox.vue +291 -0
  72. package/lib/js/components/DatePickers/DatePickerBox/index.ts +3 -0
  73. package/lib/js/components/Headers/OverlayHeader/OverlayHeader.stories.ts +1 -1
  74. package/lib/js/components/Headers/OverlayHeader/OverlayHeader.vue +11 -4
  75. package/lib/js/components/Icons/Icon/Icon.consts.ts +2 -0
  76. package/lib/js/components/Image/Image.consts.ts +6 -0
  77. package/lib/js/components/Image/Image.stories.ts +36 -0
  78. package/lib/js/components/Image/Image.vue +94 -0
  79. package/lib/js/components/Image/index.ts +3 -0
  80. package/lib/js/components/RichList/BasicRichListItem/BasicRichListItem.stories.ts +162 -98
  81. package/lib/js/components/RichList/BasicRichListItem/BasicRichListItem.vue +9 -3
  82. package/lib/js/components/RichList/RichListItem/RichListItem.stories.ts +201 -135
  83. package/lib/js/components/RichList/RichListItem/RichListItem.vue +33 -3
  84. package/lib/js/components/Skeleton/Skeleton.consts.ts +7 -0
  85. package/lib/js/components/Skeleton/Skeleton.stories.ts +41 -0
  86. package/lib/js/components/Skeleton/Skeleton.vue +56 -0
  87. package/lib/js/components/Skeleton/index.ts +3 -0
  88. package/lib/js/components/Tile/Tile.consts.ts +6 -0
  89. package/lib/js/components/Tile/Tile.sb.shared.ts +2 -0
  90. package/lib/js/components/Tile/Tile.shared.ts +8 -4
  91. package/lib/js/components/Tile/Tile.vue +10 -0
  92. package/lib/js/icons/fontawesome.ts +4 -2
  93. package/lib/js/index.ts +61 -0
  94. package/package.json +2 -1
  95. package/docs/249.480c7054.iframe.bundle.js +0 -2
  96. package/docs/main.2931a482.iframe.bundle.js +0 -1
  97. package/docs/main.44a93c1fb278828c899f.manager.bundle.js +0 -1
  98. /package/docs/{39.bfc720d8.iframe.bundle.js.LICENSE.txt → 39.0fa13ab1.iframe.bundle.js.LICENSE.txt} +0 -0
  99. /package/docs/{249.480c7054.iframe.bundle.js.LICENSE.txt → 532.68b5110d.iframe.bundle.js.LICENSE.txt} +0 -0
@@ -0,0 +1,291 @@
1
+ <template>
2
+ <div
3
+ class="ds-datePickerBox"
4
+ :class="{
5
+ '-ds-disabled': state === DATE_PICKER_STATES.DISABLED,
6
+ '-ds-loading': state === DATE_PICKER_STATES.LOADING,
7
+ '-ds-interactive': isInteractive,
8
+ '-ds-warning': color === DATE_PICKER_COLORS.WARNING,
9
+ '-ds-neutral': color === DATE_PICKER_COLORS.NEUTRAL,
10
+ '-ds-isOpen': isOpen,
11
+ }"
12
+ >
13
+ <span v-if="eyebrowText" class="ds-datePickerBox__eyebrow">{{ eyebrowText }}</span>
14
+ <div class="ds-datePickerBox__dateWrapper">
15
+ <ds-icon
16
+ v-if="icon"
17
+ class="ds-datePickerBox__icon"
18
+ :class="{ '-ds-hiddenOnMobile': isIconHiddenOnMobile }"
19
+ :icon="icon"
20
+ :size="ICON_SIZES.XX_SMALL"
21
+ ></ds-icon>
22
+ <span class="ds-datePickerBox__date">{{ text }}</span>
23
+ </div>
24
+
25
+ <div v-if="state === DATE_PICKER_STATES.LOADING" class="ds-datePickerBox__loader">
26
+ <ds-icon :icon="ICONS.FAD_SPINNER_THIRD" :size="ICON_SIZES.X_SMALL" spinning />
27
+ </div>
28
+ </div>
29
+ </template>
30
+
31
+ <style scoped lang="scss">
32
+ @import '../../../../styles/settings/typography/tokens';
33
+ @import '../../../../styles/settings/colors/tokens';
34
+ @import '../../../../styles/settings/spacings';
35
+ @import '../../../../styles/settings/media-queries';
36
+ @import '../../../../styles/settings/borders';
37
+ @import '../../../../styles/settings/radiuses';
38
+
39
+ @mixin color-scheme(
40
+ $color-eyebrow,
41
+ $color-date,
42
+ $color-icon,
43
+ $color-icon-hovered,
44
+ $color-date-hovered,
45
+ $color-icon-disabled,
46
+ $color-eyebrow-disabled,
47
+ $color-date-disabled,
48
+ $self
49
+ ) {
50
+ &.-ds-interactive {
51
+ &:hover {
52
+ #{$self}__icon {
53
+ color: $color-icon-hovered;
54
+ }
55
+
56
+ #{$self}__date {
57
+ color: $color-date-hovered;
58
+ }
59
+ }
60
+ }
61
+
62
+ &.-ds-disabled {
63
+ #{$self}__eyebrow {
64
+ color: $color-eyebrow-disabled;
65
+ }
66
+
67
+ #{$self}__date {
68
+ color: $color-date-disabled;
69
+ }
70
+
71
+ #{$self}__icon {
72
+ color: $color-icon-disabled;
73
+ }
74
+ }
75
+
76
+ &.-ds-isOpen {
77
+ &:hover {
78
+ #{$self}__icon {
79
+ color: $color-icon;
80
+ }
81
+
82
+ #{$self}__date {
83
+ color: $color-date;
84
+ }
85
+ }
86
+ }
87
+ #{$self}__eyebrow {
88
+ color: $color-eyebrow;
89
+ }
90
+
91
+ #{$self}__date {
92
+ color: $color-date;
93
+ }
94
+
95
+ #{$self}__icon {
96
+ color: $color-icon;
97
+ }
98
+
99
+ #{$self}__loader {
100
+ color: $color-icon;
101
+ }
102
+ }
103
+
104
+ .ds-datePickerBox {
105
+ $self: &;
106
+
107
+ border: $border-xs solid transparent;
108
+ display: flex;
109
+ flex-direction: column;
110
+ justify-content: center;
111
+ min-height: 44px;
112
+ min-width: 76px;
113
+ padding: $space-2xs $space-xs;
114
+ pointer-events: none;
115
+ position: relative;
116
+
117
+ &.-ds-loading,
118
+ &.-ds-interactive {
119
+ background-color: $color-neutral-background-weak;
120
+ border-color: $color-neutral-border-weak;
121
+ border-radius: $radius-s;
122
+ }
123
+
124
+ &.-ds-disabled {
125
+ background-color: $color-neutral-background-weak-disabled;
126
+ pointer-events: none;
127
+ }
128
+
129
+ &.-ds-isOpen {
130
+ background-color: $color-neutral-background-medium;
131
+
132
+ &:hover {
133
+ background-color: $color-neutral-background-medium;
134
+ }
135
+ }
136
+
137
+ &__eyebrow {
138
+ @include info-xs-default-regular;
139
+ }
140
+
141
+ &__dateWrapper {
142
+ column-gap: $space-4xs;
143
+ display: inline-flex;
144
+
145
+ /* Prevent text select */
146
+ -webkit-user-select: none; /* Safari */
147
+ user-select: none;
148
+ }
149
+
150
+ &__date {
151
+ @include text-s-default-regular;
152
+ }
153
+
154
+ &__icon {
155
+ &.-ds-hiddenOnMobile {
156
+ display: none;
157
+
158
+ @media (#{breakpoint-s()}) {
159
+ display: flex;
160
+ }
161
+ }
162
+ }
163
+
164
+ &__loader {
165
+ background-color: inherit;
166
+ display: flex;
167
+ height: calc(100% - $border-s * 2);
168
+ justify-content: center;
169
+ left: $space-5xs;
170
+ position: absolute;
171
+ top: $space-5xs;
172
+ width: calc(100% - $border-s * 2);
173
+ }
174
+
175
+ &.-ds-loading,
176
+ &.-ds-neutral {
177
+ @include color-scheme(
178
+ $color-neutral-text-weak,
179
+ $color-neutral-text-heavy,
180
+ $color-neutral-icon,
181
+ $color-neutral-icon-hovered,
182
+ $color-neutral-text-heavy,
183
+ $color-neutral-icon-disabled,
184
+ $color-neutral-text-disabled,
185
+ $color-neutral-text-heavy-disabled,
186
+ $self
187
+ );
188
+ }
189
+
190
+ &:not(.-ds-loading) {
191
+ &.-ds-interactive {
192
+ cursor: pointer;
193
+ pointer-events: all;
194
+
195
+ &:hover:not(.-ds-isOpen) {
196
+ background-color: $color-neutral-background-weak-hovered;
197
+ }
198
+ }
199
+
200
+ &.-ds-warning {
201
+ @include color-scheme(
202
+ $color-warning-text,
203
+ $color-warning-text,
204
+ $color-warning-icon,
205
+ $color-warning-icon-hovered,
206
+ $color-warning-text-hovered,
207
+ $color-warning-icon-disabled,
208
+ $color-warning-text-disabled,
209
+ $color-warning-text-disabled,
210
+ $self
211
+ );
212
+ }
213
+ }
214
+ }
215
+ </style>
216
+
217
+ <script lang="ts">
218
+ import DsIcon, { ICON_SIZES, ICONS } from '../../Icons/Icon';
219
+ import {
220
+ DATE_PICKER_COLORS,
221
+ DATE_PICKER_STATES,
222
+ DatePickerColors,
223
+ DatePickerStates,
224
+ } from '../DatePicker/DatePicker.consts';
225
+ import { PropType, toRaw } from 'vue';
226
+
227
+ export default {
228
+ name: 'DatePickerBox',
229
+ components: {
230
+ DsIcon,
231
+ },
232
+ props: {
233
+ isInteractive: {
234
+ type: Boolean,
235
+ default: true,
236
+ },
237
+ placeholder: {
238
+ type: String,
239
+ default: 'Ustaw',
240
+ },
241
+ date: {
242
+ type: Date,
243
+ default: null,
244
+ },
245
+ icon: {
246
+ type: Object,
247
+ default: null,
248
+ validate: (icon) => icon === null || Object.values(ICONS).includes(toRaw(icon)),
249
+ },
250
+ isIconHiddenOnMobile: {
251
+ type: Boolean,
252
+ default: false,
253
+ },
254
+ state: {
255
+ type: (String as PropType<DatePickerStates>) || null,
256
+ default: DATE_PICKER_STATES.DEFAULT,
257
+ },
258
+ color: {
259
+ type: String as PropType<DatePickerColors>,
260
+ default: DATE_PICKER_COLORS.NEUTRAL,
261
+ },
262
+ eyebrowText: {
263
+ type: String,
264
+ default: '',
265
+ },
266
+ isOpen: {
267
+ type: Boolean,
268
+ default: false,
269
+ },
270
+ },
271
+ data() {
272
+ return {
273
+ ICONS: Object.freeze(ICONS),
274
+ ICON_SIZES: Object.freeze(ICON_SIZES),
275
+ DATE_PICKER_STATES: Object.freeze(DATE_PICKER_STATES),
276
+ DATE_PICKER_COLORS: Object.freeze(DATE_PICKER_COLORS),
277
+ };
278
+ },
279
+ computed: {
280
+ text() {
281
+ if (this.date) {
282
+ return this.date.toLocaleDateString(undefined, {
283
+ month: 'short',
284
+ day: '2-digit',
285
+ });
286
+ }
287
+ return this.placeholder;
288
+ },
289
+ },
290
+ };
291
+ </script>
@@ -0,0 +1,3 @@
1
+ import DatePickerBox from './DatePickerBox.vue';
2
+
3
+ export default DatePickerBox;
@@ -59,8 +59,8 @@ const argTypes = {
59
59
  control: {
60
60
  type: 'select',
61
61
  options: Object.values(OVERLAY_HEADER_BORDER_COLORS),
62
- defaultValue: OVERLAY_HEADER_BORDER_COLORS.NEUTRAL_GHOST,
63
62
  },
63
+ defaultValue: OVERLAY_HEADER_BORDER_COLORS.NEUTRAL_GHOST,
64
64
  },
65
65
  } as ArgTypes;
66
66
 
@@ -30,6 +30,7 @@
30
30
  <slot name="titleLeading" />
31
31
  </div>
32
32
  <div
33
+ v-if="title || shortTitle"
33
34
  class="ds-overlayHeader__titleWrapper"
34
35
  :title="title"
35
36
  :class="{ '-ds-interactive': isTitleInteractive }"
@@ -100,6 +101,7 @@
100
101
  @import '../../../../styles/settings/spacings';
101
102
  @import '../../../../styles/settings/media-queries';
102
103
  @import '../../../../styles/settings/colors/tokens';
104
+ @import '../../../../styles/settings/shadows';
103
105
  @import '../../../../styles/settings/typography/tokens';
104
106
  @import '../../../../styles/mixins/flex-overflow-mask';
105
107
 
@@ -107,6 +109,7 @@
107
109
  align-items: center;
108
110
  background: $color-neutral-background;
109
111
  border-bottom: 2px solid $color-neutral-border-ghost;
112
+ box-shadow: $shadow-s;
110
113
  display: flex;
111
114
  padding: $space-2xs $space-3xs $space-2xs 0;
112
115
 
@@ -162,14 +165,19 @@
162
165
  &__main {
163
166
  align-items: center;
164
167
  display: flex;
168
+ gap: $space-2xs;
169
+ // title is required, but in some edge-cases we don't render it. We need to set min-height to avoid jumping
170
+ // Keep value in sync with &__title line-height
171
+ min-height: $typography-line-height-s;
165
172
  }
166
173
 
167
174
  &__titleLeading {
168
175
  display: flex;
169
- margin-right: $space-2xs;
170
176
  }
171
177
 
172
178
  &__titleWrapper {
179
+ overflow: hidden;
180
+
173
181
  &.-ds-interactive {
174
182
  cursor: pointer;
175
183
  }
@@ -202,9 +210,8 @@
202
210
  @include flexOverflowMask($color-neutral-background, 20px);
203
211
 
204
212
  display: flex;
205
- // flex-shrink: 2 gives some more space for title
206
- flex-shrink: 2;
207
- margin-left: $space-2xs;
213
+ // flex-shrink: 100000 is big enough, so the title will not shrink
214
+ flex-shrink: 100000;
208
215
  }
209
216
 
210
217
  &__titleTrailing {
@@ -4,6 +4,7 @@ import SlidersSearch from '../../../../images/icons/sliders-search.svg';
4
4
  import CommentsCheck from '../../../../images/icons/comments-check.svg';
5
5
  import Answers from '../../../../images/icons/icon-answers.svg';
6
6
  import HideAnswers from '../../../../images/icons/icon-hide-answers.svg';
7
+ import SidebarFlipSolid from '../../../../images/icons/sidebar-flip-solid.svg';
7
8
 
8
9
  import { FONTAWESOME_ICONS } from '../../../icons/fontawesome';
9
10
  import { Value } from '../../../utils/type.utils';
@@ -46,6 +47,7 @@ const BETHINK_ICONS = {
46
47
  COMMENTS_CHECK: CommentsCheck,
47
48
  ANSWERS: Answers,
48
49
  HIDE_ANSWERS: HideAnswers,
50
+ SIDEBAR_FLIP_SOLID: SidebarFlipSolid,
49
51
  } as const;
50
52
 
51
53
  export const ICONS = {
@@ -0,0 +1,6 @@
1
+ export const IMAGE_FITS = {
2
+ CONTAIN: 'contain',
3
+ COVER: 'cover',
4
+ };
5
+
6
+ export type ImageFit = typeof IMAGE_FITS[keyof typeof IMAGE_FITS];
@@ -0,0 +1,36 @@
1
+ import { Args, Meta, StoryFn } from '@storybook/vue3';
2
+ import DsImage from './Image.vue';
3
+ import { IMAGE_FITS } from './Image.consts';
4
+
5
+ export default {
6
+ title: 'Components/Image',
7
+ component: DsImage,
8
+ } as Meta<typeof DsImage>;
9
+
10
+ const StoryTemplate: StoryFn<typeof DsImage> = (args) => ({
11
+ components: { DsImage },
12
+ setup() {
13
+ return { ...args };
14
+ },
15
+ template: `
16
+ <div style="height: 500px; width: 800px;">
17
+ <ds-image
18
+ :fit="fit"
19
+ :src="src"
20
+ />
21
+ </div>`,
22
+ });
23
+
24
+ export const Interactive = StoryTemplate.bind({});
25
+
26
+ Interactive.args = {
27
+ fit: IMAGE_FITS.COVER,
28
+ src: 'https://storage.googleapis.com/media-manager/lek/018f6291-3956-7342-8e6b-0ee901d48643/018f6291-3a56-7213-aef6-b5da7253839f.jpg',
29
+ } as Args;
30
+
31
+ Interactive.argTypes = {
32
+ fit: {
33
+ control: { type: 'select', options: Object.values(IMAGE_FITS) },
34
+ defaultValue: IMAGE_FITS.COVER,
35
+ },
36
+ };
@@ -0,0 +1,94 @@
1
+ <template>
2
+ <div class="ds-image">
3
+ <img
4
+ class="ds-image__image"
5
+ :class="{
6
+ '-ds-accelerate': accelerate,
7
+ '-ds-contain': fit === IMAGE_FITS.CONTAIN,
8
+ '-ds-cover': fit === IMAGE_FITS.COVER,
9
+ }"
10
+ draggable="false"
11
+ loading="lazy"
12
+ :src="src"
13
+ @error="isLoading = false"
14
+ @load="isLoading = false"
15
+ />
16
+ <div v-if="isLoading" class="ds-image__loader">
17
+ <ds-skeleton :radius="SKELETON_RADIUS_SIZES.SMALL" />
18
+ </div>
19
+ </div>
20
+ </template>
21
+
22
+ <style lang="scss" scoped>
23
+ .ds-image {
24
+ height: 100%;
25
+ position: relative;
26
+
27
+ &__image {
28
+ height: 100%;
29
+ user-select: none;
30
+ width: 100%;
31
+
32
+ &.-ds-accelerate {
33
+ transform: translate3d(0, 0, 0);
34
+ }
35
+
36
+ &.-ds-contain {
37
+ object-fit: contain;
38
+ }
39
+
40
+ &.-ds-cover {
41
+ object-fit: cover;
42
+ }
43
+ }
44
+
45
+ &__loader {
46
+ bottom: 0;
47
+ left: 0;
48
+ position: absolute;
49
+ right: 0;
50
+ top: 0;
51
+ }
52
+ }
53
+ </style>
54
+
55
+ <script lang="ts">
56
+ import { defineComponent, PropType } from 'vue';
57
+ import { IMAGE_FITS, ImageFit } from './Image.consts';
58
+ import { SKELETON_RADIUS_SIZES } from '../Skeleton/Skeleton.consts';
59
+ import DsSkeleton from '../Skeleton/Skeleton.vue';
60
+
61
+ export default defineComponent({
62
+ // <image> is "an ancient and poorly supported precursor to the <img> element"
63
+ // so there should be no conflicts. Also, we prefix all DS components with ds-
64
+ // https://developer.mozilla.org/en-US/docs/Web/HTML/Element#obsolete_and_deprecated_elements
65
+ // eslint-disable-next-line vue/no-reserved-component-names
66
+ name: 'Image',
67
+ components: {
68
+ DsSkeleton,
69
+ },
70
+ props: {
71
+ // Use when there are performance issues when other elements are overlayed
72
+ // on the image, e.g. a RichListItem border covers a part of the image
73
+ accelerate: {
74
+ type: Boolean,
75
+ default: false,
76
+ },
77
+ fit: {
78
+ type: String as PropType<ImageFit>,
79
+ default: IMAGE_FITS.COVER,
80
+ },
81
+ src: {
82
+ type: String,
83
+ required: true,
84
+ },
85
+ },
86
+ data() {
87
+ return {
88
+ isLoading: true,
89
+ IMAGE_FITS: Object.freeze(IMAGE_FITS),
90
+ SKELETON_RADIUS_SIZES: Object.freeze(SKELETON_RADIUS_SIZES),
91
+ };
92
+ },
93
+ });
94
+ </script>
@@ -0,0 +1,3 @@
1
+ import Image from './Image.vue';
2
+
3
+ export default Image;