├── .eslintrc ├── .gitignore ├── README.md ├── components ├── Header.js └── Post.js ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── _app.js ├── blog │ └── [slug].js └── index.js ├── posts ├── django-crash-course.md ├── javascript-performance-tips.md ├── new-in-php-8.md ├── python-book-review.md ├── react-crash-course.md ├── tailwind-vs-bootstrap.md └── writing-great-unit-tests.md ├── public ├── favicon.ico ├── images │ └── posts │ │ ├── img1.jpg │ │ ├── img2.jpg │ │ ├── img3.jpg │ │ ├── img4.jpg │ │ ├── img5.jpg │ │ ├── img6.jpg │ │ └── img7.jpg └── vercel.svg ├── styles └── globals.css └── utils └── index.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next", "next/core-web-vitals"], 3 | "rules": { 4 | "@next/next/no-img-element": "off" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Next Markdown Blog 2 | 3 | Simple static blog using markdown and Next.js 4 | 5 | [DEMO](https://next-markdown-blog-drab.vercel.app/) 6 | 7 | ## Usage 8 | 9 | ```bash 10 | # Install dependencies 11 | npm install 12 | 13 | # Run dev server 14 | npm run dev 15 | 16 | # Build for prod and export static website 17 | npm run build 18 | ``` 19 | -------------------------------------------------------------------------------- /components/Header.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | 3 | export default function Header() { 4 | return ( 5 |
6 |
7 | 8 |

Dev Blog

9 | 10 |
11 |
12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /components/Post.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | 3 | export default function Post({ post }) { 4 | return ( 5 |
6 | 7 | 8 |
Posted on {post.frontmatter.date}
9 | 10 |

{post.frontmatter.title}

11 | 12 |

{post.frontmatter.excerpt}

13 | 14 | 15 | Read More 16 | 17 |
18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | reactStrictMode: true, 3 | } 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-markdown-blog", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build && next export", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "gray-matter": "^4.0.3", 13 | "marked": "^2.1.2", 14 | "next": "11.0.1", 15 | "react": "17.0.2", 16 | "react-dom": "17.0.2" 17 | }, 18 | "devDependencies": { 19 | "eslint": "7.29.0", 20 | "eslint-config-next": "11.0.1" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import Header from '../components/Header' 2 | import '../styles/globals.css' 3 | 4 | function MyApp({ Component, pageProps }) { 5 | return ( 6 | <> 7 |
8 |
9 | 10 |
11 | 12 | ) 13 | } 14 | 15 | export default MyApp 16 | -------------------------------------------------------------------------------- /pages/blog/[slug].js: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | import path from 'path' 3 | import matter from 'gray-matter' 4 | import marked from 'marked' 5 | import Link from 'next/link' 6 | 7 | export default function PostPage({ 8 | frontmatter: { title, date, cover_image }, 9 | slug, 10 | content, 11 | }) { 12 | return ( 13 | <> 14 | 15 | Go Back 16 | 17 |
18 |

{title}

19 |
Posted on {date}
20 | 21 |
22 |
23 |
24 |
25 | 26 | ) 27 | } 28 | 29 | export async function getStaticPaths() { 30 | const files = fs.readdirSync(path.join('posts')) 31 | 32 | const paths = files.map((filename) => ({ 33 | params: { 34 | slug: filename.replace('.md', ''), 35 | }, 36 | })) 37 | 38 | return { 39 | paths, 40 | fallback: false, 41 | } 42 | } 43 | 44 | export async function getStaticProps({ params: { slug } }) { 45 | const markdownWithMeta = fs.readFileSync( 46 | path.join('posts', slug + '.md'), 47 | 'utf-8' 48 | ) 49 | 50 | const { data: frontmatter, content } = matter(markdownWithMeta) 51 | 52 | return { 53 | props: { 54 | frontmatter, 55 | slug, 56 | content, 57 | }, 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /pages/index.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | import path from 'path' 3 | import matter from 'gray-matter' 4 | import Head from 'next/head' 5 | import Post from '../components/Post' 6 | import { sortByDate } from '../utils' 7 | 8 | export default function Home({ posts }) { 9 | return ( 10 |
11 | 12 | Dev Blog 13 | 14 | 15 |
16 | {posts.map((post, index) => ( 17 | 18 | ))} 19 |
20 |
21 | ) 22 | } 23 | 24 | export async function getStaticProps() { 25 | // Get files from the posts dir 26 | const files = fs.readdirSync(path.join('posts')) 27 | 28 | // Get slug and frontmatter from posts 29 | const posts = files.map((filename) => { 30 | // Create slug 31 | const slug = filename.replace('.md', '') 32 | 33 | // Get frontmatter 34 | const markdownWithMeta = fs.readFileSync( 35 | path.join('posts', filename), 36 | 'utf-8' 37 | ) 38 | 39 | const { data: frontmatter } = matter(markdownWithMeta) 40 | 41 | return { 42 | slug, 43 | frontmatter, 44 | } 45 | }) 46 | 47 | return { 48 | props: { 49 | posts: posts.sort(sortByDate), 50 | }, 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /posts/django-crash-course.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'Django Crash Course' 3 | date: 'March 5, 2021' 4 | excerpt: 'Django is a very powerful, high level Python framework for building web applications' 5 | cover_image: '/images/posts/img3.jpg' 6 | --- 7 | 8 | Lorem markdownum fine incustoditam unda factura versum occuluere Aeneas, iuvat 9 | haec praepes [partes epulae](http://cui.com/), in egisse de. Caecisque ter 10 | manus. Munere in exhalat, ferre sed [habe quaeque saepe](http://ne.org/fretum) 11 | verba caput ferarum _nubila_? Patriam Cyparisse tamen, **saxum** fide postponere 12 | pavida ne omnes etiam, atque. Sonuit omina sed sine haerebat illic fit a mora 13 | in. 14 | 15 | 1. Serrae enim Etruscam aquis 16 | 2. Et premis et flumine frontem minatur oppressos 17 | 3. Inquam rector Icarus possum vim tumulo propiusque 18 | 4. Vulnus se Latreus 19 | 5. Aptumque bis 20 | 21 | ## Turpius Aegides membris colat volentes fallere 22 | 23 | Ille fida formosus, et addunt viscera perdidit ad pondere quia tellus 24 | consequitur et quoque scinditque in. Ratis laborum instabat quaedam partem 25 | Phoebus, manus _partibus poenas_. Sola armos adhuc; chaos agit ora manifesta 26 | procul fugitque corpora iugales! 27 | 28 | var ethics_font_drive = cycleSystemProgram + deprecatedTransferIp.ide(3) / 29 | rgb + nybbleBaseband; 30 | permalinkCertificateMacintosh(ergonomicsIsdnDns); 31 | boot = bridgeDaemonActive; 32 | 33 | ## O contra diu 34 | 35 | Descendit _auras cum misi_ contactu tenax lacus, **quaerensque invitum 36 | premuntur** patria. Puris ille pictis spiritus placent vestigia et noctis 37 | sceleratos laudis egere retroque. Patrem contenta magni margine satis inprudens 38 | nymphae invito verba saepe: genus sed numinis pugnat meum iterumque attonitas 39 | rursus utve. Constituit praestet liceat opprobria Medusae huius, excutiuntque 40 | nam nil, pariter. 41 | 42 | Coma **laudes manet** ausus hortaturque matrisque Veneris proximus tu iamque 43 | aptius claudit. Tmolus tetigere iussos animumque quid poplite Hippotaden? Quod 44 | sibi Spartana sidera, lupum Nereusque quoque ramum, vertuntur Peleus Amuli 45 | oscula: tamen. Surgere Epidaurius movit crede soceri Euboicam quoque. 46 | 47 | Unde stabant, acuta, percussit denique; hoc illic et herbis minimas parvum? Quid 48 | _gemino profectus et_ dici postquam tot; aquarum quod relanguit est si 49 | quodcumque. Ossaque protinus, quod somno est, repetit, hoc passu est. Qui devia; 50 | respice humum vobis oscula, in Lotis nymphae. 51 | 52 | Dolet certamina velle dexteriore mutatus saepe, tellure ubi unguibus, gestu. 53 | Illis cuius finem Sirenes adsueta stridore, pictas quo edidit, nec utque et 54 | capillos ego rapi Bootes, sculpsit. Protinus sibi denique sibi primum Acheloides 55 | ante exspectant gaudeat Calydonius cernit, duxit pariterque dolet epulis? Nostri 56 | visae nisi aeripedes stant quem saepibus cannis protectus candens praestet: 57 | porrigar **patriam** Alcmene: attonitas. 58 | -------------------------------------------------------------------------------- /posts/javascript-performance-tips.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'JavaScript Performance Tips' 3 | date: 'March 4, 2021' 4 | excerpt: 'We will look at 10 simple tips and tricks to increase the speed of your code when writing JS' 5 | cover_image: '/images/posts/img1.jpg' 6 | --- 7 | 8 | Lorem [markdownum](http://insunt.org/inpositaque), et sanguine rutilos dixit 9 | nigro cornu genus duris linguae. Super hic deus ego adveniens nullumque Venerem 10 | equis aurem aliisque celare densis dextramque similis **post**: mihi rexerat; 11 | bis. 12 | 13 | 1. Scinditur annos 14 | 2. Talia verba 15 | 3. Habet delata villis domui 16 | 4. Geminum viscere deum et utque 17 | 18 | ## Magnorum nulla avertit pedem neque monimenta terram 19 | 20 | Quo numquam, nunc [concussaque](http://mox-cunctos.net/), hora effugit mihi, 21 | pectore. Hinc fausto, circumspicit cadas; virilibus rapui, timidum rorat cuique 22 | animorum ac! Quem sit. Venit qui, rex sibi tota, peto _fortis ira suis_ dolusque 23 | simulatque [incipit crudelesque 24 | pavens](http://www.corpora.com/terrae-oscula.html) spatiosa conlegit oscula 25 | equam. 26 | 27 | ## Mensis idem 28 | 29 | Caelestia Ganymedes gentis. Veni inpellit publica tecta bellaque mortali loca 30 | _mea gente_ qui Enipeus iramque et hoc. _Altera Rex vetitum_; hoc magis dolores 31 | precor nec. Ubi verba, et aras regia, cognoscere vites tempusque expers, heros? 32 | 33 | ## Mihi puto pallorem 34 | 35 | Hac forma, habeo quam et patria, ille tulit volat quamquam vulnus, aere est. 36 | Ignis sequerere membra Pirithoo: caruerunt saevumque, sumus, ignesque poterit 37 | intus de fonte. 38 | 39 | ## Quondam montibus tua spes consilioque nata consilioque 40 | 41 | Abigitque limite. Ipsa levis extulit munera, litora, ira pavet in morte, **te 42 | in** quas [vix](http://auxiliumquefando.net/vocibus-cum). Mitis tinxit, modus 43 | promissa **ne volucris** simul genetrixque Iovis in deae modo **in** des. 44 | _Memini isto hostilia_ Aeneas, in ponto **nova eventu cetera** iugum animam 45 | ille, viro, nec. Loquendi aves insisto saecula premente nec, at ego poscit ubi 46 | sub! 47 | 48 | - Tristis natorum ora talia patriis famae naidas 49 | - Deus scilicet male miliaque noctisque invenio Nilum 50 | - Efficerentque devexaque foret haec leve ab fertilis 51 | 52 | Institerat quantum facies parientem, crepitantis nondum. Atque atris arcebat 53 | factis nil Lucina mori sinu est partibus specie, imo interea tellus luctu 54 | inmunitamque genus Amphitryoniaden? 55 | -------------------------------------------------------------------------------- /posts/new-in-php-8.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "What's New In PHP 8?" 3 | date: 'March 7, 2021' 4 | excerpt: 'In this article we will look at some of the new features offered in version 8 of PHP' 5 | cover_image: '/images/posts/img4.jpg' 6 | --- 7 | 8 | Lorem markdownum erat meritum instat quis! Parari vera harundinibus molibus nam 9 | illuc, **egi** tellus [facta ruinas](http://necloqui.com/fuit.html), iterumque! 10 | Parvo quae hinc cura poterat Iove gurgite thalamis fugitque turis, quin nunc. 11 | 12 | var pdf_linux_radcab = gibibyteAspUri + firewireIvr - 13 | jre_software_character; 14 | var megabit_layout = 38 + executableExpansionHdd(storage_import_runtime, 15 | tweenJpeg) - contextual; 16 | url_bing.upnp_modifier_cold(linkedin, inputTrackballRefresh.flatProcessJsp( 17 | -1, nodeMacintosh, sramCardSpoofing) + text, 18 | version_daemon_latency.localhost_compact_boot.dosSpool( 19 | memory_controller_blu(jpegServer, maximizeAsciiType), status)); 20 | 21 | Iungunt cuspis rarissima tendentem domus natis tamen ultima domino invidiosa 22 | cautum nec falcatus viridi omnes, soror. Ire tacita. Dissidet eat voce et 23 | Pactolides illa sed [hunc](http://passim.com/) longi illa arborea, dum securi; 24 | vidit. 25 | 26 | ## Dant testa animalia sequendi paterni manus parte 27 | 28 | _Venus_ dissimulare perii _iaculatur dedere multumque_ sitim, cur tela 29 | temeraria, per? Meum eque deae tu vidisse Frigus triennia, equo 30 | [trahit](http://in.net/ignarusfuit.html), enim verti commota prima cornibus 31 | pectora! 32 | 33 | tiffWord(snippetAnimatedCd); 34 | wrap_exbibyte = cropStation; 35 | if (page(mailDvCybersquatter, error, ip)) { 36 | xsltMacintosh += ip; 37 | } else { 38 | social += traceroute_redundancy_voip; 39 | box_isp.lion = wepSuffix; 40 | } 41 | 42 | Tam Pomona _fixis cera vidisse_ Sperchios ista _concordes_ parte comes animalia 43 | ira miserae magna iaculatur sententia abest. [Est](http://puer-nec.io/squalidus) 44 | illam esse hasta? Iamque Argolico spumam quondam, Sirenes dolor longus arbor 45 | perque. 46 | 47 | ## Iamque illa numquam dictis 48 | 49 | Verberat arma parte mariti, tempora mugit glomerataque illa epulis: Troiam. De 50 | illo ut Lyncus an mihi, est alas ventisque et **opem**, iure anxia, pes qua 51 | quodque nati. Morti est tertia tutissimus prope, **herbas** hoc cecidere 52 | videres. Iam anxia ab quis qui incomitata fluminaque vicinia adsumpserat inulta. 53 | Nascentia tibi significat fixurus quam Cnosiaci spectat obstipuere quem 54 | plenissima ita tangit cum nisi. 55 | 56 | class.runtimeFatSku += 2 * 8; 57 | if (command) { 58 | mini = video; 59 | handle_repository_mtu = osd_boot_mips(lamp + 2, 60 | managementMultiplatformBoot(rubyLockWpa, 1), laptopHdtv); 61 | horse += 2 + address(ictPinterestPpga, -5); 62 | } 63 | wiki_responsive_flash.ddr_disk -= c_cd + 64 | andCopy.intellectual_so_iteration.cross(moduleReadme, programming + 65 | broadband); 66 | 67 | Mirantia deique sacerdos, opus, at [generis eandem 68 | planamque](http://www.potentia.net/lapis). Caecos pedibus velo pennas esse nam 69 | nostri **rapit**, diu Caras, amantem, Areos Aeacides via. Ad quiescere, per 70 | dolores quoque; iterum Alcmene, est usque micantes subitae! 71 | -------------------------------------------------------------------------------- /posts/python-book-review.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'Python Book Review' 3 | date: 'March 7, 2021' 4 | excerpt: 'In this review, we will be looking at the new Python book from Oriley' 5 | cover_image: '/images/posts/img6.jpg' 6 | --- 7 | 8 | Lorem markdownum fine incustoditam unda factura versum occuluere Aeneas, iuvat 9 | haec praepes [partes epulae](http://cui.com/), in egisse de. Caecisque ter 10 | manus. Munere in exhalat, ferre sed [habe quaeque saepe](http://ne.org/fretum) 11 | verba caput ferarum _nubila_? Patriam Cyparisse tamen, **saxum** fide postponere 12 | pavida ne omnes etiam, atque. Sonuit omina sed sine haerebat illic fit a mora 13 | in. 14 | 15 | 1. Serrae enim Etruscam aquis 16 | 2. Et premis et flumine frontem minatur oppressos 17 | 3. Inquam rector Icarus possum vim tumulo propiusque 18 | 4. Vulnus se Latreus 19 | 5. Aptumque bis 20 | 21 | ## Turpius Aegides membris colat volentes fallere 22 | 23 | Ille fida formosus, et addunt viscera perdidit ad pondere quia tellus 24 | consequitur et quoque scinditque in. Ratis laborum instabat quaedam partem 25 | Phoebus, manus _partibus poenas_. Sola armos adhuc; chaos agit ora manifesta 26 | procul fugitque corpora iugales! 27 | 28 | var ethics_font_drive = cycleSystemProgram + deprecatedTransferIp.ide(3) / 29 | rgb + nybbleBaseband; 30 | permalinkCertificateMacintosh(ergonomicsIsdnDns); 31 | boot = bridgeDaemonActive; 32 | 33 | ## O contra diu 34 | 35 | Descendit _auras cum misi_ contactu tenax lacus, **quaerensque invitum 36 | premuntur** patria. Puris ille pictis spiritus placent vestigia et noctis 37 | sceleratos laudis egere retroque. Patrem contenta magni margine satis inprudens 38 | nymphae invito verba saepe: genus sed numinis pugnat meum iterumque attonitas 39 | rursus utve. Constituit praestet liceat opprobria Medusae huius, excutiuntque 40 | nam nil, pariter. 41 | 42 | Coma **laudes manet** ausus hortaturque matrisque Veneris proximus tu iamque 43 | aptius claudit. Tmolus tetigere iussos animumque quid poplite Hippotaden? Quod 44 | sibi Spartana sidera, lupum Nereusque quoque ramum, vertuntur Peleus Amuli 45 | oscula: tamen. Surgere Epidaurius movit crede soceri Euboicam quoque. 46 | 47 | Unde stabant, acuta, percussit denique; hoc illic et herbis minimas parvum? Quid 48 | _gemino profectus et_ dici postquam tot; aquarum quod relanguit est si 49 | quodcumque. Ossaque protinus, quod somno est, repetit, hoc passu est. Qui devia; 50 | respice humum vobis oscula, in Lotis nymphae. 51 | 52 | Dolet certamina velle dexteriore mutatus saepe, tellure ubi unguibus, gestu. 53 | Illis cuius finem Sirenes adsueta stridore, pictas quo edidit, nec utque et 54 | capillos ego rapi Bootes, sculpsit. Protinus sibi denique sibi primum Acheloides 55 | ante exspectant gaudeat Calydonius cernit, duxit pariterque dolet epulis? Nostri 56 | visae nisi aeripedes stant quem saepibus cannis protectus candens praestet: 57 | porrigar **patriam** Alcmene: attonitas. 58 | -------------------------------------------------------------------------------- /posts/react-crash-course.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'React Crash Course' 3 | date: 'March 8, 2021' 4 | excerpt: 'Crash course to learn the React JavaScript library. We will look at components, hooks and more' 5 | cover_image: '/images/posts/img5.jpg' 6 | --- 7 | 8 | Lorem markdownum fine incustoditam unda factura versum occuluere Aeneas, iuvat 9 | haec praepes [partes epulae](http://cui.com/), in egisse de. Caecisque ter 10 | manus. Munere in exhalat, ferre sed [habe quaeque saepe](http://ne.org/fretum) 11 | verba caput ferarum _nubila_? Patriam Cyparisse tamen, **saxum** fide postponere 12 | pavida ne omnes etiam, atque. Sonuit omina sed sine haerebat illic fit a mora 13 | in. 14 | 15 | 1. Serrae enim Etruscam aquis 16 | 2. Et premis et flumine frontem minatur oppressos 17 | 3. Inquam rector Icarus possum vim tumulo propiusque 18 | 4. Vulnus se Latreus 19 | 5. Aptumque bis 20 | 21 | ## Turpius Aegides membris colat volentes fallere 22 | 23 | Ille fida formosus, et addunt viscera perdidit ad pondere quia tellus 24 | consequitur et quoque scinditque in. Ratis laborum instabat quaedam partem 25 | Phoebus, manus _partibus poenas_. Sola armos adhuc; chaos agit ora manifesta 26 | procul fugitque corpora iugales! 27 | 28 | var ethics_font_drive = cycleSystemProgram + deprecatedTransferIp.ide(3) / 29 | rgb + nybbleBaseband; 30 | permalinkCertificateMacintosh(ergonomicsIsdnDns); 31 | boot = bridgeDaemonActive; 32 | 33 | ## O contra diu 34 | 35 | Descendit _auras cum misi_ contactu tenax lacus, **quaerensque invitum 36 | premuntur** patria. Puris ille pictis spiritus placent vestigia et noctis 37 | sceleratos laudis egere retroque. Patrem contenta magni margine satis inprudens 38 | nymphae invito verba saepe: genus sed numinis pugnat meum iterumque attonitas 39 | rursus utve. Constituit praestet liceat opprobria Medusae huius, excutiuntque 40 | nam nil, pariter. 41 | 42 | Coma **laudes manet** ausus hortaturque matrisque Veneris proximus tu iamque 43 | aptius claudit. Tmolus tetigere iussos animumque quid poplite Hippotaden? Quod 44 | sibi Spartana sidera, lupum Nereusque quoque ramum, vertuntur Peleus Amuli 45 | oscula: tamen. Surgere Epidaurius movit crede soceri Euboicam quoque. 46 | 47 | Unde stabant, acuta, percussit denique; hoc illic et herbis minimas parvum? Quid 48 | _gemino profectus et_ dici postquam tot; aquarum quod relanguit est si 49 | quodcumque. Ossaque protinus, quod somno est, repetit, hoc passu est. Qui devia; 50 | respice humum vobis oscula, in Lotis nymphae. 51 | 52 | Dolet certamina velle dexteriore mutatus saepe, tellure ubi unguibus, gestu. 53 | Illis cuius finem Sirenes adsueta stridore, pictas quo edidit, nec utque et 54 | capillos ego rapi Bootes, sculpsit. Protinus sibi denique sibi primum Acheloides 55 | ante exspectant gaudeat Calydonius cernit, duxit pariterque dolet epulis? Nostri 56 | visae nisi aeripedes stant quem saepibus cannis protectus candens praestet: 57 | porrigar **patriam** Alcmene: attonitas. 58 | -------------------------------------------------------------------------------- /posts/tailwind-vs-bootstrap.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'Tailwind vs. Bootstrap' 3 | date: 'March 5, 2021' 4 | excerpt: 'Both Tailwind and Bootstrap are very popular CSS frameworks. In this article, we will compare them' 5 | cover_image: '/images/posts/img2.jpg' 6 | --- 7 | 8 | Lorem markdownum fine incustoditam unda factura versum occuluere Aeneas, iuvat 9 | haec praepes [partes epulae](http://cui.com/), in egisse de. Caecisque ter 10 | manus. Munere in exhalat, ferre sed [habe quaeque saepe](http://ne.org/fretum) 11 | verba caput ferarum _nubila_? Patriam Cyparisse tamen, **saxum** fide postponere 12 | pavida ne omnes etiam, atque. Sonuit omina sed sine haerebat illic fit a mora 13 | in. 14 | 15 | 1. Serrae enim Etruscam aquis 16 | 2. Et premis et flumine frontem minatur oppressos 17 | 3. Inquam rector Icarus possum vim tumulo propiusque 18 | 4. Vulnus se Latreus 19 | 5. Aptumque bis 20 | 21 | ## Turpius Aegides membris colat volentes fallere 22 | 23 | Ille fida formosus, et addunt viscera perdidit ad pondere quia tellus 24 | consequitur et quoque scinditque in. Ratis laborum instabat quaedam partem 25 | Phoebus, manus _partibus poenas_. Sola armos adhuc; chaos agit ora manifesta 26 | procul fugitque corpora iugales! 27 | 28 | var ethics_font_drive = cycleSystemProgram + deprecatedTransferIp.ide(3) / 29 | rgb + nybbleBaseband; 30 | permalinkCertificateMacintosh(ergonomicsIsdnDns); 31 | boot = bridgeDaemonActive; 32 | 33 | ## O contra diu 34 | 35 | Descendit _auras cum misi_ contactu tenax lacus, **quaerensque invitum 36 | premuntur** patria. Puris ille pictis spiritus placent vestigia et noctis 37 | sceleratos laudis egere retroque. Patrem contenta magni margine satis inprudens 38 | nymphae invito verba saepe: genus sed numinis pugnat meum iterumque attonitas 39 | rursus utve. Constituit praestet liceat opprobria Medusae huius, excutiuntque 40 | nam nil, pariter. 41 | 42 | Coma **laudes manet** ausus hortaturque matrisque Veneris proximus tu iamque 43 | aptius claudit. Tmolus tetigere iussos animumque quid poplite Hippotaden? Quod 44 | sibi Spartana sidera, lupum Nereusque quoque ramum, vertuntur Peleus Amuli 45 | oscula: tamen. Surgere Epidaurius movit crede soceri Euboicam quoque. 46 | 47 | Unde stabant, acuta, percussit denique; hoc illic et herbis minimas parvum? Quid 48 | _gemino profectus et_ dici postquam tot; aquarum quod relanguit est si 49 | quodcumque. Ossaque protinus, quod somno est, repetit, hoc passu est. Qui devia; 50 | respice humum vobis oscula, in Lotis nymphae. 51 | 52 | Dolet certamina velle dexteriore mutatus saepe, tellure ubi unguibus, gestu. 53 | Illis cuius finem Sirenes adsueta stridore, pictas quo edidit, nec utque et 54 | capillos ego rapi Bootes, sculpsit. Protinus sibi denique sibi primum Acheloides 55 | ante exspectant gaudeat Calydonius cernit, duxit pariterque dolet epulis? Nostri 56 | visae nisi aeripedes stant quem saepibus cannis protectus candens praestet: 57 | porrigar **patriam** Alcmene: attonitas. 58 | -------------------------------------------------------------------------------- /posts/writing-great-unit-tests.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'Writing Great Unit Tests' 3 | date: 'March 12, 2021' 4 | excerpt: 'We will look at 10 simple tips and tricks on writing unit tests in JavaScript' 5 | cover_image: '/images/posts/img7.jpg' 6 | --- 7 | 8 | Lorem [markdownum](http://insunt.org/inpositaque), et sanguine rutilos dixit 9 | nigro cornu genus duris linguae. Super hic deus ego adveniens nullumque Venerem 10 | equis aurem aliisque celare densis dextramque similis **post**: mihi rexerat; 11 | bis. 12 | 13 | 1. Scinditur annos 14 | 2. Talia verba 15 | 3. Habet delata villis domui 16 | 4. Geminum viscere deum et utque 17 | 18 | ## Magnorum nulla avertit pedem neque monimenta terram 19 | 20 | Quo numquam, nunc [concussaque](http://mox-cunctos.net/), hora effugit mihi, 21 | pectore. Hinc fausto, circumspicit cadas; virilibus rapui, timidum rorat cuique 22 | animorum ac! Quem sit. Venit qui, rex sibi tota, peto _fortis ira suis_ dolusque 23 | simulatque [incipit crudelesque 24 | pavens](http://www.corpora.com/terrae-oscula.html) spatiosa conlegit oscula 25 | equam. 26 | 27 | ## Mensis idem 28 | 29 | Caelestia Ganymedes gentis. Veni inpellit publica tecta bellaque mortali loca 30 | _mea gente_ qui Enipeus iramque et hoc. _Altera Rex vetitum_; hoc magis dolores 31 | precor nec. Ubi verba, et aras regia, cognoscere vites tempusque expers, heros? 32 | 33 | ## Mihi puto pallorem 34 | 35 | Hac forma, habeo quam et patria, ille tulit volat quamquam vulnus, aere est. 36 | Ignis sequerere membra Pirithoo: caruerunt saevumque, sumus, ignesque poterit 37 | intus de fonte. 38 | 39 | ## Quondam montibus tua spes consilioque nata consilioque 40 | 41 | Abigitque limite. Ipsa levis extulit munera, litora, ira pavet in morte, **te 42 | in** quas [vix](http://auxiliumquefando.net/vocibus-cum). Mitis tinxit, modus 43 | promissa **ne volucris** simul genetrixque Iovis in deae modo **in** des. 44 | _Memini isto hostilia_ Aeneas, in ponto **nova eventu cetera** iugum animam 45 | ille, viro, nec. Loquendi aves insisto saecula premente nec, at ego poscit ubi 46 | sub! 47 | 48 | - Tristis natorum ora talia patriis famae naidas 49 | - Deus scilicet male miliaque noctisque invenio Nilum 50 | - Efficerentque devexaque foret haec leve ab fertilis 51 | 52 | Institerat quantum facies parientem, crepitantis nondum. Atque atris arcebat 53 | factis nil Lucina mori sinu est partibus specie, imo interea tellus luctu 54 | inmunitamque genus Amphitryoniaden? 55 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/next-markdown-blog/d0887306a7b1965f93954e409e1c60dd86ba58d1/public/favicon.ico -------------------------------------------------------------------------------- /public/images/posts/img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/next-markdown-blog/d0887306a7b1965f93954e409e1c60dd86ba58d1/public/images/posts/img1.jpg -------------------------------------------------------------------------------- /public/images/posts/img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/next-markdown-blog/d0887306a7b1965f93954e409e1c60dd86ba58d1/public/images/posts/img2.jpg -------------------------------------------------------------------------------- /public/images/posts/img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/next-markdown-blog/d0887306a7b1965f93954e409e1c60dd86ba58d1/public/images/posts/img3.jpg -------------------------------------------------------------------------------- /public/images/posts/img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/next-markdown-blog/d0887306a7b1965f93954e409e1c60dd86ba58d1/public/images/posts/img4.jpg -------------------------------------------------------------------------------- /public/images/posts/img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/next-markdown-blog/d0887306a7b1965f93954e409e1c60dd86ba58d1/public/images/posts/img5.jpg -------------------------------------------------------------------------------- /public/images/posts/img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/next-markdown-blog/d0887306a7b1965f93954e409e1c60dd86ba58d1/public/images/posts/img6.jpg -------------------------------------------------------------------------------- /public/images/posts/img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/next-markdown-blog/d0887306a7b1965f93954e409e1c60dd86ba58d1/public/images/posts/img7.jpg -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /styles/globals.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400&display=swap'); 2 | 3 | * { 4 | box-sizing: border-box; 5 | margin: 0; 6 | padding: 0; 7 | } 8 | 9 | body { 10 | font-family: 'Poppins', sans-serif; 11 | } 12 | 13 | p { 14 | margin: 15px 0; 15 | line-height: 1.8; 16 | } 17 | 18 | a { 19 | text-decoration: none; 20 | color: #333; 21 | } 22 | 23 | img { 24 | width: 100%; 25 | border-radius: 10px; 26 | } 27 | 28 | header { 29 | background: steelblue; 30 | color: #fff; 31 | padding: 5px; 32 | margin-bottom: 40px; 33 | } 34 | 35 | header a { 36 | color: #fff; 37 | } 38 | 39 | .container { 40 | max-width: 768px; 41 | margin: auto; 42 | overflow: auto; 43 | padding: 0 10px; 44 | } 45 | 46 | .btn { 47 | display: inline-block; 48 | background: steelblue; 49 | color: #fff; 50 | border: none; 51 | padding: 8px 16px; 52 | border-radius: 5px; 53 | cursor: pointer; 54 | text-decoration: none; 55 | font-size: 15px; 56 | font-family: inherit; 57 | } 58 | 59 | .btn:focus { 60 | outline: none; 61 | } 62 | 63 | .btn:hover { 64 | transform: scale(0.98); 65 | } 66 | 67 | .btn-back { 68 | background: #f4f4f4; 69 | color: #000; 70 | margin-bottom: 20px; 71 | } 72 | 73 | .posts { 74 | display: grid; 75 | grid-template-columns: repeat(2, 1fr); 76 | gap: 30px; 77 | margin-top: 30px; 78 | } 79 | 80 | .card { 81 | padding: 15px; 82 | border-radius: 10px; 83 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); 84 | } 85 | 86 | .card-page { 87 | padding: 15px 30px; 88 | } 89 | 90 | .post-title { 91 | margin: 10px 0; 92 | } 93 | 94 | .post-date { 95 | background: #f4f4f4; 96 | margin-bottom: 20px; 97 | padding: 3px 10px; 98 | } 99 | 100 | .post-body ul, 101 | ol { 102 | font-size: 110%; 103 | line-height: 2.3; 104 | font-weight: bold; 105 | margin: 10px 0; 106 | } 107 | 108 | .post-body pre { 109 | background: #f4f4f4; 110 | padding: 20px; 111 | margin: 20px 0; 112 | line-height: 2.3; 113 | } 114 | 115 | @media (max-width: 500px) { 116 | .posts { 117 | grid-template-columns: 1fr; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /utils/index.js: -------------------------------------------------------------------------------- 1 | export const sortByDate = (a, b) => { 2 | return new Date(b.frontmatter.date) - new Date(a.frontmatter.date) 3 | } 4 | --------------------------------------------------------------------------------