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.
@@ -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
- export interface Props {
3
- icon: "phone" | "mail" | "location";
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
- text: string;
18
+ description: string;
19
+ stepNumber: number;
20
+ isVertical?: boolean;
21
+ animationDelay?: number;
6
22
  class?: string;
7
23
  }
8
24
 
9
- const { icon, title, text, class: className = "" } = Astro.props;
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
- // Mapeo de íconos a archivos SVG
12
- const iconMap = {
13
- phone: "/src/assets/phone-portrait-outline.svg",
14
- mail: "/src/assets/mail-outline.svg",
15
- location: "/src/assets/location-outline.svg",
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 iconSrc = iconMap[icon];
61
+ const iconSvg = iconMap[icon] || iconMap.shield;
19
62
  ---
20
63
 
21
- <div class={`flex flex-col items-center text-center ${className}`}>
22
- <!-- Ícono SVG -->
23
- <div class="mb-4 flex h-12 w-12 items-center justify-center">
24
- <img
25
- src={iconSrc}
26
- alt={`${title} icon`}
27
- class="h-12 w-12 text-primary-60 fill-primary-60"
28
- aria-hidden="true"
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