Blog

IONIC 5 ya está aquí

¿Por qué IONIC?

Ya desde la primera versión vinieron pisando fuerte, y apostaron por utilizar Angular, que ya había demostrado ser un framework muy recomendable, ya que proporcionaba una estabilidad, modularidad y escalabilidad únicas en el código generado. Gracias a ese alto potencial, los creadores de IONIC predijeron que esa fusión permitiría el desarrollo de aplicaciones híbridas que podrían llegar a competir incluso con las nativas (https://ionicframework.com/present-ionic/slides).

Angular hace posible que podamos desarrollar aplicaciones complejas con tecnología web. Esto se consigue gracias a que permite al programador crear nuevas etiquetas HTML, y componentes específicos incrustados en una arquitectura vista-controlador, muy adecuada en el desarrollo de aplicaciones para dispositivos móviles.

Además, desde un principio se ha mantenido la filosofía de no obligar al programador a adquirir conocimientos complejos ni específicos de cada plataforma, ni a tener que desarrollar un código diferente para acceder al hardware de los distintos dispositivos móviles:

  • Por un lado, se utiliza Angular para aprovechar las habilidades de muchos desarrolladores web que ya conocen los conceptos de componentes, directivas y servicios, que además son completamente compatibles con cualquier navegador, y permiten por lo tanto utilizar un sólo código fuente compatible con dispositivos muy diferentes.
  • Por otro lado, se utiliza Cordova para acceder al hardware de los dispositivos, permitiendo interactuar con el mismo utilizando código Javascript.

IONIC destacó principalmente porque aportaba una interfaz de usuario muy atractiva que combinada con Angular y Cordova, proporcionaba al programador un entorno único en su época para el desarrollo de aplicaciones híbridas:

Fuimos muchos los que descubrimos y utilizamos esas primeras versiones para desarrollar aplicaciones (https://showcase.ionicframework.com/apps/archive), y prueba de ello fue que la Play Store y la App Store comenzaron a recibir una gran cantidad de aplicaciones híbridas, que además era rápidas y estables, unas características que hace años sólo podían encontrarse en aplicaciones nativas.

Sin embargo, esas primeras versiones obligaban a los desarrolladores de IONIC a ir adaptando su código a medida que Angular iba evolucionando. Aunque eso ya ha cambiado…

¿Por qué IONIC 5?

Somos muy afortunados de poder disfrutar actualmente de todo el potencial de este framework que desde su versión 4 incluye mejoras muy importantes. En el siguiente enlace podemos consultar la documentación actualizada: https://ionicframework.com/docs.

Los cambios respecto a la versión 3 son muy significativos (https://blog.ionicframework.com/introducing-ionic-4-ionic-for-everyone) y desde luego no dejan lugar a dudas para decantarnos por la última versión de IONIC para desarrollar nuestros proyectos web, o aplicaciones móviles híbridas.

El objetivo original de IONIC era desarrollar una librería compatible con cualquier tecnología web, y que pudiera incluirse en cualquier proyecto independientemente de la librería o framework que ya estuviera utilizando el programador. Y esto no era posible, hasta ahora…

En la práctica, los últimos cambios hechos en la arquitectura de la librería, permiten que los componentes de IONIC se puedan utilizar con la misma simpleza que cualquier otra etiqueta HTML, pero nos proporcionan una funcionalidad ampliada. Por ejemplo, podríamos hacer uso de la etiqueta  <ion-button></ion-button> en cualquier framework, e incluso de manera independiente (sin ninguna arquitectura o código base específico), utilizando la sencilla sintaxis de Javascript. En esta última versión, el navegador puede reconocer los nuevos elementos HTML sin realizar ningún tipo de modificación en nuestro código.

Ya que tenemos el lujo de poder utilizar IONIC 5, no vamos a dejar escapar la posibilidad de disfrutar de la sencillez, facilidad de desarrollo y versatilidad que nos proporciona esta última versión, tal como apreciaremos en los próximos ejercicios.

Calculadora con estilo personalizable utilizando IONIC 5

¿Cómo podemos utilizar IONIC 5?

Si deseamos utilizar IONIC 5, sólo necesitaremos enlazar los archivos JavaScript y CSS, tal como se especifica en la documentación y en github:

...
<script type="module" src="https://cdn.jsdelivr.net/npm/@ionic/[email protected]/dist/ionic/ionic.esm.js"></script>
<script nomodule src="https://cdn.jsdelivr.net/npm/@ionic/[email protected]/dist/ionic/ionic.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ionic/[email protected]/css/ionic.bundle.css"/>
...

De esta forma quedarán definidos automáticamente los nuevos elementos, haciéndolos completamente accesibles al navegador para que nosotros sólo tengamos que escribir la etiqueta correspondiente en nuestro archivo HTML. A su vez además podremos interactuar con ellos utilizando código JavaScript.

Esta magnífica innovación que nos proporciona IONIC desde su versión 4 simplifica muchísimo el acceso a sus archivos, ya que podemos utilizarlos sin necesidad de descargar ni instalar absolutamente nada.

Como se puede observar, estamos utilizamos la versión 5.0.7 de IONIC, que es la última que actualmente podemos encontrar en repositorio. Por otro lado, si deseáramos utilizar siempre la última versión, también podríamos acceder a dichos archivos utilizando la referencia «@ionic/core@latest». En tal caso, debemos tener en cuenta que con el paso del tiempo deberíamos comprobar si los últimos cambios pudieran afectar al código que escribimos inicialmente.

Más adelante describiremos el procedimiento para acceder a la funcionalidad de IONIC sin enlazar el código directamente desde Internet y así evitaremos que se descargue cada vez. Sin embargo, de momento podemos centrarnos en el código y el resultado, utilizando un simple editor de texto, sin necesidad de tener que instalar nada en nuestros equipos para poder utilizar IONIC.

Colocando los botones

En el ejemplo anterior hemos utilizado una tabla de HTML para distribuir los botones en filas y columnas. Sin embargo, las tablas se usan cada vez menos con este propósito. En su lugar se suele utilizar código CSS para ubicar o distribuir los diferentes elementos.

En este aspecto, IONIC nos proporciona una herramienta increíble conocida como grid, que tiene un comportamiento muy similar al de otras librerías de desarrollo web, como por ejemplo Bootstrap.

IONIC ha creado para nosotros tres nuevos elementos HTML que nos permiten establecer una cuadrícula muy fácilmente. Delimitamos los elementos que vamos a colocar mediante <ion-grid></ion-grid>  y luego establecemos las filas mediante <ion-row></ion-row> y las columnas con <ion-col></ion-col>.

Gracias a esto, podemos distribuir los botones de la calculadora utilizando el elemento grid de IONIC con un código casi idéntico al que utilizaríamos con una simple tabla de HTML, simplemente reemplazando las etiquetas de la siguiente forma:

  • <table></table> -> <ion-grid></ion-grid>
  • <tr></tr> -> <ion-row></ion-row>
  • <td></td> -> <ion-col></ion-col>

Y no sólo nos proporciona una forma sencilla de realizar dicha distribución, sino que nos aporta mucha más flexibilidad que las tablas de HTML, tal como se puede observar en la documentación oficial. Además, por defecto ocupará todo el ancho de la pantalla (el comportamiento esperado en cualquier dispositivo móvil) y cada fila podrá tener un número diferente de columnas, cuya anchura se distribuirá por defecto de manera uniforme.

Por ejemplo, para dibujar la siguiente tabla:

0
123+
456
789*
0/
AC.=

En el ejercicio anterior hemos utilizado el siguiente código HTML:

<table>
  <tr>
    <td colspan="4">0</td>
  </tr>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>+</td>
  </tr>
  <tr>
    <td>4</td>
    <td>5</td>
    <td>6</td>
    <td>-</td>
  </tr>
  <tr>
    <td>7</td>
    <td>8</td>
    <td>9</td>
    <td>*</td>
  </tr>
  <tr>
    <td colspan="3">0</td>
    <td>/</td>          
  </tr>
  <tr>
    <td colspan="2">AC</td>
    <td>.</td>
    <td>=</td>            
  </tr>
</table>

Si utilizamos los nuevos elementos que nos proporciona IONIC 5, obtendríamos el mismo resultado con el siguiente código:

<ion-grid>
  <ion-row>
    <ion-col>0</ion-col>
  </ion-row>
  <ion-row>
    <ion-col>1</ion-col>
    <ion-col>2</ion-col>
    <ion-col>3</ion-col>
    <ion-col>+</ion-col>
  </ion-row>
  <ion-row>
    <ion-col>4</ion-col>
    <ion-col>5</ion-col>
    <ion-col>6</ion-col>
    <ion-col>-</ion-col>
  </ion-row>
  <ion-row>
    <ion-col>7</ion-col>
    <ion-col>8</ion-col>
    <ion-col>9</ion-col>
    <ion-col>*</ion-col>
  </ion-row>
  <ion-row>
    <ion-col size="9">0</ion-col>
    <ion-col>/</ion-col>
  </ion-row>
  <ion-row>
    <ion-col size="6">AC</ion-col>
    <ion-col>.</ion-col>
    <ion-col>=</ion-col>
  </ion-row>
</ion-grid>

Tenemos que destacar la forma que nos ofrece IONIC 5 para establecer el tamaño de una celda en concreto. Por ejemplo, en nuestro caso, para conseguir que la tecla del cero ocupe 3/4 de la pantalla, y que la tecla de borrado ocupe la mitad, ajustamos el valor del atributo size en el elemento ion-col:

...
<ion-row>
  <ion-col size="9">0</ion-col>
  <ion-col>/</ion-col>
</ion-row>
<ion-row>
  <ion-col size="6">AC</ion-col>
  <ion-col>.</ion-col>
  <ion-col>=</ion-col>
</ion-row>
...

IONIC establece por defecto que en la pantalla caben 12 columnas. Por lo tanto, al especificar <ion-col size="9">0</ion-col>, estamos diciéndole al navegador que esa celda ocupará 9 columnas de un total de 12, es decir, 3/4 de la pantalla. Y al especificar <ion-col size="6">AC</ion-col>, estamos diciéndole al navegador que esa celda ocupará 6 columnas de un total de 12, es decir, la mitad de la pantalla.

Observamos además que en la primera fila, donde mostramos el resultado, no hace falta especificar el tamaño, ya que por defecto, la celda se expande automáticamente para ocupar todo el ancho de la fila.

Veremos más adelante que el número de columnas por defecto se puede configurar cambiando el valor de la variable CSS --ion-grid-columns.

Los nuevos botones

Con IONIC 5 disponemos de un nuevo elemento <ion-button></ion-button>. Se utiliza de forma similar al <button></button> de HTML, pero como podemos leer en la documentación, ahora podemos cambiar el aspecto del botón mediante atributos específicos tales como expand, fill, size o color. Por ejemplo, podríamos definir el botón de borrado de la siguiente forma, sin necesidad de utilizar ningún otro código adicional:

<ion-button color="danger" expand="block" onclick="del()">AC</ion-button>

El navegador nos mostrará automáticamente un botón de color rojo que ocupará todo el ancho de la columna.

Como podemos observar, la sencillez y similitud respecto al código básico HTML son obvias. El mayor cambio en este nuevo elemento es que ahora no necesitamos ajustar ninguna propiedad CSS para obtener el aspecto deseado, tal como hacíamos antes:

.ac {
  color: red;
}
<button class="ac">AC</button>

Para cambiar el estilo

En este apartado comenzaremos a apreciar la verdadera magia de IONIC 5. Fijémos en la similitud entre este código:

<select>
    <option value="clear">Sin borde ni color</option>
    <option value="outline">Sólo borde</option>
    <option value="solid" selected>Con color de fondo</option>
</select>

y este otro:

<ion-select value="solid">
  <ion-select-option value="clear">Sin borde ni color</ion-select-option>
  <ion-select-option value="outline">Sólo borde</ion-select-option>
  <ion-select-option value="solid">Con color de fondo</ion-select-option>
</ion-select>

A simple vista podemos intuir que el resultado debería ser el mismo. Sin embargo, al pulsar sobre el segundo select, nos aparecerá un cuadro de diálogo con un diseño muy cuidado que además será diferente en móviles IOS y en Android. Además, por defecto dispondremos de un botón para aceptar y otro para cancelar.

En la documentación de IONIC podemos deleitarnos observando el resultado que llegaremos a obtener haciendo uso de este nuevo elemento. Encontraremos además en ese enlace todos los posibles atributos con sus posibles respectivos valores, que nos permitirán ajustar el comportamiento del mismo a nuestros gustos y necesidades.

Debemos matizar que para obtener una correcta visualización, deberemos incluir cada elemento dentro de una lista, tal como se observa en los ejemplos, y que utilizaremos el elemento <ion-label></ion-label> para establecer el texto descriptivo, que también disparará el evento onclick automáticamente al pulsar encima. Por ejemplo, en nuestro caso:

<ion-list>
  <ion-item>
    <ion-label>Tamaño botones</ion-label>
    <ion-select value="default" id="size">
      <ion-select-option value="small">Pequeños</ion-select-option>
      <ion-select-option value="default">Medianos</ion-select-option>
      <ion-select-option value="large">Grandes</ion-select-option>
    </ion-select>
  </ion-item>
  <ion-item>
    <ion-label>Tipo botones</ion-label>
    <ion-select value="solid" id="type">
      <ion-select-option value="clear">Sin borde ni color</ion-select-option>
      <ion-select-option value="outline">Sólo borde</ion-select-option>
      <ion-select-option value="solid">Con color de fondo</ion-select-option>
    </ion-select>
  </ion-item>
</ion-list>

¿Estilo IOS o Android?

La verdad es que resulta difícil contestar a esa pregunta, y por eso los desarrolladores de IONIC nos permiten elegir el aspecto que van a tener los diferentes elementos de nuestros formularios. Para ello han añadido el atributo mode a muchos elementos, de forma que podamos especificar los valores «ios» o «md».

En caso de que queramos cambiar el estilo de todos los elementos de la calculadora al mismo tiempo, IONIC también nos permite hacerlo modificando la url, tal como se especifica en la documentación:

  • index.html?ionic:mode=md
  • index.html?ionic:mode=ios

Para mejorar el diseño de la calculadora, añadiremos a la misma un encabezado (elemento <ion-header></ion-header>) que contendrá un título y dos botones con un atributo href que apuntarán a esas dos urls. Además, observaremos al probar la nueva calculadora que el propio estilo del encabezado que contiene esos dos botones también se actualizará:

<ion-header>
  <ion-toolbar>
    <ion-title>Calculator</ion-title>
    <ion-buttons slot="secondary">
      <ion-button href="index.html?ionic:mode=md">Android</ion-button>
    </ion-buttons>
    <ion-buttons slot="primary">
      <ion-button href="index.html?ionic:mode=ios">IOS</ion-button>
    </ion-buttons>
  </ion-toolbar>
</ion-header>

Cuando iniciemos la aplicación, ésta se mostrará automáticamente utilizando el estilo de la plataforma en la que se esté ejecutando.

¿Código JavaScript adicional?

Pues la verdad es que muy poco:

function onLoad() {
    document.addEventListener("ionChange", setStyle);
    setStyle();
}

function setStyle() {
    document.querySelectorAll("ion-content ion-button").forEach(function(b) {
        b.expand = "block";
        b.strong = "true";
        b.fill = document.getElementById("type").value;
        b.size = document.getElementById("size").value;
    });
}

Los elementos <ion-select></ion-select> generarán un evento ionChange automáticamente cada vez que cambie el valor seleccionado. Lo único que tenemos que hacer es estar atentos y volver a ajustar el diseño de la calculadora cuando se dispare dicho evento. Para que se ejecute una acción automáticamente al detectar cualquier cambio, utilizamos la siguiente línea:

document.addEventListener("ionChange", setStyle);

Una vez se ejecute la función setStyle(), lo único que tendremos que hacer es recorrer todos los botones y actualizar las propiedades que queramos. En nuestro caso podemos cambiar las siguientes propiedades:

  • expand: «block»
  • strong: «true»
  • fill: «clear», «outline» o «solid»
  • size: «small», «default» o «large»

Podemos volver a consultar la respectiva documentación si deseamos realizar cualquier modificación en el código.

En resumen…

El fichero index.html

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">

  <script type="module" src="https://cdn.jsdelivr.net/npm/@ionic/[email protected]/dist/ionic/ionic.esm.js"></script>
  <script nomodule src="https://cdn.jsdelivr.net/npm/@ionic/[email protected]/dist/ionic/ionic.js"></script>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ionic/[email protected]/css/ionic.bundle.css"/>

  <script src="calculator.js"></script>

  <title>Calculator!</title>
</head>

<body onload="onLoad()">
  <ion-app>
    <ion-header>
      <ion-toolbar>
        <ion-title>Calculator</ion-title>
        <ion-buttons slot="secondary">
          <ion-button href="index.html?ionic:mode=md">Android</ion-button>
        </ion-buttons>
        <ion-buttons slot="primary">
          <ion-button href="index.html?ionic:mode=ios">IOS</ion-button>
        </ion-buttons>
      </ion-toolbar>
    </ion-header>

    <ion-content>
      <ion-list>
        <ion-item>
          <ion-label>Tamaño botones</ion-label>
          <ion-select value="default" id="size">
            <ion-select-option value="small">Pequeños</ion-select-option>
            <ion-select-option value="default">Medianos</ion-select-option>
            <ion-select-option value="large">Grandes</ion-select-option>
          </ion-select>
        </ion-item>
        <ion-item>
          <ion-label>Tipo botones</ion-label>
          <ion-select value="solid" id="type">
            <ion-select-option value="clear">Sin borde ni color</ion-select-option>
            <ion-select-option value="outline">Sólo borde</ion-select-option>
            <ion-select-option value="solid">Con color de fondo</ion-select-option>
          </ion-select>
        </ion-item>
      </ion-list>
      <ion-grid>
        <ion-row>
          <ion-col><ion-button color="dark"><span id="result">0</span></ion-button></ion-col>
        </ion-row>
        <ion-row>
          <ion-col><ion-button color="primary" onclick="add('1')">1</ion-button></ion-col>
          <ion-col><ion-button color="primary" onclick="add('2')">2</ion-button></ion-col>
          <ion-col><ion-button color="primary" onclick="add('3')">3</ion-button></ion-col>
          <ion-col><ion-button color="tertiary" onclick="add('+')">+</ion-button></ion-col>
        </ion-row>
        <ion-row>
          <ion-col><ion-button color="primary" onclick="add('4')">4</ion-button></ion-col>
          <ion-col><ion-button color="primary" onclick="add('5')">5</ion-button></ion-col>
          <ion-col><ion-button color="primary" onclick="add('6')">6</ion-button></ion-col>
          <ion-col><ion-button color="tertiary" onclick="add('-')">-</ion-button></ion-col>
        </ion-row>
        <ion-row>
          <ion-col><ion-button color="primary" onclick="add('7')">7</ion-button></ion-col>
          <ion-col><ion-button color="primary" onclick="add('8')">8</ion-button></ion-col>
          <ion-col><ion-button color="primary" onclick="add('9')">9</ion-button></ion-col>
          <ion-col><ion-button color="tertiary" onclick="add('*')">*</ion-button></ion-col>
        </ion-row>
        <ion-row>
          <ion-col size="9"><ion-button color="primary" onclick="add('0')">0</ion-button></ion-col>
          <ion-col><ion-button color="tertiary" onclick="add('/')">/</ion-button></ion-col>
        </ion-row>
        <ion-row>
          <ion-col size="6"><ion-button color="danger" onclick="del()">AC</ion-button></ion-col>
          <ion-col><ion-button color="primary" onclick="add('.')">.</ion-button></ion-col>
          <ion-col><ion-button color="tertiary" onclick="calc()">=</ion-button></ion-col>
        </ion-row>
      </ion-grid>
    </ion-content>
  </ion-app>
</body>
</html>

El fichero calculator.js

function onLoad() {
    document.addEventListener("ionChange", setStyle);
    setStyle();
}

function setStyle() {
    document.querySelectorAll("ion-content ion-button").forEach(function(b) {
        b.expand = "block";
        b.strong = "true";
        b.fill = document.getElementById("type").value;
        b.size = document.getElementById("size").value;
    });
}

function setResult(value) {
    document.getElementById("result").innerHTML = value;
}

function getResult() {
    return(document.getElementById("result").innerHTML);
}

function add(key) {
    var result = getResult();
    if (result!="0" || isNaN(key)) setResult(result + key);
    else setResult(key);
}

function calc() {
    var result = eval(getResult());
    setResult(result);
}

function del() {
    setResult(0);
}

El resultado

Puedes hacer clic aquí para observar el aspecto que tiene la calculadora y probar la funcionalidad resultante utilizando el código especificado.

Cuentos para ser recordados

Diez relatos recomendados para todos los públicos

Relatos infantiles inspirados en numerosos cuentos populares orientales con el objetivo de lograr incluir esas grandes enseñanzas que se llevan transmitiendo desde hace tantos años, y que conviene seguir recordando. Es un libro recomendado para pequeños y mayores, y por ello se ha utilizado un lenguaje asequible para los niños, sin olvidar que también es importante conseguir emocionar a los adultos.

Historias que invitan a reflexionar y ensalzan el valor de la amistad y la familia

Se abordan situaciones que se pueden resolver con un poco de tolerancia, compromiso, disciplina, esfuerzo y trabajo en equipo. Además, se intentan transmitir valores que contribuyan a potenciar nuestras capacidades: amistad, superación, valentía, sabiduría, respeto, deportividad, diversidad e integración.

  • Aunque sea de noche y haga un frío que pela: Jugar al fútbol con tus amigos es un excelente motivo para levantarse pronto un sábado por la mañana. Un buen ambiente en el terreno de juego amenizará todas las situaciones, por complicadas que sean.
  • ¡Shhhhhhh!: A veces es importante guardar silencio. Podemos mejorar nuestras habilidades si cumplimos las normas y nos comprometemos a dar lo mejor de nosotros mismos.
  • Cajas de cartón: Todos tenemos alguna habilidad que nos hace únicos y especiales, y no hay mayor satisfacción que ver una cara feliz como resultado de nuestro trabajo.
  • No lo puedo evitar: Cuando tu hermano pequeño te hace rabiar, piensa en algo para intentar evitar pelearte con él. Enfadarse no conduce a nada, y a veces los problemas se solucionan simplemente con un poco de paciencia.
  • Alumnos tranquilos: Un profesor inquieto y unos alumnos muy tranquilos. Con iniciativa y creatividad podemos adelantarnos para abordar y superar con éxito cualquier situación.
  • El cinturón negro: El color del cinturón infunde confianza y respeto, pero sólo los mejores maestros son merecedores de la máxima distinción. Detrás de cada victoria o logro personal hay un trabajo de esfuerzo y sacrificio que merece la pena.
  • La primera lección: Es importante ser humilde y reconocer cuánto nos queda por aprender.
  • Escuchando a todos para entender a cada uno: Debemos ponernos en el lugar de los demás para lograr entender los problemas específicos que se planteen en cada momento.
  • Hasta que aprendáis de una escoba: Un padre en apuros intenta que sus hijos consigan gestionar su tiempo libre para encontrar el equilibrio adecuado entre sus obligaciones y sus devociones.
  • La búsqueda del tesoro solidario: Unos jovencitos con mucha iniciativa se enfrentarán a diversos retos y utilizarán hábilmente su ingenio para intentar salir airosos. El trabajo en equipo es uno de los pilares fundamentales para superar cualquier desafío. Hacer piña con nuestros compañeros nos permite conseguir los mejores resultados.

Otros libros del autor

Todos los beneficios son para Alianza española de familias de VHL

Comprando el libro aportamos un granito de arena para ayudar a la asociación de enfermos de von Hippel-Lindau (alianzavhl.org). Por ello, no sólo pretendemos regalar ilusión a quien lo lea, sino a todos aquellos enfermos y familiares que están esperando que les echemos una mano, ya que todos los beneficios de la venta del libro van destinados íntegramente a ellos.

La contraseña

Nuestro protagonista intentará abrir una caja misteriosa con un martillo… ¿lo conseguirá?

Un fantástico reto que conducirá al protagonista a resolver diversos acertijos con ayuda de sus padres.

Bilingüe

Texto en castellano y en inglés. Incluye ilustraciones relacionadas con el cuento para aprender el abecedario, repartidas en tres secciones:

  • Learn the alphabet
  • Letter … is for …
  • Spell it out

Nueva edición con letra caligráfica

Ideal para aprender a leer y escribir, en castellano y en inglés.

Otros libros de la serie «Cuentos para ser escuchados»

También está disponible la colección completa de cuentos en español en un solo libro, además de la edición especial de cada uno de los relatos en su versión bilingüe, con más ilustraciones, en formato de libro electrónico y en papel:

  1. El médico que no creía en los besitos
  2. Tú me dictas y yo escribo
  3. Para que coman los gatos
  4. Mi almuerzo
  5. El cuentacuentos
  6. Las hadas de las profesiones
  7. Déjalo como está
  8. No te entiendo
  9. ¡¡¡Grrrrrrr!!!
  10. Leo, mi mejor amigo
  11. La princesa y el viajero
  12. La contraseña

Alianza VHL

Todos los beneficios son para Alianza española de familias de VHL (alianzavhl.org).

La princesa y el viajero

¿Alguna vez has mirado a lo lejos esperando ver a alguien?

A veces encuentras tu destino en el camino menos esperado… Pero hay que ser muy perseverante y seguir caminando hasta que encuentras lo que estás buscando…

Bilingüe

Texto en castellano y en inglés. Incluye ilustraciones relacionadas con el cuento para aprender el abecedario, repartidas en tres secciones:

  • Learn the alphabet
  • Letter … is for …
  • Spell it out

Nueva edición con letra caligráfica

Ideal para aprender a leer y escribir, en castellano y en inglés.

Otros libros de la serie «Cuentos para ser escuchados»

También está disponible la colección completa de cuentos en español en un solo libro, además de la edición especial de cada uno de los relatos en su versión bilingüe, con más ilustraciones, en formato de libro electrónico y en papel:

  1. El médico que no creía en los besitos
  2. Tú me dictas y yo escribo
  3. Para que coman los gatos
  4. Mi almuerzo
  5. El cuentacuentos
  6. Las hadas de las profesiones
  7. Déjalo como está
  8. No te entiendo
  9. ¡¡¡Grrrrrrr!!!
  10. Leo, mi mejor amigo
  11. La princesa y el viajero
  12. La contraseña

Alianza VHL

Todos los beneficios son para Alianza española de familias de VHL (alianzavhl.org).

Leo, mi mejor amigo

¿Por qué el cielo está gris y nublado?

Una conmovedora historia dedicada a esos amigos incondicionales que siempre están a nuestro lado, pase lo que pase, sin pedir nunca nada a cambio.

Bilingüe

Texto en castellano y en inglés. Incluye ilustraciones relacionadas con el cuento para aprender el abecedario, repartidas en tres secciones:

  • Learn the alphabet
  • Letter … is for …
  • Spell it out

Nueva edición con letra caligráfica

Ideal para aprender a leer y escribir, en castellano y en inglés.

Otros libros de la serie «Cuentos para ser escuchados»

También está disponible la colección completa de cuentos en español en un solo libro, además de la edición especial de cada uno de los relatos en su versión bilingüe, con más ilustraciones, en formato de libro electrónico y en papel:

  1. El médico que no creía en los besitos
  2. Tú me dictas y yo escribo
  3. Para que coman los gatos
  4. Mi almuerzo
  5. El cuentacuentos
  6. Las hadas de las profesiones
  7. Déjalo como está
  8. No te entiendo
  9. ¡¡¡Grrrrrrr!!!
  10. Leo, mi mejor amigo
  11. La princesa y el viajero
  12. La contraseña

Alianza VHL

Todos los beneficios son para Alianza española de familias de VHL (alianzavhl.org).

¡¡¡Grrrrrrr!!!

¿Oyes eso?

¿Quién está gruñendo? ¿Es el ruido del viento? ¿Es un animal peligroso?. Esta historia te pondrá los pelos de punta…

Bilingüe

Texto en castellano y en inglés. Incluye ilustraciones relacionadas con el cuento para aprender el abecedario, repartidas en tres secciones:

  • Learn the alphabet
  • Letter … is for …
  • Spell it out

Nueva edición con letra caligráfica

Ideal para aprender a leer y escribir, en castellano y en inglés.

Otros libros de la serie «Cuentos para ser escuchados»

También está disponible la colección completa de cuentos en español en un solo libro, además de la edición especial de cada uno de los relatos en su versión bilingüe, con más ilustraciones, en formato de libro electrónico y en papel:

  1. El médico que no creía en los besitos
  2. Tú me dictas y yo escribo
  3. Para que coman los gatos
  4. Mi almuerzo
  5. El cuentacuentos
  6. Las hadas de las profesiones
  7. Déjalo como está
  8. No te entiendo
  9. ¡¡¡Grrrrrrr!!!
  10. Leo, mi mejor amigo
  11. La princesa y el viajero
  12. La contraseña

Alianza VHL

Todos los beneficios son para Alianza española de familias de VHL (alianzavhl.org).

No te entiendo

¿Podemos hablar sin palabras? ¿Podemos entendernos sin hablar?

En esta didáctica historia será una niña muy perseverante quien nos enseñe lo fácil que puede resultar llegar a entablar conversación con alguien que parece que nos ignora.

Bilingüe

Texto en castellano y en inglés. Incluye ilustraciones relacionadas con el cuento para aprender el abecedario, repartidas en tres secciones:

  • Learn the alphabet
  • Letter … is for …
  • Spell it out

Nueva edición con letra caligráfica

Ideal para aprender a leer y escribir, en castellano y en inglés.

Otros libros de la serie «Cuentos para ser escuchados»

También está disponible la colección completa de cuentos en español en un solo libro, además de la edición especial de cada uno de los relatos en su versión bilingüe, con más ilustraciones, en formato de libro electrónico y en papel:

  1. El médico que no creía en los besitos
  2. Tú me dictas y yo escribo
  3. Para que coman los gatos
  4. Mi almuerzo
  5. El cuentacuentos
  6. Las hadas de las profesiones
  7. Déjalo como está
  8. No te entiendo
  9. ¡¡¡Grrrrrrr!!!
  10. Leo, mi mejor amigo
  11. La princesa y el viajero
  12. La contraseña

Alianza VHL

Todos los beneficios son para Alianza española de familias de VHL (alianzavhl.org).

Déjalo como está

¿Qué hay que hacer con las cosas que se rompen?

La acumulación de basura puede llegar a convertirse en un gran problema.

Bilingüe

Texto en castellano y en inglés. Incluye ilustraciones relacionadas con el cuento para aprender el abecedario, repartidas en tres secciones:

  • Learn the alphabet
  • Letter … is for …
  • Spell it out

Nueva edición con letra caligráfica

Ideal para aprender a leer y escribir, en castellano y en inglés.

Otros libros de la serie «Cuentos para ser escuchados»

También está disponible la colección completa de cuentos en español en un solo libro, además de la edición especial de cada uno de los relatos en su versión bilingüe, con más ilustraciones, en formato de libro electrónico y en papel:

  1. El médico que no creía en los besitos
  2. Tú me dictas y yo escribo
  3. Para que coman los gatos
  4. Mi almuerzo
  5. El cuentacuentos
  6. Las hadas de las profesiones
  7. Déjalo como está
  8. No te entiendo
  9. ¡¡¡Grrrrrrr!!!
  10. Leo, mi mejor amigo
  11. La princesa y el viajero
  12. La contraseña

Alianza VHL

Todos los beneficios son para Alianza española de familias de VHL (alianzavhl.org).

Las hadas de las profesiones

¿Qué quieres ser de mayor?

¿Alguna vez te han dicho que tienes la cabeza llena de pájaros? ¿Alguna vez has querido ser inventor?

Bilingüe

Texto en castellano y en inglés. Incluye ilustraciones relacionadas con el cuento para aprender el abecedario, repartidas en tres secciones:

  • Learn the alphabet
  • Letter … is for …
  • Spell it out

Nueva edición con letra caligráfica

Ideal para aprender a leer y escribir, en castellano y en inglés.

Otros libros de la serie «Cuentos para ser escuchados»

También está disponible la colección completa de cuentos en español en un solo libro, además de la edición especial de cada uno de los relatos en su versión bilingüe, con más ilustraciones, en formato de libro electrónico y en papel:

  1. El médico que no creía en los besitos
  2. Tú me dictas y yo escribo
  3. Para que coman los gatos
  4. Mi almuerzo
  5. El cuentacuentos
  6. Las hadas de las profesiones
  7. Déjalo como está
  8. No te entiendo
  9. ¡¡¡Grrrrrrr!!!
  10. Leo, mi mejor amigo
  11. La princesa y el viajero
  12. La contraseña

Alianza VHL

Todos los beneficios son para Alianza española de familias de VHL (alianzavhl.org).