@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.
Files changed (232) hide show
  1. package/dist/DynamicIcon.svelte +42 -0
  2. package/dist/DynamicIcon.svelte.d.ts +7 -0
  3. package/dist/IconBase.svelte +61 -75
  4. package/dist/IconBase.svelte.d.ts +5 -2
  5. package/dist/actions.d.ts +21 -0
  6. package/dist/actions.js +150 -0
  7. package/dist/auto-inject.d.ts +1 -0
  8. package/dist/auto-inject.js +8 -0
  9. package/dist/effects/icon-effects.d.ts +5 -0
  10. package/dist/effects/icon-effects.js +222 -0
  11. package/dist/icons/AnimatedArrowLeft.svelte +8 -49
  12. package/dist/icons/AnimatedArrowLeft.svelte.d.ts +1 -1
  13. package/dist/icons/Aws.svelte +7 -49
  14. package/dist/icons/Aws.svelte.d.ts +1 -1
  15. package/dist/icons/Bag.svelte +5 -46
  16. package/dist/icons/Bag.svelte.d.ts +1 -1
  17. package/dist/icons/Bell.svelte +5 -43
  18. package/dist/icons/Bell.svelte.d.ts +1 -1
  19. package/dist/icons/Book.svelte +5 -44
  20. package/dist/icons/Book.svelte.d.ts +1 -1
  21. package/dist/icons/BoxAdd.svelte +5 -43
  22. package/dist/icons/BoxAdd.svelte.d.ts +1 -1
  23. package/dist/icons/Building.svelte +5 -43
  24. package/dist/icons/Building.svelte.d.ts +1 -1
  25. package/dist/icons/Buy.svelte +17 -0
  26. package/dist/icons/Buy.svelte.d.ts +3 -25
  27. package/dist/icons/Calendar.svelte +6 -49
  28. package/dist/icons/Calendar.svelte.d.ts +1 -1
  29. package/dist/icons/CalendarEdit.svelte +6 -46
  30. package/dist/icons/CalendarEdit.svelte.d.ts +1 -1
  31. package/dist/icons/CalendarPlus.svelte +6 -45
  32. package/dist/icons/CalendarPlus.svelte.d.ts +1 -1
  33. package/dist/icons/CategoryAdd.svelte +6 -43
  34. package/dist/icons/CategoryAdd.svelte.d.ts +1 -1
  35. package/dist/icons/CategorySearch.svelte +5 -43
  36. package/dist/icons/CategorySearch.svelte.d.ts +1 -1
  37. package/dist/icons/Chart.svelte +5 -43
  38. package/dist/icons/Chart.svelte.d.ts +1 -1
  39. package/dist/icons/ChartDoc.svelte +5 -44
  40. package/dist/icons/ChartDoc.svelte.d.ts +1 -1
  41. package/dist/icons/Check.svelte +6 -48
  42. package/dist/icons/Check.svelte.d.ts +1 -1
  43. package/dist/icons/CheckO.svelte +13 -56
  44. package/dist/icons/CheckO.svelte.d.ts +1 -1
  45. package/dist/icons/ChevronDown.svelte +6 -44
  46. package/dist/icons/ChevronDown.svelte.d.ts +1 -1
  47. package/dist/icons/ChevronUpDown.svelte +6 -45
  48. package/dist/icons/ChevronUpDown.svelte.d.ts +1 -1
  49. package/dist/icons/CircleCheck.svelte +12 -45
  50. package/dist/icons/CircleCheck.svelte.d.ts +1 -1
  51. package/dist/icons/CircleExclamation.svelte +5 -44
  52. package/dist/icons/CircleExclamation.svelte.d.ts +1 -1
  53. package/dist/icons/CircleInfo.svelte +12 -54
  54. package/dist/icons/CircleInfo.svelte.d.ts +1 -1
  55. package/dist/icons/CircleQuestion.svelte +5 -43
  56. package/dist/icons/CircleQuestion.svelte.d.ts +1 -1
  57. package/dist/icons/Close.svelte +6 -45
  58. package/dist/icons/Close.svelte.d.ts +1 -1
  59. package/dist/icons/CostIcon.svelte +5 -43
  60. package/dist/icons/CostIcon.svelte.d.ts +1 -1
  61. package/dist/icons/Dashboard.svelte +4 -43
  62. package/dist/icons/Dashboard.svelte.d.ts +1 -1
  63. package/dist/icons/Download.svelte +11 -51
  64. package/dist/icons/Download.svelte.d.ts +1 -1
  65. package/dist/icons/DownloadAnimated.svelte +59 -0
  66. package/dist/icons/DownloadAnimated.svelte.d.ts +4 -0
  67. package/dist/icons/EditOutline.svelte +6 -44
  68. package/dist/icons/EditOutline.svelte.d.ts +1 -1
  69. package/dist/icons/Email.svelte +6 -45
  70. package/dist/icons/Email.svelte.d.ts +1 -1
  71. package/dist/icons/EmailAnimated.svelte +61 -0
  72. package/dist/icons/EmailAnimated.svelte.d.ts +4 -0
  73. package/dist/icons/Enterprise.svelte +5 -45
  74. package/dist/icons/Enterprise.svelte.d.ts +1 -1
  75. package/dist/icons/Error.svelte +6 -47
  76. package/dist/icons/Error.svelte.d.ts +1 -1
  77. package/dist/icons/ErrorO.svelte +6 -45
  78. package/dist/icons/ErrorO.svelte.d.ts +1 -1
  79. package/dist/icons/Excel.svelte +13 -52
  80. package/dist/icons/Excel.svelte.d.ts +1 -1
  81. package/dist/icons/ExcelAnimated.svelte +40 -0
  82. package/dist/icons/ExcelAnimated.svelte.d.ts +4 -0
  83. package/dist/icons/Exchange.svelte +15 -0
  84. package/dist/icons/Exchange.svelte.d.ts +4 -0
  85. package/dist/icons/Eye.svelte +30 -60
  86. package/dist/icons/Eye.svelte.d.ts +1 -1
  87. package/dist/icons/EyeOff.svelte +71 -54
  88. package/dist/icons/EyeOff.svelte.d.ts +1 -1
  89. package/dist/icons/File.svelte +16 -0
  90. package/dist/icons/File.svelte.d.ts +4 -0
  91. package/dist/icons/FileUploadAnimated.svelte +69 -0
  92. package/dist/icons/FileUploadAnimated.svelte.d.ts +4 -0
  93. package/dist/icons/FilterOutline.svelte +10 -51
  94. package/dist/icons/FilterOutline.svelte.d.ts +1 -1
  95. package/dist/icons/FormatListGroup.svelte +6 -47
  96. package/dist/icons/FormatListGroup.svelte.d.ts +1 -1
  97. package/dist/icons/Golang.svelte +9 -43
  98. package/dist/icons/Golang.svelte.d.ts +1 -1
  99. package/dist/icons/Google.svelte +7 -45
  100. package/dist/icons/Google.svelte.d.ts +1 -1
  101. package/dist/icons/Group.svelte +7 -48
  102. package/dist/icons/Group.svelte.d.ts +1 -1
  103. package/dist/icons/Hamburguer.svelte +23 -47
  104. package/dist/icons/Hamburguer.svelte.d.ts +1 -1
  105. package/dist/icons/HandShake.svelte +6 -45
  106. package/dist/icons/HandShake.svelte.d.ts +1 -1
  107. package/dist/icons/Home.svelte +10 -42
  108. package/dist/icons/Home.svelte.d.ts +1 -1
  109. package/dist/icons/Image.svelte +24 -0
  110. package/dist/icons/Image.svelte.d.ts +4 -0
  111. package/dist/icons/ImageAnimated.svelte +71 -0
  112. package/dist/icons/ImageAnimated.svelte.d.ts +4 -0
  113. package/dist/icons/Key.svelte +6 -44
  114. package/dist/icons/Key.svelte.d.ts +1 -1
  115. package/dist/icons/List.svelte +5 -43
  116. package/dist/icons/List.svelte.d.ts +1 -1
  117. package/dist/icons/ListDots.svelte +5 -43
  118. package/dist/icons/ListDots.svelte.d.ts +1 -1
  119. package/dist/icons/LoadingDots.svelte +5 -43
  120. package/dist/icons/LoadingDots.svelte.d.ts +1 -1
  121. package/dist/icons/LoadingSquares.svelte +127 -0
  122. package/dist/icons/LoadingSquares.svelte.d.ts +8 -0
  123. package/dist/icons/Location.svelte +15 -0
  124. package/dist/icons/Location.svelte.d.ts +4 -0
  125. package/dist/icons/LocationAnimated.svelte +58 -0
  126. package/dist/icons/LocationAnimated.svelte.d.ts +4 -0
  127. package/dist/icons/Lock.svelte +5 -43
  128. package/dist/icons/Lock.svelte.d.ts +1 -1
  129. package/dist/icons/LockOpen.svelte +5 -44
  130. package/dist/icons/LockOpen.svelte.d.ts +1 -1
  131. package/dist/icons/Logout.svelte +6 -44
  132. package/dist/icons/Logout.svelte.d.ts +1 -1
  133. package/dist/icons/MagnifiyingGlass.svelte +5 -45
  134. package/dist/icons/MagnifiyingGlass.svelte.d.ts +1 -1
  135. package/dist/icons/MainComponent.svelte +6 -49
  136. package/dist/icons/MainComponent.svelte.d.ts +1 -1
  137. package/dist/icons/Measure.svelte +5 -48
  138. package/dist/icons/Measure.svelte.d.ts +1 -1
  139. package/dist/icons/Money.svelte +5 -45
  140. package/dist/icons/Money.svelte.d.ts +1 -1
  141. package/dist/icons/Notes.svelte +7 -48
  142. package/dist/icons/Notes.svelte.d.ts +1 -1
  143. package/dist/icons/ObjectGroup.svelte +22 -40
  144. package/dist/icons/ObjectGroup.svelte.d.ts +1 -1
  145. package/dist/icons/Pdf.svelte +35 -42
  146. package/dist/icons/Pdf.svelte.d.ts +1 -1
  147. package/dist/icons/Phone.svelte +24 -0
  148. package/dist/icons/Phone.svelte.d.ts +4 -0
  149. package/dist/icons/Plus.svelte +34 -40
  150. package/dist/icons/Plus.svelte.d.ts +1 -1
  151. package/dist/icons/PointSale.svelte +36 -40
  152. package/dist/icons/PointSale.svelte.d.ts +1 -1
  153. package/dist/icons/Product.svelte +33 -39
  154. package/dist/icons/Product.svelte.d.ts +1 -1
  155. package/dist/icons/Project.svelte +32 -37
  156. package/dist/icons/Project.svelte.d.ts +1 -1
  157. package/dist/icons/RegularSpinner.svelte +83 -0
  158. package/dist/icons/RegularSpinner.svelte.d.ts +9 -0
  159. package/dist/icons/RightArrow.svelte +35 -44
  160. package/dist/icons/RightArrow.svelte.d.ts +1 -1
  161. package/dist/icons/SafeSolid.svelte +35 -40
  162. package/dist/icons/SafeSolid.svelte.d.ts +1 -1
  163. package/dist/icons/Scan.svelte +34 -39
  164. package/dist/icons/Scan.svelte.d.ts +1 -1
  165. package/dist/icons/Search.svelte +34 -39
  166. package/dist/icons/Search.svelte.d.ts +1 -1
  167. package/dist/icons/Security.svelte +34 -39
  168. package/dist/icons/Security.svelte.d.ts +1 -1
  169. package/dist/icons/Settings.svelte +33 -40
  170. package/dist/icons/Settings.svelte.d.ts +1 -1
  171. package/dist/icons/SquareChart.svelte +25 -0
  172. package/dist/icons/SquareChart.svelte.d.ts +4 -0
  173. package/dist/icons/Supervisor.svelte +33 -42
  174. package/dist/icons/Supervisor.svelte.d.ts +1 -1
  175. package/dist/icons/Swap.svelte +36 -42
  176. package/dist/icons/Swap.svelte.d.ts +1 -1
  177. package/dist/icons/Table.svelte +37 -41
  178. package/dist/icons/Table.svelte.d.ts +1 -1
  179. package/dist/icons/Team.svelte +37 -41
  180. package/dist/icons/Team.svelte.d.ts +1 -1
  181. package/dist/icons/Trash.svelte +35 -41
  182. package/dist/icons/Trash.svelte.d.ts +1 -1
  183. package/dist/icons/TrashOutline.svelte +34 -53
  184. package/dist/icons/TrashOutline.svelte.d.ts +1 -1
  185. package/dist/icons/Truck.svelte +22 -46
  186. package/dist/icons/Truck.svelte.d.ts +1 -1
  187. package/dist/icons/TruckReturn.svelte +25 -49
  188. package/dist/icons/TruckReturn.svelte.d.ts +1 -1
  189. package/dist/icons/UpArrow.svelte +6 -56
  190. package/dist/icons/UpArrow.svelte.d.ts +1 -1
  191. package/dist/icons/UpDownArrow.svelte +11 -29
  192. package/dist/icons/UpDownArrow.svelte.d.ts +1 -1
  193. package/dist/icons/Upload.svelte +67 -0
  194. package/dist/icons/Upload.svelte.d.ts +4 -0
  195. package/dist/icons/UploadAnimated.svelte +61 -0
  196. package/dist/icons/UploadAnimated.svelte.d.ts +4 -0
  197. package/dist/icons/UploadLoader.svelte +67 -0
  198. package/dist/icons/UploadLoader.svelte.d.ts +4 -0
  199. package/dist/icons/User.svelte +5 -48
  200. package/dist/icons/User.svelte.d.ts +1 -1
  201. package/dist/icons/UserTie.svelte +5 -46
  202. package/dist/icons/UserTie.svelte.d.ts +1 -1
  203. package/dist/icons/Wallet.svelte +5 -51
  204. package/dist/icons/Wallet.svelte.d.ts +1 -1
  205. package/dist/icons/Warehouse.svelte +5 -44
  206. package/dist/icons/Warehouse.svelte.d.ts +1 -1
  207. package/dist/icons/Warning.svelte +5 -46
  208. package/dist/icons/Warning.svelte.d.ts +1 -1
  209. package/dist/icons/icon-bundle.d.ts +98 -82
  210. package/dist/icons/icon-bundle.js +27 -1
  211. package/dist/icons/icons-effects.css +26 -0
  212. package/dist/icons/injectEffects.d.ts +2 -0
  213. package/dist/icons/injectEffects.js +32 -0
  214. package/dist/icons/registry.d.ts +104 -81
  215. package/dist/icons/registry.js +34 -0
  216. package/dist/icons/types.d.ts +4 -0
  217. package/dist/index.d.ts +107 -3
  218. package/dist/index.js +112 -2
  219. package/dist/styles/animations.css +137 -0
  220. package/dist/styles/css-injection.d.ts +2 -0
  221. package/dist/styles/css-injection.js +5 -0
  222. package/dist/styles/hybrid-inject.d.ts +12 -0
  223. package/dist/styles/hybrid-inject.js +231 -0
  224. package/dist/types/env.d.ts +15 -0
  225. package/dist/types.d.ts +43 -1
  226. package/dist/utils/animations.d.ts +13 -0
  227. package/dist/utils/animations.js +107 -0
  228. package/dist/utils/defaults.d.ts +27 -0
  229. package/dist/utils/defaults.js +54 -0
  230. package/dist/utils/performance.d.ts +12 -0
  231. package/dist/utils/performance.js +26 -0
  232. 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;
@@ -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
- let {
5
- children,
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
- // ===== Derivados =====
31
- const _size = $derived(typeof size === "number" ? `${size}px` : size);
32
- const _strokeWidth = $derived(
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 _stroke = $derived(stroke ?? color ?? defaultGray);
44
- const _fill = $derived(fill ?? (stroke ? "none" : (color ?? "none")));
21
+ const animationClasses = $derived(getAnimationClasses(props).join(" "));
22
+ const baseTransform = $derived(combineTransforms(props));
23
+ const animationStyle = $derived(getAnimationStyle(props));
45
24
 
46
- const _transform = $derived(
47
- `${rotate ? `rotate(${_rotate})` : ""} ${_flip}`.trim()
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 _spinDur = $derived(
50
- spin === true ? "1s" : typeof spin === "number" ? `${spin}ms` : spin || ""
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
- let _titleId = $state(titleId);
59
- $effect(() => {
60
- if (!_titleId && title) {
61
- _titleId = `icon-title-${Math.random().toString(36).slice(2, 9)}`;
62
- }
36
+ const transformStr = $derived(() => {
37
+ return baseTransform
38
+ ? `transform: ${baseTransform}; transform-origin: center;`
39
+ : "";
63
40
  });
64
41
 
65
- const _ariaHidden = $derived(decorative ? "true" : undefined);
66
- const _ariaLabel = $derived(decorative ? undefined : ariaLabel || undefined);
67
- const _ariaLabelledby = $derived(!decorative && title ? _titleId : undefined);
68
- const _vectorEffect = $derived(
69
- nonScalingStroke ? "non-scaling-stroke" : undefined
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={_size}
76
- height={_size}
77
- fill={_fill}
78
- stroke={_stroke}
79
- stroke-width={_strokeWidth}
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={_style}
91
- data-testid={testId}
92
- vector-effect={_vectorEffect}
93
- {...attrs}
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={_titleId}>{title}</title>{/if}
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
- declare const IconBase: import("svelte").Component<IconProps, {}, "size" | "stroke" | "strokeWidth" | "fill" | "className" | "ariaLabel" | "title" | "viewBox" | "strokeLinecap" | "strokeLinejoin" | "style" | "rotate" | "flipH" | "flipV" | "spin" | "color" | "nonScalingStroke" | "preserveAspectRatio" | "decorative" | "titleId" | "testId" | "attrs">;
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
+ };
@@ -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,8 @@
1
+ // 📁 src/lib/auto-inject.ts
2
+ import { injectIconEffectsCSS } from "./styles/css-injection.js";
3
+ // Auto-ejecuta solo en cliente
4
+ if (typeof window !== "undefined") {
5
+ Promise.resolve().then(() => {
6
+ injectIconEffectsCSS();
7
+ });
8
+ }
@@ -0,0 +1,5 @@
1
+ import type { IconEffectOptions } from "../types.js";
2
+ export declare function iconEffects(node: HTMLElement, opts?: IconEffectOptions): {
3
+ update(next?: IconEffectOptions): void;
4
+ destroy(): void;
5
+ };
@@ -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
+ }