@dative-gpi/foundation-shared-components 0.0.7 → 0.0.8

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 (37) hide show
  1. package/components/FSButton.vue +3 -3
  2. package/components/FSCalendar.vue +171 -0
  3. package/components/FSCalendarTwin.vue +394 -0
  4. package/components/FSCard.vue +63 -0
  5. package/components/FSCheckbox.vue +7 -8
  6. package/components/FSClock.vue +38 -0
  7. package/components/FSDatePicker.vue +226 -0
  8. package/components/FSIcon.vue +1 -1
  9. package/components/FSNumberField.vue +4 -4
  10. package/components/FSPasswordField.vue +14 -12
  11. package/components/FSRadio.vue +0 -1
  12. package/components/FSRadioGroup.vue +6 -6
  13. package/components/FSRichTextField.vue +558 -0
  14. package/components/FSSearchField.vue +103 -102
  15. package/components/FSSlider.vue +132 -0
  16. package/components/FSSwitch.vue +9 -9
  17. package/components/FSTagField.vue +186 -127
  18. package/components/FSTextArea.vue +207 -0
  19. package/components/FSTextField.vue +151 -146
  20. package/composables/index.ts +2 -1
  21. package/composables/useBreakpoints.ts +14 -0
  22. package/composables/useDates.ts +39 -0
  23. package/models/FSTextFields.ts +12 -6
  24. package/package.json +12 -4
  25. package/styles/components/fs_button.scss +2 -10
  26. package/styles/components/fs_calendar.scss +115 -0
  27. package/styles/components/fs_card.scss +7 -0
  28. package/styles/components/fs_date_picker.scss +0 -0
  29. package/styles/components/fs_icon.scss +3 -9
  30. package/styles/components/fs_rich_text_field.scss +67 -0
  31. package/styles/components/fs_slider.scss +20 -0
  32. package/styles/components/fs_tag_field.scss +9 -0
  33. package/styles/components/fs_text_area.scss +105 -0
  34. package/styles/components/index.scss +6 -0
  35. package/utils/FSRichTextField.ts +27 -0
  36. package/utils/index.ts +1 -0
  37. package/composables/useTouch.ts +0 -9
@@ -1,67 +1,67 @@
1
1
  <template>
2
- <FSCol>
3
- <slot name="label">
4
- <FSRow :wrap="false">
5
- <FSSpan
6
- v-if="$props.label"
7
- class="fs-text-field-label"
8
- font="text-overline"
9
- :style="style"
10
- >
11
- {{ $props.label }}
12
- </FSSpan>
13
- <FSSpan
14
- v-if="$props.label && $props.required"
15
- class="fs-text-field-label"
16
- style="margin-left: -8px;"
17
- font="text-overline"
18
- :ellipsis="false"
19
- :style="style"
20
- >
21
- *
22
- </FSSpan>
23
- <v-spacer style="min-width: 40px;" />
24
- <FSSpan
25
- v-if="messages.length > 0"
26
- class="fs-text-field-messages"
27
- font="text-overline"
28
- :style="style"
29
- >
30
- {{ messages.join(", ") }}
31
- </FSSpan>
32
- </FSRow>
33
- </slot>
34
- <v-text-field
35
- class="fs-text-field"
36
- variant="outlined"
37
- hide-details
38
- :style="style"
39
- :type="$props.type"
40
- :rules="$props.rules"
41
- :readonly="!$props.editable"
42
- :modelValue="$props.value"
43
- @update:modelValue="(value) => $emit('update:value', value)"
44
- v-bind="$attrs"
2
+ <FSCol>
3
+ <slot name="label">
4
+ <FSRow :wrap="false">
5
+ <FSSpan
6
+ v-if="$props.label"
7
+ class="fs-text-field-label"
8
+ font="text-overline"
9
+ :style="style"
45
10
  >
46
- <template v-for="(_, name) in $slots" v-slot:[name]="slotData">
47
- <slot :name="name" v-bind="slotData" />
48
- </template>
49
- </v-text-field>
50
- <slot name="description">
51
- <FSSpan
52
- v-if="$props.description"
53
- class="fs-text-field-description"
54
- font="text-underline"
55
- :style="style"
56
- >
57
- {{ $props.description }}
58
- </FSSpan>
59
- </slot>
60
- </FSCol>
11
+ {{ $props.label }}
12
+ </FSSpan>
13
+ <FSSpan
14
+ v-if="$props.label && $props.required"
15
+ class="fs-text-field-label"
16
+ style="margin-left: -8px;"
17
+ font="text-overline"
18
+ :ellipsis="false"
19
+ :style="style"
20
+ >
21
+ *
22
+ </FSSpan>
23
+ <v-spacer style="min-width: 40px;" />
24
+ <FSSpan
25
+ v-if="messages.length > 0"
26
+ class="fs-text-field-messages"
27
+ font="text-overline"
28
+ :style="style"
29
+ >
30
+ {{ messages.join(", ") }}
31
+ </FSSpan>
32
+ </FSRow>
33
+ </slot>
34
+ <v-text-field
35
+ class="fs-text-field"
36
+ variant="outlined"
37
+ hide-details
38
+ :style="style"
39
+ :type="$props.type"
40
+ :rules="$props.rules"
41
+ :readonly="!$props.editable"
42
+ :modelValue="$props.modelValue"
43
+ @update:modelValue="(value) => $emit('update:modelValue', value)"
44
+ v-bind="$attrs"
45
+ >
46
+ <template v-for="(_, name) in slots" v-slot:[name]="slotData">
47
+ <slot :name="name" v-bind="slotData" />
48
+ </template>
49
+ </v-text-field>
50
+ <slot name="description">
51
+ <FSSpan
52
+ v-if="$props.description"
53
+ class="fs-text-field-description"
54
+ font="text-underline"
55
+ :style="style"
56
+ >
57
+ {{ $props.description }}
58
+ </FSSpan>
59
+ </slot>
60
+ </FSCol>
61
61
  </template>
62
62
 
63
63
  <script lang="ts">
64
- import { computed, defineComponent, PropType, toRefs } from "vue";
64
+ import { computed, defineComponent, PropType, toRefs, useSlots } from "vue";
65
65
 
66
66
  import { useColors } from "@dative-gpi/foundation-shared-components/composables";
67
67
  import { ColorBase } from "@dative-gpi/foundation-shared-components/themes";
@@ -71,99 +71,104 @@ import FSCol from "./FSCol.vue";
71
71
  import FSRow from "./FSRow.vue";
72
72
 
73
73
  export default defineComponent({
74
- name: "FSTextField",
75
- components: {
76
- FSSpan,
77
- FSCol,
78
- FSRow
74
+ name: "FSTextField",
75
+ components: {
76
+ FSSpan,
77
+ FSCol,
78
+ FSRow
79
+ },
80
+ inheritAttrs: false,
81
+ props: {
82
+ label: {
83
+ type: String,
84
+ required: true,
85
+ default: null
79
86
  },
80
- inheritAttrs: false,
81
- props: {
82
- label: {
83
- type: String,
84
- required: true,
85
- default: null
86
- },
87
- description: {
88
- type: String,
89
- required: false,
90
- default: null
91
- },
92
- type: {
93
- type: String as PropType<"text" | "password" | "number">,
94
- required: false,
95
- default: "text"
96
- },
97
- value: {
98
- type: String,
99
- required: false,
100
- default: null
101
- },
102
- color: {
103
- type: String as PropType<ColorBase>,
104
- required: false,
105
- default: ColorBase.Dark
106
- },
107
- required: {
108
- type: Boolean,
109
- required: false,
110
- default: false
111
- },
112
- rules: {
113
- type: Array as PropType<Function[]>,
114
- required: false,
115
- default: () => []
116
- },
117
- editable: {
118
- type: Boolean,
119
- required: false,
120
- default: true
121
- }
87
+ description: {
88
+ type: String,
89
+ required: false,
90
+ default: null
122
91
  },
123
- emits: ["update:value"],
124
- setup(props) {
125
- const { color, editable } = toRefs(props);
126
-
127
- const colors = useColors().getColors(color.value);
128
-
129
- const errors = useColors().getColors(ColorBase.Error);
130
- const lights = useColors().getColors(ColorBase.Light);
131
- const darks = useColors().getColors(ColorBase.Dark);
92
+ type: {
93
+ type: String as PropType<"text" | "password" | "number">,
94
+ required: false,
95
+ default: "text"
96
+ },
97
+ modelValue: {
98
+ type: String,
99
+ required: false,
100
+ default: null
101
+ },
102
+ color: {
103
+ type: String as PropType<ColorBase>,
104
+ required: false,
105
+ default: ColorBase.Dark
106
+ },
107
+ required: {
108
+ type: Boolean,
109
+ required: false,
110
+ default: false
111
+ },
112
+ rules: {
113
+ type: Array as PropType<Function[]>,
114
+ required: false,
115
+ default: () => []
116
+ },
117
+ editable: {
118
+ type: Boolean,
119
+ required: false,
120
+ default: true
121
+ }
122
+ },
123
+ emits: ["update:modelValue"],
124
+ setup(props) {
125
+ const { color, rules, editable } = toRefs(props);
126
+
127
+ const slots = { ...useSlots() };
128
+ delete slots.label;
129
+ delete slots.description;
132
130
 
133
- const style = computed((): {[code: string]: string} & Partial<CSSStyleDeclaration> => {
134
- if (!editable.value) {
135
- return {
136
- "--fs-text-field-cursor" : "default",
137
- "--fs-text-field-border-color" : lights.base,
138
- "--fs-text-field-color" : lights.dark,
139
- "--fs-text-field-active-border-color": lights.base
140
- };
141
- }
142
- return {
143
- "--fs-text-field-cursor" : "text",
144
- "--fs-text-field-border-color" : colors.base,
145
- "--fs-text-field-color" : darks.base,
146
- "--fs-text-field-active-border-color": colors.dark,
147
- "--fs-text-field-error-color" : errors.base,
148
- "--fs-text-field-error-border-color" : errors.base
149
- };
150
- });
131
+ const colors = useColors().getColors(color.value);
151
132
 
152
- const messages = computed(() => {
153
- const messages = [];
154
- for (const rule of props.rules) {
155
- const message = rule(props.value);
156
- if (typeof(message) === "string") {
157
- messages.push(message);
158
- }
159
- }
160
- return messages;
161
- });
133
+ const errors = useColors().getColors(ColorBase.Error);
134
+ const lights = useColors().getColors(ColorBase.Light);
135
+ const darks = useColors().getColors(ColorBase.Dark);
162
136
 
137
+ const style = computed((): {[code: string]: string} & Partial<CSSStyleDeclaration> => {
138
+ if (!editable.value) {
163
139
  return {
164
- messages,
165
- style
140
+ "--fs-text-field-cursor" : "default",
141
+ "--fs-text-field-border-color" : lights.base,
142
+ "--fs-text-field-color" : lights.dark,
143
+ "--fs-text-field-active-border-color": lights.base
166
144
  };
167
- }
145
+ }
146
+ return {
147
+ "--fs-text-field-cursor" : "text",
148
+ "--fs-text-field-border-color" : colors.base,
149
+ "--fs-text-field-color" : darks.base,
150
+ "--fs-text-field-active-border-color": colors.dark,
151
+ "--fs-text-field-error-color" : errors.base,
152
+ "--fs-text-field-error-border-color" : errors.base
153
+ };
154
+ });
155
+
156
+ const messages = computed((): string[] => {
157
+ const messages = [];
158
+ for (const rule of rules.value) {
159
+ const message = rule(props.modelValue ?? "");
160
+ if (typeof(message) === "string") {
161
+ messages.push(message);
162
+ }
163
+ }
164
+ return messages;
165
+ });
166
+
167
+ return {
168
+ messages,
169
+ slots,
170
+ style
171
+ };
172
+ }
168
173
  });
169
174
  </script>
@@ -1,2 +1,3 @@
1
+ export * from "./useBreakpoints";
1
2
  export * from "./useColors";
2
- export * from "./useTouch";
3
+ export * from "./useDates";
@@ -0,0 +1,14 @@
1
+ export const useBreakpoints = () => {
2
+ const isTouchScreenEnabled = (): boolean => {
3
+ return navigator.maxTouchPoints > 0;
4
+ };
5
+
6
+ const isMobileSized = (): boolean => {
7
+ return window.innerWidth < 1264;
8
+ };
9
+
10
+ return {
11
+ isTouchScreenEnabled,
12
+ isMobileSized
13
+ };
14
+ }
@@ -0,0 +1,39 @@
1
+ import { useTimeZone } from "@dative-gpi/foundation-shared-services/composables";
2
+
3
+ export const useDates = () => {
4
+ const { getMachineOffset, getMachineOffsetMillis, getUserOffset, getUserOffsetMillis } = useTimeZone();
5
+
6
+ const pickerToEpoch = (value: Date[]): number[] => {
7
+ // FSCalendar is always in machine time zone, so we need to convert it to user time zone
8
+ return value.slice()
9
+ .map(date => date.getTime() + getMachineOffsetMillis() - getUserOffsetMillis())
10
+ .sort();
11
+ };
12
+
13
+ const epochToPicker = (value: number[]): Date[] => {
14
+ // Epoch is always without time zone, so we need to convert it to user time zone
15
+ return value.slice()
16
+ .sort((a, b) => b - a)
17
+ .map(epoch => {
18
+ const date = new Date(0);
19
+ date.setUTCMilliseconds(epoch - getMachineOffsetMillis() + getUserOffsetMillis());
20
+ return date;
21
+ });
22
+ };
23
+
24
+ const epochToPickerHeader = (value: number): { d: number, m: number, y: number } => {
25
+ const date = new Date(0);
26
+ date.setUTCMilliseconds(value - getMachineOffsetMillis() + getUserOffsetMillis());
27
+ return { d: date.getDate(), m: date.getMonth(), y: date.getFullYear() };
28
+ };
29
+
30
+ return {
31
+ getUserOffset,
32
+ getUserOffsetMillis,
33
+ getMachineOffset,
34
+ getMachineOffsetMillis,
35
+ pickerToEpoch,
36
+ epochToPicker,
37
+ epochToPickerHeader
38
+ };
39
+ }
@@ -1,7 +1,7 @@
1
1
  export const TextRules = {
2
2
  required: (message: string) => (value: string) => !!value || (message ?? "Required"),
3
- minLength: (length: number, message: string) => (value: string) => value.length >= length || (message ?? `Must be at least ${length} characters`),
4
- maxLength: (length: number, message: string) => (value: string) => value.length <= length || (message ?? `Must be at most ${length} characters`),
3
+ min: (length: number, message: string) => (value: string) => value.length >= length || (message ?? `Must be at least ${length} characters`),
4
+ max: (length: number, message: string) => (value: string) => value.length <= length || (message ?? `Must be at most ${length} characters`),
5
5
  email: (message: string) => (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) || (message ?? "Must be a valid email"),
6
6
  digit: (message: string) => (value: string) => /(?=.*\d)/.test(value) || (message ?? "Must contain a digit"),
7
7
  uppercase: (message: string) => (value: string) => /(?=.*[A-Z])/.test(value) || (message ?? "Must contain an uppercase letter"),
@@ -9,9 +9,15 @@ export const TextRules = {
9
9
  special: (message: string) => (value: string) => /(?=.*[!@#$%^&*])/.test(value) || (message ?? "Must contain a special character")
10
10
  };
11
11
 
12
+ export const TagRules = {
13
+ required: (message: string) => (value: string[]) => value.length > 0 || (message ?? "Required"),
14
+ min: (min: number, message: string) => (value: string[]) => value.length >= min || (message ?? `Must contain at least ${min} elements`),
15
+ max: (max: number, message: string) => (value: string[]) => value.length <= max || (message ?? `Must contain at most ${max} elements`)
16
+ };
17
+
12
18
  export const NumberRules = {
13
- required: (message: string) => (value: number) => !!value || (message ?? "Required"),
14
- min: (min: number, message: string) => (value: number) => value >= min || (message ?? `Must be at least ${min}`),
15
- max: (max: number, message: string) => (value: number) => value <= max || (message ?? `Must be at most ${max}`),
16
- integer: (message: string) => (value: number) => Number.isInteger(value) || (message ?? "Must be an integer")
19
+ required: (message: string) => (value: string) => (!!value && !isNaN(parseFloat(value))) || (message ?? "Required"),
20
+ min: (min: number, message: string) => (value: string) => (!!value && !isNaN(parseFloat(value)) && parseFloat(value) >= min) || (message ?? `Must be at least ${min}`),
21
+ max: (max: number, message: string) => (value: string) => (!!value && !isNaN(parseFloat(value)) && parseFloat(value) <= max) || (message ?? `Must be at most ${max}`),
22
+ integer: (message: string) => (value: string) => (!!value && !isNaN(parseFloat(value)) && Number.isInteger(parseFloat(value))) || (message ?? "Must be an integer")
17
23
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dative-gpi/foundation-shared-components",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "description": "",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -9,10 +9,18 @@
9
9
  "author": "",
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
- "@dative-gpi/foundation-shared-domain": "0.0.7",
13
- "@dative-gpi/foundation-shared-services": "0.0.7",
12
+ "@dative-gpi/foundation-shared-domain": "0.0.8",
13
+ "@dative-gpi/foundation-shared-services": "0.0.8",
14
14
  "@fontsource/montserrat": "^5.0.16",
15
+ "@lexical/history": "^0.12.5",
16
+ "@lexical/link": "^0.12.5",
17
+ "@lexical/plain-text": "^0.12.5",
18
+ "@lexical/rich-text": "^0.12.5",
19
+ "@lexical/selection": "^0.12.5",
20
+ "@lexical/text": "^0.12.5",
21
+ "@lexical/utils": "^0.12.5",
15
22
  "color": "^4.2.3",
23
+ "lexical": "^0.12.5",
16
24
  "vue": "^3.2.0"
17
25
  },
18
26
  "devDependencies": {
@@ -20,5 +28,5 @@
20
28
  "sass": "^1.69.5",
21
29
  "sass-loader": "^13.3.2"
22
30
  },
23
- "gitHead": "970e56be5ba41712db154bd27ad98962dbeb802e"
31
+ "gitHead": "b3393ad0a66fda249e1b2d3582af86e961553453"
24
32
  }
@@ -37,19 +37,11 @@
37
37
  .fs-button-icon {
38
38
  transition: color 0.28s cubic-bezier(0.4, 0, 0.2, 1) !important;
39
39
  color: var(--fs-button-color) !important;
40
+ width: 20px !important;
41
+ height: 20px !important;
40
42
 
41
43
  &:not(.fs-button--disabled):hover {
42
44
  color: var(--fs-button-hover-color) !important;
43
45
  cursor: pointer !important;
44
46
  }
45
-
46
- @include web {
47
- width: 24px !important;
48
- height: 24px !important;
49
- }
50
-
51
- @include mobile {
52
- width: 18px !important;
53
- height: 18px !important;
54
- }
55
47
  }
@@ -0,0 +1,115 @@
1
+ .fs-calendar {
2
+ background-color: var(--fs-calendar-background-color) !important;
3
+ color: var(--fs-calendar-color) !important;
4
+
5
+ border: 1px solid var(--fs-calendar-border-color) !important;
6
+ border-radius: 4px !important;
7
+ padding: 8px !important;
8
+
9
+ & > .v-locale-provider > .v-date-picker-month {
10
+ padding: 0 !important;
11
+ }
12
+ }
13
+
14
+ .fs-calendar-header {
15
+ justify-content: space-between !important;
16
+ padding: 8px 0 !important;
17
+ }
18
+
19
+ .fs-calendar-text {
20
+ text-transform: capitalize !important;
21
+ }
22
+
23
+ .fs-calendar-divider {
24
+ border-bottom: 1px solid var(--fs-calendar-border-color) !important;
25
+ width: 100% !important;
26
+ }
27
+
28
+ .v-date-picker-month__day > button {
29
+ @extend .text-body;
30
+
31
+ border-radius: 4px !important;
32
+ height: 48px !important;
33
+ width: 48px !important;
34
+ }
35
+
36
+ .v-date-picker-month__days {
37
+ gap: 4px !important;
38
+ }
39
+
40
+ .v-date-picker-month__day:not(.v-date-picker-month__day--selected) > button {
41
+ background-color: var(--fs-calendar-background-color);
42
+ border-color: transparent;
43
+ border: none;
44
+
45
+ &.v-btn--variant-outlined {
46
+ border: 1px solid var(--fs-calendar-hover-border-color);
47
+ }
48
+ }
49
+
50
+ .v-date-picker-month__day:not(.v-date-picker-month__day--selected):hover > button {
51
+ background-color: var(--fs-calendar-hover-background-color);
52
+ border: 1px solid var(--fs-calendar-hover-border-color);
53
+ color: var(--fs-calendar-hover-color);
54
+ }
55
+
56
+ .v-date-picker-month__day--selected > button {
57
+ background-color: var(--fs-calendar-active-background-color) !important;
58
+ border: 1px solid var(--fs-calendar-active-border-color) !important;
59
+ color: var(--fs-calendar-active-color) !important;
60
+ }
61
+
62
+ .fs-calendar-full {
63
+ & .v-date-picker-month__day > button {
64
+ background-color: var(--fs-calendar-hover-background-color);
65
+ border: 1px solid var(--fs-calendar-hover-border-color);
66
+ color: var(--fs-calendar-hover-color);
67
+ }
68
+ }
69
+
70
+ .fs-calendar-start {
71
+ & .v-date-picker-month__day--selected ~ .v-date-picker-month__day > button {
72
+ background-color: var(--fs-calendar-hover-background-color);
73
+ border: 1px solid var(--fs-calendar-hover-border-color);
74
+ color: var(--fs-calendar-hover-color);
75
+ }
76
+ }
77
+
78
+ .fs-calendar-end {
79
+ & .v-date-picker-month__day > button {
80
+ background-color: var(--fs-calendar-hover-background-color);
81
+ border: 1px solid var(--fs-calendar-hover-border-color);
82
+ color: var(--fs-calendar-hover-color);
83
+ }
84
+
85
+ & .v-date-picker-month__day--selected ~ .v-date-picker-month__day > button {
86
+ background-color: var(--fs-calendar-background-color);
87
+ border-color: transparent;
88
+ border: none;
89
+ color: var(--fs-calendar-color);
90
+
91
+ &.v-btn--variant-outlined {
92
+ border: 1px solid var(--fs-calendar-hover-border-color);
93
+ }
94
+ }
95
+ }
96
+
97
+ .fs-calendar-part {
98
+ & .v-date-picker-month__day--selected ~ .v-date-picker-month__day--selected ~ .v-date-picker-month__day > button {
99
+ background-color: var(--fs-calendar-background-color);
100
+ border-color: transparent;
101
+ border: none;
102
+ color: var(--fs-calendar-color);
103
+
104
+ &.v-btn--variant-outlined {
105
+ border: 1px solid var(--fs-calendar-hover-border-color);
106
+ }
107
+ }
108
+
109
+ & .v-date-picker-month__day--selected ~ .v-date-picker-month__day > button,
110
+ .v-date-picker-month__day--selected ~ .v-date-picker-month__day--selected ~ .v-date-picker-month__day:hover > button {
111
+ background-color: var(--fs-calendar-hover-background-color);
112
+ border: 1px solid var(--fs-calendar-hover-border-color);
113
+ color: var(--fs-calendar-hover-color);
114
+ }
115
+ }
@@ -0,0 +1,7 @@
1
+ .fs-card {
2
+ padding: 8px;
3
+ display: flex;
4
+ border: 1px solid var(--fs-card-border-color);
5
+ border-radius: 4px;
6
+ background-color: var(--fs-card-background-color);
7
+ }
File without changes
@@ -3,15 +3,9 @@
3
3
  }
4
4
 
5
5
  .fs-icon-m {
6
- @include web {
7
- font-size: 20px !important;
8
- }
9
-
10
- @include mobile {
11
- font-size: 16px !important;
12
- }
6
+ font-size: 20px !important;
13
7
  }
14
8
 
15
- .fs-icon-checkbox {
16
- font-size: 20px !important;
9
+ .fs-icon-l {
10
+ font-size: 24px !important;
17
11
  }
@@ -0,0 +1,67 @@
1
+ .fs-rich-text-field {
2
+ width: 100%;
3
+ outline: none !important;
4
+ border: 1px solid var(--fs-rich-text-field-border-color) !important;
5
+ border-radius: 4px !important;
6
+
7
+ min-height: var(--fs-rich-text-field-min-height);
8
+ color: var(--fs-rich-text-field-color);
9
+ margin: 2px 2px 2px 0 !important;
10
+
11
+
12
+ &:focus-within {
13
+ border-color: var(--fs-rich-text-field-active-border-color) !important;
14
+ }
15
+
16
+ @include web {
17
+ padding: 10px 12px !important;
18
+ }
19
+
20
+ @include mobile {
21
+ padding: 6px 16px !important;
22
+ }
23
+
24
+ }
25
+
26
+ .fs-rich-text-field-undo {
27
+ transition: color 0.28s cubic-bezier(0.4, 0, 0.2, 1) !important;
28
+ cursor: var(--fs-rich-text-field-undo-cursor);
29
+ }
30
+
31
+ .fs-rich-text-field-icon {
32
+ transition: color 0.28s cubic-bezier(0.4, 0, 0.2, 1) !important;
33
+ cursor: var(--fs-rich-text-field-icon-cursor);
34
+ }
35
+
36
+ .fs-rich-text-field-label {
37
+ color: var(--fs-rich-text-field-color);
38
+ }
39
+
40
+ .fs-rich-text-field-description {
41
+ color: var(--fs-rich-text-field-color);
42
+ }
43
+
44
+ .editor-text-underline {
45
+ text-decoration: underline;
46
+ }
47
+
48
+ .editor-text-bold {
49
+ font-weight: bold;
50
+ }
51
+
52
+ .editor-text-italic {
53
+ font-style: italic;
54
+ }
55
+
56
+ .editor-text-strikethrough {
57
+ text-decoration: line-through;
58
+ }
59
+
60
+ .editor-text-underline-strikethrough {
61
+ text-decoration: underline line-through;
62
+ }
63
+
64
+ .editor-link {
65
+ color: var(--fs-rich-text-field-link-color);
66
+ text-decoration: underline;
67
+ }