@policystudio/policy-studio-ui-vue 1.1.90-beta.3 → 1.1.90-beta.30

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 (147) hide show
  1. package/.eslintrc.js +13 -8
  2. package/.github/workflows/deploy-storybook.yml +4 -4
  3. package/.nvmrc +1 -0
  4. package/dist/css/psui_styles_output.css +6994 -0
  5. package/dist/index.d.ts +50 -0
  6. package/dist/index.js +104 -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/package.json +24 -37
  18. package/src/App.vue +30 -0
  19. package/src/assets/scss/components/PsDataTable.scss +1 -1
  20. package/src/assets/scss/components/PsDropdownList.scss +1 -1
  21. package/src/components/accordion/PsAccordionItem.vue +88 -74
  22. package/src/components/badges-and-tags/PsBadgeWithIcon.vue +31 -33
  23. package/src/components/badges-and-tags/PsCardInfos.vue +39 -41
  24. package/src/components/badges-and-tags/PsChartLegend.vue +46 -51
  25. package/src/components/badges-and-tags/PsClimateZoneBadge.vue +13 -19
  26. package/src/components/badges-and-tags/PsCostEffectBar.vue +24 -56
  27. package/src/components/badges-and-tags/PsDateCardInfo.vue +17 -18
  28. package/src/components/badges-and-tags/PsHighlightRippleDot.vue +3 -2
  29. package/src/components/badges-and-tags/PsMiniTag.vue +39 -41
  30. package/src/components/badges-and-tags/PsProgressBar.vue +72 -68
  31. package/src/components/badges-and-tags/PsTagScope.vue +17 -22
  32. package/src/components/badges-and-tags/PsTestimonialCard.vue +19 -26
  33. package/src/components/buttons/PsButton.vue +60 -61
  34. package/src/components/chips/PsChips.vue +98 -101
  35. package/src/components/controls/PsCheckbox.vue +84 -84
  36. package/src/components/controls/PsCheckboxSimple.vue +95 -95
  37. package/src/components/controls/PsDraggable.vue +53 -55
  38. package/src/components/controls/PsInlineSelector.vue +98 -99
  39. package/src/components/controls/PsRadioButton.vue +59 -58
  40. package/src/components/controls/PsRadioButtonSimple.vue +79 -75
  41. package/src/components/controls/PsSlider.vue +185 -176
  42. package/src/components/controls/PsSwitch.vue +51 -52
  43. package/src/components/controls/PsToggle.vue +52 -50
  44. package/src/components/data-graphics/PsBarChart.vue +18 -21
  45. package/src/components/datatable/PsDataTable.vue +56 -60
  46. package/src/components/datatable/PsDataTableItem.vue +13 -28
  47. package/src/components/forms/PsDropdown.vue +165 -162
  48. package/src/components/forms/PsDropdownList.vue +133 -130
  49. package/src/components/forms/PsInput.vue +154 -153
  50. package/src/components/forms/PsInputSelect.vue +91 -92
  51. package/src/components/forms/PsInputTextArea.vue +70 -71
  52. package/src/components/navigations/PsBreadcrumb.vue +25 -34
  53. package/src/components/notifications/PsDialog.vue +57 -56
  54. package/src/components/notifications/PsSimpleAlert.vue +27 -29
  55. package/src/components/notifications/PsToast.vue +40 -39
  56. package/src/components/table-results/PsTableResults.vue +456 -466
  57. package/src/components/table-results/PsTableResultsBody.vue +66 -67
  58. package/src/components/table-results/PsTableResultsHead.vue +67 -61
  59. package/src/components/table-results/PsTableResultsHeadComparison.vue +62 -56
  60. package/src/components/table-results/PsTableResultsHeadFlexible.vue +68 -61
  61. package/src/components/table-results/PsTableResultsRow.vue +55 -56
  62. package/src/components/tabs/PsTabHeader.vue +106 -100
  63. package/src/components/tooltip/PsDialogTooltip.vue +96 -101
  64. package/src/components/tooltip/PsRichTooltip.vue +41 -45
  65. package/src/components/tooltip/PsTooltip.vue +111 -116
  66. package/src/components/ui/PsDotLoader.vue +1 -5
  67. package/src/components/ui/PsIcon.vue +131 -129
  68. package/src/index.ts +156 -0
  69. package/src/tsconfig.json +12 -0
  70. package/src/types/index.d.ts +6 -0
  71. package/src/util/GeneralFunctions.js +16 -7
  72. package/src/util/directives.ts +24 -0
  73. package/src/util/imageLoader.js +14 -7
  74. package/tailwind.config.js +1 -1
  75. package/tsconfig.json +47 -0
  76. package/.storybook/PolicyStudio.js +0 -10
  77. package/.storybook/eventBus.js +0 -26
  78. package/.storybook/main.js +0 -21
  79. package/.storybook/manager.js +0 -6
  80. package/.storybook/preview.js +0 -17
  81. package/babel.config.js +0 -17
  82. package/dist/css/psui_styles.css +0 -4647
  83. package/postcss.config.js +0 -8
  84. package/src/assets/images/multifamily-units.svg +0 -10
  85. package/src/assets/images/policy-studio.svg +0 -15
  86. package/src/components/playground/PsScrollBar.vue +0 -320
  87. package/src/contents/ComparisonData.js +0 -378
  88. package/src/contents/FlexibleData.js +0 -502
  89. package/src/contents/ResultsData.js +0 -531
  90. package/src/index.js +0 -166
  91. package/src/stories/Accordion.stories.js +0 -59
  92. package/src/stories/BadgeWithIcon.stories.js +0 -31
  93. package/src/stories/BarChart.stories.js +0 -17
  94. package/src/stories/Breadcrumb.stories.js +0 -25
  95. package/src/stories/Button.stories.js +0 -48
  96. package/src/stories/Button.vue +0 -59
  97. package/src/stories/CardInfos.stories.js +0 -16
  98. package/src/stories/ChartLegend.stories.js +0 -16
  99. package/src/stories/Checkbox.stories.js +0 -45
  100. package/src/stories/CheckboxSimple.stories.js +0 -49
  101. package/src/stories/Chips.stories.js +0 -31
  102. package/src/stories/ClimateZoneBadge.stories.js +0 -17
  103. package/src/stories/Colors.mdx +0 -70
  104. package/src/stories/CostEffectBar.stories.js +0 -23
  105. package/src/stories/Datatable.stories.js +0 -50
  106. package/src/stories/DateCardInfo.stories.js +0 -24
  107. package/src/stories/Dialog.stories.js +0 -131
  108. package/src/stories/Draggable.stories.js +0 -22
  109. package/src/stories/Dropdown.stories.js +0 -99
  110. package/src/stories/DropdownList.stories.js +0 -211
  111. package/src/stories/ElevationSystem.mdx +0 -41
  112. package/src/stories/Header.stories.js +0 -41
  113. package/src/stories/Header.vue +0 -77
  114. package/src/stories/HighlightRippleDot.stories.js +0 -15
  115. package/src/stories/Icon.stories.js +0 -21
  116. package/src/stories/InlineSelector.stories.js +0 -18
  117. package/src/stories/Input.stories.js +0 -240
  118. package/src/stories/InputSelect.stories.js +0 -30
  119. package/src/stories/InputTextArea.stories.js +0 -25
  120. package/src/stories/Introduction.mdx +0 -211
  121. package/src/stories/MiniTag.stories.js +0 -52
  122. package/src/stories/Playground.stories.js +0 -16
  123. package/src/stories/ProgressBar.stories.js +0 -23
  124. package/src/stories/RadioButton.stories.js +0 -40
  125. package/src/stories/RadioButtonSimple.stories.js +0 -43
  126. package/src/stories/SimpleAlert.stories.js +0 -21
  127. package/src/stories/Slider.stories.js +0 -75
  128. package/src/stories/Switch.stories.js +0 -39
  129. package/src/stories/TabHeader.stories.js +0 -52
  130. package/src/stories/TableResults.stories.js +0 -724
  131. package/src/stories/TagScope.stories.js +0 -17
  132. package/src/stories/TestimonialCard.stories.js +0 -27
  133. package/src/stories/Toast.stories.js +0 -52
  134. package/src/stories/Toggle.stories.js +0 -45
  135. package/src/stories/Tooltip.stories.js +0 -114
  136. package/src/stories/Typography.mdx +0 -212
  137. package/src/stories/assets/code-brackets.svg +0 -1
  138. package/src/stories/assets/colors.svg +0 -1
  139. package/src/stories/assets/comments.svg +0 -1
  140. package/src/stories/assets/direction.svg +0 -1
  141. package/src/stories/assets/flow.svg +0 -1
  142. package/src/stories/assets/plugin.svg +0 -1
  143. package/src/stories/assets/repo.svg +0 -1
  144. package/src/stories/assets/stackalt.svg +0 -1
  145. package/src/stories/button.css +0 -30
  146. package/src/stories/header.css +0 -32
  147. package/webpack.config.js +0 -22
@@ -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,139 @@
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 (imageLoadError.value || !finishedImageLoad.value) return 'material-icons'
116
+ if (props.type) return props.type
117
+ if (!props.icon?.includes('/')) return 'material-icons'
118
+ if (!props.icon?.includes('.svg')) return 'url'
119
+ return 'svg'
120
+ })
121
+
122
+ const getIcon = computed(() => {
123
+ if (!props.icon?.includes('/')) return props.icon ? props.icon : props.loaderErrorIcon
124
+ if (!finishedImageLoad.value && !imageLoadError.value && props.loaderIcon) return props.loaderIcon
125
+ if (imageLoadError.value) return props.loaderErrorIcon
126
+ return props.icon ? props.icon : props.loaderErrorIcon
127
+ })
128
+
129
+ const getIconClasses = computed(() => {
130
+ if (props.iconClasses) return props.iconClasses
131
+ return `${props.color}`
132
+ })
133
+
134
+ // const getHeight = computed(() => {
135
+ // return props.height
136
+ // })
137
+
138
+ const getColor = computed(() => {
139
+ if (getIconType.value === 'material-icons') return props.color
140
+ return tailwindConfig.theme.colors[props.color.replace('psui-text-', '')] || tailwindConfig.theme.colors[props.color]
141
+ })
142
+
143
+ watch(
144
+ () => props.icon,
145
+ () => {
146
+ loadImage()
161
147
  }
148
+ )
149
+
150
+ onMounted(() => {
151
+ if (props.icon?.includes('/')) loadImage()
152
+ })
153
+
154
+ const loadImage = () => {
155
+ finishedImageLoad.value = false
156
+ imageLoadError.value = false
157
+ imageLoader({ imageUrl: props.icon, returnsBase64: false })
158
+ .then(() => {
159
+ finishedImageLoad.value = true
160
+ })
161
+ .catch(() => {
162
+ imageLoadError.value = true
163
+ })
162
164
  }
163
- </script>
165
+ </script>