@policystudio/policy-studio-ui-vue 1.0.20 → 1.0.21

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 (43) hide show
  1. package/.storybook/main.js +9 -1
  2. package/dist/css/psui_styles.css +14742 -14620
  3. package/package.json +4 -1
  4. package/postcss.config.js +2 -0
  5. package/src/assets/scss/base.scss +5 -4
  6. package/src/assets/scss/components/PsInput.scss +89 -0
  7. package/src/components/accordion/PsAccordion.vue +18 -22
  8. package/src/components/accordion/PsAccordionItem.vue +5 -5
  9. package/src/components/badges-and-tags/PsChartLegend.vue +128 -0
  10. package/src/components/badges-and-tags/PsClimateZoneBadge.vue +18 -0
  11. package/src/components/badges-and-tags/PsCostEffectBar.vue +114 -0
  12. package/src/components/badges-and-tags/PsHighlightRippleDot.vue +78 -0
  13. package/src/components/badges-and-tags/PsMiniTag.vue +46 -0
  14. package/src/components/badges-and-tags/PsProgressBar.vue +0 -0
  15. package/src/components/buttons/PsButton.vue +1 -1
  16. package/src/components/chips/PsChips.vue +10 -20
  17. package/src/components/controls/PsCheckbox.vue +29 -16
  18. package/src/components/controls/PsDraggable.vue +171 -25
  19. package/src/components/controls/PsRadioButton.vue +25 -19
  20. package/src/components/forms/PsInput.vue +122 -102
  21. package/src/components/notifications/PsDialog.vue +37 -18
  22. package/src/components/tooltip/PsRichTooltip.vue +6 -0
  23. package/src/components/tooltip/PsTooltip.vue +1 -3
  24. package/src/index.js +9 -9
  25. package/src/stories/Accordion.stories.js +28 -22
  26. package/src/stories/ChartLegend.stories.js +16 -0
  27. package/src/stories/Chips.stories.js +7 -1
  28. package/src/stories/ClimateZoneBadge.stories.js +24 -0
  29. package/src/stories/Colors.stories.mdx +1 -1
  30. package/src/stories/CostEffectBar.stories.js +23 -0
  31. package/src/stories/Dialog.stories.js +141 -8
  32. package/src/stories/Draggable.stories.js +4 -6
  33. package/src/stories/Dropdown.stories.js +3 -5
  34. package/src/stories/HighlightRippleDot.stories.js +16 -0
  35. package/src/stories/Input.stories.js +36 -5
  36. package/src/stories/MiniTag.stories.js +46 -0
  37. package/src/stories/ProgressBar.stories.js +23 -0
  38. package/src/stories/RadioButton.stories.js +2 -2
  39. package/src/stories/Toggle.stories.js +7 -8
  40. package/src/stories/Tooltip.stories.js +5 -4
  41. package/src/util/GeneralFunctions.js +6 -7
  42. package/src/util/imageLoader.js +1 -1
  43. package/tailwind.config.js +72 -50
@@ -1,5 +1,12 @@
1
1
  <template>
2
- <label class="container psui-pl-6" :class="[{ 'psui-text-gray-40': disabled }, { 'psui-text-gray-50': !disabled }, labelClasses]">
2
+ <label
3
+ class="container psui-pl-6"
4
+ :class="[
5
+ { 'psui-text-gray-40': disabled },
6
+ { 'psui-text-gray-50': !disabled },
7
+ labelClasses,
8
+ ]"
9
+ >
3
10
  {{ label }}
4
11
  <input
5
12
  type="checkbox"
@@ -7,7 +14,11 @@
7
14
  :disabled="disabled"
8
15
  :value="inputValue"
9
16
  />
10
- <span class="checkmark psui-border-2" :class="classes" :style="getSize"></span>
17
+ <span
18
+ class="checkmark psui-border-2"
19
+ :class="classes"
20
+ :style="getSize"
21
+ ></span>
11
22
  </label>
12
23
  </template>
13
24
 
@@ -18,26 +29,26 @@ export default {
18
29
  value: {
19
30
  required: true,
20
31
  },
21
- inputValue: String,
32
+ inputValue: String,
22
33
  label: {
23
34
  type: String,
24
- default: ''
35
+ default: '',
25
36
  },
26
37
  checkboxClasses: {
27
38
  type: String,
28
- default: ''
39
+ default: '',
29
40
  },
30
41
  labelClasses: {
31
42
  type: String,
32
- default: ''
43
+ default: '',
33
44
  },
34
45
  disabled: {
35
46
  type: Boolean,
36
- default: false
47
+ default: false,
37
48
  },
38
49
  size: {
39
- default: 18
40
- }
50
+ default: 18,
51
+ },
41
52
  },
42
53
  computed: {
43
54
  model: {
@@ -50,15 +61,17 @@ export default {
50
61
  },
51
62
  },
52
63
  classes() {
53
- return `${this.disabled ? 'psui-border-gray-40': 'psui-border-gray-50'} ${this.checkboxClasses}`
64
+ return `${
65
+ this.disabled ? 'psui-border-gray-40' : 'psui-border-gray-50'
66
+ } ${this.checkboxClasses}`
54
67
  },
55
68
  getSize() {
56
69
  return {
57
70
  width: `${this.size}px`,
58
- height: `${this.size}px`
71
+ height: `${this.size}px`,
59
72
  }
60
- }
61
- }
73
+ },
74
+ },
62
75
  }
63
76
  </script>
64
77
 
@@ -92,12 +105,12 @@ export default {
92
105
  }
93
106
 
94
107
  .container input:checked ~ .checkmark {
95
- background-color: #64B5CE;
108
+ background-color: #64b5ce;
96
109
  border: none;
97
110
  }
98
111
 
99
112
  .checkmark:after {
100
- content: "";
113
+ content: '';
101
114
  position: absolute;
102
115
  display: none;
103
116
  }
@@ -118,4 +131,4 @@ export default {
118
131
  -ms-transform: rotate(45deg);
119
132
  transform: rotate(45deg);
120
133
  }
121
- </style>
134
+ </style>
@@ -1,38 +1,184 @@
1
1
  <template>
2
- <div>
3
- <div>
4
- <div class="psui-bg-gray-20 psui-rounded-lg psui-mb-4">
5
- <div class="psui-flex psui-justify-between psui-items-center psui-p-2">
6
- <h2 class="psui-text-gray-80 psui-font-bold psui-leading-4">Cost Effectiveness</h2>
7
- <i class="material-icons-round psui-text-gray-40" >drag_indicator</i>
8
- </div>
9
- </div>
10
- <div>
11
- <div class="psui-flex psui-flex-col psui-bg-gray-20 psui-rounded-lg psui-mb-4">
12
- <div class="psui-flex psui-justify-between psui-items-center psui-p-2">
13
- <h2 class="psui-text-gray-80 psui-font-bold psui-leading-4">Per Home Results</h2>
14
- <i class="material-icons-round psui-text-gray-40">drag_indicator</i>
15
- </div>
16
- <slot>
17
- </slot>
18
- </div>
2
+ <div class="psui-w-full psui-my-4 psui-pr-4 psui-flex psui-flex-wrap psui-justify-start psui-mb-20">
3
+ <div class="psui-w-full psui-mb-4 psui-rounded-lg psui-bg-gray-30 psui-p-2"
4
+ v-for="(columnGroup, indexColumnGroup) in getColumns.columnGroups"
5
+ :key="indexColumnGroup"
6
+ :class="{ 'is-dragging-out' : indexColumnGroup == isDraggingOverGroup}"
7
+ >
8
+ <!-- COLUMN GROUP -->
9
+ <div
10
+ class="psui-w-full psui-flex psui-justify-between psui-mb-2 psui-rounded-sm psui-items-center psui-px-2 app-draggable-list-item"
11
+ draggable="true"
12
+ @dragstart="dragStartGroup({ indexColumnGroup })"
13
+ @dragover="dragOverGroup({ indexColumnGroup })"
14
+ @dragend="dragEndGroup"
15
+ >
16
+ <h2 class="psui-w-full psui-text-gray-80 psui-font-bold psui-pl-4 psui-py-2">{{columnGroup.title}}</h2>
17
+ <i class='material-icons-round psui-text-gray-40 psui-pr-1 psui-py-2'>drag_indicator</i>
18
+ </div>
19
+
20
+ <div class="psui-w-full psui-flex psui-flex-wrap">
21
+ <!-- COLUMNS -->
22
+ <div class="psui-w-full psui-mb-2 app-draggable-list-item"
23
+ v-for="(column, indexColumn) in columnGroup.columns"
24
+ :key="`edit-columns-column-${indexColumnGroup}-${indexColumn}`"
25
+ :id="`edit-columns-column-${indexColumnGroup}-${indexColumn}`"
26
+ >
27
+ <div class="psui-select-none psui-w-full psui-py-2 psui-px-3 psui-rounded-sm psui-flex psui-items-center psui-bg-white"
28
+ draggable="true"
29
+ @dragstart="dragStartColumn({ indexColumnGroup, indexColumn })"
30
+ @dragover="dragOverColumn({ indexColumnGroup, indexColumn })"
31
+ @dragend="dragEndColumn"
32
+ :class="{ 'is-dragging-out' : checkColumnIsDragOver({ indexColumnGroup, indexColumn }) }"
33
+ >
34
+ <PsCheckbox :inputValue='column' :label='column' @change="toggleColumnIsActive({ studyKey: getColumns.key, indexColumnGroup, indexColumn, columnGroupKey: columnGroup.key})">
35
+ </PsCheckbox>
36
+
37
+ <!-- <Checkbox
38
+ class="psui-whitespace-no-wrap"
39
+ :label="column.title"
40
+ :value="column.isActive"
41
+ @change="toggleColumnIsActive({ studyKey: getColumns.key, indexColumnGroup, indexColumn, columnGroupKey: columnGroup.key})"
42
+ ></Checkbox> -->
43
+ <div class="psui-w-full psui-flex psui-justify-end">
44
+ <i class='material-icons-round psui-text-gray-30'>drag_indicator</i>
19
45
  </div>
46
+ </div>
47
+ </div>
20
48
  </div>
49
+ </div>
21
50
  </div>
22
51
  </template>
23
52
 
24
53
  <script>
54
+ import PsCheckbox from './PsCheckbox.vue'
55
+
25
56
  export default {
26
- name: 'PsDraggable',
27
- props:{
28
- data: {
29
- type: Array,
30
- required: true,
31
- }
57
+ name: 'DragAndDropEditColumnsList',
58
+ components: { PsCheckbox},
59
+ props: ['getColumns', 'module'],
60
+ data() {
61
+ return {
62
+ // Column
63
+ isDraggingColumnGroup: -1,
64
+ isDraggingOverColumn: -1,
65
+ isDraggingColumn: -1,
66
+
67
+ // Group
68
+ isDraggingGroup: -1,
69
+ isDraggingOverGroup: -1,
70
+ }
71
+ },
72
+
73
+ computed: {
74
+ getColumnsStateKey() {
75
+ return `${this.module}Columns`
76
+ },
77
+ getMoveColumnStoreMutationName() {
78
+ return `${this.module}/moveColumnItem`
79
+ },
80
+ getMoveColumnGroupStoreMutationName() {
81
+ return `${this.module}/moveColumnGroup`
82
+ },
83
+ getToggleColumnIsActiveStoreMutationName() {
84
+ return `${this.module}/toggleColumnIsActive`
85
+ }
86
+
87
+ },
88
+
89
+ methods: {
90
+ toggleColumnIsActive({ studyKey, indexColumnGroup, indexColumn, columnGroupKey }) {
91
+ this.$store.commit(this.getToggleColumnIsActiveStoreMutationName, { columnsStateKey: this.getColumnsStateKey, studyKey, indexColumnGroup, indexColumn, columnGroupKey })
92
+ },
93
+
94
+ /**
95
+ * Drag and drop COLUMN
96
+ */
97
+ dragStartColumn({ indexColumnGroup, indexColumn }) {
98
+ this.isDraggingColumn = indexColumn
99
+ this.isDraggingColumnGroup = indexColumnGroup
100
+ },
101
+ dragEndColumn() {
102
+ this.moveItemColumn({
103
+ studyKey: this.getColumns.key,
104
+ indexColumnGroup: this.isDraggingColumnGroup,
105
+ from: this.isDraggingColumn,
106
+ to: this.isDraggingOverColumn
107
+ })
108
+ this.dragLeaveColumn()
109
+ this.dragLeaveGroup()
110
+ },
111
+ dragOverColumn({ indexColumnGroup, indexColumn }) {
112
+ if(this.isDraggingColumnGroup != indexColumnGroup) return
113
+ this.isDraggingOverColumn = indexColumn
114
+ },
115
+ checkColumnIsDragOver({indexColumnGroup, indexColumn }) {
116
+ return (this.isDraggingColumnGroup == indexColumnGroup && this.isDraggingOverColumn == indexColumn)
117
+ },
118
+ dragLeaveColumn() {
119
+ this.isDraggingColumn = -1
120
+ this.isDraggingColumnGroup = -1
121
+ this.isDraggingOverColumn = -1
122
+ },
123
+ moveItemColumn({ studyKey, indexColumnGroup, from, to}) {
124
+ this.$store.commit(this.getMoveColumnStoreMutationName, {
125
+ columnsStateKey: this.getColumnsStateKey,
126
+ studyKey,
127
+ indexColumnGroup,
128
+ from,
129
+ to
130
+ })
131
+ this.blinkColumns({ indexColumnGroup, to })
132
+ this.dragLeaveColumn()
133
+ },
134
+
135
+ blinkColumns({ indexColumnGroup, to }) {
136
+ const colToBlink = document.getElementById(`edit-columns-column-${indexColumnGroup}-${to}`)
137
+ if(colToBlink) {
138
+ colToBlink.classList.add('blink')
139
+ setTimeout(() => colToBlink.classList.remove('blink'), 800)
140
+ }
141
+ },
142
+
143
+ /**
144
+ * Drag and drop GROUP
145
+ */
146
+ dragStartGroup({ indexColumnGroup }) {
147
+ this.isDraggingGroup = indexColumnGroup
148
+ },
149
+ dragEndGroup() {
150
+ this.moveItemGroup({
151
+ studyKey: this.getColumns.key,
152
+ from: this.isDraggingGroup,
153
+ to: this.isDraggingOverGroup
154
+ })
155
+ this.dragLeaveGroup()
156
+ },
157
+ dragOverGroup({ indexColumnGroup }) {
158
+ if(this.isDraggingGroup < 0) return
159
+ this.isDraggingOverGroup = indexColumnGroup
160
+ },
161
+ dragLeaveGroup() {
162
+ this.isDraggingGroup = -1
163
+ this.isDraggingOverGroup = -1
164
+ },
165
+ moveItemGroup({ studyKey, from, to}) {
166
+ this.$store.commit(this.getMoveColumnGroupStoreMutationName, {
167
+ columnsStateKey: this.getColumnsStateKey,
168
+ studyKey,
169
+ from,to
170
+ })
32
171
  }
172
+
173
+ }
33
174
  }
34
175
  </script>
176
+ <style scoped>
177
+ .app-draggable-list-item {
178
+ cursor: grab;
179
+ }
35
180
 
36
- <style>
37
-
181
+ .app-draggable-list-item label {
182
+ margin-bottom: 0;
183
+ }
38
184
  </style>
@@ -1,9 +1,15 @@
1
1
  <template>
2
2
  <label class="wrapper flex items-center">
3
3
  {{ label }}
4
- <input class="checkbox" type="radio" :checked="isChecked" :value="value" @change="$emit('change', $event.target.value)" />
5
- <span class="checkmark" :class="{ 'checkmark-small' : small }"></span>
6
- </label>
4
+ <input
5
+ class="checkbox"
6
+ type="radio"
7
+ :checked="isChecked"
8
+ :value="value"
9
+ @change="$emit('change', $event.target.value)"
10
+ />
11
+ <span class="checkmark" :class="{ 'checkmark-small': small }"></span>
12
+ </label>
7
13
  </template>
8
14
 
9
15
  <script>
@@ -11,31 +17,31 @@ export default {
11
17
  name: 'PsRadioButton',
12
18
  props: {
13
19
  label: {
14
- type: String,
15
- default: "",
16
- required:true
20
+ type: String,
21
+ default: '',
22
+ required: true,
17
23
  },
18
24
  modelValue: {
19
- default: ""
25
+ default: '',
20
26
  },
21
27
  value: {
22
28
  type: String,
23
- default: undefined
29
+ default: undefined,
24
30
  },
25
31
  small: {
26
32
  type: Boolean,
27
- default: false
28
- }
33
+ default: false,
34
+ },
29
35
  },
30
36
  model: {
31
37
  prop: 'modelValue',
32
- event: 'change'
38
+ event: 'change',
33
39
  },
34
40
  computed: {
35
41
  isChecked() {
36
42
  return this.modelValue == this.value
37
- }
38
- }
43
+ },
44
+ },
39
45
  }
40
46
  </script>
41
47
 
@@ -65,7 +71,7 @@ export default {
65
71
  width: 24px;
66
72
  border-radius: 50%;
67
73
  background-color: white;
68
- border: 2px solid #A2ACB7;
74
+ border: 2px solid #a2acb7;
69
75
  }
70
76
  .checkmark-small {
71
77
  top: 3px;
@@ -74,11 +80,11 @@ export default {
74
80
  }
75
81
  .wrapper input:checked ~ .checkmark {
76
82
  background-color: white;
77
- border-color: #64B5CE;
83
+ border-color: #64b5ce;
78
84
  border-width: 2px;
79
85
  }
80
86
  .checkmark:after {
81
- content: "";
87
+ content: '';
82
88
  position: absolute;
83
89
  display: none;
84
90
  }
@@ -91,7 +97,7 @@ export default {
91
97
  width: 12px;
92
98
  height: 12px;
93
99
  border-radius: 50%;
94
- background: #64B5CE;
100
+ background: #64b5ce;
95
101
  }
96
102
  .wrapper .checkmark-small:after {
97
103
  top: 3px;
@@ -99,6 +105,6 @@ export default {
99
105
  width: 8px;
100
106
  height: 8px;
101
107
  border-radius: 50%;
102
- background: #64B5CE;
108
+ background: #64b5ce;
103
109
  }
104
- </style>
110
+ </style>
@@ -1,102 +1,122 @@
1
- <template>
2
- <div>
3
- <div v-if="label" class="psui-font-bold psui-text-gray-80">{{ label }}</div>
4
- <div class="psui-relative">
5
- <div class="psui-absolute psui-inset-y-0 psui-left-0 psui-pl-2 psui-flex psui-items-center psui-pointer-events-none" v-if="this.$slots.prepend">
6
- <slot name="prepend"></slot>
7
- </div>
8
- <input
9
- :type="type"
10
- :placeholder="placeholder"
11
- :disabled="disabled"
12
- :aria-required="required"
13
- :aria-invalid="validation.hasError"
14
- :class="[getInputClasses, { 'psui-border-red' : validation.hasError }]"
15
- :required="required"
16
- :value="value"
17
- @focus="$emit('focus', $event)"
18
- @blur="$emit('blur', $event)"
19
- @input="$emit('input', $event)"
20
- @keydown.enter="$emit('keydown', $event)"
21
- @change="$emit('change', $event)"
22
- v-bind="getAttrs"
23
- />
24
- <div class="psui-absolute psui-inset-y-0 psui-right-0 psui-pr-2 psui-flex psui-items-center" v-if="this.$slots.append">
25
- <slot name="append"></slot>
26
- </div>
27
- </div>
28
- <div v-if="hint && !validation.hasError" class="psui-text-gray-50 psui-text-xsmall">{{ hint }}</div>
29
- <div v-if="validation.hasError && validation.label" class="psui-text-red psui-text-xsmall">{{ validation.label }}</div>
30
- </div>
31
- </template>
32
-
33
- <script>
34
- export default {
35
- name: 'PsInput',
36
- props: {
37
- type: {
38
- type: String,
39
- default: 'text'
40
- },
41
- required: {
42
- type: Boolean
43
- },
44
- placeholder: {
45
- type: String
46
- },
47
- label: {
48
- type: String
49
- },
50
- hint: {
51
- type: String
52
- },
53
- disabled: {
54
- type: Boolean,
55
- default: false
56
- },
57
- mini: {
58
- type: Boolean,
59
- default: false
60
- },
61
- validation: {
62
- type: Object,
63
- default: () => {
64
- return { hasError: false, checked: false, filled: false, required: false }
65
- }
66
- },
67
- value: {
68
- required: true,
69
- },
70
- },
71
- computed: {
72
- getInputClasses() {
73
- return `${this.getPadding} ${this.getText} psui-text-gray-60 psui-w-full psui-border psui-border-gray-30 psui-rounded-md psui-block hover:psui-border-blue-50 focus:psui-border-blue-50 ${this.getState}`
74
- },
75
- getText() {
76
- return this.mini ? 'psui-text-small' : ''
77
- },
78
- getPadding() {
79
- return this.mini ? 'psui-px-2 mini-p' : 'psui-py-2 psui-px-4'
80
- },
81
- getState() {
82
- return this.disabled ? 'disabled:psui-bg-gray-20' : 'psui-bg-white'
83
- },
84
- getAttrs() {
85
- const defaultAttrs = {
86
- autocapitalize: 'sentences',
87
- autocomplete: 'chrome-off',
88
- autocorrect: 'off',
89
- spellcheck: 'spellcheck'
90
- }
91
- return { ...defaultAttrs, ...this.$attrs }
92
- }
93
- },
94
- }
95
- </script>
96
-
97
- <style>
98
- .mini-p {
99
- padding-top: 6px;
100
- padding-bottom: 6px;
101
- }
102
- </style>
1
+ <template>
2
+ <div class="psui-el-input" :class="[getComponentClass, `layout-${layout}`]" >
3
+
4
+ <label v-if="label"> {{ label }} </label>
5
+
6
+ <div
7
+ class="psui-el-input-wrapper"
8
+ @mouseenter="isHoveringInputWrapper = true"
9
+ @mouseleave="isHoveringInputWrapper = false"
10
+ :class="{ 'hover' : isHoveringInputWrapper }"
11
+ >
12
+
13
+ <div v-if="$slots.prepend" class="psui-el-input-prepend">
14
+ <slot name="prepend"></slot>
15
+ </div>
16
+
17
+ <input
18
+ :type="type"
19
+ :placeholder="placeholder"
20
+ :disabled="disabled"
21
+ :value="value"
22
+ @focus="onInputFocus"
23
+ @blur="onInputBlur"
24
+ @input="$emit('input', $event)"
25
+ @keydown="$emit('keydown', $event)"
26
+ @change="$emit('change', $event)"
27
+ v-bind="getAttrs"
28
+ :class="getInputClasses"
29
+ />
30
+
31
+ <div v-if="$slots.append || hasError" class="psui-el-input-append">
32
+ <span v-if="hasError" class="material-icons psui-text-red-20 material-icons-sharp">error</span>
33
+ <slot v-else name="append"></slot>
34
+ </div>
35
+
36
+ </div>
37
+
38
+ <p v-if="hint || (hasError && typeof hasError === 'string')" class="psui-el-input-hint">
39
+ {{ typeof hasError === 'string' ? hasError : hint }}
40
+ </p>
41
+
42
+ </div>
43
+ </template>
44
+
45
+ <script>
46
+ export default {
47
+ name: 'PsInput',
48
+ props: {
49
+ type: {
50
+ type: String,
51
+ default: 'text'
52
+ },
53
+ placeholder: {
54
+ type: String
55
+ },
56
+ label: {
57
+ type: String
58
+ },
59
+ hint: {
60
+ type: String
61
+ },
62
+ layout: {
63
+ type: String,
64
+ default: 'default',
65
+ validator: (value) => ['default', 'mini'].includes(value)
66
+ },
67
+ value: {
68
+ required: true,
69
+ },
70
+ disabled: {
71
+ type: Boolean,
72
+ default: false
73
+ },
74
+ hasError: {
75
+ type: [String, Boolean],
76
+ default: false
77
+ },
78
+ active: {
79
+ type: Boolean,
80
+ default: false
81
+ },
82
+ },
83
+ data: () => ({
84
+ isHoveringInputWrapper: false,
85
+ isFocus: false,
86
+ }),
87
+ computed: {
88
+ getAttrs() {
89
+ const defaultAttrs = {
90
+ autocapitalize: 'sentences',
91
+ autocomplete: 'chrome-off',
92
+ autocorrect: 'off',
93
+ spellcheck: 'spellcheck'
94
+ }
95
+ return { ...defaultAttrs, ...this.$attrs }
96
+ },
97
+ getComponentClass() {
98
+ if (this.disabled) {
99
+ return 'status-disabled'
100
+ } else if (this.hasError) {
101
+ return 'status-error'
102
+ } else if (this.isFocus || this.isTyping || this.active ) {
103
+ return 'status-active'
104
+ } else {
105
+ return 'status-resting'
106
+ }
107
+ },
108
+ },
109
+ methods: {
110
+ onInputFocus($event) {
111
+ this.isFocus = true
112
+ this.$emit('focus', $event)
113
+ },
114
+ onInputBlur($event) {
115
+ this.isFocus = false
116
+ this.$emit('blur', $event)
117
+ }
118
+ }
119
+ }
120
+ </script>
121
+
122
+ <style> /* Please, use the file src/assets/scss/components/PsInput.scss */</style>