<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Oleksandr Korneiko</title>
    <description>The latest articles on DEV Community by Oleksandr Korneiko (@oleks).</description>
    <link>https://dev.to/oleks</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1337832%2F42b65ff4-d47c-4f58-834b-36bf4be963e8.jpeg</url>
      <title>DEV Community: Oleksandr Korneiko</title>
      <link>https://dev.to/oleks</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oleks"/>
    <language>en</language>
    <item>
      <title>Glam Up My Markup: Beaches - with new shiny CSS features</title>
      <dc:creator>Oleksandr Korneiko</dc:creator>
      <pubDate>Sat, 01 Jun 2024 11:14:39 +0000</pubDate>
      <link>https://dev.to/oleks/glam-up-my-markup-beaches-with-new-shiny-css-features-1di9</link>
      <guid>https://dev.to/oleks/glam-up-my-markup-beaches-with-new-shiny-css-features-1di9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for [Frontend Challenge v24.04.17]((&lt;a href="https://dev.to/challenges/frontend-2024-05-29"&gt;https://dev.to/challenges/frontend-2024-05-29&lt;/a&gt;), Glam Up My Markup: Beaches&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Take me to the beach with CSS/JS/HTML.&lt;br&gt;
As the markup challenge prompt stated - no markup was changed except for adding a link to CSS and a script tag in the head. With styles, animations, and some JS for adding images and a dialog window - the page becomes more fun and interactive.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/samvimes01" rel="noopener noreferrer"&gt;
        samvimes01
      &lt;/a&gt; / &lt;a href="https://github.com/samvimes01/markup-css-js" rel="noopener noreferrer"&gt;
        markup-css-js
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      For the challenge https://dev.to/challenges/frontend-2024-05-29
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Simple static page&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Made for a &lt;a href="https://dev.to/challenges/frontend-2024-05-29" rel="nofollow"&gt;dev.to challenge&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I have used CSS and JavaScript to make the starter HTML markup beautiful, interactive, and useful
The template does not include photos, so to make it visually appealing, a simple JavaScript with css var trick was used.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Live&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://samvimes01.github.io/markup-css-js" rel="nofollow noopener noreferrer"&gt;Github pages&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tech used&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;MDN: new HTML and CSS features like &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog" rel="nofollow noopener noreferrer"&gt;dialog&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@import" rel="nofollow noopener noreferrer"&gt;css import&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting/Using_CSS_nesting" rel="nofollow noopener noreferrer"&gt;css nesting&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/image/image-set" rel="nofollow noopener noreferrer"&gt;image set&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/var" rel="nofollow noopener noreferrer"&gt;css var&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Interactive buttons: &lt;a href="https://cssbuttons.app/" rel="nofollow noopener noreferrer"&gt;cssbuttons.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cards: &lt;a href="https://neumorphism.io/" rel="nofollow noopener noreferrer"&gt;neumorphism.io&lt;/a&gt;, &lt;a href="https://hype4.academy/tools/glassmorphism-generator" rel="nofollow noopener noreferrer"&gt;glassmorphism&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Animations: &lt;a href="https://getwaves.io/" rel="nofollow noopener noreferrer"&gt;wave svg&lt;/a&gt; and some experiments with keyframes and pseudoelements&lt;/li&gt;
&lt;li&gt;Interactivity without changing HTML: used :after, :before pseudoelements, JavaScript and css var for adding and image&lt;/li&gt;
&lt;li&gt;Images: all images were generated with a special prompt where names of the beaches were included. &lt;a href="https://firefly.adobe.com/inspire/images" rel="nofollow noopener noreferrer"&gt;Adobe Firefly did all the magic&lt;/a&gt;. To descrease size a special resizing and converter script was used (created with the ChatGPT 4o help)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ImageMagick and the necessary codecs for…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/samvimes01/markup-css-js" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/wonderful-monad-jwkcng"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;I used some interesting stuff here. AI for image generation, converted images to new AVIF format, used many HTML/CSS features that were added/adopted recently (dialog, CSS vars, etc.). And I've never used animations so extensively as here (even though it's only a few transforms and keyframes)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MDN: new HTML and CSS features like &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog" rel="noopener noreferrer"&gt;dialog&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@import" rel="noopener noreferrer"&gt;css import&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting/Using_CSS_nesting" rel="noopener noreferrer"&gt;css nesting&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/image/image-set" rel="noopener noreferrer"&gt;image set&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/var" rel="noopener noreferrer"&gt;css var&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Interactive buttons: &lt;a href="https://cssbuttons.app/" rel="noopener noreferrer"&gt;cssbuttons.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cards: &lt;a href="https://neumorphism.io/" rel="noopener noreferrer"&gt;neumorphism.io&lt;/a&gt;, &lt;a href="https://hype4.academy/tools/glassmorphism-generator" rel="noopener noreferrer"&gt;glassmorphism&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Animations: &lt;a href="https://getwaves.io/" rel="noopener noreferrer"&gt;wave svg&lt;/a&gt; and some experiments with keyframes and pseudoelements&lt;/li&gt;
&lt;li&gt;Interactivity without changing HTML: used &lt;code&gt;::after&lt;/code&gt;, &lt;code&gt;::before&lt;/code&gt; pseudoelements, JavaScript and CSS var for adding an image&lt;/li&gt;
&lt;li&gt;Images: all images were generated with a special prompt where the names of the beaches were included. &lt;a href="https://firefly.adobe.com/inspire/images" rel="noopener noreferrer"&gt;Adobe Firefly did all the magic&lt;/a&gt;. To decrease size a special resizing and converter shell script was used (see readme on GitHub)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>A job seeker journal application built with AWS Amplify Gen 2</title>
      <dc:creator>Oleksandr Korneiko</dc:creator>
      <pubDate>Sat, 25 May 2024 15:00:43 +0000</pubDate>
      <link>https://dev.to/oleks/a-job-seeker-journal-application-built-with-aws-amplify-gen-2-ldh</link>
      <guid>https://dev.to/oleks/a-job-seeker-journal-application-built-with-aws-amplify-gen-2-ldh</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aws"&gt;The AWS Amplify Fullstack TypeScript Challenge &lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I am excited to present you with a job seeker journal application. The app helps users keep track of the jobs they have applied for, and store different CVs and Cover letters connected with jobs.&lt;br&gt;
It leverages AWS Amplify authentication, data, file storage, serverless functions, the AWS Amplify UI React library, and AWS Bedrock with the Mistral:7B model to generate cover letter text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo and Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The code is available on my personal GitHub &lt;a href="https://github.com/samvimes01/amplify-job-search-diary"&gt;repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The repository is connected to the Amplify console. &lt;a href="https://main.d3sbabnt1mitvg.amplifyapp.com/"&gt;the example app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Demo gif&lt;/strong&gt;&lt;br&gt;
Too big for dev.to/cloudinary (also available on GitHub repo Readme page)&lt;br&gt;
&lt;a href="https://postimg.cc/LJPH3f4x"&gt;Gif&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo screenshot&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3znnjxaexm81ex7she2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3znnjxaexm81ex7she2r.png" alt="Add job page" width="800" height="847"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrations
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6drdwnxxarz4wtwxo61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6drdwnxxarz4wtwxo61.png" alt="AWS diagram" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The diagram above represents the technologies used in the challenge&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cognito:&lt;/strong&gt; Behind the scenes, Amplify creates a Cognito user pool to store all user information and manage authentication for this application. However one of the two Lambda functions uses an IAM authentication function to store some data in a database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AppSync:&lt;/strong&gt; Amplify creates an AppSync GraphQL API, enabling us to execute CRUD operations. The frontend app uses the generated client's model methods for get one, get many, create, update, and delete operations. One of the Lambda functions uses the generated client's &lt;code&gt;graphql&lt;/code&gt; method and autogenerated GraphQL functions for storing into the database extracted text from the file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DynamoDB:&lt;/strong&gt; The Data module in the Amplify project, AppSync uses DynamoDB as the database to persist all information in this NoSQL database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Serverless functions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Lambda Function:&lt;/strong&gt; I used the function module in Amplify to trigger extracting text from the uploaded file. The second function is triggered when the user clicks the "Generate Cover Letter" button. It uses the provided data and a special prompt and utilizes AWS Bedrock and the Mistral:7B model to generate a cover letter.&lt;/p&gt;

&lt;h3&gt;
  
  
  File storage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;S3 Bucket:&lt;/strong&gt; I used an S3 bucket to store Curriculum Vitae files. At the moment, only &lt;code&gt;.docx&lt;/code&gt; files are allowed since the third-party library for parsing PDFs fails to do so on Lambda runtime while working fine on a local machine (seems like a CommonJS to ESM issue, or Worker API issue).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connected Components and/or Feature Full&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I created a &lt;strong&gt;feature-full&lt;/strong&gt; app utilizing authentication, data, storage, and functions. Additionally, AWS Bedrock AI is used as an extra feature within one of the functions.&lt;/p&gt;

&lt;p&gt;The repository was initiated with the AWS Amplify Gen 2 React Vite template. I used &lt;strong&gt;Connected Components&lt;/strong&gt; such as &lt;code&gt;Authenticator&lt;/code&gt; and &lt;code&gt;AccountSettings.ChangePassword&lt;/code&gt;. I also utilized many other UI components, including &lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;Flex&lt;/code&gt;, &lt;code&gt;Input&lt;/code&gt;, &lt;code&gt;Label&lt;/code&gt;, &lt;code&gt;Alert&lt;/code&gt;, &lt;code&gt;View&lt;/code&gt;, &lt;code&gt;Link&lt;/code&gt;, &lt;code&gt;Table&lt;/code&gt;, &lt;code&gt;TableBody&lt;/code&gt;, &lt;code&gt;TableCell&lt;/code&gt;, &lt;code&gt;TableHead&lt;/code&gt;, &lt;code&gt;TableRow&lt;/code&gt;, &lt;code&gt;Text&lt;/code&gt;, &lt;code&gt;Heading&lt;/code&gt;, &lt;code&gt;Grid&lt;/code&gt;, &lt;code&gt;Icon&lt;/code&gt;, &lt;code&gt;Radio&lt;/code&gt;, &lt;code&gt;RadioGroupField&lt;/code&gt;, and &lt;code&gt;TextAreaField&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I also decided to use the @mui library for 2 components to expedite development: a &lt;code&gt;NavBar&lt;/code&gt; (just copypasted from mui docs) and a &lt;code&gt;SnackBar&lt;/code&gt; toast component to improve UX (popup toast after an item is created/updated/deleted or if an error occurs).&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I used to work with Azure and Google Cloud, but never with AWS services. I was surprised by how effortless it is to build a full-stack app on AWS Amplify. However, the Amplify Gen 2 documentation wasn't sufficient for me. I had to use DynamoDB, AppSync, and Amplify Gen 1 docs to figure out some things. Still, I was able to build a full-stack app with authentication, S3, data, and even AI in less than 5 days. Nice experience.&lt;/p&gt;

&lt;p&gt;The price is fair enough. I spent USD 0.63 for 12 deployments.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>awschallenge</category>
      <category>amplify</category>
      <category>fullstack</category>
    </item>
  </channel>
</rss>
