@genarou/blazir-icons 1.3.4 → 1.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Icon.svelte +21 -23
- package/dist/Icon.svelte.d.ts +5 -5
- package/dist/IconLazy.svelte +297 -0
- package/dist/IconLazy.svelte.d.ts +22 -0
- package/dist/icons/ArrowDown.svelte +18 -0
- package/dist/icons/ArrowDown.svelte.d.ts +4 -0
- package/dist/icons/ArrowLeft.svelte +18 -0
- package/dist/icons/ArrowLeft.svelte.d.ts +4 -0
- package/dist/icons/ChevronLeft.svelte +15 -0
- package/dist/icons/ChevronLeft.svelte.d.ts +4 -0
- package/dist/icons/ChevronRight.svelte +15 -0
- package/dist/icons/ChevronRight.svelte.d.ts +4 -0
- package/dist/icons/ChevronUp.svelte +15 -0
- package/dist/icons/ChevronUp.svelte.d.ts +4 -0
- package/dist/icons/CloudUpload.svelte +18 -0
- package/dist/icons/CloudUpload.svelte.d.ts +4 -0
- package/dist/icons/Code.svelte +18 -0
- package/dist/icons/Code.svelte.d.ts +4 -0
- package/dist/icons/ExternalLink.svelte +18 -0
- package/dist/icons/ExternalLink.svelte.d.ts +4 -0
- package/dist/icons/Gift.svelte +21 -0
- package/dist/icons/Gift.svelte.d.ts +7 -0
- package/dist/icons/Grid.svelte +18 -0
- package/dist/icons/Grid.svelte.d.ts +4 -0
- package/dist/icons/GripVertical.svelte +18 -0
- package/dist/icons/GripVertical.svelte.d.ts +4 -0
- package/dist/icons/Layers.svelte +9 -0
- package/dist/icons/Layers.svelte.d.ts +4 -0
- package/dist/icons/Maximize.svelte +18 -0
- package/dist/icons/Maximize.svelte.d.ts +4 -0
- package/dist/icons/MicOff.svelte +9 -0
- package/dist/icons/MicOff.svelte.d.ts +4 -0
- package/dist/icons/Microphone.svelte +9 -0
- package/dist/icons/Microphone.svelte.d.ts +4 -0
- package/dist/icons/Minimize.svelte +9 -0
- package/dist/icons/Minimize.svelte.d.ts +4 -0
- package/dist/icons/Percentage.svelte +9 -0
- package/dist/icons/Percentage.svelte.d.ts +4 -0
- package/dist/icons/Redo.svelte +9 -0
- package/dist/icons/Redo.svelte.d.ts +4 -0
- package/dist/icons/Sliders.svelte +9 -0
- package/dist/icons/Sliders.svelte.d.ts +4 -0
- package/dist/icons/Terminal.svelte +21 -0
- package/dist/icons/Terminal.svelte.d.ts +7 -0
- package/dist/icons/Undo.svelte +9 -0
- package/dist/icons/Undo.svelte.d.ts +4 -0
- package/dist/icons/UserMinus.svelte +18 -0
- package/dist/icons/UserMinus.svelte.d.ts +4 -0
- package/dist/icons/UserPlus.svelte +18 -0
- package/dist/icons/UserPlus.svelte.d.ts +4 -0
- package/dist/icons/Video.svelte +9 -0
- package/dist/icons/Video.svelte.d.ts +4 -0
- package/dist/icons/Volume.svelte +9 -0
- package/dist/icons/Volume.svelte.d.ts +4 -0
- package/dist/icons/VolumeOff.svelte +9 -0
- package/dist/icons/VolumeOff.svelte.d.ts +4 -0
- package/dist/icons/components.d.ts +200 -0
- package/dist/icons/components.js +204 -0
- package/dist/icons/lazy-registry.js +34 -0
- package/dist/icons/registry.d.ts +30 -0
- package/dist/icons/registry.js +61 -1
- package/dist/icons-api.d.ts +26 -0
- package/dist/icons-api.js +34 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -1
- package/package.json +58 -53
- package/dist/icons/index.d.ts +0 -2
- package/dist/icons/index.js +0 -4
package/dist/Icon.svelte
CHANGED
|
@@ -1,37 +1,34 @@
|
|
|
1
1
|
<!-- Icon.svelte — Refactored v2 -->
|
|
2
2
|
<!-- Cache inteligente adaptativo + lazy loading opcional + actions diff -->
|
|
3
3
|
<script lang="ts">
|
|
4
|
-
import type { Component } from
|
|
5
|
-
import {
|
|
6
|
-
import { iconRegistry, type IconName } from
|
|
7
|
-
import { iconPresets, iconVariants } from
|
|
8
|
-
import type { IconProps } from './types.js';
|
|
4
|
+
import type { Component } from "svelte";
|
|
5
|
+
import { getLoadedIcon, loadIcon } from "./icons/lazy-registry.js";
|
|
6
|
+
import { iconRegistry, type IconName } from "./icons/registry.js";
|
|
7
|
+
import { iconPresets, iconVariants } from "./presets.js";
|
|
9
8
|
import {
|
|
10
|
-
getPresetVariantMerge,
|
|
11
9
|
arePropsStable,
|
|
12
10
|
buildStructuralKey,
|
|
13
11
|
getCachedMergedProps,
|
|
12
|
+
getPresetVariantMerge,
|
|
14
13
|
setCachedMergedProps,
|
|
15
14
|
toSizePx,
|
|
16
|
-
} from
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
loadIcon,
|
|
20
|
-
} from './icons/lazy-registry.js';
|
|
15
|
+
} from "./smart-cache.js";
|
|
16
|
+
import type { IconProps } from "./types.js";
|
|
17
|
+
import { coerceSize } from "./utils/defaults.js";
|
|
21
18
|
|
|
22
19
|
// ============================================================================
|
|
23
20
|
// TIPOS
|
|
24
21
|
// ============================================================================
|
|
25
22
|
type ActionFn<T = HTMLElement, P = any> = (
|
|
26
23
|
node: T,
|
|
27
|
-
params?: P
|
|
24
|
+
params?: P,
|
|
28
25
|
) => void | { update?: (p?: P) => void; destroy?: () => void };
|
|
29
26
|
|
|
30
27
|
type ActionEntry<T = HTMLElement> = [ActionFn<T, any>, any?];
|
|
31
28
|
type IconPresetName = keyof typeof iconPresets;
|
|
32
29
|
type IconVariantName = keyof typeof iconVariants;
|
|
33
30
|
|
|
34
|
-
interface DynamicIconProps extends Omit<IconProps,
|
|
31
|
+
interface DynamicIconProps extends Omit<IconProps, "children"> {
|
|
35
32
|
name?: IconName;
|
|
36
33
|
preset?: IconPresetName;
|
|
37
34
|
variant?: IconVariantName;
|
|
@@ -57,7 +54,7 @@
|
|
|
57
54
|
// --- Modo EAGER (default): usa el registry estático ya cargado ---
|
|
58
55
|
// Mismo comportamiento que antes: sin latencia, sin skeleton en primer render.
|
|
59
56
|
const _eagerComp = $derived(
|
|
60
|
-
iconName ? (iconRegistry[iconName as IconName] ?? null) : null
|
|
57
|
+
iconName ? (iconRegistry[iconName as IconName] ?? null) : null,
|
|
61
58
|
);
|
|
62
59
|
|
|
63
60
|
// --- Modo LAZY (opt-in): dynamic import() por ícono ---
|
|
@@ -82,8 +79,8 @@
|
|
|
82
79
|
// Si es el mismo nombre y ya lo cargamos → no hacer nada
|
|
83
80
|
if (_lazyCurrentName === name && _lazyComp) return;
|
|
84
81
|
|
|
85
|
-
// Intentar sincrónico primero (caché de íconos ya cargados)
|
|
86
|
-
const synced = getLoadedIcon(name)
|
|
82
|
+
// Intentar sincrónico primero (caché de íconos ya cargados en esta sesión)
|
|
83
|
+
const synced = getLoadedIcon(name);
|
|
87
84
|
if (synced) {
|
|
88
85
|
_lazyComp = synced;
|
|
89
86
|
_lazyCurrentName = name;
|
|
@@ -121,7 +118,7 @@
|
|
|
121
118
|
// ============================================================================
|
|
122
119
|
function toMs(v: unknown): string | undefined {
|
|
123
120
|
if (v == null) return undefined;
|
|
124
|
-
return typeof v ===
|
|
121
|
+
return typeof v === "number" ? `${v}ms` : String(v);
|
|
125
122
|
}
|
|
126
123
|
|
|
127
124
|
// ============================================================================
|
|
@@ -202,7 +199,7 @@
|
|
|
202
199
|
// ATRIBUTOS DEL HOST
|
|
203
200
|
// ============================================================================
|
|
204
201
|
const hostClass = $derived(
|
|
205
|
-
p.class ? `bz-icon-wrapper ${p.class}` :
|
|
202
|
+
p.class ? `bz-icon-wrapper ${p.class}` : "bz-icon-wrapper",
|
|
206
203
|
);
|
|
207
204
|
|
|
208
205
|
const hostStyle = $derived.by(() => {
|
|
@@ -296,7 +293,7 @@
|
|
|
296
293
|
>
|
|
297
294
|
{#key mountKey}
|
|
298
295
|
<!-- svelte-ignore: cast necesario para componentes dinámicos con props genéricas -->
|
|
299
|
-
<Comp {...
|
|
296
|
+
<Comp {...child as any} />
|
|
300
297
|
{/key}
|
|
301
298
|
</span>
|
|
302
299
|
{:else if isLoading}
|
|
@@ -330,8 +327,9 @@
|
|
|
330
327
|
transform: translateX(-50%);
|
|
331
328
|
pointer-events: none;
|
|
332
329
|
opacity: 0;
|
|
333
|
-
transition:
|
|
334
|
-
|
|
330
|
+
transition:
|
|
331
|
+
opacity 0.15s ease var(--bz-tooltip-delay, 0ms),
|
|
332
|
+
transform 0.15s ease var(--bz-tooltip-delay, 0ms);
|
|
335
333
|
z-index: 9999;
|
|
336
334
|
}
|
|
337
335
|
|
|
@@ -346,13 +344,13 @@
|
|
|
346
344
|
padding: 5px 9px;
|
|
347
345
|
border-radius: 6px;
|
|
348
346
|
white-space: nowrap;
|
|
349
|
-
box-shadow: 0 2px 8px rgba(0,0,0,0.18);
|
|
347
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);
|
|
350
348
|
transform: translateX(-50%) translateY(3px);
|
|
351
349
|
}
|
|
352
350
|
|
|
353
351
|
/* Flecha del tooltip */
|
|
354
352
|
.bz-icon-wrapper[data-bz-tooltip]::before {
|
|
355
|
-
content:
|
|
353
|
+
content: "";
|
|
356
354
|
border: 5px solid transparent;
|
|
357
355
|
border-top-color: var(--bz-tooltip-bg, #1a1a1a);
|
|
358
356
|
bottom: calc(100% + 0px);
|
package/dist/Icon.svelte.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { Component } from
|
|
2
|
-
import { type IconName } from
|
|
3
|
-
import { iconPresets, iconVariants } from
|
|
4
|
-
import type { IconProps } from
|
|
1
|
+
import type { Component } from "svelte";
|
|
2
|
+
import { type IconName } from "./icons/registry.js";
|
|
3
|
+
import { iconPresets, iconVariants } from "./presets.js";
|
|
4
|
+
import type { IconProps } from "./types.js";
|
|
5
5
|
type ActionFn<T = HTMLElement, P = any> = (node: T, params?: P) => void | {
|
|
6
6
|
update?: (p?: P) => void;
|
|
7
7
|
destroy?: () => void;
|
|
@@ -9,7 +9,7 @@ type ActionFn<T = HTMLElement, P = any> = (node: T, params?: P) => void | {
|
|
|
9
9
|
type ActionEntry<T = HTMLElement> = [ActionFn<T, any>, any?];
|
|
10
10
|
type IconPresetName = keyof typeof iconPresets;
|
|
11
11
|
type IconVariantName = keyof typeof iconVariants;
|
|
12
|
-
interface DynamicIconProps extends Omit<IconProps,
|
|
12
|
+
interface DynamicIconProps extends Omit<IconProps, "children"> {
|
|
13
13
|
name?: IconName;
|
|
14
14
|
preset?: IconPresetName;
|
|
15
15
|
variant?: IconVariantName;
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
<!-- IconLazy.svelte
|
|
2
|
+
Variante zero-bundle del componente dinámico.
|
|
3
|
+
NO importa iconRegistry en runtime — cada ícono se code-splitea
|
|
4
|
+
en su propio chunk por el bundler via dynamic import().
|
|
5
|
+
Úsalo cuando el nombre del ícono se decide en runtime y quieres
|
|
6
|
+
que solo los iconos realmente usados entren al bundle.
|
|
7
|
+
-->
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import type { Component } from "svelte";
|
|
10
|
+
import { coerceSize } from "./utils/defaults.js";
|
|
11
|
+
// import type → TypeScript lo borra en compilación, cero runtime dep sobre registry
|
|
12
|
+
import { getLoadedIcon, loadIcon } from "./icons/lazy-registry.js";
|
|
13
|
+
import type { IconName } from "./icons/registry.js";
|
|
14
|
+
import { iconPresets, iconVariants } from "./presets.js";
|
|
15
|
+
import {
|
|
16
|
+
arePropsStable,
|
|
17
|
+
buildStructuralKey,
|
|
18
|
+
getCachedMergedProps,
|
|
19
|
+
getPresetVariantMerge,
|
|
20
|
+
setCachedMergedProps,
|
|
21
|
+
toSizePx,
|
|
22
|
+
} from "./smart-cache.js";
|
|
23
|
+
import type { IconProps } from "./types.js";
|
|
24
|
+
|
|
25
|
+
type ActionFn<T = HTMLElement, P = any> = (
|
|
26
|
+
node: T,
|
|
27
|
+
params?: P,
|
|
28
|
+
) => void | { update?: (p?: P) => void; destroy?: () => void };
|
|
29
|
+
|
|
30
|
+
type ActionEntry<T = HTMLElement> = [ActionFn<T, any>, any?];
|
|
31
|
+
type IconPresetName = keyof typeof iconPresets;
|
|
32
|
+
type IconVariantName = keyof typeof iconVariants;
|
|
33
|
+
|
|
34
|
+
interface LazyIconProps extends Omit<IconProps, "children"> {
|
|
35
|
+
name?: IconName;
|
|
36
|
+
preset?: IconPresetName;
|
|
37
|
+
variant?: IconVariantName;
|
|
38
|
+
class?: string;
|
|
39
|
+
style?: string;
|
|
40
|
+
actions?: ActionEntry[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const p: LazyIconProps = $props();
|
|
44
|
+
|
|
45
|
+
const iconName = $derived(p.name ?? null);
|
|
46
|
+
|
|
47
|
+
// Resolución lazy — solo dynamic import(), nunca el registry estático
|
|
48
|
+
let _comp = $state<Component | null>(null);
|
|
49
|
+
let _loading = $state(false);
|
|
50
|
+
let _currentName = $state<string | null>(null);
|
|
51
|
+
|
|
52
|
+
$effect(() => {
|
|
53
|
+
const name = iconName;
|
|
54
|
+
|
|
55
|
+
if (!name) {
|
|
56
|
+
_comp = null;
|
|
57
|
+
_currentName = null;
|
|
58
|
+
_loading = false;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (_currentName === name && _comp) return;
|
|
63
|
+
|
|
64
|
+
// Caché en memoria de iconos ya cargados en esta sesión → render síncrono
|
|
65
|
+
const cached = getLoadedIcon(name);
|
|
66
|
+
if (cached) {
|
|
67
|
+
_comp = cached;
|
|
68
|
+
_currentName = name;
|
|
69
|
+
_loading = false;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Dynamic import — el bundler genera un chunk separado por ícono
|
|
74
|
+
_loading = true;
|
|
75
|
+
_currentName = name;
|
|
76
|
+
loadIcon(name).then((comp) => {
|
|
77
|
+
if (_currentName === name) {
|
|
78
|
+
_comp = comp;
|
|
79
|
+
_loading = false;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// PascalCase alias requerido por Svelte para usar como tag de componente
|
|
85
|
+
const Comp = $derived(_comp);
|
|
86
|
+
|
|
87
|
+
const baseProps = $derived(getPresetVariantMerge(p.preset, p.variant));
|
|
88
|
+
|
|
89
|
+
function toMs(v: unknown): string | undefined {
|
|
90
|
+
if (v == null) return undefined;
|
|
91
|
+
return typeof v === "number" ? `${v}ms` : String(v);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const child = $derived.by((): IconProps => {
|
|
95
|
+
const {
|
|
96
|
+
class: _cls,
|
|
97
|
+
style: _sty,
|
|
98
|
+
actions: _act,
|
|
99
|
+
preset: _pre,
|
|
100
|
+
variant: _var,
|
|
101
|
+
name: _nm,
|
|
102
|
+
...userProps
|
|
103
|
+
} = p;
|
|
104
|
+
|
|
105
|
+
const stable = arePropsStable(userProps as Record<string, unknown>);
|
|
106
|
+
|
|
107
|
+
if (stable) {
|
|
108
|
+
const key = buildStructuralKey(userProps as Record<string, unknown>);
|
|
109
|
+
const cached = getCachedMergedProps(key);
|
|
110
|
+
if (cached) return cached;
|
|
111
|
+
|
|
112
|
+
const merged: any = { ...baseProps, ...userProps };
|
|
113
|
+
if (merged.animationDuration !== undefined)
|
|
114
|
+
merged.animationDuration = toMs(merged.animationDuration);
|
|
115
|
+
if (merged.animationDelay !== undefined)
|
|
116
|
+
merged.animationDelay = toMs(merged.animationDelay);
|
|
117
|
+
|
|
118
|
+
const result = Object.freeze(merged) as unknown as IconProps;
|
|
119
|
+
setCachedMergedProps(key, result as Readonly<IconProps>);
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const merged: any = { ...baseProps, ...userProps };
|
|
124
|
+
if (merged.animationDuration !== undefined)
|
|
125
|
+
merged.animationDuration = toMs(merged.animationDuration);
|
|
126
|
+
if (merged.animationDelay !== undefined)
|
|
127
|
+
merged.animationDelay = toMs(merged.animationDelay);
|
|
128
|
+
return merged as IconProps;
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const boxSize = $derived.by(() => {
|
|
132
|
+
const rawSize = (p as any).size ?? (baseProps as any).size;
|
|
133
|
+
return toSizePx(coerceSize(rawSize, 24));
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const hostClass = $derived(
|
|
137
|
+
p.class ? `bz-icon-wrapper ${p.class}` : "bz-icon-wrapper",
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
const hostStyle = $derived.by(() => {
|
|
141
|
+
const sz = boxSize;
|
|
142
|
+
const base = `--bz-icon-size:${sz};width:${sz};height:${sz};inline-size:${sz};block-size:${sz};`;
|
|
143
|
+
return p.style ? base + p.style : base;
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
let mountKey = $state(0);
|
|
147
|
+
function onLazyMount() {
|
|
148
|
+
mountKey++;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function applyActions(node: HTMLElement, entries: ActionEntry[] = []) {
|
|
152
|
+
if (!entries?.length) return { update() {}, destroy() {} };
|
|
153
|
+
|
|
154
|
+
let prevEntries: ActionEntry[] = entries;
|
|
155
|
+
let handles = entries
|
|
156
|
+
.map(([fn, params]) => fn?.(node, params))
|
|
157
|
+
.filter(Boolean);
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
update(next: ActionEntry[] = []) {
|
|
161
|
+
if (!next?.length) {
|
|
162
|
+
handles.forEach((h) => h?.destroy?.());
|
|
163
|
+
handles = [];
|
|
164
|
+
prevEntries = [];
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (next.length === prevEntries.length) {
|
|
168
|
+
let sameFns = true;
|
|
169
|
+
for (let i = 0; i < next.length; i++) {
|
|
170
|
+
if (next[i][0] !== prevEntries[i][0]) {
|
|
171
|
+
sameFns = false;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (sameFns) {
|
|
176
|
+
handles.forEach((h, i) => h?.update?.(next[i][1]));
|
|
177
|
+
prevEntries = next;
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
handles.forEach((h) => h?.destroy?.());
|
|
182
|
+
prevEntries = next;
|
|
183
|
+
handles = next
|
|
184
|
+
.map(([fn, params]) => fn?.(node, params))
|
|
185
|
+
.filter(Boolean);
|
|
186
|
+
},
|
|
187
|
+
destroy() {
|
|
188
|
+
handles.forEach((h) => h?.destroy?.());
|
|
189
|
+
handles = [];
|
|
190
|
+
prevEntries = [];
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
</script>
|
|
195
|
+
|
|
196
|
+
{#if Comp}
|
|
197
|
+
<span
|
|
198
|
+
class={hostClass}
|
|
199
|
+
style={p.tooltipDelay != null
|
|
200
|
+
? `${hostStyle};--bz-tooltip-delay:${p.tooltipDelay}ms`
|
|
201
|
+
: hostStyle}
|
|
202
|
+
data-bz-tooltip={p.tooltip || undefined}
|
|
203
|
+
use:applyActions={p.actions ?? []}
|
|
204
|
+
onlazyMount={onLazyMount}
|
|
205
|
+
>
|
|
206
|
+
{#key mountKey}
|
|
207
|
+
<Comp {...child as any} />
|
|
208
|
+
{/key}
|
|
209
|
+
</span>
|
|
210
|
+
{:else if _loading}
|
|
211
|
+
<span class="bz-icon-skeleton" aria-hidden="true"></span>
|
|
212
|
+
{:else if iconName}
|
|
213
|
+
<span class="bz-icon-error" data-icon={iconName}
|
|
214
|
+
>⚠️ Icon not found: {iconName}</span
|
|
215
|
+
>
|
|
216
|
+
{:else}
|
|
217
|
+
<span class="bz-icon-skeleton" aria-hidden="true"></span>
|
|
218
|
+
{/if}
|
|
219
|
+
|
|
220
|
+
<style>
|
|
221
|
+
.bz-icon-wrapper {
|
|
222
|
+
cursor: pointer;
|
|
223
|
+
display: inline-flex;
|
|
224
|
+
align-items: center;
|
|
225
|
+
justify-content: center;
|
|
226
|
+
position: relative;
|
|
227
|
+
pointer-events: auto;
|
|
228
|
+
contain: layout style;
|
|
229
|
+
content-visibility: auto;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.bz-icon-wrapper[data-bz-tooltip]::before,
|
|
233
|
+
.bz-icon-wrapper[data-bz-tooltip]::after {
|
|
234
|
+
position: absolute;
|
|
235
|
+
bottom: calc(100% + 8px);
|
|
236
|
+
left: 50%;
|
|
237
|
+
transform: translateX(-50%);
|
|
238
|
+
pointer-events: none;
|
|
239
|
+
opacity: 0;
|
|
240
|
+
transition:
|
|
241
|
+
opacity 0.15s ease var(--bz-tooltip-delay, 0ms),
|
|
242
|
+
transform 0.15s ease var(--bz-tooltip-delay, 0ms);
|
|
243
|
+
z-index: 9999;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.bz-icon-wrapper[data-bz-tooltip]::after {
|
|
247
|
+
content: attr(data-bz-tooltip);
|
|
248
|
+
background: var(--bz-tooltip-bg, #1a1a1a);
|
|
249
|
+
color: var(--bz-tooltip-color, #fff);
|
|
250
|
+
font-size: 11px;
|
|
251
|
+
font-weight: 500;
|
|
252
|
+
line-height: 1.4;
|
|
253
|
+
padding: 5px 9px;
|
|
254
|
+
border-radius: 6px;
|
|
255
|
+
white-space: nowrap;
|
|
256
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);
|
|
257
|
+
transform: translateX(-50%) translateY(3px);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.bz-icon-wrapper[data-bz-tooltip]::before {
|
|
261
|
+
content: "";
|
|
262
|
+
border: 5px solid transparent;
|
|
263
|
+
border-top-color: var(--bz-tooltip-bg, #1a1a1a);
|
|
264
|
+
bottom: calc(100% + 0px);
|
|
265
|
+
transform: translateX(-50%) translateY(3px);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.bz-icon-wrapper[data-bz-tooltip]:hover::after,
|
|
269
|
+
.bz-icon-wrapper[data-bz-tooltip]:hover::before {
|
|
270
|
+
opacity: 1;
|
|
271
|
+
transform: translateX(-50%) translateY(0);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.bz-icon-wrapper :global(svg) {
|
|
275
|
+
pointer-events: bounding-box !important;
|
|
276
|
+
}
|
|
277
|
+
.bz-icon-wrapper :global(svg *) {
|
|
278
|
+
pointer-events: none !important;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.bz-icon-skeleton {
|
|
282
|
+
width: 100%;
|
|
283
|
+
height: 100%;
|
|
284
|
+
border-radius: var(--ui-radius, 0.25rem);
|
|
285
|
+
background: color-mix(in oklab, currentColor 12%, transparent);
|
|
286
|
+
opacity: 0.5;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.bz-icon-error {
|
|
290
|
+
display: inline-block;
|
|
291
|
+
background: var(--danger-color, #ef4444);
|
|
292
|
+
color: var(--danger-foreground, #fff);
|
|
293
|
+
font-size: 0.75rem;
|
|
294
|
+
border-radius: var(--ui-radius, 0.25rem);
|
|
295
|
+
font-weight: 600;
|
|
296
|
+
}
|
|
297
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Component } from "svelte";
|
|
2
|
+
import type { IconName } from "./icons/registry.js";
|
|
3
|
+
import { iconPresets, iconVariants } from "./presets.js";
|
|
4
|
+
import type { IconProps } from "./types.js";
|
|
5
|
+
type ActionFn<T = HTMLElement, P = any> = (node: T, params?: P) => void | {
|
|
6
|
+
update?: (p?: P) => void;
|
|
7
|
+
destroy?: () => void;
|
|
8
|
+
};
|
|
9
|
+
type ActionEntry<T = HTMLElement> = [ActionFn<T, any>, any?];
|
|
10
|
+
type IconPresetName = keyof typeof iconPresets;
|
|
11
|
+
type IconVariantName = keyof typeof iconVariants;
|
|
12
|
+
interface LazyIconProps extends Omit<IconProps, "children"> {
|
|
13
|
+
name?: IconName;
|
|
14
|
+
preset?: IconPresetName;
|
|
15
|
+
variant?: IconVariantName;
|
|
16
|
+
class?: string;
|
|
17
|
+
style?: string;
|
|
18
|
+
actions?: ActionEntry[];
|
|
19
|
+
}
|
|
20
|
+
declare const IconLazy: Component<LazyIconProps, {}, "">;
|
|
21
|
+
type IconLazy = ReturnType<typeof IconLazy>;
|
|
22
|
+
export default IconLazy;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import IconBase from "../IconBase.svelte";
|
|
3
|
+
import type { IconProps } from "../types";
|
|
4
|
+
const props: IconProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<IconBase
|
|
8
|
+
{...props}
|
|
9
|
+
mode="solid"
|
|
10
|
+
viewBox="0 0 24 24"
|
|
11
|
+
ariaLabel={props.ariaLabel ?? "Arrow down"}
|
|
12
|
+
title={props.title ?? ""}
|
|
13
|
+
>
|
|
14
|
+
<path
|
|
15
|
+
fill="currentColor"
|
|
16
|
+
d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"
|
|
17
|
+
/>
|
|
18
|
+
</IconBase>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import IconBase from "../IconBase.svelte";
|
|
3
|
+
import type { IconProps } from "../types";
|
|
4
|
+
const props: IconProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<IconBase
|
|
8
|
+
{...props}
|
|
9
|
+
mode="solid"
|
|
10
|
+
viewBox="0 0 24 24"
|
|
11
|
+
ariaLabel={props.ariaLabel ?? "Arrow left"}
|
|
12
|
+
title={props.title ?? ""}
|
|
13
|
+
>
|
|
14
|
+
<path
|
|
15
|
+
fill="currentColor"
|
|
16
|
+
d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"
|
|
17
|
+
/>
|
|
18
|
+
</IconBase>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import IconBase from "../IconBase.svelte";
|
|
3
|
+
import type { IconProps } from "../types";
|
|
4
|
+
const props: IconProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<IconBase
|
|
8
|
+
{...props}
|
|
9
|
+
mode="solid"
|
|
10
|
+
viewBox="0 0 32 32"
|
|
11
|
+
ariaLabel={props.ariaLabel ?? "Chevron left"}
|
|
12
|
+
title={props.title ?? ""}
|
|
13
|
+
>
|
|
14
|
+
<path d="M10 16 20 6l1.4 1.4-8.6 8.6 8.6 8.6L20 26z" />
|
|
15
|
+
</IconBase>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import IconBase from "../IconBase.svelte";
|
|
3
|
+
import type { IconProps } from "../types";
|
|
4
|
+
const props: IconProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<IconBase
|
|
8
|
+
{...props}
|
|
9
|
+
mode="solid"
|
|
10
|
+
viewBox="0 0 32 32"
|
|
11
|
+
ariaLabel={props.ariaLabel ?? "Chevron right"}
|
|
12
|
+
title={props.title ?? ""}
|
|
13
|
+
>
|
|
14
|
+
<path d="M22 16 12 26l-1.4-1.4 8.6-8.6-8.6-8.6L12 6z" />
|
|
15
|
+
</IconBase>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import IconBase from "../IconBase.svelte";
|
|
3
|
+
import type { IconProps } from "../types";
|
|
4
|
+
const props: IconProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<IconBase
|
|
8
|
+
{...props}
|
|
9
|
+
mode="solid"
|
|
10
|
+
viewBox="0 0 32 32"
|
|
11
|
+
ariaLabel={props.ariaLabel ?? "Chevron up"}
|
|
12
|
+
title={props.title ?? ""}
|
|
13
|
+
>
|
|
14
|
+
<path d="M16 10 6 20l1.4 1.4 8.6-8.6 8.6 8.6L26 20z" />
|
|
15
|
+
</IconBase>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import IconBase from "../IconBase.svelte";
|
|
3
|
+
import type { IconProps } from "../types";
|
|
4
|
+
const props: IconProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<IconBase
|
|
8
|
+
{...props}
|
|
9
|
+
mode="solid"
|
|
10
|
+
viewBox="0 0 24 24"
|
|
11
|
+
ariaLabel={props.ariaLabel ?? "Cloud upload"}
|
|
12
|
+
title={props.title ?? ""}
|
|
13
|
+
>
|
|
14
|
+
<path
|
|
15
|
+
fill="currentColor"
|
|
16
|
+
d="M19.35 10.04A7.49 7.49 0 0 0 12 4C9.11 4 6.6 5.64 5.35 8.04A5.994 5.994 0 0 0 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"
|
|
17
|
+
/>
|
|
18
|
+
</IconBase>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import IconBase from "../IconBase.svelte";
|
|
3
|
+
import type { IconProps } from "../types";
|
|
4
|
+
const props: IconProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<IconBase
|
|
8
|
+
{...props}
|
|
9
|
+
mode="solid"
|
|
10
|
+
viewBox="0 0 24 24"
|
|
11
|
+
ariaLabel={props.ariaLabel ?? "Code"}
|
|
12
|
+
title={props.title ?? ""}
|
|
13
|
+
>
|
|
14
|
+
<path
|
|
15
|
+
fill="currentColor"
|
|
16
|
+
d="M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"
|
|
17
|
+
/>
|
|
18
|
+
</IconBase>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import IconBase from "../IconBase.svelte";
|
|
3
|
+
import type { IconProps } from "../types";
|
|
4
|
+
const props: IconProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<IconBase
|
|
8
|
+
{...props}
|
|
9
|
+
mode="solid"
|
|
10
|
+
viewBox="0 0 24 24"
|
|
11
|
+
ariaLabel={props.ariaLabel ?? "External link"}
|
|
12
|
+
title={props.title ?? ""}
|
|
13
|
+
>
|
|
14
|
+
<path
|
|
15
|
+
fill="currentColor"
|
|
16
|
+
d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"
|
|
17
|
+
/>
|
|
18
|
+
</IconBase>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import IconBase from "../IconBase.svelte";
|
|
3
|
+
import type { IconMode, IconProps } from "../types.js";
|
|
4
|
+
|
|
5
|
+
const props: IconProps & { mode?: IconMode } = $props();
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<IconBase
|
|
9
|
+
{...props}
|
|
10
|
+
mode="solid"
|
|
11
|
+
viewBox="0 0 24 24"
|
|
12
|
+
ariaLabel={props.ariaLabel ?? "Regalo"}
|
|
13
|
+
title={props.title ?? "Gift"}
|
|
14
|
+
>
|
|
15
|
+
{#snippet children()}
|
|
16
|
+
<path
|
|
17
|
+
fill="currentColor"
|
|
18
|
+
d="M4 20v-9q-.825 0-1.412-.587T2 9V7q0-.825.588-1.412T4 5h3.2q-.125-.225-.162-.475T7 4q0-1.25.875-2.125T10 1q.575 0 1.075.213T12 1.8q.425-.4.925-.6T14 1q1.25 0 2.125.875T17 4q0 .275-.05.513T16.8 5H20q.825 0 1.413.588T22 7v2q0 .825-.587 1.413T20 11v9q0 .825-.587 1.413T18 22H6q-.825 0-1.412-.587T4 20m9.288-16.713Q13 3.575 13 4t.288.713T14 5t.713-.288T15 4t-.288-.712T14 3t-.712.288M9 4q0 .425.288.713T10 5t.713-.288T11 4t-.288-.712T10 3t-.712.288T9 4M4 7v2h7V7zm7 13v-9H6v9zm2 0h5v-9h-5zm7-11V7h-7v2z"
|
|
19
|
+
/>
|
|
20
|
+
{/snippet}
|
|
21
|
+
</IconBase>
|