From 6983e75bd56072c66345a5157a638ad8d4171ca7 Mon Sep 17 00:00:00 2001 From: vratskyi Date: Fri, 1 Mar 2024 20:04:47 +0200 Subject: [PATCH] Project adapter build settings does not consider nested paths #7 (switch to netlify) --- .../ssr/_noop-middleware.mjs | 3 + .../ssr/chunks/404_Dqd0jA1i.mjs | 5 + .../ssr/chunks/404_pJCF1EDP.mjs | 5 + .../ssr/chunks/_.._BsGwjlhD.mjs | 5 + .../ssr/chunks/_.._Cns5EZez.mjs | 5 + .../about-experience-in-web-dev_BgD_3N37.mjs | 9 + .../about-experience-in-web-dev_C6xuZLye.mjs | 25 + .../about-experience-in-web-dev_CBnrDakG.mjs | 124 + .../about-experience-in-web-dev_CKEJMMZQ.mjs | 25 + .../about-experience-in-web-dev_CW0YI6Rb.mjs | 9 + .../about-experience-in-web-dev_D4mxxtjJ.mjs | 124 + .../ssr/chunks/about_BaPuutao.mjs | 5 + .../ssr/chunks/about_CuR22hxo.mjs | 5 + .../chunks/astro/assets-service_B85IQn9G.mjs | 342 +++ .../ssr/chunks/astro_U7cLjtnz.mjs | 2164 +++++++++++++++++ .../become-cool-frontend-dev_5IlRX2qD.mjs | 25 + .../become-cool-frontend-dev_CLj1VjFp.mjs | 25 + .../become-cool-frontend-dev_CeoOBHg_.mjs | 9 + .../become-cool-frontend-dev_CoszH-iC.mjs | 226 ++ .../become-cool-frontend-dev_DSYfhzBg.mjs | 226 ++ .../become-cool-frontend-dev_XHdtL4Mj.mjs | 9 + .../cool-plugins-for-vs-code_BFYbPr9e.mjs | 9 + .../cool-plugins-for-vs-code_BLwiMiVs.mjs | 139 ++ .../cool-plugins-for-vs-code_CF6JBJkR.mjs | 139 ++ .../cool-plugins-for-vs-code_DKiFBJW5.mjs | 25 + .../cool-plugins-for-vs-code_DXKArvvn.mjs | 25 + .../cool-plugins-for-vs-code_Hk47S3fA.mjs | 9 + .../ssr/chunks/generic_D_JKLwzW.mjs | 5 + .../ssr/chunks/index_BIoOX2kt.mjs | 5 + .../ssr/chunks/index_BqNdUiWy.mjs | 5 + .../ssr/chunks/index_CZPCzNFA.mjs | 5 + .../ssr/chunks/index_DToyGfqd.mjs | 5 + .../ssr/chunks/index_NByEDO2x.mjs | 5 + .../ssr/chunks/index_dw6RaE6b.mjs | 5 + .../ssr/chunks/pages/generic_CKoPNF1-.mjs | 1057 ++++++++ .../ssr/chunks/portfolio_7D8uYWzQ.mjs | 5 + .../ssr/chunks/portfolio_xErXodJ1.mjs | 5 + .../ssr/chunks/prerender_CW_rJxYZ.mjs | 15 + .../chunks/ui-kit-for-tailwind_B0MLHccf.mjs | 9 + .../chunks/ui-kit-for-tailwind_Be3bTW72.mjs | 25 + .../chunks/ui-kit-for-tailwind_BfTHigj9.mjs | 9 + .../chunks/ui-kit-for-tailwind_Bfbcl2ec.mjs | 237 ++ .../chunks/ui-kit-for-tailwind_DL6qUlsy.mjs | 25 + .../chunks/ui-kit-for-tailwind_DZV9kgqf.mjs | 237 ++ ...t-happened-in-a-month-my-blog_1oxtsqXO.mjs | 175 ++ ...t-happened-in-a-month-my-blog_BbqGH-bj.mjs | 25 + ...t-happened-in-a-month-my-blog_CIHhEC1D.mjs | 25 + ...t-happened-in-a-month-my-blog_CLO_kMs-.mjs | 9 + ...t-happened-in-a-month-my-blog_czQ9-DLA.mjs | 9 + ...t-happened-in-a-month-my-blog_rihfM-cT.mjs | 175 ++ .netlify/functions-internal/ssr/entry.mjs | 54 + .../ssr/manifest_CRGkTayg.mjs | 83 + .netlify/functions-internal/ssr/renderers.mjs | 46 + astro.config.mjs | 2 +- 54 files changed, 5982 insertions(+), 1 deletion(-) create mode 100644 .netlify/functions-internal/ssr/_noop-middleware.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/404_Dqd0jA1i.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/404_pJCF1EDP.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/_.._BsGwjlhD.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/_.._Cns5EZez.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_BgD_3N37.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_C6xuZLye.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CBnrDakG.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CKEJMMZQ.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CW0YI6Rb.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_D4mxxtjJ.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/about_BaPuutao.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/about_CuR22hxo.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/astro/assets-service_B85IQn9G.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/astro_U7cLjtnz.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_5IlRX2qD.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CLj1VjFp.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CeoOBHg_.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CoszH-iC.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_DSYfhzBg.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_XHdtL4Mj.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_BFYbPr9e.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_BLwiMiVs.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_CF6JBJkR.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_DKiFBJW5.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_DXKArvvn.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_Hk47S3fA.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/generic_D_JKLwzW.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/index_BIoOX2kt.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/index_BqNdUiWy.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/index_CZPCzNFA.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/index_DToyGfqd.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/index_NByEDO2x.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/index_dw6RaE6b.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/pages/generic_CKoPNF1-.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/portfolio_7D8uYWzQ.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/portfolio_xErXodJ1.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/prerender_CW_rJxYZ.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_B0MLHccf.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_Be3bTW72.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_BfTHigj9.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_Bfbcl2ec.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_DL6qUlsy.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_DZV9kgqf.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_1oxtsqXO.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_BbqGH-bj.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_CIHhEC1D.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_CLO_kMs-.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_czQ9-DLA.mjs create mode 100644 .netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_rihfM-cT.mjs create mode 100644 .netlify/functions-internal/ssr/entry.mjs create mode 100644 .netlify/functions-internal/ssr/manifest_CRGkTayg.mjs create mode 100644 .netlify/functions-internal/ssr/renderers.mjs diff --git a/.netlify/functions-internal/ssr/_noop-middleware.mjs b/.netlify/functions-internal/ssr/_noop-middleware.mjs new file mode 100644 index 0000000..84424b0 --- /dev/null +++ b/.netlify/functions-internal/ssr/_noop-middleware.mjs @@ -0,0 +1,3 @@ +const onRequest = (_, next) => next(); + +export { onRequest }; diff --git a/.netlify/functions-internal/ssr/chunks/404_Dqd0jA1i.mjs b/.netlify/functions-internal/ssr/chunks/404_Dqd0jA1i.mjs new file mode 100644 index 0000000..f4f28e1 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/404_Dqd0jA1i.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.e); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/404_pJCF1EDP.mjs b/.netlify/functions-internal/ssr/chunks/404_pJCF1EDP.mjs new file mode 100644 index 0000000..a553123 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/404_pJCF1EDP.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n._); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/_.._BsGwjlhD.mjs b/.netlify/functions-internal/ssr/chunks/_.._BsGwjlhD.mjs new file mode 100644 index 0000000..4cd2bf1 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/_.._BsGwjlhD.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.c); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/_.._Cns5EZez.mjs b/.netlify/functions-internal/ssr/chunks/_.._Cns5EZez.mjs new file mode 100644 index 0000000..53c6201 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/_.._Cns5EZez.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.h); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_BgD_3N37.mjs b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_BgD_3N37.mjs new file mode 100644 index 0000000..ef03c6c --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_BgD_3N37.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./about-experience-in-web-dev_CBnrDakG.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_C6xuZLye.mjs b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_C6xuZLye.mjs new file mode 100644 index 0000000..11f2dbd --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_C6xuZLye.mjs @@ -0,0 +1,25 @@ +const id = "en/about-experience-in-web-dev.mdx"; + const collection = "posts"; + const slug = "about-experience-in-web-dev"; + const body = "\r\nMy story..: During my childhood, I noticed that my father spent a lot of time working on the computer. He would occasionally take breaks to play games, such as S.T.A.L.K.E.R. and Crysis. I also enjoyed playing games and would often go to computer clubs with my friends. However, as time passed, our interests began to change. \r\n \r\n\r\nFinally, my father gave me my first computer, an Intel Core 2 Duo processor, and a GeForce 7800 GTX video card. It was cool to get acquainted with the computer and learn what I could do on it. Dealing with Windows XP was a separate pleasure 😂. \r\n\r\nAs I grew up, I entered the faculty of 'Computer Systems and Sets' where I learned about how a computer is built, machine code, Assembler, Pascal, Delphi, Photoshop, WEB, and websites.\r\nI wrote my first programs using Pascal and Delphi. I posted the source code of my Delphi programs on my [blog](https://freeexpa.wordpress.com/), which still works on WordPress.\r\n \r\n\r\nLater, I taught myself how to develop websites using a regular Windows Notepad as my first IDE. Eventually, I learned about Notepad++, Sublime, and even VS Code. \r\nI became interested in Linux and its distributions, including Ubuntu, and eventually fell in love with Arch Linux. \r\n \r\n\r\n## It was cool in college\r\nDuring college, I learned about CSS style sheets, HTML markup language, and web standards. At the time, layout floats were still popular, which made it a nightmare! I studied JavaScript, but found it difficult due to its syntax. I took a break from it and started learning Python. Python has a clear and concise syntax with a wide range of libraries. I wrote small programs with UI libraries for personal use.\r\n \r\n\r\nI was drawn to the web because I wanted to show the world what I can do and be useful. \r\nI studied WordPress and its plugins, as well as ACF, kernel optimization, server setup for WordPress, Apache deployment, and enabling gzip compression on a local server. \r\nI find these topics interesting and set goals to learn how they work and achieve results.\r\n \r\n\r\n## First job\r\nWhile growing up, I searched for a job and landed an internship at a company that specialized in WordPress website development. During my time there, I was responsible for managing website pages and communicating with backend developers. I found the experience to be very interesting and enjoyable, especially since I was being paid for it.\r\n \r\n\r\nThe company I worked for next developed business websites. They had over 100 sites written in HTML/CSS integrated into WordPress, but they were poorly optimized. My task was to optimize and integrate them correctly to ensure they functioned smoothly. After that, I worked as a freelancer. \r\n \r\n\r\n## I am freelancer\r\nI worked for myself after which I became a freelancer. For me, freelancing is like paradise because I have the freedom to choose my clients, set my own deadlines, and work on tasks from scratch. \r\nI don't have to deal with someone else's code base, which makes my work easier. It's hard to list all the benefits of freelancing, but it's safe to say that I enjoy it a lot. 😂\r\n \r\n\r\nOn Freelance, I developed several websites, which you can find in the portfolio section of my website. One of them was an online store for the brand Byshikat, a private sewing factory for women's shoes. \r\n\r\nNowadays I successfully completed the task, and the client is satisfied, especially considering that the store brought in over 1000% increase in sales compared to their Instagram store in the first month after launch.\r\n\r\n
\r\n\r\n\r\n \r\n\r\n## Our days\r\nNow I'm learning Astro Framework, by the way this site is written on this technology. I plan to practice more with JavaScript, and also to start learning React, in general, I've made up my mind about the stack, although I've come a long way to understand what I really like and what I want. Yes... a long way, but it will be even more interesting in the future.\r\n \r\n\r\nThank you for reading to the end, it motivates me to learn and try harder, I wish you a good day and a great mood, I'm on 😉\r\n \r\n\r\n> Mr.Robot is watching you. 🧐"; + const data = {isDraft:false,title:"About me and experience in web dev",description:"From childhood gaming to web development, I received my first computer, delved into Pascal, Delphi, and web tech. Evolved through jobs, freelancing, and now exploring Astro Framework. Exciting journey ahead! 🚀",image: + new Proxy({"src":"/_astro/experience.KAqr-zYG.jpg","width":1500,"height":857,"format":"jpg","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/experience.jpg"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/experience.jpg"; + } + + return target[name]; + } + }) + ,author:"Oleksii",tags:["myExperience"],categories:["stories"],publishDate:"6/01/2024",language:"en"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/about-experience-in-web-dev.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CBnrDakG.mjs b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CBnrDakG.mjs new file mode 100644 index 0000000..18e14ab --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CBnrDakG.mjs @@ -0,0 +1,124 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "about-experience-in-web-dev", + "author": "Oleksii", + "isDraft": false, + "title": "About me and experience in web dev", + "description": "From childhood gaming to web development, I received my first computer, delved into Pascal, Delphi, and web tech. Evolved through jobs, freelancing, and now exploring Astro Framework. Exciting journey ahead! \u{1F680}", + "image": "../images/experience.jpg", + "tags": ["myExperience"], + "categories": ["stories"], + "publishDate": "6/01/2024", + "language": "en" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "it-was-cool-in-college", + "text": "It was cool in college" + }, { + "depth": 2, + "slug": "first-job", + "text": "First job" + }, { + "depth": 2, + "slug": "i-am-freelancer", + "text": "I am freelancer" + }, { + "depth": 2, + "slug": "our-days", + "text": "Our days" + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + a: "a", + blockquote: "blockquote", + h2: "h2", + p: "p", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.p, { + children: "My story..: During my childhood, I noticed that my father spent a lot of time working on the computer. He would occasionally take breaks to play games, such as S.T.A.L.K.E.R. and Crysis. I also enjoyed playing games and would often go to computer clubs with my friends. However, as time passed, our interests began to change." + }), "\n", createVNode(_components.p, { + children: "Finally, my father gave me my first computer, an Intel Core 2 Duo processor, and a GeForce 7800 GTX video card. It was cool to get acquainted with the computer and learn what I could do on it. Dealing with Windows XP was a separate pleasure \u{1F602}." + }), "\n", createVNode(_components.p, { + children: ["As I grew up, I entered the faculty of \u2018Computer Systems and Sets\u2019 where I learned about how a computer is built, machine code, Assembler, Pascal, Delphi, Photoshop, WEB, and websites.\r\nI wrote my first programs using Pascal and Delphi. I posted the source code of my Delphi programs on my ", createVNode(_components.a, { + href: "https://freeexpa.wordpress.com/", + children: "blog" + }), ", which still works on WordPress."] + }), "\n", createVNode(_components.p, { + children: "Later, I taught myself how to develop websites using a regular Windows Notepad as my first IDE. Eventually, I learned about Notepad++, Sublime, and even VS Code.\r\nI became interested in Linux and its distributions, including Ubuntu, and eventually fell in love with Arch Linux." + }), "\n", createVNode(_components.h2, { + id: "it-was-cool-in-college", + children: "It was cool in college" + }), "\n", createVNode(_components.p, { + children: "During college, I learned about CSS style sheets, HTML markup language, and web standards. At the time, layout floats were still popular, which made it a nightmare! I studied JavaScript, but found it difficult due to its syntax. I took a break from it and started learning Python. Python has a clear and concise syntax with a wide range of libraries. I wrote small programs with UI libraries for personal use." + }), "\n", createVNode(_components.p, { + children: "I was drawn to the web because I wanted to show the world what I can do and be useful.\r\nI studied WordPress and its plugins, as well as ACF, kernel optimization, server setup for WordPress, Apache deployment, and enabling gzip compression on a local server.\r\nI find these topics interesting and set goals to learn how they work and achieve results." + }), "\n", createVNode(_components.h2, { + id: "first-job", + children: "First job" + }), "\n", createVNode(_components.p, { + children: "While growing up, I searched for a job and landed an internship at a company that specialized in WordPress website development. During my time there, I was responsible for managing website pages and communicating with backend developers. I found the experience to be very interesting and enjoyable, especially since I was being paid for it." + }), "\n", createVNode(_components.p, { + children: "The company I worked for next developed business websites. They had over 100 sites written in HTML/CSS integrated into WordPress, but they were poorly optimized. My task was to optimize and integrate them correctly to ensure they functioned smoothly. After that, I worked as a freelancer." + }), "\n", createVNode(_components.h2, { + id: "i-am-freelancer", + children: "I am freelancer" + }), "\n", createVNode(_components.p, { + children: "I worked for myself after which I became a freelancer. For me, freelancing is like paradise because I have the freedom to choose my clients, set my own deadlines, and work on tasks from scratch.\r\nI don\u2019t have to deal with someone else\u2019s code base, which makes my work easier. It\u2019s hard to list all the benefits of freelancing, but it\u2019s safe to say that I enjoy it a lot. \u{1F602}" + }), "\n", createVNode(_components.p, { + children: "On Freelance, I developed several websites, which you can find in the portfolio section of my website. One of them was an online store for the brand Byshikat, a private sewing factory for women\u2019s shoes." + }), "\n", createVNode(_components.p, { + children: "Nowadays I successfully completed the task, and the client is satisfied, especially considering that the store brought in over 1000% increase in sales compared to their Instagram store in the first month after launch." + }), "\n", createVNode("div", { + class: "horizontal-line" + }), "\n", createVNode("img", { + class: "mb-5 rounded-xl", + src: "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHlrcWNoM3h3a3J4ZXptcm83OGlrM2xvMHQyNTczbDF6OHo4NWljcSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/RPwrO4b46mOdy/giphy.gif", + width: "500px", + height: "300px" + }), "\n", createVNode(_components.h2, { + id: "our-days", + children: "Our days" + }), "\n", createVNode(_components.p, { + children: "Now I\u2019m learning Astro Framework, by the way this site is written on this technology. I plan to practice more with JavaScript, and also to start learning React, in general, I\u2019ve made up my mind about the stack, although I\u2019ve come a long way to understand what I really like and what I want. Yes\u2026 a long way, but it will be even more interesting in the future." + }), "\n", createVNode(_components.p, { + children: "Thank you for reading to the end, it motivates me to learn and try harder, I wish you a good day and a great mood, I\u2019m on \u{1F609}" + }), "\n", createVNode(_components.blockquote, { + children: ["\n", createVNode(_components.p, { + children: "Mr.Robot is watching you. \u{1F9D0}" + }), "\n"] + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/en/about-experience-in-web-dev.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/about-experience-in-web-dev.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/about-experience-in-web-dev.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CKEJMMZQ.mjs b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CKEJMMZQ.mjs new file mode 100644 index 0000000..d63c6e5 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CKEJMMZQ.mjs @@ -0,0 +1,25 @@ +const id = "ru/about-experience-in-web-dev.mdx"; + const collection = "posts"; + const slug = "about-experience-in-web"; + const body = "\r\nМоя история..: В детстве я заметил, что мой отец много времени проводит за компьютером. Время от времени он делал перерывы, чтобы поиграть в игры, такие как S.T.A.L.K.E.R. и Crysis. Мне тоже нравилось играть в игры, и я часто ходил в компьютерные клубы со своими друзьями. Однако со временем наши интересы стали меняться. \r\n\r\n\r\nНаконец отец подарил мне мой первый компьютер, процессор Intel Core 2 Duo и видеокарту GeForce 7800 GTX. Было здорово познакомиться с компьютером и узнать, что я могу на нем делать. Разбираться с Windows XP было отдельным удовольствием 😂. \r\n\r\nПовзрослев, я поступил на факультет \"Компьютерные системы и комплексы\", где узнал, как устроен компьютер, машинный код, Ассемблер, Паскаль, Delphi, Photoshop, WEB и сайты.\r\nСвои первые программы я написал на Pascal и Delphi. Исходный код своих программ на Delphi я размещал в своем [блоге](https://freeexpa.wordpress.com/), который до сих пор работает на WordPress.\r\n\r\n\r\nПозже я научился разрабатывать веб-сайты, используя в качестве первой IDE обычный блокнот для Windows. Со временем я узнал о Notepad++, Sublime и даже VS Code. \r\nЯ заинтересовался Linux и его дистрибутивами, включая Ubuntu, и в конце концов влюбился в Arch Linux.\r\n\r\n\r\n## В колледже было круто.\r\nВо время учебы в колледже я узнал о таблицах стилей CSS, языке разметки HTML и веб-стандартах. В то время еще были популярны плавающие элементы верстки, что превращало их в настоящий кошмар! Я изучал JavaScript, но нашел его сложным из-за синтаксиса. Я сделал перерыв и начал изучать Python. У Python ясный и понятный синтаксис и широкий выбор библиотек. Я писал небольшие программы с использованием библиотек пользовательского интерфейса для личного использования.\r\n\r\n\r\nМеня привлек веб, потому что я хотел показать миру, что я могу делать и быть полезным. \r\nЯ изучал WordPress и его плагины, а также ACF, оптимизацию ядра, настройку сервера для WordPress, развертывание Apache и включение gzip-сжатия на локальном сервере. \r\nЭти темы показались мне интересными, и я поставил перед собой цель узнать, как они работают, и добиться результатов.\r\n\r\n\r\n## Первая работа\r\nПока я рос, я искал работу и прошел стажировку в компании, которая специализировалась на разработке сайтов на WordPress. Во время стажировки я отвечал за управление страницами сайта и общение с разработчиками бэкенда. Этот опыт показался мне очень интересным и приятным, тем более что за него мне платили.\r\n\r\nКомпания, в которой я работал, занималась разработкой бизнес-сайтов. У них было более 100 сайтов, написанных на HTML/CSS и интегрированных в WordPress, но они были плохо оптимизированы. Моя задача заключалась в том, чтобы правильно оптимизировать и интегрировать их, чтобы они работали без сбоев. После этого я работал как фрилансер.\r\n\r\n\r\n## Я фрилансер\r\nЯ работала на себя, после чего стала фрилансером. Для меня фриланс - это рай, потому что у меня есть свобода выбирать клиентов, устанавливать собственные сроки и работать над задачами с нуля. \r\nМне не приходится иметь дело с чужой кодовой базой, что делает мою работу проще. Сложно перечислить все преимущества фриланса, но можно с уверенностью сказать, что я получаю от него огромное удовольствие. 😂\r\n\r\n\r\nНа фрилансе я разработал несколько сайтов, которые вы можете найти в разделе портфолио на моем сайте. Одним из них был интернет-магазин для бренда \"Бышикат\", частной швейной фабрики по пошиву женской обуви. \r\n\r\nНа сегодняшний день я успешно справился с задачей, и клиент доволен, особенно если учесть, что в первый же месяц после запуска магазин увеличил продажи более чем на 1000% по сравнению с их магазином в Instagram.\r\n\r\n
\r\n\r\n\r\n\r\n\r\n## Наши дни\r\nСейчас изучаю Astro Framework, кстати, этот сайт написан на этой технологии. Планирую больше практиковаться с JavaScript, а также начать изучать React, в общем, со стеком я определился, хотя и прошел долгий путь, чтобы понять, что мне действительно нравится и чего я хочу. Да... долгий путь, но в будущем он будет еще интереснее.\r\n\r\nСпасибо, что дочитали до конца, это мотивирует меня учиться и стараться еще больше, желаю вам хорошего дня и отличного настроения, я в эфире 😉\r\n\r\n\r\n> Mr.Robot наблюдает за вами. 🧐"; + const data = {isDraft:false,title:"О себе и опыте в веб-разработке",description:"От детских игр до веб-разработки. Я получил свой первый компьютер, углубился в Pascal, Delphi и веб-технологии. Эволюционировал через работу, фриланс и теперь изучаю Astro Framework. Впереди захватывающее путешествие! 🚀",image: + new Proxy({"src":"/_astro/experience.KAqr-zYG.jpg","width":1500,"height":857,"format":"jpg","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/experience.jpg"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/experience.jpg"; + } + + return target[name]; + } + }) + ,author:"Алексей",tags:["мойОпыт"],categories:["истории"],publishDate:"6/01/2024",language:"ru"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/about-experience-in-web-dev.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CW0YI6Rb.mjs b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CW0YI6Rb.mjs new file mode 100644 index 0000000..043a616 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_CW0YI6Rb.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./about-experience-in-web-dev_D4mxxtjJ.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_D4mxxtjJ.mjs b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_D4mxxtjJ.mjs new file mode 100644 index 0000000..7944e0e --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/about-experience-in-web-dev_D4mxxtjJ.mjs @@ -0,0 +1,124 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "about-experience-in-web", + "author": "\u0410\u043B\u0435\u043A\u0441\u0435\u0439", + "isDraft": false, + "title": "\u041E \u0441\u0435\u0431\u0435 \u0438 \u043E\u043F\u044B\u0442\u0435 \u0432 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0435", + "description": "\u041E\u0442 \u0434\u0435\u0442\u0441\u043A\u0438\u0445 \u0438\u0433\u0440 \u0434\u043E \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438. \u042F \u043F\u043E\u043B\u0443\u0447\u0438\u043B \u0441\u0432\u043E\u0439 \u043F\u0435\u0440\u0432\u044B\u0439 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440, \u0443\u0433\u043B\u0443\u0431\u0438\u043B\u0441\u044F \u0432 Pascal, Delphi \u0438 \u0432\u0435\u0431-\u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438. \u042D\u0432\u043E\u043B\u044E\u0446\u0438\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043B \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0431\u043E\u0442\u0443, \u0444\u0440\u0438\u043B\u0430\u043D\u0441 \u0438 \u0442\u0435\u043F\u0435\u0440\u044C \u0438\u0437\u0443\u0447\u0430\u044E Astro Framework. \u0412\u043F\u0435\u0440\u0435\u0434\u0438 \u0437\u0430\u0445\u0432\u0430\u0442\u044B\u0432\u0430\u044E\u0449\u0435\u0435 \u043F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435! \u{1F680}", + "image": "../images/experience.jpg", + "tags": ["\u043C\u043E\u0439\u041E\u043F\u044B\u0442"], + "categories": ["\u0438\u0441\u0442\u043E\u0440\u0438\u0438"], + "publishDate": "6/01/2024", + "language": "ru" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "\u0432-\u043A\u043E\u043B\u043B\u0435\u0434\u0436\u0435-\u0431\u044B\u043B\u043E-\u043A\u0440\u0443\u0442\u043E", + "text": "\u0412 \u043A\u043E\u043B\u043B\u0435\u0434\u0436\u0435 \u0431\u044B\u043B\u043E \u043A\u0440\u0443\u0442\u043E." + }, { + "depth": 2, + "slug": "\u043F\u0435\u0440\u0432\u0430\u044F-\u0440\u0430\u0431\u043E\u0442\u0430", + "text": "\u041F\u0435\u0440\u0432\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430" + }, { + "depth": 2, + "slug": "\u044F-\u0444\u0440\u0438\u043B\u0430\u043D\u0441\u0435\u0440", + "text": "\u042F \u0444\u0440\u0438\u043B\u0430\u043D\u0441\u0435\u0440" + }, { + "depth": 2, + "slug": "\u043D\u0430\u0448\u0438-\u0434\u043D\u0438", + "text": "\u041D\u0430\u0448\u0438 \u0434\u043D\u0438" + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + a: "a", + blockquote: "blockquote", + h2: "h2", + p: "p", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.p, { + children: "\u041C\u043E\u044F \u0438\u0441\u0442\u043E\u0440\u0438\u044F..: \u0412 \u0434\u0435\u0442\u0441\u0442\u0432\u0435 \u044F \u0437\u0430\u043C\u0435\u0442\u0438\u043B, \u0447\u0442\u043E \u043C\u043E\u0439 \u043E\u0442\u0435\u0446 \u043C\u043D\u043E\u0433\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u043F\u0440\u043E\u0432\u043E\u0434\u0438\u0442 \u0437\u0430 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u043E\u043C. \u0412\u0440\u0435\u043C\u044F \u043E\u0442 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u043E\u043D \u0434\u0435\u043B\u0430\u043B \u043F\u0435\u0440\u0435\u0440\u044B\u0432\u044B, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0438\u0433\u0440\u0430\u0442\u044C \u0432 \u0438\u0433\u0440\u044B, \u0442\u0430\u043A\u0438\u0435 \u043A\u0430\u043A S.T.A.L.K.E.R. \u0438 Crysis. \u041C\u043D\u0435 \u0442\u043E\u0436\u0435 \u043D\u0440\u0430\u0432\u0438\u043B\u043E\u0441\u044C \u0438\u0433\u0440\u0430\u0442\u044C \u0432 \u0438\u0433\u0440\u044B, \u0438 \u044F \u0447\u0430\u0441\u0442\u043E \u0445\u043E\u0434\u0438\u043B \u0432 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u043D\u044B\u0435 \u043A\u043B\u0443\u0431\u044B \u0441\u043E \u0441\u0432\u043E\u0438\u043C\u0438 \u0434\u0440\u0443\u0437\u044C\u044F\u043C\u0438. \u041E\u0434\u043D\u0430\u043A\u043E \u0441\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0435\u043C \u043D\u0430\u0448\u0438 \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u044B \u0441\u0442\u0430\u043B\u0438 \u043C\u0435\u043D\u044F\u0442\u044C\u0441\u044F." + }), "\n", createVNode(_components.p, { + children: "\u041D\u0430\u043A\u043E\u043D\u0435\u0446 \u043E\u0442\u0435\u0446 \u043F\u043E\u0434\u0430\u0440\u0438\u043B \u043C\u043D\u0435 \u043C\u043E\u0439 \u043F\u0435\u0440\u0432\u044B\u0439 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440, \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u043E\u0440 Intel Core 2 Duo \u0438 \u0432\u0438\u0434\u0435\u043E\u043A\u0430\u0440\u0442\u0443 GeForce 7800 GTX. \u0411\u044B\u043B\u043E \u0437\u0434\u043E\u0440\u043E\u0432\u043E \u043F\u043E\u0437\u043D\u0430\u043A\u043E\u043C\u0438\u0442\u044C\u0441\u044F \u0441 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u043E\u043C \u0438 \u0443\u0437\u043D\u0430\u0442\u044C, \u0447\u0442\u043E \u044F \u043C\u043E\u0433\u0443 \u043D\u0430 \u043D\u0435\u043C \u0434\u0435\u043B\u0430\u0442\u044C. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044C\u0441\u044F \u0441 Windows XP \u0431\u044B\u043B\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u043C \u0443\u0434\u043E\u0432\u043E\u043B\u044C\u0441\u0442\u0432\u0438\u0435\u043C \u{1F602}." + }), "\n", createVNode(_components.p, { + children: ["\u041F\u043E\u0432\u0437\u0440\u043E\u0441\u043B\u0435\u0432, \u044F \u043F\u043E\u0441\u0442\u0443\u043F\u0438\u043B \u043D\u0430 \u0444\u0430\u043A\u0443\u043B\u044C\u0442\u0435\u0442 \u201C\u041A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u043D\u044B\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u044B \u0438 \u043A\u043E\u043C\u043F\u043B\u0435\u043A\u0441\u044B\u201D, \u0433\u0434\u0435 \u0443\u0437\u043D\u0430\u043B, \u043A\u0430\u043A \u0443\u0441\u0442\u0440\u043E\u0435\u043D \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440, \u043C\u0430\u0448\u0438\u043D\u043D\u044B\u0439 \u043A\u043E\u0434, \u0410\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440, \u041F\u0430\u0441\u043A\u0430\u043B\u044C, Delphi, Photoshop, WEB \u0438 \u0441\u0430\u0439\u0442\u044B.\r\n\u0421\u0432\u043E\u0438 \u043F\u0435\u0440\u0432\u044B\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B \u044F \u043D\u0430\u043F\u0438\u0441\u0430\u043B \u043D\u0430 Pascal \u0438 Delphi. \u0418\u0441\u0445\u043E\u0434\u043D\u044B\u0439 \u043A\u043E\u0434 \u0441\u0432\u043E\u0438\u0445 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C \u043D\u0430 Delphi \u044F \u0440\u0430\u0437\u043C\u0435\u0449\u0430\u043B \u0432 \u0441\u0432\u043E\u0435\u043C ", createVNode(_components.a, { + href: "https://freeexpa.wordpress.com/", + children: "\u0431\u043B\u043E\u0433\u0435" + }), ", \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0434\u043E \u0441\u0438\u0445 \u043F\u043E\u0440 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043D\u0430 WordPress."] + }), "\n", createVNode(_components.p, { + children: "\u041F\u043E\u0437\u0436\u0435 \u044F \u043D\u0430\u0443\u0447\u0438\u043B\u0441\u044F \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0442\u044C \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u044B, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u0432 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043F\u0435\u0440\u0432\u043E\u0439 IDE \u043E\u0431\u044B\u0447\u043D\u044B\u0439 \u0431\u043B\u043E\u043A\u043D\u043E\u0442 \u0434\u043B\u044F Windows. \u0421\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0435\u043C \u044F \u0443\u0437\u043D\u0430\u043B \u043E Notepad++, Sublime \u0438 \u0434\u0430\u0436\u0435 VS Code.\r\n\u042F \u0437\u0430\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043E\u0432\u0430\u043B\u0441\u044F Linux \u0438 \u0435\u0433\u043E \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u043C\u0438, \u0432\u043A\u043B\u044E\u0447\u0430\u044F Ubuntu, \u0438 \u0432 \u043A\u043E\u043D\u0446\u0435 \u043A\u043E\u043D\u0446\u043E\u0432 \u0432\u043B\u044E\u0431\u0438\u043B\u0441\u044F \u0432 Arch Linux." + }), "\n", createVNode(_components.h2, { + id: "\u0432-\u043A\u043E\u043B\u043B\u0435\u0434\u0436\u0435-\u0431\u044B\u043B\u043E-\u043A\u0440\u0443\u0442\u043E", + children: "\u0412 \u043A\u043E\u043B\u043B\u0435\u0434\u0436\u0435 \u0431\u044B\u043B\u043E \u043A\u0440\u0443\u0442\u043E." + }), "\n", createVNode(_components.p, { + children: "\u0412\u043E \u0432\u0440\u0435\u043C\u044F \u0443\u0447\u0435\u0431\u044B \u0432 \u043A\u043E\u043B\u043B\u0435\u0434\u0436\u0435 \u044F \u0443\u0437\u043D\u0430\u043B \u043E \u0442\u0430\u0431\u043B\u0438\u0446\u0430\u0445 \u0441\u0442\u0438\u043B\u0435\u0439 CSS, \u044F\u0437\u044B\u043A\u0435 \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0438 HTML \u0438 \u0432\u0435\u0431-\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u0430\u0445. \u0412 \u0442\u043E \u0432\u0440\u0435\u043C\u044F \u0435\u0449\u0435 \u0431\u044B\u043B\u0438 \u043F\u043E\u043F\u0443\u043B\u044F\u0440\u043D\u044B \u043F\u043B\u0430\u0432\u0430\u044E\u0449\u0438\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0432\u0435\u0440\u0441\u0442\u043A\u0438, \u0447\u0442\u043E \u043F\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043B\u043E \u0438\u0445 \u0432 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0438\u0439 \u043A\u043E\u0448\u043C\u0430\u0440! \u042F \u0438\u0437\u0443\u0447\u0430\u043B JavaScript, \u043D\u043E \u043D\u0430\u0448\u0435\u043B \u0435\u0433\u043E \u0441\u043B\u043E\u0436\u043D\u044B\u043C \u0438\u0437-\u0437\u0430 \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0430. \u042F \u0441\u0434\u0435\u043B\u0430\u043B \u043F\u0435\u0440\u0435\u0440\u044B\u0432 \u0438 \u043D\u0430\u0447\u0430\u043B \u0438\u0437\u0443\u0447\u0430\u0442\u044C Python. \u0423 Python \u044F\u0441\u043D\u044B\u0439 \u0438 \u043F\u043E\u043D\u044F\u0442\u043D\u044B\u0439 \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441 \u0438 \u0448\u0438\u0440\u043E\u043A\u0438\u0439 \u0432\u044B\u0431\u043E\u0440 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A. \u042F \u043F\u0438\u0441\u0430\u043B \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043B\u044F \u043B\u0438\u0447\u043D\u043E\u0433\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F." + }), "\n", createVNode(_components.p, { + children: "\u041C\u0435\u043D\u044F \u043F\u0440\u0438\u0432\u043B\u0435\u043A \u0432\u0435\u0431, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u044F \u0445\u043E\u0442\u0435\u043B \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043C\u0438\u0440\u0443, \u0447\u0442\u043E \u044F \u043C\u043E\u0433\u0443 \u0434\u0435\u043B\u0430\u0442\u044C \u0438 \u0431\u044B\u0442\u044C \u043F\u043E\u043B\u0435\u0437\u043D\u044B\u043C.\r\n\u042F \u0438\u0437\u0443\u0447\u0430\u043B WordPress \u0438 \u0435\u0433\u043E \u043F\u043B\u0430\u0433\u0438\u043D\u044B, \u0430 \u0442\u0430\u043A\u0436\u0435 ACF, \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u044E \u044F\u0434\u0440\u0430, \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043B\u044F WordPress, \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435 Apache \u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 gzip-\u0441\u0436\u0430\u0442\u0438\u044F \u043D\u0430 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u043C \u0441\u0435\u0440\u0432\u0435\u0440\u0435.\r\n\u042D\u0442\u0438 \u0442\u0435\u043C\u044B \u043F\u043E\u043A\u0430\u0437\u0430\u043B\u0438\u0441\u044C \u043C\u043D\u0435 \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B\u043C\u0438, \u0438 \u044F \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u043B \u043F\u0435\u0440\u0435\u0434 \u0441\u043E\u0431\u043E\u0439 \u0446\u0435\u043B\u044C \u0443\u0437\u043D\u0430\u0442\u044C, \u043A\u0430\u043A \u043E\u043D\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442, \u0438 \u0434\u043E\u0431\u0438\u0442\u044C\u0441\u044F \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432." + }), "\n", createVNode(_components.h2, { + id: "\u043F\u0435\u0440\u0432\u0430\u044F-\u0440\u0430\u0431\u043E\u0442\u0430", + children: "\u041F\u0435\u0440\u0432\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430" + }), "\n", createVNode(_components.p, { + children: "\u041F\u043E\u043A\u0430 \u044F \u0440\u043E\u0441, \u044F \u0438\u0441\u043A\u0430\u043B \u0440\u0430\u0431\u043E\u0442\u0443 \u0438 \u043F\u0440\u043E\u0448\u0435\u043B \u0441\u0442\u0430\u0436\u0438\u0440\u043E\u0432\u043A\u0443 \u0432 \u043A\u043E\u043C\u043F\u0430\u043D\u0438\u0438, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043B\u0430\u0441\u044C \u043D\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u0441\u0430\u0439\u0442\u043E\u0432 \u043D\u0430 WordPress. \u0412\u043E \u0432\u0440\u0435\u043C\u044F \u0441\u0442\u0430\u0436\u0438\u0440\u043E\u0432\u043A\u0438 \u044F \u043E\u0442\u0432\u0435\u0447\u0430\u043B \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\u043C\u0438 \u0441\u0430\u0439\u0442\u0430 \u0438 \u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430\u043C\u0438 \u0431\u044D\u043A\u0435\u043D\u0434\u0430. \u042D\u0442\u043E\u0442 \u043E\u043F\u044B\u0442 \u043F\u043E\u043A\u0430\u0437\u0430\u043B\u0441\u044F \u043C\u043D\u0435 \u043E\u0447\u0435\u043D\u044C \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B\u043C \u0438 \u043F\u0440\u0438\u044F\u0442\u043D\u044B\u043C, \u0442\u0435\u043C \u0431\u043E\u043B\u0435\u0435 \u0447\u0442\u043E \u0437\u0430 \u043D\u0435\u0433\u043E \u043C\u043D\u0435 \u043F\u043B\u0430\u0442\u0438\u043B\u0438." + }), "\n", createVNode(_components.p, { + children: "\u041A\u043E\u043C\u043F\u0430\u043D\u0438\u044F, \u0432 \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u044F \u0440\u0430\u0431\u043E\u0442\u0430\u043B, \u0437\u0430\u043D\u0438\u043C\u0430\u043B\u0430\u0441\u044C \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u043E\u0439 \u0431\u0438\u0437\u043D\u0435\u0441-\u0441\u0430\u0439\u0442\u043E\u0432. \u0423 \u043D\u0438\u0445 \u0431\u044B\u043B\u043E \u0431\u043E\u043B\u0435\u0435 100 \u0441\u0430\u0439\u0442\u043E\u0432, \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0445 \u043D\u0430 HTML/CSS \u0438 \u0438\u043D\u0442\u0435\u0433\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u0432 WordPress, \u043D\u043E \u043E\u043D\u0438 \u0431\u044B\u043B\u0438 \u043F\u043B\u043E\u0445\u043E \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u044B. \u041C\u043E\u044F \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043A\u043B\u044E\u0447\u0430\u043B\u0430\u0441\u044C \u0432 \u0442\u043E\u043C, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438 \u0438\u043D\u0442\u0435\u0433\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u0445, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u043B\u0438 \u0431\u0435\u0437 \u0441\u0431\u043E\u0435\u0432. \u041F\u043E\u0441\u043B\u0435 \u044D\u0442\u043E\u0433\u043E \u044F \u0440\u0430\u0431\u043E\u0442\u0430\u043B \u043A\u0430\u043A \u0444\u0440\u0438\u043B\u0430\u043D\u0441\u0435\u0440." + }), "\n", createVNode(_components.h2, { + id: "\u044F-\u0444\u0440\u0438\u043B\u0430\u043D\u0441\u0435\u0440", + children: "\u042F \u0444\u0440\u0438\u043B\u0430\u043D\u0441\u0435\u0440" + }), "\n", createVNode(_components.p, { + children: "\u042F \u0440\u0430\u0431\u043E\u0442\u0430\u043B\u0430 \u043D\u0430 \u0441\u0435\u0431\u044F, \u043F\u043E\u0441\u043B\u0435 \u0447\u0435\u0433\u043E \u0441\u0442\u0430\u043B\u0430 \u0444\u0440\u0438\u043B\u0430\u043D\u0441\u0435\u0440\u043E\u043C. \u0414\u043B\u044F \u043C\u0435\u043D\u044F \u0444\u0440\u0438\u043B\u0430\u043D\u0441 - \u044D\u0442\u043E \u0440\u0430\u0439, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0443 \u043C\u0435\u043D\u044F \u0435\u0441\u0442\u044C \u0441\u0432\u043E\u0431\u043E\u0434\u0430 \u0432\u044B\u0431\u0438\u0440\u0430\u0442\u044C \u043A\u043B\u0438\u0435\u043D\u0442\u043E\u0432, \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0442\u044C \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u0441\u0440\u043E\u043A\u0438 \u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u043D\u0430\u0434 \u0437\u0430\u0434\u0430\u0447\u0430\u043C\u0438 \u0441 \u043D\u0443\u043B\u044F.\r\n\u041C\u043D\u0435 \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0438\u043C\u0435\u0442\u044C \u0434\u0435\u043B\u043E \u0441 \u0447\u0443\u0436\u043E\u0439 \u043A\u043E\u0434\u043E\u0432\u043E\u0439 \u0431\u0430\u0437\u043E\u0439, \u0447\u0442\u043E \u0434\u0435\u043B\u0430\u0435\u0442 \u043C\u043E\u044E \u0440\u0430\u0431\u043E\u0442\u0443 \u043F\u0440\u043E\u0449\u0435. \u0421\u043B\u043E\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0438\u0442\u044C \u0432\u0441\u0435 \u043F\u0440\u0435\u0438\u043C\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0444\u0440\u0438\u043B\u0430\u043D\u0441\u0430, \u043D\u043E \u043C\u043E\u0436\u043D\u043E \u0441 \u0443\u0432\u0435\u0440\u0435\u043D\u043D\u043E\u0441\u0442\u044C\u044E \u0441\u043A\u0430\u0437\u0430\u0442\u044C, \u0447\u0442\u043E \u044F \u043F\u043E\u043B\u0443\u0447\u0430\u044E \u043E\u0442 \u043D\u0435\u0433\u043E \u043E\u0433\u0440\u043E\u043C\u043D\u043E\u0435 \u0443\u0434\u043E\u0432\u043E\u043B\u044C\u0441\u0442\u0432\u0438\u0435. \u{1F602}" + }), "\n", createVNode(_components.p, { + children: "\u041D\u0430 \u0444\u0440\u0438\u043B\u0430\u043D\u0441\u0435 \u044F \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043B \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0430\u0439\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0439\u0442\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043B\u0435 \u043F\u043E\u0440\u0442\u0444\u043E\u043B\u0438\u043E \u043D\u0430 \u043C\u043E\u0435\u043C \u0441\u0430\u0439\u0442\u0435. \u041E\u0434\u043D\u0438\u043C \u0438\u0437 \u043D\u0438\u0445 \u0431\u044B\u043B \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u043C\u0430\u0433\u0430\u0437\u0438\u043D \u0434\u043B\u044F \u0431\u0440\u0435\u043D\u0434\u0430 \u201C\u0411\u044B\u0448\u0438\u043A\u0430\u0442\u201D, \u0447\u0430\u0441\u0442\u043D\u043E\u0439 \u0448\u0432\u0435\u0439\u043D\u043E\u0439 \u0444\u0430\u0431\u0440\u0438\u043A\u0438 \u043F\u043E \u043F\u043E\u0448\u0438\u0432\u0443 \u0436\u0435\u043D\u0441\u043A\u043E\u0439 \u043E\u0431\u0443\u0432\u0438." + }), "\n", createVNode(_components.p, { + children: "\u041D\u0430 \u0441\u0435\u0433\u043E\u0434\u043D\u044F\u0448\u043D\u0438\u0439 \u0434\u0435\u043D\u044C \u044F \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u043F\u0440\u0430\u0432\u0438\u043B\u0441\u044F \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0438 \u043A\u043B\u0438\u0435\u043D\u0442 \u0434\u043E\u0432\u043E\u043B\u0435\u043D, \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E \u0435\u0441\u043B\u0438 \u0443\u0447\u0435\u0441\u0442\u044C, \u0447\u0442\u043E \u0432 \u043F\u0435\u0440\u0432\u044B\u0439 \u0436\u0435 \u043C\u0435\u0441\u044F\u0446 \u043F\u043E\u0441\u043B\u0435 \u0437\u0430\u043F\u0443\u0441\u043A\u0430 \u043C\u0430\u0433\u0430\u0437\u0438\u043D \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u043B \u043F\u0440\u043E\u0434\u0430\u0436\u0438 \u0431\u043E\u043B\u0435\u0435 \u0447\u0435\u043C \u043D\u0430 1000% \u043F\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044E \u0441 \u0438\u0445 \u043C\u0430\u0433\u0430\u0437\u0438\u043D\u043E\u043C \u0432 Instagram." + }), "\n", createVNode("div", { + class: "horizontal-line" + }), "\n", createVNode("img", { + class: "mb-5 rounded-xl", + src: "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHlrcWNoM3h3a3J4ZXptcm83OGlrM2xvMHQyNTczbDF6OHo4NWljcSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/RPwrO4b46mOdy/giphy.gif", + width: "500px", + height: "300px" + }), "\n", createVNode(_components.h2, { + id: "\u043D\u0430\u0448\u0438-\u0434\u043D\u0438", + children: "\u041D\u0430\u0448\u0438 \u0434\u043D\u0438" + }), "\n", createVNode(_components.p, { + children: "\u0421\u0435\u0439\u0447\u0430\u0441 \u0438\u0437\u0443\u0447\u0430\u044E Astro Framework, \u043A\u0441\u0442\u0430\u0442\u0438, \u044D\u0442\u043E\u0442 \u0441\u0430\u0439\u0442 \u043D\u0430\u043F\u0438\u0441\u0430\u043D \u043D\u0430 \u044D\u0442\u043E\u0439 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438. \u041F\u043B\u0430\u043D\u0438\u0440\u0443\u044E \u0431\u043E\u043B\u044C\u0448\u0435 \u043F\u0440\u0430\u043A\u0442\u0438\u043A\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0441 JavaScript, \u0430 \u0442\u0430\u043A\u0436\u0435 \u043D\u0430\u0447\u0430\u0442\u044C \u0438\u0437\u0443\u0447\u0430\u0442\u044C React, \u0432 \u043E\u0431\u0449\u0435\u043C, \u0441\u043E \u0441\u0442\u0435\u043A\u043E\u043C \u044F \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u043B\u0441\u044F, \u0445\u043E\u0442\u044F \u0438 \u043F\u0440\u043E\u0448\u0435\u043B \u0434\u043E\u043B\u0433\u0438\u0439 \u043F\u0443\u0442\u044C, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043D\u044F\u0442\u044C, \u0447\u0442\u043E \u043C\u043D\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0440\u0430\u0432\u0438\u0442\u0441\u044F \u0438 \u0447\u0435\u0433\u043E \u044F \u0445\u043E\u0447\u0443. \u0414\u0430\u2026 \u0434\u043E\u043B\u0433\u0438\u0439 \u043F\u0443\u0442\u044C, \u043D\u043E \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043C \u043E\u043D \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0435 \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u0435\u0435." + }), "\n", createVNode(_components.p, { + children: "\u0421\u043F\u0430\u0441\u0438\u0431\u043E, \u0447\u0442\u043E \u0434\u043E\u0447\u0438\u0442\u0430\u043B\u0438 \u0434\u043E \u043A\u043E\u043D\u0446\u0430, \u044D\u0442\u043E \u043C\u043E\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u043C\u0435\u043D\u044F \u0443\u0447\u0438\u0442\u044C\u0441\u044F \u0438 \u0441\u0442\u0430\u0440\u0430\u0442\u044C\u0441\u044F \u0435\u0449\u0435 \u0431\u043E\u043B\u044C\u0448\u0435, \u0436\u0435\u043B\u0430\u044E \u0432\u0430\u043C \u0445\u043E\u0440\u043E\u0448\u0435\u0433\u043E \u0434\u043D\u044F \u0438 \u043E\u0442\u043B\u0438\u0447\u043D\u043E\u0433\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u0438\u044F, \u044F \u0432 \u044D\u0444\u0438\u0440\u0435 \u{1F609}" + }), "\n", createVNode(_components.blockquote, { + children: ["\n", createVNode(_components.p, { + children: "Mr.Robot \u043D\u0430\u0431\u043B\u044E\u0434\u0430\u0435\u0442 \u0437\u0430 \u0432\u0430\u043C\u0438. \u{1F9D0}" + }), "\n"] + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/ru/about-experience-in-web-dev.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/about-experience-in-web-dev.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/about-experience-in-web-dev.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/chunks/about_BaPuutao.mjs b/.netlify/functions-internal/ssr/chunks/about_BaPuutao.mjs new file mode 100644 index 0000000..6f3c3ca --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/about_BaPuutao.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.f); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/about_CuR22hxo.mjs b/.netlify/functions-internal/ssr/chunks/about_CuR22hxo.mjs new file mode 100644 index 0000000..84eecdd --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/about_CuR22hxo.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.a); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/astro/assets-service_B85IQn9G.mjs b/.netlify/functions-internal/ssr/chunks/astro/assets-service_B85IQn9G.mjs new file mode 100644 index 0000000..e9a2a80 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/astro/assets-service_B85IQn9G.mjs @@ -0,0 +1,342 @@ +import { isRemotePath, joinPaths } from '@astrojs/internal-helpers/path'; +import { A as AstroError, E as ExpectedImage, L as LocalImageUsedWrongly, M as MissingImageDimension, U as UnsupportedImageFormat, I as IncompatibleDescriptorOptions, a as UnsupportedImageConversion, b as MissingSharp } from '../astro_U7cLjtnz.mjs'; + +const VALID_SUPPORTED_FORMATS = [ + "jpeg", + "jpg", + "png", + "tiff", + "webp", + "gif", + "svg", + "avif" +]; +const DEFAULT_OUTPUT_FORMAT = "webp"; +const DEFAULT_HASH_PROPS = ["src", "width", "height", "format", "quality"]; + +function isESMImportedImage(src) { + return typeof src === "object"; +} +function isRemoteImage(src) { + return typeof src === "string"; +} + +function matchPattern(url, remotePattern) { + return matchProtocol(url, remotePattern.protocol) && matchHostname(url, remotePattern.hostname, true) && matchPort(url, remotePattern.port) && matchPathname(url, remotePattern.pathname, true); +} +function matchPort(url, port) { + return !port || port === url.port; +} +function matchProtocol(url, protocol) { + return !protocol || protocol === url.protocol.slice(0, -1); +} +function matchHostname(url, hostname, allowWildcard) { + if (!hostname) { + return true; + } else if (!allowWildcard || !hostname.startsWith("*")) { + return hostname === url.hostname; + } else if (hostname.startsWith("**.")) { + const slicedHostname = hostname.slice(2); + return slicedHostname !== url.hostname && url.hostname.endsWith(slicedHostname); + } else if (hostname.startsWith("*.")) { + const slicedHostname = hostname.slice(1); + const additionalSubdomains = url.hostname.replace(slicedHostname, "").split(".").filter(Boolean); + return additionalSubdomains.length === 1; + } + return false; +} +function matchPathname(url, pathname, allowWildcard) { + if (!pathname) { + return true; + } else if (!allowWildcard || !pathname.endsWith("*")) { + return pathname === url.pathname; + } else if (pathname.endsWith("/**")) { + const slicedPathname = pathname.slice(0, -2); + return slicedPathname !== url.pathname && url.pathname.startsWith(slicedPathname); + } else if (pathname.endsWith("/*")) { + const slicedPathname = pathname.slice(0, -1); + const additionalPathChunks = url.pathname.replace(slicedPathname, "").split("/").filter(Boolean); + return additionalPathChunks.length === 1; + } + return false; +} +function isRemoteAllowed(src, { + domains = [], + remotePatterns = [] +}) { + if (!isRemotePath(src)) + return false; + const url = new URL(src); + return domains.some((domain) => matchHostname(url, domain)) || remotePatterns.some((remotePattern) => matchPattern(url, remotePattern)); +} + +function isLocalService(service) { + if (!service) { + return false; + } + return "transform" in service; +} +function parseQuality(quality) { + let result = parseInt(quality); + if (Number.isNaN(result)) { + return quality; + } + return result; +} +const baseService = { + propertiesToHash: DEFAULT_HASH_PROPS, + validateOptions(options) { + if (!options.src || typeof options.src !== "string" && typeof options.src !== "object") { + throw new AstroError({ + ...ExpectedImage, + message: ExpectedImage.message( + JSON.stringify(options.src), + typeof options.src, + JSON.stringify(options, (_, v) => v === void 0 ? null : v) + ) + }); + } + if (!isESMImportedImage(options.src)) { + if (options.src.startsWith("/@fs/") || !isRemotePath(options.src) && !options.src.startsWith("/")) { + throw new AstroError({ + ...LocalImageUsedWrongly, + message: LocalImageUsedWrongly.message(options.src) + }); + } + let missingDimension; + if (!options.width && !options.height) { + missingDimension = "both"; + } else if (!options.width && options.height) { + missingDimension = "width"; + } else if (options.width && !options.height) { + missingDimension = "height"; + } + if (missingDimension) { + throw new AstroError({ + ...MissingImageDimension, + message: MissingImageDimension.message(missingDimension, options.src) + }); + } + } else { + if (!VALID_SUPPORTED_FORMATS.includes(options.src.format)) { + throw new AstroError({ + ...UnsupportedImageFormat, + message: UnsupportedImageFormat.message( + options.src.format, + options.src.src, + VALID_SUPPORTED_FORMATS + ) + }); + } + if (options.widths && options.densities) { + throw new AstroError(IncompatibleDescriptorOptions); + } + if (options.src.format === "svg") { + options.format = "svg"; + } + if (options.src.format === "svg" && options.format !== "svg" || options.src.format !== "svg" && options.format === "svg") { + throw new AstroError(UnsupportedImageConversion); + } + } + if (!options.format) { + options.format = DEFAULT_OUTPUT_FORMAT; + } + if (options.width) + options.width = Math.round(options.width); + if (options.height) + options.height = Math.round(options.height); + return options; + }, + getHTMLAttributes(options) { + const { targetWidth, targetHeight } = getTargetDimensions(options); + const { src, width, height, format, quality, densities, widths, formats, ...attributes } = options; + return { + ...attributes, + width: targetWidth, + height: targetHeight, + loading: attributes.loading ?? "lazy", + decoding: attributes.decoding ?? "async" + }; + }, + getSrcSet(options) { + const srcSet = []; + const { targetWidth } = getTargetDimensions(options); + const { widths, densities } = options; + const targetFormat = options.format ?? DEFAULT_OUTPUT_FORMAT; + let imageWidth = options.width; + let maxWidth = Infinity; + if (isESMImportedImage(options.src)) { + imageWidth = options.src.width; + maxWidth = imageWidth; + } + const { + width: transformWidth, + height: transformHeight, + ...transformWithoutDimensions + } = options; + const allWidths = []; + if (densities) { + const densityValues = densities.map((density) => { + if (typeof density === "number") { + return density; + } else { + return parseFloat(density); + } + }); + const densityWidths = densityValues.sort().map((density) => Math.round(targetWidth * density)); + allWidths.push( + ...densityWidths.map((width, index) => ({ + maxTargetWidth: Math.min(width, maxWidth), + descriptor: `${densityValues[index]}x` + })) + ); + } else if (widths) { + allWidths.push( + ...widths.map((width) => ({ + maxTargetWidth: Math.min(width, maxWidth), + descriptor: `${width}w` + })) + ); + } + for (const { maxTargetWidth, descriptor } of allWidths) { + const srcSetTransform = { ...transformWithoutDimensions }; + if (maxTargetWidth !== imageWidth) { + srcSetTransform.width = maxTargetWidth; + } else { + if (options.width && options.height) { + srcSetTransform.width = options.width; + srcSetTransform.height = options.height; + } + } + srcSet.push({ + transform: srcSetTransform, + descriptor, + attributes: { + type: `image/${targetFormat}` + } + }); + } + return srcSet; + }, + getURL(options, imageConfig) { + const searchParams = new URLSearchParams(); + if (isESMImportedImage(options.src)) { + searchParams.append("href", options.src.src); + } else if (isRemoteAllowed(options.src, imageConfig)) { + searchParams.append("href", options.src); + } else { + return options.src; + } + const params = { + w: "width", + h: "height", + q: "quality", + f: "format" + }; + Object.entries(params).forEach(([param, key]) => { + options[key] && searchParams.append(param, options[key].toString()); + }); + const imageEndpoint = joinPaths("/", "/_image"); + return `${imageEndpoint}?${searchParams}`; + }, + parseURL(url) { + const params = url.searchParams; + if (!params.has("href")) { + return void 0; + } + const transform = { + src: params.get("href"), + width: params.has("w") ? parseInt(params.get("w")) : void 0, + height: params.has("h") ? parseInt(params.get("h")) : void 0, + format: params.get("f"), + quality: params.get("q") + }; + return transform; + } +}; +function getTargetDimensions(options) { + let targetWidth = options.width; + let targetHeight = options.height; + if (isESMImportedImage(options.src)) { + const aspectRatio = options.src.width / options.src.height; + if (targetHeight && !targetWidth) { + targetWidth = Math.round(targetHeight * aspectRatio); + } else if (targetWidth && !targetHeight) { + targetHeight = Math.round(targetWidth / aspectRatio); + } else if (!targetWidth && !targetHeight) { + targetWidth = options.src.width; + targetHeight = options.src.height; + } + } + return { + targetWidth, + targetHeight + }; +} + +let sharp; +const qualityTable = { + low: 25, + mid: 50, + high: 80, + max: 100 +}; +async function loadSharp() { + let sharpImport; + try { + sharpImport = (await import('sharp')).default; + } catch (e) { + throw new AstroError(MissingSharp); + } + return sharpImport; +} +const sharpService = { + validateOptions: baseService.validateOptions, + getURL: baseService.getURL, + parseURL: baseService.parseURL, + getHTMLAttributes: baseService.getHTMLAttributes, + getSrcSet: baseService.getSrcSet, + async transform(inputBuffer, transformOptions, config) { + if (!sharp) + sharp = await loadSharp(); + const transform = transformOptions; + if (transform.format === "svg") + return { data: inputBuffer, format: "svg" }; + const result = sharp(inputBuffer, { + failOnError: false, + pages: -1, + limitInputPixels: config.service.config.limitInputPixels + }); + result.rotate(); + if (transform.height && !transform.width) { + result.resize({ height: Math.round(transform.height) }); + } else if (transform.width) { + result.resize({ width: Math.round(transform.width) }); + } + if (transform.format) { + let quality = void 0; + if (transform.quality) { + const parsedQuality = parseQuality(transform.quality); + if (typeof parsedQuality === "number") { + quality = parsedQuality; + } else { + quality = transform.quality in qualityTable ? qualityTable[transform.quality] : void 0; + } + } + result.toFormat(transform.format, { quality }); + } + const { data, info } = await result.toBuffer({ resolveWithObject: true }); + return { + data, + format: info.format + }; + } +}; +var sharp_default = sharpService; + +const sharp$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ + __proto__: null, + default: sharp_default +}, Symbol.toStringTag, { value: 'Module' })); + +export { DEFAULT_HASH_PROPS as D, isESMImportedImage as a, isLocalService as b, isRemoteAllowed as c, isRemoteImage as i, sharp$1 as s }; diff --git a/.netlify/functions-internal/ssr/chunks/astro_U7cLjtnz.mjs b/.netlify/functions-internal/ssr/chunks/astro_U7cLjtnz.mjs new file mode 100644 index 0000000..c8d5f95 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/astro_U7cLjtnz.mjs @@ -0,0 +1,2164 @@ +import 'kleur/colors'; +import { clsx } from 'clsx'; +import { escape } from 'html-escaper'; +import cssesc from 'cssesc'; + +function normalizeLF(code) { + return code.replace(/\r\n|\r(?!\n)|\n/g, "\n"); +} + +function codeFrame(src, loc) { + if (!loc || loc.line === void 0 || loc.column === void 0) { + return ""; + } + const lines = normalizeLF(src).split("\n").map((ln) => ln.replace(/\t/g, " ")); + const visibleLines = []; + for (let n = -2; n <= 2; n++) { + if (lines[loc.line + n]) + visibleLines.push(loc.line + n); + } + let gutterWidth = 0; + for (const lineNo of visibleLines) { + let w = `> ${lineNo}`; + if (w.length > gutterWidth) + gutterWidth = w.length; + } + let output = ""; + for (const lineNo of visibleLines) { + const isFocusedLine = lineNo === loc.line - 1; + output += isFocusedLine ? "> " : " "; + output += `${lineNo + 1} | ${lines[lineNo]} +`; + if (isFocusedLine) + output += `${Array.from({ length: gutterWidth }).join(" ")} | ${Array.from({ + length: loc.column + }).join(" ")}^ +`; + } + return output; +} + +class AstroError extends Error { + loc; + title; + hint; + frame; + type = "AstroError"; + constructor(props, options) { + const { name, title, message, stack, location, hint, frame } = props; + super(message, options); + this.title = title; + this.name = name; + if (message) + this.message = message; + this.stack = stack ? stack : this.stack; + this.loc = location; + this.hint = hint; + this.frame = frame; + } + setLocation(location) { + this.loc = location; + } + setName(name) { + this.name = name; + } + setMessage(message) { + this.message = message; + } + setHint(hint) { + this.hint = hint; + } + setFrame(source, location) { + this.frame = codeFrame(source, location); + } + static is(err) { + return err.type === "AstroError"; + } +} + +const OnlyResponseCanBeReturned = { + name: "OnlyResponseCanBeReturned", + title: "Invalid type returned by Astro page.", + message: (route, returnedValue) => `Route \`${route ? route : ""}\` returned a \`${returnedValue}\`. Only a [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) can be returned from Astro files.`, + hint: "See https://docs.astro.build/en/guides/server-side-rendering/#response for more information." +}; +const MissingMediaQueryDirective = { + name: "MissingMediaQueryDirective", + title: "Missing value for `client:media` directive.", + message: 'Media query not provided for `client:media` directive. A media query similar to `client:media="(max-width: 600px)"` must be provided' +}; +const NoMatchingRenderer = { + name: "NoMatchingRenderer", + title: "No matching renderer found.", + message: (componentName, componentExtension, plural, validRenderersCount) => `Unable to render \`${componentName}\`. + +${validRenderersCount > 0 ? `There ${plural ? "are" : "is"} ${validRenderersCount} renderer${plural ? "s" : ""} configured in your \`astro.config.mjs\` file, +but ${plural ? "none were" : "it was not"} able to server-side render \`${componentName}\`.` : `No valid renderer was found ${componentExtension ? `for the \`.${componentExtension}\` file extension.` : `for this file extension.`}`}`, + hint: (probableRenderers) => `Did you mean to enable the ${probableRenderers} integration? + +See https://docs.astro.build/en/guides/framework-components/ for more information on how to install and configure integrations.` +}; +const NoClientEntrypoint = { + name: "NoClientEntrypoint", + title: "No client entrypoint specified in renderer.", + message: (componentName, clientDirective, rendererName) => `\`${componentName}\` component has a \`client:${clientDirective}\` directive, but no client entrypoint was provided by \`${rendererName}\`.`, + hint: "See https://docs.astro.build/en/reference/integrations-reference/#addrenderer-option for more information on how to configure your renderer." +}; +const NoClientOnlyHint = { + name: "NoClientOnlyHint", + title: "Missing hint on client:only directive.", + message: (componentName) => `Unable to render \`${componentName}\`. When using the \`client:only\` hydration strategy, Astro needs a hint to use the correct renderer.`, + hint: (probableRenderers) => `Did you mean to pass \`client:only="${probableRenderers}"\`? See https://docs.astro.build/en/reference/directives-reference/#clientonly for more information on client:only` +}; +const NoMatchingImport = { + name: "NoMatchingImport", + title: "No import found for component.", + message: (componentName) => `Could not render \`${componentName}\`. No matching import has been found for \`${componentName}\`.`, + hint: "Please make sure the component is properly imported." +}; +const InvalidComponentArgs = { + name: "InvalidComponentArgs", + title: "Invalid component arguments.", + message: (name) => `Invalid arguments passed to${name ? ` <${name}>` : ""} component.`, + hint: "Astro components cannot be rendered directly via function call, such as `Component()` or `{items.map(Component)}`." +}; +const ImageMissingAlt = { + name: "ImageMissingAlt", + title: 'Image missing required "alt" property.', + message: 'Image missing "alt" property. "alt" text is required to describe important images on the page.', + hint: 'Use an empty string ("") for decorative images.' +}; +const InvalidImageService = { + name: "InvalidImageService", + title: "Error while loading image service.", + message: "There was an error loading the configured image service. Please see the stack trace for more information." +}; +const MissingImageDimension = { + name: "MissingImageDimension", + title: "Missing image dimensions", + message: (missingDimension, imageURL) => `Missing ${missingDimension === "both" ? "width and height attributes" : `${missingDimension} attribute`} for ${imageURL}. When using remote images, both dimensions are required unless in order to avoid CLS.`, + hint: "If your image is inside your `src` folder, you probably meant to import it instead. See [the Imports guide for more information](https://docs.astro.build/en/guides/imports/#other-assets). You can also use `inferSize={true}` for remote images to get the original dimensions." +}; +const FailedToFetchRemoteImageDimensions = { + name: "FailedToFetchRemoteImageDimensions", + title: "Failed to retrieve remote image dimensions", + message: (imageURL) => `Failed to get the dimensions for ${imageURL}.`, + hint: "Verify your remote image URL is accurate, and that you are not using `inferSize` with a file located in your `public/` folder." +}; +const UnsupportedImageFormat = { + name: "UnsupportedImageFormat", + title: "Unsupported image format", + message: (format, imagePath, supportedFormats) => `Received unsupported format \`${format}\` from \`${imagePath}\`. Currently only ${supportedFormats.join( + ", " + )} are supported by our image services.`, + hint: "Using an `img` tag directly instead of the `Image` component might be what you're looking for." +}; +const UnsupportedImageConversion = { + name: "UnsupportedImageConversion", + title: "Unsupported image conversion", + message: "Converting between vector (such as SVGs) and raster (such as PNGs and JPEGs) images is not currently supported." +}; +const ExpectedImage = { + name: "ExpectedImage", + title: "Expected src to be an image.", + message: (src, typeofOptions, fullOptions) => `Expected \`src\` property for \`getImage\` or \`\` to be either an ESM imported image or a string with the path of a remote image. Received \`${src}\` (type: \`${typeofOptions}\`). + +Full serialized options received: \`${fullOptions}\`.`, + hint: "This error can often happen because of a wrong path. Make sure the path to your image is correct. If you're passing an async function, make sure to call and await it." +}; +const ExpectedImageOptions = { + name: "ExpectedImageOptions", + title: "Expected image options.", + message: (options) => `Expected getImage() parameter to be an object. Received \`${options}\`.` +}; +const IncompatibleDescriptorOptions = { + name: "IncompatibleDescriptorOptions", + title: "Cannot set both `densities` and `widths`", + message: "Only one of `densities` or `widths` can be specified. In most cases, you'll probably want to use only `widths` if you require specific widths.", + hint: "Those attributes are used to construct a `srcset` attribute, which cannot have both `x` and `w` descriptors." +}; +const LocalImageUsedWrongly = { + name: "LocalImageUsedWrongly", + title: "Local images must be imported.", + message: (imageFilePath) => `\`Image\`'s and \`getImage\`'s \`src\` parameter must be an imported image or an URL, it cannot be a string filepath. Received \`${imageFilePath}\`.`, + hint: "If you want to use an image from your `src` folder, you need to either import it or if the image is coming from a content collection, use the [image() schema helper](https://docs.astro.build/en/guides/images/#images-in-content-collections). See https://docs.astro.build/en/guides/images/#src-required for more information on the `src` property." +}; +const AstroGlobUsedOutside = { + name: "AstroGlobUsedOutside", + title: "Astro.glob() used outside of an Astro file.", + message: (globStr) => `\`Astro.glob(${globStr})\` can only be used in \`.astro\` files. \`import.meta.glob(${globStr})\` can be used instead to achieve a similar result.`, + hint: "See Vite's documentation on `import.meta.glob` for more information: https://vitejs.dev/guide/features.html#glob-import" +}; +const AstroGlobNoMatch = { + name: "AstroGlobNoMatch", + title: "Astro.glob() did not match any files.", + message: (globStr) => `\`Astro.glob(${globStr})\` did not return any matching files.`, + hint: "Check the pattern for typos." +}; +const MissingSharp = { + name: "MissingSharp", + title: "Could not find Sharp.", + message: "Could not find Sharp. Please install Sharp (`sharp`) manually into your project or migrate to another image service.", + hint: "See Sharp's installation instructions for more information: https://sharp.pixelplumbing.com/install. If you are not relying on `astro:assets` to optimize, transform, or process any images, you can configure a passthrough image service instead of installing Sharp. See https://docs.astro.build/en/reference/errors/missing-sharp for more information.\n\nSee https://docs.astro.build/en/guides/images/#default-image-service for more information on how to migrate to another image service." +}; +const MissingLocale = { + name: "MissingLocaleError", + title: "The provided locale does not exist.", + message: (locale) => `The locale/path \`${locale}\` does not exist in the configured \`i18n.locales\`.` +}; +const UnknownContentCollectionError = { + name: "UnknownContentCollectionError", + title: "Unknown Content Collection Error." +}; + +function validateArgs(args) { + if (args.length !== 3) + return false; + if (!args[0] || typeof args[0] !== "object") + return false; + return true; +} +function baseCreateComponent(cb, moduleId, propagation) { + const name = moduleId?.split("/").pop()?.replace(".astro", "") ?? ""; + const fn = (...args) => { + if (!validateArgs(args)) { + throw new AstroError({ + ...InvalidComponentArgs, + message: InvalidComponentArgs.message(name) + }); + } + return cb(...args); + }; + Object.defineProperty(fn, "name", { value: name, writable: false }); + fn.isAstroComponentFactory = true; + fn.moduleId = moduleId; + fn.propagation = propagation; + return fn; +} +function createComponentWithOptions(opts) { + const cb = baseCreateComponent(opts.factory, opts.moduleId, opts.propagation); + return cb; +} +function createComponent(arg1, moduleId, propagation) { + if (typeof arg1 === "function") { + return baseCreateComponent(arg1, moduleId, propagation); + } else { + return createComponentWithOptions(arg1); + } +} + +const ASTRO_VERSION = "4.4.4"; + +function createAstroGlobFn() { + const globHandler = (importMetaGlobResult) => { + if (typeof importMetaGlobResult === "string") { + throw new AstroError({ + ...AstroGlobUsedOutside, + message: AstroGlobUsedOutside.message(JSON.stringify(importMetaGlobResult)) + }); + } + let allEntries = [...Object.values(importMetaGlobResult)]; + if (allEntries.length === 0) { + throw new AstroError({ + ...AstroGlobNoMatch, + message: AstroGlobNoMatch.message(JSON.stringify(importMetaGlobResult)) + }); + } + return Promise.all(allEntries.map((fn) => fn())); + }; + return globHandler; +} +function createAstro(site) { + return { + site: site ? new URL(site) : void 0, + generator: `Astro v${ASTRO_VERSION}`, + glob: createAstroGlobFn() + }; +} + +function isPromise(value) { + return !!value && typeof value === "object" && typeof value.then === "function"; +} +async function* streamAsyncIterator(stream) { + const reader = stream.getReader(); + try { + while (true) { + const { done, value } = await reader.read(); + if (done) + return; + yield value; + } + } finally { + reader.releaseLock(); + } +} + +const escapeHTML = escape; +class HTMLBytes extends Uint8Array { +} +Object.defineProperty(HTMLBytes.prototype, Symbol.toStringTag, { + get() { + return "HTMLBytes"; + } +}); +class HTMLString extends String { + get [Symbol.toStringTag]() { + return "HTMLString"; + } +} +const markHTMLString = (value) => { + if (value instanceof HTMLString) { + return value; + } + if (typeof value === "string") { + return new HTMLString(value); + } + return value; +}; +function isHTMLString(value) { + return Object.prototype.toString.call(value) === "[object HTMLString]"; +} +function markHTMLBytes(bytes) { + return new HTMLBytes(bytes); +} +function hasGetReader(obj) { + return typeof obj.getReader === "function"; +} +async function* unescapeChunksAsync(iterable) { + if (hasGetReader(iterable)) { + for await (const chunk of streamAsyncIterator(iterable)) { + yield unescapeHTML(chunk); + } + } else { + for await (const chunk of iterable) { + yield unescapeHTML(chunk); + } + } +} +function* unescapeChunks(iterable) { + for (const chunk of iterable) { + yield unescapeHTML(chunk); + } +} +function unescapeHTML(str) { + if (!!str && typeof str === "object") { + if (str instanceof Uint8Array) { + return markHTMLBytes(str); + } else if (str instanceof Response && str.body) { + const body = str.body; + return unescapeChunksAsync(body); + } else if (typeof str.then === "function") { + return Promise.resolve(str).then((value) => { + return unescapeHTML(value); + }); + } else if (Symbol.iterator in str) { + return unescapeChunks(str); + } else if (Symbol.asyncIterator in str || hasGetReader(str)) { + return unescapeChunksAsync(str); + } + } + return markHTMLString(str); +} + +const RenderInstructionSymbol = Symbol.for("astro:render"); +function createRenderInstruction(instruction) { + return Object.defineProperty(instruction, RenderInstructionSymbol, { + value: true + }); +} +function isRenderInstruction(chunk) { + return chunk && typeof chunk === "object" && chunk[RenderInstructionSymbol]; +} + +const PROP_TYPE = { + Value: 0, + JSON: 1, + // Actually means Array + RegExp: 2, + Date: 3, + Map: 4, + Set: 5, + BigInt: 6, + URL: 7, + Uint8Array: 8, + Uint16Array: 9, + Uint32Array: 10 +}; +function serializeArray(value, metadata = {}, parents = /* @__PURE__ */ new WeakSet()) { + if (parents.has(value)) { + throw new Error(`Cyclic reference detected while serializing props for <${metadata.displayName} client:${metadata.hydrate}>! + +Cyclic references cannot be safely serialized for client-side usage. Please remove the cyclic reference.`); + } + parents.add(value); + const serialized = value.map((v) => { + return convertToSerializedForm(v, metadata, parents); + }); + parents.delete(value); + return serialized; +} +function serializeObject(value, metadata = {}, parents = /* @__PURE__ */ new WeakSet()) { + if (parents.has(value)) { + throw new Error(`Cyclic reference detected while serializing props for <${metadata.displayName} client:${metadata.hydrate}>! + +Cyclic references cannot be safely serialized for client-side usage. Please remove the cyclic reference.`); + } + parents.add(value); + const serialized = Object.fromEntries( + Object.entries(value).map(([k, v]) => { + return [k, convertToSerializedForm(v, metadata, parents)]; + }) + ); + parents.delete(value); + return serialized; +} +function convertToSerializedForm(value, metadata = {}, parents = /* @__PURE__ */ new WeakSet()) { + const tag = Object.prototype.toString.call(value); + switch (tag) { + case "[object Date]": { + return [PROP_TYPE.Date, value.toISOString()]; + } + case "[object RegExp]": { + return [PROP_TYPE.RegExp, value.source]; + } + case "[object Map]": { + return [PROP_TYPE.Map, serializeArray(Array.from(value), metadata, parents)]; + } + case "[object Set]": { + return [PROP_TYPE.Set, serializeArray(Array.from(value), metadata, parents)]; + } + case "[object BigInt]": { + return [PROP_TYPE.BigInt, value.toString()]; + } + case "[object URL]": { + return [PROP_TYPE.URL, value.toString()]; + } + case "[object Array]": { + return [PROP_TYPE.JSON, serializeArray(value, metadata, parents)]; + } + case "[object Uint8Array]": { + return [PROP_TYPE.Uint8Array, Array.from(value)]; + } + case "[object Uint16Array]": { + return [PROP_TYPE.Uint16Array, Array.from(value)]; + } + case "[object Uint32Array]": { + return [PROP_TYPE.Uint32Array, Array.from(value)]; + } + default: { + if (value !== null && typeof value === "object") { + return [PROP_TYPE.Value, serializeObject(value, metadata, parents)]; + } else if (value === void 0) { + return [PROP_TYPE.Value]; + } else { + return [PROP_TYPE.Value, value]; + } + } + } +} +function serializeProps(props, metadata) { + const serialized = JSON.stringify(serializeObject(props, metadata)); + return serialized; +} + +const transitionDirectivesToCopyOnIsland = Object.freeze([ + "data-astro-transition-scope", + "data-astro-transition-persist" +]); +function extractDirectives(inputProps, clientDirectives) { + let extracted = { + isPage: false, + hydration: null, + props: {}, + propsWithoutTransitionAttributes: {} + }; + for (const [key, value] of Object.entries(inputProps)) { + if (key.startsWith("server:")) { + if (key === "server:root") { + extracted.isPage = true; + } + } + if (key.startsWith("client:")) { + if (!extracted.hydration) { + extracted.hydration = { + directive: "", + value: "", + componentUrl: "", + componentExport: { value: "" } + }; + } + switch (key) { + case "client:component-path": { + extracted.hydration.componentUrl = value; + break; + } + case "client:component-export": { + extracted.hydration.componentExport.value = value; + break; + } + case "client:component-hydration": { + break; + } + case "client:display-name": { + break; + } + default: { + extracted.hydration.directive = key.split(":")[1]; + extracted.hydration.value = value; + if (!clientDirectives.has(extracted.hydration.directive)) { + const hydrationMethods = Array.from(clientDirectives.keys()).map((d) => `client:${d}`).join(", "); + throw new Error( + `Error: invalid hydration directive "${key}". Supported hydration methods: ${hydrationMethods}` + ); + } + if (extracted.hydration.directive === "media" && typeof extracted.hydration.value !== "string") { + throw new AstroError(MissingMediaQueryDirective); + } + break; + } + } + } else { + extracted.props[key] = value; + if (!transitionDirectivesToCopyOnIsland.includes(key)) { + extracted.propsWithoutTransitionAttributes[key] = value; + } + } + } + for (const sym of Object.getOwnPropertySymbols(inputProps)) { + extracted.props[sym] = inputProps[sym]; + extracted.propsWithoutTransitionAttributes[sym] = inputProps[sym]; + } + return extracted; +} +async function generateHydrateScript(scriptOptions, metadata) { + const { renderer, result, astroId, props, attrs } = scriptOptions; + const { hydrate, componentUrl, componentExport } = metadata; + if (!componentExport.value) { + throw new AstroError({ + ...NoMatchingImport, + message: NoMatchingImport.message(metadata.displayName) + }); + } + const island = { + children: "", + props: { + // This is for HMR, probably can avoid it in prod + uid: astroId + } + }; + if (attrs) { + for (const [key, value] of Object.entries(attrs)) { + island.props[key] = escapeHTML(value); + } + } + island.props["component-url"] = await result.resolve(decodeURI(componentUrl)); + if (renderer.clientEntrypoint) { + island.props["component-export"] = componentExport.value; + island.props["renderer-url"] = await result.resolve(decodeURI(renderer.clientEntrypoint)); + island.props["props"] = escapeHTML(serializeProps(props, metadata)); + } + island.props["ssr"] = ""; + island.props["client"] = hydrate; + let beforeHydrationUrl = await result.resolve("astro:scripts/before-hydration.js"); + if (beforeHydrationUrl.length) { + island.props["before-hydration-url"] = beforeHydrationUrl; + } + island.props["opts"] = escapeHTML( + JSON.stringify({ + name: metadata.displayName, + value: metadata.hydrateArgs || "" + }) + ); + transitionDirectivesToCopyOnIsland.forEach((name) => { + if (props[name]) { + island.props[name] = props[name]; + } + }); + return island; +} + +/** + * shortdash - https://github.com/bibig/node-shorthash + * + * @license + * + * (The MIT License) + * + * Copyright (c) 2013 Bibig + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +const dictionary = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY"; +const binary = dictionary.length; +function bitwise(str) { + let hash = 0; + if (str.length === 0) + return hash; + for (let i = 0; i < str.length; i++) { + const ch = str.charCodeAt(i); + hash = (hash << 5) - hash + ch; + hash = hash & hash; + } + return hash; +} +function shorthash(text) { + let num; + let result = ""; + let integer = bitwise(text); + const sign = integer < 0 ? "Z" : ""; + integer = Math.abs(integer); + while (integer >= binary) { + num = integer % binary; + integer = Math.floor(integer / binary); + result = dictionary[num] + result; + } + if (integer > 0) { + result = dictionary[integer] + result; + } + return sign + result; +} + +function isAstroComponentFactory(obj) { + return obj == null ? false : obj.isAstroComponentFactory === true; +} +function isAPropagatingComponent(result, factory) { + let hint = factory.propagation || "none"; + if (factory.moduleId && result.componentMetadata.has(factory.moduleId) && hint === "none") { + hint = result.componentMetadata.get(factory.moduleId).propagation; + } + return hint === "in-tree" || hint === "self"; +} + +const headAndContentSym = Symbol.for("astro.headAndContent"); +function isHeadAndContent(obj) { + return typeof obj === "object" && !!obj[headAndContentSym]; +} +function createHeadAndContent(head, content) { + return { + [headAndContentSym]: true, + head, + content + }; +} + +var astro_island_prebuilt_default = `(()=>{var v=Object.defineProperty;var A=(c,s,a)=>s in c?v(c,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):c[s]=a;var d=(c,s,a)=>(A(c,typeof s!="symbol"?s+"":s,a),a);var u;{let c={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t)},s=t=>{let[e,n]=t;return e in c?c[e](n):void 0},a=t=>t.map(s),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([e,n])=>[e,s(n)]));customElements.get("astro-island")||customElements.define("astro-island",(u=class extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var f;if(!this.hydrator||!this.isConnected)return;let e=(f=this.parentElement)==null?void 0:f.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let n=this.querySelectorAll("astro-slot"),r={},l=this.querySelectorAll("template[data-astro-template]");for(let o of l){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(r[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of n){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(r[o.getAttribute("name")||"default"]=o.innerHTML)}let h;try{h=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(o){let i=this.getAttribute("component-url")||"",b=this.getAttribute("component-export");throw b&&(i+=\` (export \${b})\`),console.error(\`[hydrate] Error parsing props for component \${i}\`,this.getAttribute("props"),o),o}let p;await this.hydrator(this)(this.Component,h,r,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),n.disconnect(),this.childrenConnectedCallback()},n=new MutationObserver(()=>{var r;((r=this.lastChild)==null?void 0:r.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});n.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),n=this.getAttribute("client");if(Astro[n]===void 0){window.addEventListener(\`astro:\${n}\`,()=>this.start(),{once:!0});return}try{await Astro[n](async()=>{let r=this.getAttribute("renderer-url"),[l,{default:h}]=await Promise.all([import(this.getAttribute("component-url")),r?import(r):()=>()=>{}]),p=this.getAttribute("component-export")||"default";if(!p.includes("."))this.Component=l[p];else{this.Component=l;for(let y of p.split("."))this.Component=this.Component[y]}return this.hydrator=h,this.hydrate},e,this)}catch(r){console.error(\`[astro-island] Error hydrating \${this.getAttribute("component-url")}\`,r)}}attributeChangedCallback(){this.hydrate()}},d(u,"observedAttributes",["props"]),u))}})();`; + +var astro_island_prebuilt_dev_default = `(()=>{var v=Object.defineProperty;var A=(c,s,a)=>s in c?v(c,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):c[s]=a;var l=(c,s,a)=>(A(c,typeof s!="symbol"?s+"":s,a),a);var m;{let c={0:t=>y(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t)},s=t=>{let[e,n]=t;return e in c?c[e](n):void 0},a=t=>t.map(s),y=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([e,n])=>[e,s(n)]));customElements.get("astro-island")||customElements.define("astro-island",(m=class extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var f;if(!this.hydrator||!this.isConnected)return;let e=(f=this.parentElement)==null?void 0:f.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let n=this.querySelectorAll("astro-slot"),r={},h=this.querySelectorAll("template[data-astro-template]");for(let o of h){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(r[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of n){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(r[o.getAttribute("name")||"default"]=o.innerHTML)}let p;try{p=this.hasAttribute("props")?y(JSON.parse(this.getAttribute("props"))):{}}catch(o){let i=this.getAttribute("component-url")||"",b=this.getAttribute("component-export");throw b&&(i+=\` (export \${b})\`),console.error(\`[hydrate] Error parsing props for component \${i}\`,this.getAttribute("props"),o),o}let d,u=this.hydrator(this);d=performance.now(),await u(this.Component,p,r,{client:this.getAttribute("client")}),d&&this.setAttribute("client-render-time",(performance.now()-d).toString()),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),n.disconnect(),this.childrenConnectedCallback()},n=new MutationObserver(()=>{var r;((r=this.lastChild)==null?void 0:r.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});n.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),n=this.getAttribute("client");if(Astro[n]===void 0){window.addEventListener(\`astro:\${n}\`,()=>this.start(),{once:!0});return}try{await Astro[n](async()=>{let r=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),r?import(r):()=>()=>{}]),d=this.getAttribute("component-export")||"default";if(!d.includes("."))this.Component=h[d];else{this.Component=h;for(let u of d.split("."))this.Component=this.Component[u]}return this.hydrator=p,this.hydrate},e,this)}catch(r){console.error(\`[astro-island] Error hydrating \${this.getAttribute("component-url")}\`,r)}}attributeChangedCallback(){this.hydrate()}},l(m,"observedAttributes",["props"]),m))}})();`; + +const ISLAND_STYLES = ``; +function determineIfNeedsHydrationScript(result) { + if (result._metadata.hasHydrationScript) { + return false; + } + return result._metadata.hasHydrationScript = true; +} +function determinesIfNeedsDirectiveScript(result, directive) { + if (result._metadata.hasDirectives.has(directive)) { + return false; + } + result._metadata.hasDirectives.add(directive); + return true; +} +function getDirectiveScriptText(result, directive) { + const clientDirectives = result.clientDirectives; + const clientDirective = clientDirectives.get(directive); + if (!clientDirective) { + throw new Error(`Unknown directive: ${directive}`); + } + return clientDirective; +} +function getPrescripts(result, type, directive) { + switch (type) { + case "both": + return `${ISLAND_STYLES}`; + case "directive": + return ``; + } + return ""; +} + +const voidElementNames = /^(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i; +const htmlBooleanAttributes = /^(?:allowfullscreen|async|autofocus|autoplay|controls|default|defer|disabled|disablepictureinpicture|disableremoteplayback|formnovalidate|hidden|loop|nomodule|novalidate|open|playsinline|readonly|required|reversed|scoped|seamless|itemscope)$/i; +const htmlEnumAttributes = /^(?:contenteditable|draggable|spellcheck|value)$/i; +const svgEnumAttributes = /^(?:autoReverse|externalResourcesRequired|focusable|preserveAlpha)$/i; +const STATIC_DIRECTIVES = /* @__PURE__ */ new Set(["set:html", "set:text"]); +const toIdent = (k) => k.trim().replace(/(?!^)\b\w|\s+|\W+/g, (match, index) => { + if (/\W/.test(match)) + return ""; + return index === 0 ? match : match.toUpperCase(); +}); +const toAttributeString = (value, shouldEscape = true) => shouldEscape ? String(value).replace(/&/g, "&").replace(/"/g, """) : value; +const kebab = (k) => k.toLowerCase() === k ? k : k.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`); +const toStyleString = (obj) => Object.entries(obj).filter(([_, v]) => typeof v === "string" && v.trim() || typeof v === "number").map(([k, v]) => { + if (k[0] !== "-" && k[1] !== "-") + return `${kebab(k)}:${v}`; + return `${k}:${v}`; +}).join(";"); +function defineScriptVars(vars) { + let output = ""; + for (const [key, value] of Object.entries(vars)) { + output += `const ${toIdent(key)} = ${JSON.stringify(value)?.replace( + /<\/script>/g, + "\\x3C/script>" + )}; +`; + } + return markHTMLString(output); +} +function formatList(values) { + if (values.length === 1) { + return values[0]; + } + return `${values.slice(0, -1).join(", ")} or ${values[values.length - 1]}`; +} +function addAttribute(value, key, shouldEscape = true) { + if (value == null) { + return ""; + } + if (value === false) { + if (htmlEnumAttributes.test(key) || svgEnumAttributes.test(key)) { + return markHTMLString(` ${key}="false"`); + } + return ""; + } + if (STATIC_DIRECTIVES.has(key)) { + console.warn(`[astro] The "${key}" directive cannot be applied dynamically at runtime. It will not be rendered as an attribute. + +Make sure to use the static attribute syntax (\`${key}={value}\`) instead of the dynamic spread syntax (\`{...{ "${key}": value }}\`).`); + return ""; + } + if (key === "class:list") { + const listValue = toAttributeString(clsx(value), shouldEscape); + if (listValue === "") { + return ""; + } + return markHTMLString(` ${key.slice(0, -5)}="${listValue}"`); + } + if (key === "style" && !(value instanceof HTMLString)) { + if (Array.isArray(value) && value.length === 2) { + return markHTMLString( + ` ${key}="${toAttributeString(`${toStyleString(value[0])};${value[1]}`, shouldEscape)}"` + ); + } + if (typeof value === "object") { + return markHTMLString(` ${key}="${toAttributeString(toStyleString(value), shouldEscape)}"`); + } + } + if (key === "className") { + return markHTMLString(` class="${toAttributeString(value, shouldEscape)}"`); + } + if (value === true && (key.startsWith("data-") || htmlBooleanAttributes.test(key))) { + return markHTMLString(` ${key}`); + } else { + return markHTMLString(` ${key}="${toAttributeString(value, shouldEscape)}"`); + } +} +function internalSpreadAttributes(values, shouldEscape = true) { + let output = ""; + for (const [key, value] of Object.entries(values)) { + output += addAttribute(value, key, shouldEscape); + } + return markHTMLString(output); +} +function renderElement$1(name, { props: _props, children = "" }, shouldEscape = true) { + const { lang: _, "data-astro-id": astroId, "define:vars": defineVars, ...props } = _props; + if (defineVars) { + if (name === "style") { + delete props["is:global"]; + delete props["is:scoped"]; + } + if (name === "script") { + delete props.hoist; + children = defineScriptVars(defineVars) + "\n" + children; + } + } + if ((children == null || children == "") && voidElementNames.test(name)) { + return `<${name}${internalSpreadAttributes(props, shouldEscape)} />`; + } + return `<${name}${internalSpreadAttributes(props, shouldEscape)}>${children}`; +} +function renderToBufferDestination(bufferRenderFunction) { + const bufferChunks = []; + const bufferDestination = { + write: (chunk) => bufferChunks.push(chunk) + }; + const renderPromise = bufferRenderFunction(bufferDestination); + return { + async renderToFinalDestination(destination) { + for (const chunk of bufferChunks) { + destination.write(chunk); + } + bufferDestination.write = (chunk) => destination.write(chunk); + await renderPromise; + } + }; +} +typeof process !== "undefined" && Object.prototype.toString.call(process) === "[object process]"; + +const uniqueElements = (item, index, all) => { + const props = JSON.stringify(item.props); + const children = item.children; + return index === all.findIndex((i) => JSON.stringify(i.props) === props && i.children == children); +}; +function renderAllHeadContent(result) { + result._metadata.hasRenderedHead = true; + const styles = Array.from(result.styles).filter(uniqueElements).map( + (style) => style.props.rel === "stylesheet" ? renderElement$1("link", style) : renderElement$1("style", style) + ); + result.styles.clear(); + const scripts = Array.from(result.scripts).filter(uniqueElements).map((script) => { + return renderElement$1("script", script, false); + }); + const links = Array.from(result.links).filter(uniqueElements).map((link) => renderElement$1("link", link, false)); + let content = styles.join("\n") + links.join("\n") + scripts.join("\n"); + if (result._metadata.extraHead.length > 0) { + for (const part of result._metadata.extraHead) { + content += part; + } + } + return markHTMLString(content); +} +function* renderHead() { + yield createRenderInstruction({ type: "head" }); +} +function* maybeRenderHead() { + yield createRenderInstruction({ type: "maybe-head" }); +} + +const slotString = Symbol.for("astro:slot-string"); +class SlotString extends HTMLString { + instructions; + [slotString]; + constructor(content, instructions) { + super(content); + this.instructions = instructions; + this[slotString] = true; + } +} +function isSlotString(str) { + return !!str[slotString]; +} +function renderSlot(result, slotted, fallback) { + if (!slotted && fallback) { + return renderSlot(result, fallback); + } + return { + async render(destination) { + await renderChild(destination, typeof slotted === "function" ? slotted(result) : slotted); + } + }; +} +async function renderSlotToString(result, slotted, fallback) { + let content = ""; + let instructions = null; + const temporaryDestination = { + write(chunk) { + if (chunk instanceof Response) + return; + if (typeof chunk === "object" && "type" in chunk && typeof chunk.type === "string") { + if (instructions === null) { + instructions = []; + } + instructions.push(chunk); + } else { + content += chunkToString(result, chunk); + } + } + }; + const renderInstance = renderSlot(result, slotted, fallback); + await renderInstance.render(temporaryDestination); + return markHTMLString(new SlotString(content, instructions)); +} +async function renderSlots(result, slots = {}) { + let slotInstructions = null; + let children = {}; + if (slots) { + await Promise.all( + Object.entries(slots).map( + ([key, value]) => renderSlotToString(result, value).then((output) => { + if (output.instructions) { + if (slotInstructions === null) { + slotInstructions = []; + } + slotInstructions.push(...output.instructions); + } + children[key] = output; + }) + ) + ); + } + return { slotInstructions, children }; +} + +const Fragment = Symbol.for("astro:fragment"); +const Renderer = Symbol.for("astro:renderer"); +new TextEncoder(); +const decoder = new TextDecoder(); +function stringifyChunk(result, chunk) { + if (isRenderInstruction(chunk)) { + const instruction = chunk; + switch (instruction.type) { + case "directive": { + const { hydration } = instruction; + let needsHydrationScript = hydration && determineIfNeedsHydrationScript(result); + let needsDirectiveScript = hydration && determinesIfNeedsDirectiveScript(result, hydration.directive); + let prescriptType = needsHydrationScript ? "both" : needsDirectiveScript ? "directive" : null; + if (prescriptType) { + let prescripts = getPrescripts(result, prescriptType, hydration.directive); + return markHTMLString(prescripts); + } else { + return ""; + } + } + case "head": { + if (result._metadata.hasRenderedHead || result.partial) { + return ""; + } + return renderAllHeadContent(result); + } + case "maybe-head": { + if (result._metadata.hasRenderedHead || result._metadata.headInTree || result.partial) { + return ""; + } + return renderAllHeadContent(result); + } + case "renderer-hydration-script": { + const { rendererSpecificHydrationScripts } = result._metadata; + const { rendererName } = instruction; + if (!rendererSpecificHydrationScripts.has(rendererName)) { + rendererSpecificHydrationScripts.add(rendererName); + return instruction.render(); + } + return ""; + } + default: { + throw new Error(`Unknown chunk type: ${chunk.type}`); + } + } + } else if (chunk instanceof Response) { + return ""; + } else if (isSlotString(chunk)) { + let out = ""; + const c = chunk; + if (c.instructions) { + for (const instr of c.instructions) { + out += stringifyChunk(result, instr); + } + } + out += chunk.toString(); + return out; + } + return chunk.toString(); +} +function chunkToString(result, chunk) { + if (ArrayBuffer.isView(chunk)) { + return decoder.decode(chunk); + } else { + return stringifyChunk(result, chunk); + } +} +function isRenderInstance(obj) { + return !!obj && typeof obj === "object" && "render" in obj && typeof obj.render === "function"; +} + +async function renderChild(destination, child) { + child = await child; + if (child instanceof SlotString) { + destination.write(child); + } else if (isHTMLString(child)) { + destination.write(child); + } else if (Array.isArray(child)) { + const childRenders = child.map((c) => { + return renderToBufferDestination((bufferDestination) => { + return renderChild(bufferDestination, c); + }); + }); + for (const childRender of childRenders) { + if (!childRender) + continue; + await childRender.renderToFinalDestination(destination); + } + } else if (typeof child === "function") { + await renderChild(destination, child()); + } else if (typeof child === "string") { + destination.write(markHTMLString(escapeHTML(child))); + } else if (!child && child !== 0) ; else if (isRenderInstance(child)) { + await child.render(destination); + } else if (isRenderTemplateResult(child)) { + await child.render(destination); + } else if (isAstroComponentInstance(child)) { + await child.render(destination); + } else if (ArrayBuffer.isView(child)) { + destination.write(child); + } else if (typeof child === "object" && (Symbol.asyncIterator in child || Symbol.iterator in child)) { + for await (const value of child) { + await renderChild(destination, value); + } + } else { + destination.write(child); + } +} + +const astroComponentInstanceSym = Symbol.for("astro.componentInstance"); +class AstroComponentInstance { + [astroComponentInstanceSym] = true; + result; + props; + slotValues; + factory; + returnValue; + constructor(result, props, slots, factory) { + this.result = result; + this.props = props; + this.factory = factory; + this.slotValues = {}; + for (const name in slots) { + let didRender = false; + let value = slots[name](result); + this.slotValues[name] = () => { + if (!didRender) { + didRender = true; + return value; + } + return slots[name](result); + }; + } + } + async init(result) { + if (this.returnValue !== void 0) + return this.returnValue; + this.returnValue = this.factory(result, this.props, this.slotValues); + return this.returnValue; + } + async render(destination) { + if (this.returnValue === void 0) { + await this.init(this.result); + } + let value = this.returnValue; + if (isPromise(value)) { + value = await value; + } + if (isHeadAndContent(value)) { + await value.content.render(destination); + } else { + await renderChild(destination, value); + } + } +} +function validateComponentProps(props, displayName) { + if (props != null) { + for (const prop of Object.keys(props)) { + if (prop.startsWith("client:")) { + console.warn( + `You are attempting to render <${displayName} ${prop} />, but ${displayName} is an Astro component. Astro components do not render in the client and should not have a hydration directive. Please use a framework component for client rendering.` + ); + } + } + } +} +function createAstroComponentInstance(result, displayName, factory, props, slots = {}) { + validateComponentProps(props, displayName); + const instance = new AstroComponentInstance(result, props, slots, factory); + if (isAPropagatingComponent(result, factory)) { + result._metadata.propagators.add(instance); + } + return instance; +} +function isAstroComponentInstance(obj) { + return typeof obj === "object" && !!obj[astroComponentInstanceSym]; +} + +const renderTemplateResultSym = Symbol.for("astro.renderTemplateResult"); +class RenderTemplateResult { + [renderTemplateResultSym] = true; + htmlParts; + expressions; + error; + constructor(htmlParts, expressions) { + this.htmlParts = htmlParts; + this.error = void 0; + this.expressions = expressions.map((expression) => { + if (isPromise(expression)) { + return Promise.resolve(expression).catch((err) => { + if (!this.error) { + this.error = err; + throw err; + } + }); + } + return expression; + }); + } + async render(destination) { + const expRenders = this.expressions.map((exp) => { + return renderToBufferDestination((bufferDestination) => { + if (exp || exp === 0) { + return renderChild(bufferDestination, exp); + } + }); + }); + for (let i = 0; i < this.htmlParts.length; i++) { + const html = this.htmlParts[i]; + const expRender = expRenders[i]; + destination.write(markHTMLString(html)); + if (expRender) { + await expRender.renderToFinalDestination(destination); + } + } + } +} +function isRenderTemplateResult(obj) { + return typeof obj === "object" && !!obj[renderTemplateResultSym]; +} +function renderTemplate(htmlParts, ...expressions) { + return new RenderTemplateResult(htmlParts, expressions); +} + +const DOCTYPE_EXP = /" : "\n"; + str += doctype; + } + } + if (chunk instanceof Response) + return; + str += chunkToString(result, chunk); + } + }; + await templateResult.render(destination); + return str; +} +async function callComponentAsTemplateResultOrResponse(result, componentFactory, props, children, route) { + const factoryResult = await componentFactory(result, props, children); + if (factoryResult instanceof Response) { + return factoryResult; + } else if (!isRenderTemplateResult(factoryResult)) { + throw new AstroError({ + ...OnlyResponseCanBeReturned, + message: OnlyResponseCanBeReturned.message(route?.route, typeof factoryResult), + location: { + file: route?.component + } + }); + } + return isHeadAndContent(factoryResult) ? factoryResult.content : factoryResult; +} + +function componentIsHTMLElement(Component) { + return typeof HTMLElement !== "undefined" && HTMLElement.isPrototypeOf(Component); +} +async function renderHTMLElement(result, constructor, props, slots) { + const name = getHTMLElementName(constructor); + let attrHTML = ""; + for (const attr in props) { + attrHTML += ` ${attr}="${toAttributeString(await props[attr])}"`; + } + return markHTMLString( + `<${name}${attrHTML}>${await renderSlotToString(result, slots?.default)}` + ); +} +function getHTMLElementName(constructor) { + const definedName = customElements.getName(constructor); + if (definedName) + return definedName; + const assignedName = constructor.name.replace(/^HTML|Element$/g, "").replace(/[A-Z]/g, "-$&").toLowerCase().replace(/^-/, "html-"); + return assignedName; +} + +const needsHeadRenderingSymbol = Symbol.for("astro.needsHeadRendering"); +const rendererAliases = /* @__PURE__ */ new Map([["solid", "solid-js"]]); +function guessRenderers(componentUrl) { + const extname = componentUrl?.split(".").pop(); + switch (extname) { + case "svelte": + return ["@astrojs/svelte"]; + case "vue": + return ["@astrojs/vue"]; + case "jsx": + case "tsx": + return ["@astrojs/react", "@astrojs/preact", "@astrojs/solid-js", "@astrojs/vue (jsx)"]; + default: + return [ + "@astrojs/react", + "@astrojs/preact", + "@astrojs/solid-js", + "@astrojs/vue", + "@astrojs/svelte", + "@astrojs/lit" + ]; + } +} +function isFragmentComponent(Component) { + return Component === Fragment; +} +function isHTMLComponent(Component) { + return Component && Component["astro:html"] === true; +} +const ASTRO_SLOT_EXP = /<\/?astro-slot\b[^>]*>/g; +const ASTRO_STATIC_SLOT_EXP = /<\/?astro-static-slot\b[^>]*>/g; +function removeStaticAstroSlot(html, supportsAstroStaticSlot) { + const exp = supportsAstroStaticSlot ? ASTRO_STATIC_SLOT_EXP : ASTRO_SLOT_EXP; + return html.replace(exp, ""); +} +async function renderFrameworkComponent(result, displayName, Component, _props, slots = {}) { + if (!Component && !_props["client:only"]) { + throw new Error( + `Unable to render ${displayName} because it is ${Component}! +Did you forget to import the component or is it possible there is a typo?` + ); + } + const { renderers, clientDirectives } = result; + const metadata = { + astroStaticSlot: true, + displayName + }; + const { hydration, isPage, props, propsWithoutTransitionAttributes } = extractDirectives( + _props, + clientDirectives + ); + let html = ""; + let attrs = void 0; + if (hydration) { + metadata.hydrate = hydration.directive; + metadata.hydrateArgs = hydration.value; + metadata.componentExport = hydration.componentExport; + metadata.componentUrl = hydration.componentUrl; + } + const probableRendererNames = guessRenderers(metadata.componentUrl); + const validRenderers = renderers.filter((r) => r.name !== "astro:jsx"); + const { children, slotInstructions } = await renderSlots(result, slots); + let renderer; + if (metadata.hydrate !== "only") { + let isTagged = false; + try { + isTagged = Component && Component[Renderer]; + } catch { + } + if (isTagged) { + const rendererName = Component[Renderer]; + renderer = renderers.find(({ name }) => name === rendererName); + } + if (!renderer) { + let error; + for (const r of renderers) { + try { + if (await r.ssr.check.call({ result }, Component, props, children)) { + renderer = r; + break; + } + } catch (e) { + error ??= e; + } + } + if (!renderer && error) { + throw error; + } + } + if (!renderer && typeof HTMLElement === "function" && componentIsHTMLElement(Component)) { + const output = await renderHTMLElement( + result, + Component, + _props, + slots + ); + return { + render(destination) { + destination.write(output); + } + }; + } + } else { + if (metadata.hydrateArgs) { + const passedName = metadata.hydrateArgs; + const rendererName = rendererAliases.has(passedName) ? rendererAliases.get(passedName) : passedName; + renderer = renderers.find( + ({ name }) => name === `@astrojs/${rendererName}` || name === rendererName + ); + } + if (!renderer && validRenderers.length === 1) { + renderer = validRenderers[0]; + } + if (!renderer) { + const extname = metadata.componentUrl?.split(".").pop(); + renderer = renderers.filter( + ({ name }) => name === `@astrojs/${extname}` || name === extname + )[0]; + } + } + let componentServerRenderEndTime; + if (!renderer) { + if (metadata.hydrate === "only") { + throw new AstroError({ + ...NoClientOnlyHint, + message: NoClientOnlyHint.message(metadata.displayName), + hint: NoClientOnlyHint.hint( + probableRendererNames.map((r) => r.replace("@astrojs/", "")).join("|") + ) + }); + } else if (typeof Component !== "string") { + const matchingRenderers = validRenderers.filter( + (r) => probableRendererNames.includes(r.name) + ); + const plural = validRenderers.length > 1; + if (matchingRenderers.length === 0) { + throw new AstroError({ + ...NoMatchingRenderer, + message: NoMatchingRenderer.message( + metadata.displayName, + metadata?.componentUrl?.split(".").pop(), + plural, + validRenderers.length + ), + hint: NoMatchingRenderer.hint( + formatList(probableRendererNames.map((r) => "`" + r + "`")) + ) + }); + } else if (matchingRenderers.length === 1) { + renderer = matchingRenderers[0]; + ({ html, attrs } = await renderer.ssr.renderToStaticMarkup.call( + { result }, + Component, + propsWithoutTransitionAttributes, + children, + metadata + )); + } else { + throw new Error(`Unable to render ${metadata.displayName}! + +This component likely uses ${formatList(probableRendererNames)}, +but Astro encountered an error during server-side rendering. + +Please ensure that ${metadata.displayName}: +1. Does not unconditionally access browser-specific globals like \`window\` or \`document\`. + If this is unavoidable, use the \`client:only\` hydration directive. +2. Does not conditionally return \`null\` or \`undefined\` when rendered on the server. + +If you're still stuck, please open an issue on GitHub or join us at https://astro.build/chat.`); + } + } + } else { + if (metadata.hydrate === "only") { + html = await renderSlotToString(result, slots?.fallback); + } else { + const componentRenderStartTime = performance.now(); + ({ html, attrs } = await renderer.ssr.renderToStaticMarkup.call( + { result }, + Component, + propsWithoutTransitionAttributes, + children, + metadata + )); + if (process.env.NODE_ENV === "development") + componentServerRenderEndTime = performance.now() - componentRenderStartTime; + } + } + if (renderer && !renderer.clientEntrypoint && renderer.name !== "@astrojs/lit" && metadata.hydrate) { + throw new AstroError({ + ...NoClientEntrypoint, + message: NoClientEntrypoint.message( + displayName, + metadata.hydrate, + renderer.name + ) + }); + } + if (!html && typeof Component === "string") { + const Tag = sanitizeElementName(Component); + const childSlots = Object.values(children).join(""); + const renderTemplateResult = renderTemplate`<${Tag}${internalSpreadAttributes( + props + )}${markHTMLString( + childSlots === "" && voidElementNames.test(Tag) ? `/>` : `>${childSlots}` + )}`; + html = ""; + const destination = { + write(chunk) { + if (chunk instanceof Response) + return; + html += chunkToString(result, chunk); + } + }; + await renderTemplateResult.render(destination); + } + if (!hydration) { + return { + render(destination) { + if (slotInstructions) { + for (const instruction of slotInstructions) { + destination.write(instruction); + } + } + if (isPage || renderer?.name === "astro:jsx") { + destination.write(html); + } else if (html && html.length > 0) { + destination.write( + markHTMLString( + removeStaticAstroSlot(html, renderer?.ssr?.supportsAstroStaticSlot ?? false) + ) + ); + } + } + }; + } + const astroId = shorthash( + ` +${html} +${serializeProps( + props, + metadata + )}` + ); + const island = await generateHydrateScript( + { renderer, result, astroId, props, attrs }, + metadata + ); + if (componentServerRenderEndTime && process.env.NODE_ENV === "development") + island.props["server-render-time"] = componentServerRenderEndTime; + let unrenderedSlots = []; + if (html) { + if (Object.keys(children).length > 0) { + for (const key of Object.keys(children)) { + let tagName = renderer?.ssr?.supportsAstroStaticSlot ? !!metadata.hydrate ? "astro-slot" : "astro-static-slot" : "astro-slot"; + let expectedHTML = key === "default" ? `<${tagName}>` : `<${tagName} name="${key}">`; + if (!html.includes(expectedHTML)) { + unrenderedSlots.push(key); + } + } + } + } else { + unrenderedSlots = Object.keys(children); + } + const template = unrenderedSlots.length > 0 ? unrenderedSlots.map( + (key) => `` + ).join("") : ""; + island.children = `${html ?? ""}${template}`; + if (island.children) { + island.props["await-children"] = ""; + island.children += ``; + } + return { + render(destination) { + if (slotInstructions) { + for (const instruction of slotInstructions) { + destination.write(instruction); + } + } + destination.write(createRenderInstruction({ type: "directive", hydration })); + if (hydration.directive !== "only" && renderer?.ssr.renderHydrationScript) { + destination.write( + createRenderInstruction({ + type: "renderer-hydration-script", + rendererName: renderer.name, + render: renderer.ssr.renderHydrationScript + }) + ); + } + destination.write(markHTMLString(renderElement$1("astro-island", island, false))); + } + }; +} +function sanitizeElementName(tag) { + const unsafe = /[&<>'"\s]+/; + if (!unsafe.test(tag)) + return tag; + return tag.trim().split(unsafe)[0].trim(); +} +async function renderFragmentComponent(result, slots = {}) { + const children = await renderSlotToString(result, slots?.default); + return { + render(destination) { + if (children == null) + return; + destination.write(children); + } + }; +} +async function renderHTMLComponent(result, Component, _props, slots = {}) { + const { slotInstructions, children } = await renderSlots(result, slots); + const html = Component({ slots: children }); + const hydrationHtml = slotInstructions ? slotInstructions.map((instr) => chunkToString(result, instr)).join("") : ""; + return { + render(destination) { + destination.write(markHTMLString(hydrationHtml + html)); + } + }; +} +function renderAstroComponent(result, displayName, Component, props, slots = {}) { + const instance = createAstroComponentInstance(result, displayName, Component, props, slots); + return { + async render(destination) { + await instance.render(destination); + } + }; +} +async function renderComponent(result, displayName, Component, props, slots = {}) { + if (isPromise(Component)) { + Component = await Component; + } + if (isFragmentComponent(Component)) { + return await renderFragmentComponent(result, slots); + } + props = normalizeProps(props); + if (isHTMLComponent(Component)) { + return await renderHTMLComponent(result, Component, props, slots); + } + if (isAstroComponentFactory(Component)) { + return renderAstroComponent(result, displayName, Component, props, slots); + } + return await renderFrameworkComponent(result, displayName, Component, props, slots); +} +function normalizeProps(props) { + if (props["class:list"] !== void 0) { + const value = props["class:list"]; + delete props["class:list"]; + props["class"] = clsx(props["class"], value); + if (props["class"] === "") { + delete props["class"]; + } + } + return props; +} +async function renderComponentToString(result, displayName, Component, props, slots = {}, isPage = false, route) { + let str = ""; + let renderedFirstPageChunk = false; + let head = ""; + if (nonAstroPageNeedsHeadInjection(Component)) { + for (const headChunk of maybeRenderHead()) { + head += chunkToString(result, headChunk); + } + } + try { + const destination = { + write(chunk) { + if (isPage && !renderedFirstPageChunk) { + renderedFirstPageChunk = true; + if (!result.partial && !/" : "\n"; + str += doctype + head; + } + } + if (chunk instanceof Response) + return; + str += chunkToString(result, chunk); + } + }; + const renderInstance = await renderComponent(result, displayName, Component, props, slots); + await renderInstance.render(destination); + } catch (e) { + if (AstroError.is(e) && !e.loc) { + e.setLocation({ + file: route?.component + }); + } + throw e; + } + return str; +} +function nonAstroPageNeedsHeadInjection(pageComponent) { + return !!pageComponent?.[needsHeadRenderingSymbol]; +} + +const ClientOnlyPlaceholder = "astro-client-only"; +class Skip { + constructor(vnode) { + this.vnode = vnode; + this.count = 0; + } + count; + increment() { + this.count++; + } + haveNoTried() { + return this.count === 0; + } + isCompleted() { + return this.count > 2; + } + static symbol = Symbol("astro:jsx:skip"); +} +let originalConsoleError; +let consoleFilterRefs = 0; +async function renderJSX(result, vnode) { + switch (true) { + case vnode instanceof HTMLString: + if (vnode.toString().trim() === "") { + return ""; + } + return vnode; + case typeof vnode === "string": + return markHTMLString(escapeHTML(vnode)); + case typeof vnode === "function": + return vnode; + case (!vnode && vnode !== 0): + return ""; + case Array.isArray(vnode): + return markHTMLString( + (await Promise.all(vnode.map((v) => renderJSX(result, v)))).join("") + ); + } + let skip; + if (vnode.props) { + if (vnode.props[Skip.symbol]) { + skip = vnode.props[Skip.symbol]; + } else { + skip = new Skip(vnode); + } + } else { + skip = new Skip(vnode); + } + return renderJSXVNode(result, vnode, skip); +} +async function renderJSXVNode(result, vnode, skip) { + if (isVNode(vnode)) { + switch (true) { + case !vnode.type: { + throw new Error(`Unable to render ${result.pathname} because it contains an undefined Component! +Did you forget to import the component or is it possible there is a typo?`); + } + case vnode.type === Symbol.for("astro:fragment"): + return renderJSX(result, vnode.props.children); + case vnode.type.isAstroComponentFactory: { + let props = {}; + let slots = {}; + for (const [key, value] of Object.entries(vnode.props ?? {})) { + if (key === "children" || value && typeof value === "object" && value["$$slot"]) { + slots[key === "children" ? "default" : key] = () => renderJSX(result, value); + } else { + props[key] = value; + } + } + const str = await renderToString(result, vnode.type, props, slots); + if (str instanceof Response) { + throw str; + } + const html = markHTMLString(str); + return html; + } + case (!vnode.type && vnode.type !== 0): + return ""; + case (typeof vnode.type === "string" && vnode.type !== ClientOnlyPlaceholder): + return markHTMLString(await renderElement(result, vnode.type, vnode.props ?? {})); + } + if (vnode.type) { + let extractSlots2 = function(child) { + if (Array.isArray(child)) { + return child.map((c) => extractSlots2(c)); + } + if (!isVNode(child)) { + _slots.default.push(child); + return; + } + if ("slot" in child.props) { + _slots[child.props.slot] = [..._slots[child.props.slot] ?? [], child]; + delete child.props.slot; + return; + } + _slots.default.push(child); + }; + if (typeof vnode.type === "function" && vnode.type["astro:renderer"]) { + skip.increment(); + } + if (typeof vnode.type === "function" && vnode.props["server:root"]) { + const output2 = await vnode.type(vnode.props ?? {}); + return await renderJSX(result, output2); + } + if (typeof vnode.type === "function") { + if (skip.haveNoTried() || skip.isCompleted()) { + useConsoleFilter(); + try { + const output2 = await vnode.type(vnode.props ?? {}); + let renderResult; + if (output2?.[AstroJSX]) { + renderResult = await renderJSXVNode(result, output2, skip); + return renderResult; + } else if (!output2) { + renderResult = await renderJSXVNode(result, output2, skip); + return renderResult; + } + } catch (e) { + if (skip.isCompleted()) { + throw e; + } + skip.increment(); + } finally { + finishUsingConsoleFilter(); + } + } else { + skip.increment(); + } + } + const { children = null, ...props } = vnode.props ?? {}; + const _slots = { + default: [] + }; + extractSlots2(children); + for (const [key, value] of Object.entries(props)) { + if (value["$$slot"]) { + _slots[key] = value; + delete props[key]; + } + } + const slotPromises = []; + const slots = {}; + for (const [key, value] of Object.entries(_slots)) { + slotPromises.push( + renderJSX(result, value).then((output2) => { + if (output2.toString().trim().length === 0) + return; + slots[key] = () => output2; + }) + ); + } + await Promise.all(slotPromises); + props[Skip.symbol] = skip; + let output; + if (vnode.type === ClientOnlyPlaceholder && vnode.props["client:only"]) { + output = await renderComponentToString( + result, + vnode.props["client:display-name"] ?? "", + null, + props, + slots + ); + } else { + output = await renderComponentToString( + result, + typeof vnode.type === "function" ? vnode.type.name : vnode.type, + vnode.type, + props, + slots + ); + } + return markHTMLString(output); + } + } + return markHTMLString(`${vnode}`); +} +async function renderElement(result, tag, { children, ...props }) { + return markHTMLString( + `<${tag}${spreadAttributes(props)}${markHTMLString( + (children == null || children == "") && voidElementNames.test(tag) ? `/>` : `>${children == null ? "" : await renderJSX(result, prerenderElementChildren(tag, children))}` + )}` + ); +} +function prerenderElementChildren(tag, children) { + if (typeof children === "string" && (tag === "style" || tag === "script")) { + return markHTMLString(children); + } else { + return children; + } +} +function useConsoleFilter() { + consoleFilterRefs++; + if (!originalConsoleError) { + originalConsoleError = console.error; + try { + console.error = filteredConsoleError; + } catch (error) { + } + } +} +function finishUsingConsoleFilter() { + consoleFilterRefs--; +} +function filteredConsoleError(msg, ...rest) { + if (consoleFilterRefs > 0 && typeof msg === "string") { + const isKnownReactHookError = msg.includes("Warning: Invalid hook call.") && msg.includes("https://reactjs.org/link/invalid-hook-call"); + if (isKnownReactHookError) + return; + } + originalConsoleError(msg, ...rest); +} + +function renderScriptElement({ props, children }) { + return renderElement$1("script", { + props, + children + }); +} +function renderUniqueStylesheet(result, sheet) { + if (sheet.type === "external") { + if (Array.from(result.styles).some((s) => s.props.href === sheet.src)) + return ""; + return renderElement$1("link", { props: { rel: "stylesheet", href: sheet.src }, children: "" }); + } + if (sheet.type === "inline") { + if (Array.from(result.styles).some((s) => s.children.includes(sheet.content))) + return ""; + return renderElement$1("style", { props: {}, children: sheet.content }); + } +} + +const EASE_IN_OUT_QUART = "cubic-bezier(0.76, 0, 0.24, 1)"; +function slide({ + duration +} = {}) { + return { + forwards: { + old: [ + { + name: "astroFadeOut", + duration: duration ?? "90ms", + easing: EASE_IN_OUT_QUART, + fillMode: "both" + }, + { + name: "astroSlideToLeft", + duration: duration ?? "220ms", + easing: EASE_IN_OUT_QUART, + fillMode: "both" + } + ], + new: [ + { + name: "astroFadeIn", + duration: duration ?? "210ms", + easing: EASE_IN_OUT_QUART, + delay: duration ? void 0 : "30ms", + fillMode: "both" + }, + { + name: "astroSlideFromRight", + duration: duration ?? "220ms", + easing: EASE_IN_OUT_QUART, + fillMode: "both" + } + ] + }, + backwards: { + old: [{ name: "astroFadeOut" }, { name: "astroSlideToRight" }], + new: [{ name: "astroFadeIn" }, { name: "astroSlideFromLeft" }] + } + }; +} +function fade({ + duration +} = {}) { + const anim = { + old: { + name: "astroFadeOut", + duration: duration ?? 180, + easing: EASE_IN_OUT_QUART, + fillMode: "both" + }, + new: { + name: "astroFadeIn", + duration: duration ?? 180, + easing: EASE_IN_OUT_QUART, + fillMode: "both" + } + }; + return { + forwards: anim, + backwards: anim + }; +} + +const transitionNameMap = /* @__PURE__ */ new WeakMap(); +function incrementTransitionNumber(result) { + let num = 1; + if (transitionNameMap.has(result)) { + num = transitionNameMap.get(result) + 1; + } + transitionNameMap.set(result, num); + return num; +} +function createTransitionScope(result, hash) { + const num = incrementTransitionNumber(result); + return `astro-${hash}-${num}`; +} +const getAnimations = (name) => { + if (name === "fade") + return fade(); + if (name === "slide") + return slide(); + if (typeof name === "object") + return name; +}; +const addPairs = (animations, stylesheet) => { + for (const [direction, images] of Object.entries(animations)) { + for (const [image, rules] of Object.entries(images)) { + stylesheet.addAnimationPair(direction, image, rules); + } + } +}; +const reEncodeValidChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".split("").reduce((v, c) => (v[c.charCodeAt(0)] = c, v), []); +const reEncodeInValidStart = "-0123456789_".split("").reduce((v, c) => (v[c.charCodeAt(0)] = c, v), []); +function reEncode(s) { + let result = ""; + let codepoint; + for (let i = 0; i < s.length; i += (codepoint ?? 0) > 65535 ? 2 : 1) { + codepoint = s.codePointAt(i); + if (codepoint !== void 0) { + result += codepoint < 128 ? codepoint === 95 ? "__" : reEncodeValidChars[codepoint] ?? "_" + codepoint.toString(16).padStart(2, "0") : String.fromCodePoint(codepoint); + } + } + return reEncodeInValidStart[result.codePointAt(0) ?? 0] ? "_" + result : result; +} +function renderTransition(result, hash, animationName, transitionName) { + if (typeof (transitionName ?? "") !== "string") { + throw new Error(`Invalid transition name {${transitionName}}`); + } + if (!animationName) + animationName = "fade"; + const scope = createTransitionScope(result, hash); + const name = transitionName ? cssesc(reEncode(transitionName), { isIdentifier: true }) : scope; + const sheet = new ViewTransitionStyleSheet(scope, name); + const animations = getAnimations(animationName); + if (animations) { + addPairs(animations, sheet); + } else if (animationName === "none") { + sheet.addFallback("old", "animation: none; mix-blend-mode: normal;"); + sheet.addModern("old", "animation: none; opacity: 0; mix-blend-mode: normal;"); + sheet.addAnimationRaw("new", "animation: none; mix-blend-mode: normal;"); + } + result._metadata.extraHead.push(markHTMLString(``)); + return scope; +} +class ViewTransitionStyleSheet { + constructor(scope, name) { + this.scope = scope; + this.name = name; + } + modern = []; + fallback = []; + toString() { + const { scope, name } = this; + const [modern, fallback] = [this.modern, this.fallback].map((rules) => rules.join("")); + return [ + `[data-astro-transition-scope="${scope}"] { view-transition-name: ${name}; }`, + this.layer(modern), + fallback + ].join(""); + } + layer(cssText) { + return cssText ? `@layer astro { ${cssText} }` : ""; + } + addRule(target, cssText) { + this[target].push(cssText); + } + addAnimationRaw(image, animation) { + this.addModern(image, animation); + this.addFallback(image, animation); + } + addModern(image, animation) { + const { name } = this; + this.addRule("modern", `::view-transition-${image}(${name}) { ${animation} }`); + } + addFallback(image, animation) { + const { scope } = this; + this.addRule( + "fallback", + // Two selectors here, the second in case there is an animation on the root. + `[data-astro-transition-fallback="${image}"] [data-astro-transition-scope="${scope}"], + [data-astro-transition-fallback="${image}"][data-astro-transition-scope="${scope}"] { ${animation} }` + ); + } + addAnimationPair(direction, image, rules) { + const { scope, name } = this; + const animation = stringifyAnimation(rules); + const prefix = direction === "backwards" ? `[data-astro-transition=back]` : direction === "forwards" ? "" : `[data-astro-transition=${direction}]`; + this.addRule("modern", `${prefix}::view-transition-${image}(${name}) { ${animation} }`); + this.addRule( + "fallback", + `${prefix}[data-astro-transition-fallback="${image}"] [data-astro-transition-scope="${scope}"], + ${prefix}[data-astro-transition-fallback="${image}"][data-astro-transition-scope="${scope}"] { ${animation} }` + ); + } +} +function addAnimationProperty(builder, prop, value) { + let arr = builder[prop]; + if (Array.isArray(arr)) { + arr.push(value.toString()); + } else { + builder[prop] = [value.toString()]; + } +} +function animationBuilder() { + return { + toString() { + let out = ""; + for (let k in this) { + let value = this[k]; + if (Array.isArray(value)) { + out += ` + ${k}: ${value.join(", ")};`; + } + } + return out; + } + }; +} +function stringifyAnimation(anim) { + if (Array.isArray(anim)) { + return stringifyAnimations(anim); + } else { + return stringifyAnimations([anim]); + } +} +function stringifyAnimations(anims) { + const builder = animationBuilder(); + for (const anim of anims) { + if (anim.duration) { + addAnimationProperty(builder, "animation-duration", toTimeValue(anim.duration)); + } + if (anim.easing) { + addAnimationProperty(builder, "animation-timing-function", anim.easing); + } + if (anim.direction) { + addAnimationProperty(builder, "animation-direction", anim.direction); + } + if (anim.delay) { + addAnimationProperty(builder, "animation-delay", anim.delay); + } + if (anim.fillMode) { + addAnimationProperty(builder, "animation-fill-mode", anim.fillMode); + } + addAnimationProperty(builder, "animation-name", anim.name); + } + return builder.toString(); +} +function toTimeValue(num) { + return typeof num === "number" ? num + "ms" : num; +} + +function __astro_tag_component__(Component, rendererName) { + if (!Component) + return; + if (typeof Component !== "function") + return; + Object.defineProperty(Component, Renderer, { + value: rendererName, + enumerable: false, + writable: false + }); +} +function spreadAttributes(values = {}, _name, { class: scopedClassName } = {}) { + let output = ""; + if (scopedClassName) { + if (typeof values.class !== "undefined") { + values.class += ` ${scopedClassName}`; + } else if (typeof values["class:list"] !== "undefined") { + values["class:list"] = [values["class:list"], scopedClassName]; + } else { + values.class = scopedClassName; + } + } + for (const [key, value] of Object.entries(values)) { + output += addAttribute(value, key, true); + } + return markHTMLString(output); +} + +const AstroJSX = "astro:jsx"; +const Empty = Symbol("empty"); +const toSlotName = (slotAttr) => slotAttr; +function isVNode(vnode) { + return vnode && typeof vnode === "object" && vnode[AstroJSX]; +} +function transformSlots(vnode) { + if (typeof vnode.type === "string") + return vnode; + const slots = {}; + if (isVNode(vnode.props.children)) { + const child = vnode.props.children; + if (!isVNode(child)) + return; + if (!("slot" in child.props)) + return; + const name = toSlotName(child.props.slot); + slots[name] = [child]; + slots[name]["$$slot"] = true; + delete child.props.slot; + delete vnode.props.children; + } + if (Array.isArray(vnode.props.children)) { + vnode.props.children = vnode.props.children.map((child) => { + if (!isVNode(child)) + return child; + if (!("slot" in child.props)) + return child; + const name = toSlotName(child.props.slot); + if (Array.isArray(slots[name])) { + slots[name].push(child); + } else { + slots[name] = [child]; + slots[name]["$$slot"] = true; + } + delete child.props.slot; + return Empty; + }).filter((v) => v !== Empty); + } + Object.assign(vnode.props, slots); +} +function markRawChildren(child) { + if (typeof child === "string") + return markHTMLString(child); + if (Array.isArray(child)) + return child.map((c) => markRawChildren(c)); + return child; +} +function transformSetDirectives(vnode) { + if (!("set:html" in vnode.props || "set:text" in vnode.props)) + return; + if ("set:html" in vnode.props) { + const children = markRawChildren(vnode.props["set:html"]); + delete vnode.props["set:html"]; + Object.assign(vnode.props, { children }); + return; + } + if ("set:text" in vnode.props) { + const children = vnode.props["set:text"]; + delete vnode.props["set:text"]; + Object.assign(vnode.props, { children }); + return; + } +} +function createVNode(type, props) { + const vnode = { + [Renderer]: "astro:jsx", + [AstroJSX]: true, + type, + props: props ?? {} + }; + transformSetDirectives(vnode); + transformSlots(vnode); + return vnode; +} + +export { AstroError as A, ExpectedImage as E, FailedToFetchRemoteImageDimensions as F, IncompatibleDescriptorOptions as I, LocalImageUsedWrongly as L, MissingImageDimension as M, UnsupportedImageFormat as U, __astro_tag_component__ as _, UnsupportedImageConversion as a, MissingSharp as b, InvalidImageService as c, ExpectedImageOptions as d, createAstro as e, createComponent as f, ImageMissingAlt as g, addAttribute as h, MissingLocale as i, renderSlot as j, renderComponent as k, renderTransition as l, maybeRenderHead as m, createTransitionScope as n, renderHead as o, UnknownContentCollectionError as p, renderUniqueStylesheet as q, renderTemplate as r, spreadAttributes as s, renderScriptElement as t, unescapeHTML as u, createHeadAndContent as v, Fragment as w, AstroJSX as x, renderJSX as y, createVNode as z }; diff --git a/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_5IlRX2qD.mjs b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_5IlRX2qD.mjs new file mode 100644 index 0000000..e87804c --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_5IlRX2qD.mjs @@ -0,0 +1,25 @@ +const id = "en/become-cool-frontend-dev.mdx"; + const collection = "posts"; + const slug = "become-cool-frontend-dev"; + const body = "\r\n**Your Journey to Web Mastery** \r\n\r\nIn the fast-paced world of web development, frontend development stands out as a dynamic and ever-evolving field. As the user interface becomes increasingly crucial, frontend developers play a vital role in shaping the digital experiences we encounter daily. If you're aspiring to become a cool frontend developer, this article is your roadmap to mastering the art of crafting visually appealing and interactive websites. We'll delve into popular frameworks, discuss where to start your learning journey, and sprinkle in some personal insights.\r\n\r\n\r\n## **The Thriving Universe of Frontend Development**\r\nFrontend development involves creating the visible part of a website or web application that users interact with. From designing responsive layouts to implementing interactive elements, frontend developers bring designs to life using a combination of HTML, CSS, and JavaScript. As you embark on your journey to become a cool frontend developer, familiarize yourself with the core technologies that form the backbone of web development.\r\n\r\n\r\n\r\n## **The ABCs: HTML, CSS, and JavaScript**\r\n\r\n#### **HTML (Hypertext Markup Language): The Skeleton of the Web**\r\n\r\nHTML is the foundation of any web page. It provides the basic structure by defining the elements on a page, such as headings, paragraphs, images, and links. As a frontend developer, mastering HTML is like learning the alphabet before diving into the world of words.\r\n\r\n\r\n\r\n#### **CSS (Cascading Style Sheets): Styling for Aesthetic Appeal**\r\n\r\nCSS is the stylist of the web. It allows you to control the layout, colors, and fonts, transforming a plain HTML document into a visually appealing masterpiece. Understanding CSS is essential for creating responsive and visually engaging user interfaces.\r\n\r\n\r\n\r\n#### **JavaScript: Adding Life to the Party**\r\n\r\nJavaScript is the programming language that brings interactivity to web pages. It allows you to create dynamic content, handle user input, and communicate with web servers. JavaScript is the engine behind modern web development, making it a must-learn for anyone aiming to be a frontend maestro.\r\n\r\n\r\n\r\n## **Embarking on the Framework Adventure**\r\n\r\n#### **React.js: Unleashing the Power of Components**\r\n\r\nWhen it comes to frontend frameworks, React.js stands tall. Developed and maintained by Facebook, React.js is a JavaScript library for building user interfaces. Its component-based architecture allows developers to create modular and reusable UI elements, streamlining the development process. Whether you're building a simple website or a complex single-page application, React.js is a valuable tool in your arsenal.\r\n\r\n\r\n\r\n#### **Vue.js: The Progressive Framework**\r\n\r\nVue.js is another popular frontend framework known for its simplicity and ease of integration. It is designed to be incrementally adoptable, making it a great choice for both beginners and experienced developers. Vue.js empowers you to build reactive and dynamic interfaces with less overhead, making your codebase clean and maintainable.\r\n\r\n\r\n\r\n#### **Angular: The Full-Fledged Framework**\r\n\r\nAngular, developed and maintained by Google, is a comprehensive frontend framework that provides a complete solution for building large-scale applications. It comes with powerful features like two-way data binding, dependency injection, and a robust CLI (Command Line Interface). While Angular has a steeper learning curve compared to React.js and Vue.js, mastering it opens the door to developing enterprise-level applications.\r\n\r\n\r\n\r\n## **Setting Sail on Your Learning Voyage**\r\n\r\n#### **Online Courses: Learning at Your Own Pace**\r\n\r\nThere is an abundance of online courses catering to frontend development. Platforms like Udemy, Coursera, and freeCodeCamp offer courses ranging from beginner to advanced levels. Choose courses that align with your learning style and pace, and don't hesitate to explore multiple resources to gain a well-rounded understanding.\r\n\r\n\r\n\r\n#### **Projects: Learning by Doing**\r\n\r\nTheory is essential, but hands-on experience is where true mastery develops. Start small by building simple projects and gradually increase the complexity. GitHub can be your playground to showcase your work, collaborate with others, and receive feedback.\r\n\r\n\r\n\r\n#### **Community Engagement: Joining the Developer Ecosystem**\r\n\r\nBeing part of the developer community is invaluable. Join forums like Stack Overflow, participate in discussions on Reddit, and engage with fellow developers on platforms like Twitter and LinkedIn. Networking not only exposes you to diverse perspectives but also provides support when you encounter roadblocks in your learning journey.\r\n\r\n\r\n\r\n## **Personal Insights and Words of Wisdom**\r\n\r\nAs you embark on your journey to become a cool frontend developer, remember that the learning process is a marathon, not a sprint. Embrace challenges as opportunities to grow, and don't be afraid to step out of your comfort zone. The tech industry is dynamic, and staying curious is your key to staying relevant.\r\n\r\n\r\n\r\nWhen choosing a framework, consider the project requirements and your personal preferences. Each framework has its strengths, and the best one for a particular project depends on factors such as scalability, ease of use, and the learning curve you're comfortable with.\r\n\r\n\r\n\r\nFinally, keep in mind that the tech world values not just technical skills but also soft skills. Effective communication, collaboration, and a proactive attitude will set you apart as a cool frontend developer in the eyes of employers and colleagues.\r\n\r\n\r\n\r\n### **Conclusion: Your Journey Begins Now**\r\n\r\nBecoming a cool frontend developer is an exciting and rewarding adventure. Armed with a solid understanding of HTML, CSS, and JavaScript, and exploring frameworks like React.js, Vue.js, and Angular, you're well on your way to mastering the art of frontend development. Remember to enjoy the process, stay curious, and celebrate your victories, no matter how small. Happy coding!"; + const data = {isDraft:false,title:"Becoming a Cool Frontend Developer",description:"Start your cool frontend developer journey with HTML, CSS, and JavaScript basics. Explore React.js, Vue.js, and Angular frameworks. Enhance learning through online courses, hands-on projects, and community engagement. Master the art with curiosity, perseverance, and soft skills. Happy coding! 🚀",image: + new Proxy({"src":"/_astro/astro.TBXBeJNn.jpg","width":1500,"height":857,"format":"jpg","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/astro.jpg"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/astro.jpg"; + } + + return target[name]; + } + }) + ,author:"ChatGPT",tags:["beginingInFrontEnd"],categories:["advices"],publishDate:"14/01/2024",language:"en"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/become-cool-frontend-dev.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CLj1VjFp.mjs b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CLj1VjFp.mjs new file mode 100644 index 0000000..e650086 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CLj1VjFp.mjs @@ -0,0 +1,25 @@ +const id = "ru/become-cool-frontend-dev.mdx"; + const collection = "posts"; + const slug = "become-cool-frontend-developer"; + const body = "\r\n**Ваше путешествие к мастерству веб-разработки**. \r\n\r\n\r\n\r\nВ быстро меняющемся мире веб-разработки фронтенд-разработка выделяется как динамичная и постоянно развивающаяся область. Поскольку пользовательский интерфейс приобретает все большее значение, фронтенд-разработчики играют жизненно важную роль в формировании цифрового опыта, с которым мы сталкиваемся ежедневно. Если вы стремитесь стать крутым фронтенд-разработчиком, эта статья - ваш путеводитель по овладению искусством создания визуально привлекательных и интерактивных веб-сайтов. Мы рассмотрим популярные фреймворки, обсудим, с чего начать свое обучение, и добавим немного личного опыта.\r\n\r\n\r\n## **Процветающая вселенная Frontend-разработки**.\r\nРазработка фронтенда включает в себя создание видимой части веб-сайта или веб-приложения, с которой взаимодействуют пользователи. От проектирования отзывчивых макетов до внедрения интерактивных элементов, разработчики фронтенда воплощают дизайн в жизнь, используя комбинацию HTML, CSS и JavaScript. Чтобы стать крутым фронтенд-разработчиком, ознакомьтесь с основными технологиями, которые лежат в основе веб-разработки.\r\n\r\n\r\n\r\n\r\n## **Азбука: HTML, CSS и JavaScript**.\r\n\r\n#### **HTML (язык разметки гипертекста): Скелет веба**.\r\n\r\n\r\n\r\nHTML - это основа любой веб-страницы. Он обеспечивает базовую структуру, определяя элементы на странице, такие как заголовки, абзацы, изображения и ссылки. Для фронтенд-разработчика освоить HTML - все равно что выучить алфавит, прежде чем погрузиться в мир слов.\r\n\r\n\r\n#### **CSS (каскадные таблицы стилей): Стилизация для эстетической привлекательности**.\r\n\r\nCSS - это стилист в Интернете. Он позволяет управлять макетом, цветами и шрифтами, превращая обычный HTML-документ в визуально привлекательный шедевр. Понимание CSS необходимо для создания отзывчивых и визуально привлекательных пользовательских интерфейсов.\r\n\r\n\r\n\r\n#### **JavaScript: Добавление жизни в вечеринку**\r\n\r\nJavaScript - это язык программирования, который привносит интерактивность в веб-страницы. Он позволяет создавать динамический контент, обрабатывать пользовательский ввод и взаимодействовать с веб-серверами. JavaScript - это движущая сила современной веб-разработки, поэтому его изучение обязательно для всех, кто стремится стать маэстро фронтенда.\r\n\r\n\r\n## **Приключение с фреймворком**\r\n\r\n#### **React.js: Раскрываем мощь компонентов**\r\n\r\n\r\nКогда речь заходит о фронтенд-фреймворках, React.js стоит особняком. Разработанный и поддерживаемый Facebook, React.js представляет собой библиотеку JavaScript для создания пользовательских интерфейсов. Ее архитектура, основанная на компонентах, позволяет разработчикам создавать модульные и многократно используемые элементы пользовательского интерфейса, упрощая процесс разработки. Создаете ли вы простой сайт или сложное одностраничное приложение, React.js - ценный инструмент в вашем арсенале.\r\n\r\n\r\n#### **Vue.js: прогрессивный фреймворк**.\r\n\r\nVue.js - еще один популярный фронтенд-фреймворк, известный своей простотой и легкостью интеграции. Он разработан для постепенного внедрения, что делает его отличным выбором как для начинающих, так и для опытных разработчиков. Vue.js позволяет создавать реактивные и динамические интерфейсы с меньшими накладными расходами, делая вашу кодовую базу чистой и удобной для обслуживания.\r\n\r\n\r\n\r\n#### **Angular: Полноценный фреймворк**.\r\n\r\nAngular, разработанный и поддерживаемый компанией Google, представляет собой комплексный фронтенд-фреймворк, который обеспечивает полное решение для создания крупномасштабных приложений. Он оснащен такими мощными функциями, как двусторонняя привязка данных, внедрение зависимостей и надежный CLI (интерфейс командной строки). Хотя Angular более сложен в освоении по сравнению с React.js и Vue.js, его освоение открывает путь к разработке приложений корпоративного уровня.\r\n\r\n\r\n## **Отправляясь в учебное плавание**\r\n\r\n#### **Онлайн-курсы: Обучение в собственном темпе**\r\n\r\nСуществует огромное количество онлайн-курсов, посвященных разработке фронтенда. Такие платформы, как Udemy, Coursera и freeCodeCamp, предлагают курсы от начального до продвинутого уровня. Выбирайте курсы, которые соответствуют вашему стилю и темпу обучения, и не стесняйтесь изучать несколько ресурсов, чтобы получить всестороннее понимание.\r\n\r\n\r\n\r\n#### **Projects: Обучение на практике**.\r\n\r\nТеория важна, но практический опыт - это то, где развивается настоящее мастерство. Начните с создания простых проектов и постепенно повышайте их сложность. GitHub может стать вашей игровой площадкой для демонстрации своей работы, сотрудничества с другими и получения обратной связи.\r\n\r\n\r\n#### **Взаимодействие с сообществом: Вступление в экосистему разработчиков**.\r\n\r\nУчастие в сообществе разработчиков бесценно. Присоединяйтесь к таким форумам, как Stack Overflow, участвуйте в обсуждениях на Reddit и общайтесь с коллегами-разработчиками на таких платформах, как Twitter и LinkedIn. Общение в сети не только откроет вам различные перспективы, но и обеспечит поддержку, когда вы столкнетесь с препятствиями на своем пути обучения.\r\n\r\n\r\n\r\n## **Личные соображения и слова мудрости**.\r\n\r\nВступая на путь становления крутого фронтенд-разработчика, помните, что процесс обучения - это марафон, а не спринт. Принимайте трудности как возможность для роста и не бойтесь выходить из зоны комфорта. Технологическая индустрия динамична, и любознательность - ваш ключ к тому, чтобы оставаться актуальным.\r\n\r\nВыбирая фреймворк, учитывайте требования проекта и свои личные предпочтения. У каждого фреймворка есть свои сильные стороны, и выбор лучшего для конкретного проекта зависит от таких факторов, как масштабируемость, простота использования и кривая обучения, которая вас устраивает.\r\n\r\nНаконец, не забывайте, что в мире технологий ценятся не только технические, но и \"мягкие\" навыки. Эффективная коммуникация, сотрудничество и активная позиция выделят вас как крутого фронтенд-разработчика в глазах работодателей и коллег.\r\n\r\n\r\n### **Заключение: Ваше путешествие начинается сейчас**\r\n\r\nСтать крутым фронтенд-разработчиком - это увлекательное и полезное приключение. Вооруженный твердым пониманием HTML, CSS и JavaScript и изучивший такие фреймворки, как React.js, Vue.js и Angular, вы уже на пути к овладению искусством фронтенд-разработки. Не забывайте наслаждаться процессом, не теряйте любопытства и празднуйте свои победы, какими бы маленькими они ни были. Счастливого кодинга!"; + const data = {isDraft:false,title:"Стань крутым фронтенд-разработчиком",description:"Начните свой крутой путь фронтенд-разработчика с основ HTML, CSS и JavaScript. Изучите фреймворки React.js, Vue.js и Angular. Повышайте эффективность обучения с помощью онлайн-курсов, практических проектов и участия в жизни сообщества. Овладейте этим искусством благодаря любопытству, упорству и мягким навыкам. Счастливого кодинга! 🚀",image: + new Proxy({"src":"/_astro/astro.TBXBeJNn.jpg","width":1500,"height":857,"format":"jpg","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/astro.jpg"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/astro.jpg"; + } + + return target[name]; + } + }) + ,author:"ChatGPT",tags:["beginingInFrontEnd"],categories:["советы"],publishDate:"14/01/2024",language:"ru"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/become-cool-frontend-dev.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CeoOBHg_.mjs b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CeoOBHg_.mjs new file mode 100644 index 0000000..ece41f3 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CeoOBHg_.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./become-cool-frontend-dev_DSYfhzBg.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CoszH-iC.mjs b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CoszH-iC.mjs new file mode 100644 index 0000000..52ee8ef --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_CoszH-iC.mjs @@ -0,0 +1,226 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "become-cool-frontend-dev", + "author": "ChatGPT", + "isDraft": false, + "title": "Becoming a Cool Frontend Developer", + "description": "Start your cool frontend developer journey with HTML, CSS, and JavaScript basics. Explore React.js, Vue.js, and Angular frameworks. Enhance learning through online courses, hands-on projects, and community engagement. Master the art with curiosity, perseverance, and soft skills. Happy coding! \u{1F680}", + "image": "../images/astro.jpg", + "tags": ["beginingInFrontEnd"], + "categories": ["advices"], + "publishDate": "14/01/2024", + "language": "en" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "the-thriving-universe-of-frontend-development", + "text": "The Thriving Universe of Frontend Development" + }, { + "depth": 2, + "slug": "the-abcs-html-css-and-javascript", + "text": "The ABCs: HTML, CSS, and JavaScript" + }, { + "depth": 4, + "slug": "html-hypertext-markup-language-the-skeleton-of-the-web", + "text": "HTML (Hypertext Markup Language): The Skeleton of the Web" + }, { + "depth": 4, + "slug": "css-cascading-style-sheets-styling-for-aesthetic-appeal", + "text": "CSS (Cascading Style Sheets): Styling for Aesthetic Appeal" + }, { + "depth": 4, + "slug": "javascript-adding-life-to-the-party", + "text": "JavaScript: Adding Life to the Party" + }, { + "depth": 2, + "slug": "embarking-on-the-framework-adventure", + "text": "Embarking on the Framework Adventure" + }, { + "depth": 4, + "slug": "reactjs-unleashing-the-power-of-components", + "text": "React.js: Unleashing the Power of Components" + }, { + "depth": 4, + "slug": "vuejs-the-progressive-framework", + "text": "Vue.js: The Progressive Framework" + }, { + "depth": 4, + "slug": "angular-the-full-fledged-framework", + "text": "Angular: The Full-Fledged Framework" + }, { + "depth": 2, + "slug": "setting-sail-on-your-learning-voyage", + "text": "Setting Sail on Your Learning Voyage" + }, { + "depth": 4, + "slug": "online-courses-learning-at-your-own-pace", + "text": "Online Courses: Learning at Your Own Pace" + }, { + "depth": 4, + "slug": "projects-learning-by-doing", + "text": "Projects: Learning by Doing" + }, { + "depth": 4, + "slug": "community-engagement-joining-the-developer-ecosystem", + "text": "Community Engagement: Joining the Developer Ecosystem" + }, { + "depth": 2, + "slug": "personal-insights-and-words-of-wisdom", + "text": "Personal Insights and Words of Wisdom" + }, { + "depth": 3, + "slug": "conclusion-your-journey-begins-now", + "text": "Conclusion: Your Journey Begins Now" + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + h2: "h2", + h3: "h3", + h4: "h4", + p: "p", + strong: "strong", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.p, { + children: createVNode(_components.strong, { + children: "Your Journey to Web Mastery" + }) + }), "\n", createVNode(_components.p, { + children: "In the fast-paced world of web development, frontend development stands out as a dynamic and ever-evolving field. As the user interface becomes increasingly crucial, frontend developers play a vital role in shaping the digital experiences we encounter daily. If you\u2019re aspiring to become a cool frontend developer, this article is your roadmap to mastering the art of crafting visually appealing and interactive websites. We\u2019ll delve into popular frameworks, discuss where to start your learning journey, and sprinkle in some personal insights." + }), "\n", createVNode(_components.h2, { + id: "the-thriving-universe-of-frontend-development", + children: createVNode(_components.strong, { + children: "The Thriving Universe of Frontend Development" + }) + }), "\n", createVNode(_components.p, { + children: "Frontend development involves creating the visible part of a website or web application that users interact with. From designing responsive layouts to implementing interactive elements, frontend developers bring designs to life using a combination of HTML, CSS, and JavaScript. As you embark on your journey to become a cool frontend developer, familiarize yourself with the core technologies that form the backbone of web development." + }), "\n", createVNode(_components.h2, { + id: "the-abcs-html-css-and-javascript", + children: createVNode(_components.strong, { + children: "The ABCs: HTML, CSS, and JavaScript" + }) + }), "\n", createVNode(_components.h4, { + id: "html-hypertext-markup-language-the-skeleton-of-the-web", + children: createVNode(_components.strong, { + children: "HTML (Hypertext Markup Language): The Skeleton of the Web" + }) + }), "\n", createVNode(_components.p, { + children: "HTML is the foundation of any web page. It provides the basic structure by defining the elements on a page, such as headings, paragraphs, images, and links. As a frontend developer, mastering HTML is like learning the alphabet before diving into the world of words." + }), "\n", createVNode(_components.h4, { + id: "css-cascading-style-sheets-styling-for-aesthetic-appeal", + children: createVNode(_components.strong, { + children: "CSS (Cascading Style Sheets): Styling for Aesthetic Appeal" + }) + }), "\n", createVNode(_components.p, { + children: "CSS is the stylist of the web. It allows you to control the layout, colors, and fonts, transforming a plain HTML document into a visually appealing masterpiece. Understanding CSS is essential for creating responsive and visually engaging user interfaces." + }), "\n", createVNode(_components.h4, { + id: "javascript-adding-life-to-the-party", + children: createVNode(_components.strong, { + children: "JavaScript: Adding Life to the Party" + }) + }), "\n", createVNode(_components.p, { + children: "JavaScript is the programming language that brings interactivity to web pages. It allows you to create dynamic content, handle user input, and communicate with web servers. JavaScript is the engine behind modern web development, making it a must-learn for anyone aiming to be a frontend maestro." + }), "\n", createVNode(_components.h2, { + id: "embarking-on-the-framework-adventure", + children: createVNode(_components.strong, { + children: "Embarking on the Framework Adventure" + }) + }), "\n", createVNode(_components.h4, { + id: "reactjs-unleashing-the-power-of-components", + children: createVNode(_components.strong, { + children: "React.js: Unleashing the Power of Components" + }) + }), "\n", createVNode(_components.p, { + children: "When it comes to frontend frameworks, React.js stands tall. Developed and maintained by Facebook, React.js is a JavaScript library for building user interfaces. Its component-based architecture allows developers to create modular and reusable UI elements, streamlining the development process. Whether you\u2019re building a simple website or a complex single-page application, React.js is a valuable tool in your arsenal." + }), "\n", createVNode(_components.h4, { + id: "vuejs-the-progressive-framework", + children: createVNode(_components.strong, { + children: "Vue.js: The Progressive Framework" + }) + }), "\n", createVNode(_components.p, { + children: "Vue.js is another popular frontend framework known for its simplicity and ease of integration. It is designed to be incrementally adoptable, making it a great choice for both beginners and experienced developers. Vue.js empowers you to build reactive and dynamic interfaces with less overhead, making your codebase clean and maintainable." + }), "\n", createVNode(_components.h4, { + id: "angular-the-full-fledged-framework", + children: createVNode(_components.strong, { + children: "Angular: The Full-Fledged Framework" + }) + }), "\n", createVNode(_components.p, { + children: "Angular, developed and maintained by Google, is a comprehensive frontend framework that provides a complete solution for building large-scale applications. It comes with powerful features like two-way data binding, dependency injection, and a robust CLI (Command Line Interface). While Angular has a steeper learning curve compared to React.js and Vue.js, mastering it opens the door to developing enterprise-level applications." + }), "\n", createVNode(_components.h2, { + id: "setting-sail-on-your-learning-voyage", + children: createVNode(_components.strong, { + children: "Setting Sail on Your Learning Voyage" + }) + }), "\n", createVNode(_components.h4, { + id: "online-courses-learning-at-your-own-pace", + children: createVNode(_components.strong, { + children: "Online Courses: Learning at Your Own Pace" + }) + }), "\n", createVNode(_components.p, { + children: "There is an abundance of online courses catering to frontend development. Platforms like Udemy, Coursera, and freeCodeCamp offer courses ranging from beginner to advanced levels. Choose courses that align with your learning style and pace, and don\u2019t hesitate to explore multiple resources to gain a well-rounded understanding." + }), "\n", createVNode(_components.h4, { + id: "projects-learning-by-doing", + children: createVNode(_components.strong, { + children: "Projects: Learning by Doing" + }) + }), "\n", createVNode(_components.p, { + children: "Theory is essential, but hands-on experience is where true mastery develops. Start small by building simple projects and gradually increase the complexity. GitHub can be your playground to showcase your work, collaborate with others, and receive feedback." + }), "\n", createVNode(_components.h4, { + id: "community-engagement-joining-the-developer-ecosystem", + children: createVNode(_components.strong, { + children: "Community Engagement: Joining the Developer Ecosystem" + }) + }), "\n", createVNode(_components.p, { + children: "Being part of the developer community is invaluable. Join forums like Stack Overflow, participate in discussions on Reddit, and engage with fellow developers on platforms like Twitter and LinkedIn. Networking not only exposes you to diverse perspectives but also provides support when you encounter roadblocks in your learning journey." + }), "\n", createVNode(_components.h2, { + id: "personal-insights-and-words-of-wisdom", + children: createVNode(_components.strong, { + children: "Personal Insights and Words of Wisdom" + }) + }), "\n", createVNode(_components.p, { + children: "As you embark on your journey to become a cool frontend developer, remember that the learning process is a marathon, not a sprint. Embrace challenges as opportunities to grow, and don\u2019t be afraid to step out of your comfort zone. The tech industry is dynamic, and staying curious is your key to staying relevant." + }), "\n", createVNode(_components.p, { + children: "When choosing a framework, consider the project requirements and your personal preferences. Each framework has its strengths, and the best one for a particular project depends on factors such as scalability, ease of use, and the learning curve you\u2019re comfortable with." + }), "\n", createVNode(_components.p, { + children: "Finally, keep in mind that the tech world values not just technical skills but also soft skills. Effective communication, collaboration, and a proactive attitude will set you apart as a cool frontend developer in the eyes of employers and colleagues." + }), "\n", createVNode(_components.h3, { + id: "conclusion-your-journey-begins-now", + children: createVNode(_components.strong, { + children: "Conclusion: Your Journey Begins Now" + }) + }), "\n", createVNode(_components.p, { + children: "Becoming a cool frontend developer is an exciting and rewarding adventure. Armed with a solid understanding of HTML, CSS, and JavaScript, and exploring frameworks like React.js, Vue.js, and Angular, you\u2019re well on your way to mastering the art of frontend development. Remember to enjoy the process, stay curious, and celebrate your victories, no matter how small. Happy coding!" + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/en/become-cool-frontend-dev.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/become-cool-frontend-dev.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/become-cool-frontend-dev.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_DSYfhzBg.mjs b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_DSYfhzBg.mjs new file mode 100644 index 0000000..4699d73 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_DSYfhzBg.mjs @@ -0,0 +1,226 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "become-cool-frontend-developer", + "author": "ChatGPT", + "isDraft": false, + "title": "\u0421\u0442\u0430\u043D\u044C \u043A\u0440\u0443\u0442\u044B\u043C \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u043C", + "description": "\u041D\u0430\u0447\u043D\u0438\u0442\u0435 \u0441\u0432\u043E\u0439 \u043A\u0440\u0443\u0442\u043E\u0439 \u043F\u0443\u0442\u044C \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430 \u0441 \u043E\u0441\u043D\u043E\u0432 HTML, CSS \u0438 JavaScript. \u0418\u0437\u0443\u0447\u0438\u0442\u0435 \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u0438 React.js, Vue.js \u0438 Angular. \u041F\u043E\u0432\u044B\u0448\u0430\u0439\u0442\u0435 \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043E\u043D\u043B\u0430\u0439\u043D-\u043A\u0443\u0440\u0441\u043E\u0432, \u043F\u0440\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432 \u0438 \u0443\u0447\u0430\u0441\u0442\u0438\u044F \u0432 \u0436\u0438\u0437\u043D\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u041E\u0432\u043B\u0430\u0434\u0435\u0439\u0442\u0435 \u044D\u0442\u0438\u043C \u0438\u0441\u043A\u0443\u0441\u0441\u0442\u0432\u043E\u043C \u0431\u043B\u0430\u0433\u043E\u0434\u0430\u0440\u044F \u043B\u044E\u0431\u043E\u043F\u044B\u0442\u0441\u0442\u0432\u0443, \u0443\u043F\u043E\u0440\u0441\u0442\u0432\u0443 \u0438 \u043C\u044F\u0433\u043A\u0438\u043C \u043D\u0430\u0432\u044B\u043A\u0430\u043C. \u0421\u0447\u0430\u0441\u0442\u043B\u0438\u0432\u043E\u0433\u043E \u043A\u043E\u0434\u0438\u043D\u0433\u0430! \u{1F680}", + "image": "../images/astro.jpg", + "tags": ["beginingInFrontEnd"], + "categories": ["\u0441\u043E\u0432\u0435\u0442\u044B"], + "publishDate": "14/01/2024", + "language": "ru" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "\u043F\u0440\u043E\u0446\u0432\u0435\u0442\u0430\u044E\u0449\u0430\u044F-\u0432\u0441\u0435\u043B\u0435\u043D\u043D\u0430\u044F-frontend-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438", + "text": "\u041F\u0440\u043E\u0446\u0432\u0435\u0442\u0430\u044E\u0449\u0430\u044F \u0432\u0441\u0435\u043B\u0435\u043D\u043D\u0430\u044F Frontend-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438." + }, { + "depth": 2, + "slug": "\u0430\u0437\u0431\u0443\u043A\u0430-html-css-\u0438-javascript", + "text": "\u0410\u0437\u0431\u0443\u043A\u0430: HTML, CSS \u0438 JavaScript." + }, { + "depth": 4, + "slug": "html-\u044F\u0437\u044B\u043A-\u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0438-\u0433\u0438\u043F\u0435\u0440\u0442\u0435\u043A\u0441\u0442\u0430-\u0441\u043A\u0435\u043B\u0435\u0442-\u0432\u0435\u0431\u0430", + "text": "HTML (\u044F\u0437\u044B\u043A \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0438 \u0433\u0438\u043F\u0435\u0440\u0442\u0435\u043A\u0441\u0442\u0430): \u0421\u043A\u0435\u043B\u0435\u0442 \u0432\u0435\u0431\u0430." + }, { + "depth": 4, + "slug": "css-\u043A\u0430\u0441\u043A\u0430\u0434\u043D\u044B\u0435-\u0442\u0430\u0431\u043B\u0438\u0446\u044B-\u0441\u0442\u0438\u043B\u0435\u0439-\u0441\u0442\u0438\u043B\u0438\u0437\u0430\u0446\u0438\u044F-\u0434\u043B\u044F-\u044D\u0441\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439-\u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438", + "text": "CSS (\u043A\u0430\u0441\u043A\u0430\u0434\u043D\u044B\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u0441\u0442\u0438\u043B\u0435\u0439): \u0421\u0442\u0438\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u044D\u0441\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438." + }, { + "depth": 4, + "slug": "javascript-\u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435-\u0436\u0438\u0437\u043D\u0438-\u0432-\u0432\u0435\u0447\u0435\u0440\u0438\u043D\u043A\u0443", + "text": "JavaScript: \u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0436\u0438\u0437\u043D\u0438 \u0432 \u0432\u0435\u0447\u0435\u0440\u0438\u043D\u043A\u0443" + }, { + "depth": 2, + "slug": "\u043F\u0440\u0438\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435-\u0441-\u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u043E\u043C", + "text": "\u041F\u0440\u0438\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0441 \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u043E\u043C" + }, { + "depth": 4, + "slug": "reactjs-\u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u0435\u043C-\u043C\u043E\u0449\u044C-\u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432", + "text": "React.js: \u0420\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u0435\u043C \u043C\u043E\u0449\u044C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432" + }, { + "depth": 4, + "slug": "vuejs-\u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043D\u044B\u0439-\u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A", + "text": "Vue.js: \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A." + }, { + "depth": 4, + "slug": "angular-\u043F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u044B\u0439-\u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A", + "text": "Angular: \u041F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A." + }, { + "depth": 2, + "slug": "\u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u044F\u0441\u044C-\u0432-\u0443\u0447\u0435\u0431\u043D\u043E\u0435-\u043F\u043B\u0430\u0432\u0430\u043D\u0438\u0435", + "text": "\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u044F\u0441\u044C \u0432 \u0443\u0447\u0435\u0431\u043D\u043E\u0435 \u043F\u043B\u0430\u0432\u0430\u043D\u0438\u0435" + }, { + "depth": 4, + "slug": "\u043E\u043D\u043B\u0430\u0439\u043D-\u043A\u0443\u0440\u0441\u044B-\u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435-\u0432-\u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C-\u0442\u0435\u043C\u043F\u0435", + "text": "\u041E\u043D\u043B\u0430\u0439\u043D-\u043A\u0443\u0440\u0441\u044B: \u041E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 \u0432 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C \u0442\u0435\u043C\u043F\u0435" + }, { + "depth": 4, + "slug": "projects-\u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435-\u043D\u0430-\u043F\u0440\u0430\u043A\u0442\u0438\u043A\u0435", + "text": "Projects: \u041E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 \u043D\u0430 \u043F\u0440\u0430\u043A\u0442\u0438\u043A\u0435." + }, { + "depth": 4, + "slug": "\u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435-\u0441-\u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E\u043C-\u0432\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435-\u0432-\u044D\u043A\u043E\u0441\u0438\u0441\u0442\u0435\u043C\u0443-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432", + "text": "\u0412\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E\u043C: \u0412\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435 \u0432 \u044D\u043A\u043E\u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432." + }, { + "depth": 2, + "slug": "\u043B\u0438\u0447\u043D\u044B\u0435-\u0441\u043E\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F-\u0438-\u0441\u043B\u043E\u0432\u0430-\u043C\u0443\u0434\u0440\u043E\u0441\u0442\u0438", + "text": "\u041B\u0438\u0447\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0438 \u0441\u043B\u043E\u0432\u0430 \u043C\u0443\u0434\u0440\u043E\u0441\u0442\u0438." + }, { + "depth": 3, + "slug": "\u0437\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435-\u0432\u0430\u0448\u0435-\u043F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435-\u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F-\u0441\u0435\u0439\u0447\u0430\u0441", + "text": "\u0417\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435: \u0412\u0430\u0448\u0435 \u043F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0441\u0435\u0439\u0447\u0430\u0441" + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + h2: "h2", + h3: "h3", + h4: "h4", + p: "p", + strong: "strong", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "\u0412\u0430\u0448\u0435 \u043F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u043A \u043C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u0443 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438" + }), "."] + }), "\n", createVNode(_components.p, { + children: "\u0412 \u0431\u044B\u0441\u0442\u0440\u043E \u043C\u0435\u043D\u044F\u044E\u0449\u0435\u043C\u0441\u044F \u043C\u0438\u0440\u0435 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u0432\u044B\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u0434\u0438\u043D\u0430\u043C\u0438\u0447\u043D\u0430\u044F \u0438 \u043F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u043E \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044E\u0449\u0430\u044F\u0441\u044F \u043E\u0431\u043B\u0430\u0441\u0442\u044C. \u041F\u043E\u0441\u043A\u043E\u043B\u044C\u043A\u0443 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043F\u0440\u0438\u043E\u0431\u0440\u0435\u0442\u0430\u0435\u0442 \u0432\u0441\u0435 \u0431\u043E\u043B\u044C\u0448\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438 \u0438\u0433\u0440\u0430\u044E\u0442 \u0436\u0438\u0437\u043D\u0435\u043D\u043D\u043E \u0432\u0430\u0436\u043D\u0443\u044E \u0440\u043E\u043B\u044C \u0432 \u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438 \u0446\u0438\u0444\u0440\u043E\u0432\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430, \u0441 \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043C\u044B \u0441\u0442\u0430\u043B\u043A\u0438\u0432\u0430\u0435\u043C\u0441\u044F \u0435\u0436\u0435\u0434\u043D\u0435\u0432\u043D\u043E. \u0415\u0441\u043B\u0438 \u0432\u044B \u0441\u0442\u0440\u0435\u043C\u0438\u0442\u0435\u0441\u044C \u0441\u0442\u0430\u0442\u044C \u043A\u0440\u0443\u0442\u044B\u043C \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u043C, \u044D\u0442\u0430 \u0441\u0442\u0430\u0442\u044C\u044F - \u0432\u0430\u0448 \u043F\u0443\u0442\u0435\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u043F\u043E \u043E\u0432\u043B\u0430\u0434\u0435\u043D\u0438\u044E \u0438\u0441\u043A\u0443\u0441\u0441\u0442\u0432\u043E\u043C \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0438 \u0438\u043D\u0442\u0435\u0440\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u043E\u0432. \u041C\u044B \u0440\u0430\u0441\u0441\u043C\u043E\u0442\u0440\u0438\u043C \u043F\u043E\u043F\u0443\u043B\u044F\u0440\u043D\u044B\u0435 \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u0438, \u043E\u0431\u0441\u0443\u0434\u0438\u043C, \u0441 \u0447\u0435\u0433\u043E \u043D\u0430\u0447\u0430\u0442\u044C \u0441\u0432\u043E\u0435 \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435, \u0438 \u0434\u043E\u0431\u0430\u0432\u0438\u043C \u043D\u0435\u043C\u043D\u043E\u0433\u043E \u043B\u0438\u0447\u043D\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430." + }), "\n", createVNode(_components.h2, { + id: "\u043F\u0440\u043E\u0446\u0432\u0435\u0442\u0430\u044E\u0449\u0430\u044F-\u0432\u0441\u0435\u043B\u0435\u043D\u043D\u0430\u044F-frontend-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438", + children: [createVNode(_components.strong, { + children: "\u041F\u0440\u043E\u0446\u0432\u0435\u0442\u0430\u044E\u0449\u0430\u044F \u0432\u0441\u0435\u043B\u0435\u043D\u043D\u0430\u044F Frontend-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438" + }), "."] + }), "\n", createVNode(_components.p, { + children: "\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u0432\u0438\u0434\u0438\u043C\u043E\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 \u0438\u043B\u0438 \u0432\u0435\u0431-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F, \u0441 \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044E\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438. \u041E\u0442 \u043F\u0440\u043E\u0435\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043E\u0442\u0437\u044B\u0432\u0447\u0438\u0432\u044B\u0445 \u043C\u0430\u043A\u0435\u0442\u043E\u0432 \u0434\u043E \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u0438\u044F \u0438\u043D\u0442\u0435\u0440\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438 \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434\u0430 \u0432\u043E\u043F\u043B\u043E\u0449\u0430\u044E\u0442 \u0434\u0438\u0437\u0430\u0439\u043D \u0432 \u0436\u0438\u0437\u043D\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u044E HTML, CSS \u0438 JavaScript. \u0427\u0442\u043E\u0431\u044B \u0441\u0442\u0430\u0442\u044C \u043A\u0440\u0443\u0442\u044B\u043C \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u043C, \u043E\u0437\u043D\u0430\u043A\u043E\u043C\u044C\u0442\u0435\u0441\u044C \u0441 \u043E\u0441\u043D\u043E\u0432\u043D\u044B\u043C\u0438 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u044F\u043C\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043B\u0435\u0436\u0430\u0442 \u0432 \u043E\u0441\u043D\u043E\u0432\u0435 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438." + }), "\n", createVNode(_components.h2, { + id: "\u0430\u0437\u0431\u0443\u043A\u0430-html-css-\u0438-javascript", + children: [createVNode(_components.strong, { + children: "\u0410\u0437\u0431\u0443\u043A\u0430: HTML, CSS \u0438 JavaScript" + }), "."] + }), "\n", createVNode(_components.h4, { + id: "html-\u044F\u0437\u044B\u043A-\u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0438-\u0433\u0438\u043F\u0435\u0440\u0442\u0435\u043A\u0441\u0442\u0430-\u0441\u043A\u0435\u043B\u0435\u0442-\u0432\u0435\u0431\u0430", + children: [createVNode(_components.strong, { + children: "HTML (\u044F\u0437\u044B\u043A \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0438 \u0433\u0438\u043F\u0435\u0440\u0442\u0435\u043A\u0441\u0442\u0430): \u0421\u043A\u0435\u043B\u0435\u0442 \u0432\u0435\u0431\u0430" + }), "."] + }), "\n", createVNode(_components.p, { + children: "HTML - \u044D\u0442\u043E \u043E\u0441\u043D\u043E\u0432\u0430 \u043B\u044E\u0431\u043E\u0439 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041E\u043D \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u0430\u0437\u043E\u0432\u0443\u044E \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435, \u0442\u0430\u043A\u0438\u0435 \u043A\u0430\u043A \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438, \u0430\u0431\u0437\u0430\u0446\u044B, \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0438 \u0441\u0441\u044B\u043B\u043A\u0438. \u0414\u043B\u044F \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430 \u043E\u0441\u0432\u043E\u0438\u0442\u044C HTML - \u0432\u0441\u0435 \u0440\u0430\u0432\u043D\u043E \u0447\u0442\u043E \u0432\u044B\u0443\u0447\u0438\u0442\u044C \u0430\u043B\u0444\u0430\u0432\u0438\u0442, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u043F\u043E\u0433\u0440\u0443\u0437\u0438\u0442\u044C\u0441\u044F \u0432 \u043C\u0438\u0440 \u0441\u043B\u043E\u0432." + }), "\n", createVNode(_components.h4, { + id: "css-\u043A\u0430\u0441\u043A\u0430\u0434\u043D\u044B\u0435-\u0442\u0430\u0431\u043B\u0438\u0446\u044B-\u0441\u0442\u0438\u043B\u0435\u0439-\u0441\u0442\u0438\u043B\u0438\u0437\u0430\u0446\u0438\u044F-\u0434\u043B\u044F-\u044D\u0441\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439-\u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438", + children: [createVNode(_components.strong, { + children: "CSS (\u043A\u0430\u0441\u043A\u0430\u0434\u043D\u044B\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u0441\u0442\u0438\u043B\u0435\u0439): \u0421\u0442\u0438\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u044D\u0441\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438" + }), "."] + }), "\n", createVNode(_components.p, { + children: "CSS - \u044D\u0442\u043E \u0441\u0442\u0438\u043B\u0438\u0441\u0442 \u0432 \u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0435. \u041E\u043D \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u043C\u0430\u043A\u0435\u0442\u043E\u043C, \u0446\u0432\u0435\u0442\u0430\u043C\u0438 \u0438 \u0448\u0440\u0438\u0444\u0442\u0430\u043C\u0438, \u043F\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044F \u043E\u0431\u044B\u0447\u043D\u044B\u0439 HTML-\u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0432 \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0448\u0435\u0434\u0435\u0432\u0440. \u041F\u043E\u043D\u0438\u043C\u0430\u043D\u0438\u0435 CSS \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0434\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043E\u0442\u0437\u044B\u0432\u0447\u0438\u0432\u044B\u0445 \u0438 \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432." + }), "\n", createVNode(_components.h4, { + id: "javascript-\u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435-\u0436\u0438\u0437\u043D\u0438-\u0432-\u0432\u0435\u0447\u0435\u0440\u0438\u043D\u043A\u0443", + children: createVNode(_components.strong, { + children: "JavaScript: \u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0436\u0438\u0437\u043D\u0438 \u0432 \u0432\u0435\u0447\u0435\u0440\u0438\u043D\u043A\u0443" + }) + }), "\n", createVNode(_components.p, { + children: "JavaScript - \u044D\u0442\u043E \u044F\u0437\u044B\u043A \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043F\u0440\u0438\u0432\u043D\u043E\u0441\u0438\u0442 \u0438\u043D\u0442\u0435\u0440\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0432 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041E\u043D \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u0434\u0438\u043D\u0430\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442, \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0432\u0432\u043E\u0434 \u0438 \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0441 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043C\u0438. JavaScript - \u044D\u0442\u043E \u0434\u0432\u0438\u0436\u0443\u0449\u0430\u044F \u0441\u0438\u043B\u0430 \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0435\u0433\u043E \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E \u0434\u043B\u044F \u0432\u0441\u0435\u0445, \u043A\u0442\u043E \u0441\u0442\u0440\u0435\u043C\u0438\u0442\u0441\u044F \u0441\u0442\u0430\u0442\u044C \u043C\u0430\u044D\u0441\u0442\u0440\u043E \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434\u0430." + }), "\n", createVNode(_components.h2, { + id: "\u043F\u0440\u0438\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435-\u0441-\u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u043E\u043C", + children: createVNode(_components.strong, { + children: "\u041F\u0440\u0438\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0441 \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u043E\u043C" + }) + }), "\n", createVNode(_components.h4, { + id: "reactjs-\u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u0435\u043C-\u043C\u043E\u0449\u044C-\u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432", + children: createVNode(_components.strong, { + children: "React.js: \u0420\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u0435\u043C \u043C\u043E\u0449\u044C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432" + }) + }), "\n", createVNode(_components.p, { + children: "\u041A\u043E\u0433\u0434\u0430 \u0440\u0435\u0447\u044C \u0437\u0430\u0445\u043E\u0434\u0438\u0442 \u043E \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u0430\u0445, React.js \u0441\u0442\u043E\u0438\u0442 \u043E\u0441\u043E\u0431\u043D\u044F\u043A\u043E\u043C. \u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u044B\u0439 \u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0439 Facebook, React.js \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u043E\u0431\u043E\u0439 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 JavaScript \u0434\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432. \u0415\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430, \u043E\u0441\u043D\u043E\u0432\u0430\u043D\u043D\u0430\u044F \u043D\u0430 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430\u0445, \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430\u043C \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u043C\u043E\u0434\u0443\u043B\u044C\u043D\u044B\u0435 \u0438 \u043C\u043D\u043E\u0433\u043E\u043A\u0440\u0430\u0442\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0443\u043F\u0440\u043E\u0449\u0430\u044F \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438. \u0421\u043E\u0437\u0434\u0430\u0435\u0442\u0435 \u043B\u0438 \u0432\u044B \u043F\u0440\u043E\u0441\u0442\u043E\u0439 \u0441\u0430\u0439\u0442 \u0438\u043B\u0438 \u0441\u043B\u043E\u0436\u043D\u043E\u0435 \u043E\u0434\u043D\u043E\u0441\u0442\u0440\u0430\u043D\u0438\u0447\u043D\u043E\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435, React.js - \u0446\u0435\u043D\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432 \u0432\u0430\u0448\u0435\u043C \u0430\u0440\u0441\u0435\u043D\u0430\u043B\u0435." + }), "\n", createVNode(_components.h4, { + id: "vuejs-\u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043D\u044B\u0439-\u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A", + children: [createVNode(_components.strong, { + children: "Vue.js: \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A" + }), "."] + }), "\n", createVNode(_components.p, { + children: "Vue.js - \u0435\u0449\u0435 \u043E\u0434\u0438\u043D \u043F\u043E\u043F\u0443\u043B\u044F\u0440\u043D\u044B\u0439 \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A, \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0439 \u0441\u0432\u043E\u0435\u0439 \u043F\u0440\u043E\u0441\u0442\u043E\u0442\u043E\u0439 \u0438 \u043B\u0435\u0433\u043A\u043E\u0441\u0442\u044C\u044E \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438. \u041E\u043D \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D \u0434\u043B\u044F \u043F\u043E\u0441\u0442\u0435\u043F\u0435\u043D\u043D\u043E\u0433\u043E \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u0438\u044F, \u0447\u0442\u043E \u0434\u0435\u043B\u0430\u0435\u0442 \u0435\u0433\u043E \u043E\u0442\u043B\u0438\u0447\u043D\u044B\u043C \u0432\u044B\u0431\u043E\u0440\u043E\u043C \u043A\u0430\u043A \u0434\u043B\u044F \u043D\u0430\u0447\u0438\u043D\u0430\u044E\u0449\u0438\u0445, \u0442\u0430\u043A \u0438 \u0434\u043B\u044F \u043E\u043F\u044B\u0442\u043D\u044B\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432. Vue.js \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u0440\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0435 \u0438 \u0434\u0438\u043D\u0430\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044B \u0441 \u043C\u0435\u043D\u044C\u0448\u0438\u043C\u0438 \u043D\u0430\u043A\u043B\u0430\u0434\u043D\u044B\u043C\u0438 \u0440\u0430\u0441\u0445\u043E\u0434\u0430\u043C\u0438, \u0434\u0435\u043B\u0430\u044F \u0432\u0430\u0448\u0443 \u043A\u043E\u0434\u043E\u0432\u0443\u044E \u0431\u0430\u0437\u0443 \u0447\u0438\u0441\u0442\u043E\u0439 \u0438 \u0443\u0434\u043E\u0431\u043D\u043E\u0439 \u0434\u043B\u044F \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u044F." + }), "\n", createVNode(_components.h4, { + id: "angular-\u043F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u044B\u0439-\u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A", + children: [createVNode(_components.strong, { + children: "Angular: \u041F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A" + }), "."] + }), "\n", createVNode(_components.p, { + children: "Angular, \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u044B\u0439 \u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0439 \u043A\u043E\u043C\u043F\u0430\u043D\u0438\u0435\u0439 Google, \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u043E\u0431\u043E\u0439 \u043A\u043E\u043C\u043F\u043B\u0435\u043A\u0441\u043D\u044B\u0439 \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043F\u043E\u043B\u043D\u043E\u0435 \u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0434\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043A\u0440\u0443\u043F\u043D\u043E\u043C\u0430\u0441\u0448\u0442\u0430\u0431\u043D\u044B\u0445 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439. \u041E\u043D \u043E\u0441\u043D\u0430\u0449\u0435\u043D \u0442\u0430\u043A\u0438\u043C\u0438 \u043C\u043E\u0449\u043D\u044B\u043C\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u044F\u043C\u0438, \u043A\u0430\u043A \u0434\u0432\u0443\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u044F\u044F \u043F\u0440\u0438\u0432\u044F\u0437\u043A\u0430 \u0434\u0430\u043D\u043D\u044B\u0445, \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0435\u0439 \u0438 \u043D\u0430\u0434\u0435\u0436\u043D\u044B\u0439 CLI (\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438). \u0425\u043E\u0442\u044F Angular \u0431\u043E\u043B\u0435\u0435 \u0441\u043B\u043E\u0436\u0435\u043D \u0432 \u043E\u0441\u0432\u043E\u0435\u043D\u0438\u0438 \u043F\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044E \u0441 React.js \u0438 Vue.js, \u0435\u0433\u043E \u043E\u0441\u0432\u043E\u0435\u043D\u0438\u0435 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043F\u0443\u0442\u044C \u043A \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043A\u043E\u0440\u043F\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u0432\u043D\u044F." + }), "\n", createVNode(_components.h2, { + id: "\u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u044F\u0441\u044C-\u0432-\u0443\u0447\u0435\u0431\u043D\u043E\u0435-\u043F\u043B\u0430\u0432\u0430\u043D\u0438\u0435", + children: createVNode(_components.strong, { + children: "\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u044F\u0441\u044C \u0432 \u0443\u0447\u0435\u0431\u043D\u043E\u0435 \u043F\u043B\u0430\u0432\u0430\u043D\u0438\u0435" + }) + }), "\n", createVNode(_components.h4, { + id: "\u043E\u043D\u043B\u0430\u0439\u043D-\u043A\u0443\u0440\u0441\u044B-\u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435-\u0432-\u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C-\u0442\u0435\u043C\u043F\u0435", + children: createVNode(_components.strong, { + children: "\u041E\u043D\u043B\u0430\u0439\u043D-\u043A\u0443\u0440\u0441\u044B: \u041E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 \u0432 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C \u0442\u0435\u043C\u043F\u0435" + }) + }), "\n", createVNode(_components.p, { + children: "\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043E\u0433\u0440\u043E\u043C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u043D\u043B\u0430\u0439\u043D-\u043A\u0443\u0440\u0441\u043E\u0432, \u043F\u043E\u0441\u0432\u044F\u0449\u0435\u043D\u043D\u044B\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434\u0430. \u0422\u0430\u043A\u0438\u0435 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u044B, \u043A\u0430\u043A Udemy, Coursera \u0438 freeCodeCamp, \u043F\u0440\u0435\u0434\u043B\u0430\u0433\u0430\u044E\u0442 \u043A\u0443\u0440\u0441\u044B \u043E\u0442 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0434\u043E \u043F\u0440\u043E\u0434\u0432\u0438\u043D\u0443\u0442\u043E\u0433\u043E \u0443\u0440\u043E\u0432\u043D\u044F. \u0412\u044B\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043A\u0443\u0440\u0441\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0442 \u0432\u0430\u0448\u0435\u043C\u0443 \u0441\u0442\u0438\u043B\u044E \u0438 \u0442\u0435\u043C\u043F\u0443 \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u044F, \u0438 \u043D\u0435 \u0441\u0442\u0435\u0441\u043D\u044F\u0439\u0442\u0435\u0441\u044C \u0438\u0437\u0443\u0447\u0430\u0442\u044C \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u0435\u0441\u0443\u0440\u0441\u043E\u0432, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0432\u0441\u0435\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0435\u0435 \u043F\u043E\u043D\u0438\u043C\u0430\u043D\u0438\u0435." + }), "\n", createVNode(_components.h4, { + id: "projects-\u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435-\u043D\u0430-\u043F\u0440\u0430\u043A\u0442\u0438\u043A\u0435", + children: [createVNode(_components.strong, { + children: "Projects: \u041E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 \u043D\u0430 \u043F\u0440\u0430\u043A\u0442\u0438\u043A\u0435" + }), "."] + }), "\n", createVNode(_components.p, { + children: "\u0422\u0435\u043E\u0440\u0438\u044F \u0432\u0430\u0436\u043D\u0430, \u043D\u043E \u043F\u0440\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043E\u043F\u044B\u0442 - \u044D\u0442\u043E \u0442\u043E, \u0433\u0434\u0435 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435 \u043C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E. \u041D\u0430\u0447\u043D\u0438\u0442\u0435 \u0441 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u0441\u0442\u044B\u0445 \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432 \u0438 \u043F\u043E\u0441\u0442\u0435\u043F\u0435\u043D\u043D\u043E \u043F\u043E\u0432\u044B\u0448\u0430\u0439\u0442\u0435 \u0438\u0445 \u0441\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u044C. GitHub \u043C\u043E\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044C \u0432\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u043E\u0432\u043E\u0439 \u043F\u043B\u043E\u0449\u0430\u0434\u043A\u043E\u0439 \u0434\u043B\u044F \u0434\u0435\u043C\u043E\u043D\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0432\u043E\u0435\u0439 \u0440\u0430\u0431\u043E\u0442\u044B, \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u0438 \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u043E\u0439 \u0441\u0432\u044F\u0437\u0438." + }), "\n", createVNode(_components.h4, { + id: "\u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435-\u0441-\u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E\u043C-\u0432\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435-\u0432-\u044D\u043A\u043E\u0441\u0438\u0441\u0442\u0435\u043C\u0443-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432", + children: [createVNode(_components.strong, { + children: "\u0412\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E\u043C: \u0412\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435 \u0432 \u044D\u043A\u043E\u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432" + }), "."] + }), "\n", createVNode(_components.p, { + children: "\u0423\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432 \u0431\u0435\u0441\u0446\u0435\u043D\u043D\u043E. \u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u044F\u0439\u0442\u0435\u0441\u044C \u043A \u0442\u0430\u043A\u0438\u043C \u0444\u043E\u0440\u0443\u043C\u0430\u043C, \u043A\u0430\u043A Stack Overflow, \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0432 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F\u0445 \u043D\u0430 Reddit \u0438 \u043E\u0431\u0449\u0430\u0439\u0442\u0435\u0441\u044C \u0441 \u043A\u043E\u043B\u043B\u0435\u0433\u0430\u043C\u0438-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430\u043C\u0438 \u043D\u0430 \u0442\u0430\u043A\u0438\u0445 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0430\u0445, \u043A\u0430\u043A Twitter \u0438 LinkedIn. \u041E\u0431\u0449\u0435\u043D\u0438\u0435 \u0432 \u0441\u0435\u0442\u0438 \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u043E\u0442\u043A\u0440\u043E\u0435\u0442 \u0432\u0430\u043C \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u043F\u0435\u0440\u0441\u043F\u0435\u043A\u0442\u0438\u0432\u044B, \u043D\u043E \u0438 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0442 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0443, \u043A\u043E\u0433\u0434\u0430 \u0432\u044B \u0441\u0442\u043E\u043B\u043A\u043D\u0435\u0442\u0435\u0441\u044C \u0441 \u043F\u0440\u0435\u043F\u044F\u0442\u0441\u0442\u0432\u0438\u044F\u043C\u0438 \u043D\u0430 \u0441\u0432\u043E\u0435\u043C \u043F\u0443\u0442\u0438 \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u044F." + }), "\n", createVNode(_components.h2, { + id: "\u043B\u0438\u0447\u043D\u044B\u0435-\u0441\u043E\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F-\u0438-\u0441\u043B\u043E\u0432\u0430-\u043C\u0443\u0434\u0440\u043E\u0441\u0442\u0438", + children: [createVNode(_components.strong, { + children: "\u041B\u0438\u0447\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0438 \u0441\u043B\u043E\u0432\u0430 \u043C\u0443\u0434\u0440\u043E\u0441\u0442\u0438" + }), "."] + }), "\n", createVNode(_components.p, { + children: "\u0412\u0441\u0442\u0443\u043F\u0430\u044F \u043D\u0430 \u043F\u0443\u0442\u044C \u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u043A\u0440\u0443\u0442\u043E\u0433\u043E \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430, \u043F\u043E\u043C\u043D\u0438\u0442\u0435, \u0447\u0442\u043E \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u044F - \u044D\u0442\u043E \u043C\u0430\u0440\u0430\u0444\u043E\u043D, \u0430 \u043D\u0435 \u0441\u043F\u0440\u0438\u043D\u0442. \u041F\u0440\u0438\u043D\u0438\u043C\u0430\u0439\u0442\u0435 \u0442\u0440\u0443\u0434\u043D\u043E\u0441\u0442\u0438 \u043A\u0430\u043A \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0434\u043B\u044F \u0440\u043E\u0441\u0442\u0430 \u0438 \u043D\u0435 \u0431\u043E\u0439\u0442\u0435\u0441\u044C \u0432\u044B\u0445\u043E\u0434\u0438\u0442\u044C \u0438\u0437 \u0437\u043E\u043D\u044B \u043A\u043E\u043C\u0444\u043E\u0440\u0442\u0430. \u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0438\u043D\u0434\u0443\u0441\u0442\u0440\u0438\u044F \u0434\u0438\u043D\u0430\u043C\u0438\u0447\u043D\u0430, \u0438 \u043B\u044E\u0431\u043E\u0437\u043D\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C - \u0432\u0430\u0448 \u043A\u043B\u044E\u0447 \u043A \u0442\u043E\u043C\u0443, \u0447\u0442\u043E\u0431\u044B \u043E\u0441\u0442\u0430\u0432\u0430\u0442\u044C\u0441\u044F \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u044B\u043C." + }), "\n", createVNode(_components.p, { + children: "\u0412\u044B\u0431\u0438\u0440\u0430\u044F \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A, \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0439\u0442\u0435 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u0438 \u0441\u0432\u043E\u0438 \u043B\u0438\u0447\u043D\u044B\u0435 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0435\u043D\u0438\u044F. \u0423 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u0430 \u0435\u0441\u0442\u044C \u0441\u0432\u043E\u0438 \u0441\u0438\u043B\u044C\u043D\u044B\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B, \u0438 \u0432\u044B\u0431\u043E\u0440 \u043B\u0443\u0447\u0448\u0435\u0433\u043E \u0434\u043B\u044F \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0442\u0430\u043A\u0438\u0445 \u0444\u0430\u043A\u0442\u043E\u0440\u043E\u0432, \u043A\u0430\u043A \u043C\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043C\u043E\u0441\u0442\u044C, \u043F\u0440\u043E\u0441\u0442\u043E\u0442\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0438 \u043A\u0440\u0438\u0432\u0430\u044F \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u044F, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0432\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442." + }), "\n", createVNode(_components.p, { + children: "\u041D\u0430\u043A\u043E\u043D\u0435\u0446, \u043D\u0435 \u0437\u0430\u0431\u044B\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043E \u0432 \u043C\u0438\u0440\u0435 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0439 \u0446\u0435\u043D\u044F\u0442\u0441\u044F \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435\u0445\u043D\u0438\u0447\u0435\u0441\u043A\u0438\u0435, \u043D\u043E \u0438 \u201C\u043C\u044F\u0433\u043A\u0438\u0435\u201D \u043D\u0430\u0432\u044B\u043A\u0438. \u042D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043A\u043E\u043C\u043C\u0443\u043D\u0438\u043A\u0430\u0446\u0438\u044F, \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0438 \u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u044F \u0432\u044B\u0434\u0435\u043B\u044F\u0442 \u0432\u0430\u0441 \u043A\u0430\u043A \u043A\u0440\u0443\u0442\u043E\u0433\u043E \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430 \u0432 \u0433\u043B\u0430\u0437\u0430\u0445 \u0440\u0430\u0431\u043E\u0442\u043E\u0434\u0430\u0442\u0435\u043B\u0435\u0439 \u0438 \u043A\u043E\u043B\u043B\u0435\u0433." + }), "\n", createVNode(_components.h3, { + id: "\u0437\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435-\u0432\u0430\u0448\u0435-\u043F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435-\u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F-\u0441\u0435\u0439\u0447\u0430\u0441", + children: createVNode(_components.strong, { + children: "\u0417\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435: \u0412\u0430\u0448\u0435 \u043F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0441\u0435\u0439\u0447\u0430\u0441" + }) + }), "\n", createVNode(_components.p, { + children: "\u0421\u0442\u0430\u0442\u044C \u043A\u0440\u0443\u0442\u044B\u043C \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u043C - \u044D\u0442\u043E \u0443\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0438 \u043F\u043E\u043B\u0435\u0437\u043D\u043E\u0435 \u043F\u0440\u0438\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435. \u0412\u043E\u043E\u0440\u0443\u0436\u0435\u043D\u043D\u044B\u0439 \u0442\u0432\u0435\u0440\u0434\u044B\u043C \u043F\u043E\u043D\u0438\u043C\u0430\u043D\u0438\u0435\u043C HTML, CSS \u0438 JavaScript \u0438 \u0438\u0437\u0443\u0447\u0438\u0432\u0448\u0438\u0439 \u0442\u0430\u043A\u0438\u0435 \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u0438, \u043A\u0430\u043A React.js, Vue.js \u0438 Angular, \u0432\u044B \u0443\u0436\u0435 \u043D\u0430 \u043F\u0443\u0442\u0438 \u043A \u043E\u0432\u043B\u0430\u0434\u0435\u043D\u0438\u044E \u0438\u0441\u043A\u0443\u0441\u0441\u0442\u0432\u043E\u043C \u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438. \u041D\u0435 \u0437\u0430\u0431\u044B\u0432\u0430\u0439\u0442\u0435 \u043D\u0430\u0441\u043B\u0430\u0436\u0434\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u043E\u043C, \u043D\u0435 \u0442\u0435\u0440\u044F\u0439\u0442\u0435 \u043B\u044E\u0431\u043E\u043F\u044B\u0442\u0441\u0442\u0432\u0430 \u0438 \u043F\u0440\u0430\u0437\u0434\u043D\u0443\u0439\u0442\u0435 \u0441\u0432\u043E\u0438 \u043F\u043E\u0431\u0435\u0434\u044B, \u043A\u0430\u043A\u0438\u043C\u0438 \u0431\u044B \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0438\u043C\u0438 \u043E\u043D\u0438 \u043D\u0438 \u0431\u044B\u043B\u0438. \u0421\u0447\u0430\u0441\u0442\u043B\u0438\u0432\u043E\u0433\u043E \u043A\u043E\u0434\u0438\u043D\u0433\u0430!" + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/ru/become-cool-frontend-dev.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/become-cool-frontend-dev.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/become-cool-frontend-dev.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_XHdtL4Mj.mjs b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_XHdtL4Mj.mjs new file mode 100644 index 0000000..dd08bee --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/become-cool-frontend-dev_XHdtL4Mj.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./become-cool-frontend-dev_CoszH-iC.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_BFYbPr9e.mjs b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_BFYbPr9e.mjs new file mode 100644 index 0000000..4ef7a7b --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_BFYbPr9e.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./cool-plugins-for-vs-code_CF6JBJkR.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_BLwiMiVs.mjs b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_BLwiMiVs.mjs new file mode 100644 index 0000000..1f5c46c --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_BLwiMiVs.mjs @@ -0,0 +1,139 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "cool-plugins-for-vscode", + "author": "ChatGPT", + "isDraft": false, + "title": "\u041A\u0440\u0443\u0442\u044B\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B \u0434\u043B\u044F VS Code", + "description": "\u0420\u0430\u0441\u0448\u0438\u0440\u044C\u0442\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438 Visual Studio Code \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0442\u0430\u043A\u0438\u0445 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u044B\u0445 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432, \u043A\u0430\u043A ESLint, Prettier, GitLens, Live Server \u0438 \u0434\u0440\u0443\u0433\u0438\u0445. \u041F\u043E\u0432\u044B\u0441\u044C\u0442\u0435 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0438 \u0440\u0430\u0434\u043E\u0441\u0442\u044C \u043E\u0442 \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u043A\u043E\u0434\u0430 \u0431\u0435\u0437 \u043B\u0438\u0448\u043D\u0438\u0445 \u0443\u0441\u0438\u043B\u0438\u0439.", + "image": "../images/extension.jpg", + "tags": ["tipsAboutVsCode"], + "categories": ["\u043B\u0430\u0439\u0444\u0425\u0430\u043A\u0438"], + "publishDate": "24/10/2023", + "language": "ru" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "1-eslint", + "text": "1. ESLint" + }, { + "depth": 2, + "slug": "2-\u043A\u0440\u0430\u0441\u0438\u0432\u0435\u0435", + "text": "2. \u041A\u0440\u0430\u0441\u0438\u0432\u0435\u0435" + }, { + "depth": 2, + "slug": "3-gitlens", + "text": "3. GitLens" + }, { + "depth": 2, + "slug": "4-\u0436\u0438\u0432\u043E\u0439-\u0441\u0435\u0440\u0432\u0435\u0440", + "text": "4. \u0416\u0438\u0432\u043E\u0439 \u0441\u0435\u0440\u0432\u0435\u0440" + }, { + "depth": 2, + "slug": "5-\u0440\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0430-\u043F\u0430\u0440-\u0441\u043A\u043E\u0431\u043E\u043A", + "text": "5. \u0420\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0430 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A" + }, { + "depth": 2, + "slug": "6-\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430-\u043E\u0440\u0444\u043E\u0433\u0440\u0430\u0444\u0438\u0438-\u043A\u043E\u0434\u0430", + "text": "6. \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043E\u0440\u0444\u043E\u0433\u0440\u0430\u0444\u0438\u0438 \u043A\u043E\u0434\u0430" + }, { + "depth": 2, + "slug": "7-rest-\u043A\u043B\u0438\u0435\u043D\u0442", + "text": "7. REST-\u043A\u043B\u0438\u0435\u043D\u0442" + }, { + "depth": 2, + "slug": "8-docker", + "text": "8. Docker" + }, { + "depth": 2, + "slug": "\u0437\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435", + "text": "\u0417\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435" + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + h2: "h2", + p: "p", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.p, { + children: "Visual Studio Code (VS Code) \u0431\u044B\u0441\u0442\u0440\u043E \u0441\u0442\u0430\u043B \u043E\u0434\u043D\u0438\u043C \u0438\u0437 \u0441\u0430\u043C\u044B\u0445 \u043B\u044E\u0431\u0438\u043C\u044B\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u0432 \u043A\u043E\u0434\u0430 \u0432 \u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432 \u0431\u043B\u0430\u0433\u043E\u0434\u0430\u0440\u044F \u0441\u0432\u043E\u0435\u0439 \u043F\u0440\u043E\u0441\u0442\u043E\u0442\u0435, \u0433\u0438\u0431\u043A\u043E\u0441\u0442\u0438 \u0438 \u043E\u0433\u0440\u043E\u043C\u043D\u043E\u043C\u0443 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0439. \u042D\u0442\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F, \u0447\u0430\u0441\u0442\u043E \u043D\u0430\u0437\u044B\u0432\u0430\u0435\u043C\u044B\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u0430\u043C\u0438, \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u044E\u0442 \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u044C VS Code, \u043F\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044F \u0435\u0433\u043E \u0432 \u043C\u043E\u0449\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0434\u043B\u044F \u0440\u0435\u0448\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0445 \u0437\u0430\u0434\u0430\u0447 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F. \u0412 \u044D\u0442\u043E\u0439 \u0441\u0442\u0430\u0442\u044C\u0435 \u043C\u044B \u0440\u0430\u0441\u0441\u043C\u043E\u0442\u0440\u0438\u043C \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0438\u0437 \u0441\u0430\u043C\u044B\u0445 \u043A\u0440\u0443\u0442\u044B\u0445 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432, \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0434\u043B\u044F VS Code \u0438 \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0449\u0438\u0445 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u043C \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E\u0441\u0442\u044F\u043C \u0438 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0435\u043D\u0438\u044F\u043C." + }), "\n", createVNode(_components.h2, { + id: "1-eslint", + children: "1. ESLint" + }), "\n", createVNode(_components.p, { + children: "\u0414\u043B\u044F JavaScript-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432 ESLint \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u043C \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u043C. \u041E\u043D \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043B\u0438\u043D\u0442\u0438\u043D\u0433 JavaScript-\u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438, \u0433\u0430\u0440\u0430\u043D\u0442\u0438\u0440\u0443\u044F, \u0447\u0442\u043E \u043E\u043D \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u0430\u043C \u043A\u043E\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0438 \u043B\u0443\u0447\u0448\u0438\u043C \u043F\u0440\u0430\u043A\u0442\u0438\u043A\u0430\u043C. \u0418\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044F \u0441 ESLint \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u044B\u044F\u0432\u043B\u044F\u0442\u044C \u043E\u0448\u0438\u0431\u043A\u0438 \u0438 \u0443\u043B\u0443\u0447\u0448\u0430\u0442\u044C \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u043E\u0434\u0430 \u0432 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0435 \u0435\u0433\u043E \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u0438\u044F." + }), "\n", createVNode(_components.h2, { + id: "2-\u043A\u0440\u0430\u0441\u0438\u0432\u0435\u0435", + children: "2. \u041A\u0440\u0430\u0441\u0438\u0432\u0435\u0435" + }), "\n", createVNode(_components.p, { + children: "\u041F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043A\u043E\u0434\u0430 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0434\u043B\u044F \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u043D\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B \u0438 \u0443\u0434\u043E\u0431\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043D\u0438\u044F. Prettier - \u044D\u0442\u043E \u043F\u043E\u043F\u0443\u043B\u044F\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0449\u0438\u043A \u043A\u043E\u0434\u0430, \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0449\u0438\u0439 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u044F\u0437\u044B\u043A\u0438. \u042D\u0442\u043E\u0442 \u043F\u043B\u0430\u0433\u0438\u043D \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0448 \u043A\u043E\u0434, \u0434\u0435\u043B\u0430\u044F \u0435\u0433\u043E \u0430\u043A\u043A\u0443\u0440\u0430\u0442\u043D\u044B\u043C \u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u043C \u0431\u0435\u0437 \u0440\u0443\u0447\u043D\u043E\u0433\u043E \u0442\u0440\u0443\u0434\u0430. \u041E\u043D \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0448\u0438\u0440\u043E\u043A\u0438\u0439 \u0441\u043F\u0435\u043A\u0442\u0440 \u044F\u0437\u044B\u043A\u043E\u0432, \u0432\u043A\u043B\u044E\u0447\u0430\u044F JavaScript, HTML, CSS \u0438 \u0434\u0440\u0443\u0433\u0438\u0435." + }), "\n", createVNode(_components.h2, { + id: "3-gitlens", + children: "3. GitLens" + }), "\n", createVNode(_components.p, { + children: "GitLens \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438 Git \u0432 VS Code. \u041E\u043D \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043D\u0435\u043D\u0430\u0432\u044F\u0437\u0447\u0438\u0432\u044B\u0439 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043F\u0440\u0438 \u0440\u0430\u0431\u043E\u0442\u0435 \u0441 Git-\u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F\u043C\u0438, \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u044F \u0432\u0438\u0437\u0443\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0430\u0432\u0442\u043E\u0440\u0441\u0442\u0432\u043E \u043A\u043E\u0434\u0430, \u043F\u0440\u043E\u0441\u043C\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0441 \u0442\u0435\u0447\u0435\u043D\u0438\u0435\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0438 \u043F\u043E\u043D\u0438\u043C\u0430\u0442\u044C, \u043A\u0430\u043A \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0432\u0435\u0442\u0432\u0438 \u0438 \u0444\u0430\u0439\u043B\u044B. \u0421 \u043F\u043E\u043C\u043E\u0449\u044C\u044E GitLens \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0433\u043B\u0443\u0431\u043E\u043A\u043E \u043F\u043E\u0433\u0440\u0443\u0437\u0438\u0442\u044C\u0441\u044F \u0432 \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u043F\u0440\u043E\u0435\u043A\u0442\u0430, \u043D\u0435 \u0432\u044B\u0445\u043E\u0434\u044F \u0438\u0437 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430." + }), "\n", createVNode(_components.h2, { + id: "4-\u0436\u0438\u0432\u043E\u0439-\u0441\u0435\u0440\u0432\u0435\u0440", + children: "4. \u0416\u0438\u0432\u043E\u0439 \u0441\u0435\u0440\u0432\u0435\u0440" + }), "\n", createVNode(_components.p, { + children: "\u0424\u0440\u043E\u043D\u0442\u0435\u043D\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430\u043C \u0447\u0430\u0441\u0442\u043E \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0432\u0438\u0434\u0435\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043E\u043D\u0438 \u0432\u043D\u043E\u0441\u044F\u0442, \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438. Live Server - \u044D\u0442\u043E \u0444\u0430\u043D\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u043B\u0430\u0433\u0438\u043D, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0441\u043E\u0437\u0434\u0430\u0435\u0442 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043F\u0440\u0438 \u043A\u0430\u0436\u0434\u043E\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0438 \u0444\u0430\u0439\u043B\u0430. \u042D\u0442\u043E \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0442 \u0432\u0440\u0435\u043C\u044F, \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u044F \u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E \u0443\u0432\u0438\u0434\u0435\u0442\u044C \u0432\u043B\u0438\u044F\u043D\u0438\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u0432 \u043A\u043E\u0434\u0435." + }), "\n", createVNode(_components.h2, { + id: "5-\u0440\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0430-\u043F\u0430\u0440-\u0441\u043A\u043E\u0431\u043E\u043A", + children: "5. \u0420\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0430 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A" + }), "\n", createVNode(_components.p, { + children: "\u0421\u043B\u0435\u0434\u0438\u0442\u044C \u0437\u0430 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u043C\u0438 \u0431\u043B\u043E\u043A\u0430\u043C\u0438 \u043A\u043E\u0434\u0430 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0441\u0442\u043E, \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E \u0432 \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u043F\u0440\u043E\u0435\u043A\u0442\u0430\u0445. Bracket Pair Colorizer \u0443\u043F\u0440\u043E\u0449\u0430\u0435\u0442 \u044D\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0432\u044B\u0434\u0435\u043B\u044F\u044F \u0446\u0432\u0435\u0442\u043E\u043C \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u0435 \u043F\u0430\u0440\u044B \u0441\u043A\u043E\u0431\u043E\u043A, \u0447\u0442\u043E \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0441 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u0432\u0437\u0433\u043B\u044F\u0434\u0430 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C \u043E\u0431\u043B\u0430\u0441\u0442\u044C \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043A\u043E\u0434\u0430. \u042D\u0442\u043E \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u043E\u0439, \u043D\u043E \u043D\u0435\u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E \u043F\u043E\u043B\u0435\u0437\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0434\u043B\u044F \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u044F \u0447\u0438\u0442\u0430\u0431\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438 \u043A\u043E\u0434\u0430." + }), "\n", createVNode(_components.h2, { + id: "6-\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430-\u043E\u0440\u0444\u043E\u0433\u0440\u0430\u0444\u0438\u0438-\u043A\u043E\u0434\u0430", + children: "6. \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043E\u0440\u0444\u043E\u0433\u0440\u0430\u0444\u0438\u0438 \u043A\u043E\u0434\u0430" + }), "\n", createVNode(_components.p, { + children: "\u041E\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u0438 \u043E\u0440\u0444\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043E\u0448\u0438\u0431\u043A\u0438 \u043C\u043E\u0433\u0443\u0442 \u043F\u0440\u043E\u043A\u0440\u0430\u0441\u0442\u044C\u0441\u044F \u0432 \u0432\u0430\u0448 \u043A\u043E\u0434 \u0438 \u043F\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043A \u043D\u0435\u043E\u0436\u0438\u0434\u0430\u043D\u043D\u044B\u043C \u043E\u0448\u0438\u0431\u043A\u0430\u043C. Code Spell Checker \u043F\u043E\u043C\u043E\u0436\u0435\u0442 \u0432\u0430\u043C \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044C \u0447\u0438\u0441\u0442\u044B\u0439 \u0438 \u0431\u0435\u0437\u043E\u0448\u0438\u0431\u043E\u0447\u043D\u044B\u0439 \u043A\u043E\u0434, \u0432\u044B\u0434\u0435\u043B\u044F\u044F \u043E\u0440\u0444\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043E\u0448\u0438\u0431\u043A\u0438 \u0432 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u044F\u0445 \u0438 \u0441\u0442\u0440\u043E\u043A\u0430\u0445. \u041E\u043D \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u043E \u044F\u0437\u044B\u043A\u043E\u0432 \u0438 \u0433\u0430\u0440\u0430\u043D\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043E \u0432\u0430\u0448\u0430 \u043A\u043E\u0434\u043E\u0432\u0430\u044F \u0431\u0430\u0437\u0430 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u043E\u0444\u0435\u0441\u0441\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0439 \u0438 \u043E\u0442\u043F\u043E\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0439." + }), "\n", createVNode(_components.h2, { + id: "7-rest-\u043A\u043B\u0438\u0435\u043D\u0442", + children: "7. REST-\u043A\u043B\u0438\u0435\u043D\u0442" + }), "\n", createVNode(_components.p, { + children: "\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 API - \u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043B\u044F \u043C\u043D\u043E\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432. REST Client \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C HTTP-\u0437\u0430\u043F\u0440\u043E\u0441\u044B \u0438 \u043F\u0440\u043E\u0441\u043C\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044C \u043E\u0442\u0432\u0435\u0442\u044B \u043F\u0440\u044F\u043C\u043E \u0432 VS Code. \u041E\u043D \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0443\u0434\u043E\u0431\u043D\u044B\u0439 \u0441\u043F\u043E\u0441\u043E\u0431 \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0441 API, \u0442\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0445 \u0442\u043E\u0447\u0435\u043A \u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0434\u0430\u043D\u043D\u044B\u0445, \u043D\u0435 \u0432\u044B\u0445\u043E\u0434\u044F \u0438\u0437 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430." + }), "\n", createVNode(_components.h2, { + id: "8-docker", + children: "8. Docker" + }), "\n", createVNode(_components.p, { + children: "Docker \u0443\u043F\u0440\u043E\u0449\u0430\u0435\u0442 \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u0432. \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 Docker \u0434\u043B\u044F VS Code \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C, \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043D\u044B\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u044F\u043C\u043E \u0438\u0437 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u041E\u043D\u043E \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0443\u0434\u043E\u0431\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043B\u044F \u043A\u043E\u043C\u0430\u043D\u0434 Docker, \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u0443\u044F \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438." + }), "\n", createVNode(_components.h2, { + id: "\u0437\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435", + children: "\u0417\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435" + }), "\n", createVNode(_components.p, { + children: "\u0420\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u043C\u043E\u0441\u0442\u044C Visual Studio Code \u0437\u0430 \u0441\u0447\u0435\u0442 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432 \u0434\u0435\u043B\u0430\u0435\u0442 \u0435\u0433\u043E \u043C\u043E\u0449\u043D\u044B\u043C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u043C \u0434\u043B\u044F \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432. \u041D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E \u043E\u0442 \u0442\u043E\u0433\u043E, \u044F\u0432\u043B\u044F\u0435\u0442\u0435\u0441\u044C \u043B\u0438 \u0432\u044B \u044D\u043D\u0442\u0443\u0437\u0438\u0430\u0441\u0442\u043E\u043C JavaScript, \u044D\u043A\u0441\u043F\u0435\u0440\u0442\u043E\u043C \u043F\u043E Git \u0438\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u043C API, \u0434\u043B\u044F \u0432\u0430\u0441 \u043D\u0430\u0439\u0434\u0443\u0442\u0441\u044F \u043F\u043B\u0430\u0433\u0438\u043D\u044B, \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u044B\u0435 \u0443\u043B\u0443\u0447\u0448\u0438\u0442\u044C \u0432\u0430\u0448 \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u043F\u0440\u043E\u0446\u0435\u0441\u0441." + }), "\n", createVNode(_components.p, { + children: "\u042D\u0442\u0438 \u043F\u043B\u0430\u0433\u0438\u043D\u044B \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0432\u044B\u0448\u0430\u044E\u0442 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C, \u043D\u043E \u0438 \u0434\u0435\u043B\u0430\u044E\u0442 \u043A\u043E\u0434\u0438\u043D\u0433 \u0431\u043E\u043B\u0435\u0435 \u043F\u0440\u0438\u044F\u0442\u043D\u044B\u043C \u0437\u0430\u043D\u044F\u0442\u0438\u0435\u043C. \u0418\u0437\u0443\u0447\u0438\u0442\u0435 \u044D\u0442\u0438 \u043F\u043B\u0430\u0433\u0438\u043D\u044B, \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u0442\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u043E\u0434 \u0441\u0432\u043E\u0438 \u043D\u0443\u0436\u0434\u044B \u0438 \u043D\u0430\u0431\u043B\u044E\u0434\u0430\u0439\u0442\u0435, \u043A\u0430\u043A \u043F\u043E\u0432\u044B\u0448\u0430\u0435\u0442\u0441\u044F \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0440\u0430\u0431\u043E\u0442\u044B, \u043A\u043E\u0433\u0434\u0430 \u0432\u044B \u043F\u0438\u0448\u0435\u0442\u0435 \u0431\u0435\u0437\u0443\u043F\u0440\u0435\u0447\u043D\u044B\u0439 \u043A\u043E\u0434 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E Visual Studio Code." + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/ru/cool-plugins-for-vs-code.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/cool-plugins-for-vs-code.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/cool-plugins-for-vs-code.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_CF6JBJkR.mjs b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_CF6JBJkR.mjs new file mode 100644 index 0000000..04b78a2 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_CF6JBJkR.mjs @@ -0,0 +1,139 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "cool-plugins-for-vs-code", + "author": "ChatGPT", + "isDraft": false, + "title": "Cool plugins for VS Code", + "description": "Enhance your Visual Studio Code experience with must-have plugins like ESLint, Prettier, GitLens, Live Server, and more. Boost productivity and coding joy effortlessly.", + "image": "../images/extension.jpg", + "tags": ["tipsAboutVsCode"], + "categories": ["lifeHacks"], + "publishDate": "24/10/2023", + "language": "en" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "1-eslint", + "text": "1. ESLint" + }, { + "depth": 2, + "slug": "2-prettier", + "text": "2. Prettier" + }, { + "depth": 2, + "slug": "3-gitlens", + "text": "3. GitLens" + }, { + "depth": 2, + "slug": "4-live-server", + "text": "4. Live Server" + }, { + "depth": 2, + "slug": "5-bracket-pair-colorizer", + "text": "5. Bracket Pair Colorizer" + }, { + "depth": 2, + "slug": "6-code-spell-checker", + "text": "6. Code Spell Checker" + }, { + "depth": 2, + "slug": "7-rest-client", + "text": "7. REST Client" + }, { + "depth": 2, + "slug": "8-docker", + "text": "8. Docker" + }, { + "depth": 2, + "slug": "conclusion", + "text": "Conclusion" + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + h2: "h2", + p: "p", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.p, { + children: "Visual Studio Code (VS Code) has rapidly become one of the most beloved code editors in the developer community, thanks to its simplicity, flexibility, and a vast array of extensions. These extensions, often referred to as plugins, enhance the functionality of VS Code, making it a powerful tool for various programming tasks. In this blog post, we will explore some of the coolest plugins available for VS Code, catering to different needs and preferences." + }), "\n", createVNode(_components.h2, { + id: "1-eslint", + children: "1. ESLint" + }), "\n", createVNode(_components.p, { + children: "For JavaScript developers, ESLint is a must-have plugin. It provides real-time linting for your JavaScript code, ensuring it follows the coding standards and best practices. With ESLint integration, you can catch errors and improve your code quality as you write." + }), "\n", createVNode(_components.h2, { + id: "2-prettier", + children: "2. Prettier" + }), "\n", createVNode(_components.p, { + children: "Consistent code formatting is essential for collaboration and readability. Prettier is a popular code formatter that supports various languages. This plugin automatically formats your code, making it neat and consistent without manual effort. It supports a wide range of languages, including JavaScript, HTML, CSS, and more." + }), "\n", createVNode(_components.h2, { + id: "3-gitlens", + children: "3. GitLens" + }), "\n", createVNode(_components.p, { + children: "GitLens supercharges the Git capabilities of VS Code. It provides an unobtrusive UI while you work with Git repositories, allowing you to visualize code authorship, review changes over time, and understand how branches and files evolve. With GitLens, you can delve deep into your project\u2019s history without leaving your editor." + }), "\n", createVNode(_components.h2, { + id: "4-live-server", + children: "4. Live Server" + }), "\n", createVNode(_components.p, { + children: "Front-end developers often need to see the changes they make in real-time. Live Server is a fantastic plugin that creates a local development server and automatically refreshes your browser whenever you save a file. It\u2019s a time-saver, ensuring you instantly see the impact of your code changes." + }), "\n", createVNode(_components.h2, { + id: "5-bracket-pair-colorizer", + children: "5. Bracket Pair Colorizer" + }), "\n", createVNode(_components.p, { + children: "Keeping track of nested code blocks can be challenging, especially in large projects. Bracket Pair Colorizer simplifies this by colorizing matching pairs of brackets, making it easy to identify the scope of your code at a glance. It\u2019s a small but incredibly useful tool for improving code readability." + }), "\n", createVNode(_components.h2, { + id: "6-code-spell-checker", + children: "6. Code Spell Checker" + }), "\n", createVNode(_components.p, { + children: "Typos and spelling mistakes can sneak into your code, leading to unexpected errors. Code Spell Checker helps you maintain clean and error-free code by highlighting spelling mistakes within your comments and strings. It supports multiple languages and ensures your codebase is professional and polished." + }), "\n", createVNode(_components.h2, { + id: "7-rest-client", + children: "7. REST Client" + }), "\n", createVNode(_components.p, { + children: "API development and testing are common tasks for many developers. REST Client allows you to send HTTP requests and view responses directly within VS Code. It provides a convenient way to interact with APIs, test endpoints, and inspect data, all from the comfort of your editor." + }), "\n", createVNode(_components.h2, { + id: "8-docker", + children: "8. Docker" + }), "\n", createVNode(_components.p, { + children: "Docker simplifies the process of managing and deploying applications using containers. The Docker extension for VS Code enables you to build, manage, and deploy containerized applications right from your editor. It provides a user-friendly interface for Docker commands, streamlining the containerization workflow." + }), "\n", createVNode(_components.h2, { + id: "conclusion", + children: "Conclusion" + }), "\n", createVNode(_components.p, { + children: "Visual Studio Code\u2019s extensibility through plugins makes it a powerhouse for developers. Whether you\u2019re a JavaScript enthusiast, a Git expert, or an API developer, there are plugins tailored to enhance your workflow." + }), "\n", createVNode(_components.p, { + children: "These plugins not only boost your productivity but also make coding a more enjoyable experience. Explore these plugins, tailor your editor to your needs, and watch your efficiency soar as you write impeccable code with Visual Studio Code." + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/en/cool-plugins-for-vs-code.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/cool-plugins-for-vs-code.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/cool-plugins-for-vs-code.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_DKiFBJW5.mjs b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_DKiFBJW5.mjs new file mode 100644 index 0000000..13ba9a0 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_DKiFBJW5.mjs @@ -0,0 +1,25 @@ +const id = "ru/cool-plugins-for-vs-code.mdx"; + const collection = "posts"; + const slug = "cool-plugins-for-vscode"; + const body = "\r\nVisual Studio Code (VS Code) быстро стал одним из самых любимых редакторов кода в сообществе разработчиков благодаря своей простоте, гибкости и огромному количеству расширений. Эти расширения, часто называемые плагинами, расширяют функциональность VS Code, превращая его в мощный инструмент для решения различных задач программирования. В этой статье мы рассмотрим некоторые из самых крутых плагинов, доступных для VS Code и отвечающих различным потребностям и предпочтениям.\r\n\r\n\r\n\r\n## 1. ESLint\r\nДля JavaScript-разработчиков ESLint является обязательным плагином. Он обеспечивает линтинг JavaScript-кода в режиме реального времени, гарантируя, что он соответствует стандартам кодирования и лучшим практикам. Интеграция с ESLint позволяет выявлять ошибки и улучшать качество кода в процессе его написания.\r\n\r\n\r\n\r\n## 2. Красивее\r\nПоследовательное форматирование кода необходимо для совместной работы и удобства чтения. Prettier - это популярный форматировщик кода, поддерживающий различные языки. Этот плагин автоматически форматирует ваш код, делая его аккуратным и последовательным без ручного труда. Он поддерживает широкий спектр языков, включая JavaScript, HTML, CSS и другие.\r\n\r\n\r\n\r\n## 3. GitLens\r\nGitLens расширяет возможности Git в VS Code. Он обеспечивает ненавязчивый пользовательский интерфейс при работе с Git-репозиториями, позволяя визуализировать авторство кода, просматривать изменения с течением времени и понимать, как развиваются ветви и файлы. С помощью GitLens вы можете глубоко погрузиться в историю проекта, не выходя из редактора.\r\n\r\n\r\n## 4. Живой сервер\r\nФронтенд-разработчикам часто необходимо видеть изменения, которые они вносят, в режиме реального времени. Live Server - это фантастический плагин, который создает локальный сервер разработки и автоматически обновляет браузер при каждом сохранении файла. Это экономит время, позволяя мгновенно увидеть влияние изменений в коде.\r\n\r\n\r\n\r\n## 5. Раскраска пар скобок\r\nСледить за вложенными блоками кода может быть непросто, особенно в больших проектах. Bracket Pair Colorizer упрощает эту задачу, выделяя цветом совпадающие пары скобок, что позволяет с первого взгляда определить область применения кода. Это небольшой, но невероятно полезный инструмент для улучшения читабельности кода.\r\n\r\n\r\n\r\n## 6. Проверка орфографии кода\r\nОпечатки и орфографические ошибки могут прокрасться в ваш код и привести к неожиданным ошибкам. Code Spell Checker поможет вам поддерживать чистый и безошибочный код, выделяя орфографические ошибки в комментариях и строках. Он поддерживает множество языков и гарантирует, что ваша кодовая база будет профессиональной и отполированной.\r\n\r\n\r\n## 7. REST-клиент\r\nРазработка и тестирование API - обычные задачи для многих разработчиков. REST Client позволяет отправлять HTTP-запросы и просматривать ответы прямо в VS Code. Он предоставляет удобный способ взаимодействия с API, тестирования конечных точек и проверки данных, не выходя из редактора.\r\n\r\n\r\n\r\n## 8. Docker\r\nDocker упрощает процесс управления и развертывания приложений с помощью контейнеров. Расширение Docker для VS Code позволяет создавать, управлять и развертывать контейнерные приложения прямо из редактора. Оно предоставляет удобный интерфейс для команд Docker, оптимизируя рабочий процесс контейнеризации.\r\n\r\n\r\n\r\n## Заключение\r\nРасширяемость Visual Studio Code за счет плагинов делает его мощным инструментом для разработчиков. Независимо от того, являетесь ли вы энтузиастом JavaScript, экспертом по Git или разработчиком API, для вас найдутся плагины, способные улучшить ваш рабочий процесс. \r\n\r\n\r\nЭти плагины не только повышают производительность, но и делают кодинг более приятным занятием. Изучите эти плагины, настройте редактор под свои нужды и наблюдайте, как повышается эффективность работы, когда вы пишете безупречный код с помощью Visual Studio Code."; + const data = {isDraft:false,title:"Крутые плагины для VS Code",description:"Расширьте возможности Visual Studio Code с помощью таких необходимых плагинов, как ESLint, Prettier, GitLens, Live Server и других. Повысьте производительность и радость от написания кода без лишних усилий.",image: + new Proxy({"src":"/_astro/extension.BJj3wlht.jpg","width":1500,"height":844,"format":"jpg","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/extension.jpg"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/extension.jpg"; + } + + return target[name]; + } + }) + ,author:"ChatGPT",tags:["tipsAboutVsCode"],categories:["лайфХаки"],publishDate:"24/10/2023",language:"ru"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/cool-plugins-for-vs-code.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_DXKArvvn.mjs b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_DXKArvvn.mjs new file mode 100644 index 0000000..b5dbd72 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_DXKArvvn.mjs @@ -0,0 +1,25 @@ +const id = "en/cool-plugins-for-vs-code.mdx"; + const collection = "posts"; + const slug = "cool-plugins-for-vs-code"; + const body = "\r\nVisual Studio Code (VS Code) has rapidly become one of the most beloved code editors in the developer community, thanks to its simplicity, flexibility, and a vast array of extensions. These extensions, often referred to as plugins, enhance the functionality of VS Code, making it a powerful tool for various programming tasks. In this blog post, we will explore some of the coolest plugins available for VS Code, catering to different needs and preferences.\r\n\r\n\r\n\r\n## 1. ESLint\r\nFor JavaScript developers, ESLint is a must-have plugin. It provides real-time linting for your JavaScript code, ensuring it follows the coding standards and best practices. With ESLint integration, you can catch errors and improve your code quality as you write.\r\n\r\n\r\n\r\n## 2. Prettier\r\nConsistent code formatting is essential for collaboration and readability. Prettier is a popular code formatter that supports various languages. This plugin automatically formats your code, making it neat and consistent without manual effort. It supports a wide range of languages, including JavaScript, HTML, CSS, and more.\r\n\r\n\r\n\r\n## 3. GitLens\r\nGitLens supercharges the Git capabilities of VS Code. It provides an unobtrusive UI while you work with Git repositories, allowing you to visualize code authorship, review changes over time, and understand how branches and files evolve. With GitLens, you can delve deep into your project's history without leaving your editor.\r\n\r\n\r\n\r\n## 4. Live Server\r\nFront-end developers often need to see the changes they make in real-time. Live Server is a fantastic plugin that creates a local development server and automatically refreshes your browser whenever you save a file. It's a time-saver, ensuring you instantly see the impact of your code changes.\r\n\r\n\r\n\r\n## 5. Bracket Pair Colorizer\r\nKeeping track of nested code blocks can be challenging, especially in large projects. Bracket Pair Colorizer simplifies this by colorizing matching pairs of brackets, making it easy to identify the scope of your code at a glance. It's a small but incredibly useful tool for improving code readability.\r\n\r\n\r\n\r\n## 6. Code Spell Checker\r\nTypos and spelling mistakes can sneak into your code, leading to unexpected errors. Code Spell Checker helps you maintain clean and error-free code by highlighting spelling mistakes within your comments and strings. It supports multiple languages and ensures your codebase is professional and polished.\r\n\r\n\r\n\r\n## 7. REST Client\r\nAPI development and testing are common tasks for many developers. REST Client allows you to send HTTP requests and view responses directly within VS Code. It provides a convenient way to interact with APIs, test endpoints, and inspect data, all from the comfort of your editor.\r\n\r\n\r\n\r\n## 8. Docker\r\nDocker simplifies the process of managing and deploying applications using containers. The Docker extension for VS Code enables you to build, manage, and deploy containerized applications right from your editor. It provides a user-friendly interface for Docker commands, streamlining the containerization workflow.\r\n\r\n\r\n\r\n## Conclusion\r\nVisual Studio Code's extensibility through plugins makes it a powerhouse for developers. Whether you're a JavaScript enthusiast, a Git expert, or an API developer, there are plugins tailored to enhance your workflow. \r\n\r\n\r\nThese plugins not only boost your productivity but also make coding a more enjoyable experience. Explore these plugins, tailor your editor to your needs, and watch your efficiency soar as you write impeccable code with Visual Studio Code."; + const data = {isDraft:false,title:"Cool plugins for VS Code",description:"Enhance your Visual Studio Code experience with must-have plugins like ESLint, Prettier, GitLens, Live Server, and more. Boost productivity and coding joy effortlessly.",image: + new Proxy({"src":"/_astro/extension.BJj3wlht.jpg","width":1500,"height":844,"format":"jpg","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/extension.jpg"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/extension.jpg"; + } + + return target[name]; + } + }) + ,author:"ChatGPT",tags:["tipsAboutVsCode"],categories:["lifeHacks"],publishDate:"24/10/2023",language:"en"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/cool-plugins-for-vs-code.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_Hk47S3fA.mjs b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_Hk47S3fA.mjs new file mode 100644 index 0000000..8e73f5c --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/cool-plugins-for-vs-code_Hk47S3fA.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./cool-plugins-for-vs-code_BLwiMiVs.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/generic_D_JKLwzW.mjs b/.netlify/functions-internal/ssr/chunks/generic_D_JKLwzW.mjs new file mode 100644 index 0000000..4a59419 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/generic_D_JKLwzW.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./pages/generic_CKoPNF1-.mjs').then(n => n.g); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/index_BIoOX2kt.mjs b/.netlify/functions-internal/ssr/chunks/index_BIoOX2kt.mjs new file mode 100644 index 0000000..0291500 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/index_BIoOX2kt.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.k); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/index_BqNdUiWy.mjs b/.netlify/functions-internal/ssr/chunks/index_BqNdUiWy.mjs new file mode 100644 index 0000000..00d7655 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/index_BqNdUiWy.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.d); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/index_CZPCzNFA.mjs b/.netlify/functions-internal/ssr/chunks/index_CZPCzNFA.mjs new file mode 100644 index 0000000..33fecfa --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/index_CZPCzNFA.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.g); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/index_DToyGfqd.mjs b/.netlify/functions-internal/ssr/chunks/index_DToyGfqd.mjs new file mode 100644 index 0000000..52ed2c1 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/index_DToyGfqd.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.i); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/index_NByEDO2x.mjs b/.netlify/functions-internal/ssr/chunks/index_NByEDO2x.mjs new file mode 100644 index 0000000..5068f20 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/index_NByEDO2x.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.l); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/index_dw6RaE6b.mjs b/.netlify/functions-internal/ssr/chunks/index_dw6RaE6b.mjs new file mode 100644 index 0000000..8649c52 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/index_dw6RaE6b.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.b); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/pages/generic_CKoPNF1-.mjs b/.netlify/functions-internal/ssr/chunks/pages/generic_CKoPNF1-.mjs new file mode 100644 index 0000000..23d2955 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/pages/generic_CKoPNF1-.mjs @@ -0,0 +1,1057 @@ +import { isRemotePath } from '@astrojs/internal-helpers/path'; +import mime from 'mime/lite.js'; +import { A as AstroError, c as InvalidImageService, d as ExpectedImageOptions, E as ExpectedImage, F as FailedToFetchRemoteImageDimensions, e as createAstro, f as createComponent, g as ImageMissingAlt, r as renderTemplate, m as maybeRenderHead, h as addAttribute, s as spreadAttributes } from '../astro_U7cLjtnz.mjs'; +import { i as isRemoteImage, a as isESMImportedImage, b as isLocalService, D as DEFAULT_HASH_PROPS, c as isRemoteAllowed } from '../astro/assets-service_B85IQn9G.mjs'; +import 'clsx'; + +const decoder = new TextDecoder(); +const toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end)); +const toHexString = (input, start = 0, end = input.length) => input.slice(start, end).reduce((memo, i) => memo + ("0" + i.toString(16)).slice(-2), ""); +const readInt16LE = (input, offset = 0) => { + const val = input[offset] + input[offset + 1] * 2 ** 8; + return val | (val & 2 ** 15) * 131070; +}; +const readUInt16BE = (input, offset = 0) => input[offset] * 2 ** 8 + input[offset + 1]; +const readUInt16LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8; +const readUInt24LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16; +const readInt32LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16 + (input[offset + 3] << 24); +const readUInt32BE = (input, offset = 0) => input[offset] * 2 ** 24 + input[offset + 1] * 2 ** 16 + input[offset + 2] * 2 ** 8 + input[offset + 3]; +const readUInt32LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16 + input[offset + 3] * 2 ** 24; +const methods = { + readUInt16BE, + readUInt16LE, + readUInt32BE, + readUInt32LE +}; +function readUInt(input, bits, offset, isBigEndian) { + offset = offset || 0; + const endian = isBigEndian ? "BE" : "LE"; + const methodName = "readUInt" + bits + endian; + return methods[methodName](input, offset); +} +function readBox(buffer, offset) { + if (buffer.length - offset < 4) + return; + const boxSize = readUInt32BE(buffer, offset); + if (buffer.length - offset < boxSize) + return; + return { + name: toUTF8String(buffer, 4 + offset, 8 + offset), + offset, + size: boxSize + }; +} +function findBox(buffer, boxName, offset) { + while (offset < buffer.length) { + const box = readBox(buffer, offset); + if (!box) + break; + if (box.name === boxName) + return box; + offset += box.size; + } +} + +const BMP = { + validate: (input) => toUTF8String(input, 0, 2) === "BM", + calculate: (input) => ({ + height: Math.abs(readInt32LE(input, 22)), + width: readUInt32LE(input, 18) + }) +}; + +const TYPE_ICON = 1; +const SIZE_HEADER$1 = 2 + 2 + 2; +const SIZE_IMAGE_ENTRY = 1 + 1 + 1 + 1 + 2 + 2 + 4 + 4; +function getSizeFromOffset(input, offset) { + const value = input[offset]; + return value === 0 ? 256 : value; +} +function getImageSize$1(input, imageIndex) { + const offset = SIZE_HEADER$1 + imageIndex * SIZE_IMAGE_ENTRY; + return { + height: getSizeFromOffset(input, offset + 1), + width: getSizeFromOffset(input, offset) + }; +} +const ICO = { + validate(input) { + const reserved = readUInt16LE(input, 0); + const imageCount = readUInt16LE(input, 4); + if (reserved !== 0 || imageCount === 0) + return false; + const imageType = readUInt16LE(input, 2); + return imageType === TYPE_ICON; + }, + calculate(input) { + const nbImages = readUInt16LE(input, 4); + const imageSize = getImageSize$1(input, 0); + if (nbImages === 1) + return imageSize; + const imgs = [imageSize]; + for (let imageIndex = 1; imageIndex < nbImages; imageIndex += 1) { + imgs.push(getImageSize$1(input, imageIndex)); + } + return { + height: imageSize.height, + images: imgs, + width: imageSize.width + }; + } +}; + +const TYPE_CURSOR = 2; +const CUR = { + validate(input) { + const reserved = readUInt16LE(input, 0); + const imageCount = readUInt16LE(input, 4); + if (reserved !== 0 || imageCount === 0) + return false; + const imageType = readUInt16LE(input, 2); + return imageType === TYPE_CURSOR; + }, + calculate: (input) => ICO.calculate(input) +}; + +const DDS = { + validate: (input) => readUInt32LE(input, 0) === 542327876, + calculate: (input) => ({ + height: readUInt32LE(input, 12), + width: readUInt32LE(input, 16) + }) +}; + +const gifRegexp = /^GIF8[79]a/; +const GIF = { + validate: (input) => gifRegexp.test(toUTF8String(input, 0, 6)), + calculate: (input) => ({ + height: readUInt16LE(input, 8), + width: readUInt16LE(input, 6) + }) +}; + +const brandMap = { + avif: "avif", + mif1: "heif", + msf1: "heif", + // hief-sequence + heic: "heic", + heix: "heic", + hevc: "heic", + // heic-sequence + hevx: "heic" + // heic-sequence +}; +function detectBrands(buffer, start, end) { + let brandsDetected = {}; + for (let i = start; i <= end; i += 4) { + const brand = toUTF8String(buffer, i, i + 4); + if (brand in brandMap) { + brandsDetected[brand] = 1; + } + } + if ("avif" in brandsDetected) { + return "avif"; + } else if ("heic" in brandsDetected || "heix" in brandsDetected || "hevc" in brandsDetected || "hevx" in brandsDetected) { + return "heic"; + } else if ("mif1" in brandsDetected || "msf1" in brandsDetected) { + return "heif"; + } +} +const HEIF = { + validate(buffer) { + const ftype = toUTF8String(buffer, 4, 8); + const brand = toUTF8String(buffer, 8, 12); + return "ftyp" === ftype && brand in brandMap; + }, + calculate(buffer) { + const metaBox = findBox(buffer, "meta", 0); + const iprpBox = metaBox && findBox(buffer, "iprp", metaBox.offset + 12); + const ipcoBox = iprpBox && findBox(buffer, "ipco", iprpBox.offset + 8); + const ispeBox = ipcoBox && findBox(buffer, "ispe", ipcoBox.offset + 8); + if (ispeBox) { + return { + height: readUInt32BE(buffer, ispeBox.offset + 16), + width: readUInt32BE(buffer, ispeBox.offset + 12), + type: detectBrands(buffer, 8, metaBox.offset) + }; + } + throw new TypeError("Invalid HEIF, no size found"); + } +}; + +const SIZE_HEADER = 4 + 4; +const FILE_LENGTH_OFFSET = 4; +const ENTRY_LENGTH_OFFSET = 4; +const ICON_TYPE_SIZE = { + ICON: 32, + "ICN#": 32, + // m => 16 x 16 + "icm#": 16, + icm4: 16, + icm8: 16, + // s => 16 x 16 + "ics#": 16, + ics4: 16, + ics8: 16, + is32: 16, + s8mk: 16, + icp4: 16, + // l => 32 x 32 + icl4: 32, + icl8: 32, + il32: 32, + l8mk: 32, + icp5: 32, + ic11: 32, + // h => 48 x 48 + ich4: 48, + ich8: 48, + ih32: 48, + h8mk: 48, + // . => 64 x 64 + icp6: 64, + ic12: 32, + // t => 128 x 128 + it32: 128, + t8mk: 128, + ic07: 128, + // . => 256 x 256 + ic08: 256, + ic13: 256, + // . => 512 x 512 + ic09: 512, + ic14: 512, + // . => 1024 x 1024 + ic10: 1024 +}; +function readImageHeader(input, imageOffset) { + const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET; + return [ + toUTF8String(input, imageOffset, imageLengthOffset), + readUInt32BE(input, imageLengthOffset) + ]; +} +function getImageSize(type) { + const size = ICON_TYPE_SIZE[type]; + return { width: size, height: size, type }; +} +const ICNS = { + validate: (input) => toUTF8String(input, 0, 4) === "icns", + calculate(input) { + const inputLength = input.length; + const fileLength = readUInt32BE(input, FILE_LENGTH_OFFSET); + let imageOffset = SIZE_HEADER; + let imageHeader = readImageHeader(input, imageOffset); + let imageSize = getImageSize(imageHeader[0]); + imageOffset += imageHeader[1]; + if (imageOffset === fileLength) + return imageSize; + const result = { + height: imageSize.height, + images: [imageSize], + width: imageSize.width + }; + while (imageOffset < fileLength && imageOffset < inputLength) { + imageHeader = readImageHeader(input, imageOffset); + imageSize = getImageSize(imageHeader[0]); + imageOffset += imageHeader[1]; + result.images.push(imageSize); + } + return result; + } +}; + +const J2C = { + // TODO: this doesn't seem right. SIZ marker doesn't have to be right after the SOC + validate: (input) => toHexString(input, 0, 4) === "ff4fff51", + calculate: (input) => ({ + height: readUInt32BE(input, 12), + width: readUInt32BE(input, 8) + }) +}; + +const JP2 = { + validate(input) { + if (readUInt32BE(input, 4) !== 1783636e3 || readUInt32BE(input, 0) < 1) + return false; + const ftypBox = findBox(input, "ftyp", 0); + if (!ftypBox) + return false; + return readUInt32BE(input, ftypBox.offset + 4) === 1718909296; + }, + calculate(input) { + const jp2hBox = findBox(input, "jp2h", 0); + const ihdrBox = jp2hBox && findBox(input, "ihdr", jp2hBox.offset + 8); + if (ihdrBox) { + return { + height: readUInt32BE(input, ihdrBox.offset + 8), + width: readUInt32BE(input, ihdrBox.offset + 12) + }; + } + throw new TypeError("Unsupported JPEG 2000 format"); + } +}; + +const EXIF_MARKER = "45786966"; +const APP1_DATA_SIZE_BYTES = 2; +const EXIF_HEADER_BYTES = 6; +const TIFF_BYTE_ALIGN_BYTES = 2; +const BIG_ENDIAN_BYTE_ALIGN = "4d4d"; +const LITTLE_ENDIAN_BYTE_ALIGN = "4949"; +const IDF_ENTRY_BYTES = 12; +const NUM_DIRECTORY_ENTRIES_BYTES = 2; +function isEXIF(input) { + return toHexString(input, 2, 6) === EXIF_MARKER; +} +function extractSize(input, index) { + return { + height: readUInt16BE(input, index), + width: readUInt16BE(input, index + 2) + }; +} +function extractOrientation(exifBlock, isBigEndian) { + const idfOffset = 8; + const offset = EXIF_HEADER_BYTES + idfOffset; + const idfDirectoryEntries = readUInt(exifBlock, 16, offset, isBigEndian); + for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) { + const start = offset + NUM_DIRECTORY_ENTRIES_BYTES + directoryEntryNumber * IDF_ENTRY_BYTES; + const end = start + IDF_ENTRY_BYTES; + if (start > exifBlock.length) { + return; + } + const block = exifBlock.slice(start, end); + const tagNumber = readUInt(block, 16, 0, isBigEndian); + if (tagNumber === 274) { + const dataFormat = readUInt(block, 16, 2, isBigEndian); + if (dataFormat !== 3) { + return; + } + const numberOfComponents = readUInt(block, 32, 4, isBigEndian); + if (numberOfComponents !== 1) { + return; + } + return readUInt(block, 16, 8, isBigEndian); + } + } +} +function validateExifBlock(input, index) { + const exifBlock = input.slice(APP1_DATA_SIZE_BYTES, index); + const byteAlign = toHexString( + exifBlock, + EXIF_HEADER_BYTES, + EXIF_HEADER_BYTES + TIFF_BYTE_ALIGN_BYTES + ); + const isBigEndian = byteAlign === BIG_ENDIAN_BYTE_ALIGN; + const isLittleEndian = byteAlign === LITTLE_ENDIAN_BYTE_ALIGN; + if (isBigEndian || isLittleEndian) { + return extractOrientation(exifBlock, isBigEndian); + } +} +function validateInput(input, index) { + if (index > input.length) { + throw new TypeError("Corrupt JPG, exceeded buffer limits"); + } +} +const JPG = { + validate: (input) => toHexString(input, 0, 2) === "ffd8", + calculate(input) { + input = input.slice(4); + let orientation; + let next; + while (input.length) { + const i = readUInt16BE(input, 0); + if (input[i] !== 255) { + input = input.slice(1); + continue; + } + if (isEXIF(input)) { + orientation = validateExifBlock(input, i); + } + validateInput(input, i); + next = input[i + 1]; + if (next === 192 || next === 193 || next === 194) { + const size = extractSize(input, i + 5); + if (!orientation) { + return size; + } + return { + height: size.height, + orientation, + width: size.width + }; + } + input = input.slice(i + 2); + } + throw new TypeError("Invalid JPG, no size found"); + } +}; + +const KTX = { + validate: (input) => { + const signature = toUTF8String(input, 1, 7); + return ["KTX 11", "KTX 20"].includes(signature); + }, + calculate: (input) => { + const type = input[5] === 49 ? "ktx" : "ktx2"; + const offset = type === "ktx" ? 36 : 20; + return { + height: readUInt32LE(input, offset + 4), + width: readUInt32LE(input, offset), + type + }; + } +}; + +const pngSignature = "PNG\r\n\n"; +const pngImageHeaderChunkName = "IHDR"; +const pngFriedChunkName = "CgBI"; +const PNG = { + validate(input) { + if (pngSignature === toUTF8String(input, 1, 8)) { + let chunkName = toUTF8String(input, 12, 16); + if (chunkName === pngFriedChunkName) { + chunkName = toUTF8String(input, 28, 32); + } + if (chunkName !== pngImageHeaderChunkName) { + throw new TypeError("Invalid PNG"); + } + return true; + } + return false; + }, + calculate(input) { + if (toUTF8String(input, 12, 16) === pngFriedChunkName) { + return { + height: readUInt32BE(input, 36), + width: readUInt32BE(input, 32) + }; + } + return { + height: readUInt32BE(input, 20), + width: readUInt32BE(input, 16) + }; + } +}; + +const PNMTypes = { + P1: "pbm/ascii", + P2: "pgm/ascii", + P3: "ppm/ascii", + P4: "pbm", + P5: "pgm", + P6: "ppm", + P7: "pam", + PF: "pfm" +}; +const handlers = { + default: (lines) => { + let dimensions = []; + while (lines.length > 0) { + const line = lines.shift(); + if (line[0] === "#") { + continue; + } + dimensions = line.split(" "); + break; + } + if (dimensions.length === 2) { + return { + height: parseInt(dimensions[1], 10), + width: parseInt(dimensions[0], 10) + }; + } else { + throw new TypeError("Invalid PNM"); + } + }, + pam: (lines) => { + const size = {}; + while (lines.length > 0) { + const line = lines.shift(); + if (line.length > 16 || line.charCodeAt(0) > 128) { + continue; + } + const [key, value] = line.split(" "); + if (key && value) { + size[key.toLowerCase()] = parseInt(value, 10); + } + if (size.height && size.width) { + break; + } + } + if (size.height && size.width) { + return { + height: size.height, + width: size.width + }; + } else { + throw new TypeError("Invalid PAM"); + } + } +}; +const PNM = { + validate: (input) => toUTF8String(input, 0, 2) in PNMTypes, + calculate(input) { + const signature = toUTF8String(input, 0, 2); + const type = PNMTypes[signature]; + const lines = toUTF8String(input, 3).split(/[\r\n]+/); + const handler = handlers[type] || handlers.default; + return handler(lines); + } +}; + +const PSD = { + validate: (input) => toUTF8String(input, 0, 4) === "8BPS", + calculate: (input) => ({ + height: readUInt32BE(input, 14), + width: readUInt32BE(input, 18) + }) +}; + +const svgReg = /"']|"[^"]*"|'[^']*')*>/; +const extractorRegExps = { + height: /\sheight=(['"])([^%]+?)\1/, + root: svgReg, + viewbox: /\sviewBox=(['"])(.+?)\1/i, + width: /\swidth=(['"])([^%]+?)\1/ +}; +const INCH_CM = 2.54; +const units = { + in: 96, + cm: 96 / INCH_CM, + em: 16, + ex: 8, + m: 96 / INCH_CM * 100, + mm: 96 / INCH_CM / 10, + pc: 96 / 72 / 12, + pt: 96 / 72, + px: 1 +}; +const unitsReg = new RegExp( + // eslint-disable-next-line regexp/prefer-d + `^([0-9.]+(?:e\\d+)?)(${Object.keys(units).join("|")})?$` +); +function parseLength(len) { + const m = unitsReg.exec(len); + if (!m) { + return void 0; + } + return Math.round(Number(m[1]) * (units[m[2]] || 1)); +} +function parseViewbox(viewbox) { + const bounds = viewbox.split(" "); + return { + height: parseLength(bounds[3]), + width: parseLength(bounds[2]) + }; +} +function parseAttributes(root) { + const width = root.match(extractorRegExps.width); + const height = root.match(extractorRegExps.height); + const viewbox = root.match(extractorRegExps.viewbox); + return { + height: height && parseLength(height[2]), + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + viewbox: viewbox && parseViewbox(viewbox[2]), + width: width && parseLength(width[2]) + }; +} +function calculateByDimensions(attrs) { + return { + height: attrs.height, + width: attrs.width + }; +} +function calculateByViewbox(attrs, viewbox) { + const ratio = viewbox.width / viewbox.height; + if (attrs.width) { + return { + height: Math.floor(attrs.width / ratio), + width: attrs.width + }; + } + if (attrs.height) { + return { + height: attrs.height, + width: Math.floor(attrs.height * ratio) + }; + } + return { + height: viewbox.height, + width: viewbox.width + }; +} +const SVG = { + // Scan only the first kilo-byte to speed up the check on larger files + validate: (input) => svgReg.test(toUTF8String(input, 0, 1e3)), + calculate(input) { + const root = toUTF8String(input).match(extractorRegExps.root); + if (root) { + const attrs = parseAttributes(root[0]); + if (attrs.width && attrs.height) { + return calculateByDimensions(attrs); + } + if (attrs.viewbox) { + return calculateByViewbox(attrs, attrs.viewbox); + } + } + throw new TypeError("Invalid SVG"); + } +}; + +const TGA = { + validate(input) { + return readUInt16LE(input, 0) === 0 && readUInt16LE(input, 4) === 0; + }, + calculate(input) { + return { + height: readUInt16LE(input, 14), + width: readUInt16LE(input, 12) + }; + } +}; + +function readIFD(input, isBigEndian) { + const ifdOffset = readUInt(input, 32, 4, isBigEndian); + return input.slice(ifdOffset + 2); +} +function readValue(input, isBigEndian) { + const low = readUInt(input, 16, 8, isBigEndian); + const high = readUInt(input, 16, 10, isBigEndian); + return (high << 16) + low; +} +function nextTag(input) { + if (input.length > 24) { + return input.slice(12); + } +} +function extractTags(input, isBigEndian) { + const tags = {}; + let temp = input; + while (temp && temp.length) { + const code = readUInt(temp, 16, 0, isBigEndian); + const type = readUInt(temp, 16, 2, isBigEndian); + const length = readUInt(temp, 32, 4, isBigEndian); + if (code === 0) { + break; + } else { + if (length === 1 && (type === 3 || type === 4)) { + tags[code] = readValue(temp, isBigEndian); + } + temp = nextTag(temp); + } + } + return tags; +} +function determineEndianness(input) { + const signature = toUTF8String(input, 0, 2); + if ("II" === signature) { + return "LE"; + } else if ("MM" === signature) { + return "BE"; + } +} +const signatures = [ + // '492049', // currently not supported + "49492a00", + // Little endian + "4d4d002a" + // Big Endian + // '4d4d002a', // BigTIFF > 4GB. currently not supported +]; +const TIFF = { + validate: (input) => signatures.includes(toHexString(input, 0, 4)), + calculate(input) { + const isBigEndian = determineEndianness(input) === "BE"; + const ifdBuffer = readIFD(input, isBigEndian); + const tags = extractTags(ifdBuffer, isBigEndian); + const width = tags[256]; + const height = tags[257]; + if (!width || !height) { + throw new TypeError("Invalid Tiff. Missing tags"); + } + return { height, width }; + } +}; + +function calculateExtended(input) { + return { + height: 1 + readUInt24LE(input, 7), + width: 1 + readUInt24LE(input, 4) + }; +} +function calculateLossless(input) { + return { + height: 1 + ((input[4] & 15) << 10 | input[3] << 2 | (input[2] & 192) >> 6), + width: 1 + ((input[2] & 63) << 8 | input[1]) + }; +} +function calculateLossy(input) { + return { + height: readInt16LE(input, 8) & 16383, + width: readInt16LE(input, 6) & 16383 + }; +} +const WEBP = { + validate(input) { + const riffHeader = "RIFF" === toUTF8String(input, 0, 4); + const webpHeader = "WEBP" === toUTF8String(input, 8, 12); + const vp8Header = "VP8" === toUTF8String(input, 12, 15); + return riffHeader && webpHeader && vp8Header; + }, + calculate(input) { + const chunkHeader = toUTF8String(input, 12, 16); + input = input.slice(20, 30); + if (chunkHeader === "VP8X") { + const extendedHeader = input[0]; + const validStart = (extendedHeader & 192) === 0; + const validEnd = (extendedHeader & 1) === 0; + if (validStart && validEnd) { + return calculateExtended(input); + } else { + throw new TypeError("Invalid WebP"); + } + } + if (chunkHeader === "VP8 " && input[0] !== 47) { + return calculateLossy(input); + } + const signature = toHexString(input, 3, 6); + if (chunkHeader === "VP8L" && signature !== "9d012a") { + return calculateLossless(input); + } + throw new TypeError("Invalid WebP"); + } +}; + +const typeHandlers = /* @__PURE__ */ new Map([ + ["bmp", BMP], + ["cur", CUR], + ["dds", DDS], + ["gif", GIF], + ["heif", HEIF], + ["icns", ICNS], + ["ico", ICO], + ["j2c", J2C], + ["jp2", JP2], + ["jpg", JPG], + ["ktx", KTX], + ["png", PNG], + ["pnm", PNM], + ["psd", PSD], + ["svg", SVG], + ["tga", TGA], + ["tiff", TIFF], + ["webp", WEBP] +]); +const types = Array.from(typeHandlers.keys()); + +const firstBytes = /* @__PURE__ */ new Map([ + [56, "psd"], + [66, "bmp"], + [68, "dds"], + [71, "gif"], + [73, "tiff"], + [77, "tiff"], + [82, "webp"], + [105, "icns"], + [137, "png"], + [255, "jpg"] +]); +function detector(input) { + const byte = input[0]; + const type = firstBytes.get(byte); + if (type && typeHandlers.get(type).validate(input)) { + return type; + } + return types.find((fileType) => typeHandlers.get(fileType).validate(input)); +} + +const globalOptions = { + disabledTypes: [] +}; +function lookup(input) { + const type = detector(input); + if (typeof type !== "undefined") { + if (globalOptions.disabledTypes.indexOf(type) > -1) { + throw new TypeError("disabled file type: " + type); + } + const size = typeHandlers.get(type).calculate(input); + if (size !== void 0) { + size.type = size.type ?? type; + return size; + } + } + throw new TypeError("unsupported file type: " + type); +} + +async function probe(url) { + const response = await fetch(url); + if (!response.body || !response.ok) { + throw new Error("Failed to fetch image"); + } + const reader = response.body.getReader(); + let done, value; + let accumulatedChunks = new Uint8Array(); + while (!done) { + const readResult = await reader.read(); + done = readResult.done; + if (done) + break; + if (readResult.value) { + value = readResult.value; + let tmp = new Uint8Array(accumulatedChunks.length + value.length); + tmp.set(accumulatedChunks, 0); + tmp.set(value, accumulatedChunks.length); + accumulatedChunks = tmp; + try { + const dimensions = lookup(accumulatedChunks); + if (dimensions) { + await reader.cancel(); + return dimensions; + } + } catch (error) { + } + } + } + throw new Error("Failed to parse the size"); +} + +async function getConfiguredImageService() { + if (!globalThis?.astroAsset?.imageService) { + const { default: service } = await import( + // @ts-expect-error + '../astro/assets-service_B85IQn9G.mjs' + ).then(n => n.s).catch((e) => { + const error = new AstroError(InvalidImageService); + error.cause = e; + throw error; + }); + if (!globalThis.astroAsset) + globalThis.astroAsset = {}; + globalThis.astroAsset.imageService = service; + return service; + } + return globalThis.astroAsset.imageService; +} +async function getImage$1(options, imageConfig) { + if (!options || typeof options !== "object") { + throw new AstroError({ + ...ExpectedImageOptions, + message: ExpectedImageOptions.message(JSON.stringify(options)) + }); + } + if (typeof options.src === "undefined") { + throw new AstroError({ + ...ExpectedImage, + message: ExpectedImage.message( + options.src, + "undefined", + JSON.stringify(options) + ) + }); + } + const service = await getConfiguredImageService(); + const resolvedOptions = { + ...options, + src: typeof options.src === "object" && "then" in options.src ? (await options.src).default ?? await options.src : options.src + }; + if (options.inferSize && isRemoteImage(resolvedOptions.src)) { + try { + const result = await probe(resolvedOptions.src); + resolvedOptions.width ??= result.width; + resolvedOptions.height ??= result.height; + delete resolvedOptions.inferSize; + } catch { + throw new AstroError({ + ...FailedToFetchRemoteImageDimensions, + message: FailedToFetchRemoteImageDimensions.message(resolvedOptions.src) + }); + } + } + const originalPath = isESMImportedImage(resolvedOptions.src) ? resolvedOptions.src.fsPath : resolvedOptions.src; + const clonedSrc = isESMImportedImage(resolvedOptions.src) ? ( + // @ts-expect-error - clone is a private, hidden prop + resolvedOptions.src.clone ?? resolvedOptions.src + ) : resolvedOptions.src; + resolvedOptions.src = clonedSrc; + const validatedOptions = service.validateOptions ? await service.validateOptions(resolvedOptions, imageConfig) : resolvedOptions; + const srcSetTransforms = service.getSrcSet ? await service.getSrcSet(validatedOptions, imageConfig) : []; + let imageURL = await service.getURL(validatedOptions, imageConfig); + let srcSets = await Promise.all( + srcSetTransforms.map(async (srcSet) => ({ + transform: srcSet.transform, + url: await service.getURL(srcSet.transform, imageConfig), + descriptor: srcSet.descriptor, + attributes: srcSet.attributes + })) + ); + if (isLocalService(service) && globalThis.astroAsset.addStaticImage && !(isRemoteImage(validatedOptions.src) && imageURL === validatedOptions.src)) { + const propsToHash = service.propertiesToHash ?? DEFAULT_HASH_PROPS; + imageURL = globalThis.astroAsset.addStaticImage(validatedOptions, propsToHash, originalPath); + srcSets = srcSetTransforms.map((srcSet) => ({ + transform: srcSet.transform, + url: globalThis.astroAsset.addStaticImage(srcSet.transform, propsToHash, originalPath), + descriptor: srcSet.descriptor, + attributes: srcSet.attributes + })); + } + return { + rawOptions: resolvedOptions, + options: validatedOptions, + src: imageURL, + srcSet: { + values: srcSets, + attribute: srcSets.map((srcSet) => `${srcSet.url} ${srcSet.descriptor}`).join(", ") + }, + attributes: service.getHTMLAttributes !== void 0 ? await service.getHTMLAttributes(validatedOptions, imageConfig) : {} + }; +} + +const fnv1a52 = (str) => { + const len = str.length; + let i = 0, t0 = 0, v0 = 8997, t1 = 0, v1 = 33826, t2 = 0, v2 = 40164, t3 = 0, v3 = 52210; + while (i < len) { + v0 ^= str.charCodeAt(i++); + t0 = v0 * 435; + t1 = v1 * 435; + t2 = v2 * 435; + t3 = v3 * 435; + t2 += v0 << 8; + t3 += v1 << 8; + t1 += t0 >>> 16; + v0 = t0 & 65535; + t2 += t1 >>> 16; + v1 = t1 & 65535; + v3 = t3 + (t2 >>> 16) & 65535; + v2 = t2 & 65535; + } + return (v3 & 15) * 281474976710656 + v2 * 4294967296 + v1 * 65536 + (v0 ^ v3 >> 4); +}; +const etag = (payload, weak = false) => { + const prefix = weak ? 'W/"' : '"'; + return prefix + fnv1a52(payload).toString(36) + payload.length.toString(36) + '"'; +}; + +const $$Astro$1 = createAstro(); +const $$Image = createComponent(async ($$result, $$props, $$slots) => { + const Astro2 = $$result.createAstro($$Astro$1, $$props, $$slots); + Astro2.self = $$Image; + const props = Astro2.props; + if (props.alt === void 0 || props.alt === null) { + throw new AstroError(ImageMissingAlt); + } + if (typeof props.width === "string") { + props.width = parseInt(props.width); + } + if (typeof props.height === "string") { + props.height = parseInt(props.height); + } + const image = await getImage(props); + const additionalAttributes = {}; + if (image.srcSet.values.length > 0) { + additionalAttributes.srcset = image.srcSet.attribute; + } + return renderTemplate`${maybeRenderHead()}`; +}, "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/node_modules/astro/components/Image.astro", void 0); + +const $$Astro = createAstro(); +const $$Picture = createComponent(async ($$result, $$props, $$slots) => { + const Astro2 = $$result.createAstro($$Astro, $$props, $$slots); + Astro2.self = $$Picture; + const defaultFormats = ["webp"]; + const defaultFallbackFormat = "png"; + const specialFormatsFallback = ["gif", "svg", "jpg", "jpeg"]; + const { formats = defaultFormats, pictureAttributes = {}, fallbackFormat, ...props } = Astro2.props; + if (props.alt === void 0 || props.alt === null) { + throw new AstroError(ImageMissingAlt); + } + const optimizedImages = await Promise.all( + formats.map( + async (format) => await getImage({ ...props, format, widths: props.widths, densities: props.densities }) + ) + ); + let resultFallbackFormat = fallbackFormat ?? defaultFallbackFormat; + if (!fallbackFormat && isESMImportedImage(props.src) && specialFormatsFallback.includes(props.src.format)) { + resultFallbackFormat = props.src.format; + } + const fallbackImage = await getImage({ + ...props, + format: resultFallbackFormat, + widths: props.widths, + densities: props.densities + }); + const imgAdditionalAttributes = {}; + const sourceAdditionalAttributes = {}; + if (props.sizes) { + sourceAdditionalAttributes.sizes = props.sizes; + } + if (fallbackImage.srcSet.values.length > 0) { + imgAdditionalAttributes.srcset = fallbackImage.srcSet.attribute; + } + return renderTemplate`${maybeRenderHead()} ${Object.entries(optimizedImages).map(([_, image]) => { + const srcsetAttribute = props.densities || !props.densities && !props.widths ? `${image.src}${image.srcSet.values.length > 0 ? ", " + image.srcSet.attribute : ""}` : image.srcSet.attribute; + return renderTemplate``; + })} `; +}, "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/node_modules/astro/components/Picture.astro", void 0); + +const imageConfig = {"service":{"entrypoint":"astro/assets/services/sharp","config":{"limitInputPixels":false}},"domains":[],"remotePatterns":[]}; + new URL("file:///C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/dist/"); + const getImage = async (options) => await getImage$1(options, imageConfig); + +async function loadRemoteImage(src) { + try { + const res = await fetch(src); + if (!res.ok) { + return void 0; + } + return await res.arrayBuffer(); + } catch (err) { + return void 0; + } +} +const GET = async ({ request }) => { + try { + const imageService = await getConfiguredImageService(); + if (!("transform" in imageService)) { + throw new Error("Configured image service is not a local service"); + } + const url = new URL(request.url); + const transform = await imageService.parseURL(url, imageConfig); + if (!transform?.src) { + throw new Error("Incorrect transform returned by `parseURL`"); + } + let inputBuffer = void 0; + const sourceUrl = isRemotePath(transform.src) ? new URL(transform.src) : new URL(transform.src, url.origin); + if (isRemotePath(transform.src) && isRemoteAllowed(transform.src, imageConfig) === false) { + return new Response("Forbidden", { status: 403 }); + } + inputBuffer = await loadRemoteImage(sourceUrl); + if (!inputBuffer) { + return new Response("Not Found", { status: 404 }); + } + const { data, format } = await imageService.transform( + new Uint8Array(inputBuffer), + transform, + imageConfig + ); + return new Response(data, { + status: 200, + headers: { + "Content-Type": mime.getType(format) ?? `image/${format}`, + "Cache-Control": "public, max-age=31536000", + ETag: etag(data.toString()), + Date: (/* @__PURE__ */ new Date()).toUTCString() + } + }); + } catch (err) { + console.error("Could not process image request:", err); + return new Response(`Server Error: ${err}`, { status: 500 }); + } +}; + +const generic = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ + __proto__: null, + GET +}, Symbol.toStringTag, { value: 'Module' })); + +export { $$Picture as $, $$Image as a, generic as g }; diff --git a/.netlify/functions-internal/ssr/chunks/portfolio_7D8uYWzQ.mjs b/.netlify/functions-internal/ssr/chunks/portfolio_7D8uYWzQ.mjs new file mode 100644 index 0000000..e17bed5 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/portfolio_7D8uYWzQ.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.p); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/portfolio_xErXodJ1.mjs b/.netlify/functions-internal/ssr/chunks/portfolio_xErXodJ1.mjs new file mode 100644 index 0000000..01e831b --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/portfolio_xErXodJ1.mjs @@ -0,0 +1,5 @@ +export { renderers } from '../renderers.mjs'; + +const page = () => import('./prerender_CW_rJxYZ.mjs').then(n => n.j); + +export { page }; diff --git a/.netlify/functions-internal/ssr/chunks/prerender_CW_rJxYZ.mjs b/.netlify/functions-internal/ssr/chunks/prerender_CW_rJxYZ.mjs new file mode 100644 index 0000000..fafb650 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/prerender_CW_rJxYZ.mjs @@ -0,0 +1,15 @@ +const noop = () => {}; +export const _ = noop; +export const a = noop; +export const b = noop; +export const c = noop; +export const d = noop; +export const e = noop; +export const f = noop; +export const g = noop; +export const h = noop; +export const i = noop; +export const j = noop; +export const k = noop; +export const l = noop; +export const p = noop; \ No newline at end of file diff --git a/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_B0MLHccf.mjs b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_B0MLHccf.mjs new file mode 100644 index 0000000..b70977e --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_B0MLHccf.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./ui-kit-for-tailwind_Bfbcl2ec.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_Be3bTW72.mjs b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_Be3bTW72.mjs new file mode 100644 index 0000000..55efa58 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_Be3bTW72.mjs @@ -0,0 +1,25 @@ +const id = "ru/ui-kit-for-tailwind.mdx"; + const collection = "posts"; + const slug = "ui-kit-for-tailwindcss"; + const body = "\r\nTailwind CSS с его подходом, ориентированным на полезность, произвел революцию в создании пользовательских интерфейсов. Теперь давайте сделаем еще один шаг вперед и познакомимся с магией UI Kits, созданных специально для Tailwind CSS.\r\n\r\n\r\nЭти наборы не только добавляют стиль, но и обеспечивают быстрый переход к визуально ошеломляющим веб-приложениям. В этом легком и понятном руководстве мы рассмотрим некоторые популярные наборы UI, включая daisyUI, Mamba UI, Flowbite, Meraki UI и Tailblocks, и добавим к ним несколько личных рекомендаций.\r\n\r\n\r\n\r\n## **Почему стоит использовать UI Kits с Tailwind CSS?**\r\n\r\n\r\nTailwind CSS отлично подходит для создания стилей, основанных на утилитах, но для тех, кто хочет немного больше изысков, не жертвуя скоростью, секретным соусом являются UI Kits. \r\n\r\n\r\nОни представляют собой набор заранее разработанных компонентов, готовых к использованию в вашем проекте, что позволяет сэкономить время и силы. Давайте рассмотрим их преимущества:\r\n\r\n1. **Экспресс-прототипирование**: Наборы UI ускоряют этап создания прототипов. Благодаря готовым компонентам вы можете быстро создавать интерфейсы, делая итерации простыми и легкими..\r\n\r\n2. **Согласованный стиль**: Поддерживать единый язык дизайна во всех проектах - непростая задача. Наборы UI упрощают этот процесс, обеспечивая полированный и целостный вид ваших веб-приложений.\r\n\r\n3. **Меньше шаблонов**: Попрощайтесь с повторяющимся кодом для общих элементов пользовательского интерфейса. Наборы UI сокращают количество шаблонов, делая вашу кодовую базу чище и удобнее в обслуживании.\r\n\r\n4. **Отзывчивость**: Tailwind CSS известен своей отзывчивостью, и комплекты пользовательского интерфейса, построенные на его основе, наследуют эту особенность. Ваши компоненты легко адаптируются к различным размерам экрана.\r\n\r\n#### 1. **daisyUI (daisyui.com)**.\r\n - **Что особенного**: Компоненты Tailwind CSS на стероидах. Предлагает улучшенные версии распространенных элементов.\r\n - **Почему вам понравится**: Экономия времени благодаря многофункциональным компонентам. Идеально подходит для проектов, которым нужно немного больше пиццы.\r\n\r\n#### 2. **Mamba UI (mambaui.com)**.\r\n - **Что особенного**: Элегантный и современный UI Kit для Tailwind CSS. Предлагает широкий спектр компонентов.\r\n - **Почему вам понравится**: Чистый, элегантный и универсальный. Отлично подходит для проектов, нацеленных на современную эстетику.\r\n\r\n#### 3. **Flowbite (flowbite.com)**.\r\n - **Что особенного**: Компоненты Tailwind CSS со свежим и современным дизайном. Идеально подходят для создания современных интерфейсов.\r\n - **Почему вам понравится**: Модный и визуально привлекательный. Идеально подходит для веб-приложений, которым требуется современный внешний вид и ощущение.\r\n\r\n#### 4. **Meraki UI (merakiui.com)**.\r\n - **Что особенного**: Комплект пользовательского интерфейса, созданный с особой тщательностью, предлагающий разнообразные компоненты с вниманием к деталям.\r\n - Почему он вам понравится**: Элегантный и хорошо продуманный дизайн. Подходит для проектов, где эстетика играет решающую роль.\r\n\r\n#### 5. **Tailblocks (tailblocks.cc)**.\r\n - **Что особенного**: Коллекция готовых к использованию CSS-блоков Tailwind для создания целевых страниц.\r\n - **Почему вам это понравится**: Идеально подходит для начала работы над дизайном целевой страницы. Легко настраивается и интегрируется в ваш проект.\r\n\r\n\r\n\r\n## **Интеграция наборов пользовательского интерфейса: Краткое руководство**\r\n\r\n1. **Установка**: Следуйте руководству по установке UI Kit. Это может включать установку в виде пакета или копирование соответствующих файлов в ваш проект.\r\n\r\n2. **Конфигурация**: Убедитесь, что UI Kit настроен на совместную работу с Tailwind CSS. Проверьте дополнительные шаги в прилагаемых инструкциях.\r\n\r\n3. **Использование**: После установки и настройки начните использовать компоненты в своей HTML-разметке. Обратитесь к документации для получения рекомендаций по настройке.\r\n\r\n\r\n\r\n## **Вывод: Создание красивых пользовательских интерфейсов с легкостью**\r\n\r\nИспользование UI Kits в проекте Tailwind CSS - это как вишенка на вершине и без того восхитительного торта. Независимо от того, являетесь ли вы разработчиком-одиночкой или частью команды, эти наборы привнесут эффективность и стиль в ваш путь веб-разработки.\r\n\r\n\r\n\r\nИсследуя разнообразный мир наборов Tailwind CSS UI Kits, не забывайте экспериментировать, находить то, что подходит для вашего проекта, и наслаждаться процессом создания визуально захватывающих пользовательских интерфейсов. Счастливого кодинга!\r\n"; + const data = {isDraft:false,title:"UI Kit'ы для TailwindCSS",description:"Улучшите свои проекты Tailwind CSS с помощью стильных наборов пользовательского интерфейса, таких как daisyUI, Mamba UI, Flowbite, Meraki UI и Tailblocks. Легкая интеграция для красивой и эффективной веб-разработки. 🎨✨",image: + new Proxy({"src":"/_astro/ui.2qgQiiwW.jpg","width":1500,"height":844,"format":"jpg","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/ui.jpg"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/ui.jpg"; + } + + return target[name]; + } + }) + ,author:"ChatGPT",tags:["uiKitsForTailwindCSS"],categories:["советы"],publishDate:"13/01/2024",language:"ru"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/ui-kit-for-tailwind.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_BfTHigj9.mjs b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_BfTHigj9.mjs new file mode 100644 index 0000000..91cbcb1 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_BfTHigj9.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./ui-kit-for-tailwind_DZV9kgqf.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_Bfbcl2ec.mjs b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_Bfbcl2ec.mjs new file mode 100644 index 0000000..2693858 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_Bfbcl2ec.mjs @@ -0,0 +1,237 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "ui-kit-for-tailwind", + "author": "ChatGPT", + "isDraft": false, + "title": "UI Kit's for TailwindCSS", + "description": "Elevate your Tailwind CSS projects with stylish UI Kits like daisyUI, Mamba UI, Flowbite, Meraki UI, and Tailblocks. Effortless integration for beautiful, efficient web development. \u{1F3A8}\u2728", + "image": "../images/ui.jpg", + "tags": ["uiKitsForTailwindCSS"], + "categories": ["advices"], + "publishDate": "13/01/2024", + "language": "en" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "why-ui-kits-with-tailwind-css", + "text": "Why UI Kits with Tailwind CSS?" + }, { + "depth": 4, + "slug": "1-daisyui-daisyuicom", + "text": "1. daisyUI (daisyui.com)" + }, { + "depth": 4, + "slug": "2-mamba-ui-mambauicom", + "text": "2. Mamba UI (mambaui.com)" + }, { + "depth": 4, + "slug": "3-flowbite-flowbitecom", + "text": "3. Flowbite (flowbite.com)" + }, { + "depth": 4, + "slug": "4-meraki-ui-merakiuicom", + "text": "4. Meraki UI (merakiui.com)" + }, { + "depth": 4, + "slug": "5-tailblocks-tailblockscc", + "text": "5. Tailblocks (tailblocks.cc)" + }, { + "depth": 2, + "slug": "integrating-ui-kits-a-quick-how-to", + "text": "Integrating UI Kits: A Quick How-To" + }, { + "depth": 2, + "slug": "conclusion-crafting-beautiful-uis-with-ease", + "text": "Conclusion: Crafting Beautiful UIs with Ease" + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + h2: "h2", + h4: "h4", + li: "li", + ol: "ol", + p: "p", + strong: "strong", + ul: "ul", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.p, { + children: "Tailwind CSS, with its utility-first approach, has revolutionized the way we build user interfaces. Now, let\u2019s take it a step further and explore the magic of UI Kits tailored for Tailwind CSS." + }), "\n", createVNode(_components.p, { + children: "These kits not only add style but also provide a shortcut to visually stunning web applications. In this easy-to-follow guide, we\u2019ll walk through some popular UI Kits, including daisyUI, Mamba UI, Flowbite, Meraki UI, and Tailblocks, sprinkled with a dash of personal recommendations." + }), "\n", createVNode(_components.h2, { + id: "why-ui-kits-with-tailwind-css", + children: createVNode(_components.strong, { + children: "Why UI Kits with Tailwind CSS?" + }) + }), "\n", createVNode(_components.p, { + children: "Tailwind CSS is fantastic for utility-driven styling, but for those who want a little extra flair without sacrificing speed, UI Kits are the secret sauce. They bring a set of pre-designed components, ready to drop into your project, saving time and effort. Let\u2019s explore the perks:" + }), "\n", createVNode(_components.ol, { + children: ["\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "Express Prototyping" + }), ": UI Kits accelerate the prototyping phase. With ready-to-use components, you can quickly piece together interfaces, making iterations a breeze."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "Consistent Style" + }), ": Maintaining a consistent design language across projects is a challenge. UI Kits streamline this process, ensuring your web apps have a polished and cohesive look."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "Less Boilerplate" + }), ": Say goodbye to repetitive code for common UI elements. UI Kits reduce boilerplate, making your codebase cleaner and more maintainable."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "Responsive Goodness" + }), ": Tailwind CSS is known for its responsiveness, and UI Kits built on it inherit this trait. Your components seamlessly adapt to various screen sizes."] + }), "\n"] + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "1-daisyui-daisyuicom", + children: ["1. ", createVNode(_components.strong, { + children: "daisyUI (daisyui.com)" + })] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "What\u2019s Special" + }), ": Tailwind CSS components on steroids. Offers enhanced versions of common elements."] + }), "\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "Why You\u2019ll Love It" + }), ": Saves time with feature-rich components. Perfect for projects that need a little extra pizzazz."] + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "2-mamba-ui-mambauicom", + children: ["2. ", createVNode(_components.strong, { + children: "Mamba UI (mambaui.com)" + })] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "What\u2019s Special" + }), ": A sleek and modern UI Kit for Tailwind CSS. Offers a wide range of components."] + }), "\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "Why You\u2019ll Love It" + }), ": Clean, elegant, and versatile. Great for projects aiming for a modern aesthetic."] + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "3-flowbite-flowbitecom", + children: ["3. ", createVNode(_components.strong, { + children: "Flowbite (flowbite.com)" + })] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "What\u2019s Special" + }), ": Tailwind CSS components with a fresh and modern design. Ideal for building contemporary interfaces."] + }), "\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "Why You\u2019ll Love It" + }), ": Trendy and visually appealing. Perfect for web apps that demand a modern look and feel."] + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "4-meraki-ui-merakiuicom", + children: ["4. ", createVNode(_components.strong, { + children: "Meraki UI (merakiui.com)" + })] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "What\u2019s Special" + }), ": A UI Kit crafted with care, offering a variety of components with attention to detail."] + }), "\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "Why You\u2019ll Love It" + }), ": Elegant and well-designed. Suitable for projects where aesthetics play a crucial role."] + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "5-tailblocks-tailblockscc", + children: ["5. ", createVNode(_components.strong, { + children: "Tailblocks (tailblocks.cc)" + })] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "What\u2019s Special" + }), ": A collection of ready-to-use Tailwind CSS blocks for building landing pages."] + }), "\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "Why You\u2019ll Love It" + }), ": Perfect for kickstarting your landing page design. Easy to customize and integrate into your project."] + }), "\n"] + }), "\n", createVNode(_components.h2, { + id: "integrating-ui-kits-a-quick-how-to", + children: createVNode(_components.strong, { + children: "Integrating UI Kits: A Quick How-To" + }) + }), "\n", createVNode(_components.ol, { + children: ["\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "Installation" + }), ": Follow the UI Kit\u2019s installation guide. It might involve installing it as a package or copying relevant files into your project."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "Configuration" + }), ": Ensure the UI Kit is configured to work seamlessly with Tailwind CSS. Check the provided instructions for any additional steps."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "Usage" + }), ": Once installed and configured, start using the components in your HTML markup. Refer to the documentation for guidance on customization options."] + }), "\n"] + }), "\n"] + }), "\n", createVNode(_components.h2, { + id: "conclusion-crafting-beautiful-uis-with-ease", + children: createVNode(_components.strong, { + children: "Conclusion: Crafting Beautiful UIs with Ease" + }) + }), "\n", createVNode(_components.p, { + children: "Incorporating UI Kits into your Tailwind CSS project is like adding a cherry on top of an already delightful cake. Whether you\u2019re a solo developer or part of a team, these kits bring efficiency and style to your web development journey." + }), "\n", createVNode(_components.p, { + children: "As you explore the diverse world of Tailwind CSS UI Kits, remember to experiment, find what resonates with your project, and enjoy the process of building visually captivating user interfaces. Happy coding!" + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/en/ui-kit-for-tailwind.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/ui-kit-for-tailwind.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/ui-kit-for-tailwind.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_DL6qUlsy.mjs b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_DL6qUlsy.mjs new file mode 100644 index 0000000..ef06b4c --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_DL6qUlsy.mjs @@ -0,0 +1,25 @@ +const id = "en/ui-kit-for-tailwind.mdx"; + const collection = "posts"; + const slug = "ui-kit-for-tailwind"; + const body = "\r\nTailwind CSS, with its utility-first approach, has revolutionized the way we build user interfaces. Now, let's take it a step further and explore the magic of UI Kits tailored for Tailwind CSS.\r\n\r\n\r\nThese kits not only add style but also provide a shortcut to visually stunning web applications. In this easy-to-follow guide, we'll walk through some popular UI Kits, including daisyUI, Mamba UI, Flowbite, Meraki UI, and Tailblocks, sprinkled with a dash of personal recommendations.\r\n\r\n\r\n\r\n## **Why UI Kits with Tailwind CSS?**\r\n\r\nTailwind CSS is fantastic for utility-driven styling, but for those who want a little extra flair without sacrificing speed, UI Kits are the secret sauce. They bring a set of pre-designed components, ready to drop into your project, saving time and effort. Let's explore the perks:\r\n\r\n1. **Express Prototyping**: UI Kits accelerate the prototyping phase. With ready-to-use components, you can quickly piece together interfaces, making iterations a breeze.\r\n\r\n2. **Consistent Style**: Maintaining a consistent design language across projects is a challenge. UI Kits streamline this process, ensuring your web apps have a polished and cohesive look.\r\n\r\n3. **Less Boilerplate**: Say goodbye to repetitive code for common UI elements. UI Kits reduce boilerplate, making your codebase cleaner and more maintainable.\r\n\r\n4. **Responsive Goodness**: Tailwind CSS is known for its responsiveness, and UI Kits built on it inherit this trait. Your components seamlessly adapt to various screen sizes.\r\n\r\n\r\n\r\n#### 1. **daisyUI (daisyui.com)**\r\n - **What's Special**: Tailwind CSS components on steroids. Offers enhanced versions of common elements.\r\n - **Why You'll Love It**: Saves time with feature-rich components. Perfect for projects that need a little extra pizzazz.\r\n\r\n#### 2. **Mamba UI (mambaui.com)**\r\n - **What's Special**: A sleek and modern UI Kit for Tailwind CSS. Offers a wide range of components.\r\n - **Why You'll Love It**: Clean, elegant, and versatile. Great for projects aiming for a modern aesthetic.\r\n\r\n#### 3. **Flowbite (flowbite.com)**\r\n - **What's Special**: Tailwind CSS components with a fresh and modern design. Ideal for building contemporary interfaces.\r\n - **Why You'll Love It**: Trendy and visually appealing. Perfect for web apps that demand a modern look and feel.\r\n\r\n#### 4. **Meraki UI (merakiui.com)**\r\n - **What's Special**: A UI Kit crafted with care, offering a variety of components with attention to detail.\r\n - **Why You'll Love It**: Elegant and well-designed. Suitable for projects where aesthetics play a crucial role.\r\n\r\n#### 5. **Tailblocks (tailblocks.cc)**\r\n - **What's Special**: A collection of ready-to-use Tailwind CSS blocks for building landing pages.\r\n - **Why You'll Love It**: Perfect for kickstarting your landing page design. Easy to customize and integrate into your project.\r\n\r\n\r\n\r\n## **Integrating UI Kits: A Quick How-To**\r\n\r\n1. **Installation**: Follow the UI Kit's installation guide. It might involve installing it as a package or copying relevant files into your project.\r\n\r\n2. **Configuration**: Ensure the UI Kit is configured to work seamlessly with Tailwind CSS. Check the provided instructions for any additional steps.\r\n\r\n3. **Usage**: Once installed and configured, start using the components in your HTML markup. Refer to the documentation for guidance on customization options.\r\n\r\n\r\n\r\n## **Conclusion: Crafting Beautiful UIs with Ease**\r\n\r\nIncorporating UI Kits into your Tailwind CSS project is like adding a cherry on top of an already delightful cake. Whether you're a solo developer or part of a team, these kits bring efficiency and style to your web development journey.\r\n\r\n\r\n\r\nAs you explore the diverse world of Tailwind CSS UI Kits, remember to experiment, find what resonates with your project, and enjoy the process of building visually captivating user interfaces. Happy coding!\r\n"; + const data = {isDraft:false,title:"UI Kit's for TailwindCSS",description:"Elevate your Tailwind CSS projects with stylish UI Kits like daisyUI, Mamba UI, Flowbite, Meraki UI, and Tailblocks. Effortless integration for beautiful, efficient web development. 🎨✨",image: + new Proxy({"src":"/_astro/ui.2qgQiiwW.jpg","width":1500,"height":844,"format":"jpg","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/ui.jpg"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/ui.jpg"; + } + + return target[name]; + } + }) + ,author:"ChatGPT",tags:["uiKitsForTailwindCSS"],categories:["advices"],publishDate:"13/01/2024",language:"en"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/ui-kit-for-tailwind.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_DZV9kgqf.mjs b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_DZV9kgqf.mjs new file mode 100644 index 0000000..86b707c --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/ui-kit-for-tailwind_DZV9kgqf.mjs @@ -0,0 +1,237 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "ui-kit-for-tailwindcss", + "author": "ChatGPT", + "isDraft": false, + "title": "UI Kit'\u044B \u0434\u043B\u044F TailwindCSS", + "description": "\u0423\u043B\u0443\u0447\u0448\u0438\u0442\u0435 \u0441\u0432\u043E\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u044B Tailwind CSS \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0441\u0442\u0438\u043B\u044C\u043D\u044B\u0445 \u043D\u0430\u0431\u043E\u0440\u043E\u0432 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A daisyUI, Mamba UI, Flowbite, Meraki UI \u0438 Tailblocks. \u041B\u0435\u0433\u043A\u0430\u044F \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u043A\u0440\u0430\u0441\u0438\u0432\u043E\u0439 \u0438 \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438. \u{1F3A8}\u2728", + "image": "../images/ui.jpg", + "tags": ["uiKitsForTailwindCSS"], + "categories": ["\u0441\u043E\u0432\u0435\u0442\u044B"], + "publishDate": "13/01/2024", + "language": "ru" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "\u043F\u043E\u0447\u0435\u043C\u0443-\u0441\u0442\u043E\u0438\u0442-\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C-ui-kits-\u0441-tailwind-css", + "text": "\u041F\u043E\u0447\u0435\u043C\u0443 \u0441\u0442\u043E\u0438\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C UI Kits \u0441 Tailwind CSS?" + }, { + "depth": 4, + "slug": "1-daisyui-daisyuicom", + "text": "1. daisyUI (daisyui.com)." + }, { + "depth": 4, + "slug": "2-mamba-ui-mambauicom", + "text": "2. Mamba UI (mambaui.com)." + }, { + "depth": 4, + "slug": "3-flowbite-flowbitecom", + "text": "3. Flowbite (flowbite.com)." + }, { + "depth": 4, + "slug": "4-meraki-ui-merakiuicom", + "text": "4. Meraki UI (merakiui.com)." + }, { + "depth": 4, + "slug": "5-tailblocks-tailblockscc", + "text": "5. Tailblocks (tailblocks.cc)." + }, { + "depth": 2, + "slug": "\u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044F-\u043D\u0430\u0431\u043E\u0440\u043E\u0432-\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E-\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430-\u043A\u0440\u0430\u0442\u043A\u043E\u0435-\u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E", + "text": "\u0418\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044F \u043D\u0430\u0431\u043E\u0440\u043E\u0432 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430: \u041A\u0440\u0430\u0442\u043A\u043E\u0435 \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E" + }, { + "depth": 2, + "slug": "\u0432\u044B\u0432\u043E\u0434-\u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0435-\u043A\u0440\u0430\u0441\u0438\u0432\u044B\u0445-\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445-\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432-\u0441-\u043B\u0435\u0433\u043A\u043E\u0441\u0442\u044C\u044E", + "text": "\u0412\u044B\u0432\u043E\u0434: \u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u043A\u0440\u0430\u0441\u0438\u0432\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432 \u0441 \u043B\u0435\u0433\u043A\u043E\u0441\u0442\u044C\u044E" + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + h2: "h2", + h4: "h4", + li: "li", + ol: "ol", + p: "p", + strong: "strong", + ul: "ul", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.p, { + children: "Tailwind CSS \u0441 \u0435\u0433\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u043C, \u043E\u0440\u0438\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u043C \u043D\u0430 \u043F\u043E\u043B\u0435\u0437\u043D\u043E\u0441\u0442\u044C, \u043F\u0440\u043E\u0438\u0437\u0432\u0435\u043B \u0440\u0435\u0432\u043E\u043B\u044E\u0446\u0438\u044E \u0432 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432. \u0422\u0435\u043F\u0435\u0440\u044C \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043B\u0430\u0435\u043C \u0435\u0449\u0435 \u043E\u0434\u0438\u043D \u0448\u0430\u0433 \u0432\u043F\u0435\u0440\u0435\u0434 \u0438 \u043F\u043E\u0437\u043D\u0430\u043A\u043E\u043C\u0438\u043C\u0441\u044F \u0441 \u043C\u0430\u0433\u0438\u0435\u0439 UI Kits, \u0441\u043E\u0437\u0434\u0430\u043D\u043D\u044B\u0445 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u043E \u0434\u043B\u044F Tailwind CSS." + }), "\n", createVNode(_components.p, { + children: "\u042D\u0442\u0438 \u043D\u0430\u0431\u043E\u0440\u044B \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u044E\u0442 \u0441\u0442\u0438\u043B\u044C, \u043D\u043E \u0438 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u044E\u0442 \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0435\u0440\u0435\u0445\u043E\u0434 \u043A \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043E\u0448\u0435\u043B\u043E\u043C\u043B\u044F\u044E\u0449\u0438\u043C \u0432\u0435\u0431-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C. \u0412 \u044D\u0442\u043E\u043C \u043B\u0435\u0433\u043A\u043E\u043C \u0438 \u043F\u043E\u043D\u044F\u0442\u043D\u043E\u043C \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u0435 \u043C\u044B \u0440\u0430\u0441\u0441\u043C\u043E\u0442\u0440\u0438\u043C \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u043E\u043F\u0443\u043B\u044F\u0440\u043D\u044B\u0435 \u043D\u0430\u0431\u043E\u0440\u044B UI, \u0432\u043A\u043B\u044E\u0447\u0430\u044F daisyUI, Mamba UI, Flowbite, Meraki UI \u0438 Tailblocks, \u0438 \u0434\u043E\u0431\u0430\u0432\u0438\u043C \u043A \u043D\u0438\u043C \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043B\u0438\u0447\u043D\u044B\u0445 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u0439." + }), "\n", createVNode(_components.h2, { + id: "\u043F\u043E\u0447\u0435\u043C\u0443-\u0441\u0442\u043E\u0438\u0442-\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C-ui-kits-\u0441-tailwind-css", + children: createVNode(_components.strong, { + children: "\u041F\u043E\u0447\u0435\u043C\u0443 \u0441\u0442\u043E\u0438\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C UI Kits \u0441 Tailwind CSS?" + }) + }), "\n", createVNode(_components.p, { + children: "Tailwind CSS \u043E\u0442\u043B\u0438\u0447\u043D\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0434\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0441\u0442\u0438\u043B\u0435\u0439, \u043E\u0441\u043D\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043D\u0430 \u0443\u0442\u0438\u043B\u0438\u0442\u0430\u0445, \u043D\u043E \u0434\u043B\u044F \u0442\u0435\u0445, \u043A\u0442\u043E \u0445\u043E\u0447\u0435\u0442 \u043D\u0435\u043C\u043D\u043E\u0433\u043E \u0431\u043E\u043B\u044C\u0448\u0435 \u0438\u0437\u044B\u0441\u043A\u043E\u0432, \u043D\u0435 \u0436\u0435\u0440\u0442\u0432\u0443\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C\u044E, \u0441\u0435\u043A\u0440\u0435\u0442\u043D\u044B\u043C \u0441\u043E\u0443\u0441\u043E\u043C \u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F UI Kits." + }), "\n", createVNode(_components.p, { + children: "\u041E\u043D\u0438 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0442 \u0441\u043E\u0431\u043E\u0439 \u043D\u0430\u0431\u043E\u0440 \u0437\u0430\u0440\u0430\u043D\u0435\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u044B\u0445 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432, \u0433\u043E\u0442\u043E\u0432\u044B\u0445 \u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044E \u0432 \u0432\u0430\u0448\u0435\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u0435, \u0447\u0442\u043E \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0441\u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0442\u044C \u0432\u0440\u0435\u043C\u044F \u0438 \u0441\u0438\u043B\u044B. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043C\u043E\u0442\u0440\u0438\u043C \u0438\u0445 \u043F\u0440\u0435\u0438\u043C\u0443\u0449\u0435\u0441\u0442\u0432\u0430:" + }), "\n", createVNode(_components.ol, { + children: ["\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "\u042D\u043A\u0441\u043F\u0440\u0435\u0441\u0441-\u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435" + }), ": \u041D\u0430\u0431\u043E\u0440\u044B UI \u0443\u0441\u043A\u043E\u0440\u044F\u044E\u0442 \u044D\u0442\u0430\u043F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F\u043E\u0432. \u0411\u043B\u0430\u0433\u043E\u0434\u0430\u0440\u044F \u0433\u043E\u0442\u043E\u0432\u044B\u043C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430\u043C \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0431\u044B\u0441\u0442\u0440\u043E \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044B, \u0434\u0435\u043B\u0430\u044F \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u0440\u043E\u0441\u0442\u044B\u043C\u0438 \u0438 \u043B\u0435\u0433\u043A\u0438\u043C\u0438.."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "\u0421\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0441\u0442\u0438\u043B\u044C" + }), ": \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044C \u0435\u0434\u0438\u043D\u044B\u0439 \u044F\u0437\u044B\u043A \u0434\u0438\u0437\u0430\u0439\u043D\u0430 \u0432\u043E \u0432\u0441\u0435\u0445 \u043F\u0440\u043E\u0435\u043A\u0442\u0430\u0445 - \u043D\u0435\u043F\u0440\u043E\u0441\u0442\u0430\u044F \u0437\u0430\u0434\u0430\u0447\u0430. \u041D\u0430\u0431\u043E\u0440\u044B UI \u0443\u043F\u0440\u043E\u0449\u0430\u044E\u0442 \u044D\u0442\u043E\u0442 \u043F\u0440\u043E\u0446\u0435\u0441\u0441, \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u044F \u043F\u043E\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438 \u0446\u0435\u043B\u043E\u0441\u0442\u043D\u044B\u0439 \u0432\u0438\u0434 \u0432\u0430\u0448\u0438\u0445 \u0432\u0435\u0431-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "\u041C\u0435\u043D\u044C\u0448\u0435 \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u0432" + }), ": \u041F\u043E\u043F\u0440\u043E\u0449\u0430\u0439\u0442\u0435\u0441\u044C \u0441 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u044E\u0449\u0438\u043C\u0441\u044F \u043A\u043E\u0434\u043E\u043C \u0434\u043B\u044F \u043E\u0431\u0449\u0438\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041D\u0430\u0431\u043E\u0440\u044B UI \u0441\u043E\u043A\u0440\u0430\u0449\u0430\u044E\u0442 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u0432, \u0434\u0435\u043B\u0430\u044F \u0432\u0430\u0448\u0443 \u043A\u043E\u0434\u043E\u0432\u0443\u044E \u0431\u0430\u0437\u0443 \u0447\u0438\u0449\u0435 \u0438 \u0443\u0434\u043E\u0431\u043D\u0435\u0435 \u0432 \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u0438."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "\u041E\u0442\u0437\u044B\u0432\u0447\u0438\u0432\u043E\u0441\u0442\u044C" + }), ": Tailwind CSS \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043D \u0441\u0432\u043E\u0435\u0439 \u043E\u0442\u0437\u044B\u0432\u0447\u0438\u0432\u043E\u0441\u0442\u044C\u044E, \u0438 \u043A\u043E\u043C\u043F\u043B\u0435\u043A\u0442\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043F\u043E\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0435 \u043D\u0430 \u0435\u0433\u043E \u043E\u0441\u043D\u043E\u0432\u0435, \u043D\u0430\u0441\u043B\u0435\u0434\u0443\u044E\u0442 \u044D\u0442\u0443 \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0441\u0442\u044C. \u0412\u0430\u0448\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u044B \u043B\u0435\u0433\u043A\u043E \u0430\u0434\u0430\u043F\u0442\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u043A \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u043C \u0440\u0430\u0437\u043C\u0435\u0440\u0430\u043C \u044D\u043A\u0440\u0430\u043D\u0430."] + }), "\n"] + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "1-daisyui-daisyuicom", + children: ["1. ", createVNode(_components.strong, { + children: "daisyUI (daisyui.com)" + }), "."] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "\u0427\u0442\u043E \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0433\u043E" + }), ": \u041A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u044B Tailwind CSS \u043D\u0430 \u0441\u0442\u0435\u0440\u043E\u0438\u0434\u0430\u0445. \u041F\u0440\u0435\u0434\u043B\u0430\u0433\u0430\u0435\u0442 \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u044B\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432."] + }), "\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "\u041F\u043E\u0447\u0435\u043C\u0443 \u0432\u0430\u043C \u043F\u043E\u043D\u0440\u0430\u0432\u0438\u0442\u0441\u044F" + }), ": \u042D\u043A\u043E\u043D\u043E\u043C\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0431\u043B\u0430\u0433\u043E\u0434\u0430\u0440\u044F \u043C\u043D\u043E\u0433\u043E\u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u043C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430\u043C. \u0418\u0434\u0435\u0430\u043B\u044C\u043D\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0434\u043B\u044F \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043D\u0443\u0436\u043D\u043E \u043D\u0435\u043C\u043D\u043E\u0433\u043E \u0431\u043E\u043B\u044C\u0448\u0435 \u043F\u0438\u0446\u0446\u044B."] + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "2-mamba-ui-mambauicom", + children: ["2. ", createVNode(_components.strong, { + children: "Mamba UI (mambaui.com)" + }), "."] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "\u0427\u0442\u043E \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0433\u043E" + }), ": \u042D\u043B\u0435\u0433\u0430\u043D\u0442\u043D\u044B\u0439 \u0438 \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0439 UI Kit \u0434\u043B\u044F Tailwind CSS. \u041F\u0440\u0435\u0434\u043B\u0430\u0433\u0430\u0435\u0442 \u0448\u0438\u0440\u043E\u043A\u0438\u0439 \u0441\u043F\u0435\u043A\u0442\u0440 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432."] + }), "\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "\u041F\u043E\u0447\u0435\u043C\u0443 \u0432\u0430\u043C \u043F\u043E\u043D\u0440\u0430\u0432\u0438\u0442\u0441\u044F" + }), ": \u0427\u0438\u0441\u0442\u044B\u0439, \u044D\u043B\u0435\u0433\u0430\u043D\u0442\u043D\u044B\u0439 \u0438 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0430\u043B\u044C\u043D\u044B\u0439. \u041E\u0442\u043B\u0438\u0447\u043D\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0434\u043B\u044F \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432, \u043D\u0430\u0446\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u043D\u0430 \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u0443\u044E \u044D\u0441\u0442\u0435\u0442\u0438\u043A\u0443."] + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "3-flowbite-flowbitecom", + children: ["3. ", createVNode(_components.strong, { + children: "Flowbite (flowbite.com)" + }), "."] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "\u0427\u0442\u043E \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0433\u043E" + }), ": \u041A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u044B Tailwind CSS \u0441\u043E \u0441\u0432\u0435\u0436\u0438\u043C \u0438 \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u043C \u0434\u0438\u0437\u0430\u0439\u043D\u043E\u043C. \u0418\u0434\u0435\u0430\u043B\u044C\u043D\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0442 \u0434\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432."] + }), "\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "\u041F\u043E\u0447\u0435\u043C\u0443 \u0432\u0430\u043C \u043F\u043E\u043D\u0440\u0430\u0432\u0438\u0442\u0441\u044F" + }), ": \u041C\u043E\u0434\u043D\u044B\u0439 \u0438 \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0439. \u0418\u0434\u0435\u0430\u043B\u044C\u043D\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0434\u043B\u044F \u0432\u0435\u0431-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439, \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0439 \u0432\u043D\u0435\u0448\u043D\u0438\u0439 \u0432\u0438\u0434 \u0438 \u043E\u0449\u0443\u0449\u0435\u043D\u0438\u0435."] + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "4-meraki-ui-merakiuicom", + children: ["4. ", createVNode(_components.strong, { + children: "Meraki UI (merakiui.com)" + }), "."] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "\u0427\u0442\u043E \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0433\u043E" + }), ": \u041A\u043E\u043C\u043F\u043B\u0435\u043A\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0441\u043E\u0437\u0434\u0430\u043D\u043D\u044B\u0439 \u0441 \u043E\u0441\u043E\u0431\u043E\u0439 \u0442\u0449\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C\u044E, \u043F\u0440\u0435\u0434\u043B\u0430\u0433\u0430\u044E\u0449\u0438\u0439 \u0440\u0430\u0437\u043D\u043E\u043E\u0431\u0440\u0430\u0437\u043D\u044B\u0435 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u044B \u0441 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435\u043C \u043A \u0434\u0435\u0442\u0430\u043B\u044F\u043C."] + }), "\n", createVNode(_components.li, { + children: "\u041F\u043E\u0447\u0435\u043C\u0443 \u043E\u043D \u0432\u0430\u043C \u043F\u043E\u043D\u0440\u0430\u0432\u0438\u0442\u0441\u044F**: \u042D\u043B\u0435\u0433\u0430\u043D\u0442\u043D\u044B\u0439 \u0438 \u0445\u043E\u0440\u043E\u0448\u043E \u043F\u0440\u043E\u0434\u0443\u043C\u0430\u043D\u043D\u044B\u0439 \u0434\u0438\u0437\u0430\u0439\u043D. \u041F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0434\u043B\u044F \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432, \u0433\u0434\u0435 \u044D\u0441\u0442\u0435\u0442\u0438\u043A\u0430 \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u0435\u0448\u0430\u044E\u0449\u0443\u044E \u0440\u043E\u043B\u044C." + }), "\n"] + }), "\n", createVNode(_components.h4, { + id: "5-tailblocks-tailblockscc", + children: ["5. ", createVNode(_components.strong, { + children: "Tailblocks (tailblocks.cc)" + }), "."] + }), "\n", createVNode(_components.ul, { + children: ["\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "\u0427\u0442\u043E \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0433\u043E" + }), ": \u041A\u043E\u043B\u043B\u0435\u043A\u0446\u0438\u044F \u0433\u043E\u0442\u043E\u0432\u044B\u0445 \u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044E CSS-\u0431\u043B\u043E\u043A\u043E\u0432 Tailwind \u0434\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0441\u0442\u0440\u0430\u043D\u0438\u0446."] + }), "\n", createVNode(_components.li, { + children: [createVNode(_components.strong, { + children: "\u041F\u043E\u0447\u0435\u043C\u0443 \u0432\u0430\u043C \u044D\u0442\u043E \u043F\u043E\u043D\u0440\u0430\u0432\u0438\u0442\u0441\u044F" + }), ": \u0418\u0434\u0435\u0430\u043B\u044C\u043D\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0434\u043B\u044F \u043D\u0430\u0447\u0430\u043B\u0430 \u0440\u0430\u0431\u043E\u0442\u044B \u043D\u0430\u0434 \u0434\u0438\u0437\u0430\u0439\u043D\u043E\u043C \u0446\u0435\u043B\u0435\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041B\u0435\u0433\u043A\u043E \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0438 \u0438\u043D\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0432 \u0432\u0430\u0448 \u043F\u0440\u043E\u0435\u043A\u0442."] + }), "\n"] + }), "\n", createVNode(_components.h2, { + id: "\u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044F-\u043D\u0430\u0431\u043E\u0440\u043E\u0432-\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E-\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430-\u043A\u0440\u0430\u0442\u043A\u043E\u0435-\u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E", + children: createVNode(_components.strong, { + children: "\u0418\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044F \u043D\u0430\u0431\u043E\u0440\u043E\u0432 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430: \u041A\u0440\u0430\u0442\u043A\u043E\u0435 \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E" + }) + }), "\n", createVNode(_components.ol, { + children: ["\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430" + }), ": \u0421\u043B\u0435\u0434\u0443\u0439\u0442\u0435 \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u0443 \u043F\u043E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0435 UI Kit. \u042D\u0442\u043E \u043C\u043E\u0436\u0435\u0442 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043F\u0430\u043A\u0435\u0442\u0430 \u0438\u043B\u0438 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0445 \u0444\u0430\u0439\u043B\u043E\u0432 \u0432 \u0432\u0430\u0448 \u043F\u0440\u043E\u0435\u043A\u0442."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F" + }), ": \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E UI Kit \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D \u043D\u0430 \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u043D\u0443\u044E \u0440\u0430\u0431\u043E\u0442\u0443 \u0441 Tailwind CSS. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0448\u0430\u0433\u0438 \u0432 \u043F\u0440\u0438\u043B\u0430\u0433\u0430\u0435\u043C\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u044F\u0445."] + }), "\n"] + }), "\n", createVNode(_components.li, { + children: ["\n", createVNode(_components.p, { + children: [createVNode(_components.strong, { + children: "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435" + }), ": \u041F\u043E\u0441\u043B\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438 \u0438 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043D\u0430\u0447\u043D\u0438\u0442\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u044B \u0432 \u0441\u0432\u043E\u0435\u0439 HTML-\u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0435. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044C \u043A \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u0439 \u043F\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0435."] + }), "\n"] + }), "\n"] + }), "\n", createVNode(_components.h2, { + id: "\u0432\u044B\u0432\u043E\u0434-\u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0435-\u043A\u0440\u0430\u0441\u0438\u0432\u044B\u0445-\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445-\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432-\u0441-\u043B\u0435\u0433\u043A\u043E\u0441\u0442\u044C\u044E", + children: createVNode(_components.strong, { + children: "\u0412\u044B\u0432\u043E\u0434: \u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u043A\u0440\u0430\u0441\u0438\u0432\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432 \u0441 \u043B\u0435\u0433\u043A\u043E\u0441\u0442\u044C\u044E" + }) + }), "\n", createVNode(_components.p, { + children: "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 UI Kits \u0432 \u043F\u0440\u043E\u0435\u043A\u0442\u0435 Tailwind CSS - \u044D\u0442\u043E \u043A\u0430\u043A \u0432\u0438\u0448\u0435\u043D\u043A\u0430 \u043D\u0430 \u0432\u0435\u0440\u0448\u0438\u043D\u0435 \u0438 \u0431\u0435\u0437 \u0442\u043E\u0433\u043E \u0432\u043E\u0441\u0445\u0438\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0442\u043E\u0440\u0442\u0430. \u041D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E \u043E\u0442 \u0442\u043E\u0433\u043E, \u044F\u0432\u043B\u044F\u0435\u0442\u0435\u0441\u044C \u043B\u0438 \u0432\u044B \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u043C-\u043E\u0434\u0438\u043D\u043E\u0447\u043A\u043E\u0439 \u0438\u043B\u0438 \u0447\u0430\u0441\u0442\u044C\u044E \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u044D\u0442\u0438 \u043D\u0430\u0431\u043E\u0440\u044B \u043F\u0440\u0438\u0432\u043D\u0435\u0441\u0443\u0442 \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0438 \u0441\u0442\u0438\u043B\u044C \u0432 \u0432\u0430\u0448 \u043F\u0443\u0442\u044C \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438." + }), "\n", createVNode(_components.p, { + children: "\u0418\u0441\u0441\u043B\u0435\u0434\u0443\u044F \u0440\u0430\u0437\u043D\u043E\u043E\u0431\u0440\u0430\u0437\u043D\u044B\u0439 \u043C\u0438\u0440 \u043D\u0430\u0431\u043E\u0440\u043E\u0432 Tailwind CSS UI Kits, \u043D\u0435 \u0437\u0430\u0431\u044B\u0432\u0430\u0439\u0442\u0435 \u044D\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C, \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u044C \u0442\u043E, \u0447\u0442\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0434\u043B\u044F \u0432\u0430\u0448\u0435\u0433\u043E \u043F\u0440\u043E\u0435\u043A\u0442\u0430, \u0438 \u043D\u0430\u0441\u043B\u0430\u0436\u0434\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u043E\u043C \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u0437\u0430\u0445\u0432\u0430\u0442\u044B\u0432\u0430\u044E\u0449\u0438\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432. \u0421\u0447\u0430\u0441\u0442\u043B\u0438\u0432\u043E\u0433\u043E \u043A\u043E\u0434\u0438\u043D\u0433\u0430!" + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/ru/ui-kit-for-tailwind.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/ui-kit-for-tailwind.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/ui-kit-for-tailwind.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_1oxtsqXO.mjs b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_1oxtsqXO.mjs new file mode 100644 index 0000000..bfd5c18 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_1oxtsqXO.mjs @@ -0,0 +1,175 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "what-happened-in-a-month-my-blog", + "author": "Oleksii", + "isDraft": false, + "title": "What happened in a month / my blog", + "description": "Updated my site with improved UI, added projects, and integrated astro-compress. Future plans: pagination, language translation, sitemap.xml, possible headless CMS. Grateful for Astro team's recognition. Stay tuned for more on GitHub! Bye-bye!", + "image": "../images/what-happened-in-a-month-my-vlog.png", + "tags": ["monthUpdate"], + "categories": ["Blog"], + "publishDate": "22/02/2024", + "language": "en" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "where-have-i-been", + "text": "Where have I been?" + }, { + "depth": 3, + "slug": "design", + "text": "Design:" + }, { + "depth": 3, + "slug": "development", + "text": "Development:" + }, { + "depth": 3, + "slug": "link-to-site-click-me", + "text": "Link to site: click me" + }, { + "depth": 2, + "slug": "well-and-i-didnt-forget-to-update-my-site", + "text": "Well, and I didn\u2019t forget to update my site" + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + a: "a", + blockquote: "blockquote", + em: "em", + h2: "h2", + h3: "h3", + li: "li", + ol: "ol", + p: "p", + strong: "strong", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.blockquote, { + children: ["\n", createVNode(_components.p, { + children: "Wow, hi, everybody. It\u2019s good to see you all here, I haven\u2019t been here in a while.)" + }), "\n"] + }), "\n", createVNode(_components.h2, { + id: "where-have-i-been", + children: "Where have I been?" + }), "\n", createVNode(_components.p, { + children: "I was working on updating an old site that I did a year ago, a customer asked me to\r\nto update the site, so that\u2019s what I\u2019ve been doing.)" + }), "\n", createVNode(_components.h3, { + id: "design", + children: "Design:" + }), "\n", createVNode("img", { + src: "https://i.ibb.co/2gDfRjr/figma-design.jpg", + alt: "figma-design" + }), "\n", createVNode(_components.h3, { + id: "development", + children: "Development:" + }), "\n", createVNode("img", { + class: "mb-5", + src: "https://i.ibb.co/ZH36vn1/timeline.png", + alt: "astro-ov", + width: "800px", + height: "600px" + }), "\n", createVNode(_components.h3, { + id: "link-to-site-click-me", + children: ["Link to site: ", createVNode("a", { + href: "https://h2ovoda.com.ua", + target: "_blank", + children: "click me" + })] + }), "\n", createVNode(_components.h2, { + id: "well-and-i-didnt-forget-to-update-my-site", + children: "Well, and I didn\u2019t forget to update my site" + }), "\n", createVNode(_components.p, { + children: createVNode(_components.strong, { + children: "Updated:" + }) + }), "\n", createVNode(_components.ol, { + children: ["\n", createVNode(_components.li, { + children: "Updated user interface" + }), "\n", createVNode(_components.li, { + children: "Updated style file" + }), "\n", createVNode(_components.li, { + children: ["Fixed a bug where ", createVNode("code", { + children: "@tailwindcss/typography " + }), " was not being applied to the blog"] + }), "\n", createVNode(_components.li, { + children: "Added automatic sorting of posts by date, from new to old" + }), "\n", createVNode(_components.li, { + children: "Removed unnecessary code from input.css" + }), "\n", createVNode(_components.li, { + children: ["Added astro-compress package to compress files during project build, default settings: ", createVNode("code", { + children: " CSS: true, HTML: false, Image: true, JavaScript: true, SVG: false " + })] + }), "\n"] + }), "\n", createVNode(_components.p, { + children: createVNode(_components.strong, { + children: "What I plan to do in future updates:" + }) + }), "\n", createVNode(_components.ol, { + children: ["\n", createVNode(_components.li, { + children: "Add pagination to the blog page" + }), "\n", createVNode(_components.li, { + children: "Integrate i18n, translate the site into another language" + }), "\n", createVNode(_components.li, { + children: "Add sitemap.xml generation" + }), "\n", createVNode(_components.li, { + children: "Maybe add some hedless cms" + }), "\n"] + }), "\n", createVNode(_components.p, { + children: ["Separately wanted to say a big thank you to the Astro team for adding my template here: ", createVNode(_components.a, { + href: "https://astro.build/themes/details/ov-template/", + children: createVNode(_components.em, { + children: createVNode(_components.strong, { + children: "click me" + }) + }) + }), "."] + }), "\n", createVNode("img", { + class: "mb-5", + src: "https://i.ibb.co/51k3DSW/astro-ov.png", + alt: "astro-ov", + width: "800px", + height: "600px" + }), "\n", createVNode(_components.p, { + children: ["Also thanks to everyone who liked the template in my ", createVNode(_components.a, { + href: "https://github.com/vratskyi/vratskyi.github.io", + children: createVNode(_components.em, { + children: createVNode(_components.strong, { + children: "GitHub" + }) + }) + }), ", stay tuned, it\u2019s only going to get better, bye bye)."] + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/en/what-happened-in-a-month-my-blog.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/what-happened-in-a-month-my-blog.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/what-happened-in-a-month-my-blog.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_BbqGH-bj.mjs b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_BbqGH-bj.mjs new file mode 100644 index 0000000..e83dfcb --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_BbqGH-bj.mjs @@ -0,0 +1,25 @@ +const id = "ru/what-happened-in-a-month-my-blog.mdx"; + const collection = "posts"; + const slug = "what-happened-in-a-month-myblog"; + const body = " \r\n> Всем привет. Рад видеть вас всех здесь, давно здесь не был.)\r\n\r\n \r\n\r\n## Где я пропадал?\r\nЯ работал над обновлением старого сайта, который я сделал год назад, клиент попросил меня \r\nобновить сайт, так что я этим и занимался).\r\n \r\n\r\n### Дизайн:\r\n \r\n\r\n\"figma-design\"\r\n \r\n\r\n### Разработка:\r\n \r\n\r\n\"astro-ov\"\r\n\r\n\r\n### Ссылка на сайт: нажми на меня\r\n \r\n\r\n## Ну, и я не забыл обновить свой сайт.\r\n\r\n\r\n\r\n**Обновленный:**\r\n \r\n\r\n 1. Обновленный UI\r\n\t2. Обновленный файл стилей\r\n\t3. Исправлена ошибка, при которой @tailwindcss/typography не был применен к блогу\r\n\t4. Добавлена автоматическая сортировка сообщений по дате, от новых к старым\r\n\t5. Удален ненужный код из файла input.css\r\n 6. Добавлен пакет astro-compress для сжатия файлов во время сборки проекта, настройки по умолчанию: CSS: true, HTML: false, Image: true, JavaScript: true, SVG: false \r\n\r\n\r\n\r\n**Что я планирую сделать в будущих обновлениях:**\r\n \r\n\r\n 1. Добавить пагинацию на страницу блога\r\n 2. Интеграция i18n, перевод сайта на другой язык\r\n 3. Добавить генерацию sitemap.xml\r\n 4. Может быть, добавить hedless cms\r\n\r\n\r\nОтдельно хочу сказать большое спасибо команде Astro за добавление моего шаблона сюда.: [***нажми на меня***](https://astro.build/themes/details/ov-template/).\r\n \r\n\"astro-ov\"\r\n\r\n\r\nТакже спасибо всем, кто поставил лайк в моем [***GitHub***](https://github.com/vratskyi/vratskyi.github.io), Следите за новостями, дальше будет только лучше.)."; + const data = {isDraft:false,title:"Что произошло за месяц / Мой блог",description:"Обновил свой сайт, улучшил пользовательский интерфейс, добавил проекты и интегрировал astro-compress. Планы на будущее: пагинация, перевод языков, sitemap.xml, возможная безголовая CMS. Благодарен команде Astro за признание. Следите за новостями на GitHub! Пока-пока!",image: + new Proxy({"src":"/_astro/what-happened-in-a-month-my-vlog.Dd8DAHRL.png","width":1024,"height":1024,"format":"png","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/what-happened-in-a-month-my-vlog.png"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/what-happened-in-a-month-my-vlog.png"; + } + + return target[name]; + } + }) + ,author:"Алексей",tags:["месячноеОбновление"],categories:["Блог"],publishDate:"22/02/2024",language:"ru"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/what-happened-in-a-month-my-blog.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_CIHhEC1D.mjs b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_CIHhEC1D.mjs new file mode 100644 index 0000000..27b5a88 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_CIHhEC1D.mjs @@ -0,0 +1,25 @@ +const id = "en/what-happened-in-a-month-my-blog.mdx"; + const collection = "posts"; + const slug = "what-happened-in-a-month-my-blog"; + const body = " \r\n> Wow, hi, everybody. It's good to see you all here, I haven't been here in a while.)\r\n\r\n \r\n\r\n## Where have I been?\r\nI was working on updating an old site that I did a year ago, a customer asked me to \r\nto update the site, so that's what I've been doing.)\r\n\r\n\r\n### Design:\r\n \r\n\r\n\"figma-design\"\r\n \r\n\r\n### Development:\r\n \r\n\r\n\"astro-ov\"\r\n\r\n\r\n### Link to site: click me\r\n\r\n\r\n## Well, and I didn't forget to update my site\r\n\r\n\r\n\r\n**Updated:**\r\n \r\n\r\n 1. Updated user interface\r\n\t2. Updated style file\r\n\t3. Fixed a bug where @tailwindcss/typography was not being applied to the blog\r\n\t4. Added automatic sorting of posts by date, from new to old\r\n\t5. Removed unnecessary code from input.css\r\n 6. Added astro-compress package to compress files during project build, default settings: CSS: true, HTML: false, Image: true, JavaScript: true, SVG: false \r\n\r\n\r\n\r\n**What I plan to do in future updates:**\r\n \r\n\r\n 1. Add pagination to the blog page\r\n 2. Integrate i18n, translate the site into another language\r\n 3. Add sitemap.xml generation\r\n 4. Maybe add some hedless cms\r\n\r\n\r\nSeparately wanted to say a big thank you to the Astro team for adding my template here: [***click me***](https://astro.build/themes/details/ov-template/).\r\n \r\n\"astro-ov\"\r\n\r\n\r\nAlso thanks to everyone who liked the template in my [***GitHub***](https://github.com/vratskyi/vratskyi.github.io), stay tuned, it's only going to get better, bye bye)."; + const data = {isDraft:false,title:"What happened in a month / my blog",description:"Updated my site with improved UI, added projects, and integrated astro-compress. Future plans: pagination, language translation, sitemap.xml, possible headless CMS. Grateful for Astro team's recognition. Stay tuned for more on GitHub! Bye-bye!",image: + new Proxy({"src":"/_astro/what-happened-in-a-month-my-vlog.Dd8DAHRL.png","width":1024,"height":1024,"format":"png","fsPath":"C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/what-happened-in-a-month-my-vlog.png"}, { + get(target, name, receiver) { + if (name === 'clone') { + return structuredClone(target); + } + if (name === 'fsPath') { + return "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/images/what-happened-in-a-month-my-vlog.png"; + } + + return target[name]; + } + }) + ,author:"Oleksii",tags:["monthUpdate"],categories:["Blog"],publishDate:"22/02/2024",language:"en"}; + const _internal = { + type: 'content', + filePath: "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/what-happened-in-a-month-my-blog.mdx", + rawData: undefined, + }; + +export { _internal, body, collection, data, id, slug }; diff --git a/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_CLO_kMs-.mjs b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_CLO_kMs-.mjs new file mode 100644 index 0000000..35b7f49 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_CLO_kMs-.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./what-happened-in-a-month-my-blog_1oxtsqXO.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_czQ9-DLA.mjs b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_czQ9-DLA.mjs new file mode 100644 index 0000000..4397671 --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_czQ9-DLA.mjs @@ -0,0 +1,9 @@ +async function getMod() { + return import('./what-happened-in-a-month-my-blog_rihfM-cT.mjs'); + } + const collectedLinks = []; + const collectedStyles = []; + const collectedScripts = []; + const defaultMod = { __astroPropagation: true, getMod, collectedLinks, collectedStyles, collectedScripts }; + +export { defaultMod as default }; diff --git a/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_rihfM-cT.mjs b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_rihfM-cT.mjs new file mode 100644 index 0000000..bb5e3fc --- /dev/null +++ b/.netlify/functions-internal/ssr/chunks/what-happened-in-a-month-my-blog_rihfM-cT.mjs @@ -0,0 +1,175 @@ +import { _ as __astro_tag_component__, w as Fragment, z as createVNode } from './astro_U7cLjtnz.mjs'; +import { a as $$Image } from './pages/generic_CKoPNF1-.mjs'; +import 'clsx'; + +const frontmatter = { + "slug": "what-happened-in-a-month-myblog", + "author": "\u0410\u043B\u0435\u043A\u0441\u0435\u0439", + "isDraft": false, + "title": "\u0427\u0442\u043E \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u043E \u0437\u0430 \u043C\u0435\u0441\u044F\u0446 / \u041C\u043E\u0439 \u0431\u043B\u043E\u0433", + "description": "\u041E\u0431\u043D\u043E\u0432\u0438\u043B \u0441\u0432\u043E\u0439 \u0441\u0430\u0439\u0442, \u0443\u043B\u0443\u0447\u0448\u0438\u043B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0434\u043E\u0431\u0430\u0432\u0438\u043B \u043F\u0440\u043E\u0435\u043A\u0442\u044B \u0438 \u0438\u043D\u0442\u0435\u0433\u0440\u0438\u0440\u043E\u0432\u0430\u043B astro-compress. \u041F\u043B\u0430\u043D\u044B \u043D\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435: \u043F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F, \u043F\u0435\u0440\u0435\u0432\u043E\u0434 \u044F\u0437\u044B\u043A\u043E\u0432, sitemap.xml, \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u0430\u044F \u0431\u0435\u0437\u0433\u043E\u043B\u043E\u0432\u0430\u044F CMS. \u0411\u043B\u0430\u0433\u043E\u0434\u0430\u0440\u0435\u043D \u043A\u043E\u043C\u0430\u043D\u0434\u0435 Astro \u0437\u0430 \u043F\u0440\u0438\u0437\u043D\u0430\u043D\u0438\u0435. \u0421\u043B\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043D\u043E\u0432\u043E\u0441\u0442\u044F\u043C\u0438 \u043D\u0430 GitHub! \u041F\u043E\u043A\u0430-\u043F\u043E\u043A\u0430!", + "image": "../images/what-happened-in-a-month-my-vlog.png", + "tags": ["\u043C\u0435\u0441\u044F\u0447\u043D\u043E\u0435\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435"], + "categories": ["\u0411\u043B\u043E\u0433"], + "publishDate": "22/02/2024", + "language": "ru" +}; +function getHeadings() { + return [{ + "depth": 2, + "slug": "\u0433\u0434\u0435-\u044F-\u043F\u0440\u043E\u043F\u0430\u0434\u0430\u043B", + "text": "\u0413\u0434\u0435 \u044F \u043F\u0440\u043E\u043F\u0430\u0434\u0430\u043B?" + }, { + "depth": 3, + "slug": "\u0434\u0438\u0437\u0430\u0439\u043D", + "text": "\u0414\u0438\u0437\u0430\u0439\u043D:" + }, { + "depth": 3, + "slug": "\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0430", + "text": "\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0430:" + }, { + "depth": 3, + "slug": "\u0441\u0441\u044B\u043B\u043A\u0430-\u043D\u0430-\u0441\u0430\u0439\u0442-\u043D\u0430\u0436\u043C\u0438-\u043D\u0430-\u043C\u0435\u043D\u044F", + "text": "\u0421\u0441\u044B\u043B\u043A\u0430 \u043D\u0430 \u0441\u0430\u0439\u0442: \u043D\u0430\u0436\u043C\u0438 \u043D\u0430 \u043C\u0435\u043D\u044F" + }, { + "depth": 2, + "slug": "\u043D\u0443-\u0438-\u044F-\u043D\u0435-\u0437\u0430\u0431\u044B\u043B-\u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C-\u0441\u0432\u043E\u0439-\u0441\u0430\u0439\u0442", + "text": "\u041D\u0443, \u0438 \u044F \u043D\u0435 \u0437\u0430\u0431\u044B\u043B \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u0432\u043E\u0439 \u0441\u0430\u0439\u0442." + }]; +} +const __usesAstroImage = true; +function _createMdxContent(props) { + const _components = { + a: "a", + blockquote: "blockquote", + em: "em", + h2: "h2", + h3: "h3", + li: "li", + ol: "ol", + p: "p", + strong: "strong", + ...props.components + }; + return createVNode(Fragment, { + children: [createVNode(_components.blockquote, { + children: ["\n", createVNode(_components.p, { + children: "\u0412\u0441\u0435\u043C \u043F\u0440\u0438\u0432\u0435\u0442. \u0420\u0430\u0434 \u0432\u0438\u0434\u0435\u0442\u044C \u0432\u0430\u0441 \u0432\u0441\u0435\u0445 \u0437\u0434\u0435\u0441\u044C, \u0434\u0430\u0432\u043D\u043E \u0437\u0434\u0435\u0441\u044C \u043D\u0435 \u0431\u044B\u043B.)" + }), "\n"] + }), "\n", createVNode(_components.h2, { + id: "\u0433\u0434\u0435-\u044F-\u043F\u0440\u043E\u043F\u0430\u0434\u0430\u043B", + children: "\u0413\u0434\u0435 \u044F \u043F\u0440\u043E\u043F\u0430\u0434\u0430\u043B?" + }), "\n", createVNode(_components.p, { + children: "\u042F \u0440\u0430\u0431\u043E\u0442\u0430\u043B \u043D\u0430\u0434 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435\u043C \u0441\u0442\u0430\u0440\u043E\u0433\u043E \u0441\u0430\u0439\u0442\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u044F \u0441\u0434\u0435\u043B\u0430\u043B \u0433\u043E\u0434 \u043D\u0430\u0437\u0430\u0434, \u043A\u043B\u0438\u0435\u043D\u0442 \u043F\u043E\u043F\u0440\u043E\u0441\u0438\u043B \u043C\u0435\u043D\u044F\r\n\u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u0430\u0439\u0442, \u0442\u0430\u043A \u0447\u0442\u043E \u044F \u044D\u0442\u0438\u043C \u0438 \u0437\u0430\u043D\u0438\u043C\u0430\u043B\u0441\u044F)." + }), "\n", createVNode(_components.h3, { + id: "\u0434\u0438\u0437\u0430\u0439\u043D", + children: "\u0414\u0438\u0437\u0430\u0439\u043D:" + }), "\n", createVNode("img", { + src: "https://i.ibb.co/2gDfRjr/figma-design.jpg", + alt: "figma-design" + }), "\n", createVNode(_components.h3, { + id: "\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0430", + children: "\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0430:" + }), "\n", createVNode("img", { + class: "mb-5", + src: "https://i.ibb.co/ZH36vn1/timeline.png", + alt: "astro-ov", + width: "800px", + height: "600px" + }), "\n", createVNode(_components.h3, { + id: "\u0441\u0441\u044B\u043B\u043A\u0430-\u043D\u0430-\u0441\u0430\u0439\u0442-\u043D\u0430\u0436\u043C\u0438-\u043D\u0430-\u043C\u0435\u043D\u044F", + children: ["\u0421\u0441\u044B\u043B\u043A\u0430 \u043D\u0430 \u0441\u0430\u0439\u0442: ", createVNode("a", { + href: "https://h2ovoda.com.ua", + target: "_blank", + children: "\u043D\u0430\u0436\u043C\u0438 \u043D\u0430 \u043C\u0435\u043D\u044F" + })] + }), "\n", createVNode(_components.h2, { + id: "\u043D\u0443-\u0438-\u044F-\u043D\u0435-\u0437\u0430\u0431\u044B\u043B-\u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C-\u0441\u0432\u043E\u0439-\u0441\u0430\u0439\u0442", + children: "\u041D\u0443, \u0438 \u044F \u043D\u0435 \u0437\u0430\u0431\u044B\u043B \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u0432\u043E\u0439 \u0441\u0430\u0439\u0442." + }), "\n", createVNode(_components.p, { + children: createVNode(_components.strong, { + children: "\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0439:" + }) + }), "\n", createVNode(_components.ol, { + children: ["\n", createVNode(_components.li, { + children: "\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0439 UI" + }), "\n", createVNode(_components.li, { + children: "\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0430\u0439\u043B \u0441\u0442\u0438\u043B\u0435\u0439" + }), "\n", createVNode(_components.li, { + children: ["\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u043E\u0448\u0438\u0431\u043A\u0430, \u043F\u0440\u0438 \u043A\u043E\u0442\u043E\u0440\u043E\u0439 ", createVNode("code", { + children: "@tailwindcss/typography " + }), " \u043D\u0435 \u0431\u044B\u043B \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D \u043A \u0431\u043B\u043E\u0433\u0443"] + }), "\n", createVNode(_components.li, { + children: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u043F\u043E \u0434\u0430\u0442\u0435, \u043E\u0442 \u043D\u043E\u0432\u044B\u0445 \u043A \u0441\u0442\u0430\u0440\u044B\u043C" + }), "\n", createVNode(_components.li, { + children: "\u0423\u0434\u0430\u043B\u0435\u043D \u043D\u0435\u043D\u0443\u0436\u043D\u044B\u0439 \u043A\u043E\u0434 \u0438\u0437 \u0444\u0430\u0439\u043B\u0430 input.css" + }), "\n", createVNode(_components.li, { + children: ["\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u043F\u0430\u043A\u0435\u0442 astro-compress \u0434\u043B\u044F \u0441\u0436\u0430\u0442\u0438\u044F \u0444\u0430\u0439\u043B\u043E\u0432 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0441\u0431\u043E\u0440\u043A\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430, \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E: ", createVNode("code", { + children: " CSS: true, HTML: false, Image: true, JavaScript: true, SVG: false " + })] + }), "\n"] + }), "\n", createVNode(_components.p, { + children: createVNode(_components.strong, { + children: "\u0427\u0442\u043E \u044F \u043F\u043B\u0430\u043D\u0438\u0440\u0443\u044E \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u0432 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F\u0445:" + }) + }), "\n", createVNode(_components.ol, { + children: ["\n", createVNode(_components.li, { + children: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044E \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0431\u043B\u043E\u0433\u0430" + }), "\n", createVNode(_components.li, { + children: "\u0418\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044F i18n, \u043F\u0435\u0440\u0435\u0432\u043E\u0434 \u0441\u0430\u0439\u0442\u0430 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439 \u044F\u0437\u044B\u043A" + }), "\n", createVNode(_components.li, { + children: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044E sitemap.xml" + }), "\n", createVNode(_components.li, { + children: "\u041C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C, \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C hedless cms" + }), "\n"] + }), "\n", createVNode(_components.p, { + children: ["\u041E\u0442\u0434\u0435\u043B\u044C\u043D\u043E \u0445\u043E\u0447\u0443 \u0441\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u0441\u043F\u0430\u0441\u0438\u0431\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0435 Astro \u0437\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043C\u043E\u0435\u0433\u043E \u0448\u0430\u0431\u043B\u043E\u043D\u0430 \u0441\u044E\u0434\u0430.: ", createVNode(_components.a, { + href: "https://astro.build/themes/details/ov-template/", + children: createVNode(_components.em, { + children: createVNode(_components.strong, { + children: "\u043D\u0430\u0436\u043C\u0438 \u043D\u0430 \u043C\u0435\u043D\u044F" + }) + }) + }), "."] + }), "\n", createVNode("img", { + class: "mb-5", + src: "https://i.ibb.co/51k3DSW/astro-ov.png", + alt: "astro-ov", + width: "800px", + height: "600px" + }), "\n", createVNode(_components.p, { + children: ["\u0422\u0430\u043A\u0436\u0435 \u0441\u043F\u0430\u0441\u0438\u0431\u043E \u0432\u0441\u0435\u043C, \u043A\u0442\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u043B \u043B\u0430\u0439\u043A \u0432 \u043C\u043E\u0435\u043C ", createVNode(_components.a, { + href: "https://github.com/vratskyi/vratskyi.github.io", + children: createVNode(_components.em, { + children: createVNode(_components.strong, { + children: "GitHub" + }) + }) + }), ", \u0421\u043B\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043D\u043E\u0432\u043E\u0441\u0442\u044F\u043C\u0438, \u0434\u0430\u043B\u044C\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043B\u0443\u0447\u0448\u0435.)."] + })] + }); +} +function MDXContent(props = {}) { + const { + wrapper: MDXLayout + } = props.components || {}; + return MDXLayout ? createVNode(MDXLayout, { + ...props, + children: createVNode(_createMdxContent, { + ...props + }) + }) : _createMdxContent(props); +} +__astro_tag_component__(getHeadings, "astro:jsx"); +__astro_tag_component__(MDXContent, "astro:jsx"); +const url = "src/content/posts/ru/what-happened-in-a-month-my-blog.mdx"; +const file = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/what-happened-in-a-month-my-blog.mdx"; +const Content = (props = {}) => MDXContent({ + ...props, + components: { Fragment, ...props.components, "astro-image": props.components?.img ?? $$Image }, + }); +Content[Symbol.for('mdx-component')] = true; +Content[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout); +Content.moduleId = "C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/what-happened-in-a-month-my-blog.mdx"; + +export { Content, __usesAstroImage, Content as default, file, frontmatter, getHeadings, url }; diff --git a/.netlify/functions-internal/ssr/entry.mjs b/.netlify/functions-internal/ssr/entry.mjs new file mode 100644 index 0000000..6babb01 --- /dev/null +++ b/.netlify/functions-internal/ssr/entry.mjs @@ -0,0 +1,54 @@ +import { renderers } from './renderers.mjs'; +import { manifest } from './manifest_CRGkTayg.mjs'; +import * as serverEntrypointModule from '@astrojs/netlify/ssr-function.js'; + +const _page0 = () => import('./chunks/generic_D_JKLwzW.mjs'); +const _page1 = () => import('./chunks/index_DToyGfqd.mjs'); +const _page2 = () => import('./chunks/404_pJCF1EDP.mjs'); +const _page3 = () => import('./chunks/about_CuR22hxo.mjs'); +const _page4 = () => import('./chunks/index_dw6RaE6b.mjs'); +const _page5 = () => import('./chunks/_.._BsGwjlhD.mjs'); +const _page6 = () => import('./chunks/portfolio_7D8uYWzQ.mjs'); +const _page7 = () => import('./chunks/index_BqNdUiWy.mjs'); +const _page8 = () => import('./chunks/404_Dqd0jA1i.mjs'); +const _page9 = () => import('./chunks/about_BaPuutao.mjs'); +const _page10 = () => import('./chunks/index_CZPCzNFA.mjs'); +const _page11 = () => import('./chunks/_.._Cns5EZez.mjs'); +const _page12 = () => import('./chunks/portfolio_xErXodJ1.mjs'); +const _page13 = () => import('./chunks/index_BIoOX2kt.mjs'); +const _page14 = () => import('./chunks/index_NByEDO2x.mjs'); + +const pageMap = new Map([ + ["node_modules/astro/dist/assets/endpoint/generic.js", _page0], + ["src/pages/blog/index.astro", _page1], + ["src/pages/en/404.astro", _page2], + ["src/pages/en/about.astro", _page3], + ["src/pages/en/blog/index.astro", _page4], + ["src/pages/en/blog/[...slug].astro", _page5], + ["src/pages/en/portfolio.astro", _page6], + ["src/pages/en/index.astro", _page7], + ["src/pages/ru/404.astro", _page8], + ["src/pages/ru/about.astro", _page9], + ["src/pages/ru/blog/index.astro", _page10], + ["src/pages/ru/blog/[...slug].astro", _page11], + ["src/pages/ru/portfolio.astro", _page12], + ["src/pages/ru/index.astro", _page13], + ["src/pages/index.astro", _page14] +]); +const middleware = (_, next) => next(); +const _manifest = Object.assign(manifest, { + pageMap, + renderers, + middleware +}); +const _args = { + "middlewareSecret": "a4be9d25-7a04-45db-950c-936a03816b15" +}; +const _exports = serverEntrypointModule.createExports(_manifest, _args); +const __astrojsSsrVirtualEntry = _exports.default; +const _start = 'start'; +if (_start in serverEntrypointModule) { + serverEntrypointModule[_start](_manifest, _args); +} + +export { __astrojsSsrVirtualEntry as default, pageMap }; diff --git a/.netlify/functions-internal/ssr/manifest_CRGkTayg.mjs b/.netlify/functions-internal/ssr/manifest_CRGkTayg.mjs new file mode 100644 index 0000000..eb66fd1 --- /dev/null +++ b/.netlify/functions-internal/ssr/manifest_CRGkTayg.mjs @@ -0,0 +1,83 @@ +import 'cookie'; +import 'kleur/colors'; +import '@astrojs/internal-helpers/path'; +import './chunks/astro_U7cLjtnz.mjs'; +import 'clsx'; +import { compile } from 'path-to-regexp'; + +if (typeof process !== "undefined") { + let proc = process; + if ("argv" in proc && Array.isArray(proc.argv)) { + if (proc.argv.includes("--verbose")) ; else if (proc.argv.includes("--silent")) ; else ; + } +} + +function getRouteGenerator(segments, addTrailingSlash) { + const template = segments.map((segment) => { + return "/" + segment.map((part) => { + if (part.spread) { + return `:${part.content.slice(3)}(.*)?`; + } else if (part.dynamic) { + return `:${part.content}`; + } else { + return part.content.normalize().replace(/\?/g, "%3F").replace(/#/g, "%23").replace(/%5B/g, "[").replace(/%5D/g, "]").replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + }).join(""); + }).join(""); + let trailing = ""; + if (addTrailingSlash === "always" && segments.length) { + trailing = "/"; + } + const toPath = compile(template + trailing); + return toPath; +} + +function deserializeRouteData(rawRouteData) { + return { + route: rawRouteData.route, + type: rawRouteData.type, + pattern: new RegExp(rawRouteData.pattern), + params: rawRouteData.params, + component: rawRouteData.component, + generate: getRouteGenerator(rawRouteData.segments, rawRouteData._meta.trailingSlash), + pathname: rawRouteData.pathname || void 0, + segments: rawRouteData.segments, + prerender: rawRouteData.prerender, + redirect: rawRouteData.redirect, + redirectRoute: rawRouteData.redirectRoute ? deserializeRouteData(rawRouteData.redirectRoute) : void 0, + fallbackRoutes: rawRouteData.fallbackRoutes.map((fallback) => { + return deserializeRouteData(fallback); + }), + isIndex: rawRouteData.isIndex + }; +} + +function deserializeManifest(serializedManifest) { + const routes = []; + for (const serializedRoute of serializedManifest.routes) { + routes.push({ + ...serializedRoute, + routeData: deserializeRouteData(serializedRoute.routeData) + }); + const route = serializedRoute; + route.routeData = deserializeRouteData(serializedRoute.routeData); + } + const assets = new Set(serializedManifest.assets); + const componentMetadata = new Map(serializedManifest.componentMetadata); + const clientDirectives = new Map(serializedManifest.clientDirectives); + return { + // in case user middleware exists, this no-op middleware will be reassigned (see plugin-ssr.ts) + middleware(_, next) { + return next(); + }, + ...serializedManifest, + assets, + componentMetadata, + clientDirectives, + routes + }; +} + +const manifest = deserializeManifest({"adapterName":"@astrojs/netlify","routes":[{"file":"blog/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/blog","isIndex":true,"type":"page","pattern":"^\\/blog\\/?$","segments":[[{"content":"blog","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/blog/index.astro","pathname":"/blog","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"en/404/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/en/404","isIndex":false,"type":"page","pattern":"^\\/en\\/404\\/?$","segments":[[{"content":"en","dynamic":false,"spread":false}],[{"content":"404","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/404.astro","pathname":"/en/404","prerender":true,"fallbackRoutes":[{"route":"/ru/404","isIndex":false,"type":"fallback","pattern":"^\\/ru\\/404\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}],[{"content":"404","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/404.astro","pathname":"/ru/404","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}],"_meta":{"trailingSlash":"ignore"}}},{"file":"en/about/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/en/about","isIndex":false,"type":"page","pattern":"^\\/en\\/about\\/?$","segments":[[{"content":"en","dynamic":false,"spread":false}],[{"content":"about","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/about.astro","pathname":"/en/about","prerender":true,"fallbackRoutes":[{"route":"/ru/about","isIndex":false,"type":"fallback","pattern":"^\\/ru\\/about\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}],[{"content":"about","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/about.astro","pathname":"/ru/about","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}],"_meta":{"trailingSlash":"ignore"}}},{"file":"en/blog/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/en/blog","isIndex":true,"type":"page","pattern":"^\\/en\\/blog\\/?$","segments":[[{"content":"en","dynamic":false,"spread":false}],[{"content":"blog","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/blog/index.astro","pathname":"/en/blog","prerender":true,"fallbackRoutes":[{"route":"/ru/blog","isIndex":true,"type":"fallback","pattern":"^\\/ru\\/blog\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}],[{"content":"blog","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/blog/index.astro","pathname":"/ru/blog","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}],"_meta":{"trailingSlash":"ignore"}}},{"file":"en/portfolio/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/en/portfolio","isIndex":false,"type":"page","pattern":"^\\/en\\/portfolio\\/?$","segments":[[{"content":"en","dynamic":false,"spread":false}],[{"content":"portfolio","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/portfolio.astro","pathname":"/en/portfolio","prerender":true,"fallbackRoutes":[{"route":"/ru/portfolio","isIndex":false,"type":"fallback","pattern":"^\\/ru\\/portfolio\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}],[{"content":"portfolio","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/portfolio.astro","pathname":"/ru/portfolio","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}],"_meta":{"trailingSlash":"ignore"}}},{"file":"en/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/en","isIndex":true,"type":"page","pattern":"^\\/en\\/?$","segments":[[{"content":"en","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/index.astro","pathname":"/en","prerender":true,"fallbackRoutes":[{"route":"/ru","isIndex":true,"type":"fallback","pattern":"^\\/ru\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/en/index.astro","pathname":"/ru","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}],"_meta":{"trailingSlash":"ignore"}}},{"file":"ru/404/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/ru/404","isIndex":false,"type":"page","pattern":"^\\/ru\\/404\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}],[{"content":"404","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/ru/404.astro","pathname":"/ru/404","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"ru/about/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/ru/about","isIndex":false,"type":"page","pattern":"^\\/ru\\/about\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}],[{"content":"about","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/ru/about.astro","pathname":"/ru/about","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"ru/blog/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/ru/blog","isIndex":true,"type":"page","pattern":"^\\/ru\\/blog\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}],[{"content":"blog","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/ru/blog/index.astro","pathname":"/ru/blog","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"ru/portfolio/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/ru/portfolio","isIndex":false,"type":"page","pattern":"^\\/ru\\/portfolio\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}],[{"content":"portfolio","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/ru/portfolio.astro","pathname":"/ru/portfolio","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"ru/index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/ru","isIndex":true,"type":"page","pattern":"^\\/ru\\/?$","segments":[[{"content":"ru","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/ru/index.astro","pathname":"/ru","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/","isIndex":true,"type":"page","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":true,"fallbackRoutes":[{"route":"/","isIndex":true,"type":"fallback","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}],"_meta":{"trailingSlash":"ignore"}}},{"file":"index.html","links":[],"scripts":[],"styles":[],"routeData":{"route":"/","isIndex":true,"type":"fallback","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":true,"fallbackRoutes":[{"route":"/","isIndex":true,"type":"fallback","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":true,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/page.CueWeZv5.js"}],"styles":[],"routeData":{"type":"endpoint","isIndex":false,"route":"/_image","pattern":"^\\/_image$","segments":[[{"content":"_image","dynamic":false,"spread":false}]],"params":[],"component":"node_modules/astro/dist/assets/endpoint/generic.js","pathname":"/_image","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}}],"base":"/","trailingSlash":"ignore","compressHTML":true,"componentMetadata":[["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/components/Post.astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/components/PostList.astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/blog/index.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/blog/index@_@astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astrojs-ssr-virtual-entry",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/en/blog/index.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/en/blog/index@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/ru/blog/index.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/ru/blog/index@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/components/Header.astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/layouts/Layout.astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/en/404.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/en/404@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/en/about.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/en/about@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/en/index.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/en/index@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/en/portfolio.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/en/portfolio@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/index.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/index@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/ru/404.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/ru/404@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/ru/about.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/ru/about@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/ru/index.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/ru/index@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/ru/portfolio.astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/ru/portfolio@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/en/blog/[...slug].astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/en/blog/[...slug]@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/pages/ru/blog/[...slug].astro",{"propagation":"in-tree","containsHead":true}],["\u0000@astro-page:src/pages/ru/blog/[...slug]@_@astro",{"propagation":"in-tree","containsHead":false}],["C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/components/Footer.astro",{"propagation":"in-tree","containsHead":false}],["\u0000astro:content",{"propagation":"in-tree","containsHead":false}]],"renderers":[],"clientDirectives":[["idle","(()=>{var i=t=>{let e=async()=>{await(await t())()};\"requestIdleCallback\"in window?window.requestIdleCallback(e):setTimeout(e,200)};(self.Astro||(self.Astro={})).idle=i;window.dispatchEvent(new Event(\"astro:idle\"));})();"],["load","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event(\"astro:load\"));})();"],["media","(()=>{var s=(i,t)=>{let a=async()=>{await(await i())()};if(t.value){let e=matchMedia(t.value);e.matches?a():e.addEventListener(\"change\",a,{once:!0})}};(self.Astro||(self.Astro={})).media=s;window.dispatchEvent(new Event(\"astro:media\"));})();"],["only","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event(\"astro:only\"));})();"],["visible","(()=>{var l=(s,i,o)=>{let r=async()=>{await(await s())()},t=typeof i.value==\"object\"?i.value:void 0,c={rootMargin:t==null?void 0:t.rootMargin},n=new IntersectionObserver(e=>{for(let a of e)if(a.isIntersecting){n.disconnect(),r();break}},c);for(let e of o.children)n.observe(e)};(self.Astro||(self.Astro={})).visible=l;window.dispatchEvent(new Event(\"astro:visible\"));})();"]],"entryModules":{"\u0000noop-middleware":"_noop-middleware.mjs","\u0000@astrojs-ssr-virtual-entry":"entry.mjs","\u0000@astro-renderers":"renderers.mjs","\u0000@astrojs-manifest":"manifest_CRGkTayg.mjs","\u0000@astro-page:node_modules/astro/dist/assets/endpoint/generic@_@js":"chunks/generic_D_JKLwzW.mjs","\u0000@astro-page:src/pages/blog/index@_@astro":"chunks/index_DToyGfqd.mjs","\u0000@astro-page:src/pages/en/404@_@astro":"chunks/404_pJCF1EDP.mjs","\u0000@astro-page:src/pages/en/about@_@astro":"chunks/about_CuR22hxo.mjs","\u0000@astro-page:src/pages/en/blog/index@_@astro":"chunks/index_dw6RaE6b.mjs","\u0000@astro-page:src/pages/en/blog/[...slug]@_@astro":"chunks/_.._BsGwjlhD.mjs","\u0000@astro-page:src/pages/en/portfolio@_@astro":"chunks/portfolio_7D8uYWzQ.mjs","\u0000@astro-page:src/pages/en/index@_@astro":"chunks/index_BqNdUiWy.mjs","\u0000@astro-page:src/pages/ru/404@_@astro":"chunks/404_Dqd0jA1i.mjs","\u0000@astro-page:src/pages/ru/about@_@astro":"chunks/about_BaPuutao.mjs","\u0000@astro-page:src/pages/ru/blog/index@_@astro":"chunks/index_CZPCzNFA.mjs","\u0000@astro-page:src/pages/ru/blog/[...slug]@_@astro":"chunks/_.._Cns5EZez.mjs","\u0000@astro-page:src/pages/ru/portfolio@_@astro":"chunks/portfolio_xErXodJ1.mjs","\u0000@astro-page:src/pages/ru/index@_@astro":"chunks/index_BIoOX2kt.mjs","\u0000@astro-page:src/pages/index@_@astro":"chunks/index_NByEDO2x.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/about-experience-in-web-dev.mdx?astroContentCollectionEntry=true":"chunks/about-experience-in-web-dev_C6xuZLye.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/become-cool-frontend-dev.mdx?astroContentCollectionEntry=true":"chunks/become-cool-frontend-dev_5IlRX2qD.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/cool-plugins-for-vs-code.mdx?astroContentCollectionEntry=true":"chunks/cool-plugins-for-vs-code_DXKArvvn.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/ui-kit-for-tailwind.mdx?astroContentCollectionEntry=true":"chunks/ui-kit-for-tailwind_DL6qUlsy.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/what-happened-in-a-month-my-blog.mdx?astroContentCollectionEntry=true":"chunks/what-happened-in-a-month-my-blog_CIHhEC1D.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/about-experience-in-web-dev.mdx?astroContentCollectionEntry=true":"chunks/about-experience-in-web-dev_CKEJMMZQ.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/become-cool-frontend-dev.mdx?astroContentCollectionEntry=true":"chunks/become-cool-frontend-dev_CLj1VjFp.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/cool-plugins-for-vs-code.mdx?astroContentCollectionEntry=true":"chunks/cool-plugins-for-vs-code_DKiFBJW5.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/ui-kit-for-tailwind.mdx?astroContentCollectionEntry=true":"chunks/ui-kit-for-tailwind_Be3bTW72.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/what-happened-in-a-month-my-blog.mdx?astroContentCollectionEntry=true":"chunks/what-happened-in-a-month-my-blog_BbqGH-bj.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/about-experience-in-web-dev.mdx?astroPropagatedAssets":"chunks/about-experience-in-web-dev_BgD_3N37.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/become-cool-frontend-dev.mdx?astroPropagatedAssets":"chunks/become-cool-frontend-dev_XHdtL4Mj.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/cool-plugins-for-vs-code.mdx?astroPropagatedAssets":"chunks/cool-plugins-for-vs-code_BFYbPr9e.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/ui-kit-for-tailwind.mdx?astroPropagatedAssets":"chunks/ui-kit-for-tailwind_B0MLHccf.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/what-happened-in-a-month-my-blog.mdx?astroPropagatedAssets":"chunks/what-happened-in-a-month-my-blog_CLO_kMs-.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/about-experience-in-web-dev.mdx?astroPropagatedAssets":"chunks/about-experience-in-web-dev_CW0YI6Rb.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/become-cool-frontend-dev.mdx?astroPropagatedAssets":"chunks/become-cool-frontend-dev_CeoOBHg_.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/cool-plugins-for-vs-code.mdx?astroPropagatedAssets":"chunks/cool-plugins-for-vs-code_Hk47S3fA.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/ui-kit-for-tailwind.mdx?astroPropagatedAssets":"chunks/ui-kit-for-tailwind_BfTHigj9.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/what-happened-in-a-month-my-blog.mdx?astroPropagatedAssets":"chunks/what-happened-in-a-month-my-blog_czQ9-DLA.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/about-experience-in-web-dev.mdx":"chunks/about-experience-in-web-dev_CBnrDakG.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/become-cool-frontend-dev.mdx":"chunks/become-cool-frontend-dev_CoszH-iC.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/cool-plugins-for-vs-code.mdx":"chunks/cool-plugins-for-vs-code_CF6JBJkR.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/ui-kit-for-tailwind.mdx":"chunks/ui-kit-for-tailwind_Bfbcl2ec.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/en/what-happened-in-a-month-my-blog.mdx":"chunks/what-happened-in-a-month-my-blog_1oxtsqXO.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/about-experience-in-web-dev.mdx":"chunks/about-experience-in-web-dev_D4mxxtjJ.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/become-cool-frontend-dev.mdx":"chunks/become-cool-frontend-dev_DSYfhzBg.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/cool-plugins-for-vs-code.mdx":"chunks/cool-plugins-for-vs-code_BLwiMiVs.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/ui-kit-for-tailwind.mdx":"chunks/ui-kit-for-tailwind_DZV9kgqf.mjs","C:/Users/vratskyi/Documents/Projects/vratskyi.github.io/src/content/posts/ru/what-happened-in-a-month-my-blog.mdx":"chunks/what-happened-in-a-month-my-blog_rihfM-cT.mjs","/astro/hoisted.js?q=0":"_astro/hoisted.C3ywckME.js","astro:scripts/page.js":"_astro/page.CueWeZv5.js","/astro/hoisted.js?q=2":"_astro/hoisted.CGJA2pi7.js","/astro/hoisted.js?q=3":"_astro/hoisted.DW7GaUA3.js","/astro/hoisted.js?q=1":"_astro/hoisted.BE28wqqM.js","/astro/hoisted.js?q=4":"_astro/hoisted.ByMID1ba.js","astro:scripts/before-hydration.js":""},"assets":["/_astro/oleksii-vratskyi.CGuOuKuW.jpg","/_astro/github.DzDbeBpc.svg","/_astro/water-website.DBxt1kFa.png","/_astro/online-store-lmd.t64M6gNu.png","/_astro/bg.ChhNY2Zo.png","/_astro/online-store-byshikat.CjTFIWkv.png","/_astro/ov-main.mrCwgghJ.png","/_astro/favicon.DZMLhRyv.svg","/_astro/bg.BlYfRVHK.svg","/_astro/logo.B713gtQC.svg","/_astro/h2ovoda.DpdCKiq8.png","/_astro/experience.KAqr-zYG.jpg","/_astro/astro.TBXBeJNn.jpg","/_astro/extension.BJj3wlht.jpg","/_astro/ui.2qgQiiwW.jpg","/_astro/what-happened-in-a-month-my-vlog.Dd8DAHRL.png","/_astro/index._LNWAfr-.css","/favicon.svg","/img/astro-logo-dark.svg","/img/astro-logo-light.svg","/img/astro-ov.png","/img/bg.png","/img/bg.svg","/img/close.svg","/img/dev.jpg","/img/external.svg","/img/github.svg","/img/grid-sm.svg","/img/grid-xs.svg","/img/grid-xs2.svg","/img/grid-xs3.svg","/img/grid.svg","/img/h2ovoda.png","/img/js.svg","/img/logo-2.svg","/img/logo.svg","/img/menu.svg","/img/message.svg","/img/oleksii-vratskyi.jpg","/img/online-store-byshikat.png","/img/online-store-lmd.png","/img/ov-main.png","/img/personal-website.png","/img/tailwindcss-logotype-white.svg","/img/tailwindcss-logotype.svg","/img/timeline.png","/img/water-website.png","/img/wordpress.svg","/_astro/atropos.DZR9lnpr.js","/_astro/hoisted.BE28wqqM.js","/_astro/hoisted.ByMID1ba.js","/_astro/hoisted.C3ywckME.js","/_astro/hoisted.CGJA2pi7.js","/_astro/hoisted.DW7GaUA3.js","/_astro/index.CgGp2TZk.js","/_astro/page.CueWeZv5.js","/styles/atropos.min.css","/styles/global.css","/styles/reset.css","/src/assets/img/astro-logo-dark.svg","/src/assets/img/astro-logo-light.svg","/src/assets/img/bg.svg","/src/assets/img/close.svg","/src/assets/img/dev.jpg","/src/assets/img/external.svg","/src/assets/img/github.svg","/src/assets/img/grid-sm.svg","/src/assets/img/grid-xs.svg","/src/assets/img/grid-xs2.svg","/src/assets/img/grid-xs3.svg","/src/assets/img/grid.svg","/src/assets/img/js.svg","/src/assets/img/logo-2.svg","/src/assets/img/logo.svg","/src/assets/img/menu.svg","/src/assets/img/message.svg","/src/assets/img/oleksii-vratskyi.jpg","/src/assets/img/online-store-byshikat.png","/src/assets/img/online-store-lmd.png","/src/assets/img/personal-website.png","/src/assets/img/tailwindcss-logotype-white.svg","/src/assets/img/tailwindcss-logotype.svg","/src/assets/img/water-website.png","/src/assets/img/wordpress.svg","/src/assets/js/animate.js","/src/assets/js/menu.js","/_astro/page.CueWeZv5.js","/blog/index.html","/en/404/index.html","/en/about/index.html","/en/blog/index.html","/en/portfolio/index.html","/en/index.html","/ru/404/index.html","/ru/about/index.html","/ru/blog/index.html","/ru/portfolio/index.html","/ru/index.html","/index.html","/index.html"],"i18n":{"fallback":{"ru":"en"},"strategy":"pathname-prefix-always","locales":["en","ru",{"path":"ru","codes":["ru","ru-RU"]}],"defaultLocale":"en","domainLookupTable":{}},"buildFormat":"directory"}); + +export { manifest }; diff --git a/.netlify/functions-internal/ssr/renderers.mjs b/.netlify/functions-internal/ssr/renderers.mjs new file mode 100644 index 0000000..61dd92d --- /dev/null +++ b/.netlify/functions-internal/ssr/renderers.mjs @@ -0,0 +1,46 @@ +import { x as AstroJSX, A as AstroError, y as renderJSX, z as createVNode } from './chunks/astro_U7cLjtnz.mjs'; + +const slotName = (str) => str.trim().replace(/[-_]([a-z])/g, (_, w) => w.toUpperCase()); +async function check(Component, props, { default: children = null, ...slotted } = {}) { + if (typeof Component !== "function") + return false; + const slots = {}; + for (const [key, value] of Object.entries(slotted)) { + const name = slotName(key); + slots[name] = value; + } + try { + const result = await Component({ ...props, ...slots, children }); + return result[AstroJSX]; + } catch (e) { + const error = e; + if (Component[Symbol.for("mdx-component")]) { + throw new AstroError({ + message: error.message, + title: error.name, + hint: `This issue often occurs when your MDX component encounters runtime errors.`, + name: error.name, + stack: error.stack + }); + } + } + return false; +} +async function renderToStaticMarkup(Component, props = {}, { default: children = null, ...slotted } = {}) { + const slots = {}; + for (const [key, value] of Object.entries(slotted)) { + const name = slotName(key); + slots[name] = value; + } + const { result } = this; + const html = await renderJSX(result, createVNode(Component, { ...props, ...slots, children })); + return { html }; +} +var server_default = { + check, + renderToStaticMarkup +}; + +const renderers = [Object.assign({"name":"astro:jsx","serverEntrypoint":"astro/jsx/server.js","jsxImportSource":"astro"}, { ssr: server_default }),]; + +export { renderers }; diff --git a/astro.config.mjs b/astro.config.mjs index 5cc44b2..94050f5 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -24,7 +24,7 @@ export default defineConfig({ integrations: [mdx(), compress({ CSS: true, HTML: false, - Image: true, + Image: false, JavaScript: true, SVG: false }), tailwind()],