@bethinkpl/design-system 26.13.0 → 26.14.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 (52) hide show
  1. package/.github/workflows/build-dist-on-trigger.yml +19 -3
  2. package/dist/design-system.umd.cjs +17 -17
  3. package/dist/design-system.umd.cjs.map +1 -1
  4. package/dist/lib/js/components/Avatar/Avatar.vue.d.ts +2 -0
  5. package/dist/lib/js/components/DatePickers/DatePicker/DatePicker.composables.d.ts +4 -1
  6. package/dist/lib/js/components/DatePickers/DatePicker/DatePicker.vue.d.ts +535 -8
  7. package/dist/lib/js/components/DatePickers/DateRangePicker/DateRangePicker.vue.d.ts +6 -2
  8. package/dist/lib/js/components/Dropdown/Dropdown.vue.d.ts +1 -1
  9. package/dist/lib/js/components/Headers/OverlayHeader/OverlayHeader.vue.d.ts +2 -2
  10. package/dist/lib/js/components/Pagination/Pagination.vue.d.ts +1 -1
  11. package/dist/lib/js/components/RichList/BasicRichListItem/BasicRichListItem.vue.d.ts +1 -1
  12. package/dist/lib/js/components/RichList/RichListItem/RichListItem.vue.d.ts +1 -1
  13. package/dist/lib/js/components/TextGroup/TextGroup.vue.d.ts +1 -1
  14. package/dist/lib/js/components/Toggles/CounterToggle/CounterToggle.vue.d.ts +1 -1
  15. package/dist/lib/js/components/Tooltip/Tooltip.vue.d.ts +1 -1
  16. package/docs/assets/Avatar-DUThlKLV.js +1 -0
  17. package/docs/assets/Avatar.stories-Dwgdl1h5.js +38 -0
  18. package/docs/assets/{BasicRichListItem-CEiYZukO.js → BasicRichListItem-B1E5DYkk.js} +1 -1
  19. package/docs/assets/{BasicRichListItem.stories-BEJ0NthN.js → BasicRichListItem.stories-D3ZlEF1v.js} +1 -1
  20. package/docs/assets/{Color-ERTF36HU-6VQes8GD.js → Color-ERTF36HU-ojyWSIYl.js} +1 -1
  21. package/docs/assets/{DateBox.stories-DQkN-NA-.js → DateBox.stories-20DXKTY7.js} +1 -1
  22. package/docs/assets/DatePicker-C7cFT9b-.js +2 -0
  23. package/docs/assets/{DatePicker.stories-BuPRHUPO.js → DatePicker.stories-DDTo9Sqz.js} +2 -2
  24. package/docs/assets/DateRangePicker-UzTV3CI5.js +1 -0
  25. package/docs/assets/{DateRangePicker.stories-U0CpMcdr.js → DateRangePicker.stories-UO39Me0h.js} +1 -1
  26. package/docs/assets/{DocsRenderer-CFRXHY34-BtI7lPJt.js → DocsRenderer-CFRXHY34-CXWz8i_c.js} +5 -5
  27. package/docs/assets/{GroupRichListItem-8v8vJXgH.js → GroupRichListItem-onOADtuh.js} +1 -1
  28. package/docs/assets/{GroupRichListItem.stories-KjZ2JDho.js → GroupRichListItem.stories-BXIoUT_x.js} +1 -1
  29. package/docs/assets/{RichListItem.stories-B66Eh4Ya.js → RichListItem.stories-BljlBlCr.js} +1 -1
  30. package/docs/assets/{SelectionTile-CTk2qsoq.js → SelectionTile-DTFNomSh.js} +1 -1
  31. package/docs/assets/{SelectionTile.stories-BQdf1ZAm.js → SelectionTile.stories-Dy-SD0ba.js} +1 -1
  32. package/docs/assets/{iframe-D0_R78Pi.js → iframe-Bp0Qg1rC.js} +6 -6
  33. package/docs/assets/{index-_KmMzH9C.js → index-DD7sagXV.js} +1 -1
  34. package/docs/assets/{index-CmxKferx.js → index-DYIFlNCs.js} +1 -1
  35. package/docs/assets/{preview-BVg41aHH.js → preview-Bq1TajdW.js} +1 -1
  36. package/docs/assets/{preview-bQNvU0Tw.js → preview-DQNre2-F.js} +2 -2
  37. package/docs/iframe.html +1 -1
  38. package/docs/project.json +1 -1
  39. package/lib/js/components/Avatar/Avatar.spec.ts +16 -0
  40. package/lib/js/components/Avatar/Avatar.stories.ts +4 -0
  41. package/lib/js/components/Avatar/Avatar.vue +23 -5
  42. package/lib/js/components/DatePickers/DatePicker/DatePicker.composables.ts +30 -12
  43. package/lib/js/components/DatePickers/DatePicker/DatePicker.stories.ts +5 -5
  44. package/lib/js/components/DatePickers/DatePicker/DatePicker.vue +38 -26
  45. package/lib/js/components/DatePickers/DateRangePicker/DateRangePicker.stories.ts +3 -3
  46. package/lib/js/components/DatePickers/DateRangePicker/DateRangePicker.vue +26 -24
  47. package/lib/js/components/RichList/RichListItem/RichListItem.vue +20 -17
  48. package/package.json +1 -1
  49. package/docs/assets/Avatar-U_7Z6nZ2.js +0 -1
  50. package/docs/assets/Avatar.stories-CVysqINz.js +0 -37
  51. package/docs/assets/DatePicker-Dfk2S4XE.js +0 -2
  52. package/docs/assets/DateRangePicker-C591NaMz.js +0 -1
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DocsRenderer-CFRXHY34-BtI7lPJt.js","./iframe-D0_R78Pi.js","./_commonjsHelpers-Chg3vePA.js","./index-vG0co4wr.js"])))=>i.map(i=>d[i]);
2
- import{_ as s}from"./iframe-D0_R78Pi.js";import"../sb-preview/runtime.js";const{global:_}=__STORYBOOK_MODULE_GLOBAL__;var o,i=Object.entries((o=_.TAGS_OPTIONS)!=null?o:{}).reduce((e,r)=>{let[t,a]=r;return a.excludeFromDocsStories&&(e[t]=!0),e},{}),d={docs:{renderer:async()=>{let{DocsRenderer:e}=await s(()=>import("./DocsRenderer-CFRXHY34-BtI7lPJt.js").then(r=>r.am),__vite__mapDeps([0,1,2,3]),import.meta.url);return new e},stories:{filter:e=>{var r;return(e.tags||[]).filter(t=>i[t]).length===0&&!((r=e.parameters.docs)!=null&&r.disable)}}}};export{d as parameters};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DocsRenderer-CFRXHY34-CXWz8i_c.js","./iframe-Bp0Qg1rC.js","./_commonjsHelpers-Chg3vePA.js","./index-vG0co4wr.js"])))=>i.map(i=>d[i]);
2
+ import{_ as s}from"./iframe-Bp0Qg1rC.js";import"../sb-preview/runtime.js";const{global:_}=__STORYBOOK_MODULE_GLOBAL__;var o,i=Object.entries((o=_.TAGS_OPTIONS)!=null?o:{}).reduce((e,r)=>{let[t,a]=r;return a.excludeFromDocsStories&&(e[t]=!0),e},{}),d={docs:{renderer:async()=>{let{DocsRenderer:e}=await s(()=>import("./DocsRenderer-CFRXHY34-CXWz8i_c.js").then(r=>r.am),__vite__mapDeps([0,1,2,3]),import.meta.url);return new e},stories:{filter:e=>{var r;return(e.tags||[]).filter(t=>i[t]).length===0&&!((r=e.parameters.docs)!=null&&r.disable)}}}};export{d as parameters};
package/docs/iframe.html CHANGED
@@ -510,7 +510,7 @@
510
510
  </script>
511
511
  <link rel="stylesheet" href="./preview.css">
512
512
 
513
- <script type="module" crossorigin src="./assets/iframe-D0_R78Pi.js"></script>
513
+ <script type="module" crossorigin src="./assets/iframe-Bp0Qg1rC.js"></script>
514
514
  </head>
515
515
 
516
516
  <body>
package/docs/project.json CHANGED
@@ -1 +1 @@
1
- {"generatedAt":1744098148018,"hasCustomBabel":false,"hasCustomWebpack":false,"hasStaticDirs":true,"hasStorybookEslint":true,"refCount":0,"testPackages":{"@types/jest":"29.5.13","@vue/vue3-jest":"29.2.2","jest":"29.7.0","jest-environment-jsdom":"29.7.0","ts-jest":"29.0.5"},"packageManager":{"type":"yarn","version":"1.22.22"},"preview":{"usesGlobals":false},"framework":{"name":"@storybook/vue3-vite","options":{}},"builder":"@storybook/builder-vite","renderer":"@storybook/vue3","portableStoriesFileCount":2,"storybookVersion":"8.3.4","storybookVersionSpecifier":"^8.3.4","language":"typescript","storybookPackages":{"@storybook/vue3":{"version":"8.3.4"},"@storybook/vue3-vite":{"version":"8.3.4"},"eslint-plugin-storybook":{"version":"0.8.0"},"storybook":{"version":"8.3.4"}},"addons":{"@storybook/addon-actions":{"version":"8.3.4"},"@storybook/addon-designs":{"version":"8.0.3"},"@storybook/addon-docs":{"version":"8.3.4"},"@storybook/addon-controls":{"version":"8.3.4"},"@storybook/addon-storysource":{"version":"8.3.4"},"@storybook/addon-viewport":{"version":"8.3.4"}}}
1
+ {"generatedAt":1747724156754,"hasCustomBabel":false,"hasCustomWebpack":false,"hasStaticDirs":true,"hasStorybookEslint":true,"refCount":0,"testPackages":{"@types/jest":"29.5.13","@vue/vue3-jest":"29.2.2","jest":"29.7.0","jest-environment-jsdom":"29.7.0","ts-jest":"29.0.5"},"packageManager":{"type":"yarn","version":"1.22.22"},"preview":{"usesGlobals":false},"framework":{"name":"@storybook/vue3-vite","options":{}},"builder":"@storybook/builder-vite","renderer":"@storybook/vue3","portableStoriesFileCount":2,"storybookVersion":"8.3.4","storybookVersionSpecifier":"^8.3.4","language":"typescript","storybookPackages":{"@storybook/vue3":{"version":"8.3.4"},"@storybook/vue3-vite":{"version":"8.3.4"},"eslint-plugin-storybook":{"version":"0.8.0"},"storybook":{"version":"8.3.4"}},"addons":{"@storybook/addon-actions":{"version":"8.3.4"},"@storybook/addon-designs":{"version":"8.0.3"},"@storybook/addon-docs":{"version":"8.3.4"},"@storybook/addon-controls":{"version":"8.3.4"},"@storybook/addon-storysource":{"version":"8.3.4"},"@storybook/addon-viewport":{"version":"8.3.4"}}}
@@ -214,4 +214,20 @@ describe('Avatar', () => {
214
214
  expect(accessStatusElement.exists()).toBe(true);
215
215
  expect(accessStatusElement.find('img').attributes('src')).toBe(teamMemberImageUrl);
216
216
  });
217
+
218
+ it('should pass activityStatusTooltip to the tooltip component', () => {
219
+ const tooltipText = 'Active now';
220
+ const wrapper = mount(Avatar, {
221
+ props: {
222
+ size: AVATAR_SIZES.MEDIUM,
223
+ username: 'Dariusz Chrapek',
224
+ activityStatus: AVATAR_ACTIVITY_STATUSES.ACTIVE,
225
+ activityStatusTooltip: tooltipText,
226
+ },
227
+ });
228
+
229
+ const tooltip = wrapper.findComponent({ name: 'Tooltip' });
230
+ expect(tooltip.exists()).toBe(true);
231
+ expect(tooltip.props('text')).toBe(tooltipText);
232
+ });
217
233
  });
@@ -41,6 +41,9 @@ const meta: Meta<typeof Avatar> = {
41
41
  },
42
42
  options: [undefined, ...Object.values(AVATAR_ACTIVITY_STATUSES)],
43
43
  },
44
+ activityStatusTooltip: {
45
+ control: 'text',
46
+ },
44
47
  },
45
48
  };
46
49
  export default meta;
@@ -54,6 +57,7 @@ export const Interactive: Story = {
54
57
  avatarUrl:
55
58
  'https://wiecejnizlek.pl/wp-content/uploads/2021/08/Dariusz_Chrapek-uai-2996x2996-1-scaled.jpeg',
56
59
  teamMemberImageUrl: 'https://lek.wiecejnizlek.pl/images/lek/logo-badge.svg',
60
+ activityStatusTooltip: 'Active now',
57
61
  },
58
62
  };
59
63
 
@@ -20,11 +20,21 @@
20
20
  <span v-else class="ds-avatar__initials">{{ initials }}</span>
21
21
  </div>
22
22
  <div v-if="activityStatus" class="ds-avatar__activityStatus">
23
- <ds-badge
24
- :color="activityStatusColor"
25
- :elevation="BADGE_ELEVATIONS.X_SMALL"
26
- :size="activityStatusSize"
27
- />
23
+ <ds-tooltip
24
+ :key="activityStatusTooltip"
25
+ class="ds-avatar__activityStatusTooltip"
26
+ :text="activityStatusTooltip"
27
+ :is-disabled="!activityStatusTooltip"
28
+ is-pointer-visible
29
+ :placement="TOOLTIP_PLACEMENTS.BOTTOM"
30
+ :is-hidden-on-mobile="false"
31
+ >
32
+ <ds-badge
33
+ :color="activityStatusColor"
34
+ :elevation="BADGE_ELEVATIONS.X_SMALL"
35
+ :size="activityStatusSize"
36
+ />
37
+ </ds-tooltip>
28
38
  </div>
29
39
  <div v-if="accessStatus" class="ds-avatar__accessStatus">
30
40
  <ds-badge
@@ -169,6 +179,11 @@
169
179
  top: -3px;
170
180
  }
171
181
  }
182
+
183
+ &__activityStatusTooltip {
184
+ align-items: center;
185
+ display: flex;
186
+ }
172
187
  }
173
188
  </style>
174
189
 
@@ -184,6 +199,7 @@ import {
184
199
  import DsBadge, { BADGE_ELEVATIONS, BADGE_SIZES, BADGE_COLORS } from '../Badge';
185
200
  import { computed } from 'vue';
186
201
  import { ICONS } from '../Icons/Icon';
202
+ import DsTooltip, { TOOLTIP_PLACEMENTS } from '../Tooltip';
187
203
 
188
204
  const {
189
205
  size = AVATAR_SIZES.X_SMALL,
@@ -192,6 +208,7 @@ const {
192
208
  activityStatus,
193
209
  accessStatus,
194
210
  teamMemberImageUrl,
211
+ activityStatusTooltip,
195
212
  } = defineProps<{
196
213
  username: string;
197
214
  avatarUrl?: string;
@@ -199,6 +216,7 @@ const {
199
216
  activityStatus?: AvatarActivityStatus;
200
217
  accessStatus?: AvatarAccessStatus;
201
218
  teamMemberImageUrl?: string;
219
+ activityStatusTooltip?: string;
202
220
  }>();
203
221
 
204
222
  const { initials, initialBackgroundColor } = useInitials();
@@ -20,6 +20,7 @@ export interface DatePickerComposablesProps {
20
20
  interface InitFlatpickrPrams {
21
21
  props: DatePickerComposablesProps;
22
22
  onChange: (dates: Array<Date>) => void;
23
+ onClose: () => void;
23
24
  defaultDates: Date | Array<Date>;
24
25
  mode: 'single' | 'range';
25
26
  }
@@ -31,6 +32,8 @@ interface InitFlatpickr {
31
32
  dateRangePickerRef: HTMLElement,
32
33
  updatePositionBasedOnScrollableSelector: string,
33
34
  ) => Promise<DatePickerInstance | undefined>;
35
+ destroyDatePicker: () => void;
36
+ updateDatePicker: () => void;
34
37
  isOpen: Ref<boolean>;
35
38
  toggle: () => void;
36
39
  }
@@ -38,6 +41,7 @@ interface InitFlatpickr {
38
41
  export function initFlatpickr({
39
42
  props,
40
43
  onChange,
44
+ onClose,
41
45
  defaultDates,
42
46
  mode = 'single',
43
47
  }: InitFlatpickrPrams): InitFlatpickr {
@@ -82,6 +86,10 @@ export function initFlatpickr({
82
86
  onClose: [
83
87
  () => {
84
88
  isOpen.value = false;
89
+ // setTimeout is needed to ensure that the date picker is closed before the onClose callback is called
90
+ setTimeout(() => {
91
+ onClose();
92
+ });
85
93
  },
86
94
  ],
87
95
  onOpen: [
@@ -113,9 +121,13 @@ export function initFlatpickr({
113
121
  return datePicker;
114
122
  };
115
123
 
116
- onUnmounted(() => {
124
+ const destroyDatePicker = () => {
117
125
  datePicker?.destroy();
118
126
  datePicker = null;
127
+ };
128
+
129
+ onUnmounted(() => {
130
+ destroyDatePicker();
119
131
  });
120
132
 
121
133
  watch(
@@ -142,26 +154,32 @@ export function initFlatpickr({
142
154
  watch(
143
155
  [() => props.date, () => props.startDate, () => props.endDate],
144
156
  () => {
145
- if (props.date) {
146
- updateDatePickerDates(props.date);
147
- } else if (props.startDate && props.endDate) {
148
- updateDatePickerDates([props.startDate, props.endDate]);
149
- } else if (props.startDate && !props.endDate) {
150
- updateDatePickerDates(props.startDate);
151
- } else if (!props.startDate && props.endDate) {
152
- updateDatePickerDates(props.endDate);
153
- } else {
154
- datePicker?.clear(false);
155
- }
157
+ updateDatePicker();
156
158
  },
157
159
  {
158
160
  flush: 'post', // Ensure updates happen after DOM changes
159
161
  },
160
162
  );
161
163
 
164
+ const updateDatePicker = () => {
165
+ if (props.date) {
166
+ updateDatePickerDates(props.date);
167
+ } else if (props.startDate && props.endDate) {
168
+ updateDatePickerDates([props.startDate, props.endDate]);
169
+ } else if (props.startDate && !props.endDate) {
170
+ updateDatePickerDates(props.startDate);
171
+ } else if (!props.startDate && props.endDate) {
172
+ updateDatePickerDates(props.endDate);
173
+ } else {
174
+ datePicker?.clear(false);
175
+ }
176
+ };
177
+
162
178
  return {
163
179
  datePicker,
164
180
  createDatePicker,
181
+ destroyDatePicker,
182
+ updateDatePicker,
165
183
  isOpen,
166
184
  toggle: () => {
167
185
  datePicker?.toggle();
@@ -1,14 +1,14 @@
1
- import DatePicker from './DatePicker.vue';
1
+ import { useArgs } from '@storybook/preview-api';
2
+ import { Args, ArgTypes, Meta, StoryFn } from '@storybook/vue3';
3
+ import { ICONS } from '../../Icons/Icon';
4
+ import DsSwitch from '../../Switch';
2
5
  import {
3
6
  DATE_PICKER_CALENDAR_POSITIONS,
4
7
  DATE_PICKER_COLORS,
5
8
  DATE_PICKER_STATES,
6
9
  DATE_PICKER_TRIGGER_TYPES,
7
10
  } from './DatePicker.consts';
8
- import { Args, ArgTypes, Meta, StoryFn } from '@storybook/vue3';
9
- import { ICONS } from '../../Icons/Icon';
10
- import DsSwitch from '../../Switch';
11
- import { useArgs } from '@storybook/preview-api';
11
+ import DatePicker from './DatePicker.vue';
12
12
 
13
13
  export default {
14
14
  title: 'Components/DatePickers/DatePicker',
@@ -32,7 +32,7 @@
32
32
  :eyebrow-text="eyebrowText"
33
33
  :additional-text-max-width="TILE_ADDITIONAL_TEXT_MAX_WIDTHS.MEDIUM"
34
34
  has-border
35
- @click="toggle"
35
+ @click.stop.prevent="toggle"
36
36
  />
37
37
  </template>
38
38
  <date-box
@@ -45,7 +45,7 @@
45
45
  :state="state"
46
46
  :color="color"
47
47
  :is-open="isOpen"
48
- @click="toggle"
48
+ @click.stop.prevent="toggle"
49
49
  />
50
50
 
51
51
  <span v-if="showErrorMessage" class="ds-datePicker__errorMessage">
@@ -138,12 +138,25 @@
138
138
  </style>
139
139
 
140
140
  <script lang="ts">
141
- import { defineComponent, PropType, Ref, ref, toRaw, watch } from 'vue';
141
+ import { defineComponent, PropType, Ref, ref, toRaw } from 'vue';
142
+
143
+ import { Instance as DatePickerInstance } from 'flatpickr/dist/types/instance';
142
144
 
143
- import DsTile, { TILE_ADDITIONAL_TEXT_MAX_WIDTHS, TILE_BORDER_COLORS } from '../../Tile';
144
145
  import { IconItem, ICONS } from '../../Icons/Icon';
146
+ import DsTile, {
147
+ TILE_ADDITIONAL_TEXT_MAX_WIDTHS,
148
+ TILE_BORDER_COLORS,
149
+ TileColors,
150
+ TileStates,
151
+ } from '../../Tile';
145
152
  import DateBox from '../DateBox';
146
153
 
154
+ import {
155
+ localFullDateWithShortMonthName,
156
+ localWeekdayName,
157
+ } from '../../../../../tools/importers/helpers/dates';
158
+ import { capitalizeFirstLetter } from '../../../../../tools/importers/helpers/modifiers';
159
+ import { DatePickerComposablesProps, initFlatpickr } from './DatePicker.composables';
147
160
  import {
148
161
  DATE_PICKER_CALENDAR_POSITIONS,
149
162
  DATE_PICKER_COLORS,
@@ -154,12 +167,6 @@ import {
154
167
  DatePickerStates,
155
168
  DatePickerTriggerTypes,
156
169
  } from './DatePicker.consts';
157
- import { capitalizeFirstLetter } from '../../../../../tools/importers/helpers/modifiers';
158
- import { DatePickerComposablesProps, initFlatpickr } from './DatePicker.composables';
159
- import {
160
- localFullDateWithShortMonthName,
161
- localWeekdayName,
162
- } from '../../../../../tools/importers/helpers/dates';
163
170
 
164
171
  export default defineComponent({
165
172
  name: 'DatePicker',
@@ -255,6 +262,7 @@ export default defineComponent({
255
262
  },
256
263
  { emit },
257
264
  ) {
265
+ const flatpickrInstance = ref<DatePickerInstance | null>(null);
258
266
  const flatpickrInputRef = ref<HTMLInputElement>() as Ref<HTMLInputElement>;
259
267
  const datePickerRef = ref<HTMLDivElement>() as Ref<HTMLDivElement>;
260
268
 
@@ -262,31 +270,32 @@ export default defineComponent({
262
270
  emit('update:date', event[0]);
263
271
  };
264
272
 
273
+ const onClose = () => {
274
+ destroyDatePicker();
275
+ flatpickrInstance.value = null;
276
+ };
277
+
265
278
  const {
266
279
  isOpen,
267
280
  toggle: toggleDatePicker,
268
281
  createDatePicker,
282
+ destroyDatePicker,
283
+ updateDatePicker,
269
284
  } = initFlatpickr({
270
285
  props,
271
286
  onChange,
287
+ onClose,
272
288
  defaultDates: props.date ?? new Date(),
273
289
  mode: 'single',
274
290
  });
275
- watch([() => props.isInteractive, () => props.state], async () => {
276
- if (props.isInteractive && props.state === DATE_PICKER_STATES.DEFAULT) {
277
- await createDatePicker(
278
- flatpickrInputRef.value,
279
- datePickerRef.value,
280
- props.updatePositionBasedOnScrollableSelector,
281
- );
282
- }
283
- });
284
291
 
285
292
  return {
293
+ flatpickrInstance,
286
294
  flatpickrInputRef,
287
295
  datePickerRef,
288
296
  isOpen,
289
297
  toggleDatePicker,
298
+ updateDatePicker,
290
299
  createDatePicker,
291
300
  DATE_PICKER_CALENDAR_POSITIONS: Object.freeze(DATE_PICKER_CALENDAR_POSITIONS),
292
301
  DATE_PICKER_COLORS: Object.freeze(DATE_PICKER_COLORS),
@@ -340,18 +349,21 @@ export default defineComponent({
340
349
  return this.helpMessage !== null;
341
350
  },
342
351
  },
343
- async mounted() {
344
- if (this.isInteractive && this.state === DATE_PICKER_STATES.DEFAULT) {
345
- await this.createDatePicker(
352
+ methods: {
353
+ async bindFlatpickrInstance() {
354
+ this.flatpickrInstance = await this.createDatePicker(
346
355
  this.flatpickrInputRef,
347
356
  this.datePickerRef,
348
357
  this.updatePositionBasedOnScrollableSelector,
349
358
  );
350
- }
351
- },
352
- methods: {
353
- toggle() {
359
+ this.updateDatePicker();
360
+ },
361
+ async toggle() {
354
362
  if (this.isInteractive && this.state === DATE_PICKER_STATES.DEFAULT) {
363
+ if (!this.flatpickrInstance) {
364
+ await this.bindFlatpickrInstance();
365
+ }
366
+
355
367
  this.toggleDatePicker();
356
368
  }
357
369
  },
@@ -1,13 +1,13 @@
1
- import DateRangePicker from './DateRangePicker.vue';
1
+ import { useArgs } from '@storybook/preview-api';
2
2
  import { Args, ArgTypes, Meta, StoryObj } from '@storybook/vue3';
3
+ import { ComponentProps } from 'vue-component-type-helpers';
3
4
  import { ICONS } from '../../Icons/Icon';
4
5
  import {
5
6
  DATE_PICKER_CALENDAR_POSITIONS,
6
7
  DATE_PICKER_COLORS,
7
8
  DATE_PICKER_STATES,
8
9
  } from '../DatePicker';
9
- import { ComponentProps } from 'vue-component-type-helpers';
10
- import { useArgs } from '@storybook/preview-api';
10
+ import DateRangePicker from './DateRangePicker.vue';
11
11
 
12
12
  type DateRangePickerProps = ComponentProps<typeof DateRangePicker>;
13
13
 
@@ -11,7 +11,7 @@
11
11
  :state="state"
12
12
  :color="color"
13
13
  :is-open="isOpen"
14
- @click="toggle"
14
+ @click.stop.prevent="toggle"
15
15
  />
16
16
 
17
17
  <span v-if="errorMessage" class="ds-dateRangePicker__errorMessage">
@@ -48,9 +48,10 @@
48
48
  </style>
49
49
 
50
50
  <script lang="ts">
51
- import DateBox from '../DateBox';
51
+ import { Instance as DatePickerInstance } from 'flatpickr/dist/types/instance';
52
+ import { defineComponent, PropType, Ref, ref, toRaw } from 'vue';
52
53
  import { IconItem, ICONS } from '../../Icons/Icon';
53
- import { defineComponent, PropType, Ref, ref, toRaw, watch } from 'vue';
54
+ import DateBox from '../DateBox';
54
55
  import {
55
56
  DATE_PICKER_CALENDAR_POSITIONS,
56
57
  DATE_PICKER_COLORS,
@@ -146,6 +147,7 @@ export default defineComponent({
146
147
  },
147
148
  { emit },
148
149
  ) {
150
+ const flatpickrInstance = ref<DatePickerInstance | null>(null);
149
151
  const dateRangePickerRef = ref() as Ref<HTMLDivElement>;
150
152
  const flatpickrInputRef = ref() as Ref<HTMLInputElement>;
151
153
 
@@ -156,55 +158,55 @@ export default defineComponent({
156
158
  emit('update:date', { startDate: event[0], endDate: event[1] });
157
159
  };
158
160
 
161
+ const onClose = () => {
162
+ destroyDatePicker();
163
+ flatpickrInstance.value = null;
164
+ };
165
+
159
166
  const {
160
167
  isOpen,
161
168
  toggle: toggleDatePicker,
162
169
  createDatePicker,
170
+ destroyDatePicker,
171
+ updateDatePicker,
163
172
  } = initFlatpickr({
164
173
  props,
165
174
  onChange,
175
+ onClose,
166
176
  defaultDates: [props.startDate, props.endDate],
167
177
  mode: 'range',
168
178
  });
169
179
 
170
- watch(
171
- [() => props.isInteractive, () => props.state],
172
- async () => {
173
- if (props.isInteractive && props.state === DATE_PICKER_STATES.DEFAULT) {
174
- await createDatePicker(
175
- flatpickrInputRef.value,
176
- dateRangePickerRef.value,
177
- props.updatePositionBasedOnScrollableSelector,
178
- );
179
- }
180
- },
181
- { flush: 'post' },
182
- );
183
-
184
180
  return {
185
181
  dateRangePickerRef,
186
182
  flatpickrInputRef,
187
183
  isOpen,
188
184
  toggleDatePicker,
189
185
  createDatePicker,
186
+ destroyDatePicker,
187
+ updateDatePicker,
190
188
  DATE_PICKER_CALENDAR_POSITIONS: Object.freeze(DATE_PICKER_CALENDAR_POSITIONS),
191
189
  DATE_PICKER_COLORS: Object.freeze(DATE_PICKER_COLORS),
192
190
  DATE_PICKER_STATES: Object.freeze(DATE_PICKER_STATES),
193
191
  DATE_PICKER_TRIGGER_TYPES: Object.freeze(DATE_PICKER_TRIGGER_TYPES),
194
192
  };
195
193
  },
196
- async mounted() {
197
- if (this.isInteractive && this.state === DATE_PICKER_STATES.DEFAULT) {
198
- await this.createDatePicker(
194
+ methods: {
195
+ async bindFlatpickrInstance() {
196
+ this.flatpickrInstance = await this.createDatePicker(
199
197
  this.flatpickrInputRef,
200
198
  this.dateRangePickerRef,
201
199
  this.updatePositionBasedOnScrollableSelector,
202
200
  );
203
- }
204
- },
205
- methods: {
206
- toggle() {
201
+ this.updateDatePicker();
202
+ },
203
+
204
+ async toggle() {
207
205
  if (this.isInteractive && this.state === DATE_PICKER_STATES.DEFAULT) {
206
+ if (!this.flatpickrInstance) {
207
+ await this.bindFlatpickrInstance();
208
+ }
209
+
208
210
  this.toggleDatePicker();
209
211
  }
210
212
  },
@@ -81,6 +81,7 @@
81
81
  @import '../../../../styles/settings/media-queries';
82
82
  @import '../../../../styles/settings/radiuses';
83
83
  @import '../../../../styles/settings/spacings';
84
+ @import '../../../../styles/settings/borders';
84
85
  @import '../../../../styles/settings/shadows';
85
86
  @import '../../../../styles/settings/icons';
86
87
  @import './border-colors';
@@ -127,7 +128,7 @@ $rich-list-item-media-horizontal-height: 80px;
127
128
  align-items: center;
128
129
  flex-direction: initial;
129
130
  justify-content: initial;
130
- padding: 0 $space-4xs;
131
+ padding: 0 $space-4xs 0 calc($space-4xs - $border-xs);
131
132
 
132
133
  #{$root}__container {
133
134
  align-self: initial;
@@ -297,27 +298,29 @@ $rich-list-item-media-horizontal-height: 80px;
297
298
  cursor: pointer;
298
299
  pointer-events: initial;
299
300
 
300
- &.-ds-flat {
301
- &:hover {
302
- opacity: 1;
303
-
304
- .-ds-dimmable {
301
+ @media #{breakpoint-s()} {
302
+ &.-ds-flat {
303
+ &:hover {
305
304
  opacity: 1;
305
+
306
+ .-ds-dimmable {
307
+ opacity: 1;
308
+ }
306
309
  }
307
310
  }
308
- }
309
311
 
310
- &:not(.-ds-dimmed):hover {
311
- &.-ds-default {
312
- @each $color, $value in $rich-list-item-background-colors {
313
- &.-ds-background-#{$color} {
314
- background-color: map-get($value, 'hover');
312
+ &:not(.-ds-dimmed):hover {
313
+ &.-ds-default {
314
+ @each $color, $value in $rich-list-item-background-colors {
315
+ &.-ds-background-#{$color} {
316
+ background-color: map-get($value, 'hover');
317
+ }
315
318
  }
316
319
  }
317
- }
318
320
 
319
- &.-ds-flat {
320
- background: $color-neutral-background-ghost-hovered;
321
+ &.-ds-flat {
322
+ background: $color-neutral-background-ghost-hovered;
323
+ }
321
324
  }
322
325
  }
323
326
 
@@ -474,8 +477,9 @@ $rich-list-item-media-horizontal-height: 80px;
474
477
  </style>
475
478
 
476
479
  <script lang="ts">
477
- import DsCheckbox from '../../../components/Form/Checkbox/Checkbox.vue';
480
+ import { defineComponent, PropType, toRaw } from 'vue';
478
481
  import DsDivider from '../../../components/Divider';
482
+ import DsCheckbox from '../../../components/Form/Checkbox/Checkbox.vue';
479
483
  import DsIcon, {
480
484
  ICON_COLORS,
481
485
  ICON_SIZES,
@@ -483,7 +487,6 @@ import DsIcon, {
483
487
  IconItem,
484
488
  ICONS,
485
489
  } from '../../../components/Icons/Icon';
486
- import { defineComponent, PropType, toRaw } from 'vue';
487
490
  import {
488
491
  RICH_LIST_ITEM_BACKGROUND_COLOR,
489
492
  RICH_LIST_ITEM_BORDER_COLOR,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bethinkpl/design-system",
3
- "version": "26.13.0",
3
+ "version": "26.14.2",
4
4
  "description": "Bethink universe design-system",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- import{d as G,q as i,c as u,a as b,j as k,u as e,s as p,k as I,g as v,n as h,o}from"./vue.esm-bundler-DmkhfO_9.js";import{c as M,B as C,b as l,a as s}from"./Badge-DSmH78WU.js";import{I as d}from"./Icon-BPz80dqH.js";import{_ as O}from"./_plugin-vue_export-helper-DlAUqK2U.js";const a={XX_SMALL:"xx-small",X_SMALL:"x-small",SMALL:"small",MEDIUM:"medium",LARGE:"large",X_LARGE:"x-large"},_={ACTIVE:"active",INACTIVE:"inactive"},c={ACTIVE:"active",INACTIVE:"inactive",AWAITING:"awaiting",BLOCKED:"blocked",TEAM_MEMBER:"team-member"},q=["src","alt"],w={key:1,class:"ds-avatar__initials"},K={key:0,class:"ds-avatar__activityStatus"},F={key:1,class:"ds-avatar__accessStatus"},f=G({__name:"Avatar",props:{username:{},avatarUrl:{},size:{default:()=>a.X_SMALL},activityStatus:{},accessStatus:{},teamMemberImageUrl:{}},setup(r){const{initials:g,initialBackgroundColor:y}=V(),{accessStatusColor:T,accessStatusIcon:U,accessStatusSize:z,accessStatusImage:R}=B(),{activityStatusColor:X,activityStatusSize:N}=D();function V(){const t=["#1abc9c","#2ecc71","#3498db","#9b59b6","#34495e","#16a085","#27ae60","#2980b9","#8e44ad","#2c3e50","#f1c40f","#e67e22","#e74c3c","#f39c12","#d35400","#c0392b"];function n(A){const[m,E]=A.split(/\s+/);return m&&E?`${m[0]}${E[0]}`.toUpperCase():m.substring(0,2).toUpperCase()}const S=i(()=>{if(r.avatarUrl)return;const A=(r.username.charCodeAt(0)-65)%16;return t[A]});return{initials:i(()=>n(r.username)),initialBackgroundColor:S}}function B(){const t=i(()=>{switch(r.accessStatus){case c.ACTIVE:return l.SUCCESS;case c.INACTIVE:case c.AWAITING:return l.NEUTRAL;case c.BLOCKED:return l.DANGER;default:return}}),n=i(()=>{switch(r.accessStatus){case c.ACTIVE:return d.FA_UNLOCK_KEYHOLE;case c.BLOCKED:case c.INACTIVE:return d.FA_LOCK_KEYHOLE;case c.AWAITING:return d.FA_HOURGLASS_START;default:return}}),S=i(()=>{switch(r.size){case a.XX_SMALL:return s.SMALL;case a.X_SMALL:return s.SMALL;case a.SMALL:return s.SMALL;case a.MEDIUM:return s.MEDIUM;case a.LARGE:return s.MEDIUM;case a.X_LARGE:default:return s.X_LARGE}}),L=i(()=>{if(r.accessStatus===c.TEAM_MEMBER)return r.teamMemberImageUrl});return{accessStatusColor:t,accessStatusIcon:n,accessStatusSize:S,accessStatusImage:L}}function D(){const t=i(()=>{switch(r.activityStatus){case _.ACTIVE:return l.SUCCESS;default:case _.INACTIVE:return l.NEUTRAL}}),n=i(()=>{switch(r.size){case a.XX_SMALL:return s.X_SMALL;case a.X_SMALL:return s.SMALL;case a.SMALL:return s.SMALL;case a.MEDIUM:return s.MEDIUM;case a.LARGE:return s.MEDIUM;case a.X_LARGE:default:return s.MEDIUM}});return{activityStatusColor:t,activityStatusSize:n}}return(t,n)=>(o(),u("div",{class:h(["ds-avatar",{"-ds-xx-small":t.size===e(a).XX_SMALL,"-ds-x-small":t.size===e(a).X_SMALL,"-ds-small":t.size===e(a).SMALL,"-ds-medium":t.size===e(a).MEDIUM,"-ds-large":t.size===e(a).LARGE,"-ds-x-large":t.size===e(a).X_LARGE}])},[b("div",{class:"ds-avatar__content",style:p({backgroundColor:e(y)})},[t.avatarUrl?(o(),u("img",{key:0,src:t.avatarUrl,alt:t.username,class:"ds-avatar__image"},null,8,q)):(o(),u("span",w,k(e(g)),1))],4),t.activityStatus?(o(),u("div",K,[I(e(C),{color:e(X),elevation:e(M).X_SMALL,size:e(N)},null,8,["color","elevation","size"])])):v("",!0),t.accessStatus?(o(),u("div",F,[I(e(C),{color:e(T),elevation:e(M).SMALL,icon:e(U),size:e(z),"image-url":e(R)},null,8,["color","elevation","icon","size","image-url"])])):v("",!0)],2))}}),x=O(f,[["__scopeId","data-v-e662d6a3"]]);f.__docgenInfo={exportName:"default",displayName:"Avatar",description:"",tags:{},props:[{name:"username",required:!0,type:{name:"string"}},{name:"avatarUrl",required:!1,type:{name:"string"}},{name:"size",required:!1,type:{name:"AvatarSize"}},{name:"activityStatus",required:!1,type:{name:"AvatarActivityStatus"}},{name:"accessStatus",required:!1,type:{name:"AvatarAccessStatus"}},{name:"teamMemberImageUrl",required:!1,type:{name:"string"}}],sourceFiles:["/home/runner/work/design-system/design-system/lib/js/components/Avatar/Avatar.vue"]};export{x as A,a,c as b,_ as c};
@@ -1,37 +0,0 @@
1
- import{A as o,a as r,b as k,c as m}from"./Avatar-U_7Z6nZ2.js";import"./vue.esm-bundler-DmkhfO_9.js";import"./Badge-DSmH78WU.js";import"./Icon-BPz80dqH.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const v={title:"Components/Avatar",component:o,render:s=>({components:{Avatar:o},setup(){return{args:s}},template:'<Avatar v-bind="args" />'}),argTypes:{size:{control:"select",options:Object.values(r)},accessStatus:{control:{type:"select",labels:{undefined:"None (undefined)"}},options:[void 0,...Object.values(k)]},activityStatus:{control:{type:"select",labels:{undefined:"None (undefined)"}},options:[void 0,...Object.values(m)]}}},e={args:{size:r.X_SMALL,username:"Dariusz Chrapek",avatarUrl:"https://wiecejnizlek.pl/wp-content/uploads/2021/08/Dariusz_Chrapek-uai-2996x2996-1-scaled.jpeg",teamMemberImageUrl:"https://lek.wiecejnizlek.pl/images/lek/logo-badge.svg"}};e.parameters={design:{type:"figma",url:"https://www.figma.com/design/izQdYyiBR1GQgFkaOIfIJI/LMS---DS-Components?node-id=12364-12175&t=UpUoIm9oCAaH4dEp-4"}};const a={render:s=>({components:{Avatar:o},setup(){return{args:s,names:["Arkadiusz Kowalski","Bartosz Nowak","Cezary Kowalczyk","Dariusz Chrapek","Edward Nowak","Feliks Kowalski","Grzegorz Nowak","Henryk Kowalczyk","Ireneusz Nowak","Jacek Kowalski","Kamil Nowak","Leszek Kowalczyk","Marek Nowak","Norbert Kowalski","Oskar Nowak","Piotr Kowalczyk"]}},template:'<div style="display: flex; gap: 12px; flex-wrap: wrap;"><div v-for="name in names"><Avatar v-bind="args" :username="name" /></div></div>'}),argTypes:{size:{control:"select",options:Object.values(r)},username:{control:!1},avatarUrl:{control:!1}},args:{size:r.X_SMALL,teamMemberImageUrl:"https://lek.wiecejnizlek.pl/images/lek/logo-badge.svg"}};var t,l,i;e.parameters={...e.parameters,docs:{...(t=e.parameters)==null?void 0:t.docs,source:{originalSource:`{
2
- args: {
3
- size: AVATAR_SIZES.X_SMALL,
4
- username: 'Dariusz Chrapek',
5
- avatarUrl: 'https://wiecejnizlek.pl/wp-content/uploads/2021/08/Dariusz_Chrapek-uai-2996x2996-1-scaled.jpeg',
6
- teamMemberImageUrl: 'https://lek.wiecejnizlek.pl/images/lek/logo-badge.svg'
7
- }
8
- }`,...(i=(l=e.parameters)==null?void 0:l.docs)==null?void 0:i.source}}};var n,p,c;a.parameters={...a.parameters,docs:{...(n=a.parameters)==null?void 0:n.docs,source:{originalSource:`{
9
- render: (args: AvatarProps) => ({
10
- components: {
11
- Avatar
12
- },
13
- setup() {
14
- return {
15
- args,
16
- names: ['Arkadiusz Kowalski', 'Bartosz Nowak', 'Cezary Kowalczyk', 'Dariusz Chrapek', 'Edward Nowak', 'Feliks Kowalski', 'Grzegorz Nowak', 'Henryk Kowalczyk', 'Ireneusz Nowak', 'Jacek Kowalski', 'Kamil Nowak', 'Leszek Kowalczyk', 'Marek Nowak', 'Norbert Kowalski', 'Oskar Nowak', 'Piotr Kowalczyk']
17
- };
18
- },
19
- template: \`<div style="display: flex; gap: 12px; flex-wrap: wrap;"><div v-for="name in names"><Avatar v-bind="args" :username="name" /></div></div>\`
20
- }),
21
- argTypes: {
22
- size: {
23
- control: 'select',
24
- options: Object.values(AVATAR_SIZES)
25
- },
26
- username: {
27
- control: false
28
- },
29
- avatarUrl: {
30
- control: false
31
- }
32
- },
33
- args: {
34
- size: AVATAR_SIZES.X_SMALL,
35
- teamMemberImageUrl: 'https://lek.wiecejnizlek.pl/images/lek/logo-badge.svg'
36
- }
37
- }`,...(c=(p=a.parameters)==null?void 0:p.docs)==null?void 0:c.source}}};const A=["Interactive","Colors"];export{a as Colors,e as Interactive,A as __namedExportsOrder,v as default};