@weni/unnnic-system 3.31.1 → 3.32.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 (34) hide show
  1. package/dist/index.d.ts +1518 -4106
  2. package/dist/style.css +1 -1
  3. package/dist/unnnic.mjs +12879 -13865
  4. package/dist/unnnic.umd.js +36 -36
  5. package/package.json +1 -1
  6. package/src/components/index.ts +1 -41
  7. package/src/stories/PageHeader.stories.js +11 -5
  8. package/src/types/index.d.ts +0 -1
  9. package/src/components/Button/ButtonIcon.vue +0 -106
  10. package/src/components/Button/__tests__/ButtonIcon.spec.js +0 -56
  11. package/src/components/Carousel/Carousel.vue +0 -59
  12. package/src/components/Carousel/TagCarousel.vue +0 -209
  13. package/src/components/Carousel/__tests__/TagCarousel.spec.js +0 -258
  14. package/src/components/ChatText/ChatText.vue +0 -179
  15. package/src/components/CircleProgressBar/CircleProgressBar.vue +0 -150
  16. package/src/components/Indicator/Indicator.vue +0 -110
  17. package/src/components/InputNext/InputNext.vue +0 -282
  18. package/src/components/ModalUpload/ModalUpload.vue +0 -181
  19. package/src/components/MoodRating/MoodRating.vue +0 -130
  20. package/src/components/Slider/Slider.vue +0 -438
  21. package/src/components/Slider/__tests__/Slider.spec.js +0 -321
  22. package/src/components/StarRating/StarRating.vue +0 -76
  23. package/src/components/TransitionRipple/TransitionRipple.vue +0 -126
  24. package/src/stories/ButtonIcon.stories.js +0 -31
  25. package/src/stories/Carousel.stories.js +0 -45
  26. package/src/stories/ChatText.stories.js +0 -57
  27. package/src/stories/CircleProgressBar.stories.js +0 -15
  28. package/src/stories/Indicator.stories.js +0 -18
  29. package/src/stories/InputNext.stories.js +0 -92
  30. package/src/stories/ModalUpload.stories.js +0 -25
  31. package/src/stories/MoodRating.stories.js +0 -33
  32. package/src/stories/Slider.stories.js +0 -23
  33. package/src/stories/StarRating.stories.js +0 -38
  34. package/src/stories/TransitionRipple.stories.js +0 -35
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weni/unnnic-system",
3
- "version": "3.31.1",
3
+ "version": "3.32.0",
4
4
  "type": "commonjs",
5
5
  "files": [
6
6
  "dist",
@@ -2,10 +2,8 @@ import type { Component } from 'vue';
2
2
  import { unnnicFontSize as fontSize } from './config';
3
3
  import formElement from './FormElement/FormElement.vue';
4
4
  import input from './Input/Input.vue';
5
- import inputNext from './InputNext/InputNext.vue';
6
5
  import inputDatePicker from './InputDatePicker/InputDatePicker.vue';
7
6
  import button from './Button/Button.vue';
8
- import buttonIcon from './Button/ButtonIcon.vue';
9
7
  import sidebar from './Sidebar/index.vue';
10
8
  import sidebarItem from './Sidebar/SidebarItem.vue';
11
9
  import table from './Table/Table.vue';
@@ -32,7 +30,6 @@ import radio from './Radio/Radio.vue';
32
30
  import radioGroup from './RadioGroup/RadioGroup.vue';
33
31
  import languageSelect from './Dropdown/LanguageSelect.vue';
34
32
  import modal from './Modal/Modal.vue';
35
- import modalUpload from './ModalUpload/ModalUpload.vue';
36
33
  import { callAlert, callModal } from '../utils/call';
37
34
  import selectSmart from './SelectSmart/SelectSmart.vue';
38
35
  import select from './Select/index.vue';
@@ -44,9 +41,7 @@ import alert from './Alert/Alert.vue';
44
41
  // import autocompleteSelect from './AutocompleteSelect/AutocompleteSelect.vue';
45
42
  import tag from './Tag/Tag.vue';
46
43
  import accordion from './Accordion/Accordion.vue';
47
- import indicator from './Indicator/Indicator.vue';
48
- import skeletonLoading from './SkeletonLoading/SkeletonLoading.vue'; // TODO: Unbreak this component
49
- import carousel from './Carousel/Carousel.vue';
44
+ import skeletonLoading from './SkeletonLoading/SkeletonLoading.vue';
50
45
  import label from './Label/Label.vue';
51
46
  import tab from './Tab/Tab.vue';
52
47
  import tabsExpanded from './TabsExpanded/TabsExpanded.vue';
@@ -55,23 +50,18 @@ import comment from './Comment/Comment.vue';
55
50
  import datePicker from './DatePicker/DatePicker.vue';
56
51
  import breadcrumb from './Breadcrumb/Breadcrumb.vue';
57
52
  import Switch from './Switch/Switch.vue';
58
- import Slider from './Slider/Slider.vue';
59
53
  import DataArea from './DataArea/DataArea.vue';
60
54
  import Pagination from './Pagination/Pagination.vue';
61
55
  import DropArea from './DropArea/DropArea.vue';
62
56
  import UploadArea from './UploadArea/UploadArea.vue';
63
57
  import ImportCard from './ImportCard/ImportCard.vue';
64
58
  import DateFilter from './DateFilter/DateFilter.vue';
65
- import ChatText from './ChatText/ChatText.vue';
66
59
  import TextArea from './TextArea/TextArea.vue';
67
60
  import CardNumber from './CardNumber/CardNumber.vue';
68
61
  import chartRainbow from './ChartRainbow/ChartRainbow.vue';
69
62
  import chartBar from './ChartBar/ChartBar.vue';
70
63
  import chartLine from './ChartLine/ChartLine.vue';
71
- import moodRating from './MoodRating/MoodRating.vue';
72
- import starRating from './StarRating/StarRating.vue';
73
64
  import audioRecorder from './AudioRecorder/AudioRecorder.vue';
74
- import circleProgressBar from './CircleProgressBar/CircleProgressBar.vue';
75
65
  import progressBar from './ProgressBar/ProgressBar.vue';
76
66
  import ChatsUserAvatar from './ChatsUserAvatar/ChatsUserAvatar.vue';
77
67
  import ChartMultiLine from './ChartMultiLine/ChartMultiLine.vue';
@@ -131,10 +121,8 @@ export interface ComponentsMap {
131
121
  export const components: ComponentsMap = {
132
122
  unnnicFormElement: formElement,
133
123
  unnnicInput: input,
134
- unnnicInputNext: inputNext,
135
124
  unnnicInputDatePicker: inputDatePicker,
136
125
  unnnicButton: button,
137
- unnnicButtonIcon: buttonIcon,
138
126
  unnnicSidebar: sidebar,
139
127
  unnnicSidebarItem: sidebarItem,
140
128
  unnnicTable: table,
@@ -167,7 +155,6 @@ export const components: ComponentsMap = {
167
155
  unnnicModal: modal,
168
156
  unnnicModalNext: ModalNext,
169
157
  unnnicModalDialog: ModalDialog,
170
- unnnicModalUpload: modalUpload,
171
158
  unnnicSelectSmart: selectSmart,
172
159
  unnnicSelect: select,
173
160
  unnnicSelectItem: selectItem,
@@ -180,9 +167,7 @@ export const components: ComponentsMap = {
180
167
  // unnnicAutocompleteSelect: autocompleteSelect,
181
168
  unnnicTag: tag,
182
169
  unnnicAccordion: accordion,
183
- unnnicIndicator: indicator,
184
170
  unnnicSkeletonLoading: skeletonLoading,
185
- unnnicCarousel: carousel,
186
171
  unnnicLabel: label,
187
172
  unnnicTab: tab,
188
173
  unnnicTabsExpanded: tabsExpanded,
@@ -191,23 +176,18 @@ export const components: ComponentsMap = {
191
176
  unnnicDatePicker: datePicker,
192
177
  unnnicBreadcrumb: breadcrumb,
193
178
  unnnicSwitch: Switch,
194
- unnnicSlider: Slider,
195
179
  unnnicDataArea: DataArea,
196
180
  unnnicPagination: Pagination,
197
181
  unnnicDropArea: DropArea,
198
182
  unnnicUploadArea: UploadArea,
199
183
  unnnicImportCard: ImportCard,
200
184
  unnnicDateFilter: DateFilter,
201
- unnnicChatText: ChatText,
202
185
  unnnicTextArea: TextArea,
203
186
  unnnicCardNumber: CardNumber,
204
187
  unnnicChartRainbow: chartRainbow,
205
188
  unnnicChartBar: chartBar,
206
189
  unnnicChartLine: chartLine,
207
- unnnicMoodRating: moodRating,
208
- unnnicStarRating: starRating,
209
190
  unnnicAudioRecorder: audioRecorder,
210
- unnnicCircleProgressBar: circleProgressBar,
211
191
  unnnicProgressBar: progressBar,
212
192
  unnnicChatsUserAvatar: ChatsUserAvatar,
213
193
  unnnicChartMultiLine: ChartMultiLine,
@@ -258,10 +238,8 @@ export const components: ComponentsMap = {
258
238
  export const unnnicFontSize = fontSize;
259
239
  export const unnnicFormElement = formElement;
260
240
  export const unnnicInput = input;
261
- export const unnnicInputNext = inputNext;
262
241
  export const unnnicInputDatePicker = inputDatePicker as VueComponent;
263
242
  export const unnnicButton = button;
264
- export const unnnicButtonIcon = buttonIcon;
265
243
  export const unnnicSidebar = sidebar;
266
244
  export const unnnicSidebarItem = sidebarItem;
267
245
  export const unnnicTable = table;
@@ -294,7 +272,6 @@ export const unnniclanguageSelect = languageSelect as VueComponent;
294
272
  export const unnnicModal = modal;
295
273
  export const unnnicModalDialog = ModalDialog;
296
274
  export const unnnicModalNext = ModalNext;
297
- export const unnnicModalUpload = modalUpload;
298
275
  export const unnnicSelectSmart = selectSmart as VueComponent;
299
276
  export const unnnicSelect = select as VueComponent;
300
277
  export const unnnicSelectItem = selectItem;
@@ -307,9 +284,7 @@ export const unnnicCallModal = (props: any) => callModal(props);
307
284
  // export const unnnicAutocompleteSelect = autocompleteSelect;
308
285
  export const unnnicTag = tag;
309
286
  export const unnnicAccordion = accordion;
310
- export const unnnicIndicator = indicator;
311
287
  export const unnnicSkeletonLoading = skeletonLoading;
312
- export const unnnicCarousel = carousel;
313
288
  export const unnnicLabel = label as VueComponent;
314
289
  export const unnnicTab = tab;
315
290
  export const unnnicTabsExpanded = tabsExpanded;
@@ -318,23 +293,18 @@ export const unnnicComment = comment;
318
293
  export const unnnicDatePicker = datePicker;
319
294
  export const unnnicBreadcrumb = breadcrumb;
320
295
  export const unnnicSwitch = Switch;
321
- export const unnnicSlider = Slider;
322
296
  export const unnnicDataArea = DataArea;
323
297
  export const unnnicPagination = Pagination;
324
298
  export const unnnicDropArea = DropArea;
325
299
  export const unnnicUploadArea = UploadArea;
326
300
  export const unnnicImportCard = ImportCard;
327
301
  export const unnnicDateFilter = DateFilter;
328
- export const unnnicChatText = ChatText;
329
302
  export const unnnicTextArea = TextArea;
330
303
  export const unnnicCardNumber = CardNumber;
331
304
  export const unnnicChartRainbow = chartRainbow;
332
305
  export const unnnicChartBar = chartBar;
333
306
  export const unnnicChartLine = chartLine;
334
- export const unnnicMoodRating = moodRating;
335
- export const unnnicStarRating = starRating;
336
307
  export const unnnicAudioRecorder = audioRecorder;
337
- export const unnnicCircleProgressBar = circleProgressBar;
338
308
  export const unnnicProgressBar = progressBar;
339
309
  export const unnnicChatsUserAvatar = ChatsUserAvatar;
340
310
  export const unnnicChartMultiLine = ChartMultiLine;
@@ -384,10 +354,8 @@ export const unnnicDrawerDescription = DrawerDescription;
384
354
  export const UnnnicFontSize = fontSize;
385
355
  export const UnnnicFormElement = formElement;
386
356
  export const UnnnicInput = input;
387
- export const UnnnicInputNext = inputNext;
388
357
  export const UnnnicInputDatePicker = inputDatePicker as VueComponent;
389
358
  export const UnnnicButton = button;
390
- export const UnnnicButtonIcon = buttonIcon;
391
359
  export const UnnnicSidebar = sidebar;
392
360
  export const UnnnicSidebarItem = sidebarItem;
393
361
  export const UnnnicTable = table;
@@ -420,7 +388,6 @@ export const UnnniclanguageSelect = languageSelect as VueComponent;
420
388
  export const UnnnicModal = modal;
421
389
  export const UnnnicModalDialog = ModalDialog;
422
390
  export const UnnnicModalNext = ModalNext;
423
- export const UnnnicModalUpload = modalUpload;
424
391
  export const UnnnicSelectSmart = selectSmart as VueComponent;
425
392
  export const UnnnicSelect = select as VueComponent;
426
393
  export const UnnnicSelectItem = selectItem;
@@ -433,9 +400,7 @@ export const UnnnicCallModal = (props: any) => callModal(props);
433
400
  // export const UnnnicAutocompleteSelect = autocompleteSelect;
434
401
  export const UnnnicTag = tag;
435
402
  export const UnnnicAccordion = accordion;
436
- export const UnnnicIndicator = indicator;
437
403
  export const UnnnicSkeletonLoading = skeletonLoading;
438
- export const UnnnicCarousel = carousel;
439
404
  export const UnnnicLabel = label as VueComponent;
440
405
  export const UnnnicTab = tab;
441
406
  export const UnnnicTabsExpanded = tabsExpanded;
@@ -444,23 +409,18 @@ export const UnnnicComment = comment;
444
409
  export const UnnnicDatePicker = datePicker;
445
410
  export const UnnnicBreadcrumb = breadcrumb;
446
411
  export const UnnnicSwitch = Switch;
447
- export const UnnnicSlider = Slider;
448
412
  export const UnnnicDataArea = DataArea;
449
413
  export const UnnnicPagination = Pagination;
450
414
  export const UnnnicDropArea = DropArea;
451
415
  export const UnnnicUploadArea = UploadArea;
452
416
  export const UnnnicImportCard = ImportCard;
453
417
  export const UnnnicDateFilter = DateFilter;
454
- export const UnnnicChatText = ChatText;
455
418
  export const UnnnicTextArea = TextArea;
456
419
  export const UnnnicCardNumber = CardNumber;
457
420
  export const UnnnicChartRainbow = chartRainbow;
458
421
  export const UnnnicChartBar = chartBar;
459
422
  export const UnnnicChartLine = chartLine;
460
- export const UnnnicMoodRating = moodRating;
461
- export const UnnnicStarRating = starRating;
462
423
  export const UnnnicAudioRecorder = audioRecorder;
463
- export const UnnnicCircleProgressBar = circleProgressBar;
464
424
  export const UnnnicProgressBar = progressBar;
465
425
  export const UnnnicChatsUserAvatar = ChatsUserAvatar;
466
426
  export const UnnnicChartMultiLine = ChartMultiLine;
@@ -3,7 +3,7 @@ import { action } from 'storybook/actions';
3
3
  import PageHeader from '../components/PageHeader/PageHeader.vue';
4
4
  import UnnnicButton from '../components/Button/Button.vue';
5
5
  import UnnnicTag from '../components/Tag/Tag.vue';
6
- import UnnnicSelectSmart from '../components/SelectSmart/SelectSmart.vue';
6
+ import UnnnicSelect from '../components/Select/index.vue';
7
7
  import UnnnicIcon from '../components/Icon.vue';
8
8
 
9
9
  import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs';
@@ -193,7 +193,7 @@ export const WithSelect = {
193
193
  description="Description"
194
194
  >
195
195
  <template #actions>
196
- <UnnnicSelectSmart />
196
+ <UnnnicSelect placeholder="Select" :options="options" />
197
197
  </template>
198
198
  </UnnnicPageHeader>
199
199
  `,
@@ -201,14 +201,20 @@ export const WithSelect = {
201
201
  },
202
202
  },
203
203
  render: (args) => ({
204
- components: { PageHeader, UnnnicSelectSmart },
204
+ components: { PageHeader, UnnnicSelect },
205
205
  setup() {
206
- return { args };
206
+ return {
207
+ args,
208
+ options: [
209
+ { label: 'Option 1', value: 'option1' },
210
+ { label: 'Option 2', value: 'option2' },
211
+ ],
212
+ };
207
213
  },
208
214
  template: `
209
215
  <PageHeader v-bind="args">
210
216
  <template #actions>
211
- <UnnnicSelectSmart />
217
+ <UnnnicSelect placeholder="Select" :options="options" />
212
218
  </template>
213
219
  </PageHeader>
214
220
  `,
@@ -36,7 +36,6 @@ export declare const unnnicTag: Component;
36
36
  export declare const unnnicTab: Component;
37
37
  export declare const unnnicAccordion: Component;
38
38
  export declare const unnnicCollapse: Component;
39
- export declare const unnnicCarousel: Component;
40
39
  export declare const unnnicSidebar: Component;
41
40
  export declare const unnnicDrawer: Component;
42
41
  export declare const unnnicProgressBar: Component;
@@ -1,106 +0,0 @@
1
- <template>
2
- <button
3
- :class="['button-icon', size, type]"
4
- v-bind="$attrs"
5
- >
6
- <UnnnicIcon
7
- :icon="icon"
8
- :scheme="iconScheme"
9
- size="ant"
10
- ></UnnnicIcon>
11
- </button>
12
- </template>
13
-
14
- <script>
15
- import UnnnicIcon from '../Icon.vue';
16
-
17
- export default {
18
- components: {
19
- UnnnicIcon,
20
- },
21
-
22
- props: {
23
- type: {
24
- type: String,
25
- default: 'secondary',
26
- },
27
-
28
- size: {
29
- type: String,
30
- required: true,
31
- validator(value) {
32
- return ['small', 'large'].includes(value);
33
- },
34
- },
35
-
36
- icon: {
37
- type: String,
38
- required: true,
39
- },
40
- },
41
-
42
- computed: {
43
- iconScheme() {
44
- if (this.type === 'primary') {
45
- return 'fg-inverted';
46
- }
47
-
48
- return 'fg-emphasized';
49
- },
50
- },
51
- };
52
- </script>
53
-
54
- <style lang="scss" scoped>
55
- @use '@/assets/scss/unnnic' as *;
56
-
57
- .button-icon {
58
- border: 0;
59
- cursor: pointer;
60
- border-radius: $unnnic-border-radius-sm;
61
-
62
- &.small {
63
- padding: $unnnic-spacing-inset-nano;
64
- }
65
-
66
- &.large {
67
- padding: $unnnic-spacing-inset-xs;
68
- }
69
-
70
- &.primary {
71
- background-color: $unnnic-color-fg-emphasized;
72
-
73
- &:hover {
74
- opacity: $unnnic-opacity-level-clear;
75
- }
76
- }
77
-
78
- &.secondary {
79
- background-color: rgba($unnnic-color-bg-muted, $unnnic-opacity-level-light);
80
- position: relative;
81
-
82
- &:before {
83
- content: ' ';
84
- position: absolute;
85
- left: 0;
86
- right: 0;
87
- top: 0;
88
- bottom: 0;
89
- border: 1px solid $unnnic-color-border-emphasized;
90
- border-radius: inherit;
91
- pointer-events: none;
92
- }
93
-
94
- &:hover {
95
- background-color: rgba(
96
- $unnnic-color-bg-muted,
97
- $unnnic-opacity-level-overlay
98
- );
99
-
100
- &:before {
101
- border: 0;
102
- }
103
- }
104
- }
105
- }
106
- </style>
@@ -1,56 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { mount } from '@vue/test-utils';
3
-
4
- import ButtonIcon from '../ButtonIcon.vue';
5
-
6
- const mountButtonIcon = (props = {}) =>
7
- mount(ButtonIcon, {
8
- props: {
9
- size: 'large',
10
- icon: 'search-1',
11
- ...props,
12
- },
13
- global: {
14
- stubs: {
15
- UnnnicIcon: {
16
- props: ['icon', 'scheme', 'size'],
17
- template:
18
- '<span data-testid="button-icon" :data-icon="icon" :data-scheme="scheme" />',
19
- },
20
- },
21
- },
22
- });
23
-
24
- describe('ButtonIcon', () => {
25
- it('renders with primary type icon scheme', () => {
26
- const wrapper = mountButtonIcon({ type: 'primary' });
27
-
28
- expect(
29
- wrapper.find('[data-testid="button-icon"]').attributes('data-scheme'),
30
- ).toBe('fg-inverted');
31
- expect(wrapper.classes()).toContain('primary');
32
- });
33
-
34
- it('renders with secondary type icon scheme', () => {
35
- const wrapper = mountButtonIcon({ type: 'secondary' });
36
-
37
- expect(
38
- wrapper.find('[data-testid="button-icon"]').attributes('data-scheme'),
39
- ).toBe('fg-emphasized');
40
- expect(wrapper.classes()).toContain('secondary');
41
- });
42
-
43
- it('applies size class', () => {
44
- const wrapper = mountButtonIcon({ size: 'small' });
45
-
46
- expect(wrapper.classes()).toContain('small');
47
- });
48
-
49
- it('rejects invalid size prop in validator', () => {
50
- const { validator } = ButtonIcon.props.size;
51
-
52
- expect(validator('large')).toBe(true);
53
- expect(validator('small')).toBe(true);
54
- expect(validator('invalid')).toBe(false);
55
- });
56
- });
@@ -1,59 +0,0 @@
1
- <template>
2
- <component
3
- :is="currentComponent"
4
- class="unnnic-carousel-component"
5
- v-bind="$attrs"
6
- :name="name"
7
- :clickable="clickable"
8
- :tagItems="tagItems"
9
- :modelValue="modelValue"
10
- @selected="$emit('update:model-value', $event)"
11
- />
12
- </template>
13
-
14
- <script>
15
- import TagCarousel from './TagCarousel.vue';
16
-
17
- export default {
18
- name: 'UnnnicCarousel',
19
- model: {
20
- event: 'update:model-value',
21
- },
22
- props: {
23
- modelValue: {
24
- type: Array,
25
- default() {
26
- return [];
27
- },
28
- },
29
- type: {
30
- type: String,
31
- default: 'brand',
32
- validator(value) {
33
- return ['brand'].indexOf(value) !== -1;
34
- },
35
- },
36
- tagItems: {
37
- type: Array,
38
- default: () => [],
39
- },
40
- name: {
41
- type: String,
42
- default: null,
43
- },
44
- icon: {
45
- type: String,
46
- default: null,
47
- },
48
- clickable: {
49
- type: Boolean,
50
- default: false,
51
- },
52
- },
53
- computed: {
54
- currentComponent() {
55
- return TagCarousel;
56
- },
57
- },
58
- };
59
- </script>
@@ -1,209 +0,0 @@
1
- <template>
2
- <div class="unnnic-card-tag-carousel">
3
- <div
4
- class="unnnic-card-tag-carousel__button unnnic-card-tag-carousel__button--left"
5
- >
6
- <div class="unnnic-card-tag-carousel__button__icon">
7
- <UnnnicIcon
8
- icon="arrow-left-1-1"
9
- size="sm"
10
- :scheme="hasPrev ? 'fg-emphasized' : 'fg-muted'"
11
- clickable
12
- @click="handlePrevious"
13
- />
14
- </div>
15
- <span
16
- v-show="hasPrev"
17
- class="unnnic-card-tag-carousel__button__blur unnnic-card-tag-carousel__button__blur--left"
18
- />
19
- </div>
20
-
21
- <div
22
- id="scroll"
23
- class="unnnic-card-tag-carousel__container"
24
- >
25
- <div
26
- v-for="tag in slides"
27
- :key="tag.id"
28
- class="unnnic-card-tag-carousel__container__slide"
29
- >
30
- <UnnnicTag
31
- :text="tag.name"
32
- clickable
33
- type="brand"
34
- :disabled="checkIsInclude(tag)"
35
- class="unnnic-card-tag-carousel__container__slide__item"
36
- @click="save(tag)"
37
- />
38
- </div>
39
- </div>
40
-
41
- <div
42
- class="unnnic-card-tag-carousel__button unnnic-card-tag-carousel__button--right"
43
- >
44
- <span
45
- v-show="hasNext"
46
- class="unnnic-card-tag-carousel__button__blur unnnic-card-tag-carousel__button__blur--right"
47
- />
48
- <div class="unnnic-card-tag-carousel__button__icon">
49
- <UnnnicIcon
50
- icon="arrow-right-1-1"
51
- size="sm"
52
- :scheme="hasNext ? 'fg-emphasized' : 'fg-muted'"
53
- clickable
54
- @click="handleNext"
55
- />
56
- </div>
57
- </div>
58
- </div>
59
- </template>
60
-
61
- <script>
62
- import UnnnicTag from '../Tag/Tag.vue';
63
- import UnnnicIcon from '../Icon.vue';
64
-
65
- export default {
66
- name: 'UnnnicTagCarousel',
67
- components: {
68
- UnnnicTag,
69
- UnnnicIcon,
70
- },
71
- props: {
72
- modelValue: {
73
- type: Array,
74
- default() {
75
- return [];
76
- },
77
- },
78
- tagItems: {
79
- type: Array,
80
- default: () => [],
81
- },
82
- },
83
- data() {
84
- return {
85
- hasNext: true,
86
- hasPrev: false,
87
- slides: [],
88
- };
89
- },
90
- mounted() {
91
- this.slides = this.tagItems;
92
- },
93
- methods: {
94
- handleNext() {
95
- this.next();
96
- },
97
- handlePrevious() {
98
- this.previous();
99
- },
100
- save(tagItem) {
101
- let valueLocal = this.modelValue;
102
- if (this.checkIsInclude(tagItem)) {
103
- valueLocal = valueLocal.filter((id) => id !== tagItem.id);
104
- } else {
105
- valueLocal = [...valueLocal, tagItem.id];
106
- }
107
- this.$emit('selected', valueLocal);
108
- },
109
- checkIsInclude(tagItem) {
110
- return this.modelValue.some((id) => id === tagItem.id);
111
- },
112
- next() {
113
- const element = document.querySelector('#scroll');
114
- const scrollCalc = element.scrollWidth - element.clientWidth;
115
- element.scrollLeft += 200;
116
- if (scrollCalc !== element.scrollLeft) {
117
- if (!this.hasNext) {
118
- this.hasNext = true;
119
- }
120
- this.hasPrev = true;
121
- } else {
122
- this.hasNext = false;
123
- }
124
- },
125
- previous() {
126
- const element = document.querySelector('#scroll');
127
- element.scrollLeft -= 200;
128
- if (element.scrollLeft !== 0) {
129
- if (!this.hasPrev) {
130
- this.hasPrev = true;
131
- }
132
- this.hasNext = true;
133
- } else {
134
- this.hasPrev = false;
135
- }
136
- },
137
- },
138
- };
139
- </script>
140
-
141
- <style lang="scss">
142
- @use '@/assets/scss/unnnic' as *;
143
-
144
- .unnnic-card-tag-carousel {
145
- display: flex;
146
- align-items: center;
147
- position: relative;
148
-
149
- &__container {
150
- width: 100%;
151
- display: flex;
152
- overflow: hidden;
153
- scroll-behavior: smooth;
154
-
155
- &__slide {
156
- &:first-of-type {
157
- margin-left: $unnnic-inline-lg;
158
- }
159
- &:last-of-type {
160
- margin-right: $unnnic-inline-awesome;
161
- }
162
- &__item {
163
- margin-right: 2 * $unnnic-font-size;
164
- }
165
- }
166
- }
167
-
168
- &__button {
169
- z-index: 1;
170
- position: absolute;
171
- display: flex;
172
- justify-content: center;
173
- align-items: center;
174
-
175
- &__icon {
176
- height: $unnnic-inline-lg;
177
- display: flex;
178
- justify-content: center;
179
- align-items: center;
180
- background-color: $unnnic-color-bg-base;
181
- }
182
-
183
- &__blur {
184
- width: $unnnic-inline-giant;
185
- height: $unnnic-inline-lg;
186
- &--left {
187
- background-image: linear-gradient(
188
- to right,
189
- $unnnic-color-bg-base,
190
- rgba($unnnic-color-bg-base, $unnnic-opacity-level-overlay)
191
- );
192
- }
193
- &--right {
194
- background-image: linear-gradient(
195
- to right,
196
- rgba($unnnic-color-bg-base, $unnnic-opacity-level-overlay),
197
- $unnnic-color-bg-base
198
- );
199
- }
200
- }
201
- &--left {
202
- left: 0;
203
- }
204
- &--right {
205
- right: 0;
206
- }
207
- }
208
- }
209
- </style>