@genarou/blazir-icons 1.0.18 → 1.1.1
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/dist/DynamicIcon.svelte +42 -0
- package/dist/DynamicIcon.svelte.d.ts +7 -0
- package/dist/IconBase.svelte +61 -75
- package/dist/IconBase.svelte.d.ts +5 -2
- package/dist/actions.d.ts +21 -0
- package/dist/actions.js +150 -0
- package/dist/auto-inject.d.ts +1 -0
- package/dist/auto-inject.js +8 -0
- package/dist/effects/icon-effects.d.ts +5 -0
- package/dist/effects/icon-effects.js +222 -0
- package/dist/icons/AnimatedArrowLeft.svelte +8 -49
- package/dist/icons/AnimatedArrowLeft.svelte.d.ts +1 -1
- package/dist/icons/Aws.svelte +7 -49
- package/dist/icons/Aws.svelte.d.ts +1 -1
- package/dist/icons/Bag.svelte +5 -46
- package/dist/icons/Bag.svelte.d.ts +1 -1
- package/dist/icons/Bell.svelte +5 -43
- package/dist/icons/Bell.svelte.d.ts +1 -1
- package/dist/icons/Book.svelte +5 -44
- package/dist/icons/Book.svelte.d.ts +1 -1
- package/dist/icons/BoxAdd.svelte +5 -43
- package/dist/icons/BoxAdd.svelte.d.ts +1 -1
- package/dist/icons/Building.svelte +5 -43
- package/dist/icons/Building.svelte.d.ts +1 -1
- package/dist/icons/Buy.svelte +17 -0
- package/dist/icons/Buy.svelte.d.ts +3 -25
- package/dist/icons/Calendar.svelte +6 -49
- package/dist/icons/Calendar.svelte.d.ts +1 -1
- package/dist/icons/CalendarEdit.svelte +6 -46
- package/dist/icons/CalendarEdit.svelte.d.ts +1 -1
- package/dist/icons/CalendarPlus.svelte +6 -45
- package/dist/icons/CalendarPlus.svelte.d.ts +1 -1
- package/dist/icons/CategoryAdd.svelte +6 -43
- package/dist/icons/CategoryAdd.svelte.d.ts +1 -1
- package/dist/icons/CategorySearch.svelte +5 -43
- package/dist/icons/CategorySearch.svelte.d.ts +1 -1
- package/dist/icons/Chart.svelte +5 -43
- package/dist/icons/Chart.svelte.d.ts +1 -1
- package/dist/icons/ChartDoc.svelte +5 -44
- package/dist/icons/ChartDoc.svelte.d.ts +1 -1
- package/dist/icons/Check.svelte +6 -48
- package/dist/icons/Check.svelte.d.ts +1 -1
- package/dist/icons/CheckO.svelte +13 -56
- package/dist/icons/CheckO.svelte.d.ts +1 -1
- package/dist/icons/ChevronDown.svelte +6 -44
- package/dist/icons/ChevronDown.svelte.d.ts +1 -1
- package/dist/icons/ChevronUpDown.svelte +6 -45
- package/dist/icons/ChevronUpDown.svelte.d.ts +1 -1
- package/dist/icons/CircleCheck.svelte +12 -45
- package/dist/icons/CircleCheck.svelte.d.ts +1 -1
- package/dist/icons/CircleExclamation.svelte +5 -44
- package/dist/icons/CircleExclamation.svelte.d.ts +1 -1
- package/dist/icons/CircleInfo.svelte +12 -54
- package/dist/icons/CircleInfo.svelte.d.ts +1 -1
- package/dist/icons/CircleQuestion.svelte +5 -43
- package/dist/icons/CircleQuestion.svelte.d.ts +1 -1
- package/dist/icons/Close.svelte +6 -45
- package/dist/icons/Close.svelte.d.ts +1 -1
- package/dist/icons/CostIcon.svelte +5 -43
- package/dist/icons/CostIcon.svelte.d.ts +1 -1
- package/dist/icons/Dashboard.svelte +4 -43
- package/dist/icons/Dashboard.svelte.d.ts +1 -1
- package/dist/icons/Download.svelte +11 -51
- package/dist/icons/Download.svelte.d.ts +1 -1
- package/dist/icons/DownloadAnimated.svelte +59 -0
- package/dist/icons/DownloadAnimated.svelte.d.ts +4 -0
- package/dist/icons/EditOutline.svelte +6 -44
- package/dist/icons/EditOutline.svelte.d.ts +1 -1
- package/dist/icons/Email.svelte +6 -45
- package/dist/icons/Email.svelte.d.ts +1 -1
- package/dist/icons/EmailAnimated.svelte +61 -0
- package/dist/icons/EmailAnimated.svelte.d.ts +4 -0
- package/dist/icons/Enterprise.svelte +5 -45
- package/dist/icons/Enterprise.svelte.d.ts +1 -1
- package/dist/icons/Error.svelte +6 -47
- package/dist/icons/Error.svelte.d.ts +1 -1
- package/dist/icons/ErrorO.svelte +6 -45
- package/dist/icons/ErrorO.svelte.d.ts +1 -1
- package/dist/icons/Excel.svelte +13 -52
- package/dist/icons/Excel.svelte.d.ts +1 -1
- package/dist/icons/ExcelAnimated.svelte +40 -0
- package/dist/icons/ExcelAnimated.svelte.d.ts +4 -0
- package/dist/icons/Exchange.svelte +15 -0
- package/dist/icons/Exchange.svelte.d.ts +4 -0
- package/dist/icons/Eye.svelte +30 -60
- package/dist/icons/Eye.svelte.d.ts +1 -1
- package/dist/icons/EyeOff.svelte +71 -54
- package/dist/icons/EyeOff.svelte.d.ts +1 -1
- package/dist/icons/File.svelte +16 -0
- package/dist/icons/File.svelte.d.ts +4 -0
- package/dist/icons/FileUploadAnimated.svelte +69 -0
- package/dist/icons/FileUploadAnimated.svelte.d.ts +4 -0
- package/dist/icons/FilterOutline.svelte +10 -51
- package/dist/icons/FilterOutline.svelte.d.ts +1 -1
- package/dist/icons/FormatListGroup.svelte +6 -47
- package/dist/icons/FormatListGroup.svelte.d.ts +1 -1
- package/dist/icons/Golang.svelte +9 -43
- package/dist/icons/Golang.svelte.d.ts +1 -1
- package/dist/icons/Google.svelte +7 -45
- package/dist/icons/Google.svelte.d.ts +1 -1
- package/dist/icons/Group.svelte +7 -48
- package/dist/icons/Group.svelte.d.ts +1 -1
- package/dist/icons/Hamburguer.svelte +23 -47
- package/dist/icons/Hamburguer.svelte.d.ts +1 -1
- package/dist/icons/HandShake.svelte +6 -45
- package/dist/icons/HandShake.svelte.d.ts +1 -1
- package/dist/icons/Home.svelte +10 -42
- package/dist/icons/Home.svelte.d.ts +1 -1
- package/dist/icons/Image.svelte +24 -0
- package/dist/icons/Image.svelte.d.ts +4 -0
- package/dist/icons/ImageAnimated.svelte +71 -0
- package/dist/icons/ImageAnimated.svelte.d.ts +4 -0
- package/dist/icons/Key.svelte +6 -44
- package/dist/icons/Key.svelte.d.ts +1 -1
- package/dist/icons/List.svelte +5 -43
- package/dist/icons/List.svelte.d.ts +1 -1
- package/dist/icons/ListDots.svelte +5 -43
- package/dist/icons/ListDots.svelte.d.ts +1 -1
- package/dist/icons/LoadingDots.svelte +5 -43
- package/dist/icons/LoadingDots.svelte.d.ts +1 -1
- package/dist/icons/LoadingSquares.svelte +127 -0
- package/dist/icons/LoadingSquares.svelte.d.ts +8 -0
- package/dist/icons/Location.svelte +15 -0
- package/dist/icons/Location.svelte.d.ts +4 -0
- package/dist/icons/LocationAnimated.svelte +58 -0
- package/dist/icons/LocationAnimated.svelte.d.ts +4 -0
- package/dist/icons/Lock.svelte +5 -43
- package/dist/icons/Lock.svelte.d.ts +1 -1
- package/dist/icons/LockOpen.svelte +5 -44
- package/dist/icons/LockOpen.svelte.d.ts +1 -1
- package/dist/icons/Logout.svelte +6 -44
- package/dist/icons/Logout.svelte.d.ts +1 -1
- package/dist/icons/MagnifiyingGlass.svelte +5 -45
- package/dist/icons/MagnifiyingGlass.svelte.d.ts +1 -1
- package/dist/icons/MainComponent.svelte +6 -49
- package/dist/icons/MainComponent.svelte.d.ts +1 -1
- package/dist/icons/Measure.svelte +5 -48
- package/dist/icons/Measure.svelte.d.ts +1 -1
- package/dist/icons/Money.svelte +5 -45
- package/dist/icons/Money.svelte.d.ts +1 -1
- package/dist/icons/Notes.svelte +7 -48
- package/dist/icons/Notes.svelte.d.ts +1 -1
- package/dist/icons/ObjectGroup.svelte +22 -40
- package/dist/icons/ObjectGroup.svelte.d.ts +1 -1
- package/dist/icons/Pdf.svelte +35 -42
- package/dist/icons/Pdf.svelte.d.ts +1 -1
- package/dist/icons/Phone.svelte +24 -0
- package/dist/icons/Phone.svelte.d.ts +4 -0
- package/dist/icons/Plus.svelte +34 -40
- package/dist/icons/Plus.svelte.d.ts +1 -1
- package/dist/icons/PointSale.svelte +36 -40
- package/dist/icons/PointSale.svelte.d.ts +1 -1
- package/dist/icons/Product.svelte +33 -39
- package/dist/icons/Product.svelte.d.ts +1 -1
- package/dist/icons/Project.svelte +32 -37
- package/dist/icons/Project.svelte.d.ts +1 -1
- package/dist/icons/RegularSpinner.svelte +83 -0
- package/dist/icons/RegularSpinner.svelte.d.ts +9 -0
- package/dist/icons/RightArrow.svelte +35 -44
- package/dist/icons/RightArrow.svelte.d.ts +1 -1
- package/dist/icons/SafeSolid.svelte +35 -40
- package/dist/icons/SafeSolid.svelte.d.ts +1 -1
- package/dist/icons/Scan.svelte +34 -39
- package/dist/icons/Scan.svelte.d.ts +1 -1
- package/dist/icons/Search.svelte +34 -39
- package/dist/icons/Search.svelte.d.ts +1 -1
- package/dist/icons/Security.svelte +34 -39
- package/dist/icons/Security.svelte.d.ts +1 -1
- package/dist/icons/Settings.svelte +33 -40
- package/dist/icons/Settings.svelte.d.ts +1 -1
- package/dist/icons/SquareChart.svelte +25 -0
- package/dist/icons/SquareChart.svelte.d.ts +4 -0
- package/dist/icons/Supervisor.svelte +33 -42
- package/dist/icons/Supervisor.svelte.d.ts +1 -1
- package/dist/icons/Swap.svelte +36 -42
- package/dist/icons/Swap.svelte.d.ts +1 -1
- package/dist/icons/Table.svelte +37 -41
- package/dist/icons/Table.svelte.d.ts +1 -1
- package/dist/icons/Team.svelte +37 -41
- package/dist/icons/Team.svelte.d.ts +1 -1
- package/dist/icons/Trash.svelte +35 -41
- package/dist/icons/Trash.svelte.d.ts +1 -1
- package/dist/icons/TrashOutline.svelte +34 -53
- package/dist/icons/TrashOutline.svelte.d.ts +1 -1
- package/dist/icons/Truck.svelte +22 -46
- package/dist/icons/Truck.svelte.d.ts +1 -1
- package/dist/icons/TruckReturn.svelte +25 -49
- package/dist/icons/TruckReturn.svelte.d.ts +1 -1
- package/dist/icons/UpArrow.svelte +6 -56
- package/dist/icons/UpArrow.svelte.d.ts +1 -1
- package/dist/icons/UpDownArrow.svelte +11 -29
- package/dist/icons/UpDownArrow.svelte.d.ts +1 -1
- package/dist/icons/Upload.svelte +67 -0
- package/dist/icons/Upload.svelte.d.ts +4 -0
- package/dist/icons/UploadAnimated.svelte +61 -0
- package/dist/icons/UploadAnimated.svelte.d.ts +4 -0
- package/dist/icons/UploadLoader.svelte +67 -0
- package/dist/icons/UploadLoader.svelte.d.ts +4 -0
- package/dist/icons/User.svelte +5 -48
- package/dist/icons/User.svelte.d.ts +1 -1
- package/dist/icons/UserTie.svelte +5 -46
- package/dist/icons/UserTie.svelte.d.ts +1 -1
- package/dist/icons/Wallet.svelte +5 -51
- package/dist/icons/Wallet.svelte.d.ts +1 -1
- package/dist/icons/Warehouse.svelte +5 -44
- package/dist/icons/Warehouse.svelte.d.ts +1 -1
- package/dist/icons/Warning.svelte +5 -46
- package/dist/icons/Warning.svelte.d.ts +1 -1
- package/dist/icons/icon-bundle.d.ts +98 -82
- package/dist/icons/icon-bundle.js +27 -1
- package/dist/icons/icons-effects.css +26 -0
- package/dist/icons/injectEffects.d.ts +2 -0
- package/dist/icons/injectEffects.js +32 -0
- package/dist/icons/registry.d.ts +104 -81
- package/dist/icons/registry.js +34 -0
- package/dist/icons/types.d.ts +4 -0
- package/dist/index.d.ts +107 -3
- package/dist/index.js +112 -2
- package/dist/styles/animations.css +137 -0
- package/dist/styles/css-injection.d.ts +2 -0
- package/dist/styles/css-injection.js +5 -0
- package/dist/styles/hybrid-inject.d.ts +12 -0
- package/dist/styles/hybrid-inject.js +231 -0
- package/dist/types/env.d.ts +15 -0
- package/dist/types.d.ts +43 -1
- package/dist/utils/animations.d.ts +13 -0
- package/dist/utils/animations.js +107 -0
- package/dist/utils/defaults.d.ts +27 -0
- package/dist/utils/defaults.js +54 -0
- package/dist/utils/performance.d.ts +12 -0
- package/dist/utils/performance.js +26 -0
- package/package.json +4 -3
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { iconRegistry } from "./icons/registry.js";
|
|
3
|
+
import type { IconName, IconProps } from "./types.js";
|
|
4
|
+
|
|
5
|
+
// Props específicas del componente dinámico
|
|
6
|
+
interface DynamicIconProps extends Omit<IconProps, "children"> {
|
|
7
|
+
name: IconName;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const props: DynamicIconProps = $props();
|
|
11
|
+
|
|
12
|
+
// Obtener el componente del registry
|
|
13
|
+
const IconComponent = $derived(iconRegistry[props.name]);
|
|
14
|
+
|
|
15
|
+
// Extraer solo las props que necesita el icono (sin 'name')
|
|
16
|
+
const iconProps = $derived(() => {
|
|
17
|
+
const { name, ...rest } = props;
|
|
18
|
+
return rest;
|
|
19
|
+
});
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
// 📁 src/lib/DynamicIcon.svelte - Componente que usa el registry
|
|
23
|
+
{#if IconComponent}
|
|
24
|
+
<IconComponent {...iconProps} />
|
|
25
|
+
{:else}
|
|
26
|
+
<!-- Fallback si el icono no existe -->
|
|
27
|
+
<span class="missing-icon" data-icon={props.name}> ? </span>
|
|
28
|
+
{/if}
|
|
29
|
+
|
|
30
|
+
<style>
|
|
31
|
+
.missing-icon {
|
|
32
|
+
display: inline-block;
|
|
33
|
+
width: 1em;
|
|
34
|
+
height: 1em;
|
|
35
|
+
background: #ff0000;
|
|
36
|
+
color: white;
|
|
37
|
+
text-align: center;
|
|
38
|
+
line-height: 1;
|
|
39
|
+
font-size: 0.75em;
|
|
40
|
+
border-radius: 2px;
|
|
41
|
+
}
|
|
42
|
+
</style>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IconName, IconProps } from "./types.js";
|
|
2
|
+
interface DynamicIconProps extends Omit<IconProps, "children"> {
|
|
3
|
+
name: IconName;
|
|
4
|
+
}
|
|
5
|
+
declare const DynamicIcon: import("svelte").Component<DynamicIconProps, {}, "">;
|
|
6
|
+
type DynamicIcon = ReturnType<typeof DynamicIcon>;
|
|
7
|
+
export default DynamicIcon;
|
package/dist/IconBase.svelte
CHANGED
|
@@ -1,99 +1,85 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { IconProps } from "./types";
|
|
2
|
+
import type { IconMode, IconProps } from "./types.js";
|
|
3
|
+
import {
|
|
4
|
+
combineTransforms,
|
|
5
|
+
getAnimationClasses,
|
|
6
|
+
getAnimationStyle,
|
|
7
|
+
} from "./utils/animations.js";
|
|
8
|
+
import {
|
|
9
|
+
commonDefaults,
|
|
10
|
+
modeDefaults,
|
|
11
|
+
normalizeClass,
|
|
12
|
+
} from "./utils/defaults.js";
|
|
3
13
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
size = $bindable(24),
|
|
7
|
-
stroke = $bindable("currentColor"),
|
|
8
|
-
strokeWidth = $bindable(2),
|
|
9
|
-
fill = $bindable("none"),
|
|
10
|
-
className = $bindable(""),
|
|
11
|
-
ariaLabel = $bindable("icon"),
|
|
12
|
-
title = $bindable(""),
|
|
13
|
-
viewBox = $bindable("0 0 24 24"),
|
|
14
|
-
strokeLinecap = $bindable("round"),
|
|
15
|
-
strokeLinejoin = $bindable("round"),
|
|
16
|
-
style = $bindable(""),
|
|
17
|
-
rotate = $bindable(0),
|
|
18
|
-
flipH = $bindable(false),
|
|
19
|
-
flipV = $bindable(false),
|
|
20
|
-
spin = $bindable(false),
|
|
21
|
-
color = $bindable(undefined),
|
|
22
|
-
nonScalingStroke = $bindable(false),
|
|
23
|
-
preserveAspectRatio = $bindable("xMidYMid meet"),
|
|
24
|
-
decorative = $bindable(false),
|
|
25
|
-
titleId = $bindable(""),
|
|
26
|
-
testId = $bindable(undefined),
|
|
27
|
-
attrs = $bindable({}),
|
|
28
|
-
}: IconProps = $props();
|
|
14
|
+
const props: IconProps & { mode?: IconMode } = $props();
|
|
15
|
+
const mode = $derived(props.mode ?? "solid");
|
|
29
16
|
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
typeof strokeWidth === "string" ? parseFloat(strokeWidth) : strokeWidth
|
|
34
|
-
);
|
|
35
|
-
const _rotate = $derived(
|
|
36
|
-
typeof rotate === "number" ? `${rotate}deg` : rotate
|
|
37
|
-
);
|
|
38
|
-
const _flip = $derived(
|
|
39
|
-
`${flipH ? "scaleX(-1)" : ""} ${flipV ? "scaleY(-1)" : ""}`.trim()
|
|
40
|
-
);
|
|
41
|
-
const defaultGray = "#6b7280";
|
|
17
|
+
const klass = $derived(normalizeClass(props));
|
|
18
|
+
const common = $derived(commonDefaults(props));
|
|
19
|
+
const visual = $derived(modeDefaults(mode, props));
|
|
42
20
|
|
|
43
|
-
const
|
|
44
|
-
const
|
|
21
|
+
const animationClasses = $derived(getAnimationClasses(props).join(" "));
|
|
22
|
+
const baseTransform = $derived(combineTransforms(props));
|
|
23
|
+
const animationStyle = $derived(getAnimationStyle(props));
|
|
45
24
|
|
|
46
|
-
const
|
|
47
|
-
|
|
25
|
+
const ariaLabel = $derived(props.ariaLabel);
|
|
26
|
+
const title = $derived(props.title);
|
|
27
|
+
const titleId = $derived(props.titleId);
|
|
28
|
+
const _ariaHidden = $derived(props.decorative ? "true" : undefined);
|
|
29
|
+
const _ariaLabel = $derived(
|
|
30
|
+
props.decorative ? undefined : ariaLabel || undefined
|
|
48
31
|
);
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
);
|
|
52
|
-
const _style = $derived(
|
|
53
|
-
`${style ? style + ";" : ""}` +
|
|
54
|
-
`${_transform ? `transform: ${_transform}; transform-origin: center;` : ""}` +
|
|
55
|
-
`${_spinDur ? `animation: __icon_spin ${_spinDur} linear infinite;` : ""}`
|
|
32
|
+
const _ariaLabelledby = $derived(
|
|
33
|
+
!props.decorative && title ? titleId : undefined
|
|
56
34
|
);
|
|
57
35
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
36
|
+
const transformStr = $derived(() => {
|
|
37
|
+
return baseTransform
|
|
38
|
+
? `transform: ${baseTransform}; transform-origin: center;`
|
|
39
|
+
: "";
|
|
63
40
|
});
|
|
64
41
|
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
42
|
+
const spinStr = $derived(() => {
|
|
43
|
+
const s = props.spin;
|
|
44
|
+
if (!s) return "";
|
|
45
|
+
const dur = s === true ? "1s" : typeof s === "number" ? `${s}ms` : s;
|
|
46
|
+
return `animation: __icon_spin ${dur} linear infinite;`;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const style = $derived(
|
|
50
|
+
`${props.style || ""}${props.style && !props.style.endsWith(";") ? ";" : ""}${transformStr}${spinStr}${animationStyle}`.trim()
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const finalClass = $derived(
|
|
54
|
+
`${klass} ${animationClasses} ${props.chevronState ? "bz-icon-chevron" : ""}`.trim()
|
|
70
55
|
);
|
|
71
56
|
</script>
|
|
72
57
|
|
|
58
|
+
// 📁 src/lib/Icon.svelte
|
|
73
59
|
<svg
|
|
74
60
|
xmlns="http://www.w3.org/2000/svg"
|
|
75
|
-
width={
|
|
76
|
-
height={
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
stroke-linecap={strokeLinecap}
|
|
81
|
-
stroke-linejoin={strokeLinejoin}
|
|
82
|
-
{viewBox}
|
|
83
|
-
{preserveAspectRatio}
|
|
84
|
-
class={className}
|
|
61
|
+
width={typeof common.size === "number" ? `${common.size}px` : common.size}
|
|
62
|
+
height={typeof common.size === "number" ? `${common.size}px` : common.size}
|
|
63
|
+
viewBox={common.viewBox}
|
|
64
|
+
preserveAspectRatio={common.preserveAspectRatio}
|
|
65
|
+
class={finalClass}
|
|
85
66
|
role="img"
|
|
86
67
|
aria-hidden={_ariaHidden}
|
|
87
68
|
aria-label={_ariaLabel}
|
|
88
69
|
aria-labelledby={_ariaLabelledby}
|
|
89
70
|
focusable="false"
|
|
90
|
-
style
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
{
|
|
71
|
+
{style}
|
|
72
|
+
fill={visual.fill}
|
|
73
|
+
stroke={visual.stroke}
|
|
74
|
+
stroke-width={visual.strokeWidth}
|
|
75
|
+
stroke-linecap={props.strokeLinecap}
|
|
76
|
+
stroke-linejoin={props.strokeLinejoin}
|
|
77
|
+
vector-effect={props.nonScalingStroke ? "non-scaling-stroke" : undefined}
|
|
78
|
+
data-testid={props.testId}
|
|
79
|
+
{...props.attrs ?? {}}
|
|
94
80
|
>
|
|
95
|
-
{#if title}<title id={
|
|
96
|
-
{@render children
|
|
81
|
+
{#if title}<title id={titleId}>{title}</title>{/if}
|
|
82
|
+
{@render props.children()}
|
|
97
83
|
</svg>
|
|
98
84
|
|
|
99
85
|
<style>
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type { IconProps } from "./types";
|
|
2
|
-
|
|
1
|
+
import type { IconMode, IconProps } from "./types.js";
|
|
2
|
+
type $$ComponentProps = IconProps & {
|
|
3
|
+
mode?: IconMode;
|
|
4
|
+
};
|
|
5
|
+
declare const IconBase: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
3
6
|
type IconBase = ReturnType<typeof IconBase>;
|
|
4
7
|
export default IconBase;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type IconEffectOptions = {
|
|
2
|
+
hoverColor?: string;
|
|
3
|
+
activeColor?: string;
|
|
4
|
+
hoverScale?: number;
|
|
5
|
+
pressScale?: number;
|
|
6
|
+
rotateOnHover?: number;
|
|
7
|
+
spinOnHover?: boolean;
|
|
8
|
+
bounceOnHover?: boolean;
|
|
9
|
+
pulse?: boolean;
|
|
10
|
+
opacityHover?: number;
|
|
11
|
+
transitionMs?: number;
|
|
12
|
+
easing?: string;
|
|
13
|
+
cursor?: string;
|
|
14
|
+
tooltip?: string;
|
|
15
|
+
focusRing?: boolean;
|
|
16
|
+
kbFocusAttr?: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function iconEffects(node: HTMLElement, opts?: IconEffectOptions): {
|
|
19
|
+
update(next?: IconEffectOptions): void;
|
|
20
|
+
destroy(): void;
|
|
21
|
+
};
|
package/dist/actions.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// Cache global para media query
|
|
2
|
+
let _prefersReducedMotion = null;
|
|
3
|
+
function getPrefersReducedMotion() {
|
|
4
|
+
if (_prefersReducedMotion === null && typeof window !== "undefined") {
|
|
5
|
+
_prefersReducedMotion =
|
|
6
|
+
window.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false;
|
|
7
|
+
}
|
|
8
|
+
return _prefersReducedMotion ?? false;
|
|
9
|
+
}
|
|
10
|
+
// Pool de transiciones comunes
|
|
11
|
+
const EASING_PRESETS = {
|
|
12
|
+
"cubic-bezier(.2,.8,.2,1)": "cubic-bezier(.2,.8,.2,1)",
|
|
13
|
+
ease: "ease",
|
|
14
|
+
"ease-in-out": "ease-in-out",
|
|
15
|
+
};
|
|
16
|
+
export function iconEffects(node, opts = {}) {
|
|
17
|
+
// Setup inicial con defaults optimizados
|
|
18
|
+
const o = {
|
|
19
|
+
hoverColor: opts.hoverColor ?? "",
|
|
20
|
+
activeColor: opts.activeColor ?? "",
|
|
21
|
+
hoverScale: opts.hoverScale ?? 1,
|
|
22
|
+
pressScale: opts.pressScale ?? 1,
|
|
23
|
+
rotateOnHover: opts.rotateOnHover ?? 0,
|
|
24
|
+
spinOnHover: opts.spinOnHover ?? false,
|
|
25
|
+
bounceOnHover: opts.bounceOnHover ?? false,
|
|
26
|
+
pulse: opts.pulse ?? false,
|
|
27
|
+
opacityHover: opts.opacityHover ?? 1,
|
|
28
|
+
transitionMs: opts.transitionMs ?? 160,
|
|
29
|
+
easing: opts.easing ?? "cubic-bezier(.2,.8,.2,1)",
|
|
30
|
+
cursor: opts.cursor ?? "",
|
|
31
|
+
tooltip: opts.tooltip ?? "",
|
|
32
|
+
focusRing: opts.focusRing ?? true,
|
|
33
|
+
kbFocusAttr: opts.kbFocusAttr ?? "data-bz-kb-focus",
|
|
34
|
+
};
|
|
35
|
+
// Setup inicial - batching de propiedades
|
|
36
|
+
const initialProps = {};
|
|
37
|
+
if (o.tooltip)
|
|
38
|
+
node.setAttribute("title", o.tooltip);
|
|
39
|
+
if (o.cursor)
|
|
40
|
+
initialProps.cursor = o.cursor;
|
|
41
|
+
// Pre-calcular transición una sola vez
|
|
42
|
+
const prefersReducedMotion = getPrefersReducedMotion();
|
|
43
|
+
const baseTransition = prefersReducedMotion ? "0ms" : `${o.transitionMs}ms`;
|
|
44
|
+
const easing = EASING_PRESETS[o.easing] ?? o.easing;
|
|
45
|
+
initialProps.transition = `transform ${baseTransition} ${easing}, opacity ${baseTransition} ${easing}, color ${baseTransition} ${easing}, fill ${baseTransition} ${easing}, stroke ${baseTransition} ${easing}`;
|
|
46
|
+
// Aplicar todas las propiedades iniciales de una vez
|
|
47
|
+
Object.assign(node.style, initialProps);
|
|
48
|
+
// Pulso inicial
|
|
49
|
+
if (o.pulse && !prefersReducedMotion) {
|
|
50
|
+
node.classList.add("bz-icon-pulse");
|
|
51
|
+
}
|
|
52
|
+
// Focus ring handlers optimizados
|
|
53
|
+
function onKeydown(e) {
|
|
54
|
+
if (!o.focusRing || e.key !== "Tab")
|
|
55
|
+
return;
|
|
56
|
+
node.setAttribute(o.kbFocusAttr, "true");
|
|
57
|
+
}
|
|
58
|
+
function onMousedown() {
|
|
59
|
+
if (!o.focusRing)
|
|
60
|
+
return;
|
|
61
|
+
node.removeAttribute(o.kbFocusAttr);
|
|
62
|
+
}
|
|
63
|
+
// Estado de interacción
|
|
64
|
+
let hovering = false;
|
|
65
|
+
let pressing = false;
|
|
66
|
+
let rafId = 0;
|
|
67
|
+
// Helper para animaciones CSS optimizado
|
|
68
|
+
const setAnim = (enable, className) => {
|
|
69
|
+
if (prefersReducedMotion)
|
|
70
|
+
return;
|
|
71
|
+
node.classList.toggle(className, enable);
|
|
72
|
+
};
|
|
73
|
+
// Aplicar cambios visuales con RAF para evitar layout thrashing
|
|
74
|
+
function applyVisual() {
|
|
75
|
+
cancelAnimationFrame(rafId);
|
|
76
|
+
rafId = requestAnimationFrame(() => {
|
|
77
|
+
// Pre-calcular todos los valores
|
|
78
|
+
const parts = [];
|
|
79
|
+
if (hovering && o.rotateOnHover) {
|
|
80
|
+
parts.push(`rotate(${o.rotateOnHover}deg)`);
|
|
81
|
+
}
|
|
82
|
+
const scale = hovering ? (pressing ? o.pressScale : o.hoverScale) : 1;
|
|
83
|
+
if (scale !== 1) {
|
|
84
|
+
parts.push(`scale(${scale})`);
|
|
85
|
+
}
|
|
86
|
+
const transform = parts.length ? parts.join(" ") : "";
|
|
87
|
+
const opacity = hovering ? String(o.opacityHover) : "1";
|
|
88
|
+
const color = pressing && o.activeColor
|
|
89
|
+
? o.activeColor
|
|
90
|
+
: hovering && o.hoverColor
|
|
91
|
+
? o.hoverColor
|
|
92
|
+
: "";
|
|
93
|
+
// Batching de todas las propiedades de estilo
|
|
94
|
+
const styleUpdates = {
|
|
95
|
+
transform,
|
|
96
|
+
opacity,
|
|
97
|
+
};
|
|
98
|
+
if (color !== "") {
|
|
99
|
+
styleUpdates.color = color;
|
|
100
|
+
}
|
|
101
|
+
else if (node.style.color) {
|
|
102
|
+
styleUpdates.color = "";
|
|
103
|
+
}
|
|
104
|
+
Object.assign(node.style, styleUpdates);
|
|
105
|
+
// Animaciones CSS
|
|
106
|
+
setAnim(hovering && o.spinOnHover, "bz-icon-spin");
|
|
107
|
+
setAnim(hovering && o.bounceOnHover, "bz-icon-bounce");
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Event handlers optimizados
|
|
111
|
+
function onEnter() {
|
|
112
|
+
hovering = true;
|
|
113
|
+
applyVisual();
|
|
114
|
+
}
|
|
115
|
+
function onLeave() {
|
|
116
|
+
hovering = false;
|
|
117
|
+
pressing = false;
|
|
118
|
+
applyVisual();
|
|
119
|
+
}
|
|
120
|
+
function onDown() {
|
|
121
|
+
pressing = true;
|
|
122
|
+
applyVisual();
|
|
123
|
+
}
|
|
124
|
+
function onUp() {
|
|
125
|
+
pressing = false;
|
|
126
|
+
applyVisual();
|
|
127
|
+
}
|
|
128
|
+
// Event listeners
|
|
129
|
+
node.addEventListener("pointerenter", onEnter, { passive: true });
|
|
130
|
+
node.addEventListener("pointerleave", onLeave, { passive: true });
|
|
131
|
+
node.addEventListener("pointerdown", onDown, { passive: true });
|
|
132
|
+
node.addEventListener("pointerup", onUp, { passive: true });
|
|
133
|
+
node.addEventListener("keydown", onKeydown, { passive: true });
|
|
134
|
+
node.addEventListener("mousedown", onMousedown, { passive: true });
|
|
135
|
+
return {
|
|
136
|
+
update(next) {
|
|
137
|
+
Object.assign(o, next);
|
|
138
|
+
applyVisual();
|
|
139
|
+
},
|
|
140
|
+
destroy() {
|
|
141
|
+
cancelAnimationFrame(rafId);
|
|
142
|
+
node.removeEventListener("pointerenter", onEnter);
|
|
143
|
+
node.removeEventListener("pointerleave", onLeave);
|
|
144
|
+
node.addEventListener("pointerdown", onDown);
|
|
145
|
+
node.removeEventListener("pointerup", onUp);
|
|
146
|
+
node.removeEventListener("keydown", onKeydown);
|
|
147
|
+
node.removeEventListener("mousedown", onMousedown);
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { batchStyleUpdates, getPrefersReducedMotion, optimizeEasing, } from "../utils/performance.js";
|
|
2
|
+
export function iconEffects(node, opts = {}) {
|
|
3
|
+
// 🎯 SIMPLE: Variables directas sin Required<> ni tipos complejos
|
|
4
|
+
let hoverColor = opts.hoverColor ?? "";
|
|
5
|
+
let activeColor = opts.activeColor ?? "";
|
|
6
|
+
let hoverScale = opts.hoverScale ?? 1;
|
|
7
|
+
let pressScale = opts.pressScale ?? 1;
|
|
8
|
+
let rotateOnHover = opts.rotateOnHover ?? 0;
|
|
9
|
+
let opacityHover = opts.opacityHover ?? 1;
|
|
10
|
+
let spinOnHover = opts.spinOnHover ?? false;
|
|
11
|
+
let bounceOnHover = opts.bounceOnHover ?? false;
|
|
12
|
+
let wiggleOnHover = opts.wiggleOnHover ?? false;
|
|
13
|
+
let slideOnHover = opts.slideOnHover; // undefined está perfectamente OK
|
|
14
|
+
let morphOnHover = opts.morphOnHover; // undefined está perfectamente OK
|
|
15
|
+
let elasticOnClick = opts.elasticOnClick ?? false;
|
|
16
|
+
let heartbeatOnActive = opts.heartbeatOnActive ?? false;
|
|
17
|
+
let pulse = opts.pulse ?? false;
|
|
18
|
+
let transitionMs = opts.transitionMs ?? 160;
|
|
19
|
+
let easing = opts.easing ?? "cubic-bezier(.2,.8,.2,1)";
|
|
20
|
+
let cursor = opts.cursor ?? "";
|
|
21
|
+
let tooltip = opts.tooltip ?? "";
|
|
22
|
+
let focusRing = opts.focusRing ?? true;
|
|
23
|
+
let kbFocusAttr = opts.kbFocusAttr ?? "data-bz-kb-focus";
|
|
24
|
+
const prefersReducedMotion = getPrefersReducedMotion();
|
|
25
|
+
// Setup inicial
|
|
26
|
+
const initialProps = {};
|
|
27
|
+
if (tooltip)
|
|
28
|
+
node.setAttribute("title", tooltip);
|
|
29
|
+
if (cursor)
|
|
30
|
+
initialProps.cursor = cursor;
|
|
31
|
+
const baseTransition = prefersReducedMotion ? "0ms" : `${transitionMs}ms`;
|
|
32
|
+
const optimizedEasing = optimizeEasing(easing);
|
|
33
|
+
initialProps.transition = `transform ${baseTransition} ${optimizedEasing}, opacity ${baseTransition} ${optimizedEasing}, color ${baseTransition} ${optimizedEasing}, fill ${baseTransition} ${optimizedEasing}, stroke ${baseTransition} ${optimizedEasing}`;
|
|
34
|
+
batchStyleUpdates(node, initialProps);
|
|
35
|
+
if (pulse && !prefersReducedMotion) {
|
|
36
|
+
node.classList.add("bz-icon-pulse");
|
|
37
|
+
}
|
|
38
|
+
// Estado de interacción
|
|
39
|
+
let hovering = false;
|
|
40
|
+
let pressing = false;
|
|
41
|
+
let rafId = 0;
|
|
42
|
+
const setAnimClass = (className, enable) => {
|
|
43
|
+
if (prefersReducedMotion)
|
|
44
|
+
return;
|
|
45
|
+
node.classList.toggle(className, enable);
|
|
46
|
+
};
|
|
47
|
+
function applyVisual() {
|
|
48
|
+
cancelAnimationFrame(rafId);
|
|
49
|
+
rafId = requestAnimationFrame(() => {
|
|
50
|
+
const parts = [];
|
|
51
|
+
// Rotación en hover
|
|
52
|
+
if (hovering && rotateOnHover) {
|
|
53
|
+
parts.push(`rotate(${rotateOnHover}deg)`);
|
|
54
|
+
}
|
|
55
|
+
// Escala según estado
|
|
56
|
+
const scale = hovering ? (pressing ? pressScale : hoverScale) : 1;
|
|
57
|
+
if (scale !== 1) {
|
|
58
|
+
parts.push(`scale(${scale})`);
|
|
59
|
+
}
|
|
60
|
+
// Slide en hover - undefined está OK, se evalúa como falsy
|
|
61
|
+
if (hovering && slideOnHover) {
|
|
62
|
+
const slideMap = {
|
|
63
|
+
up: "translateY(-4px)",
|
|
64
|
+
down: "translateY(4px)",
|
|
65
|
+
left: "translateX(-4px)",
|
|
66
|
+
right: "translateX(4px)",
|
|
67
|
+
};
|
|
68
|
+
parts.push(slideMap[slideOnHover]);
|
|
69
|
+
}
|
|
70
|
+
// Aplicar transform
|
|
71
|
+
const transform = parts.length ? parts.join(" ") : "";
|
|
72
|
+
const opacity = hovering ? String(opacityHover) : "1";
|
|
73
|
+
// Colores
|
|
74
|
+
const color = pressing && activeColor
|
|
75
|
+
? activeColor
|
|
76
|
+
: hovering && hoverColor
|
|
77
|
+
? hoverColor
|
|
78
|
+
: "";
|
|
79
|
+
// Batching de estilos
|
|
80
|
+
const styleUpdates = {
|
|
81
|
+
transform,
|
|
82
|
+
opacity,
|
|
83
|
+
};
|
|
84
|
+
if (color !== "") {
|
|
85
|
+
styleUpdates.color = color;
|
|
86
|
+
}
|
|
87
|
+
else if (node.style.color) {
|
|
88
|
+
styleUpdates.color = "";
|
|
89
|
+
}
|
|
90
|
+
batchStyleUpdates(node, styleUpdates);
|
|
91
|
+
// Animaciones CSS
|
|
92
|
+
setAnimClass("bz-icon-spin", hovering && spinOnHover);
|
|
93
|
+
setAnimClass("bz-icon-bounce", hovering && bounceOnHover);
|
|
94
|
+
setAnimClass("bz-icon-wiggle", hovering && wiggleOnHover);
|
|
95
|
+
setAnimClass("bz-icon-heartbeat", pressing && heartbeatOnActive);
|
|
96
|
+
setAnimClass("bz-icon-elastic", pressing && elasticOnClick);
|
|
97
|
+
// Morph en hover - undefined está OK, se evalúa como falsy
|
|
98
|
+
if (morphOnHover) {
|
|
99
|
+
setAnimClass(`bz-icon-morph-${morphOnHover}`, hovering);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Event handlers
|
|
104
|
+
function onEnter() {
|
|
105
|
+
hovering = true;
|
|
106
|
+
applyVisual();
|
|
107
|
+
}
|
|
108
|
+
function onLeave() {
|
|
109
|
+
hovering = false;
|
|
110
|
+
pressing = false;
|
|
111
|
+
applyVisual();
|
|
112
|
+
}
|
|
113
|
+
function onDown() {
|
|
114
|
+
pressing = true;
|
|
115
|
+
applyVisual();
|
|
116
|
+
}
|
|
117
|
+
function onUp() {
|
|
118
|
+
pressing = false;
|
|
119
|
+
applyVisual();
|
|
120
|
+
}
|
|
121
|
+
function onKeydown(e) {
|
|
122
|
+
if (!focusRing || e.key !== "Tab")
|
|
123
|
+
return;
|
|
124
|
+
node.setAttribute(kbFocusAttr, "true");
|
|
125
|
+
}
|
|
126
|
+
function onMousedown() {
|
|
127
|
+
if (!focusRing)
|
|
128
|
+
return;
|
|
129
|
+
node.removeAttribute(kbFocusAttr);
|
|
130
|
+
}
|
|
131
|
+
// Event listeners
|
|
132
|
+
node.addEventListener("pointerenter", onEnter, { passive: true });
|
|
133
|
+
node.addEventListener("pointerleave", onLeave, { passive: true });
|
|
134
|
+
node.addEventListener("pointerdown", onDown, { passive: true });
|
|
135
|
+
node.addEventListener("pointerup", onUp, { passive: true });
|
|
136
|
+
node.addEventListener("keydown", onKeydown, { passive: true });
|
|
137
|
+
node.addEventListener("mousedown", onMousedown, { passive: true });
|
|
138
|
+
return {
|
|
139
|
+
update(next) {
|
|
140
|
+
// 🎯 SIMPLE: Actualizar cada variable directamente
|
|
141
|
+
if (next) {
|
|
142
|
+
if (next.hoverColor !== undefined)
|
|
143
|
+
hoverColor = next.hoverColor;
|
|
144
|
+
if (next.activeColor !== undefined)
|
|
145
|
+
activeColor = next.activeColor;
|
|
146
|
+
if (next.hoverScale !== undefined)
|
|
147
|
+
hoverScale = next.hoverScale;
|
|
148
|
+
if (next.pressScale !== undefined)
|
|
149
|
+
pressScale = next.pressScale;
|
|
150
|
+
if (next.rotateOnHover !== undefined)
|
|
151
|
+
rotateOnHover = next.rotateOnHover;
|
|
152
|
+
if (next.opacityHover !== undefined)
|
|
153
|
+
opacityHover = next.opacityHover;
|
|
154
|
+
if (next.spinOnHover !== undefined)
|
|
155
|
+
spinOnHover = next.spinOnHover;
|
|
156
|
+
if (next.bounceOnHover !== undefined)
|
|
157
|
+
bounceOnHover = next.bounceOnHover;
|
|
158
|
+
if (next.wiggleOnHover !== undefined)
|
|
159
|
+
wiggleOnHover = next.wiggleOnHover;
|
|
160
|
+
if (next.slideOnHover !== undefined)
|
|
161
|
+
slideOnHover = next.slideOnHover;
|
|
162
|
+
if (next.morphOnHover !== undefined)
|
|
163
|
+
morphOnHover = next.morphOnHover;
|
|
164
|
+
if (next.elasticOnClick !== undefined)
|
|
165
|
+
elasticOnClick = next.elasticOnClick;
|
|
166
|
+
if (next.heartbeatOnActive !== undefined)
|
|
167
|
+
heartbeatOnActive = next.heartbeatOnActive;
|
|
168
|
+
if (next.pulse !== undefined)
|
|
169
|
+
pulse = next.pulse;
|
|
170
|
+
if (next.transitionMs !== undefined)
|
|
171
|
+
transitionMs = next.transitionMs;
|
|
172
|
+
if (next.easing !== undefined)
|
|
173
|
+
easing = next.easing;
|
|
174
|
+
if (next.cursor !== undefined)
|
|
175
|
+
cursor = next.cursor;
|
|
176
|
+
if (next.tooltip !== undefined)
|
|
177
|
+
tooltip = next.tooltip;
|
|
178
|
+
if (next.focusRing !== undefined)
|
|
179
|
+
focusRing = next.focusRing;
|
|
180
|
+
if (next.kbFocusAttr !== undefined)
|
|
181
|
+
kbFocusAttr = next.kbFocusAttr;
|
|
182
|
+
// Re-aplicar setup si es necesario
|
|
183
|
+
if (next.tooltip !== undefined) {
|
|
184
|
+
if (tooltip) {
|
|
185
|
+
node.setAttribute("title", tooltip);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
node.removeAttribute("title");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (next.cursor !== undefined) {
|
|
192
|
+
node.style.cursor = cursor;
|
|
193
|
+
}
|
|
194
|
+
if (next.transitionMs !== undefined || next.easing !== undefined) {
|
|
195
|
+
const newBaseTransition = prefersReducedMotion
|
|
196
|
+
? "0ms"
|
|
197
|
+
: `${transitionMs}ms`;
|
|
198
|
+
const newOptimizedEasing = optimizeEasing(easing);
|
|
199
|
+
node.style.transition = `transform ${newBaseTransition} ${newOptimizedEasing}, opacity ${newBaseTransition} ${newOptimizedEasing}, color ${newBaseTransition} ${newOptimizedEasing}, fill ${newBaseTransition} ${newOptimizedEasing}, stroke ${newBaseTransition} ${newOptimizedEasing}`;
|
|
200
|
+
}
|
|
201
|
+
if (next.pulse !== undefined) {
|
|
202
|
+
if (pulse && !prefersReducedMotion) {
|
|
203
|
+
node.classList.add("bz-icon-pulse");
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
node.classList.remove("bz-icon-pulse");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
applyVisual();
|
|
211
|
+
},
|
|
212
|
+
destroy() {
|
|
213
|
+
cancelAnimationFrame(rafId);
|
|
214
|
+
node.removeEventListener("pointerenter", onEnter);
|
|
215
|
+
node.removeEventListener("pointerleave", onLeave);
|
|
216
|
+
node.removeEventListener("pointerdown", onDown);
|
|
217
|
+
node.removeEventListener("pointerup", onUp);
|
|
218
|
+
node.removeEventListener("keydown", onKeydown);
|
|
219
|
+
node.removeEventListener("mousedown", onMousedown);
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
}
|