├── .contentlayer ├── .cache │ └── v0.3.4 │ │ ├── data-57SVVUK2.json │ │ ├── data-CAJQLHNV.json │ │ ├── data-E7R6DJHI.json │ │ └── data-TDDJTZUP.json ├── generated │ ├── Post │ │ ├── _index.json │ │ ├── _index.mjs │ │ ├── blog__deploying-next-apps.mdx.json │ │ ├── blog__index.mdx.json │ │ ├── blog__why-dev.mdx.json │ │ ├── writings__deploying-next-apps.mdx.json │ │ └── writings__why-dev.mdx.json │ ├── index.d.ts │ ├── index.mjs │ └── types.d.ts └── package.json ├── .eslintrc.json ├── .gitignore ├── README.md ├── app ├── blog │ └── [slug] │ │ └── page.tsx ├── favicon.ico ├── fonts │ ├── GeistMonoVF.woff │ └── GeistVF.woff ├── globals.css ├── layout.tsx └── page.tsx ├── components.json ├── components ├── mdx │ ├── callout.tsx │ ├── card.tsx │ ├── mdx.tsx │ ├── page-header.tsx │ └── pager.tsx ├── shared │ ├── icons.tsx │ └── mode-toogle.tsx └── ui │ ├── button.tsx │ ├── form.tsx │ └── label.tsx ├── config ├── blogs.ts └── site.ts ├── content └── blog │ ├── deploying-next-apps.mdx │ ├── how-to-modify.mdx │ └── why-dev.mdx ├── contentlayer.config.ts ├── lib └── utils.ts ├── next.config.mjs ├── package.json ├── pnpm-lock.yaml ├── postcss.config.mjs ├── providers └── theme.tsx ├── public └── writings │ ├── blog-post-1.jpg │ ├── blog-post-2.jpg │ ├── blog-post-3.jpg │ └── blog-post-4.jpg ├── styles └── mdx.css ├── tailwind.config.ts ├── tsconfig.json └── types └── index.d.ts /.contentlayer/.cache/v0.3.4/data-57SVVUK2.json: -------------------------------------------------------------------------------- 1 | { 2 | "cacheItemsMap": {} 3 | } 4 | -------------------------------------------------------------------------------- /.contentlayer/.cache/v0.3.4/data-E7R6DJHI.json: -------------------------------------------------------------------------------- 1 | { 2 | "cacheItemsMap": { 3 | "writings/why-dev.mdx": { 4 | "document": { 5 | "title": "My Portfolio", 6 | "description": "Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.", 7 | "date": "2023-10-01T00:00:00.000Z", 8 | "published": true, 9 | "image": "/writings/blog-post-2.jpg", 10 | "body": { 11 | "raw": "\n# My Portfolio\n\nWelcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\n", 12 | "code": "var Component=(()=>{var dr=Object.create;var N=Object.defineProperty;var vr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,mr=Object.prototype.hasOwnProperty;var q=(l,u)=>()=>(u||l((u={exports:{}}).exports,u),u.exports),gr=(l,u)=>{for(var m in u)N(l,m,{get:u[m],enumerable:!0})},Te=(l,u,m,_)=>{if(u&&typeof u==\"object\"||typeof u==\"function\")for(let y of pr(u))!mr.call(l,y)&&y!==m&&N(l,y,{get:()=>u[y],enumerable:!(_=vr(u,y))||_.enumerable});return l};var hr=(l,u,m)=>(m=l!=null?dr(br(l)):{},Te(u||!l||!l.__esModule?N(m,\"default\",{value:l,enumerable:!0}):m,l)),yr=l=>Te(N({},\"__esModule\",{value:!0}),l);var Pe=q((Pr,we)=>{we.exports=React});var je=q(z=>{\"use strict\";(function(){\"use strict\";var l=Pe(),u=Symbol.for(\"react.element\"),m=Symbol.for(\"react.portal\"),_=Symbol.for(\"react.fragment\"),y=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),S=Symbol.for(\"react.forward_ref\"),I=Symbol.for(\"react.suspense\"),W=Symbol.for(\"react.suspense_list\"),x=Symbol.for(\"react.memo\"),Y=Symbol.for(\"react.lazy\"),xe=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,ke=\"@@iterator\";function De(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[ke];return typeof r==\"function\"?r:null}var T=l.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function d(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n=1&&c>=0&&a[f]!==v[c];)c--;for(;f>=1&&c>=0;f--,c--)if(a[f]!==v[c]){if(f!==1||c!==1)do if(f--,c--,c<0||a[f]!==v[c]){var b=`\n`+a[f].replace(\" at new \",\" at \");return e.displayName&&b.includes(\"\")&&(b=b.replace(\"\",e.displayName)),typeof e==\"function\"&&D.set(e,b),b}while(f>=1&&c>=0);break}}}finally{V=!1,$.current=s,Le(),Error.prepareStackTrace=i}var P=e?e.displayName||e.name:\"\",R=P?k(P):\"\";return typeof e==\"function\"&&D.set(e,R),R}function Be(e,r,t){return fe(e,!1)}function Ke(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function F(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return fe(e,Ke(e));if(typeof e==\"string\")return k(e);switch(e){case I:return k(\"Suspense\");case W:return k(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case S:return Be(e.render);case x:return F(e.type,r,t);case Y:{var n=e,i=n._payload,s=n._init;try{return F(s(i),r,t)}catch{}}}return\"\"}var C=Object.prototype.hasOwnProperty,ce={},de=T.ReactDebugCurrentFrame;function A(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);de.setExtraStackFrame(t)}else de.setExtraStackFrame(null)}function Xe(e,r,t,n,i){{var s=Function.call.bind(C);for(var o in e)if(s(e,o)){var a=void 0;try{if(typeof e[o]!=\"function\"){var v=Error((n||\"React class\")+\": \"+t+\" type `\"+o+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[o]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw v.name=\"Invariant Violation\",v}a=e[o](r,o,n,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(f){a=f}a&&!(a instanceof Error)&&(A(i),d(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",n||\"React class\",t,o,typeof a),A(null)),a instanceof Error&&!(a.message in ce)&&(ce[a.message]=!0,A(i),d(\"Failed %s type: %s\",t,a.message),A(null))}}}var Ge=Array.isArray;function L(e){return Ge(e)}function qe(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function ze(e){try{return ve(e),!1}catch{return!0}}function ve(e){return\"\"+e}function pe(e){if(ze(e))return d(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",qe(e)),ve(e)}var O=T.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},be,me,U;U={};function Je(e){if(C.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(C.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&O.current&&r&&O.current.stateNode!==r){var t=g(O.current.type);U[t]||(d('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',g(O.current.type),e.ref),U[t]=!0)}}function er(e,r){{var t=function(){be||(be=!0,d(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){me||(me=!0,d(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var tr=function(e,r,t,n,i,s,o){var a={$$typeof:u,type:e,key:r,ref:t,props:o,_owner:s};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:n}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:i}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function nr(e,r,t,n,i){{var s,o={},a=null,v=null;t!==void 0&&(pe(t),a=\"\"+t),Ze(r)&&(pe(r.key),a=\"\"+r.key),Je(r)&&(v=r.ref,Qe(r,i));for(s in r)C.call(r,s)&&!He.hasOwnProperty(s)&&(o[s]=r[s]);if(e&&e.defaultProps){var f=e.defaultProps;for(s in f)o[s]===void 0&&(o[s]=f[s])}if(a||v){var c=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(o,c),v&&rr(o,c)}return tr(e,a,v,i,n,O.current,o)}}var B=T.ReactCurrentOwner,ge=T.ReactDebugCurrentFrame;function w(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);ge.setExtraStackFrame(t)}else ge.setExtraStackFrame(null)}var K;K=!1;function X(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===u}function he(){{if(B.current){var e=g(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function ar(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function or(e){{var r=he();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function _e(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=or(r);if(ye[t])return;ye[t]=!0;var n=\"\";e&&e._owner&&e._owner!==B.current&&(n=\" It was passed a child from \"+g(e._owner.type)+\".\"),w(e),d('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,n),w(null)}}function Ee(e,r){{if(typeof e!=\"object\")return;if(L(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):f=typeof e,d(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",f,a)}var c=nr(e,r,t,i,s);if(c==null)return c;if(o){var b=r.children;if(b!==void 0)if(n)if(L(b)){for(var P=0;P0?\"{key: someKey, \"+p.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Re[R+G]){var fr=p.length>0?\"{\"+p.join(\": ..., \")+\": ...}\":\"{}\";d(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,G,R,fr,R),Re[R+G]=!0}}return e===_?ur(c):ir(c),c}}var lr=sr;z.Fragment=_,z.jsxDEV=lr})()});var Oe=q((Cr,Ce)=>{\"use strict\";Ce.exports=je()});var Tr={};gr(Tr,{default:()=>Rr,frontmatter:()=>_r});var h=hr(Oe()),_r={title:\"My Portfolio\",description:\"Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\",date:\"2023-10-01\",image:\"/writings/blog-post-2.jpg\"};function Se(l){let u=Object.assign({h1:\"h1\",a:\"a\",span:\"span\",p:\"p\"},l.components);return(0,h.jsxDEV)(h.Fragment,{children:[(0,h.jsxDEV)(u.h1,{id:\"my-portfolio\",children:[(0,h.jsxDEV)(u.a,{className:\"subheading-anchor\",\"aria-label\":\"Link to section\",href:\"#my-portfolio\",children:(0,h.jsxDEV)(u.span,{className:\"icon icon-link\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\"},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\"},this),\"My Portfolio\"]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,h.jsxDEV)(u.p,{children:\"Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\",lineNumber:10,columnNumber:1},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\",lineNumber:1,columnNumber:1},this)}function Er(l={}){let{wrapper:u}=l.components||{};return u?(0,h.jsxDEV)(u,Object.assign({},l,{children:(0,h.jsxDEV)(Se,l,void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\"},this)}),void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\"},this):Se(l)}var Rr=Er;return yr(Tr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" 13 | }, 14 | "_id": "writings/why-dev.mdx", 15 | "_raw": { 16 | "sourceFilePath": "writings/why-dev.mdx", 17 | "sourceFileName": "why-dev.mdx", 18 | "sourceFileDir": "writings", 19 | "contentType": "mdx", 20 | "flattenedPath": "writings/why-dev" 21 | }, 22 | "type": "Post", 23 | "slug": "/writings/why-dev", 24 | "slugAsParams": "why-dev" 25 | }, 26 | "documentHash": "1728496533182", 27 | "hasWarnings": false, 28 | "documentTypeName": "Post" 29 | }, 30 | "writings/deploying-next-apps.mdx": { 31 | "document": { 32 | "title": "Deploying Next.js Apps", 33 | "description": "How to deploy your Next.js apps on Vercel.", 34 | "date": "2024-10-09T00:00:00.000Z", 35 | "published": true, 36 | "image": "/writings/blog-post-3.jpg", 37 | "body": { 38 | "raw": "\n\n The text below is from the [Tailwind\n CSS](https://play.tailwindcss.com/uj1vGACRJA?layout=preview) docs. I copied it\n here to test the markdown styles. **Tailwind is awesome. You should use it.**\n\n\n```html\n
\n

Garlic bread with cheese: What the science tells us

\n

\n For years parents have espoused the health benefits of eating garlic bread\n with cheese to their children, with the food earning such an iconic status\n in our culture that kids will often dress up as warm, cheesy loaf for\n Halloween.\n

\n

\n But a recent study shows that the celebrated appetizer may be linked to a\n series of rabies cases springing up around the country.\n

\n
\n```\n\nFor more information about how to use the plugin and the features it includes, [read the documentation](https://github.com/tailwindcss/typography/blob/master/README.md).\n", 39 | "code": "var Component=(()=>{var fr=Object.create;var A=Object.defineProperty;var mr=Object.getOwnPropertyDescriptor;var br=Object.getOwnPropertyNames;var pr=Object.getPrototypeOf,hr=Object.prototype.hasOwnProperty;var z=(s,n)=>()=>(n||s((n={exports:{}}).exports,n),n.exports),_r=(s,n)=>{for(var m in n)A(s,m,{get:n[m],enumerable:!0})},xe=(s,n,m,v)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let y of br(n))!hr.call(s,y)&&y!==m&&A(s,y,{get:()=>n[y],enumerable:!(v=mr(n,y))||v.enumerable});return s};var gr=(s,n,m)=>(m=s!=null?fr(pr(s)):{},xe(n||!s||!s.__esModule?A(m,\"default\",{value:s,enumerable:!0}):m,s)),yr=s=>xe(A({},\"__esModule\",{value:!0}),s);var je=z((Pr,we)=>{we.exports=React});var Pe=z(q=>{\"use strict\";(function(){\"use strict\";var s=je(),n=Symbol.for(\"react.element\"),m=Symbol.for(\"react.portal\"),v=Symbol.for(\"react.fragment\"),y=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),C=Symbol.for(\"react.forward_ref\"),I=Symbol.for(\"react.suspense\"),W=Symbol.for(\"react.suspense_list\"),O=Symbol.for(\"react.memo\"),Y=Symbol.for(\"react.lazy\"),Oe=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,Se=\"@@iterator\";function ke(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[Se];return typeof r==\"function\"?r:null}var x=s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function b(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),i=1;i=1&&f>=0&&a[u]!==p[f];)f--;for(;u>=1&&f>=0;u--,f--)if(a[u]!==p[f]){if(u!==1||f!==1)do if(u--,f--,f<0||a[u]!==p[f]){var _=`\n`+a[u].replace(\" at new \",\" at \");return e.displayName&&_.includes(\"\")&&(_=_.replace(\"\",e.displayName)),typeof e==\"function\"&&k.set(e,_),_}while(u>=1&&f>=0);break}}}finally{V=!1,$.current=c,Le(),Error.prepareStackTrace=l}var j=e?e.displayName||e.name:\"\",N=j?S(j):\"\";return typeof e==\"function\"&&k.set(e,N),N}function Be(e,r,t){return ce(e,!1)}function Ge(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function D(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return ce(e,Ge(e));if(typeof e==\"string\")return S(e);switch(e){case I:return S(\"Suspense\");case W:return S(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case C:return Be(e.render);case O:return D(e.type,r,t);case Y:{var i=e,l=i._payload,c=i._init;try{return D(c(l),r,t)}catch{}}}return\"\"}var R=Object.prototype.hasOwnProperty,ue={},fe=x.ReactDebugCurrentFrame;function F(e){if(e){var r=e._owner,t=D(e.type,e._source,r?r.type:null);fe.setExtraStackFrame(t)}else fe.setExtraStackFrame(null)}function Ke(e,r,t,i,l){{var c=Function.call.bind(R);for(var d in e)if(c(e,d)){var a=void 0;try{if(typeof e[d]!=\"function\"){var p=Error((i||\"React class\")+\": \"+t+\" type `\"+d+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[d]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw p.name=\"Invariant Violation\",p}a=e[d](r,d,i,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(u){a=u}a&&!(a instanceof Error)&&(F(l),b(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",i||\"React class\",t,d,typeof a),F(null)),a instanceof Error&&!(a.message in ue)&&(ue[a.message]=!0,F(l),b(\"Failed %s type: %s\",t,a.message),F(null))}}}var Xe=Array.isArray;function L(e){return Xe(e)}function ze(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function qe(e){try{return me(e),!1}catch{return!0}}function me(e){return\"\"+e}function be(e){if(qe(e))return b(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",ze(e)),me(e)}var T=x.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},pe,he,U;U={};function Je(e){if(R.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(R.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&T.current&&r&&T.current.stateNode!==r){var t=g(T.current.type);U[t]||(b('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',g(T.current.type),e.ref),U[t]=!0)}}function er(e,r){{var t=function(){pe||(pe=!0,b(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){he||(he=!0,b(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var nr=function(e,r,t,i,l,c,d){var a={$$typeof:n,type:e,key:r,ref:t,props:d,_owner:c};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:i}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:l}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function tr(e,r,t,i,l){{var c,d={},a=null,p=null;t!==void 0&&(be(t),a=\"\"+t),Ze(r)&&(be(r.key),a=\"\"+r.key),Je(r)&&(p=r.ref,Qe(r,l));for(c in r)R.call(r,c)&&!He.hasOwnProperty(c)&&(d[c]=r[c]);if(e&&e.defaultProps){var u=e.defaultProps;for(c in u)d[c]===void 0&&(d[c]=u[c])}if(a||p){var f=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(d,f),p&&rr(d,f)}return nr(e,a,p,l,i,T.current,d)}}var B=x.ReactCurrentOwner,_e=x.ReactDebugCurrentFrame;function w(e){if(e){var r=e._owner,t=D(e.type,e._source,r?r.type:null);_e.setExtraStackFrame(t)}else _e.setExtraStackFrame(null)}var G;G=!1;function K(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===n}function ge(){{if(B.current){var e=g(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function or(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function ir(e){{var r=ge();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function ve(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=ir(r);if(ye[t])return;ye[t]=!0;var i=\"\";e&&e._owner&&e._owner!==B.current&&(i=\" It was passed a child from \"+g(e._owner.type)+\".\"),w(e),b('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,i),w(null)}}function Ee(e,r){{if(typeof e!=\"object\")return;if(L(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):u=typeof e,b(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",u,a)}var f=tr(e,r,t,l,c);if(f==null)return f;if(d){var _=r.children;if(_!==void 0)if(i)if(L(_)){for(var j=0;j<_.length;j++)Ee(_[j],e);Object.freeze&&Object.freeze(_)}else b(\"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\");else Ee(_,e)}if(R.call(r,\"key\")){var N=g(e),h=Object.keys(r).filter(function(ur){return ur!==\"key\"}),X=h.length>0?\"{key: someKey, \"+h.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Ne[N+X]){var cr=h.length>0?\"{\"+h.join(\": ..., \")+\": ...}\":\"{}\";b(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,X,N,cr,N),Ne[N+X]=!0}}return e===v?dr(f):ar(f),f}}var sr=lr;q.Fragment=v,q.jsxDEV=sr})()});var Te=z((Tr,Re)=>{\"use strict\";Re.exports=Pe()});var wr={};_r(wr,{default:()=>Nr,frontmatter:()=>vr});var o=gr(Te()),vr={title:\"Deploying Next.js Apps\",description:\"How to deploy your Next.js apps on Vercel.\",image:\"/writings/blog-post-3.jpg\",date:\"2024-10-09\"};function Ce(s){let n=Object.assign({p:\"p\",a:\"a\",strong:\"strong\",figure:\"figure\",pre:\"pre\",code:\"code\",span:\"span\"},s.components),{Callout:m}=n;return m||xr(\"Callout\",!0,\"8:1-12:11\"),(0,o.jsxDEV)(o.Fragment,{children:[(0,o.jsxDEV)(m,{children:(0,o.jsxDEV)(n.p,{children:[\"The text below is from the \",(0,o.jsxDEV)(n.a,{href:\"https://play.tailwindcss.com/uj1vGACRJA?layout=preview\",children:`Tailwind\nCSS`},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:30},this),` docs. I copied it\nhere to test the markdown styles. `,(0,o.jsxDEV)(n.strong,{children:\"Tailwind is awesome. You should use it.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:11,columnNumber:37},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:3},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.figure,{\"data-rehype-pretty-code-figure\":\"\",children:(0,o.jsxDEV)(n.pre,{style:{backgroundColor:\"#24292e\",color:\"#e1e4e8\"},tabIndex:\"0\",\"data-language\":\"html\",\"data-theme\":\"github-dark\",children:(0,o.jsxDEV)(n.code,{\"data-language\":\"html\",\"data-theme\":\"github-dark\",style:{display:\"grid\"},children:[(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\"<\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:117},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"article\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:158},this),(0,o.jsxDEV)(n.span,{style:{color:\"#B392F0\"},children:\" class\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:200},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\"=\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:241},this),(0,o.jsxDEV)(n.span,{style:{color:\"#9ECBFF\"},children:'\"prose\"'},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:277},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:319},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:98},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" <\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:2,columnNumber:20},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"h1\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:2,columnNumber:63},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">Garlic bread with cheese: What the science tells us\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:2,columnNumber:231},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:2,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" <\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:3,columnNumber:20},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"p\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:3,columnNumber:63},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:3,columnNumber:99},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:3,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" For years parents have espoused the health benefits of eating garlic bread\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:4,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:4,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" with cheese to their children, with the food earning such an iconic status\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:5,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:5,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" in our culture that kids will often dress up as warm, cheesy loaf for\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:6,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:6,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" Halloween.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:7,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:7,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" \"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:8,columnNumber:100},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" <\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:20},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"p\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:63},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:99},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" But a recent study shows that the celebrated appetizer may be linked to a\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:10,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:10,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" series of rabies cases springing up around the country.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:11,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:11,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" \"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:12,columnNumber:100},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:12,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\"\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:13,columnNumber:104},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:13,columnNumber:1},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:92},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:1},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:14,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.p,{children:[\"For more information about how to use the plugin and the features it includes, \",(0,o.jsxDEV)(n.a,{href:\"https://github.com/tailwindcss/typography/blob/master/README.md\",children:\"read the documentation\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:30,columnNumber:80},this),\".\"]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:30,columnNumber:1},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:1},this)}function Er(s={}){let{wrapper:n}=s.components||{};return n?(0,o.jsxDEV)(n,Object.assign({},s,{children:(0,o.jsxDEV)(Ce,s,void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\"},this)}),void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\"},this):Ce(s)}var Nr=Er;function xr(s,n,m){throw new Error(\"Expected \"+(n?\"component\":\"object\")+\" `\"+s+\"` to be defined: you likely forgot to import, pass, or provide it.\"+(m?\"\\nIt\\u2019s referenced in your code at `\"+m+\"` in `/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx`\":\"\"))}return yr(wr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" 40 | }, 41 | "_id": "writings/deploying-next-apps.mdx", 42 | "_raw": { 43 | "sourceFilePath": "writings/deploying-next-apps.mdx", 44 | "sourceFileName": "deploying-next-apps.mdx", 45 | "sourceFileDir": "writings", 46 | "contentType": "mdx", 47 | "flattenedPath": "writings/deploying-next-apps" 48 | }, 49 | "type": "Post", 50 | "slug": "/writings/deploying-next-apps", 51 | "slugAsParams": "deploying-next-apps" 52 | }, 53 | "documentHash": "1728496448475", 54 | "hasWarnings": false, 55 | "documentTypeName": "Post" 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /.contentlayer/.cache/v0.3.4/data-TDDJTZUP.json: -------------------------------------------------------------------------------- 1 | { 2 | "cacheItemsMap": {} 3 | } 4 | -------------------------------------------------------------------------------- /.contentlayer/generated/Post/_index.mjs: -------------------------------------------------------------------------------- 1 | // NOTE This file is auto-generated by Contentlayer 2 | 3 | import blog__deployingNextAppsMdx from './blog__deploying-next-apps.mdx.json' assert { type: 'json' } 4 | import blog__howToModifyMdx from './blog__how-to-modify.mdx.json' assert { type: 'json' } 5 | import blog__whyDevMdx from './blog__why-dev.mdx.json' assert { type: 'json' } 6 | 7 | export const allPosts = [blog__deployingNextAppsMdx, blog__howToModifyMdx, blog__whyDevMdx] 8 | -------------------------------------------------------------------------------- /.contentlayer/generated/Post/blog__deploying-next-apps.mdx.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Deploying Next.js Apps", 3 | "description": "How to deploy your Next.js apps on Vercel.", 4 | "date": "2024-10-09T00:00:00.000Z", 5 | "published": true, 6 | "image": "/writings/blog-post-3.jpg", 7 | "body": { 8 | "raw": "\n\n The text below is from the [Tailwind\n CSS](https://play.tailwindcss.com/uj1vGACRJA?layout=preview) docs. I copied it\n here to test the markdown styles. **Tailwind is awesome. You should use it.**\n\n\n```html\n
\n

Garlic bread with cheese: What the science tells us

\n

\n For years parents have espoused the health benefits of eating garlic bread\n with cheese to their children, with the food earning such an iconic status\n in our culture that kids will often dress up as warm, cheesy loaf for\n Halloween.\n

\n

\n But a recent study shows that the celebrated appetizer may be linked to a\n series of rabies cases springing up around the country.\n

\n
\n```\n\nFor more information about how to use the plugin and the features it includes, [read the documentation](https://github.com/tailwindcss/typography/blob/master/README.md).\n", 9 | "code": "var Component=(()=>{var dr=Object.create;var A=Object.defineProperty;var br=Object.getOwnPropertyDescriptor;var mr=Object.getOwnPropertyNames;var pr=Object.getPrototypeOf,hr=Object.prototype.hasOwnProperty;var z=(s,n)=>()=>(n||s((n={exports:{}}).exports,n),n.exports),_r=(s,n)=>{for(var b in n)A(s,b,{get:n[b],enumerable:!0})},xe=(s,n,b,v)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let y of mr(n))!hr.call(s,y)&&y!==b&&A(s,y,{get:()=>n[y],enumerable:!(v=br(n,y))||v.enumerable});return s};var gr=(s,n,b)=>(b=s!=null?dr(pr(s)):{},xe(n||!s||!s.__esModule?A(b,\"default\",{value:s,enumerable:!0}):b,s)),yr=s=>xe(A({},\"__esModule\",{value:!0}),s);var Pe=z((Rr,je)=>{je.exports=React});var Re=z(q=>{\"use strict\";(function(){\"use strict\";var s=Pe(),n=Symbol.for(\"react.element\"),b=Symbol.for(\"react.portal\"),v=Symbol.for(\"react.fragment\"),y=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),C=Symbol.for(\"react.forward_ref\"),I=Symbol.for(\"react.suspense\"),W=Symbol.for(\"react.suspense_list\"),O=Symbol.for(\"react.memo\"),Y=Symbol.for(\"react.lazy\"),Oe=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,Se=\"@@iterator\";function ke(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[Se];return typeof r==\"function\"?r:null}var x=s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function m(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),i=1;i=1&&d>=0&&a[f]!==p[d];)d--;for(;f>=1&&d>=0;f--,d--)if(a[f]!==p[d]){if(f!==1||d!==1)do if(f--,d--,d<0||a[f]!==p[d]){var _=`\n`+a[f].replace(\" at new \",\" at \");return e.displayName&&_.includes(\"\")&&(_=_.replace(\"\",e.displayName)),typeof e==\"function\"&&k.set(e,_),_}while(f>=1&&d>=0);break}}}finally{V=!1,$.current=u,Le(),Error.prepareStackTrace=l}var P=e?e.displayName||e.name:\"\",N=P?S(P):\"\";return typeof e==\"function\"&&k.set(e,N),N}function Be(e,r,t){return ue(e,!1)}function Ge(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function D(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return ue(e,Ge(e));if(typeof e==\"string\")return S(e);switch(e){case I:return S(\"Suspense\");case W:return S(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case C:return Be(e.render);case O:return D(e.type,r,t);case Y:{var i=e,l=i._payload,u=i._init;try{return D(u(l),r,t)}catch{}}}return\"\"}var w=Object.prototype.hasOwnProperty,fe={},de=x.ReactDebugCurrentFrame;function F(e){if(e){var r=e._owner,t=D(e.type,e._source,r?r.type:null);de.setExtraStackFrame(t)}else de.setExtraStackFrame(null)}function Ke(e,r,t,i,l){{var u=Function.call.bind(w);for(var c in e)if(u(e,c)){var a=void 0;try{if(typeof e[c]!=\"function\"){var p=Error((i||\"React class\")+\": \"+t+\" type `\"+c+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[c]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw p.name=\"Invariant Violation\",p}a=e[c](r,c,i,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(f){a=f}a&&!(a instanceof Error)&&(F(l),m(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",i||\"React class\",t,c,typeof a),F(null)),a instanceof Error&&!(a.message in fe)&&(fe[a.message]=!0,F(l),m(\"Failed %s type: %s\",t,a.message),F(null))}}}var Xe=Array.isArray;function L(e){return Xe(e)}function ze(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function qe(e){try{return be(e),!1}catch{return!0}}function be(e){return\"\"+e}function me(e){if(qe(e))return m(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",ze(e)),be(e)}var T=x.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},pe,he,U;U={};function Je(e){if(w.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(w.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&T.current&&r&&T.current.stateNode!==r){var t=g(T.current.type);U[t]||(m('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',g(T.current.type),e.ref),U[t]=!0)}}function er(e,r){{var t=function(){pe||(pe=!0,m(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){he||(he=!0,m(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var nr=function(e,r,t,i,l,u,c){var a={$$typeof:n,type:e,key:r,ref:t,props:c,_owner:u};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:i}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:l}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function tr(e,r,t,i,l){{var u,c={},a=null,p=null;t!==void 0&&(me(t),a=\"\"+t),Ze(r)&&(me(r.key),a=\"\"+r.key),Je(r)&&(p=r.ref,Qe(r,l));for(u in r)w.call(r,u)&&!He.hasOwnProperty(u)&&(c[u]=r[u]);if(e&&e.defaultProps){var f=e.defaultProps;for(u in f)c[u]===void 0&&(c[u]=f[u])}if(a||p){var d=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(c,d),p&&rr(c,d)}return nr(e,a,p,l,i,T.current,c)}}var B=x.ReactCurrentOwner,_e=x.ReactDebugCurrentFrame;function j(e){if(e){var r=e._owner,t=D(e.type,e._source,r?r.type:null);_e.setExtraStackFrame(t)}else _e.setExtraStackFrame(null)}var G;G=!1;function K(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===n}function ge(){{if(B.current){var e=g(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function or(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function ir(e){{var r=ge();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function ve(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=ir(r);if(ye[t])return;ye[t]=!0;var i=\"\";e&&e._owner&&e._owner!==B.current&&(i=\" It was passed a child from \"+g(e._owner.type)+\".\"),j(e),m('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,i),j(null)}}function Ee(e,r){{if(typeof e!=\"object\")return;if(L(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):f=typeof e,m(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",f,a)}var d=tr(e,r,t,l,u);if(d==null)return d;if(c){var _=r.children;if(_!==void 0)if(i)if(L(_)){for(var P=0;P<_.length;P++)Ee(_[P],e);Object.freeze&&Object.freeze(_)}else m(\"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\");else Ee(_,e)}if(w.call(r,\"key\")){var N=g(e),h=Object.keys(r).filter(function(fr){return fr!==\"key\"}),X=h.length>0?\"{key: someKey, \"+h.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Ne[N+X]){var ur=h.length>0?\"{\"+h.join(\": ..., \")+\": ...}\":\"{}\";m(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,X,N,ur,N),Ne[N+X]=!0}}return e===v?cr(d):ar(d),d}}var sr=lr;q.Fragment=v,q.jsxDEV=sr})()});var Te=z((Tr,we)=>{\"use strict\";we.exports=Re()});var jr={};_r(jr,{default:()=>Nr,frontmatter:()=>vr});var o=gr(Te()),vr={title:\"Deploying Next.js Apps\",description:\"How to deploy your Next.js apps on Vercel.\",image:\"/writings/blog-post-3.jpg\",date:\"2024-10-09\"};function Ce(s){let n=Object.assign({p:\"p\",a:\"a\",strong:\"strong\",figure:\"figure\",pre:\"pre\",code:\"code\",span:\"span\"},s.components),{Callout:b}=n;return b||xr(\"Callout\",!0,\"8:1-12:11\"),(0,o.jsxDEV)(o.Fragment,{children:[(0,o.jsxDEV)(b,{children:(0,o.jsxDEV)(n.p,{children:[\"The text below is from the \",(0,o.jsxDEV)(n.a,{href:\"https://play.tailwindcss.com/uj1vGACRJA?layout=preview\",children:`Tailwind\nCSS`},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:9,columnNumber:30},this),` docs. I copied it\nhere to test the markdown styles. `,(0,o.jsxDEV)(n.strong,{children:\"Tailwind is awesome. You should use it.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:11,columnNumber:37},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:9,columnNumber:3},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.figure,{\"data-rehype-pretty-code-figure\":\"\",children:(0,o.jsxDEV)(n.pre,{style:{backgroundColor:\"#24292e\",color:\"#e1e4e8\"},tabIndex:\"0\",\"data-language\":\"html\",\"data-theme\":\"github-dark\",children:(0,o.jsxDEV)(n.code,{\"data-language\":\"html\",\"data-theme\":\"github-dark\",style:{display:\"grid\"},children:[(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\"<\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:117},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"article\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:158},this),(0,o.jsxDEV)(n.span,{style:{color:\"#B392F0\"},children:\" class\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:200},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\"=\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:241},this),(0,o.jsxDEV)(n.span,{style:{color:\"#9ECBFF\"},children:'\"prose\"'},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:277},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:319},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:98},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" <\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:2,columnNumber:20},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"h1\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:2,columnNumber:63},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">Garlic bread with cheese: What the science tells us\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:2,columnNumber:231},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:2,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" <\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:3,columnNumber:20},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"p\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:3,columnNumber:63},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:3,columnNumber:99},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:3,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" For years parents have espoused the health benefits of eating garlic bread\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:4,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:4,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" with cheese to their children, with the food earning such an iconic status\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:5,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:5,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" in our culture that kids will often dress up as warm, cheesy loaf for\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:6,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:6,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" Halloween.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:7,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:7,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" \"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:8,columnNumber:100},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" <\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:9,columnNumber:20},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"p\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:9,columnNumber:63},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:9,columnNumber:99},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:9,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" But a recent study shows that the celebrated appetizer may be linked to a\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:10,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:10,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" series of rabies cases springing up around the country.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:11,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:11,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" \"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:12,columnNumber:100},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:12,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\"\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:13,columnNumber:104},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:13,columnNumber:1},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:92},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:1},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:14,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.p,{children:[\"For more information about how to use the plugin and the features it includes, \",(0,o.jsxDEV)(n.a,{href:\"https://github.com/tailwindcss/typography/blob/master/README.md\",children:\"read the documentation\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:30,columnNumber:80},this),\".\"]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:30,columnNumber:1},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\",lineNumber:1,columnNumber:1},this)}function Er(s={}){let{wrapper:n}=s.components||{};return n?(0,o.jsxDEV)(n,Object.assign({},s,{children:(0,o.jsxDEV)(Ce,s,void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\"},this)}),void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx\"},this):Ce(s)}var Nr=Er;function xr(s,n,b){throw new Error(\"Expected \"+(n?\"component\":\"object\")+\" `\"+s+\"` to be defined: you likely forgot to import, pass, or provide it.\"+(b?\"\\nIt\\u2019s referenced in your code at `\"+b+\"` in `/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-c4b14c41-14b9-4cce-a706-5f8bf0cbbcf4.mdx`\":\"\"))}return yr(jr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" 10 | }, 11 | "_id": "blog/deploying-next-apps.mdx", 12 | "_raw": { 13 | "sourceFilePath": "blog/deploying-next-apps.mdx", 14 | "sourceFileName": "deploying-next-apps.mdx", 15 | "sourceFileDir": "blog", 16 | "contentType": "mdx", 17 | "flattenedPath": "blog/deploying-next-apps" 18 | }, 19 | "type": "Post", 20 | "slug": "/blog/deploying-next-apps", 21 | "slugAsParams": "deploying-next-apps" 22 | } -------------------------------------------------------------------------------- /.contentlayer/generated/Post/blog__index.mdx.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "My Portfolio", 3 | "description": "Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.", 4 | "date": "2023-10-01T00:00:00.000Z", 5 | "published": true, 6 | "image": "https://source.unsplash.com/800x600/?portfolio", 7 | "body": { 8 | "raw": "", 9 | "code": "var Component=(()=>{var dr=Object.create;var I=Object.defineProperty;var vr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,gr=Object.prototype.hasOwnProperty;var q=(s,l)=>()=>(l||s((l={exports:{}}).exports,l),l.exports),hr=(s,l)=>{for(var g in l)I(s,g,{get:l[g],enumerable:!0})},Te=(s,l,g,y)=>{if(l&&typeof l==\"object\"||typeof l==\"function\")for(let m of pr(l))!gr.call(s,m)&&m!==g&&I(s,m,{get:()=>l[m],enumerable:!(y=vr(l,m))||y.enumerable});return s};var mr=(s,l,g)=>(g=s!=null?dr(br(s)):{},Te(l||!s||!s.__esModule?I(g,\"default\",{value:s,enumerable:!0}):g,s)),yr=s=>Te(I({},\"__esModule\",{value:!0}),s);var Pe=q((Pr,Ce)=>{Ce.exports=React});var Oe=q(z=>{\"use strict\";(function(){\"use strict\";var s=Pe(),l=Symbol.for(\"react.element\"),g=Symbol.for(\"react.portal\"),y=Symbol.for(\"react.fragment\"),m=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),j=Symbol.for(\"react.forward_ref\"),W=Symbol.for(\"react.suspense\"),Y=Symbol.for(\"react.suspense_list\"),x=Symbol.for(\"react.memo\"),$=Symbol.for(\"react.lazy\"),xe=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,ke=\"@@iterator\";function De(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[ke];return typeof r==\"function\"?r:null}var R=s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function d(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n=1&&c>=0&&a[f]!==v[c];)c--;for(;f>=1&&c>=0;f--,c--)if(a[f]!==v[c]){if(f!==1||c!==1)do if(f--,c--,c<0||a[f]!==v[c]){var b=`\n`+a[f].replace(\" at new \",\" at \");return e.displayName&&b.includes(\"\")&&(b=b.replace(\"\",e.displayName)),typeof e==\"function\"&&D.set(e,b),b}while(f>=1&&c>=0);break}}}finally{N=!1,M.current=u,Le(),Error.prepareStackTrace=i}var C=e?e.displayName||e.name:\"\",_=C?k(C):\"\";return typeof e==\"function\"&&D.set(e,_),_}function Be(e,r,t){return fe(e,!1)}function Ke(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function F(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return fe(e,Ke(e));if(typeof e==\"string\")return k(e);switch(e){case W:return k(\"Suspense\");case Y:return k(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case j:return Be(e.render);case x:return F(e.type,r,t);case $:{var n=e,i=n._payload,u=n._init;try{return F(u(i),r,t)}catch{}}}return\"\"}var w=Object.prototype.hasOwnProperty,ce={},de=R.ReactDebugCurrentFrame;function A(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);de.setExtraStackFrame(t)}else de.setExtraStackFrame(null)}function Xe(e,r,t,n,i){{var u=Function.call.bind(w);for(var o in e)if(u(e,o)){var a=void 0;try{if(typeof e[o]!=\"function\"){var v=Error((n||\"React class\")+\": \"+t+\" type `\"+o+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[o]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw v.name=\"Invariant Violation\",v}a=e[o](r,o,n,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(f){a=f}a&&!(a instanceof Error)&&(A(i),d(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",n||\"React class\",t,o,typeof a),A(null)),a instanceof Error&&!(a.message in ce)&&(ce[a.message]=!0,A(i),d(\"Failed %s type: %s\",t,a.message),A(null))}}}var Ge=Array.isArray;function L(e){return Ge(e)}function qe(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function ze(e){try{return ve(e),!1}catch{return!0}}function ve(e){return\"\"+e}function pe(e){if(ze(e))return d(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",qe(e)),ve(e)}var S=R.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},be,ge,U;U={};function Je(e){if(w.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(w.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&S.current&&r&&S.current.stateNode!==r){var t=h(S.current.type);U[t]||(d('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',h(S.current.type),e.ref),U[t]=!0)}}function er(e,r){{var t=function(){be||(be=!0,d(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){ge||(ge=!0,d(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var tr=function(e,r,t,n,i,u,o){var a={$$typeof:l,type:e,key:r,ref:t,props:o,_owner:u};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:n}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:i}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function nr(e,r,t,n,i){{var u,o={},a=null,v=null;t!==void 0&&(pe(t),a=\"\"+t),Ze(r)&&(pe(r.key),a=\"\"+r.key),Je(r)&&(v=r.ref,Qe(r,i));for(u in r)w.call(r,u)&&!He.hasOwnProperty(u)&&(o[u]=r[u]);if(e&&e.defaultProps){var f=e.defaultProps;for(u in f)o[u]===void 0&&(o[u]=f[u])}if(a||v){var c=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(o,c),v&&rr(o,c)}return tr(e,a,v,i,n,S.current,o)}}var B=R.ReactCurrentOwner,he=R.ReactDebugCurrentFrame;function T(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);he.setExtraStackFrame(t)}else he.setExtraStackFrame(null)}var K;K=!1;function X(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===l}function me(){{if(B.current){var e=h(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function ar(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function or(e){{var r=me();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function Ee(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=or(r);if(ye[t])return;ye[t]=!0;var n=\"\";e&&e._owner&&e._owner!==B.current&&(n=\" It was passed a child from \"+h(e._owner.type)+\".\"),T(e),d('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,n),T(null)}}function _e(e,r){{if(typeof e!=\"object\")return;if(L(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):f=typeof e,d(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",f,a)}var c=nr(e,r,t,i,u);if(c==null)return c;if(o){var b=r.children;if(b!==void 0)if(n)if(L(b)){for(var C=0;C0?\"{key: someKey, \"+p.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Re[_+G]){var fr=p.length>0?\"{\"+p.join(\": ..., \")+\": ...}\":\"{}\";d(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,G,_,fr,_),Re[_+G]=!0}}return e===y?ur(c):ir(c),c}}var lr=sr;z.Fragment=y,z.jsxDEV=lr})()});var Se=q((wr,we)=>{\"use strict\";we.exports=Oe()});var Tr={};hr(Tr,{default:()=>Rr,frontmatter:()=>Er});var P=mr(Se()),Er={title:\"My Portfolio\",description:\"Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\",date:\"2023-10-01\",image:\"https://source.unsplash.com/800x600/?portfolio\"};function je(s){return(0,P.jsxDEV)(P.Fragment,{},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/_mdx_bundler_entry_point-bd0f121c-8bd8-4ee5-b503-7932869da9c9.mdx\",lineNumber:1,columnNumber:1},this)}function _r(s={}){let{wrapper:l}=s.components||{};return l?(0,P.jsxDEV)(l,Object.assign({},s,{children:(0,P.jsxDEV)(je,s,void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/_mdx_bundler_entry_point-bd0f121c-8bd8-4ee5-b503-7932869da9c9.mdx\"},this)}),void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/_mdx_bundler_entry_point-bd0f121c-8bd8-4ee5-b503-7932869da9c9.mdx\"},this):je(s)}var Rr=_r;return yr(Tr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" 10 | }, 11 | "_id": "blog/index.mdx", 12 | "_raw": { 13 | "sourceFilePath": "blog/index.mdx", 14 | "sourceFileName": "index.mdx", 15 | "sourceFileDir": "blog", 16 | "contentType": "mdx", 17 | "flattenedPath": "blog" 18 | }, 19 | "type": "Post", 20 | "slug": "/blog", 21 | "slugAsParams": "" 22 | } -------------------------------------------------------------------------------- /.contentlayer/generated/Post/blog__why-dev.mdx.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "My Portfolio", 3 | "description": "Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.", 4 | "date": "2024-10-09T00:00:00.000Z", 5 | "published": true, 6 | "image": "/writings/blog-post-2.jpg", 7 | "body": { 8 | "raw": "\n# My Portfolio\n\nWelcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\n", 9 | "code": "var Component=(()=>{var dr=Object.create;var N=Object.defineProperty;var vr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,mr=Object.prototype.hasOwnProperty;var q=(l,u)=>()=>(u||l((u={exports:{}}).exports,u),u.exports),gr=(l,u)=>{for(var m in u)N(l,m,{get:u[m],enumerable:!0})},Te=(l,u,m,_)=>{if(u&&typeof u==\"object\"||typeof u==\"function\")for(let y of pr(u))!mr.call(l,y)&&y!==m&&N(l,y,{get:()=>u[y],enumerable:!(_=vr(u,y))||_.enumerable});return l};var hr=(l,u,m)=>(m=l!=null?dr(br(l)):{},Te(u||!l||!l.__esModule?N(m,\"default\",{value:l,enumerable:!0}):m,l)),yr=l=>Te(N({},\"__esModule\",{value:!0}),l);var je=q((jr,Pe)=>{Pe.exports=React});var Ce=q(z=>{\"use strict\";(function(){\"use strict\";var l=je(),u=Symbol.for(\"react.element\"),m=Symbol.for(\"react.portal\"),_=Symbol.for(\"react.fragment\"),y=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),S=Symbol.for(\"react.forward_ref\"),I=Symbol.for(\"react.suspense\"),W=Symbol.for(\"react.suspense_list\"),x=Symbol.for(\"react.memo\"),Y=Symbol.for(\"react.lazy\"),xe=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,ke=\"@@iterator\";function De(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[ke];return typeof r==\"function\"?r:null}var T=l.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function d(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n=1&&c>=0&&a[f]!==v[c];)c--;for(;f>=1&&c>=0;f--,c--)if(a[f]!==v[c]){if(f!==1||c!==1)do if(f--,c--,c<0||a[f]!==v[c]){var b=`\n`+a[f].replace(\" at new \",\" at \");return e.displayName&&b.includes(\"\")&&(b=b.replace(\"\",e.displayName)),typeof e==\"function\"&&D.set(e,b),b}while(f>=1&&c>=0);break}}}finally{V=!1,$.current=s,Le(),Error.prepareStackTrace=i}var j=e?e.displayName||e.name:\"\",R=j?k(j):\"\";return typeof e==\"function\"&&D.set(e,R),R}function Be(e,r,t){return fe(e,!1)}function Ke(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function F(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return fe(e,Ke(e));if(typeof e==\"string\")return k(e);switch(e){case I:return k(\"Suspense\");case W:return k(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case S:return Be(e.render);case x:return F(e.type,r,t);case Y:{var n=e,i=n._payload,s=n._init;try{return F(s(i),r,t)}catch{}}}return\"\"}var O=Object.prototype.hasOwnProperty,ce={},de=T.ReactDebugCurrentFrame;function A(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);de.setExtraStackFrame(t)}else de.setExtraStackFrame(null)}function Xe(e,r,t,n,i){{var s=Function.call.bind(O);for(var o in e)if(s(e,o)){var a=void 0;try{if(typeof e[o]!=\"function\"){var v=Error((n||\"React class\")+\": \"+t+\" type `\"+o+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[o]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw v.name=\"Invariant Violation\",v}a=e[o](r,o,n,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(f){a=f}a&&!(a instanceof Error)&&(A(i),d(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",n||\"React class\",t,o,typeof a),A(null)),a instanceof Error&&!(a.message in ce)&&(ce[a.message]=!0,A(i),d(\"Failed %s type: %s\",t,a.message),A(null))}}}var Ge=Array.isArray;function L(e){return Ge(e)}function qe(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function ze(e){try{return ve(e),!1}catch{return!0}}function ve(e){return\"\"+e}function pe(e){if(ze(e))return d(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",qe(e)),ve(e)}var w=T.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},be,me,U;U={};function Je(e){if(O.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(O.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&w.current&&r&&w.current.stateNode!==r){var t=g(w.current.type);U[t]||(d('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',g(w.current.type),e.ref),U[t]=!0)}}function er(e,r){{var t=function(){be||(be=!0,d(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){me||(me=!0,d(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var tr=function(e,r,t,n,i,s,o){var a={$$typeof:u,type:e,key:r,ref:t,props:o,_owner:s};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:n}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:i}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function nr(e,r,t,n,i){{var s,o={},a=null,v=null;t!==void 0&&(pe(t),a=\"\"+t),Ze(r)&&(pe(r.key),a=\"\"+r.key),Je(r)&&(v=r.ref,Qe(r,i));for(s in r)O.call(r,s)&&!He.hasOwnProperty(s)&&(o[s]=r[s]);if(e&&e.defaultProps){var f=e.defaultProps;for(s in f)o[s]===void 0&&(o[s]=f[s])}if(a||v){var c=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(o,c),v&&rr(o,c)}return tr(e,a,v,i,n,w.current,o)}}var B=T.ReactCurrentOwner,ge=T.ReactDebugCurrentFrame;function P(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);ge.setExtraStackFrame(t)}else ge.setExtraStackFrame(null)}var K;K=!1;function X(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===u}function he(){{if(B.current){var e=g(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function ar(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function or(e){{var r=he();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function _e(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=or(r);if(ye[t])return;ye[t]=!0;var n=\"\";e&&e._owner&&e._owner!==B.current&&(n=\" It was passed a child from \"+g(e._owner.type)+\".\"),P(e),d('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,n),P(null)}}function Ee(e,r){{if(typeof e!=\"object\")return;if(L(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):f=typeof e,d(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",f,a)}var c=nr(e,r,t,i,s);if(c==null)return c;if(o){var b=r.children;if(b!==void 0)if(n)if(L(b)){for(var j=0;j0?\"{key: someKey, \"+p.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Re[R+G]){var fr=p.length>0?\"{\"+p.join(\": ..., \")+\": ...}\":\"{}\";d(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,G,R,fr,R),Re[R+G]=!0}}return e===_?ur(c):ir(c),c}}var lr=sr;z.Fragment=_,z.jsxDEV=lr})()});var we=q((Or,Oe)=>{\"use strict\";Oe.exports=Ce()});var Tr={};gr(Tr,{default:()=>Rr,frontmatter:()=>_r});var h=hr(we()),_r={title:\"My Portfolio\",description:\"Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\",date:\"2024-10-09\",image:\"/writings/blog-post-2.jpg\"};function Se(l){let u=Object.assign({h1:\"h1\",a:\"a\",span:\"span\",p:\"p\"},l.components);return(0,h.jsxDEV)(h.Fragment,{children:[(0,h.jsxDEV)(u.h1,{id:\"my-portfolio\",children:[(0,h.jsxDEV)(u.a,{className:\"subheading-anchor\",\"aria-label\":\"Link to section\",href:\"#my-portfolio\",children:(0,h.jsxDEV)(u.span,{className:\"icon icon-link\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-22ffd402-89ae-4242-a2b0-549b69892c59.mdx\"},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-22ffd402-89ae-4242-a2b0-549b69892c59.mdx\"},this),\"My Portfolio\"]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-22ffd402-89ae-4242-a2b0-549b69892c59.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,h.jsxDEV)(u.p,{children:\"Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-22ffd402-89ae-4242-a2b0-549b69892c59.mdx\",lineNumber:10,columnNumber:1},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-22ffd402-89ae-4242-a2b0-549b69892c59.mdx\",lineNumber:1,columnNumber:1},this)}function Er(l={}){let{wrapper:u}=l.components||{};return u?(0,h.jsxDEV)(u,Object.assign({},l,{children:(0,h.jsxDEV)(Se,l,void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-22ffd402-89ae-4242-a2b0-549b69892c59.mdx\"},this)}),void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/blog/_mdx_bundler_entry_point-22ffd402-89ae-4242-a2b0-549b69892c59.mdx\"},this):Se(l)}var Rr=Er;return yr(Tr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" 10 | }, 11 | "_id": "blog/why-dev.mdx", 12 | "_raw": { 13 | "sourceFilePath": "blog/why-dev.mdx", 14 | "sourceFileName": "why-dev.mdx", 15 | "sourceFileDir": "blog", 16 | "contentType": "mdx", 17 | "flattenedPath": "blog/why-dev" 18 | }, 19 | "type": "Post", 20 | "slug": "/blog/why-dev", 21 | "slugAsParams": "why-dev" 22 | } -------------------------------------------------------------------------------- /.contentlayer/generated/Post/writings__deploying-next-apps.mdx.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Deploying Next.js Apps", 3 | "description": "How to deploy your Next.js apps on Vercel.", 4 | "date": "2024-10-09T00:00:00.000Z", 5 | "published": true, 6 | "image": "/writings/blog-post-3.jpg", 7 | "body": { 8 | "raw": "\n\n The text below is from the [Tailwind\n CSS](https://play.tailwindcss.com/uj1vGACRJA?layout=preview) docs. I copied it\n here to test the markdown styles. **Tailwind is awesome. You should use it.**\n\n\n```html\n
\n

Garlic bread with cheese: What the science tells us

\n

\n For years parents have espoused the health benefits of eating garlic bread\n with cheese to their children, with the food earning such an iconic status\n in our culture that kids will often dress up as warm, cheesy loaf for\n Halloween.\n

\n

\n But a recent study shows that the celebrated appetizer may be linked to a\n series of rabies cases springing up around the country.\n

\n
\n```\n\nFor more information about how to use the plugin and the features it includes, [read the documentation](https://github.com/tailwindcss/typography/blob/master/README.md).\n", 9 | "code": "var Component=(()=>{var fr=Object.create;var A=Object.defineProperty;var mr=Object.getOwnPropertyDescriptor;var br=Object.getOwnPropertyNames;var pr=Object.getPrototypeOf,hr=Object.prototype.hasOwnProperty;var z=(s,n)=>()=>(n||s((n={exports:{}}).exports,n),n.exports),_r=(s,n)=>{for(var m in n)A(s,m,{get:n[m],enumerable:!0})},xe=(s,n,m,v)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let y of br(n))!hr.call(s,y)&&y!==m&&A(s,y,{get:()=>n[y],enumerable:!(v=mr(n,y))||v.enumerable});return s};var gr=(s,n,m)=>(m=s!=null?fr(pr(s)):{},xe(n||!s||!s.__esModule?A(m,\"default\",{value:s,enumerable:!0}):m,s)),yr=s=>xe(A({},\"__esModule\",{value:!0}),s);var je=z((Pr,we)=>{we.exports=React});var Pe=z(q=>{\"use strict\";(function(){\"use strict\";var s=je(),n=Symbol.for(\"react.element\"),m=Symbol.for(\"react.portal\"),v=Symbol.for(\"react.fragment\"),y=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),C=Symbol.for(\"react.forward_ref\"),I=Symbol.for(\"react.suspense\"),W=Symbol.for(\"react.suspense_list\"),O=Symbol.for(\"react.memo\"),Y=Symbol.for(\"react.lazy\"),Oe=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,Se=\"@@iterator\";function ke(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[Se];return typeof r==\"function\"?r:null}var x=s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function b(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),i=1;i=1&&f>=0&&a[u]!==p[f];)f--;for(;u>=1&&f>=0;u--,f--)if(a[u]!==p[f]){if(u!==1||f!==1)do if(u--,f--,f<0||a[u]!==p[f]){var _=`\n`+a[u].replace(\" at new \",\" at \");return e.displayName&&_.includes(\"\")&&(_=_.replace(\"\",e.displayName)),typeof e==\"function\"&&k.set(e,_),_}while(u>=1&&f>=0);break}}}finally{V=!1,$.current=c,Le(),Error.prepareStackTrace=l}var j=e?e.displayName||e.name:\"\",N=j?S(j):\"\";return typeof e==\"function\"&&k.set(e,N),N}function Be(e,r,t){return ce(e,!1)}function Ge(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function D(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return ce(e,Ge(e));if(typeof e==\"string\")return S(e);switch(e){case I:return S(\"Suspense\");case W:return S(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case C:return Be(e.render);case O:return D(e.type,r,t);case Y:{var i=e,l=i._payload,c=i._init;try{return D(c(l),r,t)}catch{}}}return\"\"}var R=Object.prototype.hasOwnProperty,ue={},fe=x.ReactDebugCurrentFrame;function F(e){if(e){var r=e._owner,t=D(e.type,e._source,r?r.type:null);fe.setExtraStackFrame(t)}else fe.setExtraStackFrame(null)}function Ke(e,r,t,i,l){{var c=Function.call.bind(R);for(var d in e)if(c(e,d)){var a=void 0;try{if(typeof e[d]!=\"function\"){var p=Error((i||\"React class\")+\": \"+t+\" type `\"+d+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[d]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw p.name=\"Invariant Violation\",p}a=e[d](r,d,i,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(u){a=u}a&&!(a instanceof Error)&&(F(l),b(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",i||\"React class\",t,d,typeof a),F(null)),a instanceof Error&&!(a.message in ue)&&(ue[a.message]=!0,F(l),b(\"Failed %s type: %s\",t,a.message),F(null))}}}var Xe=Array.isArray;function L(e){return Xe(e)}function ze(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function qe(e){try{return me(e),!1}catch{return!0}}function me(e){return\"\"+e}function be(e){if(qe(e))return b(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",ze(e)),me(e)}var T=x.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},pe,he,U;U={};function Je(e){if(R.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(R.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&T.current&&r&&T.current.stateNode!==r){var t=g(T.current.type);U[t]||(b('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',g(T.current.type),e.ref),U[t]=!0)}}function er(e,r){{var t=function(){pe||(pe=!0,b(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){he||(he=!0,b(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var nr=function(e,r,t,i,l,c,d){var a={$$typeof:n,type:e,key:r,ref:t,props:d,_owner:c};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:i}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:l}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function tr(e,r,t,i,l){{var c,d={},a=null,p=null;t!==void 0&&(be(t),a=\"\"+t),Ze(r)&&(be(r.key),a=\"\"+r.key),Je(r)&&(p=r.ref,Qe(r,l));for(c in r)R.call(r,c)&&!He.hasOwnProperty(c)&&(d[c]=r[c]);if(e&&e.defaultProps){var u=e.defaultProps;for(c in u)d[c]===void 0&&(d[c]=u[c])}if(a||p){var f=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(d,f),p&&rr(d,f)}return nr(e,a,p,l,i,T.current,d)}}var B=x.ReactCurrentOwner,_e=x.ReactDebugCurrentFrame;function w(e){if(e){var r=e._owner,t=D(e.type,e._source,r?r.type:null);_e.setExtraStackFrame(t)}else _e.setExtraStackFrame(null)}var G;G=!1;function K(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===n}function ge(){{if(B.current){var e=g(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function or(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function ir(e){{var r=ge();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function ve(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=ir(r);if(ye[t])return;ye[t]=!0;var i=\"\";e&&e._owner&&e._owner!==B.current&&(i=\" It was passed a child from \"+g(e._owner.type)+\".\"),w(e),b('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,i),w(null)}}function Ee(e,r){{if(typeof e!=\"object\")return;if(L(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):u=typeof e,b(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",u,a)}var f=tr(e,r,t,l,c);if(f==null)return f;if(d){var _=r.children;if(_!==void 0)if(i)if(L(_)){for(var j=0;j<_.length;j++)Ee(_[j],e);Object.freeze&&Object.freeze(_)}else b(\"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\");else Ee(_,e)}if(R.call(r,\"key\")){var N=g(e),h=Object.keys(r).filter(function(ur){return ur!==\"key\"}),X=h.length>0?\"{key: someKey, \"+h.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Ne[N+X]){var cr=h.length>0?\"{\"+h.join(\": ..., \")+\": ...}\":\"{}\";b(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,X,N,cr,N),Ne[N+X]=!0}}return e===v?dr(f):ar(f),f}}var sr=lr;q.Fragment=v,q.jsxDEV=sr})()});var Te=z((Tr,Re)=>{\"use strict\";Re.exports=Pe()});var wr={};_r(wr,{default:()=>Nr,frontmatter:()=>vr});var o=gr(Te()),vr={title:\"Deploying Next.js Apps\",description:\"How to deploy your Next.js apps on Vercel.\",image:\"/writings/blog-post-3.jpg\",date:\"2024-10-09\"};function Ce(s){let n=Object.assign({p:\"p\",a:\"a\",strong:\"strong\",figure:\"figure\",pre:\"pre\",code:\"code\",span:\"span\"},s.components),{Callout:m}=n;return m||xr(\"Callout\",!0,\"8:1-12:11\"),(0,o.jsxDEV)(o.Fragment,{children:[(0,o.jsxDEV)(m,{children:(0,o.jsxDEV)(n.p,{children:[\"The text below is from the \",(0,o.jsxDEV)(n.a,{href:\"https://play.tailwindcss.com/uj1vGACRJA?layout=preview\",children:`Tailwind\nCSS`},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:30},this),` docs. I copied it\nhere to test the markdown styles. `,(0,o.jsxDEV)(n.strong,{children:\"Tailwind is awesome. You should use it.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:11,columnNumber:37},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:3},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.figure,{\"data-rehype-pretty-code-figure\":\"\",children:(0,o.jsxDEV)(n.pre,{style:{backgroundColor:\"#24292e\",color:\"#e1e4e8\"},tabIndex:\"0\",\"data-language\":\"html\",\"data-theme\":\"github-dark\",children:(0,o.jsxDEV)(n.code,{\"data-language\":\"html\",\"data-theme\":\"github-dark\",style:{display:\"grid\"},children:[(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\"<\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:117},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"article\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:158},this),(0,o.jsxDEV)(n.span,{style:{color:\"#B392F0\"},children:\" class\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:200},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\"=\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:241},this),(0,o.jsxDEV)(n.span,{style:{color:\"#9ECBFF\"},children:'\"prose\"'},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:277},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:319},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:98},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" <\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:2,columnNumber:20},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"h1\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:2,columnNumber:63},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">Garlic bread with cheese: What the science tells us\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:2,columnNumber:231},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:2,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" <\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:3,columnNumber:20},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"p\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:3,columnNumber:63},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:3,columnNumber:99},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:3,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" For years parents have espoused the health benefits of eating garlic bread\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:4,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:4,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" with cheese to their children, with the food earning such an iconic status\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:5,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:5,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" in our culture that kids will often dress up as warm, cheesy loaf for\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:6,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:6,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" Halloween.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:7,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:7,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" \"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:8,columnNumber:100},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" <\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:20},this),(0,o.jsxDEV)(n.span,{style:{color:\"#85E89D\"},children:\"p\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:63},this),(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\">\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:99},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:9,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" But a recent study shows that the celebrated appetizer may be linked to a\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:10,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:10,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" series of rabies cases springing up around the country.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:11,columnNumber:20},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:11,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\" \"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:12,columnNumber:100},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:12,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.span,{\"data-line\":\"\",children:[(0,o.jsxDEV)(n.span,{style:{color:\"#E1E4E8\"},children:\"\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:13,columnNumber:104},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:13,columnNumber:1},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:92},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:1},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:14,columnNumber:1},this),`\n`,(0,o.jsxDEV)(n.p,{children:[\"For more information about how to use the plugin and the features it includes, \",(0,o.jsxDEV)(n.a,{href:\"https://github.com/tailwindcss/typography/blob/master/README.md\",children:\"read the documentation\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:30,columnNumber:80},this),\".\"]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:30,columnNumber:1},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\",lineNumber:1,columnNumber:1},this)}function Er(s={}){let{wrapper:n}=s.components||{};return n?(0,o.jsxDEV)(n,Object.assign({},s,{children:(0,o.jsxDEV)(Ce,s,void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\"},this)}),void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx\"},this):Ce(s)}var Nr=Er;function xr(s,n,m){throw new Error(\"Expected \"+(n?\"component\":\"object\")+\" `\"+s+\"` to be defined: you likely forgot to import, pass, or provide it.\"+(m?\"\\nIt\\u2019s referenced in your code at `\"+m+\"` in `/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-9b0092a4-d9cf-4fe9-aa2d-65d7c68d60c1.mdx`\":\"\"))}return yr(wr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" 10 | }, 11 | "_id": "writings/deploying-next-apps.mdx", 12 | "_raw": { 13 | "sourceFilePath": "writings/deploying-next-apps.mdx", 14 | "sourceFileName": "deploying-next-apps.mdx", 15 | "sourceFileDir": "writings", 16 | "contentType": "mdx", 17 | "flattenedPath": "writings/deploying-next-apps" 18 | }, 19 | "type": "Post", 20 | "slug": "/writings/deploying-next-apps", 21 | "slugAsParams": "deploying-next-apps" 22 | } -------------------------------------------------------------------------------- /.contentlayer/generated/Post/writings__why-dev.mdx.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "My Portfolio", 3 | "description": "Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.", 4 | "date": "2023-10-01T00:00:00.000Z", 5 | "published": true, 6 | "image": "/writings/blog-post-2.jpg", 7 | "body": { 8 | "raw": "\n# My Portfolio\n\nWelcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\n", 9 | "code": "var Component=(()=>{var dr=Object.create;var N=Object.defineProperty;var vr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,mr=Object.prototype.hasOwnProperty;var q=(l,u)=>()=>(u||l((u={exports:{}}).exports,u),u.exports),gr=(l,u)=>{for(var m in u)N(l,m,{get:u[m],enumerable:!0})},Te=(l,u,m,_)=>{if(u&&typeof u==\"object\"||typeof u==\"function\")for(let y of pr(u))!mr.call(l,y)&&y!==m&&N(l,y,{get:()=>u[y],enumerable:!(_=vr(u,y))||_.enumerable});return l};var hr=(l,u,m)=>(m=l!=null?dr(br(l)):{},Te(u||!l||!l.__esModule?N(m,\"default\",{value:l,enumerable:!0}):m,l)),yr=l=>Te(N({},\"__esModule\",{value:!0}),l);var Pe=q((Pr,we)=>{we.exports=React});var je=q(z=>{\"use strict\";(function(){\"use strict\";var l=Pe(),u=Symbol.for(\"react.element\"),m=Symbol.for(\"react.portal\"),_=Symbol.for(\"react.fragment\"),y=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),S=Symbol.for(\"react.forward_ref\"),I=Symbol.for(\"react.suspense\"),W=Symbol.for(\"react.suspense_list\"),x=Symbol.for(\"react.memo\"),Y=Symbol.for(\"react.lazy\"),xe=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,ke=\"@@iterator\";function De(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[ke];return typeof r==\"function\"?r:null}var T=l.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function d(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n=1&&c>=0&&a[f]!==v[c];)c--;for(;f>=1&&c>=0;f--,c--)if(a[f]!==v[c]){if(f!==1||c!==1)do if(f--,c--,c<0||a[f]!==v[c]){var b=`\n`+a[f].replace(\" at new \",\" at \");return e.displayName&&b.includes(\"\")&&(b=b.replace(\"\",e.displayName)),typeof e==\"function\"&&D.set(e,b),b}while(f>=1&&c>=0);break}}}finally{V=!1,$.current=s,Le(),Error.prepareStackTrace=i}var P=e?e.displayName||e.name:\"\",R=P?k(P):\"\";return typeof e==\"function\"&&D.set(e,R),R}function Be(e,r,t){return fe(e,!1)}function Ke(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function F(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return fe(e,Ke(e));if(typeof e==\"string\")return k(e);switch(e){case I:return k(\"Suspense\");case W:return k(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case S:return Be(e.render);case x:return F(e.type,r,t);case Y:{var n=e,i=n._payload,s=n._init;try{return F(s(i),r,t)}catch{}}}return\"\"}var C=Object.prototype.hasOwnProperty,ce={},de=T.ReactDebugCurrentFrame;function A(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);de.setExtraStackFrame(t)}else de.setExtraStackFrame(null)}function Xe(e,r,t,n,i){{var s=Function.call.bind(C);for(var o in e)if(s(e,o)){var a=void 0;try{if(typeof e[o]!=\"function\"){var v=Error((n||\"React class\")+\": \"+t+\" type `\"+o+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[o]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw v.name=\"Invariant Violation\",v}a=e[o](r,o,n,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(f){a=f}a&&!(a instanceof Error)&&(A(i),d(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",n||\"React class\",t,o,typeof a),A(null)),a instanceof Error&&!(a.message in ce)&&(ce[a.message]=!0,A(i),d(\"Failed %s type: %s\",t,a.message),A(null))}}}var Ge=Array.isArray;function L(e){return Ge(e)}function qe(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function ze(e){try{return ve(e),!1}catch{return!0}}function ve(e){return\"\"+e}function pe(e){if(ze(e))return d(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",qe(e)),ve(e)}var O=T.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},be,me,U;U={};function Je(e){if(C.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(C.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&O.current&&r&&O.current.stateNode!==r){var t=g(O.current.type);U[t]||(d('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',g(O.current.type),e.ref),U[t]=!0)}}function er(e,r){{var t=function(){be||(be=!0,d(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){me||(me=!0,d(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var tr=function(e,r,t,n,i,s,o){var a={$$typeof:u,type:e,key:r,ref:t,props:o,_owner:s};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:n}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:i}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function nr(e,r,t,n,i){{var s,o={},a=null,v=null;t!==void 0&&(pe(t),a=\"\"+t),Ze(r)&&(pe(r.key),a=\"\"+r.key),Je(r)&&(v=r.ref,Qe(r,i));for(s in r)C.call(r,s)&&!He.hasOwnProperty(s)&&(o[s]=r[s]);if(e&&e.defaultProps){var f=e.defaultProps;for(s in f)o[s]===void 0&&(o[s]=f[s])}if(a||v){var c=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(o,c),v&&rr(o,c)}return tr(e,a,v,i,n,O.current,o)}}var B=T.ReactCurrentOwner,ge=T.ReactDebugCurrentFrame;function w(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);ge.setExtraStackFrame(t)}else ge.setExtraStackFrame(null)}var K;K=!1;function X(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===u}function he(){{if(B.current){var e=g(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function ar(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function or(e){{var r=he();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function _e(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=or(r);if(ye[t])return;ye[t]=!0;var n=\"\";e&&e._owner&&e._owner!==B.current&&(n=\" It was passed a child from \"+g(e._owner.type)+\".\"),w(e),d('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,n),w(null)}}function Ee(e,r){{if(typeof e!=\"object\")return;if(L(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):f=typeof e,d(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",f,a)}var c=nr(e,r,t,i,s);if(c==null)return c;if(o){var b=r.children;if(b!==void 0)if(n)if(L(b)){for(var P=0;P0?\"{key: someKey, \"+p.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Re[R+G]){var fr=p.length>0?\"{\"+p.join(\": ..., \")+\": ...}\":\"{}\";d(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,G,R,fr,R),Re[R+G]=!0}}return e===_?ur(c):ir(c),c}}var lr=sr;z.Fragment=_,z.jsxDEV=lr})()});var Oe=q((Cr,Ce)=>{\"use strict\";Ce.exports=je()});var Tr={};gr(Tr,{default:()=>Rr,frontmatter:()=>_r});var h=hr(Oe()),_r={title:\"My Portfolio\",description:\"Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\",date:\"2023-10-01\",image:\"/writings/blog-post-2.jpg\"};function Se(l){let u=Object.assign({h1:\"h1\",a:\"a\",span:\"span\",p:\"p\"},l.components);return(0,h.jsxDEV)(h.Fragment,{children:[(0,h.jsxDEV)(u.h1,{id:\"my-portfolio\",children:[(0,h.jsxDEV)(u.a,{className:\"subheading-anchor\",\"aria-label\":\"Link to section\",href:\"#my-portfolio\",children:(0,h.jsxDEV)(u.span,{className:\"icon icon-link\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\"},this)},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\"},this),\"My Portfolio\"]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,h.jsxDEV)(u.p,{children:\"Welcome to my professional portfolio. Here you can find my projects, blog posts, and more about me.\"},void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\",lineNumber:10,columnNumber:1},this)]},void 0,!0,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\",lineNumber:1,columnNumber:1},this)}function Er(l={}){let{wrapper:u}=l.components||{};return u?(0,h.jsxDEV)(u,Object.assign({},l,{children:(0,h.jsxDEV)(Se,l,void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\"},this)}),void 0,!1,{fileName:\"/home/bossadi/Projects/ground/portfolio-template/content/writings/_mdx_bundler_entry_point-54865eff-6fee-4213-9c4a-22b829325b2e.mdx\"},this):Se(l)}var Rr=Er;return yr(Tr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" 10 | }, 11 | "_id": "writings/why-dev.mdx", 12 | "_raw": { 13 | "sourceFilePath": "writings/why-dev.mdx", 14 | "sourceFileName": "why-dev.mdx", 15 | "sourceFileDir": "writings", 16 | "contentType": "mdx", 17 | "flattenedPath": "writings/why-dev" 18 | }, 19 | "type": "Post", 20 | "slug": "/writings/why-dev", 21 | "slugAsParams": "why-dev" 22 | } -------------------------------------------------------------------------------- /.contentlayer/generated/index.d.ts: -------------------------------------------------------------------------------- 1 | // NOTE This file is auto-generated by Contentlayer 2 | 3 | import { Post, DocumentTypes, DataExports } from './types' 4 | import { SourceProvideSchemaErrorJSON, SourceFetchDataErrorJSON } from 'contentlayer/core' 5 | 6 | export * from './types' 7 | 8 | export declare const allPosts: Post[] 9 | 10 | export declare const allDocuments: DocumentTypes[] 11 | 12 | 13 | -------------------------------------------------------------------------------- /.contentlayer/generated/index.mjs: -------------------------------------------------------------------------------- 1 | // NOTE This file is auto-generated by Contentlayer 2 | 3 | export { isType } from 'contentlayer/client' 4 | 5 | // NOTE During development Contentlayer imports from `.mjs` files to improve HMR speeds. 6 | // During (production) builds Contentlayer it imports from `.json` files to improve build performance. 7 | import { allPosts } from './Post/_index.mjs' 8 | 9 | export { allPosts } 10 | 11 | export const allDocuments = [...allPosts] 12 | 13 | 14 | -------------------------------------------------------------------------------- /.contentlayer/generated/types.d.ts: -------------------------------------------------------------------------------- 1 | // NOTE This file is auto-generated by Contentlayer 2 | 3 | import type { Markdown, MDX, ImageFieldData, IsoDateTimeString } from 'contentlayer/core' 4 | import * as Local from 'contentlayer/source-files' 5 | 6 | export { isType } from 'contentlayer/client' 7 | 8 | export type { Markdown, MDX, ImageFieldData, IsoDateTimeString } 9 | 10 | /** Document types */ 11 | export type Post = { 12 | /** File path relative to `contentDirPath` */ 13 | _id: string 14 | _raw: Local.RawDocumentData 15 | type: 'Post' 16 | title: string 17 | description?: string | undefined 18 | date: IsoDateTimeString 19 | published: boolean 20 | image: string 21 | /** MDX file body */ 22 | body: MDX 23 | slug: string 24 | slugAsParams: string 25 | } 26 | 27 | /** Nested types */ 28 | 29 | 30 | /** Helper types */ 31 | 32 | export type AllTypes = DocumentTypes | NestedTypes 33 | export type AllTypeNames = DocumentTypeNames | NestedTypeNames 34 | 35 | export type DocumentTypes = Post 36 | export type DocumentTypeNames = 'Post' 37 | 38 | export type NestedTypes = never 39 | export type NestedTypeNames = never 40 | 41 | export type DataExports = { 42 | allDocuments: DocumentTypes[] 43 | allPosts: Post[] 44 | } 45 | 46 | 47 | export interface ContentlayerGenTypes { 48 | documentTypes: DocumentTypes 49 | documentTypeMap: DocumentTypeMap 50 | documentTypeNames: DocumentTypeNames 51 | nestedTypes: NestedTypes 52 | nestedTypeMap: NestedTypeMap 53 | nestedTypeNames: NestedTypeNames 54 | allTypeNames: AllTypeNames 55 | dataExports: DataExports 56 | } 57 | 58 | declare global { 59 | interface ContentlayerGen extends ContentlayerGenTypes {} 60 | } 61 | 62 | export type DocumentTypeMap = { 63 | Post: Post 64 | } 65 | 66 | export type NestedTypeMap = { 67 | 68 | } 69 | 70 | -------------------------------------------------------------------------------- /.contentlayer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dot-contentlayer", 3 | "description": "This package is auto-generated by Contentlayer", 4 | "version": "0.0.0-3UMWJPNX", 5 | "exports": { 6 | "./generated": { 7 | "import": "./generated/index.mjs" 8 | } 9 | }, 10 | "typesVersions": { 11 | "*": { 12 | "generated": [ 13 | "./generated" 14 | ] 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals"] 3 | } 4 | -------------------------------------------------------------------------------- /.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 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # contentlayer 35 | .contentlayer 36 | 37 | # typescript 38 | *.tsbuildinfo 39 | next-env.d.ts 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![screencapture-portfolio-stater-vercel-app-2024-10-14-07_31_30](https://github.com/user-attachments/assets/7b0e308e-f61b-46f9-b3d6-401f253152b3) 2 | 3 | Creating a portfolio today can feel like a daunting task. It’s not just about making something that looks good — it has to reflect who you are as a developer. And once you get into the details, like integrating blog posts using markdown, showcasing your projects, and finding ways to make it stand out, the complexity starts to pile up. 4 | 5 | There are countless tutorials out there on how to create a portfolio, but no matter how many you watch, the real challenge is building something that truly represents you. 6 | 7 | What if you could focus on the design without the headache of setting up markdown and worrying about the technical details? Well, that’s exactly what this portfolio starter kit is for. 8 | 9 | Built with Next.js and powered by Contentlayer for seamless markdown processing and type safety, this starter kit lets you focus on what matters most — designing your perfect portfolio. 10 | 11 | Check out the repo and give it a star if you like it. It’s time to build a portfolio that works for you! 12 | -------------------------------------------------------------------------------- /app/blog/[slug]/page.tsx: -------------------------------------------------------------------------------- 1 | import { Metadata } from "next"; 2 | import Image from "next/image"; 3 | import Link from "next/link"; 4 | import { notFound } from "next/navigation"; 5 | 6 | import { allPosts } from "contentlayer/generated"; 7 | 8 | import { Mdx } from "@/components/mdx/mdx"; 9 | import { Icons } from "@/components/shared/icons"; 10 | import { buttonVariants } from "@/components/ui/button"; 11 | import { siteConfig } from "@/config/site"; 12 | import { absoluteUrl, cn, formatDate } from "@/lib/utils"; 13 | import "@/styles/mdx.css"; 14 | 15 | interface PostPageProps { 16 | params: { 17 | slug: string; 18 | }; 19 | } 20 | 21 | async function getPostFromParams({ params }: PostPageProps) { 22 | const post = allPosts.find((post) => post.slugAsParams === params.slug); 23 | 24 | if (!post) { 25 | return null; 26 | } 27 | 28 | return post; 29 | } 30 | 31 | export async function generateMetadata({ 32 | params, 33 | }: PostPageProps): Promise { 34 | const post = await getPostFromParams({ params }); 35 | 36 | if (!post) { 37 | return {}; 38 | } 39 | 40 | return { 41 | title: post.title, 42 | description: post.description, 43 | openGraph: { 44 | title: post.title, 45 | description: post.description, 46 | type: "article", 47 | url: absoluteUrl(post.slug), 48 | images: [ 49 | { 50 | url: siteConfig.ogImage, 51 | width: 1200, 52 | height: 630, 53 | alt: siteConfig.title, 54 | }, 55 | ], 56 | }, 57 | twitter: { 58 | card: "summary_large_image", 59 | title: post.title, 60 | description: post.description, 61 | images: [siteConfig.ogImage], 62 | creator: "@bossadizenith", 63 | }, 64 | }; 65 | } 66 | export default async function PostPage({ params }: PostPageProps) { 67 | const post = await getPostFromParams({ params }); 68 | 69 | if (!post) { 70 | return notFound(); 71 | } 72 | 73 | return ( 74 |
75 |
76 | {post.date && ( 77 | 83 | )} 84 |

85 | {post.title} 86 |

87 |
88 | {post.image && ( 89 | {post.title} 97 | )} 98 | 99 |
100 | ); 101 | } 102 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-env/portfolio-stater/8284233fc6c443feaaf5841e3a7245b177edd85a/app/favicon.ico -------------------------------------------------------------------------------- /app/fonts/GeistMonoVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-env/portfolio-stater/8284233fc6c443feaaf5841e3a7245b177edd85a/app/fonts/GeistMonoVF.woff -------------------------------------------------------------------------------- /app/fonts/GeistVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-env/portfolio-stater/8284233fc6c443feaaf5841e3a7245b177edd85a/app/fonts/GeistVF.woff -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | :root { 7 | --background: 0 0% 100%; 8 | --foreground: 0 0% 3.9%; 9 | --card: 0 0% 100%; 10 | --card-foreground: 0 0% 3.9%; 11 | --popover: 0 0% 100%; 12 | --popover-foreground: 0 0% 3.9%; 13 | --primary: 0 0% 9%; 14 | --primary-foreground: 0 0% 98%; 15 | --secondary: 0 0% 96.1%; 16 | --secondary-foreground: 0 0% 9%; 17 | --muted: 0 0% 96.1%; 18 | --muted-foreground: 0 0% 45.1%; 19 | --accent: 0 0% 96.1%; 20 | --accent-foreground: 0 0% 9%; 21 | --destructive: 0 84.2% 60.2%; 22 | --destructive-foreground: 0 0% 98%; 23 | --border: 0 0% 89.8%; 24 | --input: 0 0% 89.8%; 25 | --ring: 0 0% 3.9%; 26 | --radius: 0.5rem; 27 | --chart-1: 12 76% 61%; 28 | --chart-2: 173 58% 39%; 29 | --chart-3: 197 37% 24%; 30 | --chart-4: 43 74% 66%; 31 | --chart-5: 27 87% 67%; 32 | } 33 | 34 | .dark { 35 | --background: 0 0% 3.9%; 36 | --foreground: 0 0% 98%; 37 | --card: 0 0% 3.9%; 38 | --card-foreground: 0 0% 98%; 39 | --popover: 0 0% 3.9%; 40 | --popover-foreground: 0 0% 98%; 41 | --primary: 0 0% 98%; 42 | --primary-foreground: 0 0% 9%; 43 | --secondary: 0 0% 14.9%; 44 | --secondary-foreground: 0 0% 98%; 45 | --muted: 0 0% 14.9%; 46 | --muted-foreground: 0 0% 63.9%; 47 | --accent: 0 0% 14.9%; 48 | --accent-foreground: 0 0% 98%; 49 | --destructive: 0 62.8% 30.6%; 50 | --destructive-foreground: 0 0% 98%; 51 | --border: 0 0% 14.9%; 52 | --input: 0 0% 14.9%; 53 | --ring: 0 0% 83.1%; 54 | --chart-1: 220 70% 50%; 55 | --chart-2: 160 60% 45%; 56 | --chart-3: 30 80% 55%; 57 | --chart-4: 280 65% 60%; 58 | --chart-5: 340 75% 55%; 59 | } 60 | } 61 | 62 | @layer base { 63 | * { 64 | @apply border-border; 65 | } 66 | body { 67 | @apply bg-background text-foreground; 68 | font-feature-settings: "rlig" 1, "calt" 1; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import localFont from "next/font/local"; 3 | import "./globals.css"; 4 | import { ThemeProvider } from "@/providers/theme"; 5 | 6 | const geistSans = localFont({ 7 | src: "./fonts/GeistVF.woff", 8 | variable: "--font-geist-sans", 9 | weight: "100 900", 10 | }); 11 | const geistMono = localFont({ 12 | src: "./fonts/GeistMonoVF.woff", 13 | variable: "--font-geist-mono", 14 | weight: "100 900", 15 | }); 16 | 17 | export const metadata: Metadata = { 18 | title: "Create Next App", 19 | description: "Generated by create next app", 20 | }; 21 | 22 | export default function RootLayout({ 23 | children, 24 | }: Readonly<{ 25 | children: React.ReactNode; 26 | }>) { 27 | return ( 28 | 29 | 32 | 33 | {children} 34 | 35 | 36 | 37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import { allPosts } from "contentlayer/generated"; 2 | import { compareDesc } from "date-fns"; 3 | import Image from "next/image"; 4 | import Link from "next/link"; 5 | 6 | import { formatDate } from "@/lib/utils"; 7 | import { ModeToggle } from "@/components/shared/mode-toogle"; 8 | 9 | export const metadata = { 10 | title: "Blog", 11 | }; 12 | 13 | export default async function BlogPage() { 14 | const posts = allPosts 15 | .filter((post) => post.published) 16 | .sort((a, b) => { 17 | return compareDesc(new Date(a.date), new Date(b.date)); 18 | }); 19 | 20 | return ( 21 |
22 |
23 |
24 |
25 |

26 | Blog 27 |

28 | 29 |
30 |

31 | A blog built using Contentlayer. Posts are written in MDX. 32 |

33 |
34 |
35 |
36 | {posts?.length ? ( 37 |
38 | {posts.map((post, index) => ( 39 |
43 | {post.image && ( 44 | {post.title} 52 | )} 53 |

{post.title}

54 | {post.description && ( 55 |

56 | {post.description} 57 |

58 | )} 59 | {post.date && ( 60 |

61 | {formatDate(post.date)} 62 |

63 | )} 64 | 65 | View Article 66 | 67 |
68 | ))} 69 |
70 | ) : ( 71 |

No posts published.

72 | )} 73 |
74 | ); 75 | } 76 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /components/mdx/callout.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils"; 2 | 3 | interface CalloutProps { 4 | icon?: string; 5 | children?: React.ReactNode; 6 | type?: "default" | "warning" | "danger"; 7 | } 8 | 9 | export function Callout({ 10 | children, 11 | icon, 12 | type = "default", 13 | ...props 14 | }: CalloutProps) { 15 | return ( 16 |
23 | {icon && {icon}} 24 |
{children}
25 |
26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /components/mdx/card.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | 3 | import { cn } from "@/lib/utils"; 4 | 5 | interface CardProps extends React.HTMLAttributes { 6 | href?: string; 7 | disabled?: boolean; 8 | } 9 | 10 | export function MdxCard({ 11 | href, 12 | className, 13 | children, 14 | disabled, 15 | ...props 16 | }: CardProps) { 17 | return ( 18 |
26 |
27 |
28 | {children} 29 |
30 |
31 | {href && ( 32 | 33 | View 34 | 35 | )} 36 |
37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /components/mdx/mdx.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import Image from "next/image"; 3 | import { useMDXComponent } from "next-contentlayer/hooks"; 4 | 5 | import { cn } from "@/lib/utils"; 6 | import { Callout } from "@/components/mdx/callout"; 7 | import { MdxCard } from "@/components/mdx/card"; 8 | 9 | const components = { 10 | h1: ({ className, ...props }: React.HTMLAttributes) => ( 11 |

18 | ), 19 | h2: ({ className, ...props }: React.HTMLAttributes) => ( 20 |

27 | ), 28 | h3: ({ className, ...props }: React.HTMLAttributes) => ( 29 |

36 | ), 37 | h4: ({ className, ...props }: React.HTMLAttributes) => ( 38 |

45 | ), 46 | h5: ({ className, ...props }: React.HTMLAttributes) => ( 47 |
54 | ), 55 | h6: ({ className, ...props }: React.HTMLAttributes) => ( 56 |
63 | ), 64 | a: ({ className, ...props }: React.HTMLAttributes) => ( 65 | 74 | ), 75 | p: ({ className, ...props }: React.HTMLAttributes) => ( 76 |

80 | ), 81 | ul: ({ className, ...props }: React.HTMLAttributes) => ( 82 |

    83 | ), 84 | ol: ({ className, ...props }: React.HTMLAttributes) => ( 85 |
      86 | ), 87 | li: ({ className, ...props }: React.HTMLAttributes) => ( 88 |
    1. 89 | ), 90 | blockquote: ({ className, ...props }: React.HTMLAttributes) => ( 91 |
      95 | ), 96 | img: ({ 97 | className, 98 | alt, 99 | ...props 100 | }: React.ImgHTMLAttributes) => ( 101 | // eslint-disable-next-line @next/next/no-img-element 102 | {alt} 103 | ), 104 | hr: ({ ...props }: React.HTMLAttributes) => ( 105 |
      106 | ), 107 | table: ({ className, ...props }: React.HTMLAttributes) => ( 108 |
      109 | 110 | 111 | ), 112 | tr: ({ className, ...props }: React.HTMLAttributes) => ( 113 | 117 | ), 118 | th: ({ className, ...props }: { className?: string; [key: string]: any }) => ( 119 |
      126 | ), 127 | td: ({ className, ...props }: { className?: string; [key: string]: any }) => ( 128 | 135 | ), 136 | pre: ({ 137 | className, 138 | ...props 139 | }: { 140 | className?: string; 141 | [key: string]: any; 142 | }) => ( 143 |
      150 |   ),
      151 |   code: ({
      152 |     className,
      153 |     ...props
      154 |   }: {
      155 |     className?: string;
      156 |     [key: string]: any;
      157 |   }) => (
      158 |     
      165 |   ),
      166 |   Image,
      167 |   Callout,
      168 |   Card: MdxCard,
      169 | };
      170 | 
      171 | interface MdxProps {
      172 |   code: string;
      173 | }
      174 | 
      175 | export function Mdx({ code }: MdxProps) {
      176 |   const Component = useMDXComponent(code);
      177 | 
      178 |   return (
      179 |     
      180 | 181 |
      182 | ); 183 | } 184 | -------------------------------------------------------------------------------- /components/mdx/page-header.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils"; 2 | 3 | interface DocsPageHeaderProps extends React.HTMLAttributes { 4 | heading: string; 5 | text?: string; 6 | } 7 | 8 | export function DocsPageHeader({ 9 | heading, 10 | text, 11 | className, 12 | ...props 13 | }: DocsPageHeaderProps) { 14 | return ( 15 | <> 16 |
      17 |

      18 | {heading} 19 |

      20 | {text &&

      {text}

      } 21 |
      22 |
      23 | 24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /components/mdx/pager.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import { Post } from "contentlayer/generated"; 3 | 4 | import { docsConfig } from "@/config/blogs"; 5 | import { cn } from "@/lib/utils"; 6 | import { buttonVariants } from "@/components/ui/button"; 7 | import { Icons } from "@/components/shared/icons"; 8 | 9 | interface DocsPagerProps { 10 | doc: Post; 11 | } 12 | 13 | export function DocsPager({ doc }: DocsPagerProps) { 14 | const pager = getPagerForDoc(doc); 15 | 16 | if (!pager) { 17 | return null; 18 | } 19 | 20 | return ( 21 |
      22 | {pager?.prev && ( 23 | 27 | 28 | {pager.prev.title} 29 | 30 | )} 31 | {pager?.next && ( 32 | 36 | {pager.next.title} 37 | 38 | 39 | )} 40 |
      41 | ); 42 | } 43 | 44 | export function getPagerForDoc(doc: Post) { 45 | const flattenedLinks = [null, ...flatten(docsConfig.sidebarNav), null]; 46 | const activeIndex = flattenedLinks.findIndex( 47 | (link) => doc.slug === link?.href 48 | ); 49 | const prev = activeIndex !== 0 ? flattenedLinks[activeIndex - 1] : null; 50 | const next = 51 | activeIndex !== flattenedLinks.length - 1 52 | ? flattenedLinks[activeIndex + 1] 53 | : null; 54 | return { 55 | prev, 56 | next, 57 | }; 58 | } 59 | 60 | interface Link { 61 | href?: string; 62 | title?: string; 63 | items?: Link[]; 64 | } 65 | 66 | export function flatten(links: Link[]): Link[] { 67 | return links.reduce((flat: Link[], link: Link) => { 68 | return flat.concat(link.items ? flatten(link.items) : link); 69 | }, []); 70 | } 71 | -------------------------------------------------------------------------------- /components/shared/icons.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | AlertTriangle, 3 | ArrowRight, 4 | Check, 5 | ChevronLeft, 6 | ChevronRight, 7 | Command, 8 | CreditCard, 9 | File, 10 | FileText, 11 | HelpCircle, 12 | Image, 13 | Laptop, 14 | Loader2, 15 | LucideIcon, 16 | LucideProps, 17 | Moon, 18 | MoreVertical, 19 | Pizza, 20 | Plus, 21 | Settings, 22 | SunMedium, 23 | Trash, 24 | Twitter, 25 | User, 26 | X, 27 | } from "lucide-react"; 28 | 29 | export type Icon = LucideIcon; 30 | 31 | export const Icons = { 32 | logo: Command, 33 | close: X, 34 | spinner: Loader2, 35 | chevronLeft: ChevronLeft, 36 | chevronRight: ChevronRight, 37 | trash: Trash, 38 | post: FileText, 39 | page: File, 40 | media: Image, 41 | settings: Settings, 42 | billing: CreditCard, 43 | ellipsis: MoreVertical, 44 | add: Plus, 45 | warning: AlertTriangle, 46 | user: User, 47 | arrowRight: ArrowRight, 48 | help: HelpCircle, 49 | pizza: Pizza, 50 | sun: SunMedium, 51 | moon: Moon, 52 | laptop: Laptop, 53 | gitHub: ({ ...props }: LucideProps) => ( 54 | 69 | ), 70 | twitter: Twitter, 71 | check: Check, 72 | }; 73 | -------------------------------------------------------------------------------- /components/shared/mode-toogle.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { Moon, Sun } from "lucide-react"; 4 | import { useTheme } from "next-themes"; 5 | import * as React from "react"; 6 | 7 | import { cn } from "@/lib/utils"; 8 | 9 | export function ModeToggle() { 10 | const [isMounted, setIsMounted] = React.useState(false); 11 | 12 | React.useEffect(() => { 13 | setIsMounted(true); 14 | }, []); 15 | 16 | const { setTheme, resolvedTheme: userTheme } = useTheme(); 17 | 18 | if (!isMounted) return
      ; 19 | 20 | const themes = [ 21 | { 22 | name: "light", 23 | icon: Sun, 24 | }, 25 | { 26 | name: "dark", 27 | icon: Moon, 28 | }, 29 | ]; 30 | 31 | return ( 32 | 44 | ); 45 | } 46 | -------------------------------------------------------------------------------- /components/ui/button.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { Slot } from "@radix-ui/react-slot" 3 | import { cva, type VariantProps } from "class-variance-authority" 4 | 5 | import { cn } from "@/lib/utils" 6 | 7 | const buttonVariants = cva( 8 | "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", 9 | { 10 | variants: { 11 | variant: { 12 | default: 13 | "bg-primary text-primary-foreground shadow hover:bg-primary/90", 14 | destructive: 15 | "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", 16 | outline: 17 | "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", 18 | secondary: 19 | "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", 20 | ghost: "hover:bg-accent hover:text-accent-foreground", 21 | link: "text-primary underline-offset-4 hover:underline", 22 | }, 23 | size: { 24 | default: "h-9 px-4 py-2", 25 | sm: "h-8 rounded-md px-3 text-xs", 26 | lg: "h-10 rounded-md px-8", 27 | icon: "h-9 w-9", 28 | }, 29 | }, 30 | defaultVariants: { 31 | variant: "default", 32 | size: "default", 33 | }, 34 | } 35 | ) 36 | 37 | export interface ButtonProps 38 | extends React.ButtonHTMLAttributes, 39 | VariantProps { 40 | asChild?: boolean 41 | } 42 | 43 | const Button = React.forwardRef( 44 | ({ className, variant, size, asChild = false, ...props }, ref) => { 45 | const Comp = asChild ? Slot : "button" 46 | return ( 47 | 52 | ) 53 | } 54 | ) 55 | Button.displayName = "Button" 56 | 57 | export { Button, buttonVariants } 58 | -------------------------------------------------------------------------------- /components/ui/form.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as LabelPrimitive from "@radix-ui/react-label" 5 | import { Slot } from "@radix-ui/react-slot" 6 | import { 7 | Controller, 8 | ControllerProps, 9 | FieldPath, 10 | FieldValues, 11 | FormProvider, 12 | useFormContext, 13 | } from "react-hook-form" 14 | 15 | import { cn } from "@/lib/utils" 16 | import { Label } from "@/components/ui/label" 17 | 18 | const Form = FormProvider 19 | 20 | type FormFieldContextValue< 21 | TFieldValues extends FieldValues = FieldValues, 22 | TName extends FieldPath = FieldPath 23 | > = { 24 | name: TName 25 | } 26 | 27 | const FormFieldContext = React.createContext( 28 | {} as FormFieldContextValue 29 | ) 30 | 31 | const FormField = < 32 | TFieldValues extends FieldValues = FieldValues, 33 | TName extends FieldPath = FieldPath 34 | >({ 35 | ...props 36 | }: ControllerProps) => { 37 | return ( 38 | 39 | 40 | 41 | ) 42 | } 43 | 44 | const useFormField = () => { 45 | const fieldContext = React.useContext(FormFieldContext) 46 | const itemContext = React.useContext(FormItemContext) 47 | const { getFieldState, formState } = useFormContext() 48 | 49 | const fieldState = getFieldState(fieldContext.name, formState) 50 | 51 | if (!fieldContext) { 52 | throw new Error("useFormField should be used within ") 53 | } 54 | 55 | const { id } = itemContext 56 | 57 | return { 58 | id, 59 | name: fieldContext.name, 60 | formItemId: `${id}-form-item`, 61 | formDescriptionId: `${id}-form-item-description`, 62 | formMessageId: `${id}-form-item-message`, 63 | ...fieldState, 64 | } 65 | } 66 | 67 | type FormItemContextValue = { 68 | id: string 69 | } 70 | 71 | const FormItemContext = React.createContext( 72 | {} as FormItemContextValue 73 | ) 74 | 75 | const FormItem = React.forwardRef< 76 | HTMLDivElement, 77 | React.HTMLAttributes 78 | >(({ className, ...props }, ref) => { 79 | const id = React.useId() 80 | 81 | return ( 82 | 83 |
      84 | 85 | ) 86 | }) 87 | FormItem.displayName = "FormItem" 88 | 89 | const FormLabel = React.forwardRef< 90 | React.ElementRef, 91 | React.ComponentPropsWithoutRef 92 | >(({ className, ...props }, ref) => { 93 | const { error, formItemId } = useFormField() 94 | 95 | return ( 96 |