@weni/unnnic-system 3.5.3-alpha.1 → 3.5.3-alpha.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 (42) hide show
  1. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +194 -29
  2. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  3. package/dist/components/index.d.ts +862 -78
  4. package/dist/components/index.d.ts.map +1 -1
  5. package/dist/components/ui/dialog/Dialog.vue.d.ts +23 -0
  6. package/dist/components/ui/dialog/Dialog.vue.d.ts.map +1 -0
  7. package/dist/components/ui/dialog/DialogClose.vue.d.ts +19 -0
  8. package/dist/components/ui/dialog/DialogClose.vue.d.ts.map +1 -0
  9. package/dist/components/ui/dialog/DialogContent.vue.d.ts +40 -0
  10. package/dist/components/ui/dialog/DialogContent.vue.d.ts.map +1 -0
  11. package/dist/components/ui/dialog/DialogFooter.vue.d.ts +25 -0
  12. package/dist/components/ui/dialog/DialogFooter.vue.d.ts.map +1 -0
  13. package/dist/components/ui/dialog/DialogHeader.vue.d.ts +29 -0
  14. package/dist/components/ui/dialog/DialogHeader.vue.d.ts.map +1 -0
  15. package/dist/components/ui/dialog/DialogTitle.vue.d.ts +23 -0
  16. package/dist/components/ui/dialog/DialogTitle.vue.d.ts.map +1 -0
  17. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +19 -0
  18. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts.map +1 -0
  19. package/dist/components/ui/dialog/index.d.ts +8 -0
  20. package/dist/components/ui/dialog/index.d.ts.map +1 -0
  21. package/dist/{es-1c7253d4.mjs → es-dea507ea.mjs} +1 -1
  22. package/dist/{index-ff0a404c.mjs → index-25e40316.mjs} +10953 -10270
  23. package/dist/{pt-br-316f1627.mjs → pt-br-8720ec19.mjs} +1 -1
  24. package/dist/style.css +1 -1
  25. package/dist/unnnic.mjs +185 -171
  26. package/dist/unnnic.umd.js +43 -39
  27. package/package.json +1 -1
  28. package/src/assets/scss/tailwind.scss +8 -0
  29. package/src/components/ModalDialog/ModalDialog.vue +60 -146
  30. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -22
  31. package/src/components/index.ts +28 -0
  32. package/src/components/ui/dialog/Dialog.vue +15 -0
  33. package/src/components/ui/dialog/DialogClose.vue +25 -0
  34. package/src/components/ui/dialog/DialogContent.vue +114 -0
  35. package/src/components/ui/dialog/DialogFooter.vue +46 -0
  36. package/src/components/ui/dialog/DialogHeader.vue +78 -0
  37. package/src/components/ui/dialog/DialogTitle.vue +34 -0
  38. package/src/components/ui/dialog/DialogTrigger.vue +12 -0
  39. package/src/components/ui/dialog/index.ts +7 -0
  40. package/src/stories/Dialog.stories.js +832 -0
  41. package/src/stories/ModalDialog.mdx +3 -0
  42. package/src/stories/ModalDialog.stories.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weni/unnnic-system",
3
- "version": "3.5.3-alpha.1",
3
+ "version": "3.5.3-alpha.2",
4
4
  "type": "commonjs",
5
5
  "files": [
6
6
  "dist",
@@ -92,5 +92,13 @@
92
92
  @apply bg-background text-foreground;
93
93
  font-family: $unnnic-font-family;
94
94
  }
95
+
96
+ button {
97
+ border: none;
98
+ background: none;
99
+ padding: 0;
100
+ margin: 0;
101
+ cursor: pointer;
102
+ }
95
103
  }
96
104
 
@@ -1,64 +1,46 @@
1
1
  <template>
2
- <section
3
- v-if="modelValue"
4
- class="unnnic-modal-dialog"
2
+ <UnnnicDialog
3
+ :open="modelValue"
5
4
  data-testid="modal-dialog"
5
+ @update:open="$emit('update:modelValue', $event)"
6
6
  >
7
- <section
8
- class="unnnic-modal-dialog__overlay"
9
- data-testid="modal-overlay"
10
- @click.stop="!persistent && close()"
11
- />
12
- <section
13
- :class="[
14
- 'unnnic-modal-dialog__container',
15
- `unnnic-modal-dialog__container--${size}`,
16
- ]"
7
+ <UnnnicDialogContent
8
+ :size="size === 'sm' ? 'small' : size === 'lg' ? 'large' : 'medium'"
9
+ class="unnnic-modal-dialog__container"
17
10
  data-testid="modal-container"
11
+ @escape-key-down="persistentHandler"
12
+ @pointer-down-outside="persistentHandler"
18
13
  >
19
14
  <section
20
- v-if="$slots.leftSidebar"
21
- class="unnnic-modal-dialog__container__left-sidebar"
15
+ :class="[
16
+ 'unnnic-modal-dialog__container__body',
17
+ {
18
+ 'unnnic-modal-dialog__container__body--left-sidebar':
19
+ $slots.leftSidebar,
20
+ },
21
+ ]"
22
22
  >
23
- <slot name="leftSidebar" />
24
- </section>
25
-
26
- <section class="unnnic-modal-dialog__container__body">
27
- <header
23
+ <section
24
+ v-if="$slots.leftSidebar"
25
+ class="unnnic-modal-dialog__container__left-sidebar"
26
+ >
27
+ <slot name="leftSidebar" />
28
+ </section>
29
+ <UnnnicDialogHeader
28
30
  v-if="title"
29
- class="unnnic-modal-dialog__container__header"
31
+ :closeButton="showCloseIcon"
32
+ :type="type"
30
33
  >
31
- <section class="unnnic-modal-dialog__container__title-container">
32
- <UnnnicIcon
33
- v-if="icon || type"
34
- data-testid="title-icon"
35
- class="unnnic-modal-dialog__container__title-icon"
36
- :icon="icon || iconsMapper[type]?.icon"
37
- :scheme="iconScheme || iconsMapper[type]?.scheme"
38
- size="md"
39
- />
40
- <h1
41
- class="unnnic-modal-dialog__container__title-text"
42
- data-testid="title-text"
43
- >
44
- {{ title }}
45
- </h1>
46
- </section>
47
- <UnnnicIcon
48
- v-if="showCloseIcon"
49
- data-testid="close-icon"
50
- icon="close"
51
- clickable
52
- scheme="neutral-cloudy"
53
- @click="close()"
54
- />
55
- </header>
34
+ <UnnnicDialogTitle>
35
+ {{ title }}
36
+ </UnnnicDialogTitle>
37
+ </UnnnicDialogHeader>
56
38
  <section class="unnnic-modal-dialog__container__content">
57
39
  <slot></slot>
58
40
  </section>
59
- <section
41
+
42
+ <UnnnicDialogFooter
60
43
  v-if="primaryButtonProps.text"
61
- data-testid="actions-section"
62
44
  :class="[
63
45
  'unnnic-modal-dialog__container__actions',
64
46
  {
@@ -66,6 +48,8 @@
66
48
  showActionsDivider,
67
49
  },
68
50
  ]"
51
+ :divider="showActionsDivider"
52
+ data-testid="actions-section"
69
53
  >
70
54
  <UnnnicButton
71
55
  v-if="!hideSecondaryButton"
@@ -92,22 +76,30 @@
92
76
  class="unnnic-modal-dialog__container__actions__primary-button"
93
77
  @click.stop="$emit('primaryButtonClick')"
94
78
  />
95
- </section>
79
+ </UnnnicDialogFooter>
96
80
  </section>
97
- </section>
98
- </section>
81
+ </UnnnicDialogContent>
82
+ </UnnnicDialog>
99
83
  </template>
100
84
 
101
85
  <script>
102
- import UnnnicIcon from '../Icon.vue';
103
86
  import UnnnicButton from '../Button/Button.vue';
104
87
  import UnnnicI18n from '../../mixins/i18n';
88
+ import UnnnicDialog from '../ui/dialog/Dialog.vue';
89
+ import UnnnicDialogContent from '../ui/dialog/DialogContent.vue';
90
+ import UnnnicDialogHeader from '../ui/dialog/DialogHeader.vue';
91
+ import UnnnicDialogTitle from '../ui/dialog/DialogTitle.vue';
92
+ import UnnnicDialogFooter from '../ui/dialog/DialogFooter.vue';
105
93
 
106
94
  export default {
107
95
  name: 'UnnnicModalDialog',
108
96
  components: {
109
- UnnnicIcon,
110
97
  UnnnicButton,
98
+ UnnnicDialog,
99
+ UnnnicDialogContent,
100
+ UnnnicDialogHeader,
101
+ UnnnicDialogTitle,
102
+ UnnnicDialogFooter,
111
103
  },
112
104
  mixins: [UnnnicI18n],
113
105
  props: {
@@ -177,11 +169,6 @@ export default {
177
169
  es: 'Cancelar',
178
170
  },
179
171
  },
180
- iconsMapper: {
181
- success: { icon: 'check_circle', scheme: 'aux-green-500' },
182
- warning: { icon: 'warning', scheme: 'aux-red-500' },
183
- attention: { icon: 'error', scheme: 'aux-yellow-500' },
184
- },
185
172
  primaryButtonTypeMapper: {
186
173
  success: 'primary',
187
174
  warning: 'warning',
@@ -201,91 +188,39 @@ export default {
201
188
  updateBodyOverflow(isHidden) {
202
189
  document.body.style.overflow = isHidden ? 'hidden' : '';
203
190
  },
191
+ persistentHandler(event) {
192
+ if (this.persistent) {
193
+ event.preventDefault();
194
+ }
195
+ },
204
196
  },
205
197
  };
206
198
  </script>
207
199
 
208
200
  <style lang="scss" scoped>
209
201
  @use '@/assets/scss/unnnic' as *;
210
- * {
211
- margin: 0;
212
- padding: 0;
213
- box-sizing: border-box;
214
- }
215
- .unnnic-modal-dialog {
216
- width: 100vw;
217
- height: 100vh;
218
- position: fixed;
219
- left: 0;
220
- top: 0;
221
- display: flex;
222
- justify-content: center;
223
- align-items: center;
224
- z-index: 9999;
225
-
226
- &__overlay {
227
- position: absolute;
228
- width: 100%;
229
- height: 100%;
230
- background-color: rgba(0, 0, 0, 0.4);
231
- }
232
- }
233
-
234
202
  .unnnic-modal-dialog__container {
235
- display: flex;
236
- background: $unnnic-color-neutral-white;
237
- border-radius: $unnnic-spacing-xs;
238
- box-shadow: $unnnic-shadow-level-near;
239
- position: fixed;
240
- max-height: calc(100vh - $unnnic-spacing-giant);
241
- overflow: hidden;
242
-
243
- &--sm {
244
- width: 400px;
245
- }
246
- &--md {
247
- width: 600px;
248
- }
249
- &--lg {
250
- width: 800px;
251
- }
252
-
253
203
  &__left-sidebar {
254
204
  background-color: $unnnic-color-neutral-black;
255
205
  color: $unnnic-color-neutral-white;
206
+
207
+ grid-area: left-sidebar;
208
+ grid-row: span 3;
256
209
  }
257
210
 
258
211
  &__body {
259
212
  flex: 1;
260
213
  display: flex;
261
214
  flex-direction: column;
262
- }
263
-
264
- &__header {
265
- display: flex;
266
- justify-content: space-between;
267
- align-items: center;
268
- border-bottom: 1px solid $unnnic-color-neutral-soft;
269
- padding: $unnnic-spacing-md;
270
- flex-shrink: 0;
271
- }
272
215
 
273
- &__title-container {
274
- display: flex;
275
- align-items: center;
276
- gap: $unnnic-spacing-ant;
277
- }
278
-
279
- &__title-icon {
280
- font-size: 28px;
281
- }
216
+ overflow-y: auto;
282
217
 
283
- &__title-text {
284
- font-family: $unnnic-font-family-secondary;
285
- font-size: $unnnic-font-size-title-sm;
286
- font-weight: $unnnic-font-weight-black;
287
- line-height: 28px;
288
- color: $unnnic-color-neutral-darkest;
218
+ &--left-sidebar {
219
+ border-radius: $unnnic-radius-4 0 0 $unnnic-radius-4;
220
+ display: grid;
221
+ grid-template-columns: auto 1fr;
222
+ grid-template-areas: 'left-sidebar content';
223
+ }
289
224
  }
290
225
 
291
226
  &__content {
@@ -309,26 +244,5 @@ export default {
309
244
  border-radius: $unnnic-border-radius-pill;
310
245
  }
311
246
  }
312
-
313
- &__actions {
314
- display: grid;
315
- grid-template-columns: 1fr 1fr;
316
- grid-template-areas: 'secondary-button primary-button';
317
- gap: $unnnic-spacing-sm;
318
- padding: $unnnic-spacing-md;
319
- flex-shrink: 0;
320
-
321
- &--divider {
322
- border-top: 1px solid $unnnic-color-neutral-soft;
323
- }
324
-
325
- &__secondary-button {
326
- grid-area: secondary-button;
327
- }
328
-
329
- &__primary-button {
330
- grid-area: primary-button;
331
- }
332
- }
333
247
  }
334
248
  </style>
@@ -1,24 +1,3 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`ModalDialog.vue > Elements rendering > matches the snapshot 1`] = `
4
- "<section data-v-68ebadeb="" class="unnnic-modal-dialog" data-testid="modal-dialog">
5
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__overlay" data-testid="modal-overlay"></section>
6
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__container unnnic-modal-dialog__container--md" data-testid="modal-container">
7
- <!--v-if-->
8
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__container__body">
9
- <header data-v-68ebadeb="" class="unnnic-modal-dialog__container__header">
10
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__container__title-container">
11
- <unnnic-icon-stub data-v-68ebadeb="" filled="false" icon="test-icon" clickable="false" size="md" scheme="neutral-darkest" data-testid="title-icon" class="unnnic-modal-dialog__container__title-icon"></unnnic-icon-stub>
12
- <h1 data-v-68ebadeb="" class="unnnic-modal-dialog__container__title-text" data-testid="title-text">Test Title</h1>
13
- </section>
14
- <unnnic-icon-stub data-v-68ebadeb="" filled="false" icon="close" clickable="true" size="md" scheme="neutral-cloudy" data-testid="close-icon"></unnnic-icon-stub>
15
- </header>
16
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__container__content"></section>
17
- <section data-v-68ebadeb="" data-testid="actions-section" class="unnnic-modal-dialog__container__actions">
18
- <unnnic-button-stub data-v-68ebadeb="" size="large" text="Cancel" type="tertiary" float="false" iconleft="" iconright="" iconcenter="" iconsfilled="false" disabled="false" loading="false" data-testid="secondary-button" class="unnnic-modal-dialog__container__actions__secondary-button"></unnnic-button-stub>
19
- <unnnic-button-stub data-v-68ebadeb="" size="large" text="Confirm" type="primary" float="false" iconleft="" iconright="" iconcenter="" iconsfilled="false" disabled="false" loading="false" data-testid="primary-button" class="unnnic-modal-dialog__container__actions__primary-button"></unnnic-button-stub>
20
- </section>
21
- </section>
22
- </section>
23
- </section>"
24
- `;
3
+ exports[`ModalDialog.vue > Elements rendering > matches the snapshot 1`] = `"<unnnic-dialog-stub data-v-68ebadeb="" open="true" defaultopen="false" modal="false" data-testid="modal-dialog"></unnnic-dialog-stub>"`;
@@ -98,6 +98,13 @@ import { toast } from './Toast/ToastManager';
98
98
  import Popover from './ui/popover/Popover.vue';
99
99
  import PopoverContent from './ui/popover/PopoverContent.vue';
100
100
  import PopoverTrigger from './ui/popover/PopoverTrigger.vue';
101
+ import Dialog from './ui/dialog/Dialog.vue';
102
+ import DialogContent from './ui/dialog/DialogContent.vue';
103
+ import DialogFooter from './ui/dialog/DialogFooter.vue';
104
+ import DialogHeader from './ui/dialog/DialogHeader.vue';
105
+ import DialogTitle from './ui/dialog/DialogTitle.vue';
106
+ import DialogTrigger from './ui/dialog/DialogTrigger.vue';
107
+ import DialogClose from './ui/dialog/DialogClose.vue';
101
108
 
102
109
  type VueComponent = Component;
103
110
 
@@ -206,6 +213,13 @@ export const components: ComponentsMap = {
206
213
  unnnicPopover: Popover,
207
214
  unnnicPopoverContent: PopoverContent,
208
215
  unnnicPopoverTrigger: PopoverTrigger,
216
+ unnnicDialog: Dialog,
217
+ unnnicDialogContent: DialogContent,
218
+ unnnicDialogFooter: DialogFooter,
219
+ unnnicDialogHeader: DialogHeader,
220
+ unnnicDialogTitle: DialogTitle,
221
+ unnnicDialogTrigger: DialogTrigger,
222
+ unnnicDialogClose: DialogClose,
209
223
  };
210
224
 
211
225
  export const unnnicFontSize = fontSize;
@@ -307,6 +321,13 @@ export const unnnicChip = Chip;
307
321
  export const unnnicPopover = Popover;
308
322
  export const unnnicPopoverContent = PopoverContent;
309
323
  export const unnnicPopoverTrigger = PopoverTrigger;
324
+ export const unnnicDialog = Dialog;
325
+ export const unnnicDialogContent = DialogContent;
326
+ export const unnnicDialogFooter = DialogFooter;
327
+ export const unnnicDialogHeader = DialogHeader;
328
+ export const unnnicDialogTitle = DialogTitle;
329
+ export const unnnicDialogTrigger = DialogTrigger;
330
+ export const unnnicDialogClose = DialogClose;
310
331
 
311
332
  export const UnnnicFontSize = fontSize;
312
333
  export const UnnnicInput = input;
@@ -408,3 +429,10 @@ export const UnnnicToastManager = toast;
408
429
  export const UnnnicPopover = Popover;
409
430
  export const UnnnicPopoverContent = PopoverContent;
410
431
  export const UnnnicPopoverTrigger = PopoverTrigger;
432
+ export const UnnnicDialog = Dialog;
433
+ export const UnnnicDialogContent = DialogContent;
434
+ export const UnnnicDialogFooter = DialogFooter;
435
+ export const UnnnicDialogHeader = DialogHeader;
436
+ export const UnnnicDialogTitle = DialogTitle;
437
+ export const UnnnicDialogTrigger = DialogTrigger;
438
+ export const UnnnicDialogClose = DialogClose;
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import type { DialogRootEmits, DialogRootProps } from 'reka-ui';
3
+ import { DialogRoot, useForwardPropsEmits } from 'reka-ui';
4
+
5
+ const props = defineProps<DialogRootProps>();
6
+ const emits = defineEmits<DialogRootEmits>();
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits);
9
+ </script>
10
+
11
+ <template>
12
+ <DialogRoot v-bind="forwarded">
13
+ <slot />
14
+ </DialogRoot>
15
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import type { DialogCloseProps } from 'reka-ui';
3
+ import { DialogClose } from 'reka-ui';
4
+
5
+ const props = defineProps<DialogCloseProps>();
6
+ </script>
7
+
8
+ <template>
9
+ <DialogClose
10
+ class="unnnic-dialog-close"
11
+ v-bind="props"
12
+ >
13
+ <slot />
14
+ </DialogClose>
15
+ </template>
16
+
17
+ <style lang="scss" scoped>
18
+ @use '@/assets/scss/unnnic' as *;
19
+
20
+ .unnnic-dialog-close {
21
+ > * {
22
+ width: 100%;
23
+ }
24
+ }
25
+ </style>
@@ -0,0 +1,114 @@
1
+ <script setup lang="ts">
2
+ import type { DialogContentEmits, DialogContentProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { reactiveOmit } from '@vueuse/core';
5
+ import {
6
+ DialogContent,
7
+ DialogOverlay,
8
+ DialogPortal,
9
+ useForwardPropsEmits,
10
+ } from 'reka-ui';
11
+ import { cn } from '@/lib/utils';
12
+
13
+ const props = withDefaults(
14
+ defineProps<
15
+ DialogContentProps & {
16
+ class?: HTMLAttributes['class'];
17
+ size?: 'small' | 'medium' | 'large';
18
+ }
19
+ >(),
20
+ {
21
+ size: 'medium',
22
+ },
23
+ );
24
+ const emits = defineEmits<DialogContentEmits>();
25
+
26
+ const delegatedProps = reactiveOmit(props, 'class');
27
+
28
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
29
+ </script>
30
+
31
+ <template>
32
+ <DialogPortal>
33
+ <DialogOverlay
34
+ class="unnnic-dialog-overlay data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
35
+ />
36
+ <DialogContent
37
+ v-bind="forwarded"
38
+ :class="
39
+ cn(
40
+ 'unnnic-dialog-content',
41
+ `unnnic-dialog-content--size-${props.size}`,
42
+ 'duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]',
43
+
44
+ props.class,
45
+ )
46
+ "
47
+ >
48
+ <slot />
49
+ </DialogContent>
50
+ </DialogPortal>
51
+ </template>
52
+
53
+ <style lang="scss" scoped>
54
+ @use '@/assets/scss/unnnic' as *;
55
+
56
+ .unnnic-dialog-overlay {
57
+ position: fixed;
58
+ top: 0;
59
+ left: 0;
60
+ z-index: 9999;
61
+
62
+ width: 100vw;
63
+ height: 100vh;
64
+ background: rgba(53, 57, 69, 0.5);
65
+ }
66
+
67
+ .unnnic-dialog-content {
68
+ z-index: 10000;
69
+
70
+ position: fixed;
71
+ top: 50%;
72
+ left: 50%;
73
+
74
+ transform: translate(-50%, -50%);
75
+
76
+ width: 100%;
77
+ max-height: calc(100% - $unnnic-space-20);
78
+
79
+ display: flex;
80
+ flex-direction: column;
81
+
82
+ box-shadow: $unnnic-shadow-2;
83
+ border-radius: $unnnic-radius-4;
84
+ background-color: $unnnic-color-bg-base;
85
+
86
+ &--size-small {
87
+ max-width: 360px;
88
+ }
89
+
90
+ &--size-medium {
91
+ max-width: 560px;
92
+ }
93
+
94
+ &--size-large {
95
+ max-width: 800px;
96
+ }
97
+
98
+ > * {
99
+ &::-webkit-scrollbar {
100
+ width: $unnnic-spacing-inline-nano;
101
+ }
102
+
103
+ &::-webkit-scrollbar-thumb {
104
+ background: $unnnic-color-neutral-cleanest;
105
+ border-radius: $unnnic-border-radius-pill;
106
+ }
107
+
108
+ &::-webkit-scrollbar-track {
109
+ background: $unnnic-color-neutral-soft;
110
+ border-radius: $unnnic-border-radius-pill;
111
+ }
112
+ }
113
+ }
114
+ </style>
@@ -0,0 +1,46 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const props = withDefaults(
6
+ defineProps<{ class?: HTMLAttributes['class']; divider?: boolean }>(),
7
+ {
8
+ divider: true,
9
+ },
10
+ );
11
+ </script>
12
+
13
+ <template>
14
+ <footer
15
+ :class="
16
+ cn(
17
+ 'unnnic-dialog-footer',
18
+ { 'unnnic-dialog-footer--with-divider': props.divider },
19
+ props.class,
20
+ )
21
+ "
22
+ >
23
+ <slot />
24
+ </footer>
25
+ </template>
26
+
27
+ <style lang="scss" scoped>
28
+ @use '@/assets/scss/unnnic' as *;
29
+
30
+ .unnnic-dialog-footer {
31
+ display: flex;
32
+ justify-content: center;
33
+ align-items: center;
34
+ gap: $unnnic-space-2;
35
+
36
+ padding: $unnnic-space-6;
37
+
38
+ &--with-divider {
39
+ border-top: 1px solid $unnnic-color-border-soft;
40
+ }
41
+
42
+ > * {
43
+ width: 100%;
44
+ }
45
+ }
46
+ </style>
@@ -0,0 +1,78 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+ import UnnnicButton from '@/components/Button/Button.vue';
5
+ import DialogClose from './DialogClose.vue';
6
+ import UnnnicIcon, { SchemeColor } from '@/components/Icon.vue';
7
+
8
+ const props = withDefaults(
9
+ defineProps<{
10
+ class?: HTMLAttributes['class'];
11
+ divider?: boolean;
12
+ type?: 'default' | 'success' | 'warning' | 'attention';
13
+ closeButton?: boolean;
14
+ }>(),
15
+ {
16
+ divider: true,
17
+ closeButton: true,
18
+ type: 'default',
19
+ },
20
+ );
21
+
22
+ const iconsMapper = {
23
+ default: { icon: '', scheme: '' as SchemeColor },
24
+ success: { icon: 'check_circle', scheme: 'aux-green-500' as SchemeColor },
25
+ warning: { icon: 'warning', scheme: 'aux-red-500' as SchemeColor },
26
+ attention: { icon: 'error', scheme: 'aux-yellow-500' as SchemeColor },
27
+ };
28
+ </script>
29
+
30
+ <template>
31
+ <header
32
+ :class="
33
+ cn(
34
+ 'unnnic-dialog-header',
35
+ { 'unnnic-dialog-header--with-divider': props.divider },
36
+ props.class,
37
+ )
38
+ "
39
+ >
40
+ <UnnnicIcon
41
+ v-if="iconsMapper[props.type]?.icon"
42
+ :icon="iconsMapper[props.type]?.icon"
43
+ :scheme="iconsMapper[props.type]?.scheme"
44
+ size="md"
45
+ />
46
+ <slot />
47
+
48
+ <DialogClose
49
+ v-if="props.closeButton"
50
+ class="unnnic-dialog-header__close"
51
+ >
52
+ <UnnnicButton
53
+ type="tertiary"
54
+ iconCenter="close"
55
+ />
56
+ </DialogClose>
57
+ </header>
58
+ </template>
59
+
60
+ <style lang="scss" scoped>
61
+ @use '@/assets/scss/unnnic' as *;
62
+
63
+ .unnnic-dialog-header {
64
+ display: flex;
65
+ align-items: center;
66
+ gap: $unnnic-space-2;
67
+
68
+ padding: $unnnic-space-6;
69
+
70
+ &--with-divider {
71
+ border-bottom: 1px solid $unnnic-color-border-soft;
72
+ }
73
+
74
+ &__close {
75
+ margin-left: auto;
76
+ }
77
+ }
78
+ </style>