athlefi-ui 0.1.7 → 0.1.8
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/package.json +2 -1
- package/src/assets/Logo 1.png +0 -0
- package/src/assets/Logo 3.png +0 -0
- package/src/assets/android-chrome-192x192.png +0 -0
- package/src/assets/android-chrome-512x512.png +0 -0
- package/src/assets/apple-touch-icon.png +0 -0
- package/src/assets/favicon-16x16.png +0 -0
- package/src/assets/favicon-32x32.png +0 -0
- package/src/assets/favicon.ico +0 -0
- package/src/assets/icono.svg +1 -0
- package/src/assets/icono_name.svg +1 -0
- package/src/assets/profilepic.webp +0 -0
- package/src/assets/site.webmanifest +21 -0
- package/src/components/atoms/FooterLink.astro +50 -0
- package/src/components/atoms/FormInput.astro +102 -0
- package/src/components/atoms/IconCard.astro +99 -0
- package/src/components/atoms/Logo.astro +59 -0
- package/src/components/atoms/NavLink.astro +70 -0
- package/src/components/atoms/SocialIcon.astro +80 -0
- package/src/components/atoms/TabButton.astro +71 -0
- package/src/components/atoms/TextMono.astro +152 -0
- package/src/components/atoms/TimelineStep.astro +215 -0
- package/src/components/atoms/auxfile.astro +108 -29
- package/src/index.ts +9 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2025 Grupo DedSec S.A. de C.V.
|
|
4
|
+
* Este código fuente es propiedad exclusiva de Grupo DedSec S.A. de C.V.
|
|
5
|
+
* Se prohíbe su uso, reproducción, distribución o modificación, total o parcial, sin autorización expresa por escrito.
|
|
6
|
+
* No se permite el uso comercial ni la redistribución pública del mismo.
|
|
7
|
+
* Para licenciamiento, contactar a: admin@dedsec.com.mx
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Átomo: TimelineStep
|
|
12
|
+
* @description Paso individual de una línea de tiempo con ícono, título y descripción
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import shieldIcon from '../../icons/shield-checkmark-outline.svg?raw';
|
|
16
|
+
import searchIcon from '../../icons/search-outline.svg?raw';
|
|
17
|
+
import cardIcon from '../../icons/card-outline.svg?raw';
|
|
18
|
+
import chartIcon from '../../icons/bar-chart-outline.svg?raw';
|
|
19
|
+
import trophyIcon from '../../icons/trophy-outline.svg?raw';
|
|
20
|
+
import userIcon from '../../icons/person-outline.svg?raw';
|
|
21
|
+
import documentIcon from '../../icons/document-text-outline.svg?raw';
|
|
22
|
+
import laptopIcon from '../../icons/laptop-outline.svg?raw';
|
|
23
|
+
import cashIcon from '../../icons/cash-outline.svg?raw';
|
|
24
|
+
import pieIcon from '../../icons/pie-chart-outline.svg?raw';
|
|
25
|
+
|
|
26
|
+
export interface Props {
|
|
27
|
+
icon: string;
|
|
28
|
+
title: string;
|
|
29
|
+
description: string;
|
|
30
|
+
stepNumber: number;
|
|
31
|
+
isVertical?: boolean;
|
|
32
|
+
animationDelay?: number;
|
|
33
|
+
class?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const {
|
|
37
|
+
icon,
|
|
38
|
+
title,
|
|
39
|
+
description,
|
|
40
|
+
stepNumber,
|
|
41
|
+
isVertical = false,
|
|
42
|
+
animationDelay = 0,
|
|
43
|
+
class: className = ""
|
|
44
|
+
} = Astro.props;
|
|
45
|
+
|
|
46
|
+
// Mapeo de iconos disponibles
|
|
47
|
+
const iconMap: Record<string, string> = {
|
|
48
|
+
shield: shieldIcon,
|
|
49
|
+
search: searchIcon,
|
|
50
|
+
card: cardIcon,
|
|
51
|
+
chart: chartIcon,
|
|
52
|
+
trophy: trophyIcon,
|
|
53
|
+
user: userIcon,
|
|
54
|
+
'document-text': documentIcon,
|
|
55
|
+
laptop: laptopIcon,
|
|
56
|
+
cash: cashIcon,
|
|
57
|
+
pie: pieIcon
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const iconSvg = iconMap[icon] || iconMap.shield;
|
|
61
|
+
const iconSize = isVertical ? '20' : '24';
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
<div class={`timeline-step ${isVertical ? 'timeline-step--vertical' : 'timeline-step--horizontal'} ${className}`}>
|
|
65
|
+
<div class="timeline-step__icon-container">
|
|
66
|
+
<!-- Ícono principal -->
|
|
67
|
+
<div class="timeline-step__icon">
|
|
68
|
+
<Fragment set:html={iconSvg.replace('<svg', `<svg width="${iconSize}" height="${iconSize}" class="timeline-step__svg"`)} />
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<!-- Efecto pulse animado -->
|
|
72
|
+
<div
|
|
73
|
+
class="timeline-step__pulse"
|
|
74
|
+
style={`animation-delay: ${animationDelay}s;`}
|
|
75
|
+
></div>
|
|
76
|
+
|
|
77
|
+
<!-- Conector vertical (solo para timeline vertical) -->
|
|
78
|
+
{isVertical && stepNumber < 5 && (
|
|
79
|
+
<div class="timeline-step__connector"></div>
|
|
80
|
+
)}
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<!-- Contenido del paso -->
|
|
84
|
+
<div class={`timeline-step__content ${isVertical ? 'timeline-step__content--vertical' : 'timeline-step__content--horizontal'}`}>
|
|
85
|
+
<h3 class={`timeline-step__title ${isVertical ? '' : 'timeline-step__title--horizontal'}`}>
|
|
86
|
+
{stepNumber}. {title}
|
|
87
|
+
</h3>
|
|
88
|
+
<p class={`timeline-step__description ${!isVertical ? 'timeline-step__description--horizontal' : ''}`}>
|
|
89
|
+
{description}
|
|
90
|
+
</p>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<style>
|
|
95
|
+
/* Base styles */
|
|
96
|
+
.timeline-step {
|
|
97
|
+
position: relative;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Horizontal layout */
|
|
101
|
+
.timeline-step--horizontal {
|
|
102
|
+
display: flex;
|
|
103
|
+
flex-direction: column;
|
|
104
|
+
align-items: center;
|
|
105
|
+
width: 20%;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Vertical layout */
|
|
109
|
+
.timeline-step--vertical {
|
|
110
|
+
display: flex;
|
|
111
|
+
align-items: flex-start;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Icon container */
|
|
115
|
+
.timeline-step__icon-container {
|
|
116
|
+
position: relative;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.timeline-step--vertical .timeline-step__icon-container {
|
|
120
|
+
flex-shrink: 0;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Icon */
|
|
124
|
+
.timeline-step__icon {
|
|
125
|
+
position: relative;
|
|
126
|
+
z-index: 10;
|
|
127
|
+
width: 48px;
|
|
128
|
+
height: 48px;
|
|
129
|
+
background-color: var(--color-primary-60);
|
|
130
|
+
border-radius: 50%;
|
|
131
|
+
display: flex;
|
|
132
|
+
align-items: center;
|
|
133
|
+
justify-content: center;
|
|
134
|
+
margin-bottom: 16px;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.timeline-step__icon :global(.timeline-step__svg) {
|
|
138
|
+
color: var(--color-primary-90);
|
|
139
|
+
fill: var(--color-primary-90);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* Pulse effect */
|
|
143
|
+
.timeline-step__pulse {
|
|
144
|
+
position: absolute;
|
|
145
|
+
top: -8px;
|
|
146
|
+
left: -8px;
|
|
147
|
+
width: 64px;
|
|
148
|
+
height: 64px;
|
|
149
|
+
border: 2px solid rgba(1, 234, 199, 0.3);
|
|
150
|
+
border-radius: 50%;
|
|
151
|
+
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@keyframes pulse {
|
|
155
|
+
0%, 100% {
|
|
156
|
+
opacity: 0.3;
|
|
157
|
+
transform: scale(1);
|
|
158
|
+
}
|
|
159
|
+
50% {
|
|
160
|
+
opacity: 0.1;
|
|
161
|
+
transform: scale(1.05);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* Connector for vertical timeline */
|
|
166
|
+
.timeline-step__connector {
|
|
167
|
+
position: absolute;
|
|
168
|
+
top: 48px;
|
|
169
|
+
left: 50%;
|
|
170
|
+
transform: translateX(-50%);
|
|
171
|
+
width: 2px;
|
|
172
|
+
height: 64px;
|
|
173
|
+
background-color: rgba(1, 234, 199, 0.3);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Content */
|
|
177
|
+
.timeline-step__content--horizontal {
|
|
178
|
+
text-align: center;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.timeline-step__content--vertical {
|
|
182
|
+
flex: 1;
|
|
183
|
+
margin-left: 16px;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/* Title */
|
|
187
|
+
.timeline-step__title {
|
|
188
|
+
font-family: var(--font-family-manrope);
|
|
189
|
+
font-size: var(--font-size-subtitle-m);
|
|
190
|
+
font-weight: var(--font-weight-subtitle-m);
|
|
191
|
+
line-height: var(--line-height-subtitle-m);
|
|
192
|
+
letter-spacing: var(--letter-spacing-subtitle-m);
|
|
193
|
+
color: var(--color-white);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.timeline-step__title--horizontal {
|
|
197
|
+
margin-top: 16px;
|
|
198
|
+
margin-bottom: 8px;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* Description */
|
|
202
|
+
.timeline-step__description {
|
|
203
|
+
font-family: var(--font-family-manrope);
|
|
204
|
+
font-size: var(--font-size-body-s);
|
|
205
|
+
font-weight: var(--font-weight-body-s);
|
|
206
|
+
line-height: var(--line-height-body-s);
|
|
207
|
+
letter-spacing: var(--letter-spacing-body-s);
|
|
208
|
+
color: rgb(209, 213, 219);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.timeline-step__description--horizontal {
|
|
212
|
+
max-width: 192px;
|
|
213
|
+
}
|
|
214
|
+
</style>
|
|
215
|
+
|
|
@@ -1,41 +1,120 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2025 Grupo DedSec S.A. de C.V.
|
|
4
|
+
* Este código fuente es propiedad exclusiva de Grupo DedSec S.A. de C.V.
|
|
5
|
+
* Se prohíbe su uso, reproducción, distribución o modificación, total o parcial, sin autorización expresa por escrito.
|
|
6
|
+
* No se permite el uso comercial ni la redistribución pública del mismo.
|
|
7
|
+
* Para licenciamiento, contactar a: admin@dedsec.com.mx
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Átomo: TimelineStep
|
|
12
|
+
* @description Paso individual de una línea de tiempo con ícono, título y descripción
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export interface Props {
|
|
16
|
+
icon: string;
|
|
4
17
|
title: string;
|
|
5
|
-
|
|
18
|
+
description: string;
|
|
19
|
+
stepNumber: number;
|
|
20
|
+
isVertical?: boolean;
|
|
21
|
+
animationDelay?: number;
|
|
6
22
|
class?: string;
|
|
7
23
|
}
|
|
8
24
|
|
|
9
|
-
const {
|
|
25
|
+
const {
|
|
26
|
+
icon,
|
|
27
|
+
title,
|
|
28
|
+
description,
|
|
29
|
+
stepNumber,
|
|
30
|
+
isVertical = false,
|
|
31
|
+
animationDelay = 0,
|
|
32
|
+
class: className = ""
|
|
33
|
+
} = Astro.props;
|
|
10
34
|
|
|
11
|
-
//
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
35
|
+
// Importar los iconos SVG desde assets
|
|
36
|
+
import shieldIcon from '@assets/shield-checkmark-outline.svg?raw';
|
|
37
|
+
import searchIcon from '@assets/search-outline.svg?raw';
|
|
38
|
+
import cardIcon from '@assets/card-outline.svg?raw';
|
|
39
|
+
import chartIcon from '@assets/bar-chart-outline.svg?raw';
|
|
40
|
+
import trophyIcon from '@assets/trophy-outline.svg?raw';
|
|
41
|
+
import userIcon from '@assets/person-outline.svg?raw';
|
|
42
|
+
import documentIcon from '@assets/document-text-outline.svg?raw';
|
|
43
|
+
import laptopIcon from '@assets/laptop-outline.svg?raw';
|
|
44
|
+
import cashIcon from '@assets/cash-outline.svg?raw';
|
|
45
|
+
import pieIcon from '@assets/pie-chart-outline.svg?raw';
|
|
46
|
+
|
|
47
|
+
// Mapeo de iconos disponibles
|
|
48
|
+
const iconMap: Record<string, string> = {
|
|
49
|
+
shield: shieldIcon,
|
|
50
|
+
search: searchIcon,
|
|
51
|
+
card: cardIcon,
|
|
52
|
+
chart: chartIcon,
|
|
53
|
+
trophy: trophyIcon,
|
|
54
|
+
user: userIcon,
|
|
55
|
+
'document-text': documentIcon,
|
|
56
|
+
laptop: laptopIcon,
|
|
57
|
+
cash: cashIcon,
|
|
58
|
+
pie: pieIcon
|
|
16
59
|
};
|
|
17
60
|
|
|
18
|
-
const
|
|
61
|
+
const iconSvg = iconMap[icon] || iconMap.shield;
|
|
19
62
|
---
|
|
20
63
|
|
|
21
|
-
<div class={`
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
64
|
+
<div class={`timeline-step ${isVertical ? 'vertical' : 'horizontal'} ${className}`}>
|
|
65
|
+
<div class="timeline-icon-container relative">
|
|
66
|
+
<!-- Ícono principal -->
|
|
67
|
+
<div
|
|
68
|
+
class="w-12 h-12 bg-primary-60 rounded-full flex items-center justify-center relative z-10 mb-4"
|
|
69
|
+
set:html={iconSvg.replace('<svg', `<svg width="${isVertical ? '20' : '24'}" height="${isVertical ? '20' : '24'}" class="text-primary-90"`)}
|
|
70
|
+
></div>
|
|
71
|
+
|
|
72
|
+
<!-- Efecto pulse animado -->
|
|
73
|
+
<div
|
|
74
|
+
class="absolute -top-2 -left-2 w-16 h-16 border-2 border-primary-60/30 rounded-full animate-pulse"
|
|
75
|
+
style={`animation-delay: ${animationDelay}s;`}
|
|
76
|
+
></div>
|
|
77
|
+
|
|
78
|
+
<!-- Conector vertical (solo para timeline vertical) -->
|
|
79
|
+
{isVertical && stepNumber < 5 && (
|
|
80
|
+
<div class="absolute top-12 left-1/2 transform -translate-x-1/2 w-0.5 h-16 bg-primary-60/30"></div>
|
|
81
|
+
)}
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<!-- Contenido del paso -->
|
|
85
|
+
<div class={`timeline-content ${isVertical ? 'flex-1 ml-4' : 'text-center'}`}>
|
|
86
|
+
<h3 class={`subtitle-m-style text-white ${isVertical ? ' ' : 'mb-2 mt-4'}`}>
|
|
87
|
+
{stepNumber}. {title}
|
|
88
|
+
</h3>
|
|
89
|
+
<p class={`body-s-style text-gray-300 ${!isVertical ? 'max-w-48' : ''}`}>
|
|
90
|
+
{description}
|
|
91
|
+
</p>
|
|
30
92
|
</div>
|
|
31
|
-
|
|
32
|
-
<!-- Título -->
|
|
33
|
-
<h4 class="h4-style text-primary-60 font-bold mb-2">
|
|
34
|
-
{title}
|
|
35
|
-
</h4>
|
|
36
|
-
|
|
37
|
-
<!-- Texto descriptivo -->
|
|
38
|
-
<p class="body-m-style text-white leading-relaxed">
|
|
39
|
-
{text}
|
|
40
|
-
</p>
|
|
41
93
|
</div>
|
|
94
|
+
|
|
95
|
+
<style>
|
|
96
|
+
.timeline-step.horizontal {
|
|
97
|
+
@apply flex flex-col items-center w-1/5 relative;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.timeline-step.vertical {
|
|
101
|
+
@apply flex items-start;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.timeline-step.vertical .timeline-icon-container {
|
|
105
|
+
@apply flex-shrink-0 relative;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.timeline-step.horizontal .timeline-icon-container {
|
|
109
|
+
@apply relative;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@keyframes pulse {
|
|
113
|
+
0%, 100% { opacity: 0.3; }
|
|
114
|
+
50% { opacity: 0.1; }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.animate-pulse {
|
|
118
|
+
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
|
119
|
+
}
|
|
120
|
+
</style>
|
package/src/index.ts
CHANGED
|
@@ -6,6 +6,15 @@
|
|
|
6
6
|
// ============================================
|
|
7
7
|
export { default as Button } from "./components/atoms/Button.astro";
|
|
8
8
|
export { default as ContactIcon } from "./components/atoms/ContactIcon.astro";
|
|
9
|
+
export { default as FooterLink } from "./components/atoms/FooterLink.astro";
|
|
10
|
+
export { default as FormInput } from "./components/atoms/FormInput.astro";
|
|
11
|
+
export { default as IconCard } from "./components/atoms/IconCard.astro";
|
|
12
|
+
export { default as Logo } from "./components/atoms/Logo.astro";
|
|
13
|
+
export { default as NavLink } from "./components/atoms/NavLink.astro";
|
|
14
|
+
export { default as SocialIcon } from "./components/atoms/SocialIcon.astro";
|
|
15
|
+
export { default as TabButton } from "./components/atoms/TabButton.astro";
|
|
16
|
+
export { default as TextMono } from "./components/atoms/TextMono.astro";
|
|
17
|
+
export { default as TimelineStep } from "./components/atoms/TimelineStep.astro";
|
|
9
18
|
// export { default as Input } from "./components/atoms/Input.astro";
|
|
10
19
|
// export { default as Label } from "./components/atoms/Label.astro";
|
|
11
20
|
|