@dative-gpi/foundation-shared-components 0.0.52 → 0.0.54

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.
@@ -31,14 +31,14 @@ export default defineComponent({
31
31
  },
32
32
  props: {
33
33
  width: {
34
- type: [String, Number],
34
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
35
35
  required: false,
36
36
  default: null
37
37
  },
38
38
  gap: {
39
- type: [String, Number],
39
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
40
40
  required: false,
41
- default: 4
41
+ default: "4px"
42
42
  },
43
43
  pages: {
44
44
  type: Number,
@@ -80,11 +80,11 @@ export default defineComponent({
80
80
  });
81
81
 
82
82
  const classes = (page: number): string[] => {
83
- const innerClasses = ["fs-pagination-page"];
83
+ const classNames = ["fs-pagination-page"];
84
84
  if (page <= props.modelValue) {
85
- innerClasses.push("fs-pagination-active-page");
85
+ classNames.push("fs-pagination-active-page");
86
86
  }
87
- return innerClasses;
87
+ return classNames;
88
88
  };
89
89
 
90
90
  return {
@@ -16,15 +16,25 @@ import { sizeToVar } from "@dative-gpi/foundation-shared-components/utils";
16
16
  export default defineComponent({
17
17
  name: "FSRow",
18
18
  props: {
19
+ height: {
20
+ type: [Array, String, Number] as PropType<"hug" | "fill" | string[] | number[] | string | number | null>,
21
+ required: false,
22
+ default: "hug"
23
+ },
19
24
  width: {
20
- type: [String, Number] as PropType<"hug" | "fill" | string | number>,
25
+ type: [Array, String, Number] as PropType<"hug" | "fill" | string[] | number[] | string | number | null>,
21
26
  required: false,
22
27
  default: "fill"
23
28
  },
24
- height: {
25
- type: [String, Number] as PropType<"hug" | "fill" | string | number>,
29
+ padding: {
30
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
26
31
  required: false,
27
- default: "hug"
32
+ default: "0"
33
+ },
34
+ gap: {
35
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
36
+ required: false,
37
+ default: "8px"
28
38
  },
29
39
  align: {
30
40
  type: String as PropType<"top-left" | "top-center" | "top-right" | "center-left" | "center-center" | "center-right" | "bottom-left" | "bottom-center" | "bottom-right">,
@@ -35,16 +45,6 @@ export default defineComponent({
35
45
  type: Boolean,
36
46
  required: false,
37
47
  default: true
38
- },
39
- padding: {
40
- type: [String, Number],
41
- required: false,
42
- default: "0"
43
- },
44
- gap: {
45
- type: [String, Number],
46
- required: false,
47
- default: "8px"
48
48
  }
49
49
  },
50
50
  setup(props) {
@@ -20,8 +20,7 @@
20
20
  </template>
21
21
  <template #default>
22
22
  <v-slide-group-item
23
- v-for="(component, index) in getChildren(undefined)"
24
- :key="index"
23
+ v-for="(component) in getChildren()"
25
24
  >
26
25
  <component :is="component" />
27
26
  </v-slide-group-item>
@@ -42,7 +41,7 @@
42
41
  </template>
43
42
 
44
43
  <script lang="ts">
45
- import { computed, defineComponent, ref } from "vue";
44
+ import { computed, defineComponent, PropType, ref } from "vue";
46
45
 
47
46
  import { useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
48
47
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
@@ -61,12 +60,12 @@ export default defineComponent({
61
60
  },
62
61
  props: {
63
62
  padding: {
64
- type: [String, Number],
63
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
65
64
  required: false,
66
65
  default: "0"
67
66
  },
68
67
  gap: {
69
- type: [String, Number],
68
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
70
69
  required: false,
71
70
  default: "8px"
72
71
  },
@@ -67,16 +67,6 @@ export default defineComponent({
67
67
  FSRow
68
68
  },
69
69
  props: {
70
- modelValue: {
71
- type: Boolean,
72
- required: false,
73
- default: false
74
- },
75
- width: {
76
- type: [String, Number],
77
- required: false,
78
- default: "auto"
79
- },
80
70
  title: {
81
71
  type: String as PropType<string | null>,
82
72
  required: false,
@@ -87,6 +77,16 @@ export default defineComponent({
87
77
  required: false,
88
78
  default: null
89
79
  },
80
+ width: {
81
+ type: [Array, String, Number] as PropType<"hug" | "fill" | string[] | number[] | string | number | null>,
82
+ required: false,
83
+ default: "auto"
84
+ },
85
+ modelValue: {
86
+ type: Boolean,
87
+ required: false,
88
+ default: false
89
+ },
90
90
  leftButtonPrependIcon: {
91
91
  type: String as PropType<string | null>,
92
92
  required: false,
@@ -11,10 +11,11 @@
11
11
  v-bind="$attrs"
12
12
  >
13
13
  <template
14
- v-for="(component, index) in getChildren(undefined)"
15
- :key="index"
14
+ v-for="component in getChildren()"
16
15
  >
17
- <component :is="component" />
16
+ <component
17
+ :is="component"
18
+ />
18
19
  </template>
19
20
  </v-tabs>
20
21
  </template>
@@ -148,12 +148,12 @@ export default defineComponent({
148
148
  default: ColorEnum.Primary
149
149
  },
150
150
  padding: {
151
- type: [String, Number],
151
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
152
152
  required: false,
153
153
  default: "0"
154
154
  },
155
155
  gap: {
156
- type: [String, Number],
156
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
157
157
  required: false,
158
158
  default: "8px"
159
159
  },
@@ -4,11 +4,12 @@
4
4
  v-bind="$attrs"
5
5
  >
6
6
  <v-window-item
7
- v-for="(component, index) in getChildren(undefined)"
7
+ v-for="(component, index) in getChildren()"
8
8
  :value="value(component, index)"
9
- :key="index"
10
9
  >
11
- <component :is="component" />
10
+ <component
11
+ :is="component"
12
+ />
12
13
  </v-window-item>
13
14
  </v-window>
14
15
  </template>
@@ -6,16 +6,17 @@
6
6
  v-bind="$attrs"
7
7
  >
8
8
  <v-slide-group-item
9
- v-for="(component, index) in getChildren(undefined)"
10
- :key="index"
9
+ v-for="component in getChildren()"
11
10
  >
12
- <component :is="component" />
11
+ <component
12
+ :is="component"
13
+ />
13
14
  </v-slide-group-item>
14
15
  </v-slide-group>
15
16
  </template>
16
17
 
17
18
  <script lang="ts">
18
- import { computed, defineComponent, ref } from "vue";
19
+ import { computed, defineComponent, PropType, ref } from "vue";
19
20
 
20
21
  import { useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
21
22
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
@@ -25,12 +26,12 @@ export default defineComponent({
25
26
  name: "FSWrapGroup",
26
27
  props: {
27
28
  padding: {
28
- type: [String, Number],
29
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
29
30
  required: false,
30
31
  default: "0"
31
32
  },
32
33
  gap: {
33
- type: [String, Number],
34
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
34
35
  required: false,
35
36
  default: "8px"
36
37
  }
@@ -1,7 +1,9 @@
1
1
  <template>
2
2
  <FSCol>
3
3
  <slot v-if="!$props.hideHeader" name="label">
4
- <FSRow :wrap="false">
4
+ <FSRow
5
+ :wrap="false"
6
+ >
5
7
  <FSSpan
6
8
  v-if="$props.label"
7
9
  class="fs-autocomplete-field-label"
@@ -36,6 +38,7 @@
36
38
  clearIcon="mdi-close"
37
39
  variant="outlined"
38
40
  :style="style"
41
+ :listProps="listStyle"
39
42
  :class="classes"
40
43
  :hideDetails="true"
41
44
  :items="$props.items"
@@ -163,6 +166,7 @@ export default defineComponent({
163
166
  delete slots.label;
164
167
  delete slots.description;
165
168
 
169
+ const backgrounds = getColors(ColorEnum.Background);
166
170
  const errors = getColors(ColorEnum.Error);
167
171
  const lights = getColors(ColorEnum.Light);
168
172
  const darks = getColors(ColorEnum.Dark);
@@ -180,6 +184,7 @@ export default defineComponent({
180
184
  }
181
185
  return {
182
186
  "--fs-autocomplete-field-cursor" : "text",
187
+ "--fs-autocomplete-field-background-color" : backgrounds.base,
183
188
  "--fs-autocomplete-field-border-color" : lights.dark,
184
189
  "--fs-autocomplete-field-color" : darks.base,
185
190
  "--fs-autocomplete-field-active-border-color": darks.dark,
@@ -188,6 +193,12 @@ export default defineComponent({
188
193
  };
189
194
  });
190
195
 
196
+ const listStyle = computed((): any => {
197
+ return {
198
+ style: style.value
199
+ };
200
+ });
201
+
191
202
  const classes = computed((): string[] => {
192
203
  const classNames = ["fs-autocomplete-field"];
193
204
  if (props.multiple) {
@@ -208,13 +219,14 @@ export default defineComponent({
208
219
  });
209
220
 
210
221
  return {
222
+ innerSearch,
211
223
  validateOn,
224
+ listStyle,
212
225
  messages,
213
226
  blurred,
227
+ classes,
214
228
  slots,
215
229
  style,
216
- classes,
217
- innerSearch,
218
230
  onUpdate
219
231
  };
220
232
  }
@@ -1,7 +1,9 @@
1
1
  <template>
2
2
  <FSCol>
3
3
  <slot v-if="!$props.hideHeader" name="label">
4
- <FSRow :wrap="false">
4
+ <FSRow
5
+ :wrap="false"
6
+ >
5
7
  <FSSpan
6
8
  v-if="$props.label"
7
9
  class="fs-select-field-label"
@@ -37,6 +39,7 @@
37
39
  clearIcon="mdi-close"
38
40
  variant="outlined"
39
41
  :style="style"
42
+ :listProps="listStyle"
40
43
  :hideDetails="true"
41
44
  :items="$props.items"
42
45
  :itemTitle="$props.itemTitle"
@@ -155,6 +158,7 @@ export default defineComponent({
155
158
  delete slots.label;
156
159
  delete slots.description;
157
160
 
161
+ const backgrounds = getColors(ColorEnum.Background);
158
162
  const errors = getColors(ColorEnum.Error);
159
163
  const lights = getColors(ColorEnum.Light);
160
164
  const darks = getColors(ColorEnum.Dark);
@@ -170,6 +174,7 @@ export default defineComponent({
170
174
  }
171
175
  return {
172
176
  "--fs-select-field-cursor" : "pointer",
177
+ "--fs-select-field-background-color" : backgrounds.base,
173
178
  "--fs-select-field-border-color" : lights.dark,
174
179
  "--fs-select-field-color" : darks.base,
175
180
  "--fs-select-field-active-border-color": darks.dark,
@@ -178,10 +183,17 @@ export default defineComponent({
178
183
  };
179
184
  });
180
185
 
186
+ const listStyle = computed((): any => {
187
+ return {
188
+ style: style.value
189
+ };
190
+ });
191
+
181
192
  const messages = computed((): string[] => props.messages ?? getMessages(props.modelValue, props.rules));
182
193
 
183
194
  return {
184
195
  validateOn,
196
+ listStyle,
185
197
  messages,
186
198
  blurred,
187
199
  slots,
@@ -2,7 +2,6 @@
2
2
  <FSCol>
3
3
  <slot v-if="!$props.hideHeader" name="label">
4
4
  <FSRow
5
- height="16px"
6
5
  :wrap="false"
7
6
  >
8
7
  <FSSpan
@@ -751,11 +751,11 @@ export default defineComponent({
751
751
  });
752
752
 
753
753
  const classes = computed((): string[] => {
754
- const innerClasses = ["fs-data-table"];
754
+ const classNames = ["fs-data-table"];
755
755
  if (props.groupBy) {
756
- innerClasses.push("fs-data-table-grouped");
756
+ classNames.push("fs-data-table-grouped");
757
757
  }
758
- return innerClasses;
758
+ return classNames;
759
759
  });
760
760
 
761
761
  const extraHeaders = computed((): any[] => {
@@ -1,7 +1,7 @@
1
- import { useSlots as useVueSlots } from "vue"
1
+ import { Slot, useSlots as useVueSlots } from "vue"
2
2
 
3
3
  export const useSlots = () => {
4
- const getChildren = (name: string | undefined): any => {
4
+ const getChildren = (name: string | undefined = undefined): any => {
5
5
  const innerSlots = { ...useVueSlots() };
6
6
  const innerName = name ?? "default";
7
7
  if (innerSlots[innerName] != null) {
@@ -27,7 +27,7 @@ export const useSlots = () => {
27
27
  return null;
28
28
  };
29
29
 
30
- const getFirstChild = (name: string | undefined): any => {
30
+ const getFirstChild = (name: string | undefined = undefined): any => {
31
31
  const children = getChildren(name);
32
32
  if (children != null) {
33
33
  return children[0];
@@ -36,7 +36,7 @@ export const useSlots = () => {
36
36
  };
37
37
 
38
38
  return {
39
- slots: { ...useVueSlots() },
39
+ slots: { ...useVueSlots() } as { [label: string]: Slot<any> },
40
40
  getChildren,
41
41
  getFirstChild
42
42
  };
package/models/rules.ts CHANGED
@@ -7,59 +7,59 @@ const { epochToLongDateFormat } = useAppTimeZone()!;
7
7
  const { $tr } = useTranslationsProvider();
8
8
 
9
9
  export const TextRules = {
10
- required: (message: string | null) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
11
- copy: (original: string, message: string | null) => (value: string) => value === original || (message ?? $tr("ui.rules.copy", "Different from original")),
12
- min: (min: number, message: string | null) => (value: string) => value.length >= min || (message ?? $tr("ui.rules.text-min", "Must be at least {0} characters", min.toString())),
13
- max: (max: number, message: string | null) => (value: string) => value.length <= max || (message ?? $tr("ui.rules.text-max", "Must be at most {0} characters", max.toString())),
14
- email: (message: string | null) => (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) || (message ?? $tr("ui.rules.text-email", "Must be a valid email")),
15
- phone: (message: string | null) => (value: string) => /^[\+]?([0-9]+[ -]?)+$/.test(value) || (message ?? $tr("ui.rules.text-phone", "Must be a valid phone number")),
16
- digit: (message: string | null) => (value: string) => /(?=.*\d)/.test(value) || (message ?? $tr("ui.rules.text-digit", "Must contain a digit")),
17
- uppercase: (message: string | null) => (value: string) => /(?=.*[A-Z])/.test(value) || (message ?? $tr("ui.rules.text-uppercase", "Must contain an uppercase letter")),
18
- lowercase: (message: string | null) => (value: string) => /(?=.*[a-z])/.test(value) || (message ?? $tr("ui.rules.text-lowercase", "Must contain a lowercase letter")),
19
- special: (message: string | null) => (value: string) => /(?=.*[!@#$%^&*])/.test(value) || (message ?? $tr("ui.rules.text-special-character", "Must contain a special character"))
10
+ required: (message: string | undefined = undefined) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
11
+ copy: (original: string, message: string | undefined = undefined) => (value: string) => value === original || (message ?? $tr("ui.rules.copy", "Different from original")),
12
+ min: (min: number, message: string | undefined = undefined) => (value: string) => value.length >= min || (message ?? $tr("ui.rules.text-min", "Must be at least {0} characters", min.toString())),
13
+ max: (max: number, message: string | undefined = undefined) => (value: string) => value.length <= max || (message ?? $tr("ui.rules.text-max", "Must be at most {0} characters", max.toString())),
14
+ email: (message: string | undefined = undefined) => (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) || (message ?? $tr("ui.rules.text-email", "Must be a valid email")),
15
+ phone: (message: string | undefined = undefined) => (value: string) => /^[\+]?([0-9]+[ -]?)+$/.test(value) || (message ?? $tr("ui.rules.text-phone", "Must be a valid phone number")),
16
+ digit: (message: string | undefined = undefined) => (value: string) => /(?=.*\d)/.test(value) || (message ?? $tr("ui.rules.text-digit", "Must contain a digit")),
17
+ uppercase: (message: string | undefined = undefined) => (value: string) => /(?=.*[A-Z])/.test(value) || (message ?? $tr("ui.rules.text-uppercase", "Must contain an uppercase letter")),
18
+ lowercase: (message: string | undefined = undefined) => (value: string) => /(?=.*[a-z])/.test(value) || (message ?? $tr("ui.rules.text-lowercase", "Must contain a lowercase letter")),
19
+ special: (message: string | undefined = undefined) => (value: string) => /(?=.*[!@#$%^&*])/.test(value) || (message ?? $tr("ui.rules.text-special-character", "Must contain a special character"))
20
20
  };
21
21
 
22
22
  export const TagRules = {
23
- required: (message: string | null) => (value: string[]) => value.length > 0 || (message ?? $tr("ui.rules.required", "Required")),
24
- min: (min: number, message: string | null) => (value: string[]) => value.length >= min || (message ?? $tr("ui.rules.tag-min", "Must be at least {0} elements", min.toString())),
25
- max: (max: number, message: string | null) => (value: string[]) => value.length <= max || (message ?? $tr("ui.rules.tag-max", "Must be at most {0} elements", max.toString()))
23
+ required: (message: string | undefined = undefined) => (value: string[]) => value.length > 0 || (message ?? $tr("ui.rules.required", "Required")),
24
+ min: (min: number, message: string | undefined = undefined) => (value: string[]) => value.length >= min || (message ?? $tr("ui.rules.tag-min", "Must be at least {0} elements", min.toString())),
25
+ max: (max: number, message: string | undefined = undefined) => (value: string[]) => value.length <= max || (message ?? $tr("ui.rules.tag-max", "Must be at most {0} elements", max.toString()))
26
26
  };
27
27
 
28
28
  export const NumberRules = {
29
- required: (message: string | null) => (value: string) => (!!value && !isNaN(parseFloat(value))) || (message ?? $tr("ui.rules.required", "Required")),
30
- min: (min: number, message: string | null) => (value: string) => (!!value && !isNaN(parseFloat(value)) && parseFloat(value) >= min) || (message ?? $tr("ui.rules.number-min", "Must be at least {0}", min.toString())),
31
- max: (max: number, message: string | null) => (value: string) => (!!value && !isNaN(parseFloat(value)) && parseFloat(value) <= max) || (message ?? $tr("ui.rules.number-max", "Must be at most {0}", max.toString())),
32
- integer: (message: string | null) => (value: string) => (!!value && !isNaN(parseFloat(value)) && Number.isInteger(parseFloat(value))) || (message ?? $tr("ui.rules.number-integer", "Must be an integer"))
29
+ required: (message: string | undefined = undefined) => (value: string) => (!!value && !isNaN(parseFloat(value))) || (message ?? $tr("ui.rules.required", "Required")),
30
+ min: (min: number, message: string | undefined = undefined) => (value: string) => (!!value && !isNaN(parseFloat(value)) && parseFloat(value) >= min) || (message ?? $tr("ui.rules.number-min", "Must be at least {0}", min.toString())),
31
+ max: (max: number, message: string | undefined = undefined) => (value: string) => (!!value && !isNaN(parseFloat(value)) && parseFloat(value) <= max) || (message ?? $tr("ui.rules.number-max", "Must be at most {0}", max.toString())),
32
+ integer: (message: string | undefined = undefined) => (value: string) => (!!value && !isNaN(parseFloat(value)) && Number.isInteger(parseFloat(value))) || (message ?? $tr("ui.rules.number-integer", "Must be an integer"))
33
33
  };
34
34
 
35
35
  export const IconRules = {
36
- required: (message: string | null) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
36
+ required: (message: string | undefined = undefined) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
37
37
  };
38
38
 
39
39
  export const DateRules = {
40
- required: (message: string | null) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
41
- min: (min: number, message: string | null) => (value: number) => (!value || value >= min) || (message ?? $tr("ui.rules.date-min", "Must be after {0}", epochToLongDateFormat(min))),
42
- max: (max: number, message: string | null) => (value: number) => (!value || value <= max) || (message ?? $tr("ui.rules.date-max", "Must be before {0}", epochToLongDateFormat(max)))
40
+ required: (message: string | undefined = undefined) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
41
+ min: (min: number, message: string | undefined = undefined) => (value: number) => (!value || value >= min) || (message ?? $tr("ui.rules.date-min", "Must be after {0}", epochToLongDateFormat(min))),
42
+ max: (max: number, message: string | undefined = undefined) => (value: number) => (!value || value <= max) || (message ?? $tr("ui.rules.date-max", "Must be before {0}", epochToLongDateFormat(max)))
43
43
  };
44
44
 
45
45
  export const SelectRules = {
46
- required: (message: string | null) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
47
- min: (min: number, message: string | null) => (value: string[]) => (Array.isArray(value) && value.length >= min) || (message ?? $tr("ui.rules.select-min", "Must select at least {0} elements", min.toString())),
48
- max: (max: number, message: string | null) => (value: string[]) => (Array.isArray(value) && value.length <= max) || (message ?? $tr("ui.rules.select-max", "Must select at most {0} elements", max.toString()))
46
+ required: (message: string | undefined = undefined) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
47
+ min: (min: number, message: string | undefined = undefined) => (value: string[]) => (Array.isArray(value) && value.length >= min) || (message ?? $tr("ui.rules.select-min", "Must select at least {0} elements", min.toString())),
48
+ max: (max: number, message: string | undefined = undefined) => (value: string[]) => (Array.isArray(value) && value.length <= max) || (message ?? $tr("ui.rules.select-max", "Must select at most {0} elements", max.toString()))
49
49
  };
50
50
 
51
51
  export const AutocompleteRules = {
52
- required: (message: string | null) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
53
- min: (min: number, message: string | null) => (value: string[]) => (Array.isArray(value) && value.length >= min) || (message ?? $tr("ui.rules.autocomplete-min", "Must select at least {0} elements", min.toString())),
54
- max: (max: number, message: string | null) => (value: string[]) => (Array.isArray(value) && value.length <= max) || (message ?? $tr("ui.rules.autocomplete-max", "Must select at most {0} elements", max.toString()))
52
+ required: (message: string | undefined = undefined) => (value: string) => !!value || (message ?? $tr("ui.rules.required", "Required")),
53
+ min: (min: number, message: string | undefined = undefined) => (value: string[]) => (Array.isArray(value) && value.length >= min) || (message ?? $tr("ui.rules.autocomplete-min", "Must select at least {0} elements", min.toString())),
54
+ max: (max: number, message: string | undefined = undefined) => (value: string[]) => (Array.isArray(value) && value.length <= max) || (message ?? $tr("ui.rules.autocomplete-max", "Must select at most {0} elements", max.toString()))
55
55
  };
56
56
 
57
57
  export const TimeRules = {
58
- required: (message: string | null) => (value: number) => !!value || (message ?? $tr("ui.rules.required", "Required")),
59
- min: (min: number, message: string | null) => (value: number) => value >= min || (message ?? $tr("ui.rules.time-min", "Must be more than {0}", getTimeBestString(min))),
60
- max: (max: number, message: string | null) => (value: number) => value <= max || (message ?? $tr("ui.rules.time-max", "Must be less than {0}", getTimeBestString(max)))
58
+ required: (message: string | undefined = undefined) => (value: number) => !!value || (message ?? $tr("ui.rules.required", "Required")),
59
+ min: (min: number, message: string | undefined = undefined) => (value: number) => value >= min || (message ?? $tr("ui.rules.time-min", "Must be more than {0}", getTimeBestString(min))),
60
+ max: (max: number, message: string | undefined = undefined) => (value: number) => value <= max || (message ?? $tr("ui.rules.time-max", "Must be less than {0}", getTimeBestString(max)))
61
61
  };
62
62
 
63
63
  export const ToggleRules = {
64
- required: (message: string | null) => (value: boolean) => value || (message ?? $tr("ui.rules.required", "Required"))
64
+ required: (message: string | undefined = undefined) => (value: boolean) => value || (message ?? $tr("ui.rules.required", "Required"))
65
65
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dative-gpi/foundation-shared-components",
3
3
  "sideEffects": false,
4
- "version": "0.0.52",
4
+ "version": "0.0.54",
5
5
  "description": "",
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -10,8 +10,8 @@
10
10
  "author": "",
11
11
  "license": "ISC",
12
12
  "dependencies": {
13
- "@dative-gpi/foundation-shared-domain": "0.0.52",
14
- "@dative-gpi/foundation-shared-services": "0.0.52",
13
+ "@dative-gpi/foundation-shared-domain": "0.0.54",
14
+ "@dative-gpi/foundation-shared-services": "0.0.54",
15
15
  "@fontsource/montserrat": "^5.0.16",
16
16
  "@lexical/clipboard": "^0.12.5",
17
17
  "@lexical/history": "^0.12.5",
@@ -32,5 +32,5 @@
32
32
  "sass": "^1.69.5",
33
33
  "sass-loader": "^13.3.2"
34
34
  },
35
- "gitHead": "1cea46f60262aceae3135923684ed4a5af60d0bb"
35
+ "gitHead": "391503e595cd9d731fca14b5bb2d3a10b6efee95"
36
36
  }
@@ -33,4 +33,20 @@
33
33
 
34
34
  .fs-autocomplete-field-description {
35
35
  color: var(--fs-autocomplete-field-color);
36
+ }
37
+
38
+ .v-overlay-container > .v-overlay > .v-autocomplete__content {
39
+ box-shadow: 0px 5px 8px 0px #00000029;
40
+ border-radius: 4px;
41
+
42
+ & .v-list {
43
+ background-color: var(--fs-autocomplete-field-background-color);
44
+ border-radius: 4px;
45
+ margin-top: 4px;
46
+ padding: 2px;
47
+
48
+ & .v-list-item {
49
+ border-radius: 4px;
50
+ }
51
+ }
36
52
  }
@@ -4,6 +4,8 @@
4
4
  max-height: var(--fs-fade-out-height);
5
5
  padding: var(--fs-fade-out-padding);
6
6
  width: var(--fs-fade-out-width);
7
+ padding-bottom: 0 !important;
8
+ padding-top: 0 !important;
7
9
  flex-direction: column;
8
10
  position: relative;
9
11
  display: flex;
@@ -15,7 +17,7 @@
15
17
  z-index: 10;
16
18
  min-height: var(--fs-fade-out-top-mask-height);
17
19
  width: 100%;
18
- top: var(--fs-fade-out-top-mask-top);
20
+ top: 0;
19
21
  transition: all 0.14s cubic-bezier(0.4, 0, 0.2, 1);
20
22
  background: linear-gradient(to top, transparent 0, var(--fs-fade-out-mask-color) var(--fs-fade-out-top-mask-height));
21
23
  }
@@ -26,7 +28,7 @@
26
28
  z-index: 10;
27
29
  min-height: var(--fs-fade-out-bottom-mask-height);
28
30
  width: 100%;
29
- bottom: var(--fs-fade-out-bottom-mask-bottom);
31
+ bottom: 0;
30
32
  transition: all 0.14s cubic-bezier(0.4, 0, 0.2, 1);
31
33
  background: linear-gradient(to bottom, transparent 0, var(--fs-fade-out-mask-color) var(--fs-fade-out-bottom-mask-height));
32
34
  }
@@ -31,4 +31,22 @@
31
31
 
32
32
  .fs-select-field-description {
33
33
  color: var(--fs-select-field-color);
34
+ }
35
+
36
+ .v-overlay-container > .v-overlay > .v-select__content {
37
+ box-shadow: 0px 5px 8px 0px #00000029;
38
+ border-radius: 4px;
39
+
40
+ & > .v-list {
41
+ @extend .fs-hide-y-scrollbar;
42
+
43
+ background-color: var(--fs-select-field-background-color);
44
+ border-radius: 4px;
45
+ margin-top: 4px;
46
+ padding: 2px;
47
+
48
+ & .v-list-item {
49
+ border-radius: 4px;
50
+ }
51
+ }
34
52
  }
@@ -121,10 +121,6 @@ $nthOverlay: 25;
121
121
  }
122
122
  }
123
123
 
124
- .v-overlay__content {
125
- min-width: 0 !important;
126
- }
127
-
128
124
  /***** Applies to all slide groups (FSTabs, FSSlideGroup, FSWrapGroup) *****/
129
125
 
130
126
  // On touchscreen, hide arrows
package/utils/css.ts CHANGED
@@ -20,7 +20,36 @@ export const sizeToVar = (value: string[] | number[] | string | number | null, n
20
20
  return typeof value === 'string' && isNaN(+value) ? value : `${value}${unit}`;
21
21
  };
22
22
 
23
- export const varToSize = (value: string): number => {
23
+ export const varToSize = (value: string[] | number[] | string | number | null): number => {
24
+ if (value == null) {
25
+ return 0;
26
+ }
27
+ if (Array.isArray(value)) {
28
+ if (isExtraSmall.value) {
29
+ const extraSmallValue = value[2] ?? value[1] ?? value[0];
30
+ if (typeof extraSmallValue === 'number') {
31
+ return extraSmallValue;
32
+ }
33
+ const parsed = parseInt(extraSmallValue.replace(/[^0-9.]/g, ''));
34
+ return isNaN(parsed) ? 0 : parsed;
35
+ }
36
+ if (isMobileSized.value) {
37
+ const mobileValue = value[1] ?? value[0];
38
+ if (typeof mobileValue === 'number') {
39
+ return mobileValue;
40
+ }
41
+ const parsed = parseInt(mobileValue.replace(/[^0-9.]/g, ''));
42
+ return isNaN(parsed) ? 0 : parsed;
43
+ }
44
+ if (typeof value[0] === 'number') {
45
+ return value[0];
46
+ }
47
+ const parsed = parseInt(value[0].replace(/[^0-9.]/g, ''));
48
+ return isNaN(parsed) ? 0 : parsed;
49
+ }
50
+ if (typeof value === 'number') {
51
+ return value;
52
+ }
24
53
  const parsed = parseInt(value.replace(/[^0-9.]/g, ''));
25
54
  return isNaN(parsed) ? 0 : parsed;
26
55
  }