@vc-shell/framework 1.1.3 → 1.1.5
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.
- package/CHANGELOG.md +24 -0
- package/core/directives/loading/styles.css +1 -1
- package/core/plugins/modularity/README.md +347 -17
- package/core/plugins/modularity/loader.ts +217 -3
- package/dist/core/plugins/modularity/loader.d.ts +4 -0
- package/dist/core/plugins/modularity/loader.d.ts.map +1 -1
- package/dist/framework.js +1 -1
- package/dist/{index-DRL7VovM.js → index-BBHl6nap.js} +1 -1
- package/dist/{index-BKR3ecN5.js → index-BG6N4UCY.js} +1 -1
- package/dist/{index-Cv6c_1IG.js → index-Bv5as3SI.js} +1 -1
- package/dist/{index-BUHouW8T.js → index-C4VyqVxv.js} +1 -1
- package/dist/{index-Ek7_XgGk.js → index-CKLiFGZ-.js} +1 -1
- package/dist/{index-B83didIY.js → index-CTmAMa_1.js} +1 -1
- package/dist/{index-C6tcHNVl.js → index-CtGZgIiV.js} +1 -1
- package/dist/{index-DyGIijU2.js → index-D13Jcezf.js} +1 -1
- package/dist/{index-CnQ56kqq.js → index-DbpKygJh.js} +1 -1
- package/dist/{index-Dfcy8w9c.js → index-DgCtSr4P.js} +1 -1
- package/dist/{index-TSGli7LX.js → index-Dh1XjfgY.js} +1 -1
- package/dist/{index-BW3krAiY.js → index-DpDbQQg6.js} +1 -1
- package/dist/{index-CxMfHOup.js → index-DwuQbDJG.js} +1 -1
- package/dist/{index-xFQltarK.js → index-Fhuqbkq2.js} +1 -1
- package/dist/{index-BN-_cebP.js → index-JTAZpxKF.js} +1 -1
- package/dist/{index-UnPPbmRc.js → index-MKD2CP5c.js} +49617 -48276
- package/dist/{index-CGyGGihY.js → index-Q3k1PYzc.js} +1 -1
- package/dist/index.css +3 -3
- package/dist/shared/components/generic-dropdown/generic-dropdown.vue.d.ts.map +1 -1
- package/dist/shared/components/settings-menu-item/settings-menu-item.vue.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/vc-icon/composables/index.d.ts +3 -0
- package/dist/ui/components/atoms/vc-icon/composables/index.d.ts.map +1 -0
- package/dist/ui/components/atoms/vc-icon/composables/use-icon-type.d.ts +22 -0
- package/dist/ui/components/atoms/vc-icon/composables/use-icon-type.d.ts.map +1 -0
- package/dist/ui/components/atoms/vc-icon/composables/use-icon.d.ts +30 -0
- package/dist/ui/components/atoms/vc-icon/composables/use-icon.d.ts.map +1 -0
- package/dist/ui/components/atoms/vc-icon/index.d.ts +1 -0
- package/dist/ui/components/atoms/vc-icon/index.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/types.d.ts +31 -0
- package/dist/ui/components/atoms/vc-icon/types.d.ts.map +1 -0
- package/dist/ui/components/atoms/vc-icon/vc-bootstrap-icon.vue.d.ts +18 -4
- package/dist/ui/components/atoms/vc-icon/vc-bootstrap-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-fontawesome-icon.vue.d.ts +15 -2
- package/dist/ui/components/atoms/vc-icon/vc-fontawesome-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-icon-examples.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-icon-test.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts +11 -6
- package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-lucide-icon.vue.d.ts +21 -4
- package/dist/ui/components/atoms/vc-icon/vc-lucide-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts +30 -4
- package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-svg-icon.vue.d.ts +33 -0
- package/dist/ui/components/atoms/vc-icon/vc-svg-icon.vue.d.ts.map +1 -0
- package/dist/ui/components/atoms/vc-widget/vc-widget.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/props.d.ts +14 -0
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/props.d.ts.map +1 -0
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-base-button.vue.d.ts +2 -13
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-base-button.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-circle-button.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-circle-button.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-body/vc-table-body.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-body/vc-table-body.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-columns-header/vc-table-columns-header.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-columns-header/vc-table-columns-header.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-row/vc-table-row.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-row/vc-table-row.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableActions.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableActions.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableColumnReorder.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableColumnReorder.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableColumnResize.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableColumnResize.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableSelection.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableSelection.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableState.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableState.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/types.d.ts +36 -0
- package/dist/ui/components/organisms/vc-table/types.d.ts.map +1 -0
- package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +2 -34
- package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
- package/package.json +4 -4
- package/shared/components/generic-dropdown/generic-dropdown.vue +1 -1
- package/shared/components/settings-menu-item/settings-menu-item.vue +1 -6
- package/shared/components/user-dropdown-button/_internal/user-info.vue +3 -3
- package/ui/components/atoms/vc-icon/README.md +198 -220
- package/ui/components/atoms/vc-icon/composables/index.ts +2 -0
- package/ui/components/atoms/vc-icon/composables/use-icon-type.ts +83 -0
- package/ui/components/atoms/vc-icon/composables/use-icon.ts +129 -0
- package/ui/components/atoms/vc-icon/index.ts +1 -0
- package/ui/components/atoms/vc-icon/types.ts +36 -0
- package/ui/components/atoms/vc-icon/vc-bootstrap-icon.vue +111 -10
- package/ui/components/atoms/vc-icon/vc-fontawesome-icon.vue +119 -17
- package/ui/components/atoms/vc-icon/vc-icon-examples.vue +485 -124
- package/ui/components/atoms/vc-icon/vc-icon-test.vue +399 -209
- package/ui/components/atoms/vc-icon/vc-icon.stories.ts +502 -56
- package/ui/components/atoms/vc-icon/vc-icon.vue +240 -155
- package/ui/components/atoms/vc-icon/vc-lucide-icon.vue +163 -33
- package/ui/components/atoms/vc-icon/vc-material-icon.vue +136 -30
- package/ui/components/atoms/vc-icon/vc-svg-icon.vue +168 -0
- package/ui/components/atoms/vc-widget/vc-widget.stories.ts +13 -0
- package/ui/components/atoms/vc-widget/vc-widget.vue +2 -0
- package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +1 -1
- package/ui/components/molecules/vc-pagination/vc-pagination.vue +23 -14
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue +2 -2
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +2 -3
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/props.ts +14 -0
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-base-button.vue +1 -12
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-circle-button.vue +1 -1
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +65 -32
- package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +1 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +1 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-body/vc-table-body.vue +1 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-columns-header/vc-table-columns-header.vue +1 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-row/vc-table-row.vue +1 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue +1 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue +1 -1
- package/ui/components/organisms/vc-table/composables/useTableActions.ts +1 -1
- package/ui/components/organisms/vc-table/composables/useTableColumnReorder.ts +1 -1
- package/ui/components/organisms/vc-table/composables/useTableColumnResize.ts +1 -1
- package/ui/components/organisms/vc-table/composables/useTableRowReorder.ts +1 -1
- package/ui/components/organisms/vc-table/composables/useTableSelection.ts +1 -1
- package/ui/components/organisms/vc-table/composables/useTableState.ts +1 -1
- package/ui/components/organisms/vc-table/types.ts +32 -0
- package/ui/components/organisms/vc-table/vc-table.vue +2 -30
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { computed, unref } from "vue";
|
|
2
|
+
import type { IconSize, IconType, IconVariant } from "../types";
|
|
3
|
+
import type { MaybeRef } from "@vueuse/core";
|
|
4
|
+
|
|
5
|
+
interface UseIconOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Icon type
|
|
8
|
+
*/
|
|
9
|
+
type: MaybeRef<IconType>;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Icon size
|
|
13
|
+
*/
|
|
14
|
+
size?: MaybeRef<IconSize>;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Icon color variant
|
|
18
|
+
*/
|
|
19
|
+
variant?: MaybeRef<IconVariant>;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Custom size in pixels
|
|
23
|
+
*/
|
|
24
|
+
customSize?: MaybeRef<number | undefined>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Standard scaling factors for different icon types
|
|
28
|
+
const DEFAULT_SCALE_FACTORS: Record<IconType, number> = {
|
|
29
|
+
fontawesome: 1, // base size (as a reference)
|
|
30
|
+
material: 1.3, // material icons are slightly larger
|
|
31
|
+
bootstrap: 0.95, // bootstrap icons are slightly smaller
|
|
32
|
+
lucide: 1, // lucide (svg) icons are noticeably smaller
|
|
33
|
+
custom: 1, // custom components - default without scaling
|
|
34
|
+
svg: 1, // svg icons - default without scaling
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Composable for working with icons
|
|
39
|
+
*/
|
|
40
|
+
export function useIcon(options: UseIconOptions) {
|
|
41
|
+
const { type: iconType, size = "m", variant, customSize } = options;
|
|
42
|
+
|
|
43
|
+
// Calculate the scaling factor for the icon type
|
|
44
|
+
const scaleFactor = computed(() => {
|
|
45
|
+
const type = unref(iconType);
|
|
46
|
+
return DEFAULT_SCALE_FACTORS[type] || 1;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Calculate the styles for the icon with the scaling factor
|
|
50
|
+
const iconStyle = computed(() => {
|
|
51
|
+
const customSizeValue = unref(customSize);
|
|
52
|
+
const type = unref(iconType);
|
|
53
|
+
|
|
54
|
+
if (customSizeValue !== undefined) {
|
|
55
|
+
const scaledSize = customSizeValue * scaleFactor.value;
|
|
56
|
+
|
|
57
|
+
// Different styles for different icon types
|
|
58
|
+
if (type === "fontawesome" || type === "bootstrap") {
|
|
59
|
+
// Using font-size directly for font-based icons with high priority
|
|
60
|
+
return { fontSize: `${scaledSize}px` };
|
|
61
|
+
} else if (type === "material") {
|
|
62
|
+
// Material icons may need additional styling
|
|
63
|
+
return {
|
|
64
|
+
fontSize: `${scaledSize}px`,
|
|
65
|
+
transform: `scale(${scaleFactor.value})`,
|
|
66
|
+
transformOrigin: "center center",
|
|
67
|
+
};
|
|
68
|
+
} else if (type === "lucide" || type === "svg") {
|
|
69
|
+
// SVG-based icons need width and height
|
|
70
|
+
return {
|
|
71
|
+
width: `${scaledSize}px`,
|
|
72
|
+
height: `${scaledSize}px`,
|
|
73
|
+
};
|
|
74
|
+
} else if (type === "custom") {
|
|
75
|
+
// Default for custom icons
|
|
76
|
+
return {
|
|
77
|
+
fontSize: `${scaledSize}px`,
|
|
78
|
+
width: "auto",
|
|
79
|
+
height: "auto",
|
|
80
|
+
};
|
|
81
|
+
} else {
|
|
82
|
+
// Fallback for unknown types
|
|
83
|
+
return {
|
|
84
|
+
fontSize: `${scaledSize}px`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Otherwise - base styles
|
|
90
|
+
const styles: Record<string, string> = {};
|
|
91
|
+
|
|
92
|
+
// For SVG and Lucide icons, we need width and height
|
|
93
|
+
if (type === "svg" || type === "lucide") {
|
|
94
|
+
styles.width = "1em";
|
|
95
|
+
styles.height = "1em";
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// For Material icons, we need scaling through transform
|
|
99
|
+
if (type === "material") {
|
|
100
|
+
styles.transform = `scale(${scaleFactor.value})`;
|
|
101
|
+
styles.transformOrigin = "center center";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return styles;
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Calculate the classes for the icon
|
|
108
|
+
const iconClass = computed(() => {
|
|
109
|
+
const sizeValue = unref(size);
|
|
110
|
+
const variantValue = unref(variant);
|
|
111
|
+
|
|
112
|
+
const classes = ["vc-icon", `vc-icon_${sizeValue}`];
|
|
113
|
+
|
|
114
|
+
if (variantValue) {
|
|
115
|
+
classes.push(`vc-icon_${variantValue}`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Add a class to determine the icon type, so that icons can be styled by type
|
|
119
|
+
classes.push(`vc-icon--${unref(iconType)}`);
|
|
120
|
+
|
|
121
|
+
return classes;
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
iconStyle,
|
|
126
|
+
iconClass,
|
|
127
|
+
scaleFactor,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icon types supported by the component
|
|
3
|
+
*/
|
|
4
|
+
export type IconType = "fontawesome" | "material" | "bootstrap" | "lucide" | "custom" | "svg";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Icon sizes
|
|
8
|
+
*/
|
|
9
|
+
export type IconSize = "xs" | "s" | "m" | "l" | "xl" | "xxl" | "xxxl";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Icon color variants
|
|
13
|
+
*/
|
|
14
|
+
export type IconVariant = "warning" | "danger" | "success";
|
|
15
|
+
|
|
16
|
+
export interface IconProps {
|
|
17
|
+
/**
|
|
18
|
+
* Icon to display
|
|
19
|
+
*/
|
|
20
|
+
icon: string;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Icon size
|
|
24
|
+
*/
|
|
25
|
+
size?: IconSize;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Icon color variant
|
|
29
|
+
*/
|
|
30
|
+
variant?: IconVariant;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Custom size in pixels
|
|
34
|
+
*/
|
|
35
|
+
customSize?: number;
|
|
36
|
+
}
|
|
@@ -1,28 +1,129 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<i
|
|
2
|
+
<i
|
|
3
|
+
:class="[
|
|
4
|
+
'vc-bootstrap-icon',
|
|
5
|
+
!hasCustomSize && `vc-bootstrap-icon--${size}`,
|
|
6
|
+
iconClass,
|
|
7
|
+
variant ? `vc-bootstrap-icon--${variant}` : '',
|
|
8
|
+
]"
|
|
9
|
+
:style="mergedStyle"
|
|
10
|
+
aria-hidden="true"
|
|
11
|
+
></i>
|
|
3
12
|
</template>
|
|
4
13
|
|
|
5
14
|
<script lang="ts" setup>
|
|
6
15
|
import { computed } from "vue";
|
|
16
|
+
import type { IconSize, IconVariant } from "./types";
|
|
17
|
+
import { useIcon } from "./composables";
|
|
7
18
|
|
|
8
|
-
|
|
19
|
+
interface Props {
|
|
20
|
+
/**
|
|
21
|
+
* Bootstrap icon name (e.g. "bi-house" or "house")
|
|
22
|
+
*/
|
|
9
23
|
icon: string;
|
|
10
|
-
|
|
11
|
-
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Icon size
|
|
27
|
+
*/
|
|
28
|
+
size?: IconSize;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Icon color variant
|
|
32
|
+
*/
|
|
33
|
+
variant?: IconVariant;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Custom size in pixels
|
|
37
|
+
*/
|
|
38
|
+
customSize?: number;
|
|
12
39
|
}
|
|
13
40
|
|
|
14
41
|
const props = withDefaults(defineProps<Props>(), {
|
|
15
42
|
size: "m",
|
|
16
43
|
});
|
|
17
44
|
|
|
18
|
-
//
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
45
|
+
// Check if using custom size to conditionally apply CSS class
|
|
46
|
+
const hasCustomSize = computed(() => typeof props.customSize === "number" && props.customSize > 0);
|
|
47
|
+
|
|
48
|
+
// Use the shared icon composable for consistent scaling
|
|
49
|
+
const { iconStyle } = useIcon({
|
|
50
|
+
type: "bootstrap",
|
|
51
|
+
size: props.size,
|
|
52
|
+
variant: props.variant,
|
|
53
|
+
customSize: props.customSize,
|
|
22
54
|
});
|
|
23
55
|
|
|
24
|
-
//
|
|
56
|
+
// Create the merged style with !important to override any CSS classes
|
|
57
|
+
const mergedStyle = computed(() => {
|
|
58
|
+
const styles = { ...iconStyle.value };
|
|
59
|
+
|
|
60
|
+
// If using custom size, make sure fontSize is applied with !important
|
|
61
|
+
if (hasCustomSize.value && styles.fontSize) {
|
|
62
|
+
styles.fontSize = `${styles.fontSize.replace("px", "")}px !important`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return styles;
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Compute proper Bootstrap icon class
|
|
25
69
|
const iconClass = computed(() => {
|
|
26
|
-
|
|
70
|
+
if (!props.icon) return "";
|
|
71
|
+
|
|
72
|
+
// If already includes the bi- prefix, use as is
|
|
73
|
+
if (props.icon.startsWith("bi-")) {
|
|
74
|
+
return props.icon;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Otherwise, add the bi- prefix
|
|
78
|
+
return `bi-${props.icon}`;
|
|
27
79
|
});
|
|
28
80
|
</script>
|
|
81
|
+
|
|
82
|
+
<style lang="scss">
|
|
83
|
+
.vc-bootstrap-icon {
|
|
84
|
+
display: inline-flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
justify-content: center;
|
|
87
|
+
font-size: inherit;
|
|
88
|
+
|
|
89
|
+
&--xs {
|
|
90
|
+
font-size: var(--icon-size-xs);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&--s {
|
|
94
|
+
font-size: var(--icon-size-s);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
&--m {
|
|
98
|
+
font-size: var(--icon-size-m);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
&--l {
|
|
102
|
+
font-size: var(--icon-size-l);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
&--xl {
|
|
106
|
+
font-size: var(--icon-size-xl);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
&--xxl {
|
|
110
|
+
font-size: var(--icon-size-xxl);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
&--xxxl {
|
|
114
|
+
font-size: var(--icon-size-xxxl);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
&--warning {
|
|
118
|
+
color: var(--icon-color-warning);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
&--danger {
|
|
122
|
+
color: var(--icon-color-danger);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
&--success {
|
|
126
|
+
color: var(--icon-color-success);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
</style>
|
|
@@ -1,41 +1,143 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<i
|
|
2
|
+
<i
|
|
3
|
+
:class="[
|
|
4
|
+
'vc-fa-icon',
|
|
5
|
+
!hasCustomSize && `vc-fa-icon--${size}`,
|
|
6
|
+
iconClasses,
|
|
7
|
+
variant ? `vc-fa-icon--${variant}` : '',
|
|
8
|
+
]"
|
|
9
|
+
:style="mergedStyle"
|
|
10
|
+
aria-hidden="true"
|
|
11
|
+
></i>
|
|
3
12
|
</template>
|
|
4
13
|
|
|
5
14
|
<script lang="ts" setup>
|
|
6
15
|
import { computed } from "vue";
|
|
7
|
-
import type { IconSize, IconVariant } from "./
|
|
16
|
+
import type { IconSize, IconVariant } from "./types";
|
|
17
|
+
import { useIcon } from "./composables";
|
|
8
18
|
|
|
9
|
-
|
|
19
|
+
interface Props {
|
|
20
|
+
/**
|
|
21
|
+
* Font Awesome icon class name (e.g. "fas fa-user" or "fa-user")
|
|
22
|
+
*/
|
|
10
23
|
icon: string;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Icon size
|
|
27
|
+
*/
|
|
11
28
|
size?: IconSize;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Icon color variant
|
|
32
|
+
*/
|
|
12
33
|
variant?: IconVariant;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Custom size in pixels
|
|
37
|
+
*/
|
|
38
|
+
customSize?: number;
|
|
13
39
|
}
|
|
14
40
|
|
|
15
41
|
const props = withDefaults(defineProps<Props>(), {
|
|
16
42
|
size: "m",
|
|
17
43
|
});
|
|
18
44
|
|
|
19
|
-
//
|
|
20
|
-
const
|
|
21
|
-
|
|
45
|
+
// Check if using custom size to conditionally apply CSS class
|
|
46
|
+
const hasCustomSize = computed(() => typeof props.customSize === "number" && props.customSize > 0);
|
|
47
|
+
|
|
48
|
+
// Use the shared icon composable for consistent scaling
|
|
49
|
+
const { iconStyle } = useIcon({
|
|
50
|
+
type: "fontawesome",
|
|
51
|
+
size: props.size,
|
|
52
|
+
variant: props.variant,
|
|
53
|
+
customSize: props.customSize,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Create the merged style with !important to override any CSS classes
|
|
57
|
+
const mergedStyle = computed(() => {
|
|
58
|
+
const styles = { ...iconStyle.value };
|
|
59
|
+
|
|
60
|
+
// If using custom size, make sure fontSize is applied with !important
|
|
61
|
+
if (hasCustomSize.value && styles.fontSize) {
|
|
62
|
+
styles.fontSize = `${styles.fontSize.replace("px", "")}px !important`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return styles;
|
|
66
|
+
});
|
|
22
67
|
|
|
23
|
-
|
|
68
|
+
// Compute the FontAwesome class from the icon string
|
|
69
|
+
const iconClasses = computed(() => {
|
|
70
|
+
// If icon already has a style prefix (fas, far, fal, fab), use it as is
|
|
24
71
|
if (
|
|
25
|
-
props.icon.startsWith("
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
!props.icon.startsWith("fad ")
|
|
72
|
+
props.icon.startsWith("fas ") ||
|
|
73
|
+
props.icon.startsWith("far ") ||
|
|
74
|
+
props.icon.startsWith("fal ") ||
|
|
75
|
+
props.icon.startsWith("fab ") ||
|
|
76
|
+
props.icon.startsWith("fad ")
|
|
31
77
|
) {
|
|
78
|
+
return props.icon;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// If icon starts with fa-, add the default style prefix
|
|
82
|
+
if (props.icon.startsWith("fa-")) {
|
|
32
83
|
return `fas ${props.icon}`;
|
|
33
84
|
}
|
|
34
85
|
|
|
35
|
-
|
|
36
|
-
|
|
86
|
+
// If icon contains fa- but doesn't start with a style prefix, assume the style prefix is included
|
|
87
|
+
if (props.icon.includes("fa-")) {
|
|
88
|
+
return props.icon;
|
|
89
|
+
}
|
|
37
90
|
|
|
38
|
-
|
|
39
|
-
return
|
|
91
|
+
// Otherwise, assume it's a bare icon name and add both the style prefix and fa- prefix
|
|
92
|
+
return `fas fa-${props.icon}`;
|
|
40
93
|
});
|
|
41
94
|
</script>
|
|
95
|
+
|
|
96
|
+
<style lang="scss">
|
|
97
|
+
.vc-fa-icon {
|
|
98
|
+
display: inline-flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
justify-content: center;
|
|
101
|
+
font-size: inherit;
|
|
102
|
+
|
|
103
|
+
&--xs {
|
|
104
|
+
font-size: var(--icon-size-xs);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
&--s {
|
|
108
|
+
font-size: var(--icon-size-s);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
&--m {
|
|
112
|
+
font-size: var(--icon-size-m);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
&--l {
|
|
116
|
+
font-size: var(--icon-size-l);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
&--xl {
|
|
120
|
+
font-size: var(--icon-size-xl);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
&--xxl {
|
|
124
|
+
font-size: var(--icon-size-xxl);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
&--xxxl {
|
|
128
|
+
font-size: var(--icon-size-xxxl);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
&--warning {
|
|
132
|
+
color: var(--icon-color-warning);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
&--danger {
|
|
136
|
+
color: var(--icon-color-danger);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
&--success {
|
|
140
|
+
color: var(--icon-color-success);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
</style>
|