ywana-core8 0.1.95 → 0.1.98

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,195 @@
1
+ import React, { useState } from 'react'
2
+ import { LoginBox } from './LoginBox'
3
+
4
+ /**
5
+ * LoginBox Examples
6
+ *
7
+ * Ejemplos de uso del componente LoginBox con diferentes configuraciones
8
+ * para verificar el centrado de iconos en los textfields.
9
+ */
10
+
11
+ export const LoginBoxExamples = () => {
12
+ const [loginState, setLoginState] = useState({
13
+ loading: false,
14
+ message: '',
15
+ lastLogin: null
16
+ })
17
+
18
+ const handleLogin = (user, password) => {
19
+ console.log('Login attempt:', { user, password })
20
+
21
+ setLoginState(prev => ({ ...prev, loading: true, message: '' }))
22
+
23
+ // Simular proceso de login
24
+ setTimeout(() => {
25
+ if (user === 'admin' && password === 'admin') {
26
+ setLoginState({
27
+ loading: false,
28
+ message: '',
29
+ lastLogin: { user, timestamp: new Date() }
30
+ })
31
+ console.log('Login successful!')
32
+ } else {
33
+ setLoginState({
34
+ loading: false,
35
+ message: 'Usuario o contraseña incorrectos',
36
+ lastLogin: null
37
+ })
38
+ }
39
+ }, 2000)
40
+ }
41
+
42
+ const resetLogin = () => {
43
+ setLoginState({
44
+ loading: false,
45
+ message: '',
46
+ lastLogin: null
47
+ })
48
+ }
49
+
50
+ return (
51
+ <div style={{
52
+ padding: '2rem',
53
+ backgroundColor: '#f5f5f5',
54
+ minHeight: '100vh',
55
+ display: 'flex',
56
+ flexDirection: 'column',
57
+ gap: '2rem'
58
+ }}>
59
+ <h1>LoginBox Examples</h1>
60
+
61
+ {/* Ejemplo 1: LoginBox básico */}
62
+ <div style={{
63
+ backgroundColor: 'white',
64
+ padding: '2rem',
65
+ borderRadius: '8px',
66
+ boxShadow: '0 2px 10px rgba(0,0,0,0.1)',
67
+ maxWidth: '400px'
68
+ }}>
69
+ <h2>1. LoginBox Básico</h2>
70
+ <p>LoginBox estándar con labels en español</p>
71
+ <LoginBox
72
+ userLabel="Usuario"
73
+ passwordLabel="Contraseña"
74
+ loginLabel="Iniciar Sesión"
75
+ onOK={handleLogin}
76
+ loading={loginState.loading}
77
+ message={loginState.message}
78
+ />
79
+ {loginState.lastLogin && (
80
+ <div style={{
81
+ marginTop: '1rem',
82
+ padding: '1rem',
83
+ backgroundColor: '#e8f5e8',
84
+ borderRadius: '4px',
85
+ fontSize: '0.9rem'
86
+ }}>
87
+ ✅ Login exitoso: {loginState.lastLogin.user}
88
+ <br />
89
+ {loginState.lastLogin.timestamp.toLocaleString()}
90
+ <br />
91
+ <button onClick={resetLogin} style={{ marginTop: '0.5rem' }}>
92
+ Reset
93
+ </button>
94
+ </div>
95
+ )}
96
+ </div>
97
+
98
+ {/* Ejemplo 2: LoginBox con valores predefinidos */}
99
+ <div style={{
100
+ backgroundColor: 'white',
101
+ padding: '2rem',
102
+ borderRadius: '8px',
103
+ boxShadow: '0 2px 10px rgba(0,0,0,0.1)',
104
+ maxWidth: '400px'
105
+ }}>
106
+ <h2>2. LoginBox con Valores Predefinidos</h2>
107
+ <p>Para probar el centrado de iconos con texto existente</p>
108
+ <LoginBox
109
+ userLabel="Email"
110
+ userValue="usuario@ejemplo.com"
111
+ passwordLabel="Password"
112
+ passwordValue="password123"
113
+ loginLabel="Sign In"
114
+ onOK={(user, pass) => console.log('Login with preset values:', { user, pass })}
115
+ />
116
+ </div>
117
+
118
+ {/* Ejemplo 3: LoginBox en inglés */}
119
+ <div style={{
120
+ backgroundColor: 'white',
121
+ padding: '2rem',
122
+ borderRadius: '8px',
123
+ boxShadow: '0 2px 10px rgba(0,0,0,0.1)',
124
+ maxWidth: '400px'
125
+ }}>
126
+ <h2>3. LoginBox en Inglés</h2>
127
+ <p>Labels en inglés para verificar diferentes longitudes de texto</p>
128
+ <LoginBox
129
+ userLabel="Username"
130
+ passwordLabel="Password"
131
+ loginLabel="Log In"
132
+ onOK={(user, pass) => console.log('English login:', { user, pass })}
133
+ />
134
+ </div>
135
+
136
+ {/* Ejemplo 4: LoginBox con contenido adicional */}
137
+ <div style={{
138
+ backgroundColor: 'white',
139
+ padding: '2rem',
140
+ borderRadius: '8px',
141
+ boxShadow: '0 2px 10px rgba(0,0,0,0.1)',
142
+ maxWidth: '400px'
143
+ }}>
144
+ <h2>4. LoginBox con Contenido Adicional</h2>
145
+ <p>LoginBox con elementos adicionales en el footer</p>
146
+ <LoginBox
147
+ userLabel="Usuario"
148
+ passwordLabel="Contraseña"
149
+ loginLabel="Entrar"
150
+ onOK={(user, pass) => console.log('Login with extra content:', { user, pass })}
151
+ >
152
+ <div style={{
153
+ width: '100%',
154
+ textAlign: 'center',
155
+ marginTop: '1rem',
156
+ fontSize: '0.9rem',
157
+ color: '#666'
158
+ }}>
159
+ <a href="#" style={{ color: '#2196f3', textDecoration: 'none' }}>
160
+ ¿Olvidaste tu contraseña?
161
+ </a>
162
+ <br />
163
+ <span style={{ fontSize: '0.8rem' }}>
164
+ ¿No tienes cuenta? <a href="#" style={{ color: '#2196f3' }}>Regístrate</a>
165
+ </span>
166
+ </div>
167
+ </LoginBox>
168
+ </div>
169
+
170
+ {/* Información de prueba */}
171
+ <div style={{
172
+ backgroundColor: '#fff3cd',
173
+ padding: '1rem',
174
+ borderRadius: '4px',
175
+ border: '1px solid #ffeaa7',
176
+ maxWidth: '600px'
177
+ }}>
178
+ <h3>💡 Información de Prueba</h3>
179
+ <p><strong>Para probar el login exitoso:</strong></p>
180
+ <ul>
181
+ <li>Usuario: <code>admin</code></li>
182
+ <li>Contraseña: <code>admin</code></li>
183
+ </ul>
184
+ <p><strong>Verificar centrado de iconos:</strong></p>
185
+ <ul>
186
+ <li>Los iconos de "clear" (X) deben aparecer centrados verticalmente en los campos</li>
187
+ <li>El icono de "visibility toggle" en el campo de contraseña debe estar centrado</li>
188
+ <li>Probar en diferentes tamaños de pantalla (responsive)</li>
189
+ </ul>
190
+ </div>
191
+ </div>
192
+ )
193
+ }
194
+
195
+ export default LoginBoxExamples
@@ -0,0 +1,159 @@
1
+ #!/bin/bash
2
+
3
+ # 🧪 Script de Prueba para el Publisher
4
+ # ====================================
5
+ # Este script muestra cómo se ve el publisher sin hacer cambios reales
6
+
7
+ # Colores para output
8
+ RED='\033[0;31m'
9
+ GREEN='\033[0;32m'
10
+ YELLOW='\033[1;33m'
11
+ BLUE='\033[0;34m'
12
+ PURPLE='\033[0;35m'
13
+ CYAN='\033[0;36m'
14
+ NC='\033[0m' # No Color
15
+
16
+ # Función para mostrar barras de progreso
17
+ show_progress() {
18
+ local duration=$1
19
+ local message=$2
20
+ local progress=0
21
+ local bar_length=50
22
+
23
+ echo -e "${CYAN}${message}${NC}"
24
+
25
+ while [ $progress -le $duration ]; do
26
+ local filled=$((progress * bar_length / duration))
27
+ local empty=$((bar_length - filled))
28
+
29
+ printf "\r${GREEN}["
30
+ printf "%*s" $filled | tr ' ' '='
31
+ printf "%*s" $empty | tr ' ' '-'
32
+ printf "]${NC} %d%%" $((progress * 100 / duration))
33
+
34
+ sleep 0.05
35
+ progress=$((progress + 1))
36
+ done
37
+ echo ""
38
+ }
39
+
40
+ # Función para mostrar spinner
41
+ show_spinner() {
42
+ local duration=$1
43
+ local message=$2
44
+ local spin='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
45
+ local i=0
46
+ local count=0
47
+
48
+ echo -e "${CYAN}${message}${NC}"
49
+ while [ $count -lt $duration ]; do
50
+ i=$(( (i+1) %10 ))
51
+ printf "\r${YELLOW}${spin:$i:1}${NC} Procesando..."
52
+ sleep 0.1
53
+ count=$((count + 1))
54
+ done
55
+ printf "\r${GREEN}✓${NC} Completado\n"
56
+ }
57
+
58
+ # Función para log con timestamp
59
+ log() {
60
+ local level=$1
61
+ local message=$2
62
+ local timestamp=$(date '+%H:%M:%S')
63
+
64
+ case $level in
65
+ "INFO") echo -e "${BLUE}[${timestamp}]${NC} ${message}" ;;
66
+ "SUCCESS") echo -e "${GREEN}[${timestamp}] ✓${NC} ${message}" ;;
67
+ "WARNING") echo -e "${YELLOW}[${timestamp}] ⚠${NC} ${message}" ;;
68
+ "ERROR") echo -e "${RED}[${timestamp}] ✗${NC} ${message}" ;;
69
+ esac
70
+ }
71
+
72
+ # Banner inicial
73
+ echo -e "${PURPLE}"
74
+ echo "╔══════════════════════════════════════════════════════════════╗"
75
+ echo "║ 🧪 DEMO PUBLISHER ║"
76
+ echo "║ (Modo de Prueba - Sin Cambios) ║"
77
+ echo "╚══════════════════════════════════════════════════════════════╝"
78
+ echo -e "${NC}"
79
+
80
+ COMMIT_MESSAGE="Demo: Migración completa a Vite con mejoras de rendimiento"
81
+ log "INFO" "Mensaje de commit: ${COMMIT_MESSAGE}"
82
+
83
+ echo ""
84
+ log "INFO" "Iniciando pipeline de publicación (DEMO)..."
85
+
86
+ # PASO 1: Verificaciones Previas
87
+ echo -e "\n${PURPLE}📋 PASO 1: Verificaciones Previas${NC}"
88
+ log "INFO" "Rama actual: main"
89
+ log "SUCCESS" "Working directory limpio"
90
+ log "SUCCESS" "Conexión a internet OK"
91
+ log "SUCCESS" "Verificaciones previas completadas"
92
+
93
+ # PASO 2: Tests
94
+ echo -e "\n${PURPLE}🧪 PASO 2: Ejecutando Tests${NC}"
95
+ log "INFO" "Ejecutando suite de tests..."
96
+ show_spinner 25 "Ejecutando tests"
97
+ log "SUCCESS" "Todos los tests pasaron (19 suites, 348 tests)"
98
+
99
+ # PASO 3: Build
100
+ echo -e "\n${PURPLE}🔨 PASO 3: Building Proyecto${NC}"
101
+ log "SUCCESS" "Build anterior eliminado"
102
+ log "INFO" "Iniciando build con Vite..."
103
+ show_spinner 15 "Compilando con Vite"
104
+ log "SUCCESS" "Build completado en 1.37s"
105
+
106
+ echo -e "${CYAN}📦 Archivos generados:${NC}"
107
+ echo -e " index.css (1.4M)"
108
+ echo -e " index.js (1.6M)"
109
+ echo -e " index.modern.js (1.6M)"
110
+ echo -e " index.umd.js (1.7M)"
111
+
112
+ # PASO 4: Versión
113
+ echo -e "\n${PURPLE}📈 PASO 4: Incrementando Versión${NC}"
114
+ CURRENT_VERSION=$(node -p "require('./package.json').version" 2>/dev/null || echo "0.1.95")
115
+ NEW_VERSION="0.1.96"
116
+ log "INFO" "Versión actual: v${CURRENT_VERSION}"
117
+ log "SUCCESS" "Nueva versión: v${NEW_VERSION}"
118
+
119
+ # PASO 5: Git
120
+ echo -e "\n${PURPLE}📤 PASO 5: Git Commit y Push${NC}"
121
+ log "INFO" "Añadiendo archivos al staging..."
122
+ show_progress 20 "Preparando commit..."
123
+ FULL_COMMIT_MESSAGE="v${NEW_VERSION}: ${COMMIT_MESSAGE}"
124
+ log "INFO" "Creando commit: ${FULL_COMMIT_MESSAGE}"
125
+ log "SUCCESS" "Commit creado (DEMO - no real)"
126
+ log "SUCCESS" "Tag v${NEW_VERSION} creado (DEMO - no real)"
127
+ show_spinner 20 "Subiendo cambios a GitHub"
128
+ log "SUCCESS" "Push completado exitosamente (DEMO - no real)"
129
+
130
+ # PASO 6: NPM
131
+ echo -e "\n${PURPLE}📦 PASO 6: Publicando a NPM${NC}"
132
+ log "INFO" "Usuario NPM: demo-user"
133
+ show_spinner 30 "Publicando a NPM Registry"
134
+ log "SUCCESS" "Paquete publicado exitosamente (DEMO - no real)"
135
+
136
+ # RESUMEN FINAL
137
+ echo -e "\n${GREEN}"
138
+ echo "╔══════════════════════════════════════════════════════════════╗"
139
+ echo "║ 🎉 DEMO COMPLETADO ║"
140
+ echo "╚══════════════════════════════════════════════════════════════╝"
141
+ echo -e "${NC}"
142
+
143
+ echo -e "${CYAN}📊 Resumen de la publicación (DEMO):${NC}"
144
+ echo -e " ${GREEN}✓${NC} Versión: v${CURRENT_VERSION} → v${NEW_VERSION}"
145
+ echo -e " ${GREEN}✓${NC} Commit: ${FULL_COMMIT_MESSAGE}"
146
+ echo -e " ${GREEN}✓${NC} Rama: main"
147
+ echo -e " ${GREEN}✓${NC} Usuario NPM: demo-user"
148
+ echo -e " ${GREEN}✓${NC} Build time: 1.37s"
149
+
150
+ echo -e "\n${CYAN}🔗 Enlaces útiles:${NC}"
151
+ echo -e " 📦 NPM: https://www.npmjs.com/package/ywana-core8"
152
+ echo -e " 🐙 GitHub: https://github.com/ywana/ywana-core8"
153
+ echo -e " 📋 Tag: https://github.com/ywana/ywana-core8/releases/tag/v${NEW_VERSION}"
154
+
155
+ echo -e "\n${CYAN}📥 Para instalar la nueva versión:${NC}"
156
+ echo -e " ${YELLOW}npm install ywana-core8@${NEW_VERSION}${NC}"
157
+
158
+ echo -e "\n${GREEN}🚀 ¡Demo completado exitosamente!${NC}"
159
+ echo -e "${PURPLE}Para usar el publisher real, ejecuta: ./publish.sh${NC}\n"
package/vite.config.js ADDED
@@ -0,0 +1,86 @@
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+ import { resolve } from 'path'
4
+
5
+ export default defineConfig({
6
+ plugins: [
7
+ react({
8
+ // Usar React.createElement como microbundle
9
+ jsxRuntime: 'classic',
10
+ // Incluir archivos .js que contengan JSX
11
+ include: /\.(jsx|js|ts|tsx)$/
12
+ })
13
+ ],
14
+
15
+ build: {
16
+ lib: {
17
+ entry: resolve(__dirname, 'src/index.js'),
18
+ name: 'YwanaCore8',
19
+ formats: ['es', 'cjs', 'umd'],
20
+ fileName: (format) => {
21
+ switch (format) {
22
+ case 'es':
23
+ return 'index.modern.js'
24
+ case 'cjs':
25
+ return 'index.js'
26
+ case 'umd':
27
+ return 'index.umd.js'
28
+ default:
29
+ return `index.${format}.js`
30
+ }
31
+ }
32
+ },
33
+
34
+ rollupOptions: {
35
+ // Externalizar peer dependencies
36
+ external: ['react', 'react-dom'],
37
+ output: {
38
+ globals: {
39
+ react: 'React',
40
+ 'react-dom': 'ReactDOM'
41
+ },
42
+ // Configurar nombres de archivos CSS
43
+ assetFileNames: (assetInfo) => {
44
+ if (assetInfo.name && assetInfo.name.endsWith('.css')) {
45
+ return 'index.css'
46
+ }
47
+ return assetInfo.name
48
+ }
49
+ }
50
+ },
51
+
52
+ // No comprimir como microbundle --no-compress
53
+ minify: false,
54
+
55
+ // Generar sourcemaps
56
+ sourcemap: true
57
+ },
58
+
59
+ // Configuración para desarrollo
60
+ server: {
61
+ port: 3000,
62
+ open: false
63
+ },
64
+
65
+ // Configurar esbuild para JSX en archivos .js
66
+ esbuild: {
67
+ loader: 'jsx',
68
+ include: /src\/.*\.js$/,
69
+ exclude: []
70
+ },
71
+
72
+ // Resolver alias si es necesario
73
+ resolve: {
74
+ alias: {
75
+ '@': resolve(__dirname, 'src')
76
+ }
77
+ },
78
+
79
+ // Configuración para testing con Vitest
80
+ test: {
81
+ environment: 'jsdom',
82
+ setupFiles: ['./src/setupTests.js'],
83
+ globals: true,
84
+ css: true
85
+ }
86
+ })
@@ -0,0 +1,42 @@
1
+ import { defineConfig } from 'vitest/config'
2
+ import react from '@vitejs/plugin-react'
3
+ import { resolve } from 'path'
4
+
5
+ export default defineConfig({
6
+ plugins: [
7
+ react({
8
+ jsxRuntime: 'classic'
9
+ })
10
+ ],
11
+
12
+ test: {
13
+ environment: 'jsdom',
14
+ setupFiles: ['./src/setupTests.js'],
15
+ globals: true,
16
+ css: true,
17
+
18
+ // Configuración similar a Jest
19
+ include: [
20
+ 'src/**/__tests__/**/*.(js|jsx)',
21
+ 'src/**/?(*.)(spec|test).(js|jsx)'
22
+ ],
23
+
24
+ coverage: {
25
+ include: [
26
+ 'src/**/*.(js|jsx)'
27
+ ],
28
+ exclude: [
29
+ 'src/index.js',
30
+ 'src/setupTests.js',
31
+ 'src/**/*.test.(js|jsx)',
32
+ 'src/**/*.spec.(js|jsx)'
33
+ ]
34
+ }
35
+ },
36
+
37
+ resolve: {
38
+ alias: {
39
+ '@': resolve(__dirname, 'src')
40
+ }
41
+ }
42
+ })