@milaboratories/uikit 1.2.13 → 1.2.15

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 (29) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/pl-uikit.js +2341 -2317
  3. package/dist/pl-uikit.umd.cjs +7 -6
  4. package/dist/src/components/PlDialogModal/PlDialogModal.vue.d.ts +11 -0
  5. package/dist/src/components/PlLogView/PlLogView.vue.d.ts +17 -0
  6. package/dist/src/components/PlSlideModal/PlSlideModal.vue.d.ts +1 -0
  7. package/dist/style.css +1 -1
  8. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  9. package/package.json +5 -4
  10. package/src/assets/base.scss +1 -0
  11. package/src/assets/typography.scss +1 -0
  12. package/src/assets/variables.scss +4 -0
  13. package/src/components/PlBtnPrimary/PlBtnPrimary.vue +1 -1
  14. package/src/components/PlBtnPrimary/pl-btn-primary.scss +2 -1
  15. package/src/components/PlBtnSecondary/PlBtnSecondary.vue +1 -1
  16. package/src/components/PlBtnSecondary/pl-btn-secondary.scss +2 -1
  17. package/src/components/PlDialogModal/PlDialogModal.vue +33 -5
  18. package/src/components/PlDialogModal/pl-dialog-modal.scss +34 -21
  19. package/src/components/PlFileDialog/PlFileDialog.vue +22 -11
  20. package/src/components/PlFileDialog/pl-file-dialog.scss +2 -11
  21. package/src/components/PlFileInput/PlFileInput.vue +1 -1
  22. package/src/components/PlFileInput/pl-file-input.scss +1 -0
  23. package/src/components/PlLogView/PlLogView.vue +24 -4
  24. package/src/components/PlLogView/pl-log-view.scss +22 -3
  25. package/src/components/PlSlideModal/PlSlideModal.vue +3 -81
  26. package/src/components/PlSlideModal/pl-slide-modal.scss +88 -0
  27. package/src/components/PlTextField/pl-text-field.scss +1 -0
  28. package/src/components/contextMenu/Menu.vue +1 -1
  29. package/src/types.ts +8 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/uikit",
3
- "version": "1.2.13",
3
+ "version": "1.2.15",
4
4
  "type": "module",
5
5
  "main": "dist/pl-uikit.umd.js",
6
6
  "module": "dist/pl-uikit.js",
@@ -30,8 +30,8 @@
30
30
  "vite": "^5.4.8",
31
31
  "vue-tsc": "^2.1.6",
32
32
  "yarpm": "^1.2.0",
33
- "@milaboratories/helpers": "^1.6.3",
34
- "@platforma-sdk/model": "^1.2.29"
33
+ "@milaboratories/helpers": "^1.6.4",
34
+ "@platforma-sdk/model": "^1.2.30"
35
35
  },
36
36
  "scripts": {
37
37
  "dev": "vite",
@@ -47,6 +47,7 @@
47
47
  "minify-icons": "svgo -f src/assets/icons/icon-assets -o src/assets/icons/icon-assets-min",
48
48
  "generate-icons": "pnpm run parse-icons-folder && pnpm run minify-icons",
49
49
  "lint": "eslint . --ext js,ts,vue",
50
- "check": "yarpm type-check && yarpm test && yarpm lint"
50
+ "check": "yarpm type-check && yarpm test && yarpm lint",
51
+ "do-pack": "rm *.tgz && pnpm pack && mv *.tgz package.tgz"
51
52
  }
52
53
  }
@@ -147,6 +147,7 @@ body {
147
147
  display: flex;
148
148
  flex-direction: column;
149
149
  height: 100%;
150
+ max-width: 100%;
150
151
  font-family: var(--font-family-base);
151
152
  }
152
153
 
@@ -37,6 +37,7 @@ h4, h5, h6 {
37
37
  font-weight: 500;
38
38
  line-height: 24px; /* 120% */
39
39
  letter-spacing: -0.2px;
40
+ margin: 0;
40
41
  }
41
42
 
42
43
  a {
@@ -66,6 +66,10 @@
66
66
  --main-spacing: 24px;
67
67
  --gap-v: 24px;
68
68
  --gap-h: 12px;
69
+ --z-slide-shadow: 80;
70
+ --z-slide-dialog: 81;
71
+ --z-dialog: 100;
72
+ --z-context-menu: 1001;
69
73
  }
70
74
 
71
75
  [data-theme='dark'] {
@@ -41,7 +41,7 @@ const props = defineProps<{
41
41
  </script>
42
42
 
43
43
  <template>
44
- <BtnBase class="ui-btn-primary" v-bind="props">
44
+ <BtnBase class="pl-btn-primary" v-bind="props">
45
45
  <slot />
46
46
  </BtnBase>
47
47
  </template>
@@ -1,6 +1,6 @@
1
1
  @import "@/assets/mixins";
2
2
 
3
- .ui-btn-primary {
3
+ .pl-btn-primary {
4
4
  @include base-btn;
5
5
 
6
6
  --color-btn-hover: var(--color-primary-hover);
@@ -10,6 +10,7 @@
10
10
 
11
11
  background-color: var(--color-btn-background);
12
12
  border: none;
13
+ min-width: 160px;
13
14
 
14
15
  --append-shadow: inset 0 0 0 1px #110529;
15
16
 
@@ -41,7 +41,7 @@ const props = defineProps<{
41
41
  </script>
42
42
 
43
43
  <template>
44
- <BtnBase v-bind="props" class="ui-btn-secondary">
44
+ <BtnBase v-bind="props" class="pl-btn-secondary">
45
45
  <slot />
46
46
  </BtnBase>
47
47
  </template>
@@ -1,6 +1,6 @@
1
1
  @import "@/assets/mixins";
2
2
 
3
- .ui-btn-secondary {
3
+ .pl-btn-secondary {
4
4
  @include base-btn;
5
5
 
6
6
  --color-border: var(--color-border-default);
@@ -9,6 +9,7 @@
9
9
 
10
10
  border: 1px solid var(--color-border);
11
11
  background: transparent;
12
+ min-width: 160px;
12
13
 
13
14
  &:disabled {
14
15
  --color-text: var(--color-dis-01);
@@ -5,19 +5,26 @@ export default {
5
5
  </script>
6
6
 
7
7
  <script lang="ts" setup>
8
+ import { useEventListener } from '@/composition/useEventListener';
8
9
  import './pl-dialog-modal.scss';
9
- import { ref, useAttrs } from 'vue';
10
+ import { ref, useAttrs, useSlots } from 'vue';
11
+
12
+ const slots = useSlots();
10
13
 
11
14
  const emit = defineEmits(['update:modelValue']);
12
15
 
13
- withDefaults(
16
+ const props = withDefaults(
14
17
  defineProps<{
18
+ /**
19
+ * Determines whether the modal is open
20
+ */
15
21
  modelValue: boolean;
16
22
  width?: string;
17
23
  height?: string;
18
24
  minHeight?: string;
19
25
  type?: 'A' | 'B' | 'C';
20
26
  closable?: boolean;
27
+ noContentGutters?: boolean;
21
28
  }>(),
22
29
  {
23
30
  width: '448px',
@@ -25,6 +32,7 @@ withDefaults(
25
32
  height: 'auto',
26
33
  type: 'A',
27
34
  closable: true,
35
+ noContentGutters: false,
28
36
  },
29
37
  );
30
38
 
@@ -37,15 +45,35 @@ function onClickShadow(ev: Event) {
37
45
  emit('update:modelValue', false);
38
46
  }
39
47
  }
48
+
49
+ useEventListener(document.body, 'keyup', (ev) => {
50
+ if (props.modelValue && ev.code === 'Escape') {
51
+ emit('update:modelValue', false);
52
+ }
53
+ });
40
54
  </script>
41
55
 
42
56
  <template>
43
57
  <Teleport to="body">
44
58
  <Transition name="dialog">
45
- <div v-if="modelValue" class="pl-dialog-modal__shadow" @click="onClickShadow" @keyup.esc="emit('update:modelValue', false)">
46
- <div v-bind="$attrs" ref="modal" class="pl-dialog-modal" :class="[type]" :style="{ width, height, minHeight }">
59
+ <div v-if="modelValue" class="pl-dialog-modal__shadow" @click="onClickShadow">
60
+ <div
61
+ v-bind="$attrs"
62
+ ref="modal"
63
+ class="pl-dialog-modal"
64
+ :class="[type, slots.title ? 'has-title' : '']"
65
+ :style="{ width, height, minHeight }"
66
+ >
47
67
  <div v-if="closable" class="close-dialog-btn" @click.stop="emit('update:modelValue', false)" />
48
- <slot />
68
+ <div v-if="slots.title" class="pl-dialog-modal__title">
69
+ <slot name="title" />
70
+ </div>
71
+ <div class="pl-dialog-modal__content" :class="{ 'no-content-gutters': noContentGutters }">
72
+ <slot />
73
+ </div>
74
+ <div v-if="slots.actions" class="pl-dialog-modal__actions">
75
+ <slot name="actions" />
76
+ </div>
49
77
  </div>
50
78
  </div>
51
79
  </Transition>
@@ -1,33 +1,28 @@
1
1
  @import '@/assets/mixins';
2
2
 
3
3
  .pl-dialog-modal {
4
- --padding: 24px 20px;
4
+ --padding-top: 24px;
5
5
  --border-radius: 12px;
6
6
 
7
7
  min-height: 400px;
8
8
  max-height: calc(100vh - 48px);
9
+ max-width: calc(100% - 48px);
10
+ min-width: 448px;
9
11
 
10
12
  position: absolute;
11
13
  top: 45%;
12
14
  left: 50%;
13
15
  transform: translateY(-50%) translateX(-50%);
14
16
  background-color: #fff;
15
- padding: var(--padding);
17
+ padding-top: var(--padding-top);
16
18
  display: flex;
17
19
  flex-direction: column;
18
20
 
19
21
  box-shadow: 0 2px 8px rgba(36, 34, 61, 0.12);
20
22
  border-radius: var(--border-radius);
21
23
 
22
- &.split {
23
- --padding: 24px 0;
24
- .form-modal {
25
- padding: 0 24px;
26
- }
27
- .form-modal__actions {
28
- padding-left: 24px;
29
- padding-right: 24px;
30
- }
24
+ &.has-title {
25
+ --padding-top: 0;
31
26
  }
32
27
 
33
28
  &.C {
@@ -35,22 +30,40 @@
35
30
  max-height: 80vh;
36
31
  }
37
32
 
38
- h1 {
39
- font-size: 24px;
40
- margin: 0 0 24px 0;
41
- }
42
-
43
33
  &__title {
44
- color: var(--txt-01, #110529);
34
+ display: flex;
35
+ align-items: center;
36
+ font-family: var(--font-family-base);
45
37
  font-size: 28px;
38
+ font-style: normal;
46
39
  font-weight: 500;
47
40
  line-height: 32px; /* 114.286% */
48
41
  letter-spacing: -0.56px;
42
+ padding: 24px;
49
43
  }
50
44
 
51
- button {
52
- padding: 0 12px;
53
- min-width: 70px;
45
+ &__content {
46
+ flex: 1;
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: 24px;
50
+ padding: 0 24px 24px;
51
+ padding-top: 16px;
52
+ &.no-content-gutters {
53
+ padding: 0 0;
54
+ }
55
+ }
56
+
57
+ &__actions {
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 6px;
61
+ padding: 0;
62
+ min-height: 88px;
63
+ padding: 0 24px;
64
+ button {
65
+ min-width: 160px;
66
+ }
54
67
  }
55
68
 
56
69
  .alert-error {
@@ -70,7 +83,7 @@
70
83
 
71
84
  &__shadow {
72
85
  position: absolute;
73
- z-index: 2;
86
+ z-index: var(--z-dialog);
74
87
  top: var(--title-bar-height);
75
88
  left: 0;
76
89
  right: 0;
@@ -14,11 +14,11 @@ import { PlBtnPrimary } from '../PlBtnPrimary';
14
14
  import { PlBtnGhost } from '../PlBtnGhost';
15
15
  import { useEventListener } from '@/composition/useEventListener';
16
16
 
17
- const vFocus = {
18
- mounted: (el: HTMLElement) => {
19
- (el.querySelector('button.ui-btn-primary') as HTMLButtonElement | null)?.focus();
20
- },
21
- };
17
+ // const vFocus = {
18
+ // mounted: (el: HTMLElement) => {
19
+ // (el.querySelector('button.pl-btn-primary') as HTMLButtonElement | null)?.focus();
20
+ // },
21
+ // };
22
22
 
23
23
  const emit = defineEmits<{
24
24
  (e: 'update:modelValue', value: boolean): void;
@@ -279,6 +279,10 @@ useEventListener(document, 'keydown', (ev: KeyboardEvent) => {
279
279
  ev.preventDefault();
280
280
  data.showHiddenItems = !data.showHiddenItems;
281
281
  }
282
+
283
+ if (ev.code === 'Enter') {
284
+ submit();
285
+ }
282
286
  });
283
287
 
284
288
  onUpdated(loadAvailableStorages);
@@ -294,9 +298,17 @@ const vTextOverflown = {
294
298
  </script>
295
299
 
296
300
  <template>
297
- <PlDialogModal class="split" :model-value="modelValue" width="688px" height="720px" @update:model-value="closeModal" @click.stop="deselectAll">
298
- <div v-focus class="file-dialog" @keyup.enter="submit">
299
- <div class="file-dialog__title">{{ title ?? 'Select files' }}</div>
301
+ <PlDialogModal
302
+ :no-content-gutters="true"
303
+ class="split"
304
+ :model-value="modelValue"
305
+ width="688px"
306
+ height="720px"
307
+ @update:model-value="closeModal"
308
+ @click.stop="deselectAll"
309
+ >
310
+ <template #title>{{ title ?? 'Select files' }}</template>
311
+ <div class="file-dialog">
300
312
  <div class="file-dialog__search">
301
313
  <PlDropdown v-model="data.storageEntry" label="Select storage" :options="data.storageOptions" />
302
314
  <PlTextField :model-value="data.dirPath" label="Enter path" @update:model-value="updateDirPathDebounced" />
@@ -338,10 +350,9 @@ const vTextOverflown = {
338
350
  </div>
339
351
  </div>
340
352
  </div>
341
- <!--@todo fix uikit css-->
342
- <div style="padding-top: 24px; display: flex; gap: 12px; border-top: 1px solid rgb(225, 227, 235)" class="form-modal__actions bordered">
353
+ <template #actions>
343
354
  <PlBtnPrimary style="min-width: 160px" :disabled="!isReady" @click.stop="submit">Import</PlBtnPrimary>
344
355
  <PlBtnGhost :justify-center="false" @click.stop="closeModal">Cancel</PlBtnGhost>
345
- </div>
356
+ </template>
346
357
  </PlDialogModal>
347
358
  </template>
@@ -5,18 +5,9 @@
5
5
  flex-direction: column;
6
6
  gap: 24px;
7
7
  overflow: auto;
8
-
9
- &__title {
10
- font-weight: 500;
11
- font-size: 28px;
12
- line-height: 32px;
13
- letter-spacing: -0.56px;
14
- color: var(--txt-01);
15
- margin-bottom: 16px;
16
- margin: 0 24px 16px 24px;
17
- }
18
-
8
+
19
9
  &__search {
10
+ padding-top: 6px;
20
11
  display: flex;
21
12
  flex-direction: column;
22
13
  gap: 24px;
@@ -147,7 +147,7 @@ useLabelNotch(rootRef);
147
147
 
148
148
  <template>
149
149
  <div class="pl-file-input__envelope">
150
- <div ref="rootRef" class="pl-file-input" :class="{ dashed, error: hasErrors }">
150
+ <div ref="rootRef" class="pl-file-input" tabindex="0" :class="{ dashed, error: hasErrors }" @keyup.enter="openFileDialog">
151
151
  <div class="pl-file-input__progress" :style="progressStyle" />
152
152
  <label v-if="label" ref="label">
153
153
  <i v-if="required" class="required-icon" />
@@ -14,6 +14,7 @@
14
14
  --icon-color: #000;
15
15
 
16
16
  width: 100%;
17
+ min-width: 160px;
17
18
  min-height: var(--control-height);
18
19
  position: relative;
19
20
  border-radius: var(--border-radius-control);
@@ -8,20 +8,39 @@ export default {
8
8
  </script>
9
9
 
10
10
  <script lang="ts" setup>
11
- import { onMounted, onUpdated, ref } from 'vue';
11
+ import { computed, onMounted, onUpdated, ref } from 'vue';
12
12
  import MaskIcon24 from '../MaskIcon24.vue';
13
13
  import './pl-log-view.scss';
14
- import { tapIf } from '@milaboratories/helpers';
14
+ import { okOptional, tapIf } from '@milaboratories/helpers';
15
+ import type { ValueOrErrors } from '@platforma-sdk/model';
16
+
17
+ const getOutputError = <T,>(o?: ValueOrErrors<T>) => {
18
+ if (o && o.ok === false) {
19
+ return o.errors.join('\n');
20
+ }
21
+ };
15
22
 
16
23
  const props = defineProps<{
17
24
  /**
18
25
  * String contents
19
26
  */
20
27
  value?: string;
28
+ /**
29
+ * String contents
30
+ */
31
+ error?: unknown;
32
+ /**
33
+ * Block output (Note: error and value take precedence over output property)
34
+ */
35
+ output?: ValueOrErrors<unknown>;
21
36
  }>();
22
37
 
23
38
  const contentRef = ref<HTMLElement>();
24
39
 
40
+ const computedError = computed(() => props.error ?? getOutputError(props.output));
41
+
42
+ const computedValue = computed(() => props.value ?? okOptional(props.output));
43
+
25
44
  const onClickCopy = () => {
26
45
  if (props.value) {
27
46
  navigator.clipboard.writeText(props.value);
@@ -43,8 +62,9 @@ onUpdated(scrollDown);
43
62
  </script>
44
63
 
45
64
  <template>
46
- <div class="pl-log-view">
65
+ <div class="pl-log-view" :class="{ 'has-error': computedError }">
47
66
  <MaskIcon24 title="Copy content" class="pl-log-view__copy" name="clipboard" @click="onClickCopy" />
48
- <div ref="contentRef" class="pl-log-view__content">{{ value }}</div>
67
+ <div v-if="computedError" class="pl-log-view__error">{{ computedError }}</div>
68
+ <div v-else ref="contentRef" class="pl-log-view__content">{{ computedValue }}</div>
49
69
  </div>
50
70
  </template>
@@ -1,16 +1,21 @@
1
1
  @import "@/assets/mixins";
2
2
 
3
3
  .pl-log-view {
4
+ --log-background: var(--bg-base-light);
4
5
  height: 100%;
5
6
  max-height: 100%;
6
7
  max-width: 100%;
7
8
  border-radius: 6px;
8
9
  border: 1px solid var(--border-color-div-grey);
9
- background: var(--bg-base-light);
10
+ background: var(--log-background);
10
11
  display: flex;
11
12
  position: relative;
12
13
  min-height: 44px;
13
14
 
15
+ &.has-error {
16
+ --log-background: var(--notification-error);
17
+ }
18
+
14
19
  &__copy {
15
20
  position: absolute;
16
21
  top: 12px;
@@ -32,9 +37,23 @@
32
37
  font-family: var(--font-family-monospace);
33
38
  white-space: pre;
34
39
  font-size: 14px;
35
- font-style: normal;
36
40
  font-weight: 400;
37
- line-height: 20px; /* 142.857% */
41
+ line-height: 20px;
42
+ @include scrollbar(true, true);
43
+ }
44
+
45
+ &__error {
46
+ margin: 12px;
47
+ max-height: 100%;
48
+ max-width: 100%;
49
+ flex: 1;
50
+ color: var(--txt-01);
51
+ font-feature-settings: 'ss11' on, 'ss15' on, 'ss17' on;
52
+ font-family: var(--font-family-monospace);
53
+ white-space: pre;
54
+ font-size: 14px;
55
+ font-weight: 400;
56
+ line-height: 20px;
38
57
  @include scrollbar(true, true);
39
58
  }
40
59
  }
@@ -6,7 +6,8 @@ export default {
6
6
  </script>
7
7
 
8
8
  <script lang="ts" setup>
9
- import { computed, ref, useAttrs, useSlots } from 'vue';
9
+ import './pl-slide-modal.scss';
10
+ import { ref, useAttrs, useSlots } from 'vue';
10
11
  import TransitionSlidePanel from '@/components/TransitionSlidePanel.vue';
11
12
  import { useClickOutside, useEventListener } from '@/index';
12
13
 
@@ -43,8 +44,6 @@ const props = withDefaults(
43
44
  },
44
45
  );
45
46
 
46
- const width = computed(() => props.width ?? '100%');
47
-
48
47
  const modal = ref();
49
48
 
50
49
  const $attrs = useAttrs();
@@ -86,83 +85,6 @@ useEventListener(document, 'keydown', (evt: KeyboardEvent) => {
86
85
  </div>
87
86
  </div>
88
87
  </TransitionSlidePanel>
89
- <div v-if="modelValue && shadow" class="pl-dialog-modal__shadow" @keyup.esc="emit('update:modelValue', false)" />
88
+ <div v-if="modelValue && shadow" class="pl-slide-modal__shadow" @keyup.esc="emit('update:modelValue', false)" />
90
89
  </Teleport>
91
90
  </template>
92
-
93
- <style lang="scss">
94
- @import '@/assets/mixins.scss';
95
-
96
- .pl-slide-modal {
97
- --padding-top: 24px;
98
- position: absolute;
99
- top: var(--title-bar-height);
100
- right: 0;
101
- bottom: 0;
102
- z-index: 3;
103
- display: flex;
104
- flex-direction: column;
105
- padding-top: var(--padding-top);
106
-
107
- will-change: transform;
108
-
109
- background-color: #fff;
110
-
111
- border-left: 1px solid var(--div-grey);
112
- /* Shadow L */
113
- box-shadow:
114
- 0px 8px 16px -4px rgba(15, 36, 77, 0.16),
115
- 0px 12px 32px -4px rgba(15, 36, 77, 0.16);
116
-
117
- .close-dialog-btn {
118
- position: absolute;
119
- top: 12px;
120
- right: 12px;
121
- cursor: pointer;
122
- background-color: #d3d7e0;
123
- @include mask(url('@/assets/images/24_close.svg'), 24px);
124
- &:hover {
125
- background-color: var(--main-dark-color);
126
- }
127
- }
128
-
129
- &.has-title {
130
- --padding-top: 0;
131
- }
132
-
133
- &__title {
134
- display: flex;
135
- align-items: center;
136
- font-family: var(--font-family-base);
137
- font-size: 28px;
138
- font-style: normal;
139
- font-weight: 500;
140
- line-height: 32px; /* 114.286% */
141
- letter-spacing: -0.56px;
142
- padding: 24px;
143
- }
144
-
145
- &__actions {
146
- display: flex;
147
- align-items: center;
148
- gap: 6px;
149
- padding: 0;
150
- min-height: 88px;
151
- padding: 0 24px;
152
- button {
153
- min-width: 160px;
154
- }
155
- }
156
-
157
- // Closes modal too
158
-
159
- &__content {
160
- flex: 1;
161
- display: flex;
162
- flex-direction: column;
163
- gap: 24px;
164
- padding: 16px 0;
165
- margin: 0 24px;
166
- }
167
- }
168
- </style>
@@ -0,0 +1,88 @@
1
+ @import '@/assets/mixins.scss';
2
+
3
+ .pl-slide-modal {
4
+ --padding-top: 24px;
5
+ position: absolute;
6
+ top: var(--title-bar-height);
7
+ right: 0;
8
+ bottom: 0;
9
+ z-index: var(--z-slide-dialog);
10
+ display: flex;
11
+ flex-direction: column;
12
+ padding-top: var(--padding-top);
13
+
14
+ min-width: 368px;
15
+ width: 368px;
16
+ max-width: 100%;
17
+
18
+ will-change: transform;
19
+
20
+ background-color: #fff;
21
+
22
+ border-left: 1px solid var(--div-grey);
23
+ /* Shadow L */
24
+ box-shadow:
25
+ 0px 8px 16px -4px rgba(15, 36, 77, 0.16),
26
+ 0px 12px 32px -4px rgba(15, 36, 77, 0.16);
27
+
28
+ .close-dialog-btn {
29
+ position: absolute;
30
+ top: 12px;
31
+ right: 12px;
32
+ cursor: pointer;
33
+ background-color: #d3d7e0;
34
+ @include mask(url('@/assets/images/24_close.svg'), 24px);
35
+ &:hover {
36
+ background-color: var(--main-dark-color);
37
+ }
38
+ }
39
+
40
+ &.has-title {
41
+ --padding-top: 0;
42
+ }
43
+
44
+ &__title {
45
+ display: flex;
46
+ align-items: center;
47
+ font-family: var(--font-family-base);
48
+ font-size: 28px;
49
+ font-style: normal;
50
+ font-weight: 500;
51
+ line-height: 32px; /* 114.286% */
52
+ letter-spacing: -0.56px;
53
+ padding: 24px;
54
+ }
55
+
56
+ &__actions {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 6px;
60
+ padding: 0;
61
+ min-height: 88px;
62
+ padding: 0 24px;
63
+ button {
64
+ min-width: 160px;
65
+ }
66
+ }
67
+
68
+ // Closes modal too
69
+
70
+ &__content {
71
+ flex: 1;
72
+ display: flex;
73
+ flex-direction: column;
74
+ gap: 24px;
75
+ padding: 16px 0;
76
+ margin: 0 24px;
77
+ }
78
+
79
+ &__shadow {
80
+ position: absolute;
81
+ z-index: var(--z-slide-shadow);
82
+ top: var(--title-bar-height);
83
+ left: 0;
84
+ right: 0;
85
+ bottom: 0;
86
+ background-color: rgba(0, 0, 0, 0.64);
87
+ }
88
+ }
@@ -12,6 +12,7 @@
12
12
  --prefix-color: var(--color-placeholder);
13
13
 
14
14
  width: 100%;
15
+ min-width: 160px;
15
16
  min-height: var(--control-height);
16
17
  position: relative;
17
18
  border-radius: var(--border-radius-control);