@vc-shell/framework 1.1.4 → 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.
Files changed (132) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/core/directives/loading/styles.css +1 -1
  3. package/core/plugins/modularity/README.md +347 -17
  4. package/core/plugins/modularity/loader.ts +217 -3
  5. package/dist/core/plugins/modularity/loader.d.ts +4 -0
  6. package/dist/core/plugins/modularity/loader.d.ts.map +1 -1
  7. package/dist/framework.js +1 -1
  8. package/dist/{index-BdflTsg6.js → index-BBHl6nap.js} +1 -1
  9. package/dist/{index-DJOis7Nc.js → index-BG6N4UCY.js} +1 -1
  10. package/dist/{index-CIcET-ZI.js → index-Bv5as3SI.js} +1 -1
  11. package/dist/{index-wfv8ehcx.js → index-C4VyqVxv.js} +1 -1
  12. package/dist/{index-Cf2H7YZ1.js → index-CKLiFGZ-.js} +1 -1
  13. package/dist/{index-DuY7BIGm.js → index-CTmAMa_1.js} +1 -1
  14. package/dist/{index-D-fPN3yf.js → index-CtGZgIiV.js} +1 -1
  15. package/dist/{index-BpBTtmQ6.js → index-D13Jcezf.js} +1 -1
  16. package/dist/{index-DWTsz5bC.js → index-DbpKygJh.js} +1 -1
  17. package/dist/{index-Br0y2YMn.js → index-DgCtSr4P.js} +1 -1
  18. package/dist/{index-Ck055pN8.js → index-Dh1XjfgY.js} +1 -1
  19. package/dist/{index-CYAMpxnu.js → index-DpDbQQg6.js} +1 -1
  20. package/dist/{index-BDqUaIyQ.js → index-DwuQbDJG.js} +1 -1
  21. package/dist/{index-BBYKbiRX.js → index-Fhuqbkq2.js} +1 -1
  22. package/dist/{index-o6aSdNED.js → index-JTAZpxKF.js} +1 -1
  23. package/dist/{index-BDm0tcWn.js → index-MKD2CP5c.js} +49888 -48568
  24. package/dist/{index-DKtQMsy4.js → index-Q3k1PYzc.js} +1 -1
  25. package/dist/index.css +3 -3
  26. package/dist/shared/components/generic-dropdown/generic-dropdown.vue.d.ts.map +1 -1
  27. package/dist/shared/components/settings-menu-item/settings-menu-item.vue.d.ts.map +1 -1
  28. package/dist/tsconfig.tsbuildinfo +1 -1
  29. package/dist/ui/components/atoms/vc-icon/composables/index.d.ts +3 -0
  30. package/dist/ui/components/atoms/vc-icon/composables/index.d.ts.map +1 -0
  31. package/dist/ui/components/atoms/vc-icon/composables/use-icon-type.d.ts +22 -0
  32. package/dist/ui/components/atoms/vc-icon/composables/use-icon-type.d.ts.map +1 -0
  33. package/dist/ui/components/atoms/vc-icon/composables/use-icon.d.ts +30 -0
  34. package/dist/ui/components/atoms/vc-icon/composables/use-icon.d.ts.map +1 -0
  35. package/dist/ui/components/atoms/vc-icon/index.d.ts +1 -0
  36. package/dist/ui/components/atoms/vc-icon/index.d.ts.map +1 -1
  37. package/dist/ui/components/atoms/vc-icon/types.d.ts +31 -0
  38. package/dist/ui/components/atoms/vc-icon/types.d.ts.map +1 -0
  39. package/dist/ui/components/atoms/vc-icon/vc-bootstrap-icon.vue.d.ts +18 -4
  40. package/dist/ui/components/atoms/vc-icon/vc-bootstrap-icon.vue.d.ts.map +1 -1
  41. package/dist/ui/components/atoms/vc-icon/vc-fontawesome-icon.vue.d.ts +15 -2
  42. package/dist/ui/components/atoms/vc-icon/vc-fontawesome-icon.vue.d.ts.map +1 -1
  43. package/dist/ui/components/atoms/vc-icon/vc-icon-examples.vue.d.ts.map +1 -1
  44. package/dist/ui/components/atoms/vc-icon/vc-icon-test.vue.d.ts.map +1 -1
  45. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts +11 -6
  46. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
  47. package/dist/ui/components/atoms/vc-icon/vc-lucide-icon.vue.d.ts +21 -4
  48. package/dist/ui/components/atoms/vc-icon/vc-lucide-icon.vue.d.ts.map +1 -1
  49. package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts +30 -4
  50. package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts.map +1 -1
  51. package/dist/ui/components/atoms/vc-icon/vc-svg-icon.vue.d.ts +33 -0
  52. package/dist/ui/components/atoms/vc-icon/vc-svg-icon.vue.d.ts.map +1 -0
  53. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
  54. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts +1 -1
  62. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  63. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts +1 -1
  64. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts.map +1 -1
  65. package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-body/vc-table-body.vue.d.ts +1 -1
  66. 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
  67. 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
  68. 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
  69. package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-row/vc-table-row.vue.d.ts +1 -1
  70. 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
  71. package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue.d.ts +1 -1
  72. package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue.d.ts.map +1 -1
  73. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts +1 -1
  74. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts.map +1 -1
  75. package/dist/ui/components/organisms/vc-table/composables/useTableActions.d.ts +1 -1
  76. package/dist/ui/components/organisms/vc-table/composables/useTableActions.d.ts.map +1 -1
  77. package/dist/ui/components/organisms/vc-table/composables/useTableColumnReorder.d.ts +1 -1
  78. package/dist/ui/components/organisms/vc-table/composables/useTableColumnReorder.d.ts.map +1 -1
  79. package/dist/ui/components/organisms/vc-table/composables/useTableColumnResize.d.ts +1 -1
  80. package/dist/ui/components/organisms/vc-table/composables/useTableColumnResize.d.ts.map +1 -1
  81. package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts +1 -1
  82. package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts.map +1 -1
  83. package/dist/ui/components/organisms/vc-table/composables/useTableSelection.d.ts +1 -1
  84. package/dist/ui/components/organisms/vc-table/composables/useTableSelection.d.ts.map +1 -1
  85. package/dist/ui/components/organisms/vc-table/composables/useTableState.d.ts +1 -1
  86. package/dist/ui/components/organisms/vc-table/composables/useTableState.d.ts.map +1 -1
  87. package/dist/ui/components/organisms/vc-table/types.d.ts +36 -0
  88. package/dist/ui/components/organisms/vc-table/types.d.ts.map +1 -0
  89. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +2 -34
  90. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  91. package/package.json +4 -4
  92. package/shared/components/generic-dropdown/generic-dropdown.vue +1 -1
  93. package/shared/components/settings-menu-item/settings-menu-item.vue +1 -6
  94. package/shared/components/user-dropdown-button/_internal/user-info.vue +3 -3
  95. package/ui/components/atoms/vc-icon/README.md +198 -220
  96. package/ui/components/atoms/vc-icon/composables/index.ts +2 -0
  97. package/ui/components/atoms/vc-icon/composables/use-icon-type.ts +83 -0
  98. package/ui/components/atoms/vc-icon/composables/use-icon.ts +129 -0
  99. package/ui/components/atoms/vc-icon/index.ts +1 -0
  100. package/ui/components/atoms/vc-icon/types.ts +36 -0
  101. package/ui/components/atoms/vc-icon/vc-bootstrap-icon.vue +111 -10
  102. package/ui/components/atoms/vc-icon/vc-fontawesome-icon.vue +119 -17
  103. package/ui/components/atoms/vc-icon/vc-icon-examples.vue +485 -124
  104. package/ui/components/atoms/vc-icon/vc-icon-test.vue +399 -209
  105. package/ui/components/atoms/vc-icon/vc-icon.stories.ts +502 -56
  106. package/ui/components/atoms/vc-icon/vc-icon.vue +240 -155
  107. package/ui/components/atoms/vc-icon/vc-lucide-icon.vue +163 -33
  108. package/ui/components/atoms/vc-icon/vc-material-icon.vue +136 -30
  109. package/ui/components/atoms/vc-icon/vc-svg-icon.vue +168 -0
  110. package/ui/components/atoms/vc-widget/vc-widget.stories.ts +13 -0
  111. package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +1 -1
  112. package/ui/components/molecules/vc-pagination/vc-pagination.vue +23 -14
  113. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue +2 -2
  114. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +2 -3
  115. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/props.ts +14 -0
  116. 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
  117. 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
  118. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +1 -1
  119. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +1 -1
  120. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-body/vc-table-body.vue +1 -1
  121. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-columns-header/vc-table-columns-header.vue +1 -1
  122. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-row/vc-table-row.vue +1 -1
  123. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue +1 -1
  124. package/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue +1 -1
  125. package/ui/components/organisms/vc-table/composables/useTableActions.ts +1 -1
  126. package/ui/components/organisms/vc-table/composables/useTableColumnReorder.ts +1 -1
  127. package/ui/components/organisms/vc-table/composables/useTableColumnResize.ts +1 -1
  128. package/ui/components/organisms/vc-table/composables/useTableRowReorder.ts +1 -1
  129. package/ui/components/organisms/vc-table/composables/useTableSelection.ts +1 -1
  130. package/ui/components/organisms/vc-table/composables/useTableState.ts +1 -1
  131. package/ui/components/organisms/vc-table/types.ts +32 -0
  132. 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
+ }
@@ -1,2 +1,3 @@
1
1
  export { default as VcIcon } from "./vc-icon.vue";
2
+ export * from "./types";
2
3
  export * from "./icons";
@@ -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 :class="[iconClass, variant ? `vc-icon_${variant}` : '']"></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
- export interface Props {
19
+ interface Props {
20
+ /**
21
+ * Bootstrap icon name (e.g. "bi-house" or "house")
22
+ */
9
23
  icon: string;
10
- size?: "xs" | "s" | "m" | "l" | "xl" | "xxl" | "xxxl";
11
- variant?: "warning" | "danger" | "success";
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
- // Normalize icon name to ensure it has the bi- prefix
19
- const normalizedIcon = computed(() => {
20
- if (!props.icon) return "bi-question";
21
- return props.icon.startsWith("bi-") ? props.icon : `bi-${props.icon}`;
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
- // Bootstrap Icons class
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
- return [`vc-icon`, `vc-icon_${props.size}`, normalizedIcon.value];
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 :class="iconClass"></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 "./vc-icon.vue";
16
+ import type { IconSize, IconVariant } from "./types";
17
+ import { useIcon } from "./composables";
8
18
 
9
- export interface Props {
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
- // Normalize the icon name to ensure a correct prefix
20
- const normalizedIcon = computed(() => {
21
- if (!props.icon) return "";
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
- // Handle cases where the icon is specified as "fa-icon-name" without the full prefix
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("fa-") &&
26
- !props.icon.startsWith("fas ") &&
27
- !props.icon.startsWith("far ") &&
28
- !props.icon.startsWith("fab ") &&
29
- !props.icon.startsWith("fal ") &&
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
- return props.icon;
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
- const iconClass = computed(() => {
39
- return [`vc-icon`, `vc-icon_${props.size}`, normalizedIcon.value, props.variant ? `vc-icon_${props.variant}` : ""];
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>