From 62bd8d50318651b8dd2f879835b87c12d0a5b662 Mon Sep 17 00:00:00 2001 From: Gustavo L Date: Thu, 12 Oct 2023 18:41:11 +0000 Subject: [PATCH 01/10] =?UTF-8?q?a=C3=B1adida=20descripci=C3=B3n=20y=20CTA?= =?UTF-8?q?=20a=20las=20paginas=20de=20caracas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/landing/caracas-aprende-a-programar.es.yml | 12 +++++++++--- .../landing/caracas-bootcamp-de-programacion.es.yml | 12 +++++++++--- .../landing/caracas-curso-de-programacion.es.yml | 12 +++++++++--- .../landing/caracas-tecnologia-financiera.es.yml | 10 ++++++++-- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/data/landing/caracas-aprende-a-programar.es.yml b/src/data/landing/caracas-aprende-a-programar.es.yml index bfffb49cb..594393219 100644 --- a/src/data/landing/caracas-aprende-a-programar.es.yml +++ b/src/data/landing/caracas-aprende-a-programar.es.yml @@ -168,9 +168,15 @@ components: "Todo lo hacemos con pasión y con la mirada puesta en tu desarrollo profesional." #xl lg md sm xs font_size: ["40px", "34px", "34px", "25px", "20px"] - # content: - # text: "" - # # font_size: ["16px"] + content: + text: "Desde mentorías individualizadas hasta proyectos desafiantes, cada paso está diseñado con precisión para impulsar tu éxito en el mundo laboral. Confía en nosotros para ser tu aliado incondicional en este viaje hacia el crecimiento profesional." + font_size: ["16px"] + button: + text: "Únete a la Academia" + background: black + color: white + hover_color: "#FFB718" + path: "#top" # why_python: # position: 7 diff --git a/src/data/landing/caracas-bootcamp-de-programacion.es.yml b/src/data/landing/caracas-bootcamp-de-programacion.es.yml index 24bcd0544..223e06797 100644 --- a/src/data/landing/caracas-bootcamp-de-programacion.es.yml +++ b/src/data/landing/caracas-bootcamp-de-programacion.es.yml @@ -172,9 +172,15 @@ components: "Todo lo hacemos con pasión y con la mirada puesta en tu desarrollo profesional." #xl lg md sm xs font_size: ["40px", "34px", "34px", "25px", "20px"] - # content: - # text: "" - # # font_size: ["16px"] + content: + text: "El Bootcamp de Programación brinda mentorías desafiantes y proyectos estimulantes, meticulosamente planificados para catalizar tu éxito en el ámbito laboral. Puedes confiar en nosotros como tu apoyo incondicional en esta travesía hacia el crecimiento profesional." + font_size: ["16px"] + button: + text: "Únete a la Academia" + background: black + color: white + hover_color: "#white" + path: "https://4geeksacademy.com/us/coding-campus/coding-bootcamp-caracas" # why_python: # position: 7 diff --git a/src/data/landing/caracas-curso-de-programacion.es.yml b/src/data/landing/caracas-curso-de-programacion.es.yml index 0dd5280be..2f010824d 100644 --- a/src/data/landing/caracas-curso-de-programacion.es.yml +++ b/src/data/landing/caracas-curso-de-programacion.es.yml @@ -172,9 +172,15 @@ components: "Todo lo hacemos con pasión y con la mirada puesta en tu desarrollo profesional." #xl lg md sm xs font_size: ["40px", "34px", "34px", "25px", "20px"] - # content: - # text: "" - # # font_size: ["16px"] + content: + text: "Nuestro Curso de Programación ofrece mentorías detalladas y proyectos desafiantes, minuciosamente planeados para impulsar tu éxito en el mundo laboral. Confía en nosotros como tu socio incondicional en esta travesía hacia el crecimiento profesional." + font_size: ["16px"] + button: + text: "Únete a la Academia" + background: black + color: white + hover_color: "#white" + path: "https://4geeksacademy.com/us/coding-campus/coding-bootcamp-caracas" # why_python: # position: 7 diff --git a/src/data/landing/caracas-tecnologia-financiera.es.yml b/src/data/landing/caracas-tecnologia-financiera.es.yml index ea527047e..de798cf16 100644 --- a/src/data/landing/caracas-tecnologia-financiera.es.yml +++ b/src/data/landing/caracas-tecnologia-financiera.es.yml @@ -89,8 +89,8 @@ follow_bar: text: "" program_details: - position: 4 - heading: "Domina Python, JS y React" + position: 1 + heading: "Domina JS, React y Python" sub_heading: "Un bootcamp de programación sobre las tecnologías más usadas del mundo" # Possible layours: [two_column_left_image, two_column_right_image] @@ -156,6 +156,12 @@ components: font_size: ["16px"] text: |

Aprovecha esta alianza y forma parte de la evolución tecnológica a nivel mundial ¡Comienza HOY!

+ button: + text: "Únete a la Academia" + background: black + color: white + hover_color: "#white" + path: "#top" badges: From d0e62a930bb42ebc4f2f6c2fd716b14fd8157784 Mon Sep 17 00:00:00 2001 From: Gustavo L Date: Wed, 18 Oct 2023 14:40:37 +0000 Subject: [PATCH 02/10] issue caracas --- .../caracas-aprende-a-programar.es.yml | 20 ++++++++++++------ .../testimonials/Mattia-Tozzi-testimonial.jpg | Bin 0 -> 39310 bytes 2 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 static/images/testimonials/Mattia-Tozzi-testimonial.jpg diff --git a/src/data/landing/caracas-aprende-a-programar.es.yml b/src/data/landing/caracas-aprende-a-programar.es.yml index 240e241ed..7e3b1ecd1 100644 --- a/src/data/landing/caracas-aprende-a-programar.es.yml +++ b/src/data/landing/caracas-aprende-a-programar.es.yml @@ -149,7 +149,7 @@ components: background: black color: white hover_color: "#FFB718" - path: "https://www.youtube.com/watch?v=plwPwyrxX84" + path: "#why_4geeks" content: text: "Mi experiencia con 4Geeks ha sido magnífica, me ha encantado. Tengo unos profesores maravillosos y tengo unos compañeros súper geniales. He aprendido bastante sobre HTML, CSS, JavaScript, React y Python. Mis profesores siempre estuvieron atentos a lo que necesitaba. Igual hay una plataforma donde podemos hablar todos los estudiantes de 4Geeks y nos ayudamos entre todos.... ¡Ha sido genial tomar esta decisión! -Beatriz Hernández" font_size: ["16px"] @@ -163,16 +163,24 @@ components: image: style: '{ "border" : "3px solid black" }' shadow: true - src: "/images/bg/people_happy.jpg" + src: "../../../static/images/testimonials/Mattia-Tozzi-testimonial.jpg" video: "B01-eTfgqqc" heading: text: - "Todo lo hacemos con pasión y con la mirada puesta en tu desarrollo profesional." + "El viaje de Mattia Tozzi en 4geeks Academy y como cambió su vida profesional." #xl lg md sm xs font_size: ["40px", "34px", "34px", "25px", "20px"] - # content: - # text: "" - # # font_size: ["16px"] + content: + text: "Descubre la cautivadora historia de Mattia Tozzi, quien, en busca de un cambio en su trayectoria profesional, se unió a 4Geeks Academy. Su experiencia es un testimonio vivo de cómo la dedicación y el aprendizaje en este bootcamp lo llevaron a convertirse en un profesional altamente capacitado." + font_size: ["16px"] + button: + text: "Unete a la academia!" + path: "https://4geeksacademy.com/us/coding-campus/coding-bootcamp-caracas" + color: "white" + background: "black" + hover: "lightBlue" + + # why_python: # position: 7 diff --git a/static/images/testimonials/Mattia-Tozzi-testimonial.jpg b/static/images/testimonials/Mattia-Tozzi-testimonial.jpg new file mode 100644 index 0000000000000000000000000000000000000000..669d5ea2771fd6c7eedaa82d680df0a3d482b946 GIT binary patch literal 39310 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

RoiA>@?liM+^b&_ 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 literal 0 HcmV?d00001 From 7b856fba89c45a53e57a3067a0f3724dbd9a24e5 Mon Sep 17 00:00:00 2001 From: Gustavo L Date: Wed, 18 Oct 2023 16:07:40 +0000 Subject: [PATCH 03/10] update upstream master --- src/assets/css/utils.css | 115 ++++++++++++------------- src/components/AlumniProjects/index.js | 54 +++++++----- src/components/Icon/set/group.js | 37 ++++---- src/components/Icon/set/hands.js | 36 ++++---- src/components/Icon/set/stairswflag.js | 36 ++++---- src/components/Icon/set/yellowhat.js | 44 +++++----- src/components/Landing/index.js | 10 +-- src/components/ReactPlayer/index.js | 34 ++++---- src/components/Sections/index.js | 91 +++++++++---------- src/templates/landing_a.js | 5 +- 10 files changed, 230 insertions(+), 232 deletions(-) diff --git a/src/assets/css/utils.css b/src/assets/css/utils.css index dd1e8b0af..d25471481 100644 --- a/src/assets/css/utils.css +++ b/src/assets/css/utils.css @@ -40,93 +40,84 @@ text-transform: capitalize; } - /* Dots */ -.slick-dotted.slick-slider -{ - margin-bottom: 30px; +.slick-dotted.slick-slider { + margin-bottom: 30px; } -.slick-dotss -{ - position: absolute; - bottom: -25px; +.slick-dotss { + position: absolute; + bottom: -25px; - display: block; + display: block; - width: 100%; - padding: 0; - margin: 0; + width: 100%; + padding: 0; + margin: 0; - list-style: none; + list-style: none; - text-align: center; + text-align: center; } -.slick-dotss li -{ - position: relative; +.slick-dotss li { + position: relative; - display: inline-block; + display: inline-block; - width: 20px; - height: 20px; - margin: 0 3px; - padding: 0; + width: 20px; + height: 20px; + margin: 0 3px; + padding: 0; - cursor: pointer; + cursor: pointer; } -.slick-dotss li button -{ - font-size: 0; - line-height: 0; +.slick-dotss li button { + font-size: 0; + line-height: 0; - display: block; + display: block; - width: 20px; - height: 20px; - padding: 5px; + width: 20px; + height: 20px; + padding: 5px; - cursor: pointer; + cursor: pointer; - color: transparent; - border: 0; - outline: none; - background: transparent; + color: transparent; + border: 0; + outline: none; + background: transparent; } .slick-dotss li button:hover, -.slick-dotss li button:focus -{ - outline: none; +.slick-dotss li button:focus { + outline: none; } .slick-dotss li button:hover:before, -.slick-dotss li button:focus:before -{ - opacity: 1; +.slick-dotss li button:focus:before { + opacity: 1; } -.slick-dotss li button:before -{ - font-family: 'slick'; - font-size: 11px; - line-height: 20px; +.slick-dotss li button:before { + font-family: "slick"; + font-size: 11px; + line-height: 20px; - position: absolute; - top: 0; - left: 0; + position: absolute; + top: 0; + left: 0; - width: 20px; - height: 20px; + width: 20px; + height: 20px; - content: '•'; - text-align: center; + content: "•"; + text-align: center; - opacity: .25; - color: black; + opacity: 0.25; + color: black; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } -.slick-dotss li.slick-active button:before -{ - opacity: .75; - color: #0097CD; +.slick-dotss li.slick-active button:before { + opacity: 0.75; + color: #0097cd; } diff --git a/src/components/AlumniProjects/index.js b/src/components/AlumniProjects/index.js index ca404f175..159b81148 100644 --- a/src/components/AlumniProjects/index.js +++ b/src/components/AlumniProjects/index.js @@ -8,7 +8,7 @@ import ReactPlayer from "../ReactPlayer"; import Slider from "react-slick"; import "slick-carousel/slick/slick.css"; import "slick-carousel/slick/slick-theme.css"; -import "../../assets/css/utils.css" +import "../../assets/css/utils.css"; const AlumniProjects = ({ lang, @@ -18,7 +18,7 @@ const AlumniProjects = ({ playerHeight, title, paragraph, - yml + yml, }) => { const [projects, setProjects] = useState( lang[0].node.projects.slice(0, limit || lang[0].node.projects.length) @@ -105,27 +105,28 @@ const AlumniProjects = ({ // } // }; return ( -

diff --git a/src/components/Icon/set/group.js b/src/components/Icon/set/group.js index 1700258d0..db84b97e3 100644 --- a/src/components/Icon/set/group.js +++ b/src/components/Icon/set/group.js @@ -1,21 +1,20 @@ import React from "react"; export default (props) => ( - - - - - ); - + + + + +); diff --git a/src/components/Icon/set/hands.js b/src/components/Icon/set/hands.js index 1b95b93fd..48eed817d 100644 --- a/src/components/Icon/set/hands.js +++ b/src/components/Icon/set/hands.js @@ -1,20 +1,20 @@ import React from "react"; export default (props) => ( - - - - - ); + + + + +); diff --git a/src/components/Icon/set/stairswflag.js b/src/components/Icon/set/stairswflag.js index 1a68284ff..3b5321744 100644 --- a/src/components/Icon/set/stairswflag.js +++ b/src/components/Icon/set/stairswflag.js @@ -1,20 +1,20 @@ import React from "react"; export default (props) => ( - - - - - ); + + + + +); diff --git a/src/components/Icon/set/yellowhat.js b/src/components/Icon/set/yellowhat.js index 0cbc4b21c..93b6436c5 100644 --- a/src/components/Icon/set/yellowhat.js +++ b/src/components/Icon/set/yellowhat.js @@ -1,24 +1,24 @@ import React from "react"; export default (props) => ( - - - - - - ); + + + + + +); diff --git a/src/components/Landing/index.js b/src/components/Landing/index.js index f5b27efd8..a2d7b5e4a 100644 --- a/src/components/Landing/index.js +++ b/src/components/Landing/index.js @@ -33,11 +33,7 @@ const Title = ({ id, title, paragraph }) => { return (

{title}

- { - paragraph && - {paragraph} - } - + {paragraph && {paragraph}}
); }; @@ -1144,8 +1140,8 @@ export const landingSections = { flexDirection="column" margin="0" padding="0" - padding_tablet="0" - position="relative" + padding_tablet="0" + position="relative" >
{ const [showVideo, setShowVideo] = React.useState(false); @@ -213,7 +213,7 @@ const Player = ({ position="relative" boxShadow={image_thumb?.shadow && "20px 15px 0px 0px rgba(0,0,0,1)"} //border={image_thumb?.shadow && "3px solid black"} - style={imgStyles && {...JSON.parse(image_thumb?.style)}} + style={imgStyles && { ...JSON.parse(image_thumb?.style) }} > {id && ( )} {thumb && thumb.childImageSharp ? ( @@ -272,13 +272,13 @@ const Player = ({ export default Player; Player.defaultProps = { - onPlay: () => { }, - onPause: () => { }, - onEnd: () => { }, - onError: () => { }, - onStateChange: () => { }, - onPlaybackRateChange: () => { }, - onPlaybackQualityChange: () => { }, + onPlay: () => {}, + onPause: () => {}, + onEnd: () => {}, + onError: () => {}, + onStateChange: () => {}, + onPlaybackRateChange: () => {}, + onPlaybackQualityChange: () => {}, imageSize: "default", playerVars: {}, noCookies: false, @@ -320,11 +320,11 @@ Player.propTypes = { }; const Play = styled.button` - background: ${(props) => props.background || "rgba(0, 0, 0, 0.7)"} ; + background: ${(props) => props.background || "rgba(0, 0, 0, 0.7)"}; border-radius: 3px; color: ${(props) => props.white}; font-size: 1em; - height: 36px; + height: 36px; padding: 0; text-align: center; text-indent: 0.1em; @@ -333,9 +333,13 @@ const Play = styled.button` position: absolute !important; top: 50%; left: 50%; - transform: ${(props) => props.transformPlay || "translateX(-50%) translateY(-50%)"}; {/*translateX(-50%) translateY(-50%);*/} + transform: ${(props) => + props.transformPlay || "translateX(-50%) translateY(-50%)"}; + { + /*translateX(-50%) translateY(-50%);*/ + } border: none; - opacity: ${(props) => props.opacity || "0.8"}; + opacity: ${(props) => props.opacity || "0.8"}; cursor: pointer; z-index: 9; &:hover { diff --git a/src/components/Sections/index.js b/src/components/Sections/index.js index 0b2a90248..d3923be2e 100644 --- a/src/components/Sections/index.js +++ b/src/components/Sections/index.js @@ -215,7 +215,7 @@ export const Div = styled.div` margin: ${(props) => props.margin_xs}; display: ${(props) => props.display_xs}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_xs]}; + justifyContentOptions[props.justifyContent_xs]}; order: ${(props) => props.order_xs}; border: ${(props) => props.border_xs}; border-top: ${(props) => props.borderTop_xs}; @@ -230,7 +230,7 @@ export const Div = styled.div` @media ${Devices.sm} { padding: ${(props) => props.padding_sm}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_sm]}; + justifyContentOptions[props.justifyContent_sm]}; height: ${(props) => props.height_sm}; position: ${(props) => props.position_sm}; margin: ${(props) => props.margin_sm}; @@ -250,16 +250,16 @@ export const Div = styled.div` } @media ${Devices.tablet} { flex: ${(props) => - props.flex_tablet || props.size_tablet - ? `0 0 ${(props.size_tablet / 12) * 100}%` - : null}; + props.flex_tablet || props.size_tablet + ? `0 0 ${(props.size_tablet / 12) * 100}%` + : null}; flex-flow: ${(props) => props.flexFlow_tablet}; max-width: ${(props) => - props.size_tablet ? `${(props.size_tablet / 12) * 100}%` : null}; + props.size_tablet ? `${(props.size_tablet / 12) * 100}%` : null}; max-width: ${(props) => - props.maxWidth_tablet - ? props.maxWidth_tablet - : props.size_tablet + props.maxWidth_tablet + ? props.maxWidth_tablet + : props.size_tablet ? `${(props.size_tablet / 12) * 100}%` : null}; align-self: ${(props) => props.alignSelf_tablet}; @@ -283,7 +283,7 @@ export const Div = styled.div` height: ${(props) => props.height_tablet}; flex: ${(props) => props.flex_tablet}; flex-shrink: ${(props) => - props.flexShrink_tablet ? props.flexShrink_tablet : 1}; + props.flexShrink_tablet ? props.flexShrink_tablet : 1}; flex-wrap: ${(props) => props.flexWrap_tablet}; border: ${(props) => props.border_tablet}; border-top: ${(props) => props.borderTop_tablet}; @@ -300,7 +300,7 @@ export const Div = styled.div` grid-row: ${(props) => props.gridRow_tablet}; justify-self: ${(props) => props.justifySelf_tablet}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_tablet]}; + justifyContentOptions[props.justifyContent_tablet]}; z-index: ${(props) => props.zIndex_tablet}; top: ${(props) => props.top_tablet}; bottom: ${(props) => props.bottom_tablet}; @@ -312,11 +312,11 @@ export const Div = styled.div` } @media ${Devices.md} { flex: ${(props) => - props.size_md ? `0 0 ${(props.size_md / 12) * 100}%` : null}; + props.size_md ? `0 0 ${(props.size_md / 12) * 100}%` : null}; max-width: ${(props) => - props.maxWidth_md - ? props.maxWidth_md - : props.size_md + props.maxWidth_md + ? props.maxWidth_md + : props.size_md ? `${(props.size_md / 12) * 100}%` : null}; min-width: ${(props) => props.minWidth_md}; @@ -326,7 +326,7 @@ export const Div = styled.div` gap: ${(props) => (props) => props.gap_md}; flex-wrap: ${(props) => props.flexWrap_md}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_md]}; + justifyContentOptions[props.justifyContent_md]}; text-align: ${(props) => props.textAlign_md}; align-items: ${(props) => props.alignItems_md}; margin: ${(props) => props.margin_md}; @@ -345,7 +345,7 @@ export const Div = styled.div` @media ${Devices.lg} { display: ${(props) => props.display_lg}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_lg]}; + justifyContentOptions[props.justifyContent_lg]}; padding: ${(props) => props.padding_lg}; max-width: ${(props) => props.maxWidth_lg}; min-width: ${(props) => props.minWidth_lg}; @@ -387,18 +387,18 @@ export const Grid = styled(Div)` grid-template-areas: ${(props) => props.gridTemplateAreas}; @media ${Devices.xxs} { grid-template-columns: ${(props) => - props.columns_xxs ? `repeat(${props.columns_xxs}, 1fr)` : null}; + props.columns_xxs ? `repeat(${props.columns_xxs}, 1fr)` : null}; } @media ${Devices.xs} { grid-template-columns: ${(props) => - props.columns_xs ? `repeat(${props.columns_xs}, 1fr)` : null}; + props.columns_xs ? `repeat(${props.columns_xs}, 1fr)` : null}; display: ${(props) => props.display_xs || "grid"}; } @media ${Devices.sm} { grid-template-columns: ${(props) => - props.gridTemplateColumns_sm - ? `repeat(${props.gridTemplateColumns_sm}, 1fr)` - : null}; + props.gridTemplateColumns_sm + ? `repeat(${props.gridTemplateColumns_sm}, 1fr)` + : null}; display: ${(props) => props.display_sm || "grid"}; } @media ${Devices.tablet} { @@ -407,13 +407,13 @@ export const Grid = styled(Div)` display: ${(props) => props.display_tablet || "grid"}; width: ${(props) => props.width_tablet}; grid-template-columns: ${(props) => - props.gridTemplateColumns_tablet - ? `${props.gridTemplateColumns_tablet}` - : "2fr repeat(12, 1fr) 2fr"}; + props.gridTemplateColumns_tablet + ? `${props.gridTemplateColumns_tablet}` + : "2fr repeat(12, 1fr) 2fr"}; grid-template-rows: ${(props) => - props.gridTemplateRows_tablet - ? `repeat(${props.gridTemplateRows_tablet})` - : null}; + props.gridTemplateRows_tablet + ? `repeat(${props.gridTemplateRows_tablet})` + : null}; grid-gap: ${(props) => props.gridGap_tablet}; grid-auto-rows: ${(props) => props.gridAutoRows_tablet}; grid-column: ${(props) => props.gridColumn_tablet}; @@ -425,9 +425,9 @@ export const Grid = styled(Div)` margin: ${(props) => props.margin_md}; grid-template-columns: ${(props) => props.gridTemplateColumns_md}; grid-template-rows: ${(props) => - props.gridTemplateRows_md - ? `repeat(${props.gridTemplateRows_md})` - : null}; + props.gridTemplateRows_md + ? `repeat(${props.gridTemplateRows_md})` + : null}; grid-gap: ${(props) => props.gridGap_md}; grid-column: ${(props) => props.gridColumn_md}; display: ${(props) => props.display_md || "grid"}; @@ -456,28 +456,28 @@ export const Old_Grid = styled.div` margin: ${(props) => props.margin}; @media ${Devices.xxs} { grid-template-columns: ${(props) => - props.columns_xxs ? `repeat(${props.columns_xxs}, 1fr)` : null}; + props.columns_xxs ? `repeat(${props.columns_xxs}, 1fr)` : null}; } @media ${Devices.xs} { grid-template-columns: ${(props) => - props.columns_xs ? `repeat(${props.columns_xs}, 1fr)` : null}; + props.columns_xs ? `repeat(${props.columns_xs}, 1fr)` : null}; } @media ${Devices.sm} { grid-template-columns: ${(props) => - props.columns_sm ? `repeat(${props.columns_sm}, 1fr)` : null}; + props.columns_sm ? `repeat(${props.columns_sm}, 1fr)` : null}; } @media ${Devices.tablet} { grid-template-columns: ${(props) => - props.columns_tablet ? `repeat(${props.columns_tablet}, 1fr)` : null}; + props.columns_tablet ? `repeat(${props.columns_tablet}, 1fr)` : null}; grid-template-rows: ${(props) => - props.rows_tablet ? `repeat(${props.rows_tablet}, 5vw)` : null}; + props.rows_tablet ? `repeat(${props.rows_tablet}, 5vw)` : null}; padding: ${(props) => props.padding_tablet}; } @media ${Devices.md} { grid-template-columns: ${(props) => - props.columns_md ? `repeat(${props.columns_md})` : null}; + props.columns_md ? `repeat(${props.columns_md})` : null}; grid-template-rows: ${(props) => - props.rows_md ? `repeat(${props.rows_md})` : null}; + props.rows_md ? `repeat(${props.rows_md})` : null}; grid-gap: ${(props) => props.gridGap_md}; height: ${(props) => props.height_md}; padding: ${(props) => props.padding_md}; @@ -486,16 +486,16 @@ export const Old_Grid = styled.div` } @media ${Devices.lg} { grid-template-columns: ${(props) => - props.columns_lg ? `repeat(${props.columns_lg}, 1fr)` : null}; + props.columns_lg ? `repeat(${props.columns_lg}, 1fr)` : null}; padding: ${(props) => props.padding_lg}; } @media ${Devices.xl} { grid-template-columns: ${(props) => - props.columns_xl ? `repeat(${props.columns_xl}, 1fr)` : null}; + props.columns_xl ? `repeat(${props.columns_xl}, 1fr)` : null}; } @media ${Devices.xxl} { grid-template-columns: ${(props) => - props.columns_xxl ? `repeat(${props.columns_xxl}, 1fr)` : null}; + props.columns_xxl ? `repeat(${props.columns_xxl}, 1fr)` : null}; } `; @@ -696,8 +696,9 @@ export const GridContainer = ({ gridTemplateRows={gridTemplateRows} gridTemplateRows_tablet={gridTemplateRows_tablet} gridTemplateColumns_sm={columns_sm} - gridTemplateColumns_tablet={`repeat(${columns_tablet}, ${12 / columns_tablet - }fr)`} + gridTemplateColumns_tablet={`repeat(${columns_tablet}, ${ + 12 / columns_tablet + }fr)`} padding={paddingChild} padding_tablet={padding_tabletChild} gridTemplateColumns={`${columns}, 1fr`} @@ -707,8 +708,8 @@ export const GridContainer = ({ gridColumn_tablet ? gridColumn_tablet : fluid - ? "1 / span 14" - : "2 / span 12" + ? "1 / span 14" + : "2 / span 12" } gridTemplateAreas={gridTemplateAreas} gridTemplateAreas_tablet={gridTemplateAreas_tablet} diff --git a/src/templates/landing_a.js b/src/templates/landing_a.js index 8e1278982..c6dc1e7ae 100644 --- a/src/templates/landing_a.js +++ b/src/templates/landing_a.js @@ -295,10 +295,7 @@ const Landing = (props) => { ); }; export const query = graphql` - query LandingAQuery( - $file_name: String! - $lang: String! - ) { + query LandingAQuery($file_name: String!, $lang: String!) { allPageYaml( filter: { fields: { file_name: { regex: "/geekpal/" }, lang: { eq: $lang } } From 4cab412b4ff0b5a94b6b1f186fd38d625c38a341 Mon Sep 17 00:00:00 2001 From: Kelvin Ruiz <138077477+kelvinruizdevel@users.noreply.github.com> Date: Wed, 18 Oct 2023 20:47:51 +0000 Subject: [PATCH 04/10] propiedad display-block agregada ael componente Instructors, es, especificamente al child de GridContainer --- src/components/Instructors/index.js | 4 +++- src/components/Sections/index.js | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/Instructors/index.js b/src/components/Instructors/index.js index 95baa504e..aa538e9f7 100644 --- a/src/components/Instructors/index.js +++ b/src/components/Instructors/index.js @@ -80,9 +80,11 @@ const Instructors = ({ instructors?.length >= 1 && ( { @@ -686,7 +689,10 @@ export const GridContainer = ({ Date: Thu, 19 Oct 2023 11:20:07 -0400 Subject: [PATCH 05/10] Update software-engineering.us.yaml --- src/data/course/software-engineering.us.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/course/software-engineering.us.yaml b/src/data/course/software-engineering.us.yaml index 26d171847..9a6d8e17d 100644 --- a/src/data/course/software-engineering.us.yaml +++ b/src/data/course/software-engineering.us.yaml @@ -21,7 +21,7 @@ meta_info: apply_form: label: Senior Software Engineer -seo_title: "Cooding Bootcamp" +seo_title: "Software Engineer Bootcamp" header: title: "Senior Software Engineer" image: "../../../static/images/bg/apple-building.jpg" From b812c61b2c92451bf5ff67ddbbc57d40012f8d45 Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Thu, 19 Oct 2023 23:51:56 +0000 Subject: [PATCH 06/10] added new "prmpt layer into th website to create LLM prompts bsed on the YML information, that way can use this prompts to train an LLM using embbedings" --- .env.example | 3 +- package.json | 1 + prompts/awards.prompt | 58 +++++ prompts/datascience-ml.prompt | 1 + prompts/full-stack.prompt | 7 + prompts/locations.prompt | 16 ++ prompts/projects.prompt | 54 +++++ prompts/students.prompt | 200 ++++++++++++++++++ .../alumni_projects/alumni_projects.us.yaml | 6 + src/prompt/prompt.awards.js | 27 +++ src/prompt/prompt.course.js | 45 ++++ src/prompt/prompt.location.js | 47 ++++ src/prompt/prompt.plans.js | 65 ++++++ src/prompt/prompt.projects.js | 31 +++ src/prompt/prompt.sh | 9 + src/prompt/prompt.students.js | 40 ++++ src/prompt/utils.js | 101 +++++++++ src/test/_utils.js | 6 +- 18 files changed, 715 insertions(+), 2 deletions(-) create mode 100644 prompts/awards.prompt create mode 100644 prompts/datascience-ml.prompt create mode 100644 prompts/full-stack.prompt create mode 100644 prompts/locations.prompt create mode 100644 prompts/projects.prompt create mode 100644 prompts/students.prompt create mode 100644 src/prompt/prompt.awards.js create mode 100644 src/prompt/prompt.course.js create mode 100644 src/prompt/prompt.location.js create mode 100644 src/prompt/prompt.plans.js create mode 100644 src/prompt/prompt.projects.js create mode 100644 src/prompt/prompt.sh create mode 100644 src/prompt/prompt.students.js create mode 100644 src/prompt/utils.js diff --git a/.env.example b/.env.example index acc2a9084..7b0959aad 100644 --- a/.env.example +++ b/.env.example @@ -4,4 +4,5 @@ GATSBY_BREATHECODE_HOST=https://breathecode-test.herokuapp.com/v1 GATSBY_BLOG_ACADEMY_TOKEN=asdasdasdasgttgetrgergteg GATSBY_BLOG_ACADEMY_ID=7 GATSBY_CAPTCHA_KEY=dfsdfsfsdsfgdfgt4353456345 -GATSBY_BREATHECODE_TEST=https://breathecode-test.herokuapp.com/v1 \ No newline at end of file +GATSBY_BREATHECODE_TEST=https://breathecode-test.herokuapp.com/v1 +GATSBY_OPENAI_KEY=dfsdfsfsdsfgdfgt4353456345 \ No newline at end of file diff --git a/package.json b/package.json index a6321fd88..3c7ad4e4b 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "scripts": { "start": "gatsby develop -H 0.0.0.0 -o", "test": "sh ./src/test/test.sh", + "prompts": "sh ./src/prompt/prompt.sh", "start:storybook": "start-storybook -p 9000 -c .storybook", "build": "npm run test && node ./src/utils/makePagesDictionary.js && node ./src/test/test.redirect.js && node ./src/utils/makePostsDictionary.js && node ./src/utils/makeRedirectsDictionary.js && gatsby build", "build:gatsby": "gatsby build", diff --git a/prompts/awards.prompt b/prompts/awards.prompt new file mode 100644 index 000000000..a91ef223a --- /dev/null +++ b/prompts/awards.prompt @@ -0,0 +1,58 @@ +The following are capstone projects built by our students during our bootcamps: + +Project name: Raspberry Sky +Description: A platform capable of receiving information (wind, temperature, geolocation, etc) from rockets being launched to outer space. The platform also lets you make arrangements to send your own rocket, track it and receive messages from it. +Video demonstration: https://www.youtube.com/watch?v=OZfv9kYl0_o +Github URL: https://github.com/Luis846/SatelliteBetaSoftware +Live URL: https://sattelite-beta.vercel.app/ +Buit by: Luis Rivera and Naila Kaliyeva during the full-stack bootcamp + +--- + +Project name: IMS: Inventory Tracking +Description: IMS is a Pharmacy Inventory and logistics tracking system built using Python, Javascript, React, and integration with Barcode Readers, SMS, the Twillio API, and GPS Tracking Systems. IMS holds stock quantities of all products stored and sold by the Drug Store and then tracks the vehicles that deliver those sells. +Video demonstration: https://www.youtube.com/watch?v=TTjSZ2Lud2E +Github URL: https://github.com/sebastianpd1/IMS-FRONTEND +Live URL: https://ims-frontend.vercel.app/react-hello-webapp/private/dashboard +Buit by: Jonathan Perez and Sebastian Pinto and Paola Castro during the full-stack bootcamp + +--- + +Project name: The Hour +Description: Happy Hour! What are you doing today? The Hour is your perfect night sidekick, find happy hour information about bars, night clubs and what is happening in the city! This application stands out because of its UI/UX component, very easy to use, mobile first and build around React.js, Javascript and Headless Wordpress API for easy management. +Video demonstration: https://www.youtube.com/watch?v=KTeOIU3eVrc +Github URL: https://github.com/samirbenzada/Iwash +Live URL: +Buit by: Darius Bounds and Christian Valdes during the full-stack bootcamp + +--- + +Project name: WonderTracker +Description: A platform capable of keeping your travel information and documents saved in an absolute secure system. It also lets you track places where you have been, and gather information that you thought was important to save for as long as you want - all in just one place. +Video demonstration: +Github URL: https://github.com/gmihov001/Wandertracker_front-end +Live URL: https://wandertrackerfront-end.gmihov001.now.sh +Buit by: Fernando Funes and George Mihov during the full-stack bootcamp + +--- + +Project name: iWash +Description: iWash is an application integrating hardware and software towards building a platform capable of setting and launching Smart Laundry machines from your mobile device. You can pay the cost of the service as well as set time, speed, type of laundry process, and receive notifications about the status of your laundry. +Video demonstration: +Github URL: https://github.com/samirbenzada/Iwash +Live URL: https://iwash-react.herokuapp.com/ +Buit by: Samir Benzada and Victor Mori during the full-stack bootcamp + +--- + +Project name: reMindful +Description: Generating awareness about recycling and considering all the steps that need to be covered. +They have created an application that integrates both software and hardware that allows to weigh +the amount of plastic, glass or garbage there is within a container and how much it will +affect both the recycling process as well as the environment. + +Video demonstration: https://www.youtube.com/watch?v=cKcZD0_1IKk +Github URL: https://github.com/gabsssrod/ReduceReuseRecycle-frontEnd +Live URL: https://re-mindful.vercel.app/ +Buit by: Jordan Aguiriano and Gabriela Rodriguez during the full-stack bootcamp + diff --git a/prompts/datascience-ml.prompt b/prompts/datascience-ml.prompt new file mode 100644 index 000000000..f9fca2da4 --- /dev/null +++ b/prompts/datascience-ml.prompt @@ -0,0 +1 @@ +4Geeks Academy offers a course called "Become a AI Machine Learning Engineer" that prepares students for a career in data science and machine learning. The course spans 16 weeks and requires no previous experience. Students will learn Python, SQL, Looker, Streamlit, and Statistics, as well as algorithms like Close Neighbors and Decision Trees. They will work with supervised and unsupervised learning models and gain hands-on experience solving real-life cases. The course also covers the complete lifecycle of developing, deploying, and maintaining AI projects, with a focus on privacy and security. Classes are held three times a week with a maximum class size of 12 people. Upon completion, students receive recognized certificates. The course is available in both English and Spanish. stop \ No newline at end of file diff --git a/prompts/full-stack.prompt b/prompts/full-stack.prompt new file mode 100644 index 000000000..6024d4723 --- /dev/null +++ b/prompts/full-stack.prompt @@ -0,0 +1,7 @@ +Summary of the courses available at 4Geeks Academy: + +Course: Full Stack Developer Course +Description: Become a web development expert and learn how to build applications from scratch. The course duration is 18 weeks, with 3 classes per week. No previous coding skills or advanced math is required. The course is available in both English and Spanish. Upon completion, you will receive a Full-Stack Developer certificate. +Instructors: Rodolfo Campos and Gabriel Salinas. +About: The program focuses on the most sought-after technologies, Python and JavaScript, and emphasizes hands-on experience through project development. It also provides training in algorithm scripting, front-end libraries, and API integration. +Stop \ No newline at end of file diff --git a/prompts/locations.prompt b/prompts/locations.prompt new file mode 100644 index 000000000..b9e0765a7 --- /dev/null +++ b/prompts/locations.prompt @@ -0,0 +1,16 @@ +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' +- ! '' diff --git a/prompts/projects.prompt b/prompts/projects.prompt new file mode 100644 index 000000000..cf69ccf92 --- /dev/null +++ b/prompts/projects.prompt @@ -0,0 +1,54 @@ +The following are capstone projects built by our students during our bootcamps: + +Project name: Raspberry Sky +Description: A platform capable of receiving information (wind, temperature, geolocation, etc) from rockets being launched to outer space. The platform also lets you make arrangements to send your own rocket, track it and receive messages from it. +Video demonstration: https://www.youtube.com/watch?v=OZfv9kYl0_o +Github URL: https://github.com/Luis846/SatelliteBetaSoftware +Live URL: https://sattelite-beta.vercel.app/ +Buit by: Luis Rivera and Naila Kaliyeva during the full-stack bootcamp + +--- + +Project name: IMS: Inventory Tracking +Description: IMS is a Pharmacy Inventory and logistics tracking system built using Python, Javascript, React, and integration with Barcode Readers, SMS, the Twillio API, and GPS Tracking Systems. IMS holds stock quantities of all products stored and sold by the Drug Store and then tracks the vehicles that deliver those sells. +Video demonstration: https://www.youtube.com/watch?v=TTjSZ2Lud2E +Github URL: https://github.com/sebastianpd1/IMS-FRONTEND +Live URL: https://ims-frontend.vercel.app/react-hello-webapp/private/dashboard +Buit by: Jonathan Perez and Sebastian Pinto and Paola Castro during the full-stack bootcamp + +--- + +Project name: The Hour +Description: Happy Hour! What are you doing today? The Hour is your perfect night sidekick, find happy hour information about bars, night clubs and what is happening in the city! This application stands out because of its UI/UX component, very easy to use, mobile first and build around React.js, Javascript and Headless Wordpress API for easy management. +Video demonstration: https://www.youtube.com/watch?v=KTeOIU3eVrc +Github URL: https://github.com/samirbenzada/Iwash +Live URL: +Buit by: Darius Bounds and Christian Valdes during the full-stack bootcamp + +--- + +Project name: WonderTracker +Description: A platform capable of keeping your travel information and documents saved in an absolute secure system. It also lets you track places where you have been, and gather information that you thought was important to save for as long as you want - all in just one place. +Video demonstration: +Github URL: https://github.com/gmihov001/Wandertracker_front-end +Live URL: https://wandertrackerfront-end.gmihov001.now.sh +Buit by: Fernando Funes and George Mihov during the full-stack bootcamp + +--- + +Project name: iWash +Description: iWash is an application integrating hardware and software towards building a platform capable of setting and launching Smart Laundry machines from your mobile device. You can pay the cost of the service as well as set time, speed, type of laundry process, and receive notifications about the status of your laundry. +Video demonstration: +Github URL: https://github.com/samirbenzada/Iwash +Live URL: https://iwash-react.herokuapp.com/ +Buit by: Samir Benzada and Victor Mori during the full-stack bootcamp + +--- + +Project name: reMindful +Description: Generating awareness about recycling and considering all the steps that need to be covered. They have created an application that integrates both software and hardware that allows to weigh the amount of plastic, glass or garbage there is within a container and how much it will affect both the recycling process as well as the environment. +Video demonstration: https://www.youtube.com/watch?v=cKcZD0_1IKk +Github URL: https://github.com/gabsssrod/ReduceReuseRecycle-frontEnd +Live URL: https://re-mindful.vercel.app/ +Buit by: Jordan Aguiriano and Gabriela Rodriguez during the full-stack bootcamp + diff --git a/prompts/students.prompt b/prompts/students.prompt new file mode 100644 index 000000000..742d7400d --- /dev/null +++ b/prompts/students.prompt @@ -0,0 +1,200 @@ +The following are 4Geeks Academy students: +Name: Peter Schwarck +Hired as Business Systems Analyst at eBay +LinkedIn profile URL: https://www.linkedin.com/in/peter-schwarck/ + +--- + +Name: Azam Abdul Malik +Hired as Lead Wireless Carrier Engineer at Facebook +LinkedIn profile URL: https://www.linkedin.com/in/azamjiva + +--- + +Name: Rebecca Willett +Hired as Software Engineer at HashiCorp +LinkedIn profile URL: https://www.linkedin.com/in/willettrebecca/ + +--- + +Name: Hernán García +Hired as Software Developer at Celerity +LinkedIn profile URL: https://www.linkedin.com/in/hernan-garcia/ + +--- + +Name: João Henrique Xavier +Hired as Software Engineer at NCCI +LinkedIn profile URL: https://www.linkedin.com/in/joao-henrique-xavier/ + +--- + +Name: Florencia Viera +Hired as Web Developer at Lightning Fruit +LinkedIn profile URL: https://www.linkedin.com/in/floviera + +--- + +Name: Naila Kaliyeva +Hired as Full Stack Developer +LinkedIn profile URL: https://www.linkedin.com/in/naila-kaliyeva-a8863a181/ +Studied in the United States of America campus +Video testimonial: https://www.youtube.com/watch?v=_rtJgxuY4i4 +Written testimonial: I love 4Geeks Academy's approach to teaching students. There are always at least three tutors who will make sure you master your skills and will not give up on you if there's something you don't understand. They never leave my questions unanswered, regardlessof how obvious they may seem..and the atmosphere in the school is very warm. I'm grateful to you guys for providing 24 hour access to school, so we can work any time thatis convenient for us. Thank you, 4Geeks!!! + +--- + +Name: Azul Botaya +Hired as Full Stack Developer +LinkedIn profile URL: https://www.linkedin.com/in/azul-botaya-31669b151/ +Studied in the United States of America campus +Written testimonial: I felt lost in my career and could not see clear goals for myself anymore. I came across this great opportunity to join this community of knowledge and, to top it all off, great humans! I found myself able to commit to something very interesting with endless options to create my career as a graphic designer more powerful without having to stop what I was doing within a perfect part-time cohort. I now have all kinds of new tools I learned there along the way, and there is a new comfort in knowing that I can always go back and keep a new comfort in knowing that I can always go back and keep + +--- + +Name: Charles Fabricius +Hired as Full Stack Developer +LinkedIn profile URL: https://www.linkedin.com/in/charles-fabricius/ +Studied in the United States of America campus +Written testimonial: Overall just a great group of people with a common goal. I came into 4Geeks with little to no knowledge about coding and after 16 weeks I was building projects I could have never imagined I would be able to build. They will provide you with the knowledge and tools to become a successful developer ready for hire.... Ask as many questions as you need andthey will be happy to help. Not to mention the lifetime support you get even after completing the Bootcamp. + +--- + +Name: Fernando Funez +Hired as Full Stack Developer +LinkedIn profile URL: https://www.linkedin.com/in/fernando-funezdev/ +Video testimonial: https://www.youtube.com/watch?v=_rtJgxuY4i4 +Written testimonial: I highly recommend this coding boot camp!!!! Before 4Geeks I never had any experience with code - I didn't know where to start. Within 10 weeks I was able to grasp the core concepts of being a developer. The staff and Mentors are awesome... enroll today if yoou want to go from zero to hero in 10 weeks and start developing your own apps. + +--- + +Name: Salvador Desravines +Hired as Full Stack Developer +LinkedIn profile URL: https://www.linkedin.com/in/salvador-desravines-b85b4a196/ +Written testimonial: This program was definitely one of the hardest things I've done in my life. It was 16 weeks of constant work and practice. All things in life worth having is not going to be easily obtained. If you can stick with it and follow what the teachers are teaching you, you will succeed. + +--- + +Name: Jorge Montes +Hired as Full Stack Developer +Written testimonial: Now I think that I can actually know how to solve the issues that I face when I'm coding and the professors have been a great help along the process. I would recommend this Bootcamp to everyone. + +--- + +Name: Fidel Rosell +Hired as Software Engineer at UDT +LinkedIn profile URL: https://www.linkedin.com/in/fidelrosell/ +Written testimonial: My experience in 4Geeks Academy was and is the best. The instructors and TAs will help you in a blink. 4Geeks' Slack should be renamed to 4Geeks Overflow. The response time is fast. The responses are strong and different solutions are provided. If you have an interview and you want to refresh your knowledge or exercise do not hesitate to go to 4Geeks, you will find someone ready to help you. + +--- + +Name: Jordan +Hired as Full Stack Developer +LinkedIn profile URL: https://www.linkedin.com/in/jordan-aguiriano/ + +--- + +Name: Gabriela +Hired as Full Stack Developer +LinkedIn profile URL: https://www.linkedin.com/in/gabriela-rodriguez-2b5235187/ + +--- + +Name: Guensie Grecy +Hired as Third Party Risk at UKG +LinkedIn profile URL: https://www.linkedin.com/in/guensiegrecy/ +Video testimonial: https://www.youtube.com/watch?v=LvnxLyqaQDo +Written testimonial: I was a lawyer for 6 years and I decided to change my career. I attended 4Geeks Academy, a coding bootcamp, that was last year (2018), I graduated in August, and after graduating in October, I was able to get a job as a web developer. I had no background whatsoever in coding. I didn't know anything about anything computer-technology wise, so that's an encouragement because it's possible! + +--- + +Name: Luis Rivera +Became a QA analyst after the bootcamp +LinkedIn profile URL: https://www.linkedin.com/in/luis-rivera-68779714b/ +Github profile URL: https://github.com/Luis846 +Video testimonial: https://www.youtube.com/watch?v=OZfv9kYl0_o + +--- + +Name: Naila Kaliyeva +Became a Web Developer after the bootcamp +LinkedIn profile URL: https://www.linkedin.com/in/naila-kaliyeva-a8863a181/ +Github profile URL: https://github.com/nailakaliyeva +Video testimonial: https://www.youtube.com/watch?v=OZfv9kYl0_o + +--- + +Name: Jonathan Perez +Became a Business Administration after the bootcamp +Github profile URL: https://github.com/Jphendrix51 +Video testimonial: https://www.youtube.com/watch?v=TTjSZ2Lud2E + +--- + +Name: Sebastian Pinto +Became a Pharmacy Owner after the bootcamp +Github profile URL: https://github.com/sebastianpd1 +Video testimonial: https://www.youtube.com/watch?v=TTjSZ2Lud2E + +--- + +Name: Paola Castro +Became a Fuel Industry after the bootcamp +Github profile URL: https://github.com/paocastrob +Video testimonial: https://www.youtube.com/watch?v=TTjSZ2Lud2E + +--- + +Name: Darius Bounds +Became a Interaction Designer after the bootcamp +LinkedIn profile URL: https://www.linkedin.com/in/darius-b-7511255b/ +Github profile URL: https://github.com/dcbounds +Video testimonial: https://www.youtube.com/watch?v=KTeOIU3eVrc + +--- + +Name: Christian Valdes +Became a Government Project Manager after the bootcamp +Github profile URL: https://github.com/CxJAY26 +Video testimonial: https://www.youtube.com/watch?v=KTeOIU3eVrc + +--- + +Name: Fernando Funes +Became a Web Developer after the bootcamp +Github profile URL: https://github.com/ferfunes + +--- + +Name: George Mihov +Became a Web Developer and Mentor after the bootcamp +LinkedIn profile URL: https://www.linkedin.com/in/gmihov/ +Github profile URL: https://github.com/gmihov001 + +--- + +Name: Samir Benzada +Became a Teacher Assistant after the bootcamp +LinkedIn profile URL: https://www.linkedin.com/in/samir-benzada-5ab431196/ +Github profile URL: https://github.com/samirbenzada + +--- + +Name: Victor Mori +Became a Web Developer after the bootcamp + +--- + +Name: Jordan Aguiriano +Became a Web Developer after the bootcamp +LinkedIn profile URL: https://www.linkedin.com/in/jordan-aguiriano/ +Github profile URL: https://github.com/JordanAguiriano +Video testimonial: https://www.youtube.com/watch?v=cKcZD0_1IKk + +--- + +Name: Gabriela Rodriguez +Became a Web Developer after the bootcamp +LinkedIn profile URL: https://www.linkedin.com/in/gabriela-rodriguez-2b5235187/ +Github profile URL: https://github.com/gabsssrod +Video testimonial: https://www.youtube.com/watch?v=cKcZD0_1IKk \ No newline at end of file diff --git a/src/data/components/alumni_projects/alumni_projects.us.yaml b/src/data/components/alumni_projects/alumni_projects.us.yaml index 26f6fe2e8..c0c73c24b 100644 --- a/src/data/components/alumni_projects/alumni_projects.us.yaml +++ b/src/data/components/alumni_projects/alumni_projects.us.yaml @@ -8,6 +8,7 @@ button_section: projects: - project_name: "Raspberry Sky" + course: full-stack slug: "raspberry-sky" project_image: "../../../../static/images/projects/rocket-app.jpg" project_content: "A platform capable of receiving information (wind, temperature, geolocation, etc) from rockets being launched to outer space. The platform also lets you make arrangements to send your own rocket, track it and receive messages from it." @@ -30,6 +31,7 @@ projects: - project_name: "IMS: Inventory Tracking" hidden: false slug: "ims" + course: full-stack project_image: "../../../../static/images/projects/ims.jpg" project_content: "IMS is a Pharmacy Inventory and logistics tracking system built using Python, Javascript, React, and integration with Barcode Readers, SMS, the Twillio API, and GPS Tracking Systems. IMS holds stock quantities of all products stored and sold by the Drug Store and then tracks the vehicles that deliver those sells." project_video: "https://www.youtube.com/watch?v=TTjSZ2Lud2E" @@ -56,6 +58,7 @@ projects: twitter: "" - project_name: "The Hour" hidden: true + course: full-stack slug: "the-hour" project_image: "../../../../static/images/projects/the-hour.png" project_content: "Happy Hour! What are you doing today? The Hour is your perfect night sidekick, find happy hour information about bars, night clubs and what is happening in the city! This application stands out because of its UI/UX component, very easy to use, mobile first and build around React.js, Javascript and Headless Wordpress API for easy management." @@ -77,6 +80,7 @@ projects: twitter: "" - project_name: "WonderTracker" slug: "wondertracker" + course: full-stack project_image: "../../../../static/images/projects/fernando-funez.jpg" project_content: "A platform capable of keeping your travel information and documents saved in an absolute secure system. It also lets you track places where you have been, and gather information that you thought was important to save for as long as you want - all in just one place." project_video: "" @@ -97,6 +101,7 @@ projects: twitter: "" - project_name: "iWash" slug: "i-wash" + course: full-stack project_image: "../../../../static/images/projects/i-wash.jpg" project_content: "iWash is an application integrating hardware and software towards building a platform capable of setting and launching Smart Laundry machines from your mobile device. You can pay the cost of the service as well as set time, speed, type of laundry process, and receive notifications about the status of your laundry." project_video: "" @@ -117,6 +122,7 @@ projects: twitter: "" - project_name: "reMindful" slug: "re-mindful" + course: full-stack project_image: "../../../../static/images/projects/re-mindful.jpg" project_content: | Generating awareness about recycling and considering all the steps that need to be covered. diff --git a/src/prompt/prompt.awards.js b/src/prompt/prompt.awards.js new file mode 100644 index 000000000..2208567fa --- /dev/null +++ b/src/prompt/prompt.awards.js @@ -0,0 +1,27 @@ +const fs = require('fs'); +const { + toYML, + loadYML +} = require("../test/_utils"); + +async function generate(){ + const max_tokens = 400; + console.log(`Starting to generate a prompt for all the academy awards`) + + const doc = loadYML(`${__dirname}/../data/page/awards.us.yml`); + let awards = doc.yaml.awards_list.map((old) => { + let _new = [ + `Award title: ${old.title}`, + `Description of the award: as ${old.paragraph}` + ] + // if(old.linkedin_url) _new.push(`LinkedIn profile URL: ${old.linkedin_url}`); + return _new.join("\n"); + }) + + fs.writeFileSync(`./prompts/awards.prompt`, [ + `The following are awards and recognitions 4Geeks Academy has received thru the years:`,awards.join("\n\n---\n\n"), + `You can learn more about the awards here: https://4geeksacademy.com/us/${doc.yaml.meta_info.slug}` + ].join("\n\n"), 'utf8'); + console.log(`Finished generating awards.`) +} +generate() \ No newline at end of file diff --git a/src/prompt/prompt.course.js b/src/prompt/prompt.course.js new file mode 100644 index 000000000..5891c285c --- /dev/null +++ b/src/prompt/prompt.course.js @@ -0,0 +1,45 @@ +const fs = require('fs'); +const { complete, getCourses } = require('./utils.js') +const { + toYML +} = require("../test/_utils"); + +async function generate(){ + console.log(`Starting to generate a prompt for all the academy course offerings`); + const max_tokens = 400; + const courses = await getCourses(); + const activeCourses = Object.keys(courses).filter(slug => courses[slug].meta_info.show_in_apply) + for(let courseSlug of activeCourses){ + console.log(`Summarizing prompt information for program: ${courseSlug}`); + const old = courses[courseSlug]; + const course = {}; + course.title = old.meta_info.title; + course.description = old.meta_info.description; + course.website = `https://4geeksacademy.com/us/coding-bootcamps/${old.meta_info.slug}`; + course.highlight = old.header.paragraph; + course.instructors = old.course_instructors.instructors; + course.about = old.details.about; + course.details = old.details.list; + course.duration = `${old.weeks} ${old.weeks_label}`; + course.modules = old.details_modules; + const raw = toYML(course) + + const answer = await complete({ + max_tokens, + system: `You are like a senior prompt engineer with deep coding knowledge, very familiar with the YML, CSV and JSON syntax.`, + user: `The following information is part of 4Geeks Academy courses and bootcamps. +Read and understand the information and write a summary of the courses available. +Do not include any information about these instructions in your answer. +Include the word "stop" at the end of your answer. +Inlcude the website url for more information. +Be concise, don't add a summary at the end of the article. +Don't take more than ${(max_tokens*2)} characters. +Here is the YML: ${raw}` + }); + + if(!answer) fail(`Error building prompt for payment plans`); + fs.writeFileSync(`./prompts/${courseSlug}.prompt`, answer, 'utf8'); + console.log(`Finished summarizing program: ${courseSlug}`); + } +} +generate() \ No newline at end of file diff --git a/src/prompt/prompt.location.js b/src/prompt/prompt.location.js new file mode 100644 index 000000000..d9d1d699c --- /dev/null +++ b/src/prompt/prompt.location.js @@ -0,0 +1,47 @@ +const fs = require('fs'); +const { complete, getLocations } = require('./utils.js') +const { + toYML +} = require("../test/_utils"); + +async function generate(){ + console.log(`Starting to generate a prompt for all the academy campus and descriptions`) + let allLocationsPrompts = ''; + const max_tokens = 250; + const locations = await getLocations(); + const allSlugs = Object.keys(locations); + let campuses = {}; + for(let locationSlug of allSlugs){ + const old = locations[locationSlug] + campuses[locationSlug] = {}; + campuses[locationSlug].region = old.meta_info.region; + campuses[locationSlug].available_modes = old.header.sub_header_highlighted; + campuses[locationSlug].phone_number = old.info_box.phone; + campuses[locationSlug].contact_email = old.meta_info.email; + campuses[locationSlug].relevant_information = old.images_box.content; + campuses[locationSlug].city = old.city; + campuses[locationSlug].country = old.country; + campuses[locationSlug].website = `https://4geeksacademy.com/us/coding-campus/${old.meta_info.slug}`;; + campuses[locationSlug].social_media_urls = old.socials.map(s => ({ network: s.name, url: s.link })); + + const raw = toYML(campuses[locationSlug]) + + console.log(`Generating summary for campus ${locationSlug}.`) + allLocationsPrompts += '\n\nNext campus: '+await complete({ + max_tokens, + model: "gpt-3.5-turbo-instruct", + system: `You are like a senior prompt engineer with deep coding knowledge, very familiar with the YML, CSV and JSON syntax.`, + user: `The followings are the details about 4Geeks Academy ${old.city}, ${old.country}, + Read and understand the information and write a summary of the campus. + Do not include any information about these instructions in your answer. + Start your summary with the location city and country, available modes, contact information, social media, address and relevant information. + Include the website url for more information about that campus. + Be concise, do not speak about the city in general, keep your focus on the campus offer. + Don't take more than ${(max_tokens*2)} characters. + Here is the YML: ${raw}` + }); + } + fs.writeFileSync(`./prompts/locations.prompt`, "4Geeks Academy is available in the following locations:"+allLocationsPrompts, 'utf8'); + console.log(`Finished generating campus information prompt.`) +} +generate() \ No newline at end of file diff --git a/src/prompt/prompt.plans.js b/src/prompt/prompt.plans.js new file mode 100644 index 000000000..09a374bfa --- /dev/null +++ b/src/prompt/prompt.plans.js @@ -0,0 +1,65 @@ +const fs = require('fs'); +const { complete, getCourses } = require('./utils.js') +const { + walk, + loadYML, + fail, + success, +} = require("../test/_utils"); + +async function generate(){ + const max_tokens = 400; + const courses = await getCourses(); + const activeCourses = Object.keys(courses).filter(slug => courses[slug].meta_info.show_in_apply) + + let duplicateDescriptions = {}; + walk(`${__dirname}/../data/plans/`, async function (err, files) { + if (err) fail("Error reding the YML files: ", err); + const _files = files.filter( + (f) => f.indexOf(".yml") > 1 || f.indexOf(".yaml") > 1 + ); + + let langs = {}; + let slugs = {}; + for(let _path of _files){ + const doc = loadYML(_path); + const raw = doc && doc.raw_content; + if (doc.lang != "us") continue; + + // ignore inactive courses + if(!activeCourses.includes(doc.name)){ + console.log(`Ignored course ${doc.name}`) + continue; + } + if (!raw) { + fail("Invalid content for YML " + _path); + continue; // Continue to the next file if YAML content is invalid + } + + const answer = await complete({ + max_tokens, + system: `You are like a senior prompt engineer with deep coding knowledge, very familiar with the YML, CSV and JSON syntax.`, + user: `The following information is part of 4Geeks Academy plans and prices. +Read and understand the information and write a summary of the plans and prices available for each location one by one for: Spain, USA, Chile, Europe and Latam". +You will be given a list of plans that apply to one or more academy campus. +The name of the plan is inside the "scholarship" property. +Ignore the following properties: icons, slug and "recommended". +Do not include any information about these instructions in your answer. +Include the word "stop" at the end of your answer. +Be concise, don't add a summary at the end of the article. +Don't take more than ${(max_tokens*2)} characters. +For example: +- Scholarship for part-time courses. Pay today or in 3 parts. Price: $6999 +- Income Share Agreement for full-time couses. Pay after you get a job. Price: $0 +Here is the YML: ${raw}` + }); + if(!answer) fail(`Error building prompt for payment plans`); + fs.writeFileSync(`./prompts/plan-${doc.name}.prompt`, answer, 'utf8'); + } + + success("Finished generating prompts"); + }); + +} + +generate() \ No newline at end of file diff --git a/src/prompt/prompt.projects.js b/src/prompt/prompt.projects.js new file mode 100644 index 000000000..ee1b55d19 --- /dev/null +++ b/src/prompt/prompt.projects.js @@ -0,0 +1,31 @@ +const fs = require('fs'); +const { + toYML, + loadYML +} = require("../test/_utils"); + +async function generate(){ + const max_tokens = 400; + console.log(`Starting to generate a prompt for all the academy awards`) + + const doc = loadYML(`${__dirname}/../data/components/alumni_projects/alumni_projects.us.yaml`); + let projects = doc.yaml.projects.map((old) => { + let _new = [ + `Project name: ${old.project_name}`, + `Description: ${old.project_content.replace(/(\r\n|\n|\r)/gm, "")}`, + `Video demonstration: ${old.project_video}`, + `Github URL: ${old.github_repo}`, + `Live URL: ${old.live_link}`, + `Buit by: ${old.alumni.map(a => `${a.first_name} ${a.last_name}`).join(' and ')} during the ${old.course} bootcamp`, + ] + // if(old.linkedin_url) _new.push(`LinkedIn profile URL: ${old.linkedin_url}`); + return _new.join("\n"); + }) + + fs.writeFileSync(`./prompts/projects.prompt`, [ + `The following are capstone projects built by our students during our bootcamps:`,projects.join("\n\n---\n\n"), + `` + ].join("\n\n"), 'utf8'); + console.log(`Finished generating awards.`) +} +generate() \ No newline at end of file diff --git a/src/prompt/prompt.sh b/src/prompt/prompt.sh new file mode 100644 index 000000000..823e26830 --- /dev/null +++ b/src/prompt/prompt.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +node ./src/prompt/prompt.plans.js && +node ./src/prompt/prompt.course.js && +node ./src/prompt/prompt.location.js && +node ./src/prompt/prompt.students.js && +node ./src/prompt/prompt.awards.js && +node ./src/prompt/prompt.projects.js && +true \ No newline at end of file diff --git a/src/prompt/prompt.students.js b/src/prompt/prompt.students.js new file mode 100644 index 000000000..cc7909cc2 --- /dev/null +++ b/src/prompt/prompt.students.js @@ -0,0 +1,40 @@ +const fs = require('fs'); +const { + toYML, + loadYML +} = require("../test/_utils"); + +async function generate(){ + const max_tokens = 400; + console.log(`Starting to generate a prompt for all the academy campus and descriptions`) + + const doc = loadYML(`${__dirname}/../data/components/testimonials/testimonials.us.yaml`); + let testimonials = doc.yaml.testimonials.map((old) => { + let _new = [ + `Name: ${old.student_name}`, + `Hired as ${old.short_content}` + ] + if(old.linkedin_url) _new.push(`LinkedIn profile URL: ${old.linkedin_url}`); + if(old.country) _new.push(`Studied in the ${old.country.name} campus`); + if(old.student_video) _new.push(`Video testimonial: ${old.student_video}`); + if(old.content) _new.push(`Written testimonial: ${old.content}`.replace(/(\r\n|\n|\r)/gm, "")); + return _new.join("\n"); + }); + + const doc2 = loadYML(`${__dirname}/../data/components/alumni_projects/alumni_projects.us.yaml`); + let alumni_form_projects = doc2.yaml.projects.reduce((prev, current) => prev.concat(...current.alumni.map(al => ({ ...al, student_video: current.project_video }))), []).map(old => { + let _new = [ + `Name: ${old.first_name} ${old.last_name}`, + `Became a ${old.job_title} after the bootcamp` + ]; + if(old.linkedin && old.linkedin != "") _new.push(`LinkedIn profile URL: ${old.linkedin}`); + if(old.github && old.github != "") _new.push(`Github profile URL: ${old.github}`); + if(old.twitter && old.twitter != "") _new.push(`Twitter profile URL: ${old.twitter}`); + if(old.student_video && old.student_video != "") _new.push(`Video testimonial: ${old.student_video}`); + return _new.join("\n"); + }) + + fs.writeFileSync(`./prompts/students.prompt`, `The following are 4Geeks Academy students:\n`+testimonials.concat(alumni_form_projects).join("\n\n---\n\n"), 'utf8'); + console.log(`Finished generating testimonials.`) +} +generate() \ No newline at end of file diff --git a/src/prompt/utils.js b/src/prompt/utils.js new file mode 100644 index 000000000..a6c07be00 --- /dev/null +++ b/src/prompt/utils.js @@ -0,0 +1,101 @@ +const axios = require("axios"); +const dotenv = require('dotenv'); +dotenv.config(); +const { + walk, + loadYML, + fail, +} = require("../test/_utils"); + +// Define the function to call the OpenAI API with an authorization token +async function complete({ system, user, model, max_tokens }) { + try { + // Define the OpenAI API endpoint URL + // gpt-3.5-turbo-16k, gpt-3.5-turbo-instruct + if(model == undefined) model = "gpt-3.5-turbo-16k"; + const is_chat = !model.includes('instruct'); + + let apiUrl = 'https://api.openai.com/v1/completions'; + if(is_chat) apiUrl = 'https://api.openai.com/v1/chat/completions'; + + // Define the headers with the authorization token + const headers = { + Authorization: `Bearer ${process.env.GATSBY_OPENAI_KEY}`, // Include the OpenAI token in the "Bearer" format + 'Content-Type': 'application/json', // Set the content type + }; + + // Define the data to send to the OpenAI API + + let requestData = { + model, + max_tokens, // Set the maximum number of tokens in the response as needed + }; + + if(is_chat){ + requestData.messages = [ + { + role: "system", + content: system + }, + { + role: "user", + content: user + } + ]; + }else{ + requestData.prompt = `${system} \n ${user}` + } + + // Make an API request to the OpenAI API + const response = await axios.post(apiUrl, requestData, { headers }); + + // Process the OpenAI API response here + const interpretedContent = is_chat ? response.data.choices[0].message.content : response.data.choices[0].text; // Extract interpreted content + + // Return the interpreted content + return interpretedContent; + } catch (error) { + console.error('OpenAI API Request Error:', error.toString()); + } +} + +const getCourses = () => new Promise((resolve, reject) => { + var courses = {}; + walk(`${__dirname}/../data/course`, function (err, files) { + if (err) fail("Error reding the YML files: ", err); + const _files = files.filter( + (f) => f.indexOf(".yml") > 1 || f.indexOf(".yaml") > 1 + ); + + for(let _path of _files){ + const doc = loadYML(_path); + //only english + if (doc.lang == "us"){ + courses[doc.name] = { ...doc.yaml, raw: doc.raw }; + } + } + resolve(courses); + }); +}); + +const getLocations = () => new Promise((resolve, reject) => { + let locations = {} + walk(`${__dirname}/../data/location`, async function (err, files) { + if (err) fail("Error reding the YML files: ", err); + const _files = files.filter( + (f) => f.indexOf(".yml") > 1 || f.indexOf(".yaml") > 1 + ); + + for(let _path of _files){ + const doc = loadYML(_path); + //only english + if (doc.lang != "us") continue; + if (['europe', 'online'].includes(doc.name)) continue; + locations[doc.name] = { ...doc.yaml, raw: doc.raw }; + + } + resolve(locations) + }); +}); + +module.exports = { complete, getLocations, getCourses } \ No newline at end of file diff --git a/src/test/_utils.js b/src/test/_utils.js index c7e1fe849..18fd9e5d9 100644 --- a/src/test/_utils.js +++ b/src/test/_utils.js @@ -69,6 +69,9 @@ const walk = function (dir, done) { }); }; +const toYML = (obj) => { + return jsyaml.dump(obj); +} const loadYML = (pathToFile) => { const content = fs.readFileSync(pathToFile, "utf8"); try { @@ -91,7 +94,7 @@ const loadYML = (pathToFile) => { const type = m[1] === "data" ? m[2] : m[1]; - return { yaml, name, lang, type, path }; + return { yaml, name, lang, type, path, raw_content: content }; } catch (error) { console.error(error); return null; @@ -243,6 +246,7 @@ const checkForLanguages = (slugs, folder_name) => { module.exports = { walk, loadYML, + toYML, loadMD, empty, fail, From 23d4c03939d3e49ccf4e2e8f974f68bdfe7f655b Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Fri, 20 Oct 2023 13:49:41 +0000 Subject: [PATCH 07/10] re-generated prompts --- prompts/awards.prompt | 73 +++++++-------- prompts/datascience-ml.prompt | 2 +- prompts/full-stack.prompt | 8 +- prompts/locations.prompt | 125 +++++++++++++++++++++---- prompts/plan-datascience-ml.prompt | 23 +++++ prompts/plan-full-stack.prompt | 19 ++++ src/assets/css/utils.css | 115 +++++++++++------------ src/components/AlumniProjects/index.js | 54 ++++++----- src/components/Icon/set/group.js | 37 ++++---- src/components/Icon/set/hands.js | 36 +++---- src/components/Icon/set/stairswflag.js | 36 +++---- src/components/Icon/set/yellowhat.js | 44 ++++----- src/components/Landing/index.js | 10 +- src/components/ReactPlayer/index.js | 34 ++++--- src/components/Sections/index.js | 91 +++++++++--------- src/prompt/prompt.awards.js | 34 +++---- src/prompt/prompt.course.js | 32 ++++--- src/prompt/prompt.location.js | 66 ++++++++----- src/prompt/prompt.plans.js | 36 ++++--- src/prompt/prompt.projects.js | 42 +++++---- src/prompt/prompt.students.js | 88 ++++++++++------- src/prompt/utils.js | 115 +++++++++++------------ src/templates/landing_a.js | 5 +- src/test/_utils.js | 2 +- 24 files changed, 648 insertions(+), 479 deletions(-) create mode 100644 prompts/plan-datascience-ml.prompt create mode 100644 prompts/plan-full-stack.prompt diff --git a/prompts/awards.prompt b/prompts/awards.prompt index a91ef223a..5473cbb88 100644 --- a/prompts/awards.prompt +++ b/prompts/awards.prompt @@ -1,58 +1,51 @@ -The following are capstone projects built by our students during our bootcamps: +The following are awards and recognitions 4Geeks Academy has received thru the years: -Project name: Raspberry Sky -Description: A platform capable of receiving information (wind, temperature, geolocation, etc) from rockets being launched to outer space. The platform also lets you make arrangements to send your own rocket, track it and receive messages from it. -Video demonstration: https://www.youtube.com/watch?v=OZfv9kYl0_o -Github URL: https://github.com/Luis846/SatelliteBetaSoftware -Live URL: https://sattelite-beta.vercel.app/ -Buit by: Luis Rivera and Naila Kaliyeva during the full-stack bootcamp +Award title: Florida Department of Education +Description of the award: as The United States of America ensures education quality thru federal deparments of education, being certified means we have to anually commit and comply with federal and national regulations to ensure academy success and renewed license. --- -Project name: IMS: Inventory Tracking -Description: IMS is a Pharmacy Inventory and logistics tracking system built using Python, Javascript, React, and integration with Barcode Readers, SMS, the Twillio API, and GPS Tracking Systems. IMS holds stock quantities of all products stored and sold by the Drug Store and then tracks the vehicles that deliver those sells. -Video demonstration: https://www.youtube.com/watch?v=TTjSZ2Lud2E -Github URL: https://github.com/sebastianpd1/IMS-FRONTEND -Live URL: https://ims-frontend.vercel.app/react-hello-webapp/private/dashboard -Buit by: Jonathan Perez and Sebastian Pinto and Paola Castro during the full-stack bootcamp +Award title: Best Bootcamp for Course Report 2023 +Description of the award: as We have been selected as one of the Top Coding Bootcamps globally for 3 years in a row --- -Project name: The Hour -Description: Happy Hour! What are you doing today? The Hour is your perfect night sidekick, find happy hour information about bars, night clubs and what is happening in the city! This application stands out because of its UI/UX component, very easy to use, mobile first and build around React.js, Javascript and Headless Wordpress API for easy management. -Video demonstration: https://www.youtube.com/watch?v=KTeOIU3eVrc -Github URL: https://github.com/samirbenzada/Iwash -Live URL: -Buit by: Darius Bounds and Christian Valdes during the full-stack bootcamp +Award title: Best Bootcamp according to Switchup 2023 +Description of the award: as Not only in Florida, but over each of our campus 4Geeks is constantly keeping a ~5 start rating that makes us one of the top bootcamp in the world --- -Project name: WonderTracker -Description: A platform capable of keeping your travel information and documents saved in an absolute secure system. It also lets you track places where you have been, and gather information that you thought was important to save for as long as you want - all in just one place. -Video demonstration: -Github URL: https://github.com/gmihov001/Wandertracker_front-end -Live URL: https://wandertrackerfront-end.gmihov001.now.sh -Buit by: Fernando Funes and George Mihov during the full-stack bootcamp +Award title: Winners of the Premios Tecnologia Siglo XXI mention 'Formación' +Description of the award: as Our campus in Spain was awarded with the Premio Tecnología Siglo XXI on the 'Formation' category in 2023 --- -Project name: iWash -Description: iWash is an application integrating hardware and software towards building a platform capable of setting and launching Smart Laundry machines from your mobile device. You can pay the cost of the service as well as set time, speed, type of laundry process, and receive notifications about the status of your laundry. -Video demonstration: -Github URL: https://github.com/samirbenzada/Iwash -Live URL: https://iwash-react.herokuapp.com/ -Buit by: Samir Benzada and Victor Mori during the full-stack bootcamp +Award title: Top Coding School according to Newsweek +Description of the award: as 4Geeks Academy has been recognized as one of the top 10 coding bootcamps in the United States according to Newsweek. --- -Project name: reMindful -Description: Generating awareness about recycling and considering all the steps that need to be covered. -They have created an application that integrates both software and hardware that allows to weigh -the amount of plastic, glass or garbage there is within a container and how much it will -affect both the recycling process as well as the environment. +Award title: Best Career Oriented Educational Program +Description of the award: as Educational Excelence Awards 2021 to the Best Career Oriented Educational Program specialized in Coding Bootcamps, more information found on the palmares for the 2021 awards -Video demonstration: https://www.youtube.com/watch?v=cKcZD0_1IKk -Github URL: https://github.com/gabsssrod/ReduceReuseRecycle-frontEnd -Live URL: https://re-mindful.vercel.app/ -Buit by: Jordan Aguiriano and Gabriela Rodriguez during the full-stack bootcamp +--- + +Award title: Most Innovative Program +Description of the award: as Educational Excelence Awards 2021 to the most innovative coding bootcamp school, more information found on the palmares for the 2021 awards + +--- + +Award title: Best International Trajectory +Description of the award: as Educational Excelence Awards 2021 to the best international trajectory school, more information found on the palmares for the 2021 awards + +--- + +Award title: 4.9 on all reviews +Description of the award: as 4.9 in all Course Report, Switchup and Google reviews. + +--- + +Award title: Award Winning Syllabus +Description of the award: as Award winning syllabus. +You can learn more about the awards here: https://4geeksacademy.com/us/awards \ No newline at end of file diff --git a/prompts/datascience-ml.prompt b/prompts/datascience-ml.prompt index f9fca2da4..a7f5ae9ed 100644 --- a/prompts/datascience-ml.prompt +++ b/prompts/datascience-ml.prompt @@ -1 +1 @@ -4Geeks Academy offers a course called "Become a AI Machine Learning Engineer" that prepares students for a career in data science and machine learning. The course spans 16 weeks and requires no previous experience. Students will learn Python, SQL, Looker, Streamlit, and Statistics, as well as algorithms like Close Neighbors and Decision Trees. They will work with supervised and unsupervised learning models and gain hands-on experience solving real-life cases. The course also covers the complete lifecycle of developing, deploying, and maintaining AI projects, with a focus on privacy and security. Classes are held three times a week with a maximum class size of 12 people. Upon completion, students receive recognized certificates. The course is available in both English and Spanish. stop \ No newline at end of file +4Geeks Academy offers a course titled "Become a AI Machine Learning Engineer" which is designed for individuals with no previous knowledge in the field. The course duration is 16 weeks, with 3 classes held weekly and a maximum class size of 12 people. Students will learn Python, SQL, Looker (Google Data Studio), Streamlit, and Statistics, and become professional Data Analysts capable of contributing to data-driven teams. The course covers topics such as predictive modeling, supervised and unsupervised learning models, and the complete lifecycle of developing and deploying AI projects. The instructors are experienced professionals in the field, and the course does not have any prerequisites. The certificates offered by 4Geeks Academy are recognized by multiple organizations. The course is available in English and Spanish. For more information, visit their website at https://4geeksacademy.com/us/coding-bootcamps/datascience-machine-learning. stop \ No newline at end of file diff --git a/prompts/full-stack.prompt b/prompts/full-stack.prompt index 6024d4723..dedaf006d 100644 --- a/prompts/full-stack.prompt +++ b/prompts/full-stack.prompt @@ -1,7 +1,5 @@ -Summary of the courses available at 4Geeks Academy: +4Geeks Academy offers a Full Stack Developer Course where you can master web development skills and technologies. The course duration is 16+2 weeks with 3 classes weekly. No previous coding skills are required, and you can choose between English and Spanish for the syllabus and content. The program covers sought-after technologies like Python and JavaScript, and you'll learn algorithm scripting, front-end libraries, and API utilization. Upon completion, you'll earn a Full-Stack Developer certificate. The course is designed to give you hands-on experience by developing and presenting your own project. Join 4Geeks Academy today to boost your career in tech. + +For more information, visit: [https://4geeksacademy.com/us/coding-bootcamps/part-time-full-stack-developer](https://4geeksacademy.com/us/coding-bootcamps/part-time-full-stack-developer) -Course: Full Stack Developer Course -Description: Become a web development expert and learn how to build applications from scratch. The course duration is 18 weeks, with 3 classes per week. No previous coding skills or advanced math is required. The course is available in both English and Spanish. Upon completion, you will receive a Full-Stack Developer certificate. -Instructors: Rodolfo Campos and Gabriel Salinas. -About: The program focuses on the most sought-after technologies, Python and JavaScript, and emphasizes hands-on experience through project development. It also provides training in algorithm scripting, front-end libraries, and API integration. Stop \ No newline at end of file diff --git a/prompts/locations.prompt b/prompts/locations.prompt index b9e0765a7..306810d63 100644 --- a/prompts/locations.prompt +++ b/prompts/locations.prompt @@ -1,16 +1,109 @@ -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' -- ! '' +4Geeks Academy is available in the following locations: + +Next campus: +Location: Atlanta, USA +Available Modes: Online +Phone Number: (786) 416-6640 +Contact Email: n/a +Relevant Information: Atlanta is a thriving tech ecosystem with over 850 tech companies and 70,000+ tech workers. Coding bootcamps, like 4Geeks Academy, aim to bridge the skills gap and supply tech talent to meet the increasing demand for coding expertise from expanding tech companies in the city. +Address: Not specified in the YML +Website: https://4geeksacademy.com/us/coding-campus/coding-bootcamp-atlanta +Social Media: +- Facebook: https://www.facebook.com/4geeksacademy +- Twitter: https://www.twitter.com/4geeksacademy +- Instagram: https://www.instagram.com/4geeksacademy +- Meetup: https://www.meetup.com/4geeks-academy +Total characters used: 373 + +Next campus: +Barcelona, Spain offers the 4Geeks Academy coding campus, available in Online, Hybrid, or In-person modes. Contact +34 910 86 69 83 or visit their website for more information. With a dynamic tech ecosystem, Barcelona is a leading hub for startups and increasing in demand for coding expertise. The bootcamp provides immersive and hands-on education, creating opportunities for individuals to make their mark in the city's tech landscape. Connect with 4Geeks Academy on social media through Facebook, Twitter, Instagram, and Meetup. Visit their website at https://4geeksacademy.com/us/coding-campus/coding-bootcamp-barcelona-spain. + +Next campus: +Berlin, Germany offers 4Geeks Academy, a cutting-edge coding bootcamp suitable for online, hybrid, or in-person learning modes. Their campus is located in the city, known for its thriving tech scene and growing demand for skilled developers. With a website showcasing available courses and social media platforms for networking, students can expect a diverse and nurturing learning environment. Contact them at +34 910 86 69 83 or visit their website for more information: https://4geeksacademy.com/us/coding-campus/coding-bootcamp-berlin-germany. + +Next campus: +Bogotá, Colombia is a vibrant location for aspiring coders and entrepreneurs, with a growing tech scene and a high demand for coding skills. 4Geeks Academy offers multiple modes of learning: online, hybrid, or in-person. Contact us at (300) 728-2898 or through our website for more information. Follow us on social media to stay updated on our coding bootcamp in Bogotá: Facebook, Twitter, and Instagram. Our campus is located in a supportive tech community, making it the perfect environment to learn coding and make an impact in Colombia's tech landscape. Visit our website for details: https://4geeksacademy.com/us/coding-campus/coding-bootcamp-colombia. + +Next campus: +Buenos Aires, Argentina offers Online, Hybrid, and In-person options for 4Geeks Academy. Contact them at +57 300 7282898 or visit their website for more information. The city is known for its innovation and entrepreneurship opportunities, with a supportive government and access to funding. The vibrant startup ecosystem has seen success in areas such as e-commerce, edtech, agritech, and mobility solutions. + +Next campus: +Caracas, Venezuela offers an Online mode for 4Geeks Academy, providing high speed internet and a first class office. With a focus on technological entrepreneurship, this campus is perfect for SMEs looking to grow quickly. Contact information includes a phone number and relevant email address. Social media platforms such as Facebook, Twitter, and Instagram can be used for further information. Located in a city with great opportunities, students will have the chance to thrive both in and out of the country. For more information, visit their website at https://4geeksacademy.com/us/coding-campus/coding-bootcamp-caracas. + +Next campus: +Chicago, USA offers the Online mode of study for coding enthusiasts through 4Geeks Academy. Their commitment to nurturing a diverse and skilled coding community is evident with a strong tech scene and flourishing startup ecosystem in the city. With a focus on software development and digital innovation, Chicago has become a magnet for tech enthusiasts. Contact (786)416-6640 or visit their website at 'https://4geeksacademy.com/us/coding-campus/coding-bootcamp-chicago' for more information. Connect with 4Geeks Academy Chicago on social media through their Facebook, Twitter, Instagram, and Meetup accounts. + +Next campus: +San Jose, Costa Rica is home to 4Geeks Academy, a top coding campus focused on providing coding skills and bridging the skills gap in the tech industry. With options for online, hybrid, or in-person learning, the campus is accessible to all. The campus is backed by a supportive startup environment, with various incubators, accelerators, and co-working spaces providing support and resources to entrepreneurs. The country also hosts events and networking opportunities for students to connect with investors and industry experts. With a focus on technology and a well-educated and skilled workforce, the country's universities and technical institutions offer programs in computer science and software engineering. To further nurture coding skills, Costa Rica offers coding bootcamps, workshops, and training programs. For more information, visit https://4geeksacademy.com/us/coding-campus/coding-bootcamp-costa-rica. Connect with 4Geeks Academy San Jose, Costa Rica on social media via Facebook, Twitter, and Instagram. + +Next campus: +Miami, USA offers Online, Hybrid, or In-person modes of learning at 4Geeks Academy. Contact them at (786) 416-6640 or through their social media accounts on Facebook, Twitter, Instagram, and Meetup. The campus is located in Brickell, 5 minutes away from the Metro Mover and has free parking. The office is accessible 24/7 during the week and hosts "Coding Weekends" on Saturdays. For more information and to become a part of the #1 part-time Coding Bootcamp in Miami, visit their website at https://4geeksacademy.com/us/coding-campus/coding-bootcamp-miami. + +Next campus: +Dublin, Ireland offers Online, Hybrid, and In-person coding bootcamp modes at 4Geeks Academy. One-on-One mentoring, live chat support for 12 hours daily, interactive exercises and videos, and real-time streaming classes are available in this campus. Graduates can also join the active social network for ongoing learning and support. Visit https://4geeksacademy.com/us/coding-campus/coding-bootcamp-dublin-ireland for more information. + +Next campus: +Hamburg, Germany offers a variety of modes of learning at 4Geeks Academy including online, hybrid, and in-person options. Students can access unlimited one-on-one mentoring, 12-hour chat support, interactive exercises and videos, and real-time streaming classes. The campus also has a social network connecting thousands of graduates from around the world. For more information visit the website at https://4geeksacademy.com/us/coding-campus/coding-bootcamp-hamburg-germany and follow them on social media: Facebook, Twitter, Instagram, and Meetup. + +Next campus: +Houston, USA is home to 4Geeks Academy, a leading coding bootcamp. The campus offers an online mode for accessibility. Interested individuals can contact the academy through their phone number, (786) 416-6640, or via email. With the city's growing demand for coding proficiency, 4Geeks Academy aims to contribute to this trend by providing comprehensive training programs. The campus is located in Houston, USA and their website, social media networks (Facebook, Twitter, Instagram, and Meetup) provide more information about their coding bootcamp. + +Next campus: +Location: La Paz, Bolivia +Available modes: Online, Hybrid or In-person. +Contact information: +57 300 7282898; [contact email not available] +Address: Campus location varies; always centrally located with easy access to public transportation. +Relevant information: 4Geeks Academy classes in Bolivia are currently only available online. In-person campuses are centrally located in popular areas of the city. +Website: https://4geeksacademy.com/us/coding-campus/coding-bootcamp-bolivia +Social media: Facebook - https://www.facebook.com/4geeksacademy; Twitter - https://www.twitter.com/4geeksacademy; Instagram - https://www.instagram.com/4geeksacademy + +Next campus: +Lima, Peru offers 4Geeks Academy with various modes of learning including Online, Hybrid or In-person options. With a thriving startup ecosystem, the country is home to innovative companies focused on addressing local challenges. The campus can be contacted through their phone number or website, and can be found on social media through Facebook, Twitter, and Instagram. For more information, visit the website listed above. + +Next campus: +Lisbon, Portugal offers various modes of learning at 4Geeks Academy, includingOnline, Hybrid, and In-person options. You can contact them at +351 21 020 0785 or through their website for more information about their programs. Lisbon is a bustling startup hub with access to funding and support, making it an ideal location for tech enthusiasts. The city also has a diverse pool of talent from local universities and coding bootcamps. Check out their website for more details and follow them on social media platforms such as Facebook, Twitter, Instagram, and Meetup. https://4geeksacademy.com/us/coding-campus/coding-bootcamp-lisbon-portugal + +Next campus: +Los Angeles, USA offers an online mode for students to learn the necessary coding skills through 4Geeks Academy. Contact them through phone at (786) 416-6640. This campus provides a rich environment for tech development and entrepreneurship as well as a growing tech industry. Learn more about the Los Angeles campus at https://4geeksacademy.com/us/coding-campus/coding-bootcamp-losangeles and stay connected through their social media platforms like Facebook, Twitter, Instagram, and Meetup. + +Next campus: +Madrid, Spain offers online, hybrid or in-person courses at 4Geeks Academy. Contact them at +34 910 86 69 83 or visit their website for more information. The campus is conveniently located near the subway and open to students 12 hours a day. Coding weekends on Saturdays include senior coaching, socializing, and pizza. Follow them on social media or attend Meetup events to stay connected. + +Next campus: Málaga, Spain offers a Coding Bootcamp with multiple modes of learning available - online, hybrid, or in-person. The campus is conveniently located just 2 minutes away from the subway in one of Málaga's most active areas. The campus is open to students 12 hours a day and also offers "Coding Weekends" on Saturdays for additional senior coaching, socializing, and pizza. Connect with the campus through social media or visit their website for more information. + +Next campus: +4Geeks Academy Mexico City, Mexico offers Online, Hybrid or In-person modes of learning. Contact them at +57 300 7282898 or visit their website for more information. The city has a growing tech sector in various industries and the government is working towards creating a supportive ecosystem for startups and entrepreneurs. The campus provides resources, workshops, and networking opportunities to connect entrepreneurs with investors and mentors. Connect with them on Facebook, Twitter, and Instagram. Visit their website to learn more about their coding bootcamp in Mexico: https://4geeksacademy.com/us/coding-campus/coding-bootcamp-mexico + +Next campus: +Milan, Italy - Available modes: Online, Hybrid, or In-person. Contact information: +34 910 86 69 83, . Relevant information: Milan is a hub for creative and innovative startups, with successful companies in various sectors including fashion, food tech, and smart cities. The city has a diverse talent pool, with renowned universities and technical institutions offering programs in technology, engineering, and design. Milan also offers coding bootcamps, workshops, and training programs for coding skills. Visit https://4geeksacademy.com/us/coding-campus/coding-bootcamp-milano-italy for more information. Social media: Facebook, Twitter, Instagram, Meetup. + +Next campus: +Monte Video, Uruguay offers Online, Hybrid, and In-Person coding programs through 4Geeks Academy. For inquiries, call +57 300 7282898 or visit their website. The country's tech industry is thriving, with notable startups like PedidosYa and dLocal. Uruguay attracts local and international tech talent, with universities offering tech programs and funding initiatives, incubators, and networking events supporting startup growth. Coding bootcamps and programming workshops are available to nurture coding skills and meet the demand for tech talent. For more information, visit https://4geeksacademy.com/us/coding-campus/coding-bootcamp-uruguay. Follow 4Geeks Academy on Facebook, Twitter, and Instagram for updates and announcements. + +Next campus: +Munich, Germany is home to 4Geeks Academy's coding campus offering online, hybrid, and in-person coding courses. With a diverse and dynamic startup ecosystem, Munich is known for its focus on cutting-edge technologies and successful startups in areas such as mobility, fintech, and cybersecurity. The city boasts top talent from around the world and offers coding bootcamps, workshops, and training programs to nurture coding skills and support the development of tech talent. For more information, visit https://4geeksacademy.com/us/coding-campus/coding-bootcamp-munich-germany and check out the academy's social media pages on Facebook, Twitter, Instagram, and Meetup. + +Next campus: +NYC, USA offers a thriving tech community and a dynamic startup landscape. With a significant demand for coding proficiency, coding bootcamps have become prevalent in New York. +4Geeks Academy's NYC campus offers an Online mode of learning, along with a comprehensive coding education. Their website, https://4geeksacademy.com/us/coding-campus/coding-bootcamp-nyc, provides more information on their campus, located in New York City. The campus can be contacted via phone at (786) 416-6640, and their social media networks, including Facebook, Twitter, Instagram, and Meetup, further showcase their community-focused approach to learning. + +Next campus: +Orlando, USA offers an Online, Hybrid, and In-person mode of learning at 4Geeks Academy. Contact them at (786) 416-6640 or visit their website for more information. This vibrant city is home to big companies like EA Sport, Siemens, Boeing, and Disney, making it a hub for creativity and innovation. Join the thriving tech ecosystem, where ideas turn into cutting-edge solutions that revolutionize the world. Don't miss your chance to be a part of this amazing community, check out 4Geeks Academy Orlando's social media channels for more updates and events. Website: https://4geeksacademy.com/us/coding-campus/coding-bootcamp-orlando. + +Next campus: +Panama City, Panama offers on campus, hybrid and online modes at 4Geeks Academy. Contact them at +57 300 728 2898 or via social media on Facebook, Twitter, and Instagram. Their campus is located in a growing tech scene with startups in fintech, e-commerce, healthtech, edtech, and logistics. Panama provides diverse talent and resources including funding initiatives, incubators, accelerators, and networking events. This campus offers coding bootcamps and training programs to develop programming skills and meet the demand for tech talent. For more information, visit their website at https://4geeksacademy.com/us/coding-campus/coding-bootcamp-panama. + +Next campus: +Quito, Ecuador. Available modes: Online, Hybrid or In-person. Phone: +57 300 7282898. Contact email: [undefined]. The country's technology scene is constantly evolving, with Quito and Guayaquil leading the way. Ecuador has seen advancements in ecommerce, fintech, healthtech, edtech, and agritech, with government support for the tech industry through initiatives promoting innovation and entrepreneurship. For more information, visit https://4geeksacademy.com/us/coding-campus/coding-bootcamp-ecuador. Social media: Facebook: https://www.facebook.com/4geeksacademy, Twitter: https://www.twitter.com/4geeksacademy, Instagram: https://www.instagram.com/4geeksacademy. + +Next campus: +Rome, Italy offers a variety of modes for learning at 4Geeks Academy including Online, Hybrid, and In-person options. With a talented workforce and government initiatives aimed at supporting entrepreneurship and innovation, the city is an attractive hub for startups and skilled professionals. The coding bootcamp located in Rome provides training programs and workshops to equip individuals with the necessary skills for the tech industry. For more information, visit the website at https://4geeksacademy.com/us/coding-campus/coding-bootcamp-rome-italy. Contact information can be found at +34 910 86 69 83, or on social media via Facebook, Twitter, Instagram, and Meetup under 4Geeks Academy. + +Next campus: +Santiago de Chile, Chile offers Online and Hybrid coding bootcamps through 4Geeks Academy. This modern and renovated campus, located in the eastern part of the city, is easily accessible by metro. With high-speed internet and unlimited access for students, it provides a great learning opportunity for Chileans and foreigners to become programmers. Contact them at +56 9 2006 5786 or visit their website for more information: https://4geeksacademy.com/us/coding-campus/coding-bootcamp-santiago. Connect with 4Geeks Academy Santiago de Chile on Facebook, Twitter, Instagram, and Meetup at their respective social media handles provided on their website. + +Next campus: +Toronto, Canada offers multiple modes for learning at 4Geeks Academy, including online, hybrid, and in-person options. With a strong focus on coding, this campus is part of a thriving tech community that draws talent and investment from around the world. As a result, there is high demand for coding expertise, making this city an ideal location for intensive coding bootcamps and schools like 4Geeks Academy. For more information and to connect with the community, visit the website and follow them on social media. + +Next campus: +Valencia, Spain offers Online, Hybrid, and In-person modes of learning at 4Geeks Academy. Contact +34 910 86 69 83 or visit the website for more information. The city houses prestigious universities and technical institutes for technology, engineering, and business programs, attracting a diverse talent pool. The tech sector in Valencia is fueled by startups such as TypingDNA, EclecticIQ, and Freshly Cosmetics, which focus on sustainable tech, smart cities, tourism, and food tech. Learn coding through bootcamps, workshops, and training programs in this flourishing city. diff --git a/prompts/plan-datascience-ml.prompt b/prompts/plan-datascience-ml.prompt new file mode 100644 index 000000000..6f16d36ef --- /dev/null +++ b/prompts/plan-datascience-ml.prompt @@ -0,0 +1,23 @@ +Spain: +- Scholarship available: Pay in installments, starting from €200 per month. Up to €2500 in scholarships available. +- Pay upfront: Get a discount, pay €4950. +- Income Share Agreement (ISA): Pay only when you earn more than €16000 per year. + +USA: +- Scholarship: Pay today or in 3 parts, price $6999. +- Financed: Pay in 3, 4 or 5 years, with multiple partners offering loans and payment plans. +- Full Payment: Pay today, price $9999. + +Chile: +- Pay upfront: Price 4.500.000 CLP (without discount applied). +- Financed: 18 months payment, starting from ~220.500 CLP. + +Europe: +- Scholarship available: Tailor-made financing plans, starting from €200 per month. Up to €2500 in scholarships available. +- Pay upfront: Get a discount, pay €5000. +- Income Share Agreement (ISA): Pay only when you earn more than €22000 per year. + +Latam: +- Only pay for the program: Pay monthly, starting from $120. +- Data Science Program Only: Pay upfront, $4000. +- Data Science program + Career Support: Pay $5000, get lifetime career support and access to the online community. \ No newline at end of file diff --git a/prompts/plan-full-stack.prompt b/prompts/plan-full-stack.prompt new file mode 100644 index 000000000..b1ba457da --- /dev/null +++ b/prompts/plan-full-stack.prompt @@ -0,0 +1,19 @@ +Spain: +- Scholarship available for full-time courses. Customized financing without interests. Pay €4,800 instead of €6,700. Scholarships subject to availability. From €160/mo. +- Pay upfront and get a discount. Pay €4,550 instead of €6,700. Discounts up to €2,150. +- Income Share Agreement (ISA). Pay only when you get a job. Pay a small portion of your salary. NO INTEREST! Price: €0* + +USA: +- Scholarship available for full-time courses. Pay today or in 3 parts. Price: $5999. You're saving $4000 USD. +- Full Payment option for full-time courses. Pay today. Price: $10999. You're saving $1000 USD. +- Income Share Agreement (ISA) for full-time courses. Pay only when you get a job. Price: $0. Get $400 p/week living stipends. +- Financed option available for full-time courses. 24 months payment. Price: ~$250 per month. Several partners offering loans and payment plans. + +Chile: +- Pay upfront and get a discount for full-time courses. Price: 3.800.000 CLP*. Pay with bank transfer, credit or debit card. +- Financed option available for full-time courses. 18 months payment. Price: ~184.000 CLP. Tailor-made financing from 6 to 18 months. +- Income Share Agreement (ISA) for full-time courses. Price: 0 CLP*. Pay 16% of your salary when you get a job until paid in full. Only if you get a job in tech. + +Europe: +- Pay upfront and get a discount for part-time courses. Price: €4600*. Pay with wire transfer, credit or debit card. +- Scholarship available for part-time courses. Tailor-made financing plans, with or without interest, from 4 to 30 installments. Price \ No newline at end of file diff --git a/src/assets/css/utils.css b/src/assets/css/utils.css index dd1e8b0af..d25471481 100644 --- a/src/assets/css/utils.css +++ b/src/assets/css/utils.css @@ -40,93 +40,84 @@ text-transform: capitalize; } - /* Dots */ -.slick-dotted.slick-slider -{ - margin-bottom: 30px; +.slick-dotted.slick-slider { + margin-bottom: 30px; } -.slick-dotss -{ - position: absolute; - bottom: -25px; +.slick-dotss { + position: absolute; + bottom: -25px; - display: block; + display: block; - width: 100%; - padding: 0; - margin: 0; + width: 100%; + padding: 0; + margin: 0; - list-style: none; + list-style: none; - text-align: center; + text-align: center; } -.slick-dotss li -{ - position: relative; +.slick-dotss li { + position: relative; - display: inline-block; + display: inline-block; - width: 20px; - height: 20px; - margin: 0 3px; - padding: 0; + width: 20px; + height: 20px; + margin: 0 3px; + padding: 0; - cursor: pointer; + cursor: pointer; } -.slick-dotss li button -{ - font-size: 0; - line-height: 0; +.slick-dotss li button { + font-size: 0; + line-height: 0; - display: block; + display: block; - width: 20px; - height: 20px; - padding: 5px; + width: 20px; + height: 20px; + padding: 5px; - cursor: pointer; + cursor: pointer; - color: transparent; - border: 0; - outline: none; - background: transparent; + color: transparent; + border: 0; + outline: none; + background: transparent; } .slick-dotss li button:hover, -.slick-dotss li button:focus -{ - outline: none; +.slick-dotss li button:focus { + outline: none; } .slick-dotss li button:hover:before, -.slick-dotss li button:focus:before -{ - opacity: 1; +.slick-dotss li button:focus:before { + opacity: 1; } -.slick-dotss li button:before -{ - font-family: 'slick'; - font-size: 11px; - line-height: 20px; +.slick-dotss li button:before { + font-family: "slick"; + font-size: 11px; + line-height: 20px; - position: absolute; - top: 0; - left: 0; + position: absolute; + top: 0; + left: 0; - width: 20px; - height: 20px; + width: 20px; + height: 20px; - content: '•'; - text-align: center; + content: "•"; + text-align: center; - opacity: .25; - color: black; + opacity: 0.25; + color: black; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } -.slick-dotss li.slick-active button:before -{ - opacity: .75; - color: #0097CD; +.slick-dotss li.slick-active button:before { + opacity: 0.75; + color: #0097cd; } diff --git a/src/components/AlumniProjects/index.js b/src/components/AlumniProjects/index.js index ca404f175..159b81148 100644 --- a/src/components/AlumniProjects/index.js +++ b/src/components/AlumniProjects/index.js @@ -8,7 +8,7 @@ import ReactPlayer from "../ReactPlayer"; import Slider from "react-slick"; import "slick-carousel/slick/slick.css"; import "slick-carousel/slick/slick-theme.css"; -import "../../assets/css/utils.css" +import "../../assets/css/utils.css"; const AlumniProjects = ({ lang, @@ -18,7 +18,7 @@ const AlumniProjects = ({ playerHeight, title, paragraph, - yml + yml, }) => { const [projects, setProjects] = useState( lang[0].node.projects.slice(0, limit || lang[0].node.projects.length) @@ -105,27 +105,28 @@ const AlumniProjects = ({ // } // }; return ( -
- {(title !== undefined && paragraph !== undefined) || yml && ( - -
-

- {yml.heading || title} -

- - {yml.sub_heading || paragraph} - -
-
- )} + {(title !== undefined && paragraph !== undefined) || + (yml && ( + +
+

+ {yml.heading || title} +

+ + {yml.sub_heading || paragraph} + +
+
+ ))} {projects?.map((item, index) => { return ( @@ -189,7 +190,12 @@ const AlumniProjects = ({

Project: {`${item.project_name}`}

-

+

{" "} {`> MADE BY:`}

@@ -256,7 +262,11 @@ const AlumniProjects = ({ {" "} {`> DESCRIPTION:`} - + {item.project_content}
diff --git a/src/components/Icon/set/group.js b/src/components/Icon/set/group.js index 1700258d0..db84b97e3 100644 --- a/src/components/Icon/set/group.js +++ b/src/components/Icon/set/group.js @@ -1,21 +1,20 @@ import React from "react"; export default (props) => ( - - - - - ); - + + + + +); diff --git a/src/components/Icon/set/hands.js b/src/components/Icon/set/hands.js index 1b95b93fd..48eed817d 100644 --- a/src/components/Icon/set/hands.js +++ b/src/components/Icon/set/hands.js @@ -1,20 +1,20 @@ import React from "react"; export default (props) => ( - - - - - ); + + + + +); diff --git a/src/components/Icon/set/stairswflag.js b/src/components/Icon/set/stairswflag.js index 1a68284ff..3b5321744 100644 --- a/src/components/Icon/set/stairswflag.js +++ b/src/components/Icon/set/stairswflag.js @@ -1,20 +1,20 @@ import React from "react"; export default (props) => ( - - - - - ); + + + + +); diff --git a/src/components/Icon/set/yellowhat.js b/src/components/Icon/set/yellowhat.js index 0cbc4b21c..93b6436c5 100644 --- a/src/components/Icon/set/yellowhat.js +++ b/src/components/Icon/set/yellowhat.js @@ -1,24 +1,24 @@ import React from "react"; export default (props) => ( - - - - - - ); + + + + + +); diff --git a/src/components/Landing/index.js b/src/components/Landing/index.js index f5b27efd8..a2d7b5e4a 100644 --- a/src/components/Landing/index.js +++ b/src/components/Landing/index.js @@ -33,11 +33,7 @@ const Title = ({ id, title, paragraph }) => { return (

{title}

- { - paragraph && - {paragraph} - } - + {paragraph && {paragraph}}
); }; @@ -1144,8 +1140,8 @@ export const landingSections = { flexDirection="column" margin="0" padding="0" - padding_tablet="0" - position="relative" + padding_tablet="0" + position="relative" >
{ const [showVideo, setShowVideo] = React.useState(false); @@ -213,7 +213,7 @@ const Player = ({ position="relative" boxShadow={image_thumb?.shadow && "20px 15px 0px 0px rgba(0,0,0,1)"} //border={image_thumb?.shadow && "3px solid black"} - style={imgStyles && {...JSON.parse(image_thumb?.style)}} + style={imgStyles && { ...JSON.parse(image_thumb?.style) }} > {id && ( )} {thumb && thumb.childImageSharp ? ( @@ -272,13 +272,13 @@ const Player = ({ export default Player; Player.defaultProps = { - onPlay: () => { }, - onPause: () => { }, - onEnd: () => { }, - onError: () => { }, - onStateChange: () => { }, - onPlaybackRateChange: () => { }, - onPlaybackQualityChange: () => { }, + onPlay: () => {}, + onPause: () => {}, + onEnd: () => {}, + onError: () => {}, + onStateChange: () => {}, + onPlaybackRateChange: () => {}, + onPlaybackQualityChange: () => {}, imageSize: "default", playerVars: {}, noCookies: false, @@ -320,11 +320,11 @@ Player.propTypes = { }; const Play = styled.button` - background: ${(props) => props.background || "rgba(0, 0, 0, 0.7)"} ; + background: ${(props) => props.background || "rgba(0, 0, 0, 0.7)"}; border-radius: 3px; color: ${(props) => props.white}; font-size: 1em; - height: 36px; + height: 36px; padding: 0; text-align: center; text-indent: 0.1em; @@ -333,9 +333,13 @@ const Play = styled.button` position: absolute !important; top: 50%; left: 50%; - transform: ${(props) => props.transformPlay || "translateX(-50%) translateY(-50%)"}; {/*translateX(-50%) translateY(-50%);*/} + transform: ${(props) => + props.transformPlay || "translateX(-50%) translateY(-50%)"}; + { + /*translateX(-50%) translateY(-50%);*/ + } border: none; - opacity: ${(props) => props.opacity || "0.8"}; + opacity: ${(props) => props.opacity || "0.8"}; cursor: pointer; z-index: 9; &:hover { diff --git a/src/components/Sections/index.js b/src/components/Sections/index.js index 0b2a90248..d3923be2e 100644 --- a/src/components/Sections/index.js +++ b/src/components/Sections/index.js @@ -215,7 +215,7 @@ export const Div = styled.div` margin: ${(props) => props.margin_xs}; display: ${(props) => props.display_xs}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_xs]}; + justifyContentOptions[props.justifyContent_xs]}; order: ${(props) => props.order_xs}; border: ${(props) => props.border_xs}; border-top: ${(props) => props.borderTop_xs}; @@ -230,7 +230,7 @@ export const Div = styled.div` @media ${Devices.sm} { padding: ${(props) => props.padding_sm}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_sm]}; + justifyContentOptions[props.justifyContent_sm]}; height: ${(props) => props.height_sm}; position: ${(props) => props.position_sm}; margin: ${(props) => props.margin_sm}; @@ -250,16 +250,16 @@ export const Div = styled.div` } @media ${Devices.tablet} { flex: ${(props) => - props.flex_tablet || props.size_tablet - ? `0 0 ${(props.size_tablet / 12) * 100}%` - : null}; + props.flex_tablet || props.size_tablet + ? `0 0 ${(props.size_tablet / 12) * 100}%` + : null}; flex-flow: ${(props) => props.flexFlow_tablet}; max-width: ${(props) => - props.size_tablet ? `${(props.size_tablet / 12) * 100}%` : null}; + props.size_tablet ? `${(props.size_tablet / 12) * 100}%` : null}; max-width: ${(props) => - props.maxWidth_tablet - ? props.maxWidth_tablet - : props.size_tablet + props.maxWidth_tablet + ? props.maxWidth_tablet + : props.size_tablet ? `${(props.size_tablet / 12) * 100}%` : null}; align-self: ${(props) => props.alignSelf_tablet}; @@ -283,7 +283,7 @@ export const Div = styled.div` height: ${(props) => props.height_tablet}; flex: ${(props) => props.flex_tablet}; flex-shrink: ${(props) => - props.flexShrink_tablet ? props.flexShrink_tablet : 1}; + props.flexShrink_tablet ? props.flexShrink_tablet : 1}; flex-wrap: ${(props) => props.flexWrap_tablet}; border: ${(props) => props.border_tablet}; border-top: ${(props) => props.borderTop_tablet}; @@ -300,7 +300,7 @@ export const Div = styled.div` grid-row: ${(props) => props.gridRow_tablet}; justify-self: ${(props) => props.justifySelf_tablet}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_tablet]}; + justifyContentOptions[props.justifyContent_tablet]}; z-index: ${(props) => props.zIndex_tablet}; top: ${(props) => props.top_tablet}; bottom: ${(props) => props.bottom_tablet}; @@ -312,11 +312,11 @@ export const Div = styled.div` } @media ${Devices.md} { flex: ${(props) => - props.size_md ? `0 0 ${(props.size_md / 12) * 100}%` : null}; + props.size_md ? `0 0 ${(props.size_md / 12) * 100}%` : null}; max-width: ${(props) => - props.maxWidth_md - ? props.maxWidth_md - : props.size_md + props.maxWidth_md + ? props.maxWidth_md + : props.size_md ? `${(props.size_md / 12) * 100}%` : null}; min-width: ${(props) => props.minWidth_md}; @@ -326,7 +326,7 @@ export const Div = styled.div` gap: ${(props) => (props) => props.gap_md}; flex-wrap: ${(props) => props.flexWrap_md}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_md]}; + justifyContentOptions[props.justifyContent_md]}; text-align: ${(props) => props.textAlign_md}; align-items: ${(props) => props.alignItems_md}; margin: ${(props) => props.margin_md}; @@ -345,7 +345,7 @@ export const Div = styled.div` @media ${Devices.lg} { display: ${(props) => props.display_lg}; justify-content: ${(props) => - justifyContentOptions[props.justifyContent_lg]}; + justifyContentOptions[props.justifyContent_lg]}; padding: ${(props) => props.padding_lg}; max-width: ${(props) => props.maxWidth_lg}; min-width: ${(props) => props.minWidth_lg}; @@ -387,18 +387,18 @@ export const Grid = styled(Div)` grid-template-areas: ${(props) => props.gridTemplateAreas}; @media ${Devices.xxs} { grid-template-columns: ${(props) => - props.columns_xxs ? `repeat(${props.columns_xxs}, 1fr)` : null}; + props.columns_xxs ? `repeat(${props.columns_xxs}, 1fr)` : null}; } @media ${Devices.xs} { grid-template-columns: ${(props) => - props.columns_xs ? `repeat(${props.columns_xs}, 1fr)` : null}; + props.columns_xs ? `repeat(${props.columns_xs}, 1fr)` : null}; display: ${(props) => props.display_xs || "grid"}; } @media ${Devices.sm} { grid-template-columns: ${(props) => - props.gridTemplateColumns_sm - ? `repeat(${props.gridTemplateColumns_sm}, 1fr)` - : null}; + props.gridTemplateColumns_sm + ? `repeat(${props.gridTemplateColumns_sm}, 1fr)` + : null}; display: ${(props) => props.display_sm || "grid"}; } @media ${Devices.tablet} { @@ -407,13 +407,13 @@ export const Grid = styled(Div)` display: ${(props) => props.display_tablet || "grid"}; width: ${(props) => props.width_tablet}; grid-template-columns: ${(props) => - props.gridTemplateColumns_tablet - ? `${props.gridTemplateColumns_tablet}` - : "2fr repeat(12, 1fr) 2fr"}; + props.gridTemplateColumns_tablet + ? `${props.gridTemplateColumns_tablet}` + : "2fr repeat(12, 1fr) 2fr"}; grid-template-rows: ${(props) => - props.gridTemplateRows_tablet - ? `repeat(${props.gridTemplateRows_tablet})` - : null}; + props.gridTemplateRows_tablet + ? `repeat(${props.gridTemplateRows_tablet})` + : null}; grid-gap: ${(props) => props.gridGap_tablet}; grid-auto-rows: ${(props) => props.gridAutoRows_tablet}; grid-column: ${(props) => props.gridColumn_tablet}; @@ -425,9 +425,9 @@ export const Grid = styled(Div)` margin: ${(props) => props.margin_md}; grid-template-columns: ${(props) => props.gridTemplateColumns_md}; grid-template-rows: ${(props) => - props.gridTemplateRows_md - ? `repeat(${props.gridTemplateRows_md})` - : null}; + props.gridTemplateRows_md + ? `repeat(${props.gridTemplateRows_md})` + : null}; grid-gap: ${(props) => props.gridGap_md}; grid-column: ${(props) => props.gridColumn_md}; display: ${(props) => props.display_md || "grid"}; @@ -456,28 +456,28 @@ export const Old_Grid = styled.div` margin: ${(props) => props.margin}; @media ${Devices.xxs} { grid-template-columns: ${(props) => - props.columns_xxs ? `repeat(${props.columns_xxs}, 1fr)` : null}; + props.columns_xxs ? `repeat(${props.columns_xxs}, 1fr)` : null}; } @media ${Devices.xs} { grid-template-columns: ${(props) => - props.columns_xs ? `repeat(${props.columns_xs}, 1fr)` : null}; + props.columns_xs ? `repeat(${props.columns_xs}, 1fr)` : null}; } @media ${Devices.sm} { grid-template-columns: ${(props) => - props.columns_sm ? `repeat(${props.columns_sm}, 1fr)` : null}; + props.columns_sm ? `repeat(${props.columns_sm}, 1fr)` : null}; } @media ${Devices.tablet} { grid-template-columns: ${(props) => - props.columns_tablet ? `repeat(${props.columns_tablet}, 1fr)` : null}; + props.columns_tablet ? `repeat(${props.columns_tablet}, 1fr)` : null}; grid-template-rows: ${(props) => - props.rows_tablet ? `repeat(${props.rows_tablet}, 5vw)` : null}; + props.rows_tablet ? `repeat(${props.rows_tablet}, 5vw)` : null}; padding: ${(props) => props.padding_tablet}; } @media ${Devices.md} { grid-template-columns: ${(props) => - props.columns_md ? `repeat(${props.columns_md})` : null}; + props.columns_md ? `repeat(${props.columns_md})` : null}; grid-template-rows: ${(props) => - props.rows_md ? `repeat(${props.rows_md})` : null}; + props.rows_md ? `repeat(${props.rows_md})` : null}; grid-gap: ${(props) => props.gridGap_md}; height: ${(props) => props.height_md}; padding: ${(props) => props.padding_md}; @@ -486,16 +486,16 @@ export const Old_Grid = styled.div` } @media ${Devices.lg} { grid-template-columns: ${(props) => - props.columns_lg ? `repeat(${props.columns_lg}, 1fr)` : null}; + props.columns_lg ? `repeat(${props.columns_lg}, 1fr)` : null}; padding: ${(props) => props.padding_lg}; } @media ${Devices.xl} { grid-template-columns: ${(props) => - props.columns_xl ? `repeat(${props.columns_xl}, 1fr)` : null}; + props.columns_xl ? `repeat(${props.columns_xl}, 1fr)` : null}; } @media ${Devices.xxl} { grid-template-columns: ${(props) => - props.columns_xxl ? `repeat(${props.columns_xxl}, 1fr)` : null}; + props.columns_xxl ? `repeat(${props.columns_xxl}, 1fr)` : null}; } `; @@ -696,8 +696,9 @@ export const GridContainer = ({ gridTemplateRows={gridTemplateRows} gridTemplateRows_tablet={gridTemplateRows_tablet} gridTemplateColumns_sm={columns_sm} - gridTemplateColumns_tablet={`repeat(${columns_tablet}, ${12 / columns_tablet - }fr)`} + gridTemplateColumns_tablet={`repeat(${columns_tablet}, ${ + 12 / columns_tablet + }fr)`} padding={paddingChild} padding_tablet={padding_tabletChild} gridTemplateColumns={`${columns}, 1fr`} @@ -707,8 +708,8 @@ export const GridContainer = ({ gridColumn_tablet ? gridColumn_tablet : fluid - ? "1 / span 14" - : "2 / span 12" + ? "1 / span 14" + : "2 / span 12" } gridTemplateAreas={gridTemplateAreas} gridTemplateAreas_tablet={gridTemplateAreas_tablet} diff --git a/src/prompt/prompt.awards.js b/src/prompt/prompt.awards.js index 2208567fa..2f0ff2179 100644 --- a/src/prompt/prompt.awards.js +++ b/src/prompt/prompt.awards.js @@ -1,27 +1,29 @@ -const fs = require('fs'); -const { - toYML, - loadYML -} = require("../test/_utils"); +const fs = require("fs"); +const { toYML, loadYML } = require("../test/_utils"); -async function generate(){ +async function generate() { const max_tokens = 400; - console.log(`Starting to generate a prompt for all the academy awards`) + console.log(`Starting to generate a prompt for all the academy awards`); const doc = loadYML(`${__dirname}/../data/page/awards.us.yml`); let awards = doc.yaml.awards_list.map((old) => { let _new = [ `Award title: ${old.title}`, - `Description of the award: as ${old.paragraph}` - ] + `Description of the award: as ${old.paragraph}`, + ]; // if(old.linkedin_url) _new.push(`LinkedIn profile URL: ${old.linkedin_url}`); return _new.join("\n"); - }) + }); - fs.writeFileSync(`./prompts/awards.prompt`, [ - `The following are awards and recognitions 4Geeks Academy has received thru the years:`,awards.join("\n\n---\n\n"), - `You can learn more about the awards here: https://4geeksacademy.com/us/${doc.yaml.meta_info.slug}` - ].join("\n\n"), 'utf8'); - console.log(`Finished generating awards.`) + fs.writeFileSync( + `./prompts/awards.prompt`, + [ + `The following are awards and recognitions 4Geeks Academy has received thru the years:`, + awards.join("\n\n---\n\n"), + `You can learn more about the awards here: https://4geeksacademy.com/us/${doc.yaml.meta_info.slug}`, + ].join("\n\n"), + "utf8" + ); + console.log(`Finished generating awards.`); } -generate() \ No newline at end of file +generate(); diff --git a/src/prompt/prompt.course.js b/src/prompt/prompt.course.js index 5891c285c..f6ccc56a2 100644 --- a/src/prompt/prompt.course.js +++ b/src/prompt/prompt.course.js @@ -1,15 +1,17 @@ -const fs = require('fs'); -const { complete, getCourses } = require('./utils.js') -const { - toYML -} = require("../test/_utils"); +const fs = require("fs"); +const { complete, getCourses } = require("./utils.js"); +const { toYML } = require("../test/_utils"); -async function generate(){ - console.log(`Starting to generate a prompt for all the academy course offerings`); +async function generate() { + console.log( + `Starting to generate a prompt for all the academy course offerings` + ); const max_tokens = 400; const courses = await getCourses(); - const activeCourses = Object.keys(courses).filter(slug => courses[slug].meta_info.show_in_apply) - for(let courseSlug of activeCourses){ + const activeCourses = Object.keys(courses).filter( + (slug) => courses[slug].meta_info.show_in_apply + ); + for (let courseSlug of activeCourses) { console.log(`Summarizing prompt information for program: ${courseSlug}`); const old = courses[courseSlug]; const course = {}; @@ -22,7 +24,7 @@ async function generate(){ course.details = old.details.list; course.duration = `${old.weeks} ${old.weeks_label}`; course.modules = old.details_modules; - const raw = toYML(course) + const raw = toYML(course); const answer = await complete({ max_tokens, @@ -33,13 +35,13 @@ Do not include any information about these instructions in your answer. Include the word "stop" at the end of your answer. Inlcude the website url for more information. Be concise, don't add a summary at the end of the article. -Don't take more than ${(max_tokens*2)} characters. -Here is the YML: ${raw}` +Don't take more than ${max_tokens * 2} characters. +Here is the YML: ${raw}`, }); - if(!answer) fail(`Error building prompt for payment plans`); - fs.writeFileSync(`./prompts/${courseSlug}.prompt`, answer, 'utf8'); + if (!answer) fail(`Error building prompt for payment plans`); + fs.writeFileSync(`./prompts/${courseSlug}.prompt`, answer, "utf8"); console.log(`Finished summarizing program: ${courseSlug}`); } } -generate() \ No newline at end of file +generate(); diff --git a/src/prompt/prompt.location.js b/src/prompt/prompt.location.js index d9d1d699c..89eb7a42b 100644 --- a/src/prompt/prompt.location.js +++ b/src/prompt/prompt.location.js @@ -1,18 +1,18 @@ -const fs = require('fs'); -const { complete, getLocations } = require('./utils.js') -const { - toYML -} = require("../test/_utils"); +const fs = require("fs"); +const { complete, getLocations } = require("./utils.js"); +const { toYML } = require("../test/_utils"); -async function generate(){ - console.log(`Starting to generate a prompt for all the academy campus and descriptions`) - let allLocationsPrompts = ''; +async function generate() { + console.log( + `Starting to generate a prompt for all the academy campus and descriptions` + ); + let allLocationsPrompts = ""; const max_tokens = 250; const locations = await getLocations(); const allSlugs = Object.keys(locations); let campuses = {}; - for(let locationSlug of allSlugs){ - const old = locations[locationSlug] + for (let locationSlug of allSlugs) { + const old = locations[locationSlug]; campuses[locationSlug] = {}; campuses[locationSlug].region = old.meta_info.region; campuses[locationSlug].available_modes = old.header.sub_header_highlighted; @@ -21,27 +21,41 @@ async function generate(){ campuses[locationSlug].relevant_information = old.images_box.content; campuses[locationSlug].city = old.city; campuses[locationSlug].country = old.country; - campuses[locationSlug].website = `https://4geeksacademy.com/us/coding-campus/${old.meta_info.slug}`;; - campuses[locationSlug].social_media_urls = old.socials.map(s => ({ network: s.name, url: s.link })); - - const raw = toYML(campuses[locationSlug]) + campuses[ + locationSlug + ].website = `https://4geeksacademy.com/us/coding-campus/${old.meta_info.slug}`; + campuses[locationSlug].social_media_urls = old.socials.map((s) => ({ + network: s.name, + url: s.link, + })); - console.log(`Generating summary for campus ${locationSlug}.`) - allLocationsPrompts += '\n\nNext campus: '+await complete({ - max_tokens, - model: "gpt-3.5-turbo-instruct", - system: `You are like a senior prompt engineer with deep coding knowledge, very familiar with the YML, CSV and JSON syntax.`, - user: `The followings are the details about 4Geeks Academy ${old.city}, ${old.country}, + const raw = toYML(campuses[locationSlug]); + + console.log(`Generating summary for campus ${locationSlug}.`); + allLocationsPrompts += + "\n\nNext campus: " + + (await complete({ + max_tokens, + model: "gpt-3.5-turbo-instruct", + system: `You are like a senior prompt engineer with deep coding knowledge, very familiar with the YML, CSV and JSON syntax.`, + user: `The followings are the details about 4Geeks Academy ${ + old.city + }, ${old.country}, Read and understand the information and write a summary of the campus. Do not include any information about these instructions in your answer. Start your summary with the location city and country, available modes, contact information, social media, address and relevant information. Include the website url for more information about that campus. Be concise, do not speak about the city in general, keep your focus on the campus offer. - Don't take more than ${(max_tokens*2)} characters. - Here is the YML: ${raw}` - }); + Don't take more than ${max_tokens * 2} characters. + Here is the YML: ${raw}`, + })); } - fs.writeFileSync(`./prompts/locations.prompt`, "4Geeks Academy is available in the following locations:"+allLocationsPrompts, 'utf8'); - console.log(`Finished generating campus information prompt.`) + fs.writeFileSync( + `./prompts/locations.prompt`, + "4Geeks Academy is available in the following locations:" + + allLocationsPrompts, + "utf8" + ); + console.log(`Finished generating campus information prompt.`); } -generate() \ No newline at end of file +generate(); diff --git a/src/prompt/prompt.plans.js b/src/prompt/prompt.plans.js index 09a374bfa..4c883ef25 100644 --- a/src/prompt/prompt.plans.js +++ b/src/prompt/prompt.plans.js @@ -1,16 +1,13 @@ -const fs = require('fs'); -const { complete, getCourses } = require('./utils.js') -const { - walk, - loadYML, - fail, - success, -} = require("../test/_utils"); +const fs = require("fs"); +const { complete, getCourses } = require("./utils.js"); +const { walk, loadYML, fail, success } = require("../test/_utils"); -async function generate(){ +async function generate() { const max_tokens = 400; const courses = await getCourses(); - const activeCourses = Object.keys(courses).filter(slug => courses[slug].meta_info.show_in_apply) + const activeCourses = Object.keys(courses).filter( + (slug) => courses[slug].meta_info.show_in_apply + ); let duplicateDescriptions = {}; walk(`${__dirname}/../data/plans/`, async function (err, files) { @@ -21,14 +18,14 @@ async function generate(){ let langs = {}; let slugs = {}; - for(let _path of _files){ + for (let _path of _files) { const doc = loadYML(_path); const raw = doc && doc.raw_content; if (doc.lang != "us") continue; // ignore inactive courses - if(!activeCourses.includes(doc.name)){ - console.log(`Ignored course ${doc.name}`) + if (!activeCourses.includes(doc.name)) { + console.log(`Ignored plans for course ${doc.name} because course.meta_info.show_in_apply=False`); continue; } if (!raw) { @@ -36,6 +33,7 @@ async function generate(){ continue; // Continue to the next file if YAML content is invalid } + console.log(`Generating prompt for course plans ${doc.name}`); const answer = await complete({ max_tokens, system: `You are like a senior prompt engineer with deep coding knowledge, very familiar with the YML, CSV and JSON syntax.`, @@ -47,19 +45,19 @@ Ignore the following properties: icons, slug and "recommended". Do not include any information about these instructions in your answer. Include the word "stop" at the end of your answer. Be concise, don't add a summary at the end of the article. -Don't take more than ${(max_tokens*2)} characters. +Don't take more than ${max_tokens * 2} characters. For example: - Scholarship for part-time courses. Pay today or in 3 parts. Price: $6999 - Income Share Agreement for full-time couses. Pay after you get a job. Price: $0 -Here is the YML: ${raw}` +Here is the YML: ${raw}`, }); - if(!answer) fail(`Error building prompt for payment plans`); - fs.writeFileSync(`./prompts/plan-${doc.name}.prompt`, answer, 'utf8'); + if (!answer) fail(`Error building prompt for payment plans`); + fs.writeFileSync(`./prompts/plan-${doc.name}.prompt`, answer, "utf8"); + console.log(`Finshed generating prompt for course plans ${doc.name}`); } success("Finished generating prompts"); }); - } -generate() \ No newline at end of file +generate(); diff --git a/src/prompt/prompt.projects.js b/src/prompt/prompt.projects.js index ee1b55d19..c283f1feb 100644 --- a/src/prompt/prompt.projects.js +++ b/src/prompt/prompt.projects.js @@ -1,14 +1,13 @@ -const fs = require('fs'); -const { - toYML, - loadYML -} = require("../test/_utils"); +const fs = require("fs"); +const { toYML, loadYML } = require("../test/_utils"); -async function generate(){ +async function generate() { const max_tokens = 400; - console.log(`Starting to generate a prompt for all the academy awards`) + console.log(`Starting to generate a prompt for all the academy awards`); - const doc = loadYML(`${__dirname}/../data/components/alumni_projects/alumni_projects.us.yaml`); + const doc = loadYML( + `${__dirname}/../data/components/alumni_projects/alumni_projects.us.yaml` + ); let projects = doc.yaml.projects.map((old) => { let _new = [ `Project name: ${old.project_name}`, @@ -16,16 +15,23 @@ async function generate(){ `Video demonstration: ${old.project_video}`, `Github URL: ${old.github_repo}`, `Live URL: ${old.live_link}`, - `Buit by: ${old.alumni.map(a => `${a.first_name} ${a.last_name}`).join(' and ')} during the ${old.course} bootcamp`, - ] + `Buit by: ${old.alumni + .map((a) => `${a.first_name} ${a.last_name}`) + .join(" and ")} during the ${old.course} bootcamp`, + ]; // if(old.linkedin_url) _new.push(`LinkedIn profile URL: ${old.linkedin_url}`); return _new.join("\n"); - }) - - fs.writeFileSync(`./prompts/projects.prompt`, [ - `The following are capstone projects built by our students during our bootcamps:`,projects.join("\n\n---\n\n"), - `` - ].join("\n\n"), 'utf8'); - console.log(`Finished generating awards.`) + }); + + fs.writeFileSync( + `./prompts/projects.prompt`, + [ + `The following are capstone projects built by our students during our bootcamps:`, + projects.join("\n\n---\n\n"), + ``, + ].join("\n\n"), + "utf8" + ); + console.log(`Finished generating awards.`); } -generate() \ No newline at end of file +generate(); diff --git a/src/prompt/prompt.students.js b/src/prompt/prompt.students.js index cc7909cc2..20981858e 100644 --- a/src/prompt/prompt.students.js +++ b/src/prompt/prompt.students.js @@ -1,40 +1,64 @@ -const fs = require('fs'); -const { - toYML, - loadYML -} = require("../test/_utils"); +const fs = require("fs"); +const { toYML, loadYML } = require("../test/_utils"); -async function generate(){ +async function generate() { const max_tokens = 400; - console.log(`Starting to generate a prompt for all the academy campus and descriptions`) + console.log( + `Starting to generate a prompt for all the academy campus and descriptions` + ); - const doc = loadYML(`${__dirname}/../data/components/testimonials/testimonials.us.yaml`); + const doc = loadYML( + `${__dirname}/../data/components/testimonials/testimonials.us.yaml` + ); let testimonials = doc.yaml.testimonials.map((old) => { - let _new = [ - `Name: ${old.student_name}`, - `Hired as ${old.short_content}` - ] - if(old.linkedin_url) _new.push(`LinkedIn profile URL: ${old.linkedin_url}`); - if(old.country) _new.push(`Studied in the ${old.country.name} campus`); - if(old.student_video) _new.push(`Video testimonial: ${old.student_video}`); - if(old.content) _new.push(`Written testimonial: ${old.content}`.replace(/(\r\n|\n|\r)/gm, "")); + let _new = [`Name: ${old.student_name}`, `Hired as ${old.short_content}`]; + if (old.linkedin_url) + _new.push(`LinkedIn profile URL: ${old.linkedin_url}`); + if (old.country) _new.push(`Studied in the ${old.country.name} campus`); + if (old.student_video) _new.push(`Video testimonial: ${old.student_video}`); + if (old.content) + _new.push( + `Written testimonial: ${old.content}`.replace(/(\r\n|\n|\r)/gm, "") + ); return _new.join("\n"); }); - - const doc2 = loadYML(`${__dirname}/../data/components/alumni_projects/alumni_projects.us.yaml`); - let alumni_form_projects = doc2.yaml.projects.reduce((prev, current) => prev.concat(...current.alumni.map(al => ({ ...al, student_video: current.project_video }))), []).map(old => { - let _new = [ - `Name: ${old.first_name} ${old.last_name}`, - `Became a ${old.job_title} after the bootcamp` - ]; - if(old.linkedin && old.linkedin != "") _new.push(`LinkedIn profile URL: ${old.linkedin}`); - if(old.github && old.github != "") _new.push(`Github profile URL: ${old.github}`); - if(old.twitter && old.twitter != "") _new.push(`Twitter profile URL: ${old.twitter}`); - if(old.student_video && old.student_video != "") _new.push(`Video testimonial: ${old.student_video}`); - return _new.join("\n"); - }) - fs.writeFileSync(`./prompts/students.prompt`, `The following are 4Geeks Academy students:\n`+testimonials.concat(alumni_form_projects).join("\n\n---\n\n"), 'utf8'); - console.log(`Finished generating testimonials.`) + const doc2 = loadYML( + `${__dirname}/../data/components/alumni_projects/alumni_projects.us.yaml` + ); + let alumni_form_projects = doc2.yaml.projects + .reduce( + (prev, current) => + prev.concat( + ...current.alumni.map((al) => ({ + ...al, + student_video: current.project_video, + })) + ), + [] + ) + .map((old) => { + let _new = [ + `Name: ${old.first_name} ${old.last_name}`, + `Became a ${old.job_title} after the bootcamp`, + ]; + if (old.linkedin && old.linkedin != "") + _new.push(`LinkedIn profile URL: ${old.linkedin}`); + if (old.github && old.github != "") + _new.push(`Github profile URL: ${old.github}`); + if (old.twitter && old.twitter != "") + _new.push(`Twitter profile URL: ${old.twitter}`); + if (old.student_video && old.student_video != "") + _new.push(`Video testimonial: ${old.student_video}`); + return _new.join("\n"); + }); + + fs.writeFileSync( + `./prompts/students.prompt`, + `The following are 4Geeks Academy students:\n` + + testimonials.concat(alumni_form_projects).join("\n\n---\n\n"), + "utf8" + ); + console.log(`Finished generating testimonials.`); } -generate() \ No newline at end of file +generate(); diff --git a/src/prompt/utils.js b/src/prompt/utils.js index a6c07be00..01b68ee3f 100644 --- a/src/prompt/utils.js +++ b/src/prompt/utils.js @@ -1,101 +1,100 @@ const axios = require("axios"); -const dotenv = require('dotenv'); +const dotenv = require("dotenv"); dotenv.config(); -const { - walk, - loadYML, - fail, -} = require("../test/_utils"); +const { walk, loadYML, fail } = require("../test/_utils"); // Define the function to call the OpenAI API with an authorization token async function complete({ system, user, model, max_tokens }) { try { // Define the OpenAI API endpoint URL // gpt-3.5-turbo-16k, gpt-3.5-turbo-instruct - if(model == undefined) model = "gpt-3.5-turbo-16k"; - const is_chat = !model.includes('instruct'); + if (model == undefined) model = "gpt-3.5-turbo-16k"; + const is_chat = !model.includes("instruct"); + + let apiUrl = "https://api.openai.com/v1/completions"; + if (is_chat) apiUrl = "https://api.openai.com/v1/chat/completions"; - let apiUrl = 'https://api.openai.com/v1/completions'; - if(is_chat) apiUrl = 'https://api.openai.com/v1/chat/completions'; - // Define the headers with the authorization token const headers = { Authorization: `Bearer ${process.env.GATSBY_OPENAI_KEY}`, // Include the OpenAI token in the "Bearer" format - 'Content-Type': 'application/json', // Set the content type + "Content-Type": "application/json", // Set the content type }; - + // Define the data to send to the OpenAI API - + let requestData = { model, max_tokens, // Set the maximum number of tokens in the response as needed }; - if(is_chat){ + if (is_chat) { requestData.messages = [ { role: "system", - content: system + content: system, }, { role: "user", - content: user - } + content: user, + }, ]; - }else{ - requestData.prompt = `${system} \n ${user}` + } else { + requestData.prompt = `${system} \n ${user}`; } - + // Make an API request to the OpenAI API const response = await axios.post(apiUrl, requestData, { headers }); - + // Process the OpenAI API response here - const interpretedContent = is_chat ? response.data.choices[0].message.content : response.data.choices[0].text; // Extract interpreted content - + const interpretedContent = is_chat + ? response.data.choices[0].message.content + : response.data.choices[0].text; // Extract interpreted content + // Return the interpreted content return interpretedContent; } catch (error) { - console.error('OpenAI API Request Error:', error.toString()); + console.error("OpenAI API Request Error:", error.toString()); } } -const getCourses = () => new Promise((resolve, reject) => { - var courses = {}; - walk(`${__dirname}/../data/course`, function (err, files) { - if (err) fail("Error reding the YML files: ", err); - const _files = files.filter( - (f) => f.indexOf(".yml") > 1 || f.indexOf(".yaml") > 1 - ); +const getCourses = () => + new Promise((resolve, reject) => { + var courses = {}; + walk(`${__dirname}/../data/course`, function (err, files) { + if (err) fail("Error reding the YML files: ", err); + const _files = files.filter( + (f) => f.indexOf(".yml") > 1 || f.indexOf(".yaml") > 1 + ); - for(let _path of _files){ - const doc = loadYML(_path); - //only english - if (doc.lang == "us"){ - courses[doc.name] = { ...doc.yaml, raw: doc.raw }; + for (let _path of _files) { + const doc = loadYML(_path); + //only english + if (doc.lang == "us") { + courses[doc.name] = { ...doc.yaml, raw: doc.raw }; + } } - } - resolve(courses); + resolve(courses); + }); }); -}); -const getLocations = () => new Promise((resolve, reject) => { - let locations = {} - walk(`${__dirname}/../data/location`, async function (err, files) { - if (err) fail("Error reding the YML files: ", err); - const _files = files.filter( - (f) => f.indexOf(".yml") > 1 || f.indexOf(".yaml") > 1 - ); - - for(let _path of _files){ - const doc = loadYML(_path); - //only english - if (doc.lang != "us") continue; - if (['europe', 'online'].includes(doc.name)) continue; - locations[doc.name] = { ...doc.yaml, raw: doc.raw }; +const getLocations = () => + new Promise((resolve, reject) => { + let locations = {}; + walk(`${__dirname}/../data/location`, async function (err, files) { + if (err) fail("Error reding the YML files: ", err); + const _files = files.filter( + (f) => f.indexOf(".yml") > 1 || f.indexOf(".yaml") > 1 + ); - } - resolve(locations) + for (let _path of _files) { + const doc = loadYML(_path); + //only english + if (doc.lang != "us") continue; + if (["europe", "online"].includes(doc.name)) continue; + locations[doc.name] = { ...doc.yaml, raw: doc.raw }; + } + resolve(locations); + }); }); -}); -module.exports = { complete, getLocations, getCourses } \ No newline at end of file +module.exports = { complete, getLocations, getCourses }; diff --git a/src/templates/landing_a.js b/src/templates/landing_a.js index 8e1278982..c6dc1e7ae 100644 --- a/src/templates/landing_a.js +++ b/src/templates/landing_a.js @@ -295,10 +295,7 @@ const Landing = (props) => { ); }; export const query = graphql` - query LandingAQuery( - $file_name: String! - $lang: String! - ) { + query LandingAQuery($file_name: String!, $lang: String!) { allPageYaml( filter: { fields: { file_name: { regex: "/geekpal/" }, lang: { eq: $lang } } diff --git a/src/test/_utils.js b/src/test/_utils.js index 18fd9e5d9..09b0b5ca1 100644 --- a/src/test/_utils.js +++ b/src/test/_utils.js @@ -71,7 +71,7 @@ const walk = function (dir, done) { const toYML = (obj) => { return jsyaml.dump(obj); -} +}; const loadYML = (pathToFile) => { const content = fs.readFileSync(pathToFile, "utf8"); try { From d5af38f0a76eead3c47a6eaf99bf221bcf27ac88 Mon Sep 17 00:00:00 2001 From: Riciglianomarcelo <46798276+Riciglianomarcelo@users.noreply.github.com> Date: Fri, 20 Oct 2023 10:12:55 -0400 Subject: [PATCH 08/10] Update no-excuses.us.yml Fix misspels and added a florida touch. --- src/data/landing/no-excuses.us.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/landing/no-excuses.us.yml b/src/data/landing/no-excuses.us.yml index bb727d5c6..972fe8f16 100644 --- a/src/data/landing/no-excuses.us.yml +++ b/src/data/landing/no-excuses.us.yml @@ -27,7 +27,7 @@ form: # always the first_name, email and phone will be mandatory if added. fields: ["full_name", "phone", "email"] heading: "Join our award-winning Coding Program" - motivation: "Fill out the form and get the scholarship towards your tuition at 4Geeks. Only 85 seats remain available." + motivation: "Fill out the form and get a Scholarship to reduce your tuition at 4Geeks. A few seats remain available." button_label: Get more info Now redirect: null #you can redirect to another url or entirely diffrent website @@ -39,7 +39,7 @@ apply_schollarship: # form that is displayed at the end of the landing # jumbotron on the top (cannot be commented out) header_data: background: "#FFF1D1" - tagline: No Excuses. Boost your career. Money is what you’ll make! + tagline: No Excuses. The Go-to Coding Bootcamp in Florida. badge: "../../../static/images/badges/Course-Report-Badge-2023.png" image_filter: brightness(0.3) @@ -50,9 +50,9 @@ features: styles: '{ "fontSize": "20px", "margin": "10px 0px 10px 0px" }' text: With our expertise and your hard work, you'll be a professional developer in just 18 weeks! bullets: - - Scholarships available. Award winning Bootcamp at the Best pricing - - Unlimited Mentorship and senior support FOREVER - - 84% placement rate + - Money is not excuse. Best pricing (ask for scholarships) + - Unlimited Mentorship and lifetime access to career services + - Award winning Florida Bootcamp (Miami, Orlando, Boca, and online!) - Job placement rate of 81% - "Part-time: it’s immersive but with a flexible schedule" From 1e5557d5b46b115cbba99ece857d8b21b3c694aa Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Fri, 20 Oct 2023 15:16:24 -0400 Subject: [PATCH 09/10] Update madrid-curso-de-programacion.es.yml --- src/data/landing/madrid-curso-de-programacion.es.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/landing/madrid-curso-de-programacion.es.yml b/src/data/landing/madrid-curso-de-programacion.es.yml index 10ff1d07b..34366fa69 100644 --- a/src/data/landing/madrid-curso-de-programacion.es.yml +++ b/src/data/landing/madrid-curso-de-programacion.es.yml @@ -9,7 +9,7 @@ meta_info: template: "landing_a" # <--- choose your landing template redirects: # <--- URL redirections to avoid 404 errors - ["/landing/coding-course"] + ["/landing/coding-course", "/es/landing/curso-de-programacion"] # Set a particular course or location to the landing page # this UTM fields will be also included in the CRM contact From 633d8e5bfae0de696bb17a0f3db05226f5557045 Mon Sep 17 00:00:00 2001 From: Gustavo L Date: Fri, 20 Oct 2023 21:29:09 +0000 Subject: [PATCH 10/10] =?UTF-8?q?a=C3=B1adida=20seccion=20two-columns-=20c?= =?UTF-8?q?on=20videos=20a=20landings=20curso=20de=20programacion=20mexico?= =?UTF-8?q?-costarica-madrid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../costa-rica-curso-de-programacion.es.yml | 26 ++++++++++++++++- .../madrid-curso-de-programacion.es.yml | 27 ++++++++++++++++-- .../landing/mexico-curso-programacion.es.yml | 25 +++++++++++++++- .../images/testimonials/samantha-review.png | Bin 0 -> 87820 bytes 4 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 static/images/testimonials/samantha-review.png diff --git a/src/data/landing/costa-rica-curso-de-programacion.es.yml b/src/data/landing/costa-rica-curso-de-programacion.es.yml index 7e8620cb0..44584b998 100644 --- a/src/data/landing/costa-rica-curso-de-programacion.es.yml +++ b/src/data/landing/costa-rica-curso-de-programacion.es.yml @@ -91,6 +91,29 @@ follow_bar: # ⬇ FROM HERE ON YOU CAN COMMENT ANYTHING TO HIDE IT ON THE LANDING ⬇ # components: + - name: some_id + position: 3 + layout: two_column_right + background: "lightBlue2" + image: + style: '{ "border" : "3px solid black" }' + shadow: true + src: "../../../static/images/testimonials/Mattia-Tozzi-testimonial.jpg" + video: "B01-eTfgqqc" + heading: + text: "El viaje de Mattia Tozzi en 4geeks Academy y como cambió su vida profesional." + #xl lg md sm xs + font_size: ["40px", "34px", "34px", "25px", "20px"] + content: + text: "Conoce la historia inspiradora de Mattia Tozzi, quien, buscando un cambio en su carrera, se unió a 4Geeks Academy. Su experiencia demuestra cómo la dedicación y el aprendizaje en este bootcamp lo llevaron a convertirse en un profesional altamente capacitado." + font_size: ["16px"] + button: + text: "Unete a la academia!" + path: "#bottom" + color: "white" + background: "black" + hover: "lightBlue" + - name: top_coding_bootcamp position: 1 layout: two_column_left @@ -128,7 +151,7 @@ rating_reviews: url: "" badges: - position: 3 + position: 7 heading: "4Geeks Academy cuenta con premios y reconocimientos que validan su excelencia" program_details: @@ -148,3 +171,4 @@ who_is_hiring: heading: "¿Quién contrata a nuestros alumnos?" sub_heading: "84% de nuestros estudiantes que completaron el proceso de GeekFORCE han conseguido trabajo luego de haberse graduado (incluso dentro de los sigiuientes 100 días)" + diff --git a/src/data/landing/madrid-curso-de-programacion.es.yml b/src/data/landing/madrid-curso-de-programacion.es.yml index 10ff1d07b..5e3e47dfc 100644 --- a/src/data/landing/madrid-curso-de-programacion.es.yml +++ b/src/data/landing/madrid-curso-de-programacion.es.yml @@ -127,12 +127,12 @@ geeks_vs_others: total_rows: 5 why_4geeks: - position: 5 + position: 6 heading: "¿Por qué debes estudiar en 4Geeks Academy?" sub_heading: " " who_is_hiring: - position: 6 + position: 7 limit: 4 heading: "Empresas que contratan a nuestros estudiantes" sub_heading: "Más de 500 partners y más de 150 vacantes abiertas como Full-Stack Developer" @@ -143,6 +143,29 @@ who_is_hiring: # sub_heading: "Take a look at our previous student projects" components: + - name: some_id + position: 5 + layout: two_column_right + background: "lightYellow" + image: + style: '{ "border" : "3px solid black" }' + shadow: true + src: "../../../static/images/testimonials/Mattia-Tozzi-testimonial.jpg" + video: "B01-eTfgqqc" + heading: + text: "El viaje de Mattia Tozzi en 4geeks Academy y como cambió su vida profesional." + #xl lg md sm xs + font_size: ["40px", "34px", "34px", "25px", "20px"] + content: + text: "Descubre la historia de Mattia Tozzi, quien decidió unirse a 4Geeks Academy en busca de un cambio en su carrera profesional. Su experiencia demuestra cómo la dedicación y el aprendizaje en este bootcamp lo llevaron a convertirse en un profesional altamente capacitado en España." + font_size: ["16px"] + button: + text: "Unete a la academia!" + path: "#bottom" + color: "white" + background: "black" + hover: "lightBlue" + - name: python_y_javascript position: 1 layout: two_column_right diff --git a/src/data/landing/mexico-curso-programacion.es.yml b/src/data/landing/mexico-curso-programacion.es.yml index 7e184cd52..142c0165d 100644 --- a/src/data/landing/mexico-curso-programacion.es.yml +++ b/src/data/landing/mexico-curso-programacion.es.yml @@ -92,7 +92,7 @@ follow_bar: # rating_reviews: - position: 2 + position: 3 heading: "Lee acerca de nosotros" rating_list: - alt: "Career Karma" @@ -139,3 +139,26 @@ who_is_hiring: heading: "¿Quién contrata a nuestros alumnos?" sub_heading: "84% de nuestros estudiantes que completaron el proceso de GeekFORCE han conseguido trabajo luego de haberse graduado (incluso dentro de los sigiuientes 100 días)" +components: + - name: some_id + position: 2 + layout: two_column_right + background: "lightBlue2" + image: + style: '{ "border" : "3px solid black" }' + # shadow: true + src: "../../../static/images/testimonials/samantha-review.png" + video: "https://www.youtube.com/watch?v=32a-phct9I0" + heading: + text: "4Geeks en México La Elección de Samantha para su Bootcamp Ideal" + #xl lg md sm xs + font_size: ["40px", "34px", "34px", "25px", "20px"] + content: + text: "La excelencia en el contenido del curso, la dedicada mentoría individual y las sólidas colaboraciones industriales son solo algunos de los aspectos que destacan a 4Geeks. Además, el historial de éxito de los graduados respalda la reputación de la institución." + font_size: ["16px"] + button: + text: "Unete a la academia!" + path: "https://4geeksacademy.com/us/coding-campus/coding-bootcamp-mexico" + color: "white" + background: "black" + hover: "lightBlue" \ No newline at end of file diff --git a/static/images/testimonials/samantha-review.png b/static/images/testimonials/samantha-review.png new file mode 100644 index 0000000000000000000000000000000000000000..572619aaa989f2521703b6a01bc9bae68f61f036 GIT binary patch literal 87820 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 z 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

`2M-{xo+xU^!MW89xYWtiR-UJ$eQ*;-)yZI3# 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

U$Z7pfh4UQdW&E>IVF}6%b${*xx zP1s6Xq&588s_)3L5rb`K_nNJ;w%KW`=gHg}xIMq}TtOtdcf$rFAg7H;(pY0`o#j9i zvU))~aZ3p{n+n!GTC8nM3fPcxB+*F%ZA(j0&~|SdGLuvOU-OV-*%~D^KZczx=6JC0HVmj8&UxYt^;rc}O`M8xO&@Xs}_8o*%&;c2j1n zU(7bjiCi}}^DCRUJ^j{U(?=HCGCMdrOz3KVr(H;9w7sXs4QOmPOvakQcKv$N7OZ^$ z6A{}bV<*GNG&j+v