@policystudio/policy-studio-ui-vue 1.1.90-beta.4 → 1.1.90-beta.41

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 (158) hide show
  1. package/.eslintrc.js +2 -8
  2. package/.github/workflows/deploy-storybook.yml +4 -4
  3. package/.nvmrc +1 -0
  4. package/dist/css/psui_styles_output.css +6607 -0
  5. package/dist/index.d.ts +51 -0
  6. package/dist/index.js +106 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/util/GeneralFunctions.d.ts +3 -0
  9. package/dist/util/GeneralFunctions.js +35 -0
  10. package/dist/util/GeneralFunctions.js.map +1 -0
  11. package/dist/util/directives.d.ts +1 -0
  12. package/dist/util/directives.js +22 -0
  13. package/dist/util/directives.js.map +1 -0
  14. package/dist/util/imageLoader.d.ts +6 -0
  15. package/dist/util/imageLoader.js +52 -0
  16. package/dist/util/imageLoader.js.map +1 -0
  17. package/doc/.nvmrc +1 -0
  18. package/{.storybook → doc/.storybook}/main.ts +8 -2
  19. package/{.storybook → doc/.storybook}/preview.ts +2 -3
  20. package/doc/package-lock.json +22653 -0
  21. package/doc/package.json +71 -0
  22. package/{src → doc}/shims-vue.d.ts +0 -5
  23. package/{src → doc/src}/stories/Accordion.stories.ts +2 -3
  24. package/{src → doc/src}/stories/BadgeWithIcon.stories.ts +1 -1
  25. package/{src → doc/src}/stories/BarChart.stories.ts +1 -1
  26. package/{src → doc/src}/stories/Breadcrumb.stories.ts +1 -1
  27. package/doc/src/stories/Button.stories.ts +130 -0
  28. package/{src → doc/src}/stories/CardInfos.stories.ts +1 -1
  29. package/{src → doc/src}/stories/ChartLegend.stories.ts +1 -1
  30. package/{src → doc/src}/stories/Checkbox.stories.ts +1 -1
  31. package/{src → doc/src}/stories/CheckboxSimple.stories.ts +1 -1
  32. package/{src → doc/src}/stories/Chips.stories.ts +1 -4
  33. package/{src → doc/src}/stories/ClimateZoneBadge.stories.ts +2 -1
  34. package/doc/src/stories/Collapse.stories.ts +46 -0
  35. package/{src → doc/src}/stories/CostEffectBar.stories.ts +2 -1
  36. package/{src → doc/src}/stories/Datatable.stories.ts +5 -2
  37. package/{src → doc/src}/stories/DateCardInfo.stories.ts +1 -1
  38. package/{src → doc/src}/stories/Dialog.stories.ts +2 -2
  39. package/{src → doc/src}/stories/Draggable.stories.ts +3 -2
  40. package/{src → doc/src}/stories/Dropdown.stories.ts +4 -3
  41. package/{src → doc/src}/stories/DropdownList.stories.ts +4 -2
  42. package/{src → doc/src}/stories/HighlightRippleDot.stories.ts +3 -2
  43. package/{src → doc/src}/stories/Icon.stories.ts +3 -1
  44. package/{src → doc/src}/stories/InlineSelector.stories.ts +1 -1
  45. package/{src → doc/src}/stories/Input.stories.ts +7 -4
  46. package/{src → doc/src}/stories/InputSelect.stories.ts +3 -2
  47. package/{src → doc/src}/stories/InputTextArea.stories.ts +1 -1
  48. package/{src → doc/src}/stories/MiniTag.stories.ts +9 -2
  49. package/{src → doc/src}/stories/ProgressBar.stories.ts +3 -2
  50. package/{src → doc/src}/stories/RadioButton.stories.ts +2 -2
  51. package/{src → doc/src}/stories/RadioButtonSimple.stories.ts +1 -1
  52. package/{src → doc/src}/stories/SimpleAlert.stories.ts +3 -2
  53. package/{src → doc/src}/stories/Slider.stories.ts +6 -2
  54. package/{src → doc/src}/stories/Switch.stories.ts +2 -2
  55. package/{src → doc/src}/stories/TabHeader.stories.ts +6 -1
  56. package/{src → doc/src}/stories/TableResults.stories.ts +11 -7
  57. package/{src → doc/src}/stories/TagScope.stories.ts +3 -2
  58. package/{src → doc/src}/stories/TestimonialCard.stories.ts +3 -3
  59. package/{src → doc/src}/stories/Toast.stories.ts +2 -2
  60. package/{src → doc/src}/stories/Toggle.stories.ts +6 -3
  61. package/{src → doc/src}/stories/Tooltip.stories.ts +3 -3
  62. package/doc/tsconfig.json +17 -0
  63. package/package.json +13 -28
  64. package/scripts/gulp.js +11 -0
  65. package/src/assets/scss/base.scss +3 -34
  66. package/src/assets/scss/components/PsAccordion.scss +1 -1
  67. package/src/assets/scss/components/PsCollapse.scss +74 -0
  68. package/src/assets/scss/components/PsDataTable.scss +1 -1
  69. package/src/assets/scss/components/PsDropdownList.scss +1 -1
  70. package/src/assets/scss/components/PsTooltip.scss +2 -1
  71. package/src/components/accordion/PsAccordionItem.vue +88 -74
  72. package/src/components/badges-and-tags/PsBadgeWithIcon.vue +31 -34
  73. package/src/components/badges-and-tags/PsCardInfos.vue +39 -41
  74. package/src/components/badges-and-tags/PsChartLegend.vue +46 -51
  75. package/src/components/badges-and-tags/PsClimateZoneBadge.vue +13 -19
  76. package/src/components/badges-and-tags/PsCostEffectBar.vue +24 -56
  77. package/src/components/badges-and-tags/PsDateCardInfo.vue +17 -18
  78. package/src/components/badges-and-tags/PsHighlightRippleDot.vue +3 -2
  79. package/src/components/badges-and-tags/PsMiniTag.vue +39 -41
  80. package/src/components/badges-and-tags/PsProgressBar.vue +72 -68
  81. package/src/components/badges-and-tags/PsTagScope.vue +17 -22
  82. package/src/components/badges-and-tags/PsTestimonialCard.vue +19 -26
  83. package/src/components/buttons/PsButton.vue +61 -62
  84. package/src/components/chips/PsChips.vue +98 -101
  85. package/src/components/collapse/PsCollapse.vue +124 -0
  86. package/src/components/controls/PsCheckbox.vue +84 -84
  87. package/src/components/controls/PsCheckboxSimple.vue +95 -95
  88. package/src/components/controls/PsDraggable.vue +53 -55
  89. package/src/components/controls/PsInlineSelector.vue +98 -99
  90. package/src/components/controls/PsRadioButton.vue +65 -58
  91. package/src/components/controls/PsRadioButtonSimple.vue +79 -75
  92. package/src/components/controls/PsSlider.vue +185 -176
  93. package/src/components/controls/PsSwitch.vue +51 -52
  94. package/src/components/controls/PsToggle.vue +52 -50
  95. package/src/components/data-graphics/PsBarChart.vue +18 -21
  96. package/src/components/datatable/PsDataTable.vue +56 -60
  97. package/src/components/datatable/PsDataTableItem.vue +13 -28
  98. package/src/components/forms/PsDropdown.vue +166 -162
  99. package/src/components/forms/PsDropdownList.vue +133 -130
  100. package/src/components/forms/PsInput.vue +154 -153
  101. package/src/components/forms/PsInputSelect.vue +91 -92
  102. package/src/components/forms/PsInputTextArea.vue +70 -71
  103. package/src/components/navigations/PsBreadcrumb.vue +25 -34
  104. package/src/components/notifications/PsDialog.vue +57 -56
  105. package/src/components/notifications/PsSimpleAlert.vue +27 -29
  106. package/src/components/notifications/PsToast.vue +40 -39
  107. package/src/components/table-results/PsTableResults.vue +461 -468
  108. package/src/components/table-results/PsTableResultsBody.vue +66 -67
  109. package/src/components/table-results/PsTableResultsHead.vue +67 -61
  110. package/src/components/table-results/PsTableResultsHeadComparison.vue +62 -56
  111. package/src/components/table-results/PsTableResultsHeadFlexible.vue +68 -61
  112. package/src/components/table-results/PsTableResultsRow.vue +55 -56
  113. package/src/components/tabs/PsTabHeader.vue +106 -100
  114. package/src/components/tooltip/PsDialogTooltip.vue +96 -101
  115. package/src/components/tooltip/PsRichTooltip.vue +41 -45
  116. package/src/components/tooltip/PsTooltip.vue +111 -116
  117. package/src/components/ui/PsDotLoader.vue +1 -5
  118. package/src/components/ui/PsIcon.vue +128 -129
  119. package/src/index.ts +60 -67
  120. package/src/tsconfig.json +12 -0
  121. package/src/types/index.d.ts +6 -0
  122. package/src/util/{GeneralFunctions.ts → GeneralFunctions.js} +12 -3
  123. package/src/util/directives.ts +24 -0
  124. package/src/util/{imageLoader.ts → imageLoader.js} +7 -0
  125. package/tailwind.config.js +1 -1
  126. package/tsconfig.json +18 -13
  127. package/.storybook/eventBus.ts +0 -26
  128. package/babel.config.js +0 -17
  129. package/dist/css/psui_styles.css +0 -4647
  130. package/postcss.config.js +0 -8
  131. package/src/components/playground/PsScrollBar.vue +0 -320
  132. package/src/stories/Button.stories.ts +0 -48
  133. package/src/stories/Button.vue +0 -59
  134. package/src/stories/Header.stories.ts +0 -41
  135. package/src/stories/Header.vue +0 -77
  136. package/src/stories/Playground.stories.ts +0 -16
  137. package/src/stories/button.css +0 -30
  138. package/src/stories/header.css +0 -32
  139. package/webpack.config.js +0 -22
  140. /package/{.storybook → doc/.storybook}/PolicyStudio.ts +0 -0
  141. /package/{.storybook → doc/.storybook}/manager.ts +0 -0
  142. /package/{src → doc/src}/assets/images/multifamily-units.svg +0 -0
  143. /package/{src → doc/src}/assets/images/policy-studio.svg +0 -0
  144. /package/{src → doc/src}/contents/ComparisonData.ts +0 -0
  145. /package/{src → doc/src}/contents/FlexibleData.ts +0 -0
  146. /package/{src → doc/src}/contents/ResultsData.ts +0 -0
  147. /package/{src → doc/src}/stories/Colors.mdx +0 -0
  148. /package/{src → doc/src}/stories/ElevationSystem.mdx +0 -0
  149. /package/{src → doc/src}/stories/Introduction.mdx +0 -0
  150. /package/{src → doc/src}/stories/Typography.mdx +0 -0
  151. /package/{src → doc/src}/stories/assets/code-brackets.svg +0 -0
  152. /package/{src → doc/src}/stories/assets/colors.svg +0 -0
  153. /package/{src → doc/src}/stories/assets/comments.svg +0 -0
  154. /package/{src → doc/src}/stories/assets/direction.svg +0 -0
  155. /package/{src → doc/src}/stories/assets/flow.svg +0 -0
  156. /package/{src → doc/src}/stories/assets/plugin.svg +0 -0
  157. /package/{src → doc/src}/stories/assets/repo.svg +0 -0
  158. /package/{src → doc/src}/stories/assets/stackalt.svg +0 -0
@@ -1,23 +1,21 @@
1
1
  <template>
2
- <div
3
- ref="tooltip"
2
+ <div
3
+ ref="PsTooltip"
4
4
  class="psui-el-tooltip"
5
- @mouseenter="open"
6
- @mouseleave="close"
5
+ @mouseenter="open"
6
+ @mouseleave="close"
7
7
  >
8
8
  <div
9
- ref="tooltiptrigger"
9
+ ref="PsTooltipTrigger"
10
10
  class="psui-el-tooltip-trigger"
11
11
  >
12
12
  <slot name="trigger" />
13
13
  </div>
14
14
 
15
- <div
16
- class="psui-el-tooltip-wrapper"
17
- >
15
+ <div class="psui-el-tooltip-wrapper">
18
16
  <div
19
17
  role="menu"
20
- ref="dialog"
18
+ ref="PsTooltipDialog"
21
19
  class="psui-el-tooltip-dialog"
22
20
  :class="cssClass"
23
21
  >
@@ -41,125 +39,122 @@
41
39
  </div>
42
40
  </template>
43
41
 
44
- <script>
45
- export default {
46
- name: 'PsTooltip',
47
- props: {
48
- /**
49
- * It sets the title of the tooltip if needed.
50
- */
51
- title: {
52
- type: String,
53
- },
54
- /**
55
- * It disables the dialog section.
56
- */
57
- ignoreDialog: {
58
- type: Boolean,
59
- default: false,
60
- },
61
- /**
62
- * It sets the layout of the tooltip if needed. Usefull when using rich or dialog tooltip.
63
- */
64
- layout: {
65
- type: String,
66
- },
67
- /**
68
- * It sets a additional styling if needed.
69
- */
70
- cssClass: {
71
- type: String,
72
- },
73
- /**
74
- * It sets the vertical position.
75
- */
76
- position: {
77
- type: String,
78
- default: 'bottom',
79
- validator: (value)=> ['bottom','top', 'custom'].includes(value)
80
- },
81
- /**
82
- * It sets the custom positions.
83
- */
84
- customPosition: {
85
- type: String,
86
- default: '',
87
- }
42
+ <script setup>
43
+ import { ref, computed, onMounted, onBeforeUnmount } from 'vue'
44
+
45
+ const props = defineProps({
46
+ /**
47
+ * It sets the title of the tooltip if needed.
48
+ */
49
+ title: {
50
+ type: String,
51
+ default: '',
88
52
  },
89
- inheritAttrs: true,
90
- emits: ['show'],
91
- data() {
92
- return {
93
- show: false,
94
- closingTimeout: null,
95
- }
53
+ /**
54
+ * It disables the dialog section.
55
+ */
56
+ ignoreDialog: {
57
+ type: Boolean,
58
+ default: false,
96
59
  },
97
- computed:{
98
- getComponentClass(){
99
- return `layout-${this.layout}`
100
- },
60
+ /**
61
+ * It sets the layout of the tooltip if needed. Usefull when using rich or dialog tooltip.
62
+ */
63
+ layout: {
64
+ type: String,
65
+ default: '',
101
66
  },
102
- mounted() {
103
- document.addEventListener('resize', this.updatePosition)
67
+ /**
68
+ * It sets a additional styling if needed.
69
+ */
70
+ cssClass: {
71
+ type: String,
72
+ default: '',
104
73
  },
105
- beforeUnmount() {
106
- document.removeEventListener('resize', this.updatePosition)
74
+ /**
75
+ * It sets the vertical position.
76
+ */
77
+ position: {
78
+ type: String,
79
+ default: 'bottom',
80
+ validator: (value) => ['bottom', 'top', 'custom'].includes(value),
107
81
  },
108
- methods: {
109
- open() {
110
- if (this.show || this.ignoreDialog) return
111
- this.$emit('show')
112
- this.show = true
113
-
114
- this.$refs.dialog.style.display = 'block'
115
- this.$refs.dialog.style.opacity = 0
82
+ /**
83
+ * It sets the custom positions.
84
+ */
85
+ customPosition: {
86
+ type: String,
87
+ default: '',
88
+ },
89
+ })
116
90
 
117
- setTimeout(() => {
118
- this.updatePosition()
119
- }, 10)
120
- },
121
- close() {
122
- if (this.show && this.$refs.dialog) {
123
- this.$emit('close')
124
- this.show = false
91
+ const emit = defineEmits(['show', 'close'])
125
92
 
126
- this.$refs.dialog.style.display = 'none'
127
- }
128
- },
129
- updatePosition() {
130
- const dialog = this.$refs.dialog
131
- const trigger = this.$refs.tooltiptrigger
93
+ const show = ref(false)
94
+ // const closingTimeout = ref(null)
95
+ const PsTooltip = ref(null)
96
+ const PsTooltipTrigger = ref(null)
97
+ const PsTooltipDialog = ref(null)
132
98
 
133
- const rectDialog = dialog.getBoundingClientRect()
134
- const rectTrigger = trigger.getBoundingClientRect()
135
- const windowWidth = document.documentElement.clientWidth
99
+ const getComponentClass = computed(() => {
100
+ return `layout-${props.layout}`
101
+ })
136
102
 
137
- dialog.style.top = `${rectTrigger.y + rectTrigger.height + 8}px`
103
+ onMounted(() => {
104
+ document.addEventListener('resize', updatePosition)
105
+ })
138
106
 
139
- if (rectTrigger.x + rectDialog.width + 20 > windowWidth) {
140
- dialog.style.left = `${windowWidth - rectDialog.width - 30}px`
141
- } else if ((rectTrigger.x - rectDialog.width) < 0) {
142
- dialog.style.left = `${rectTrigger.x + 10}px`
143
- } else if (rectDialog.width >= rectTrigger.width && this.position != 'custom') {
144
- dialog.style.left = `${rectTrigger.x - ((rectDialog.width - rectTrigger.width)/2)}px`
145
- } else {
146
- dialog.style.left = `${rectTrigger.x + ((rectTrigger.width - rectDialog.width)/2)}px`
147
- }
107
+ onBeforeUnmount(() => {
108
+ document.removeEventListener('resize', updatePosition)
109
+ })
148
110
 
149
- if(this.position == 'top') {
150
- dialog.style.top = `${rectTrigger.y - rectDialog.height - 10}px`
151
- }
111
+ const open = () => {
112
+ if (show.value || props.ignoreDialog) return
113
+ emit('show')
114
+ show.value = true
115
+ const dialog = PsTooltipDialog.value
116
+ dialog.style.display = 'block'
117
+ dialog.style.opacity = 0
118
+ setTimeout(() => {
119
+ updatePosition()
120
+ }, 10)
121
+ }
152
122
 
153
- if(this.position == 'custom') {
154
- dialog.style = this.customPosition
155
- dialog.style.display = 'block'
156
- dialog.style.position = 'absolute'
157
- }
123
+ const close = () => {
124
+ const dialog = PsTooltipDialog.value
125
+ if (show.value && dialog) {
126
+ emit('close')
127
+ show.value = false
128
+ dialog.style.display = 'none'
129
+ }
130
+ }
158
131
 
159
- setTimeout(() => {
160
- dialog.style.opacity = 100
161
- }, 100)
162
- },
163
- },
132
+ const updatePosition = () => {
133
+ const dialog = PsTooltipDialog.value
134
+ const trigger = PsTooltipTrigger.value
135
+ const rectDialog = dialog?.getBoundingClientRect()
136
+ const rectTrigger = trigger?.getBoundingClientRect()
137
+ const windowWidth = document.documentElement.clientWidth
138
+ if(dialog) dialog.style.top = `${rectTrigger.y + rectTrigger.height + 8}px`
139
+ if (rectTrigger && rectTrigger.x + rectDialog.width + 20 > windowWidth) {
140
+ dialog.style.left = `${windowWidth - rectDialog.width - 30}px`
141
+ } else if (rectTrigger && rectTrigger.x - rectDialog.width < 0) {
142
+ dialog.style.left = `${rectTrigger.x + 10}px`
143
+ } else if (rectTrigger && rectDialog.width >= rectTrigger.width && props.position != 'custom') {
144
+ dialog.style.left = `${rectTrigger.x - (rectDialog.width - rectTrigger.width) / 2}px`
145
+ } else if(dialog) {
146
+ dialog.style.left = `${rectTrigger.x + (rectTrigger.width - rectDialog.width) / 2}px`
147
+ }
148
+ if (props.position == 'top') {
149
+ dialog.style.top = `${rectTrigger.y - rectDialog.height - 10}px`
150
+ }
151
+ if (props.position == 'custom') {
152
+ dialog.style = props.customPosition
153
+ dialog.style.display = 'block'
154
+ dialog.style.position = 'absolute'
155
+ }
156
+ setTimeout(() => {
157
+ if(dialog) dialog.style.opacity = 100
158
+ }, 100)
164
159
  }
165
160
  </script>
@@ -8,8 +8,4 @@
8
8
  </div>
9
9
  </template>
10
10
 
11
- <script>
12
- export default {
13
- name: 'PsDotLoader',
14
- }
15
- </script>
11
+ <script setup></script>
@@ -1,10 +1,13 @@
1
1
  <template>
2
- <div :style="{display: display}">
2
+ <div
3
+ :style="{ display: display }"
4
+ @click="emit('click', $event)"
5
+ >
3
6
  <span
4
7
  v-if="getIconType === 'material-icons'"
5
8
  class="material-icons-round"
6
9
  :class="[getIconClasses]"
7
- :style="{ fontSize: `${size}px`}"
10
+ :style="{ fontSize: `${size}px` }"
8
11
  >
9
12
  {{ getIcon }}
10
13
  </span>
@@ -24,140 +27,136 @@
24
27
  </div>
25
28
  </template>
26
29
 
27
- <script>
28
- import tailwindConfig from '../../../tailwind.config'
29
- import imageLoader from '../../util/imageLoader'
30
- export default {
31
- name: 'AppIcon',
32
- props: {
33
- /**
34
- * It sets the text key to get the svg icon in Google Fonts. Make sure to get the correct description of your icon on https://fonts.google.com/.
35
- */
36
- icon: {
37
- type: String,
38
- default: 'more_horiz'
39
- },
40
-
41
- /**
42
- * It sets the type of the icon.
43
- */
44
- type: {
45
- type: String,
46
- },
47
-
48
- /**
49
- * It sets the style of the icon.
50
- */
51
- iconClasses: {
52
- type: String,
53
- default: null
54
- },
55
-
56
- /**
57
- * It sets the size of the icon.
58
- */
59
- size: {
60
- type: [Number, String],
61
- default: 24
62
- },
63
-
64
- /**
65
- * It sets fill property of the icon.
66
- */
67
- stroke: {
68
- type: String,
69
- default: null
70
- },
71
-
72
- /**
73
- * It sets fill property display of the icon.
74
- */
75
- display: {
76
- type: String,
77
- default: 'contents'
78
- },
30
+ <script setup>
31
+ import tailwindConfig from '../../../tailwind.config.js'
32
+ import imageLoader from '../../util/imageLoader.js'
79
33
 
80
- /**
81
- * It sets the color of the icon.
82
- */
83
- color: {
84
- type: String,
85
- default: null,
86
- validator: value => {
87
- return value?.includes('psui-text-') &&
88
- typeof(tailwindConfig.theme.colors[value.replace('psui-text-', '')]) != 'undefined' ||
89
- typeof(tailwindConfig.theme.colors[value]) != 'undefined'
90
- }
91
- },
34
+ import { ref, computed, watch, onMounted } from 'vue'
92
35
 
93
- /**
94
- * It set a animation icon if needed.
95
- */
96
- loaderIcon: {
97
- type: String,
98
- default: 'hourglass_top'
99
- },
100
-
101
- /**
102
- * It sets a error when the icon is not available.
103
- */
104
- loaderErrorIcon: {
105
- type: String,
106
- default: 'more_horiz'
107
- }
36
+ const props = defineProps({
37
+ /**
38
+ * It sets the text key to get the svg icon in Google Fonts. Make sure to get the correct description of your icon on https://fonts.google.com/.
39
+ */
40
+ icon: {
41
+ type: String,
42
+ default: 'more_horiz',
108
43
  },
109
- data() {
110
- return {
111
- finishedImageLoad: false,
112
- imageLoadError: false
113
- }
44
+ /**
45
+ * It sets the type of the icon.
46
+ */
47
+ type: {
48
+ type: String,
49
+ default: '',
114
50
  },
115
- computed: {
116
- getIconType() {
117
- if(this.imageLoadError || !this.finishedImageLoad) return 'material-icons'
118
- if(this.type) return this.type
119
- if(!this.icon?.includes('/')) return 'material-icons'
120
- if(!this.icon?.includes('.svg')) return 'url'
121
- return 'svg'
122
- },
123
- getIcon() {
124
- if(!this.icon?.includes('/')) return this.icon ? this.icon : this.loaderErrorIcon
125
- if(!this.finishedImageLoad && !this.imageLoadError && this.loaderIcon) return this.loaderIcon
126
- if(this.imageLoadError) return this.loaderErrorIcon
127
- return this.icon ? this.icon : this.loaderErrorIcon
128
- },
129
- getIconClasses() {
130
- if(this.iconClasses) return this.iconClasses
131
- return `${this.color}`
132
- },
133
- getHeight() {
134
- return this.height
51
+ /**
52
+ * It sets the style of the icon.
53
+ */
54
+ iconClasses: {
55
+ type: String,
56
+ default: null,
57
+ },
58
+ /**
59
+ * It sets the size of the icon.
60
+ */
61
+ size: {
62
+ type: [Number, String],
63
+ default: 24,
64
+ },
65
+ /**
66
+ * It sets fill property of the icon.
67
+ */
68
+ stroke: {
69
+ type: String,
70
+ default: null,
71
+ },
72
+ /**
73
+ * It sets fill property display of the icon.
74
+ */
75
+ display: {
76
+ type: String,
77
+ default: 'contents',
78
+ },
79
+ /**
80
+ * It sets the color of the icon.
81
+ */
82
+ color: {
83
+ type: String,
84
+ default: null,
85
+ validator: (value) => {
86
+ return (
87
+ (value?.includes('psui-text-') && typeof tailwindConfig.theme.colors[value.replace('psui-text-', '')] != 'undefined') ||
88
+ typeof tailwindConfig.theme.colors[value] != 'undefined'
89
+ )
135
90
  },
136
- getColor() {
137
- if(this.getIconType === 'material-icons') return this.color
138
- return tailwindConfig.theme.colors[this.color.replace('psui-text-', '')] || tailwindConfig.theme.colors[this.color]
139
- }
140
91
  },
141
- watch: {
142
- 'icon': function() {
143
- this.loadImage()
144
- }
92
+ /**
93
+ * It set a animation icon if needed.
94
+ */
95
+ loaderIcon: {
96
+ type: String,
97
+ default: 'hourglass_top',
145
98
  },
146
- mounted() {
147
- if(this.icon?.includes('/')) this.loadImage()
99
+
100
+ /**
101
+ * It sets a error when the icon is not available.
102
+ */
103
+ loaderErrorIcon: {
104
+ type: String,
105
+ default: 'more_horiz',
148
106
  },
149
- methods: {
150
- loadImage() {
151
- this.finishedImageLoad = false
152
- this.imageLoadError = false
153
- imageLoader({ imageUrl: this.icon, returnsBase64: false })
154
- .then(() => {
155
- this.finishedImageLoad = true
156
- })
157
- .catch(() => {
158
- this.imageLoadError = true
159
- })
160
- }
107
+ })
108
+
109
+ const finishedImageLoad = ref(false)
110
+ const imageLoadError = ref(false)
111
+
112
+ const emit = defineEmits(['click'])
113
+
114
+ const getIconType = computed(() => {
115
+ if (props.type) return props.type
116
+ if (!props.icon?.includes('/')) return 'material-icons'
117
+ if (!props.icon?.includes('.svg')) return 'url'
118
+ return 'svg'
119
+ })
120
+
121
+ const getIcon = computed(() => {
122
+ if (!props.icon?.includes('/')) return props.icon ? props.icon : props.loaderErrorIcon
123
+ if (!finishedImageLoad.value && !imageLoadError.value && props.loaderIcon) return props.loaderIcon
124
+ if (imageLoadError.value) return props.loaderErrorIcon
125
+ return props.icon ? props.icon : props.loaderErrorIcon
126
+ })
127
+
128
+ const getIconClasses = computed(() => {
129
+ if (props.iconClasses) return props.iconClasses
130
+ return props.color ? `${props.color}` : ''
131
+ })
132
+
133
+ const getColor = computed(() => {
134
+ if (getIconType.value === 'material-icons') return props.color
135
+ return tailwindConfig.theme.colors[props.color.replace('psui-text-', '')] || tailwindConfig.theme.colors[props.color]
136
+ })
137
+
138
+ watch(
139
+ () => props.icon,
140
+ () => {
141
+ loadImage()
142
+ }
143
+ )
144
+
145
+ onMounted(() => {
146
+ if (props.icon?.includes('/')) loadImage()
147
+ })
148
+
149
+ const loadImage = () => {
150
+ if(getIconType.value != 'material-icons') {
151
+ finishedImageLoad.value = false
152
+ imageLoadError.value = false
153
+ imageLoader({ imageUrl: props.icon, returnsBase64: false })
154
+ .then(() => {
155
+ finishedImageLoad.value = true
156
+ })
157
+ .catch(() => {
158
+ imageLoadError.value = true
159
+ })
161
160
  }
162
161
  }
163
- </script>
162
+ </script>