├── .gitignore ├── views ├── notFound.js ├── main.js └── projects.js ├── package.json ├── LICENSE ├── readme.md └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | coverage/ 3 | npm-debug.log* 4 | .nyc_output 5 | .vscode -------------------------------------------------------------------------------- /views/notFound.js: -------------------------------------------------------------------------------- 1 | var html = require('bel') 2 | var css = require('sheetify') 3 | 4 | var container = css` 5 | :host { 6 | height: 97vh; 7 | transition: all 0.5s; 8 | } 9 | ` 10 | 11 | function notFoundView (params, store) { 12 | return html`
13 |
14 |

15 | 404 16 | No encontrado 17 |

18 |
19 |
` 20 | } 21 | 22 | module.exports = notFoundView 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "projects", 3 | "description": "web portfolio", 4 | "author": "yerkopalma", 5 | "version": "0.1.0", 6 | "main": "index.js", 7 | "private": true, 8 | "files": [ 9 | "index.js" 10 | ], 11 | "scripts": { 12 | "test": "standard --verbose | snazzy", 13 | "start": "bankai index.js -A 0.0.0.0 -p 8080 -a .", 14 | "build": "NODE_ENV=production bankai build --optimize dist/" 15 | }, 16 | "repository": "yerkopalma/projects", 17 | "license": "MIT", 18 | "keywords": [ 19 | "web", 20 | "portfolio" 21 | ], 22 | "dependencies": { 23 | "bel": "^4.6.0", 24 | "sheetify": "^6.0.2", 25 | "singleton-router": "^1.4.2", 26 | "tachyons": "^4.7.1" 27 | }, 28 | "devDependencies": { 29 | "bankai": "^7.5.0", 30 | "browserify-markdown": "^2.0.1", 31 | "snazzy": "^7.0.0", 32 | "standard": "^10.0.2", 33 | "uglifyify": "^3.0.4", 34 | "uglifyjs": "^2.4.10" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Yerko Palma 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /views/main.js: -------------------------------------------------------------------------------- 1 | var html = require('bel') 2 | var css = require('sheetify') 3 | 4 | var bgColors = [ 5 | 'light-red', 6 | 'gold', 7 | 'light-purple', 8 | 'pink', 9 | 'green', 10 | 'blue', 11 | 'yellow', 12 | 'light-green' 13 | ] 14 | 15 | var container = css` 16 | :host { 17 | height: 97vh; 18 | transition: all 0.5s; 19 | } 20 | ` 21 | 22 | var renderProjects = function (projects) { 23 | projects.sort(function () { return 0.5 - Math.random() }) 24 | bgColors.sort(function () { return 0.5 - Math.random() }) 25 | return projects.map(function (project, i) { 26 | return html` 27 | 28 | ${project && project.title 29 | ? html`
30 |

${project.title}

31 |

${project.description}

32 |
` 33 | : html`
34 | 36 |
`} 37 | 38 |
` 39 | }) 40 | } 41 | 42 | function mainView (params, projects) { 43 | return html` 44 |
45 |
46 |

Proyectos

47 |
48 | ${renderProjects(projects)} 49 |
50 |
51 |
` 52 | } 53 | 54 | module.exports = mainView 55 | -------------------------------------------------------------------------------- /views/projects.js: -------------------------------------------------------------------------------- 1 | var html = require('bel') 2 | var css = require('sheetify') 3 | 4 | var container = css` 5 | :host { 6 | height: 97vh; 7 | transition: all 0.5s; 8 | } 9 | ` 10 | var octoCat = css` 11 | :host svg { 12 | position:absolute; 13 | right:0; 14 | top:0; 15 | mix-blend-mode:darken; 16 | color:#ffffff;fill:#000000; 17 | } 18 | :host:hover .octo-arm { 19 | animation:octocat-wave .56s; 20 | } 21 | @keyframes octocat-wave { 22 | 0%, 100% { 23 | transform:rotate(0); 24 | } 25 | 20%, 60% { 26 | transform:rotate(-20deg); 27 | } 28 | 40%, 80% { 29 | transform:rotate(10deg); 30 | } 31 | }` 32 | 33 | function projectView (params, projects) { 34 | var project = projects[params.project] 35 | if (!project) return require('./notFound')() 36 | return html`
37 |
38 | 39 | 40 | 41 | 42 | 43 |

${project.title} ${siteLink(project.site)}

44 | ${octolink(project.github)} 45 |
46 |
` 47 | } 48 | 49 | function octolink (repo) { 50 | if (repo) { 51 | return html`` 52 | } 53 | } 54 | 55 | function siteLink (site) { 56 | if (site) { 57 | return html` 58 | 59 | ` 60 | } 61 | } 62 | module.exports = projectView 63 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # projects 2 | [![Build Status](https://img.shields.io/travis/yerkopalma/projects/master.svg?style=flat-square)](https://travis-ci.org/yerkopalma/projects) [![test coverage](https://img.shields.io/codecov/c/github/yerkopalma/projects/master.svg?style=flat-square)](https://codecov.io/github/yerkopalma/projects) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard) 3 | 4 | > web portfolio 5 | 6 | ## Projects 7 | 8 | ### palmacontabilidad.cl 9 | 10 | ![palmacontabilidad.cl][palmacontabilidad.cl] 11 | Uno de los primeros sitios que desarrollé, y que he reconstruido por lo menos unas 4 veces. 12 | Se trata básicamente de una landing page hecha para la empresa de contabilidad de mi papá. 13 | Originalmente, desarrollé la primera versión usando jquery y plantillas de [Bootstrap][bootstrap] 3, cuando recién habia aparecido esa versión, luego, reconstruí la página sin usar Bootstrap, actualmente, la página esta desarrollada con [Vue][vue] 1.x y [materializecss][materializecss]. 14 | 15 | ### salvador.palmanavea.com 16 | 17 | ![salvador.palmanavea.com][salvador.palmanavea.com] 18 | Para el primer cumpleaños de mi hijo, quise hacerle un regalo especial. Pense primero (y aún lo pienso a veces), en crear un juego para él, pero descarte temporalmente esa idea, ya que estaba corto de tiempo, y era recien su primer cumpleaños. 19 | Entonces decidí crear una línea de tiempo para mi hijo, usé un template de [codrops][codrops], y compré un dominio "familiar". Más adelante agregué más plugins, mejoré el soporte de imagenes y videos usando [lightgallery][lightgallery] (incluso tuve que corregir un [issue][lg-issue] que no permitia ver imagenes y videos en la misma página) y me quede con el framework [choo][choo] 3.x. 20 | Cada año la iré actualizando y mejorando, quién sabe, quizas le agregue algún juego, o música, todo puede pasar... 21 | 22 | ### matrimonio.palmanavea.com 23 | 24 | ![matrimonio.palmanavea.com][matrimonio.palmanavea.com] 25 | El verano del 2017 me casé. Junto a mi esposa teniamos que hacer una serie de preparativos (casarse parecese ser más trabajo que cualquier desarrollo de software). Dentro de todo, decidí hacer algo especial para entregar mis partes de matrimonio. 26 | Junto con los partes fisicos, desarrollé una [aplicación web progresiva][pwa] con la información necesaria para asistir a nuestro matrimonio. Utilicé el framework [choo][choo], para el cual desarrollé un [plugin][choo-offline] que aporta las funcionalidades _offline_ que una pwa necesita (uso de [indexDB][indexedDB] y [service workers][sw]). También usé el framework [tachyons][tachyons] (el mismo con el que desarrollé esta página) y [mapbox.js][mapbox.js], para mapbox.js usé un [plugin de direcciones][mapbox-directions] que actualmente no tiene soporte para español (pese a haber una PR abierta para internacionalización), por lo que tuve que públicar [mi propia versión del plugin][scoped-plugin], como un scoped package en npm, que daba el soporte que necesitaba. 27 | 28 | ### senadores 29 | 30 | El año 2017 hay elecciones parlamentarias en Chile y yo siempre he considerado que la información disponible respecto a los candidatos es poca. No sobre los candidatos presidenciales, sino los candidatos a diputados y senadores. 31 | Gracias a la ley de transparencia, hoy esa información esta disponible para quien la solicite, sin embargo, se encuentra en un formato poco amigable y sin un formato accesible para programadores. Es por esto, que decidí juntar en un solo sitio la información del senado y servel y crear una API amigable para programadores con la informacion publica de senadores. 32 | 33 | ### singleton-router 34 | 35 | Como desarrollador javascript, siempre estoy buscando un buen set de herramientas de desarrollo para mis trabajos. Nunca me gustaron mucho las herramientas "de moda" (angular en su momento y react ahora) y he pasado una transición que partió con jquery, luego [vue][vue] y finalmente [choo][choo]. 36 | Este último framework es el que más se acerca a mis expectativas, si no fuese por un solo detalle, el router. Como el [sheet-router][sheet-router], y luego [nanorouter][nanorouter], no cumplian mis expectativas, cree mi propio router y mi propio stack de desarrollo, que se ajusta perfecto a mis expectativas. 37 | 38 | ## License 39 | [MIT](/license) 40 | 41 | [bootstrap]: http://getbootstrap.com/ 42 | [vue]: https://vuejs.org/ 43 | [materializecss]: http://materializecss.com/ 44 | [palmacontabilidad.cl]: https://api.urlbox.io/v1/ca482d7e-9417-4569-90fe-80f7c5e1c781/f916f765f43f7acfc10fda551be806ccc56f82e5/png?url=palmacontabilidad.cl 45 | [salvador.palmanavea.com]: https://api.urlbox.io/v1/ca482d7e-9417-4569-90fe-80f7c5e1c781/15a27488df9d7bda08381c4236050a637745b7bb/png?url=salvador.palmanavea.com 46 | [matrimonio.palmanavea.com]: https://api.urlbox.io/v1/ca482d7e-9417-4569-90fe-80f7c5e1c781/b015cb4e4f6c3a53f771737729abeb9f97ce54bc/png?url=matrimonio.palmanavea.com 47 | [codrops]: https://tympanus.net/codrops/ 48 | [lightgallery]: https://github.com/sachinchoolur/lightgallery.js 49 | [lg-issue]: https://github.com/sachinchoolur/lightgallery.js/issues/41 50 | [choo]: https://choo.io/ 51 | [pwa]: https://en.wikipedia.org/wiki/Progressive_web_app 52 | [choo-offline]: https://github.com/YerkoPalma/choo-offline 53 | [indexedDB]: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API 54 | [sw]: https://developers.google.com/web/fundamentals/getting-started/primers/service-workers 55 | [mapbox.js]: https://www.mapbox.com/mapbox.js/api/v3.1.0/ 56 | [mapbox-directions]: https://www.mapbox.com/mapbox.js/example/v1.0.0/mapbox-directions/ 57 | [scoped-plugin]: https://www.npmjs.com/package/@yerkopalma/mapbox-directions.js 58 | [tachyons]: http://tachyons.io/ 59 | [sheet-router]: https://github.com/yoshuawuyts/sheet-router 60 | [nanorouter]: https://github.com/yoshuawuyts/nanorouter 61 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var Router = require('singleton-router') 2 | var css = require('sheetify') 3 | var html = require('bel') 4 | 5 | css('tachyons') 6 | 7 | var projects = [ 8 | {title: 'senadores', description: 'Datos públicos disponibles en la página www.senado.cl', github: 'https://github.com/senadores-chile>', body: html`

El año 2017 hay elecciones parlamentarias en Chile y yo siempre he considerado que la información disponible respecto a los candidatos es poca. No sobre los candidatos presidenciales, sino los candidatos a diputados y senadores. Gracias a la ley de transparencia, hoy esa información esta disponible para quien la solicite, sin embargo, se encuentra en un formato poco amigable y sin un formato accesible para programadores. Es por esto, que decidí juntar en un solo sitio la información del senado y servel y crear una API amigable para programadores con la informacion publica de senadores.

`}, 9 | {title: 'Salvador', description: 'Pequeño sitio web que mantengo para mi hijo', github: 'https://github.com/YerkoPalma/salvador', site: 'http://salvador.palmanavea.com/', body: html`
salvador.palmanavea.com

Para el primer cumpleaños de mi hijo, quise hacerle un regalo especial. Pense primero (y aún lo pienso a veces), en crear un juego para él, pero descarte temporalmente esa idea, ya que estaba corto de tiempo, y era recien su primer cumpleaños. Entonces decidí crear una línea de tiempo para mi hijo, usé un template de codrops , y compré un dominio "familiar". Más adelante agregué más plugins, mejoré el soporte de imagenes y videos usando lightgallery (incluso tuve que corregir un issue que no permitia ver imagenes y videos en la misma página) y me quede con el framework choo 3.x. Cada año la iré actualizando y mejorando, quién sabe, quizas le agregue algún juego, o música, todo puede pasar…

`}, 10 | {title: 'Matrimonio', description: 'Parte de matrimonio interactivo (PWA)', site: 'https://matrimonio.palmanavea.com', body: html`
matrimonio.palmanavea.com

El verano del 2017 me casé. Junto a mi esposa teniamos que hacer una serie de preparativos (casarse parecese ser más trabajo que cualquier desarrollo de software). Dentro de todo, decidí hacer algo especial para entregar mis partes de matrimonio. Junto con los partes fisicos, desarrollé una aplicación web progresiva con la información necesaria para asistir a nuestro matrimonio. Utilicé el framework choo , para el cual desarrollé un plugin que aporta las funcionalidades offline que una pwa necesita (uso de IndexedDB y service workers). También usé el framework tachyons (el mismo con el que desarrollé esta página) y mapbox.js, para mapbox.js usé un plugin de direcciones que actualmente no tiene soporte para español (pese a haber una PR abierta para internacionalización), por lo que tuve que públicar mi propia versión del plugin, como un scoped package en npm, que daba el soporte que necesitaba.

`}, 11 | {title: 'singleton-router', description: 'Router front end a la medida', github: 'https://github.com/YerkoPalma/singleton-router', body: html`

Como desarrollador javascript, siempre estoy buscando un buen set de herramientas de desarrollo para mis trabajos. Nunca me gustaron mucho las herramientas “de moda” (angular en su momento y react ahora) y he pasado una transición que partió con jquery, luego vue y finalmente choo. Este último framework es el que más se acerca a mis expectativas, si no fuese por un solo detalle, el router. Como sheet-router , y luego nanorouter , no cumplian mis expectativas, cree mi propio router y mi propio stack de desarrollo, que se ajusta perfecto a mis expectativas.

`}, 12 | {title: 'Palma contabilidad', description: 'Contador independiente', site: 'http://palmacontabilidad.cl/', body: html`
palmacontabilidad.cl

Uno de los primeros sitios que desarrollé, y que he reconstruido por lo menos unas 4 veces.Se trata básicamente de una landing page hecha para la empresa de contabilidad de mi papá.Originalmente, desarrollé la primera versión usando jquery y plantillas de Bootstrap 3, cuando recién habia aparecido esa versión, luego, reconstruí la página sin usar Bootstrap, actualmente, la página esta desarrollada con Vue 1.x y materializecss.

`}, 13 | {}, 14 | {}, 15 | {} 16 | ] 17 | 18 | var router = Router({ onRender: onRender }) 19 | 20 | router.addRoute('/', require('./views/main')) 21 | router.addRoute('/:project', require('./views/projects'), function (params) { 22 | var currentProject = projects[params.project] 23 | if (currentProject.body) document.getElementById('projectBody').appendChild(currentProject.body) 24 | }) 25 | router.notFound(require('./views/notFound')) 26 | router.setStore(projects) // hacking 27 | router.setRoot('/') 28 | router.start() 29 | 30 | function onRender (currentView, previousView, cb) { 31 | // make dissappear the previousView 32 | previousView.addEventListener('transitionend', function (e) { 33 | if (currentView && currentView.classList) { 34 | // currentView.classList.add('t') 35 | currentView.style.transition = 'all 0.5s' 36 | currentView.classList.add('o-0') 37 | } 38 | // e.stopPropagation() 39 | // replace it with the currentView 40 | router.rootEl.appendChild(currentView) 41 | router.rootEl.removeChild(previousView) 42 | // make it appear 43 | if (currentView && currentView.classList) currentView.classList.remove('o-0') 44 | if (typeof cb === 'function') cb(router.currentRoute.params) 45 | 46 | var links = document.querySelectorAll('a[data-route]') 47 | Array.prototype.forEach.call(links, function (link) { 48 | link.addEventListener('click', function (e) { 49 | e.preventDefault() 50 | if (!link.getAttribute('data-bind')) router.goToPath(link.getAttribute('data-route')) 51 | if (typeof router.onNavClick === 'function') router.onNavClick(link.getAttribute('data-route'), link) 52 | }) 53 | }) 54 | }) 55 | if (previousView && previousView.classList) { 56 | // previousView.classList.add('t') 57 | previousView.style.transition = 'all 0.5s' 58 | previousView.classList.add('o-0') 59 | } 60 | } 61 | --------------------------------------------------------------------------------