From 9496deea93f7da4f213a73e5b6990e3b6d3c6ee2 Mon Sep 17 00:00:00 2001 From: waalge Date: Mon, 7 Aug 2023 14:57:16 +0000 Subject: [PATCH] Add blog --- README.md | 4 +- content/css/custom.css | 34 - content/css/default.css | 141 --- content/css/main.css | 56 + content/css/mini.css | 2 +- content/css/normalize.css | 349 ------ content/css/terminal.css | 994 ------------------ content/css/terminal.min.css | 1 - .../{posts => drafts}/unpicking-aiken-air.md | 0 content/index.html | 0 content/index.md | 3 + content/posts/are-we-zk-cardano-yet.md | 109 ++ content/posts/are-we-zk-cardano-yet.md.bak | 108 ++ kompact-landing.cabal | 1 + site.hs | 53 +- templates/archive.html | 2 - templates/blog.html | 12 + templates/default.html | 12 +- templates/index.html | 30 + templates/nav.html | 21 +- templates/post-list.html | 19 +- templates/post.html | 29 +- 22 files changed, 392 insertions(+), 1588 deletions(-) delete mode 100644 content/css/custom.css delete mode 100644 content/css/default.css delete mode 100644 content/css/normalize.css delete mode 100644 content/css/terminal.css delete mode 100644 content/css/terminal.min.css rename content/{posts => drafts}/unpicking-aiken-air.md (100%) delete mode 100644 content/index.html create mode 100644 content/index.md create mode 100644 content/posts/are-we-zk-cardano-yet.md create mode 100644 content/posts/are-we-zk-cardano-yet.md.bak delete mode 100644 templates/archive.html create mode 100644 templates/blog.html create mode 100644 templates/index.html diff --git a/README.md b/README.md index e3513c6..534c152 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ recompile css ```sh -tailwindcss -i ./content/css/main.css -o ./content/css/mini.css --minify + tailwindcss -i ./content/css/main.css -o ./content/css/mini.css --minify ``` build, serve and watch ```sh -cabal run site -- watch + cabal run site -- watch ``` diff --git a/content/css/custom.css b/content/css/custom.css deleted file mode 100644 index 385ce1b..0000000 --- a/content/css/custom.css +++ /dev/null @@ -1,34 +0,0 @@ -.components-flex { - display: flex; - gap: 1.4em; - flex-direction: row; - align-items: center; - justify-content: center; -} - -.components-grid { - display: grid; - grid-column-gap: 1.4em; - grid-template-columns: auto; - grid-template-rows: auto; - align-items: center; - justify-content: center; -} - -.image-grid { - display: grid; - grid-template-rows: auto; - display: grid; - grid-gap: 1em; - grid-template-rows: auto; - grid-template-columns: repeat( - auto-fit, - minmax(calc(var(--page-width) / 12), 1fr) - ); -} - -@media only screen and (min-width: 45em) { - .components-grid { - grid-template-columns: 3fr 9fr; - } -} diff --git a/content/css/default.css b/content/css/default.css deleted file mode 100644 index 381ff73..0000000 --- a/content/css/default.css +++ /dev/null @@ -1,141 +0,0 @@ -html { - font-size: 62.5%; -} - -body { - font-size: 1.6rem; - color: #000; -} - -header { - border-bottom: 0.2rem solid #000; -} - -nav { - text-align: right; -} - -nav a { - font-size: 1.8rem; - font-weight: bold; - color: black; - text-decoration: none; - text-transform: uppercase; -} - -footer { - margin-top: 3rem; - padding: 1.2rem 0; - border-top: 0.2rem solid #000; - font-size: 1.2rem; - color: #555; -} - -h1 { - font-size: 2.4rem; -} - -h2 { - font-size: 2rem; -} - -article .header { - font-size: 1.4rem; - font-style: italic; - color: #555; -} - -.logo a { - font-weight: bold; - color: #000; - text-decoration: none; -} - -@media (max-width: 319px) { - body { - width: 90%; - margin: 0; - padding: 0 5%; - } - header { - margin: 4.2rem 0; - } - nav { - margin: 0 auto 3rem; - text-align: center; - } - footer { - text-align: center; - } - .logo { - text-align: center; - margin: 1rem auto 3rem; - } - .logo a { - font-size: 2.4rem; - } - nav a { - display: block; - line-height: 1.6; - } -} - -@media (min-width: 320px) { - body { - width: 90%; - margin: 0; - padding: 0 5%; - } - header { - margin: 4.2rem 0; - } - nav { - margin: 0 auto 3rem; - text-align: center; - } - footer { - text-align: center; - } - .logo { - text-align: center; - margin: 1rem auto 3rem; - } - .logo a { - font-size: 2.4rem; - } - nav a { - display: inline; - margin: 0 0.6rem; - } -} - -@media (min-width: 640px) { - body { - width: 60rem; - margin: 0 auto; - padding: 0; - } - header { - margin: 0 0 3rem; - padding: 1.2rem 0; - } - nav { - margin: 0; - text-align: right; - } - nav a { - margin: 0 0 0 1.2rem; - display: inline; - } - footer { - text-align: right; - } - .logo { - margin: 0; - text-align: left; - } - .logo a { - float: left; - font-size: 1.8rem; - } -} diff --git a/content/css/main.css b/content/css/main.css index 3713c15..f15783e 100644 --- a/content/css/main.css +++ b/content/css/main.css @@ -7,4 +7,60 @@ font-family: "jetbrains-mono"; src: local("jetbrains-mono"), url("/fonts/JetBrainsMono-Medium.woff2") format("woff2"); +} + +article { + margin-bottom: 2rem; +} + +article>section> :is(p, h1, h2, h3, h4, h5, h6) { + margin-top: 2rem; +} + +article>section>h1 { + margin-top: 2rem; + font-size: 3rem; +} + +article>section>h1::before { + content: "# "; +} + +article>section>h2 { + margin-top: 2rem; + font-size: 2rem; +} + +article>section>h2::before { + content: "## "; +} + +article>section>h3::before { + content: "### "; +} + +article>section>h4::before { + content: "#### "; +} + +article>section { + margin-top: 4rem; +} + +article a { + text-decoration-color: rgb(239 68 68); + text-decoration-thickness: 4px; + text-decoration-line: underline; + transition-duration: 70ms; +} + +article a:hover { + text-decoration-thickness: 8px; + text-decoration-color: rgb(185 28 28); + text-decoration-line: underline; +} + +article ul { + margin-left: 2rem; + list-style-type: "❯ "; } \ No newline at end of file diff --git a/content/css/mini.css b/content/css/mini.css index 803e5bf..b1230f4 100644 --- a/content/css/mini.css +++ b/content/css/mini.css @@ -1 +1 @@ -/*! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:jetbrains-mono;font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.absolute{position:absolute}.relative{position:relative}.inset-y-0{top:0;bottom:0}.left-0{left:0}.right-0{right:0}.z-10{z-index:10}.m-auto{margin:auto}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-3{margin-left:.75rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-16{height:4rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-96{height:24rem}.h-full{height:100%}.min-h-\[50vh\]{min-height:50vh}.w-48{width:12rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-auto{width:auto}.max-w-7xl{max-width:80rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.origin-top-right{transform-origin:top right}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-100,.scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.p-1{padding:.25rem}.p-2{padding:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pr-2{padding-right:.5rem}.pt-2{padding-top:.5rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-6xl{font-size:3.75rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.italic{font-style:italic}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity:0.05}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@font-face{font-family:jetbrains-mono;src:local("jetbrains-mono"),url(/fonts/JetBrainsMono-Medium.woff2) format("woff2")}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset:inset}.focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}@media (min-width:640px){.sm\:static{position:static}.sm\:inset-auto{inset:auto}.sm\:mx-4{margin-left:1rem;margin-right:1rem}.sm\:ml-6{margin-left:1.5rem}.sm\:block{display:block}.sm\:hidden{display:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:items-stretch{align-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:gap-8{gap:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pr-0{padding-right:0}}@media (min-width:768px){.md\:mx-24{margin-left:6rem;margin-right:6rem}.md\:gap-8{gap:2rem}}@media (min-width:1024px){.lg\:block{display:block}.lg\:hidden{display:none}.lg\:px-8{padding-left:2rem;padding-right:2rem}} \ No newline at end of file +/*! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:jetbrains-mono;font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.absolute{position:absolute}.relative{position:relative}.inset-y-0{top:0;bottom:0}.left-0{left:0}.right-0{right:0}.z-10{z-index:10}.m-auto{margin:auto}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-16{height:4rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-96{height:24rem}.h-full{height:100%}.min-h-\[50vh\]{min-height:50vh}.w-48{width:12rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-auto{width:auto}.max-w-7xl{max-width:80rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.origin-top-right{transform-origin:top right}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-100,.scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.p-1{padding:.25rem}.p-2{padding:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pr-2{padding-right:.5rem}.pt-2{padding-top:.5rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-6xl{font-size:3.75rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity:0.05}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@font-face{font-family:jetbrains-mono;src:local("jetbrains-mono"),url(/fonts/JetBrainsMono-Medium.woff2) format("woff2")}article{margin-bottom:2rem}article>section>:is(p,h1,h2,h3,h4,h5,h6){margin-top:2rem}article>section>h1{margin-top:2rem;font-size:3rem}article>section>h1:before{content:"# "}article>section>h2{margin-top:2rem;font-size:2rem}article>section>h2:before{content:"## "}article>section>h3:before{content:"### "}article>section>h4:before{content:"#### "}article>section{margin-top:4rem}article a{text-decoration-color:#ef4444;text-decoration-thickness:4px;transition-duration:70ms}article a,article a:hover{text-decoration-line:underline}article a:hover{text-decoration-thickness:8px;text-decoration-color:#b91c1c}article ul{margin-left:2rem;list-style-type:"❯ "}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset:inset}.focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}@media (min-width:640px){.sm\:static{position:static}.sm\:inset-auto{inset:auto}.sm\:mx-4{margin-left:1rem;margin-right:1rem}.sm\:ml-6{margin-left:1.5rem}.sm\:block{display:block}.sm\:hidden{display:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:items-stretch{align-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:gap-8{gap:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pr-0{padding-right:0}}@media (min-width:768px){.md\:mx-24{margin-left:6rem;margin-right:6rem}.md\:gap-8{gap:2rem}}@media (min-width:1024px){.lg\:block{display:block}.lg\:hidden{display:none}.lg\:px-8{padding-left:2rem;padding-right:2rem}} \ No newline at end of file diff --git a/content/css/normalize.css b/content/css/normalize.css deleted file mode 100644 index b0c1902..0000000 --- a/content/css/normalize.css +++ /dev/null @@ -1,349 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ - -/* Document - ========================================================================== */ - -/** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* Sections - ========================================================================== */ - -/** - * Remove the margin in all browsers. - */ - -body { - margin: 0; -} - -/** - * Render the `main` element consistently in IE. - */ - -main { - display: block; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/* Grouping content - ========================================================================== */ - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - -hr { - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -pre { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Remove the gray background on active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - -abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - -b, -strong { - font-weight: bolder; -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -code, -kbd, -samp { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** - * Add the correct font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove the border on images inside links in IE 10. - */ - -img { - border-style: none; -} - -/* Forms - ========================================================================== */ - -/** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - -button, -select { /* 1 */ - text-transform: none; -} - -/** - * Correct the inability to style clickable types in iOS and Safari. - */ - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -/** - * Remove the inner border and padding in Firefox. - */ - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** - * Restore the focus styles unset by the previous rule. - */ - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Correct the padding in Firefox. - */ - -fieldset { - padding: 0.35em 0.75em 0.625em; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - -legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ -} - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - -progress { - vertical-align: baseline; -} - -/** - * Remove the default vertical scrollbar in IE 10+. - */ - -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - -[type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** - * Remove the inner padding in Chrome and Safari on macOS. - */ - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* Interactive - ========================================================================== */ - -/* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - -details { - display: block; -} - -/* - * Add the correct display in all browsers. - */ - -summary { - display: list-item; -} - -/* Misc - ========================================================================== */ - -/** - * Add the correct display in IE 10+. - */ - -template { - display: none; -} - -/** - * Add the correct display in IE 10. - */ - -[hidden] { - display: none; -} \ No newline at end of file diff --git a/content/css/terminal.css b/content/css/terminal.css deleted file mode 100644 index b591704..0000000 --- a/content/css/terminal.css +++ /dev/null @@ -1,994 +0,0 @@ -:root { - --global-font-size: 20px; - --global-line-height: 1.6em; - --global-space: 12px; - --font-stack: "JetBrains Mono", Menlo, Monaco, Lucida Console, Liberation Mono, - DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, - serif; - --mono-font-stack: Menlo, Monaco, Lucida Console, Liberation Mono, - DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, - serif; - --background-color: #222225; - --page-width: 60em; - --font-color: #e8e9ed; - --invert-font-color: #222225; - --secondary-color: #a3abba; - --tertiary-color: #a3abba; - --primary-color: #62c4ff; - --error-color: #ff3c74; - --progress-bar-background: #3f3f44; - --progress-bar-fill: #62c4ff; - --code-bg-color: #3f3f44; - --input-style: solid; - --display-h1-decoration: none; -} - -* { - box-sizing: border-box; - text-rendering: geometricPrecision; -} - -*::-moz-selection { - background: var(--primary-color); - color: var(--invert-font-color); -} - -*::selection { - background: var(--primary-color); - color: var(--invert-font-color); -} - -body { - font-size: var(--global-font-size); - color: var(--font-color); - line-height: var(--global-line-height); - margin: 0; - font-family: var(--font-stack); - word-wrap: break-word; - background-color: var(--background-color); -} - -h1, -h2, -h3, -h4, -h5, -h6, -.logo { - line-height: var(--global-line-height); -} - -a { - cursor: pointer; - color: var(--primary-color); - text-decoration: none; -} - -a:hover { - background-color: var(--primary-color); - color: var(--invert-font-color); -} - -em { - font-size: var(--global-font-size); - font-style: italic; - font-family: var(--font-stack); - color: var(--font-color); -} - -blockquote, -code, -em, -strong { - line-height: var(--global-line-height); -} - -blockquote, -code, -footer, -h1, -h2, -h3, -h4, -h5, -h6, -header, -li, -ol, -p, -section, -ul, -.logo { - float: none; - margin: 0; - padding: 0; -} - -blockquote, -h1, -ol, -p, -ul, -.logo { - margin-top: calc(var(--global-space) * 2); - margin-bottom: calc(var(--global-space) * 2); -} - -h1, -.logo { - position: relative; - display: inline-block; - display: table-cell; - padding: calc(var(--global-space) * 2) 0 calc(var(--global-space) * 2); - margin: 0; - overflow: hidden; - font-weight: 600; -} - -h1::after { - content: "===================================================================================================="; - position: absolute; - bottom: 5px; - left: 0; - display: var(--display-h1-decoration); -} - -h1 + *, -.logo + * { - margin-top: 0; -} - -h2, -h3, -h4, -h5, -h6 { - position: relative; - margin-bottom: var(--global-line-height); - font-weight: 600; -} - -blockquote { - position: relative; - padding-left: calc(var(--global-space) * 2); - padding-left: 2ch; - overflow: hidden; -} - -blockquote::after { - content: ">\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>"; - white-space: pre; - position: absolute; - top: 0; - left: 0; - line-height: var(--global-line-height); - color: #9ca2ab; -} - -code { - font-weight: inherit; - background-color: var(--code-bg-color); - font-family: var(--mono-font-stack); -} - -code::after, -code::before { - content: "`"; - display: inline; -} - -pre code::after, -pre code::before { - content: ""; -} - -pre { - display: block; - word-break: break-all; - word-wrap: break-word; - color: var(--secondary-color); - background-color: var(--background-color); - border: 1px solid var(--secondary-color); - padding: var(--global-space); - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; -} - -pre code { - overflow-x: scroll; - padding: 0; - margin: 0; - display: inline-block; - min-width: 100%; - font-family: var(--mono-font-stack); -} - -.terminal blockquote, -.terminal code, -.terminal h1, -.terminal h2, -.terminal h3, -.terminal h4, -.terminal h5, -.terminal h6, -.terminal strong, -.terminal .logo { - font-size: var(--global-font-size); - font-style: normal; - font-family: var(--font-stack); - color: var(--font-color); -} - -.terminal-prompt { - position: relative; - white-space: nowrap; -} - -.terminal-prompt::before { - content: "> "; -} - -.terminal-prompt::after { - content: ""; - animation: cursor 1200ms infinite; - background: var(--primary-color); - border-radius: 0; - display: inline-block; - height: 1em; - margin-left: 0.2em; - width: 3px; - bottom: -2px; - position: relative; -} - -@-webkit-keyframes cursor { - 0% { - opacity: 0; - } - - 50% { - opacity: 1; - } - - to { - opacity: 0; - } -} - -@keyframes cursor { - 0% { - opacity: 0; - } - - 50% { - opacity: 1; - } - - to { - opacity: 0; - } -} - -li, -li > ul > li { - position: relative; - display: block; - padding-left: calc(var(--global-space) * 2); -} - -nav > ul > li { - padding-left: 0; -} - -li::after { - position: absolute; - top: 0; - left: 0; -} - -ul > li::after { - content: "-"; -} - -nav ul > li::after { - content: ""; -} - -ol li::before { - content: counters(item, ".") ". "; - counter-increment: item; -} - -ol ol li::before { - content: counters(item, ".") " "; - counter-increment: item; -} - -.terminal-menu li::after, -.terminal-menu li::before { - display: none; -} - -ol { - counter-reset: item; -} - -ol li:nth-child(n+10)::after { - left: -7px; -} - -ol ol { - margin-top: 0; - margin-bottom: 0; -} - -.terminal-menu { - width: 100%; -} - -.terminal-nav { - display: flex; - flex-direction: column; - align-items: flex-start; -} - -ul ul { - margin-top: 0; - margin-bottom: 0; -} - -.terminal-menu ul { - list-style-type: none; - padding: 0 !important; - display: flex; - flex-direction: column; - width: 100%; - flex-grow: 1; - font-size: var(--global-font-size); - margin-top: 0; -} - -.terminal-menu li { - display: flex; - margin: 0 0 0.5em 0; - padding: 0; -} - -ol.terminal-toc li { - border-bottom: 1px dotted var(--secondary-color); - padding: 0; - margin-bottom: 15px; -} - -.terminal-menu li:last-child { - margin-bottom: 0; -} - -ol.terminal-toc li a { - margin: 4px 4px 4px 0; - background: var(--background-color); - position: relative; - top: 6px; - text-align: left; - padding-right: 4px; -} - -.terminal-menu li a:not(.btn) { - text-decoration: none; - display: block; - width: 100%; - border: none; - color: var(--secondary-color); -} - -.terminal-menu li a.active { - color: var(--font-color); -} - -.terminal-menu li a:hover { - background: none; - color: inherit; -} - -ol.terminal-toc li::before { - content: counters(item, ".") ". "; - counter-increment: item; - position: absolute; - right: 0; - background: var(--background-color); - padding: 4px 0 4px 4px; - bottom: -8px; -} - -ol.terminal-toc li a:hover { - background: var(--primary-color); - color: var(--invert-font-color); -} - -hr { - position: relative; - overflow: hidden; - margin: calc(var(--global-space) * 4) 0; - border: 0; - border-bottom: 1px dashed var(--secondary-color); -} - -p { - margin: 0 0 var(--global-line-height); - color: var(--global-font-color); -} - -.container { - max-width: var(--page-width); -} - -.container, -.container-fluid { - margin: 0 auto; - padding: 0 calc(var(--global-space) * 2); -} - -img { - width: 100%; -} - -.progress-bar { - height: 8px; - background-color: var(--progress-bar-background); - margin: 12px 0; -} - -.progress-bar.progress-bar-show-percent { - margin-top: 38px; -} - -.progress-bar-filled { - background-color: var(--progress-bar-fill); - height: 100%; - transition: width 0.3s ease; - position: relative; - width: 0; -} - -.progress-bar-filled::before { - content: ""; - border: 6px solid transparent; - border-top-color: var(--progress-bar-fill); - position: absolute; - top: -12px; - right: -6px; -} - -.progress-bar-filled::after { - color: var(--progress-bar-fill); - content: attr(data-filled); - display: block; - font-size: 12px; - white-space: nowrap; - position: absolute; - border: 6px solid transparent; - top: -38px; - right: 0; - -ms-transform: translateX(50%); - transform: translateX(50%); -} - -.progress-bar-no-arrow > .progress-bar-filled::before, -.progress-bar-no-arrow > .progress-bar-filled::after { - content: ""; - display: none; - visibility: hidden; - opacity: 0; -} - -table { - width: 100%; - border-collapse: collapse; - margin: var(--global-line-height) 0; - color: var(--font-color); - font-size: var(--global-font-size); -} - -table td, -table th { - vertical-align: top; - border: 1px solid var(--font-color); - line-height: var(--global-line-height); - padding: calc(var(--global-space) / 2); - font-size: 1em; -} - -table thead th { - font-size: 1em; -} - -table tfoot tr th { - font-weight: 500; -} - -table caption { - font-size: 1em; - margin: 0 0 1em 0; -} - -table tbody td:first-child { - font-weight: 700; - color: var(--secondary-color); -} - -.form { - width: 100%; -} - -fieldset { - border: 1px solid var(--font-color); - padding: 1em; -} - -label { - font-size: 1em; - color: var(--font-color); -} - -input[type="email"], -input[type="text"], -input[type="number"], -input[type="password"], -input[type="search"] { - border: 1px var(--input-style) var(--font-color); - width: 100%; - padding: 0.7em 0.5em; - font-size: 1em; - font-family: var(--font-stack); - -webkit-appearance: none; - border-radius: 0; -} - -input[type="email"]:active, -input[type="text"]:active, -input[type="number"]:active, -input[type="password"]:active, -input[type="search"]:active, -input[type="email"]:focus, -input[type="text"]:focus, -input[type="number"]:focus, -input[type="password"]:focus, -input[type="search"]:focus { - outline: none; - -webkit-appearance: none; - border: 1px solid var(--font-color); -} - -input[type="text"]:not(:placeholder-shown):invalid, -input[type="email"]:not(:placeholder-shown):invalid, -input[type="password"]:not(:placeholder-shown):invalid, -input[type="search"]:not(:placeholder-shown):invalid, -input[type="number"]:not(:placeholder-shown):invalid { - border-color: var(--error-color); -} - -input, -textarea { - color: var(--font-color); - background-color: var(--background-color); -} - -input::placeholder, -textarea::placeholder { - color: var(--secondary-color) !important; - opacity: 1; -} - -textarea { - height: auto; - width: 100%; - resize: none; - border: 1px var(--input-style) var(--font-color); - padding: 0.5em; - font-size: 1em; - font-family: var(--font-stack); - -webkit-appearance: none; - border-radius: 0; -} - -textarea:focus { - outline: none; - -webkit-appearance: none; - border: 1px solid var(--font-color); -} - -textarea:not(:placeholder-shown):invalid { - border-color: var(--error-color); -} - -input:-webkit-autofill, -input:-webkit-autofill:hover, -input:-webkit-autofill:focus textarea:-webkit-autofill, -textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus, -select:-webkit-autofill, -select:-webkit-autofill:hover, -select:-webkit-autofill:focus { - border: 1px solid var(--font-color); - -webkit-text-fill-color: var(--font-color); - box-shadow: 0 0 0 1000px var(--invert-font-color) inset; - -webkit-box-shadow: 0 0 0 1000px var(--invert-font-color) inset; - transition: background-color 5000s ease-in-out 0s; -} - -.form-group { - margin-bottom: var(--global-line-height); - overflow: auto; -} - -.btn { - border-style: solid; - border-width: 1px; - display: -ms-inline-flexbox; - display: inline-flex; - -ms-flex-align: center; - align-items: center; - -ms-flex-pack: center; - justify-content: center; - cursor: pointer; - outline: none; - padding: 0.65em 2em; - font-size: 1em; - font-family: inherit; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - position: relative; - z-index: 1; -} - -.btn:active { - box-shadow: none; -} - -.btn.btn-ghost { - border-color: var(--font-color); - color: var(--font-color); - background-color: transparent; -} - -.btn.btn-ghost:focus, -.btn.btn-ghost:hover { - border-color: var(--tertiary-color); - color: var(--tertiary-color); - z-index: 2; -} - -.btn.btn-ghost:hover { - background-color: transparent; -} - -.btn-block { - width: 100%; - display: -ms-flexbox; - display: flex; -} - -.btn-default { - background-color: var(--font-color); - border-color: var(--invert-font-color); - color: var(--invert-font-color); -} - -.btn-default:hover, -.btn-default:focus:not(.btn-ghost) { - background-color: var(--secondary-color); - color: var(--invert-font-color); -} - -.btn-default.btn-ghost:focus, -.btn-default.btn-ghost:hover { - border-color: var(--secondary-color); - color: var(--secondary-color); - z-index: 2; -} - -.btn-error { - color: var(--invert-font-color); - background-color: var(--error-color); - border: 1px solid var(--error-color); -} - -.btn-error:hover, -.btn-error:focus:not(.btn-ghost) { - background-color: var(--error-color); - border-color: var(--error-color); -} - -.btn-error.btn-ghost { - border-color: var(--error-color); - color: var(--error-color); -} - -.btn-error.btn-ghost:focus, -.btn-error.btn-ghost:hover { - border-color: var(--error-color); - color: var(--error-color); - z-index: 2; -} - -.btn-primary { - color: var(--invert-font-color); - background-color: var(--primary-color); - border: 1px solid var(--primary-color); -} - -.btn-primary:hover, -.btn-primary:focus:not(.btn-ghost) { - background-color: var(--primary-color); - border-color: var(--primary-color); -} - -.btn-primary.btn-ghost { - border-color: var(--primary-color); - color: var(--primary-color); -} - -.btn-primary.btn-ghost:focus, -.btn-primary.btn-ghost:hover { - border-color: var(--primary-color); - color: var(--primary-color); - z-index: 2; -} - -.btn-small { - padding: 0.5em 1.3em !important; - font-size: 0.9em !important; -} - -.btn-group { - overflow: auto; -} - -.btn-group .btn { - float: left; -} - -.btn-group .btn-ghost:not(:first-child) { - margin-left: -1px; -} - -.terminal-card { - border: 1px solid var(--secondary-color); -} - -.terminal-card > header { - color: var(--invert-font-color); - text-align: center; - background-color: var(--secondary-color); - padding: 0.5em 0; -} - -.terminal-card > div:first-of-type { - padding: var(--global-space); -} - -.terminal-timeline { - position: relative; - padding-left: 70px; -} - -.terminal-timeline::before { - content: ' '; - background: var(--secondary-color); - display: inline-block; - position: absolute; - left: 35px; - width: 2px; - height: 100%; - z-index: 400; -} - -.terminal-timeline .terminal-card { - margin-bottom: 25px; -} - -.terminal-timeline .terminal-card::before { - content: ' '; - background: var(--invert-font-color); - border: 2px solid var(--secondary-color); - display: inline-block; - position: absolute; - margin-top: 25px; - left: 26px; - width: 15px; - height: 15px; - z-index: 400; -} - -.terminal-alert { - color: var(--font-color); - padding: 1em; - border: 1px solid var(--font-color); - margin-bottom: var(--global-space); -} - -.terminal-alert-error { - color: var(--error-color); - border-color: var(--error-color); -} - -.terminal-alert-primary { - color: var(--primary-color); - border-color: var(--primary-color); -} - -@media screen and (max-width: 960px) { - label { - display: block; - width: 100%; - } - - pre::-webkit-scrollbar { - height: 3px; - } -} - -@media screen and (max-width: 480px) { - form { - width: 100%; - } -} - -@media only screen and (min-width: 30em) { - .terminal-nav { - flex-direction: row; - align-items: center; - } - - .terminal-menu ul { - flex-direction: row; - justify-items: flex-end; - align-items: center; - justify-content: flex-end; - margin-top: calc(var(--global-space) * 2); - } - - .terminal-menu li { - margin: 0; - margin-right: 2em; - } - - .terminal-menu li:last-child { - margin-right: 0; - } -} - -.terminal-media:not(:last-child) { - margin-bottom: 1.25rem; -} - -.terminal-media-left { - padding-right: var(--global-space); -} - -.terminal-media-left, -.terminal-media-right { - display: table-cell; - vertical-align: top; -} - -.terminal-media-right { - padding-left: var(--global-space); -} - -.terminal-media-body { - display: table-cell; - vertical-align: top; -} - -.terminal-media-heading { - font-size: 1em; - font-weight: 700; -} - -.terminal-media-content { - margin-top: 0.3rem; -} - -.terminal-placeholder { - background-color: var(--secondary-color); - text-align: center; - color: var(--font-color); - font-size: 1rem; - border: 1px solid var(--secondary-color); -} - -figure > img { - padding: 0; -} - -.terminal-avatarholder { - width: calc(var(--global-space) * 5); - height: calc(var(--global-space) * 5); -} - -.terminal-avatarholder img { - padding: 0; -} - -figure { - margin: 0; -} - -figure > figcaption { - color: var(--secondary-color); - text-align: center; -} - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: var(--block-background-color); - color: var(--font-color); -} - -.hljs-comment, -.hljs-quote { - color: var(--secondary-color); -} - -.hljs-variable { - color: var(--font-color); -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-built_in, -.hljs-name, -.hljs-tag { - color: var(--primary-color); -} - -.hljs-string, -.hljs-title, -.hljs-section, -.hljs-attribute, -.hljs-literal, -.hljs-template-tag, -.hljs-template-variable, -.hljs-type, -.hljs-addition { - color: var(--secondary-color); -} - -.hljs-string { - color: var(--secondary-color); -} - -.hljs-deletion, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-meta { - color: var(--primary-color); -} - -.hljs-doctag { - color: var(--secondary-color); -} - -.hljs-attr { - color: var(--primary-color); -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link { - color: var(--primary-color); -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/content/css/terminal.min.css b/content/css/terminal.min.css deleted file mode 100644 index d92ba60..0000000 --- a/content/css/terminal.min.css +++ /dev/null @@ -1 +0,0 @@ -:root{--global-font-size:15px;--global-line-height:1.4em;--global-space:10px;--font-stack:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;--mono-font-stack:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;--background-color:#fff;--page-width:60em;--font-color:#151515;--invert-font-color:#fff;--primary-color:#1a95e0;--secondary-color:#727578;--error-color:#d20962;--progress-bar-background:#727578;--progress-bar-fill:#151515;--code-bg-color:#e8eff2;--input-style:solid;--display-h1-decoration:none}*{box-sizing:border-box;text-rendering:geometricPrecision}::-moz-selection{background:var(--primary-color);color:var(--invert-font-color)}::selection{background:var(--primary-color);color:var(--invert-font-color)}body{font-size:var(--global-font-size);color:var(--font-color);line-height:var(--global-line-height);margin:0;font-family:var(--font-stack);word-wrap:break-word;background-color:var(--background-color)}.logo,h1,h2,h3,h4,h5,h6{line-height:var(--global-line-height)}a{cursor:pointer;color:var(--primary-color);text-decoration:none}a:hover{background-color:var(--primary-color);color:var(--invert-font-color)}em{font-size:var(--global-font-size);font-style:italic;font-family:var(--font-stack);color:var(--font-color)}blockquote,code,em,strong{line-height:var(--global-line-height)}.logo,blockquote,code,footer,h1,h2,h3,h4,h5,h6,header,li,ol,p,section,ul{float:none;margin:0;padding:0}.logo,blockquote,h1,ol,p,ul{margin-top:calc(var(--global-space) * 2);margin-bottom:calc(var(--global-space) * 2)}.logo,h1{position:relative;display:inline-block;display:table-cell;padding:calc(var(--global-space) * 2) 0 calc(var(--global-space) * 2);margin:0;overflow:hidden;font-weight:600}h1::after{content:"====================================================================================================";position:absolute;bottom:5px;left:0;display:var(--display-h1-decoration)}.logo+*,h1+*{margin-top:0}h2,h3,h4,h5,h6{position:relative;margin-bottom:var(--global-line-height);font-weight:600}blockquote{position:relative;padding-left:calc(var(--global-space) * 2);padding-left:2ch;overflow:hidden}blockquote::after{content:">\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>";white-space:pre;position:absolute;top:0;left:0;line-height:var(--global-line-height);color:#9ca2ab}code{font-weight:inherit;background-color:var(--code-bg-color);font-family:var(--mono-font-stack)}code::after,code::before{content:"`";display:inline}pre code::after,pre code::before{content:""}pre{display:block;word-break:break-all;word-wrap:break-word;color:var(--secondary-color);background-color:var(--background-color);border:1px solid var(--secondary-color);padding:var(--global-space);white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}pre code{overflow-x:scroll;padding:0;margin:0;display:inline-block;min-width:100%;font-family:var(--mono-font-stack)}.terminal .logo,.terminal blockquote,.terminal code,.terminal h1,.terminal h2,.terminal h3,.terminal h4,.terminal h5,.terminal h6,.terminal strong{font-size:var(--global-font-size);font-style:normal;font-family:var(--font-stack);color:var(--font-color)}.terminal-prompt{position:relative;white-space:nowrap}.terminal-prompt::before{content:"> "}.terminal-prompt::after{content:"";-webkit-animation:cursor .8s infinite;animation:cursor .8s infinite;background:var(--primary-color);border-radius:0;display:inline-block;height:1em;margin-left:.2em;width:3px;bottom:-2px;position:relative}@-webkit-keyframes cursor{0%{opacity:0}50%{opacity:1}to{opacity:0}}@keyframes cursor{0%{opacity:0}50%{opacity:1}to{opacity:0}}li,li>ul>li{position:relative;display:block;padding-left:calc(var(--global-space) * 2)}nav>ul>li{padding-left:0}li::after{position:absolute;top:0;left:0}ul>li::after{content:"-"}nav ul>li::after{content:""}ol li::before{content:counters(item, ".") ". ";counter-increment:item}ol ol li::before{content:counters(item, ".") " ";counter-increment:item}.terminal-menu li::after,.terminal-menu li::before{display:none}ol{counter-reset:item}ol li:nth-child(n+10)::after{left:-7px}ol ol{margin-top:0;margin-bottom:0}.terminal-menu{width:100%}.terminal-nav{display:flex;flex-direction:column;align-items:flex-start}ul ul{margin-top:0;margin-bottom:0}.terminal-menu ul{list-style-type:none;padding:0!important;display:flex;flex-direction:column;width:100%;flex-grow:1;font-size:var(--global-font-size);margin-top:0}.terminal-menu li{display:flex;margin:0 0 .5em 0;padding:0}ol.terminal-toc li{border-bottom:1px dotted var(--secondary-color);padding:0;margin-bottom:15px}.terminal-menu li:last-child{margin-bottom:0}ol.terminal-toc li a{margin:4px 4px 4px 0;background:var(--background-color);position:relative;top:6px;text-align:left;padding-right:4px}.terminal-menu li a:not(.btn){text-decoration:none;display:block;width:100%;border:none;color:var(--secondary-color)}.terminal-menu li a.active{color:var(--font-color)}.terminal-menu li a:hover{background:0 0;color:inherit}ol.terminal-toc li::before{content:counters(item, ".") ". ";counter-increment:item;position:absolute;right:0;background:var(--background-color);padding:4px 0 4px 4px;bottom:-8px}ol.terminal-toc li a:hover{background:var(--primary-color);color:var(--invert-font-color)}hr{position:relative;overflow:hidden;margin:calc(var(--global-space) * 4) 0;border:0;border-bottom:1px dashed var(--secondary-color)}p{margin:0 0 var(--global-line-height);color:var(--global-font-color)}.container{max-width:var(--page-width)}.container,.container-fluid{margin:0 auto;padding:0 calc(var(--global-space) * 2)}img{width:100%}.progress-bar{height:8px;background-color:var(--progress-bar-background);margin:12px 0}.progress-bar.progress-bar-show-percent{margin-top:38px}.progress-bar-filled{background-color:var(--progress-bar-fill);height:100%;transition:width .3s ease;position:relative;width:0}.progress-bar-filled::before{content:"";border:6px solid transparent;border-top-color:var(--progress-bar-fill);position:absolute;top:-12px;right:-6px}.progress-bar-filled::after{color:var(--progress-bar-fill);content:attr(data-filled);display:block;font-size:12px;white-space:nowrap;position:absolute;border:6px solid transparent;top:-38px;right:0;transform:translateX(50%)}.progress-bar-no-arrow>.progress-bar-filled::after,.progress-bar-no-arrow>.progress-bar-filled::before{content:"";display:none;visibility:hidden;opacity:0}table{width:100%;border-collapse:collapse;margin:var(--global-line-height) 0;color:var(--font-color);font-size:var(--global-font-size)}table td,table th{vertical-align:top;border:1px solid var(--font-color);line-height:var(--global-line-height);padding:calc(var(--global-space)/ 2);font-size:1em}table thead th{font-size:1em}table tfoot tr th{font-weight:500}table caption{font-size:1em;margin:0 0 1em 0}table tbody td:first-child{font-weight:700;color:var(--secondary-color)}.form{width:100%}fieldset{border:1px solid var(--font-color);padding:1em}label{font-size:1em;color:var(--font-color)}input[type=email],input[type=number],input[type=password],input[type=search],input[type=text]{border:1px var(--input-style) var(--font-color);width:100%;padding:.7em .5em;font-size:1em;font-family:var(--font-stack);-webkit-appearance:none;border-radius:0}input[type=email]:active,input[type=email]:focus,input[type=number]:active,input[type=number]:focus,input[type=password]:active,input[type=password]:focus,input[type=search]:active,input[type=search]:focus,input[type=text]:active,input[type=text]:focus{outline:0;-webkit-appearance:none;border:1px solid var(--font-color)}input[type=email]:not(:placeholder-shown):invalid,input[type=number]:not(:placeholder-shown):invalid,input[type=password]:not(:placeholder-shown):invalid,input[type=search]:not(:placeholder-shown):invalid,input[type=text]:not(:placeholder-shown):invalid{border-color:var(--error-color)}input,textarea{color:var(--font-color);background-color:var(--background-color)}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:var(--secondary-color)!important;opacity:1}input::-moz-placeholder,textarea::-moz-placeholder{color:var(--secondary-color)!important;opacity:1}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--secondary-color)!important;opacity:1}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--secondary-color)!important;opacity:1}input::placeholder,textarea::placeholder{color:var(--secondary-color)!important;opacity:1}textarea{height:auto;width:100%;resize:none;border:1px var(--input-style) var(--font-color);padding:.5em;font-size:1em;font-family:var(--font-stack);-webkit-appearance:none;border-radius:0}textarea:focus{outline:0;-webkit-appearance:none;border:1px solid var(--font-color)}textarea:not(:placeholder-shown):invalid{border-color:var(--error-color)}input:-webkit-autofill,input:-webkit-autofill:focus textarea:-webkit-autofill,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus{border:1px solid var(--font-color);-webkit-text-fill-color:var(--font-color);box-shadow:0 0 0 1000px var(--invert-font-color) inset;-webkit-box-shadow:0 0 0 1000px var(--invert-font-color) inset;transition:background-color 5000s ease-in-out 0s}.form-group{margin-bottom:var(--global-line-height);overflow:auto}.btn{border-style:solid;border-width:1px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;outline:0;padding:.65em 2em;font-size:1em;font-family:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;z-index:1}.btn:active{box-shadow:none}.btn.btn-ghost{border-color:var(--font-color);color:var(--font-color);background-color:transparent}.btn.btn-ghost:focus,.btn.btn-ghost:hover{border-color:var(--tertiary-color);color:var(--tertiary-color);z-index:2}.btn.btn-ghost:hover{background-color:transparent}.btn-block{width:100%;display:flex}.btn-default{background-color:var(--font-color);border-color:var(--invert-font-color);color:var(--invert-font-color)}.btn-default:focus:not(.btn-ghost),.btn-default:hover{background-color:var(--secondary-color);color:var(--invert-font-color)}.btn-default.btn-ghost:focus,.btn-default.btn-ghost:hover{border-color:var(--secondary-color);color:var(--secondary-color);z-index:2}.btn-error{color:var(--invert-font-color);background-color:var(--error-color);border:1px solid var(--error-color)}.btn-error:focus:not(.btn-ghost),.btn-error:hover{background-color:var(--error-color);border-color:var(--error-color)}.btn-error.btn-ghost{border-color:var(--error-color);color:var(--error-color)}.btn-error.btn-ghost:focus,.btn-error.btn-ghost:hover{border-color:var(--error-color);color:var(--error-color);z-index:2}.btn-primary{color:var(--invert-font-color);background-color:var(--primary-color);border:1px solid var(--primary-color)}.btn-primary:focus:not(.btn-ghost),.btn-primary:hover{background-color:var(--primary-color);border-color:var(--primary-color)}.btn-primary.btn-ghost{border-color:var(--primary-color);color:var(--primary-color)}.btn-primary.btn-ghost:focus,.btn-primary.btn-ghost:hover{border-color:var(--primary-color);color:var(--primary-color);z-index:2}.btn-small{padding:.5em 1.3em!important;font-size:.9em!important}.btn-group{overflow:auto}.btn-group .btn{float:left}.btn-group .btn-ghost:not(:first-child){margin-left:-1px}.terminal-card{border:1px solid var(--secondary-color)}.terminal-card>header{color:var(--invert-font-color);text-align:center;background-color:var(--secondary-color);padding:.5em 0}.terminal-card>div:first-of-type{padding:var(--global-space)}.terminal-timeline{position:relative;padding-left:70px}.terminal-timeline::before{content:' ';background:var(--secondary-color);display:inline-block;position:absolute;left:35px;width:2px;height:100%;z-index:400}.terminal-timeline .terminal-card{margin-bottom:25px}.terminal-timeline .terminal-card::before{content:' ';background:var(--invert-font-color);border:2px solid var(--secondary-color);display:inline-block;position:absolute;margin-top:25px;left:26px;width:15px;height:15px;z-index:400}.terminal-alert{color:var(--font-color);padding:1em;border:1px solid var(--font-color);margin-bottom:var(--global-space)}.terminal-alert-error{color:var(--error-color);border-color:var(--error-color)}.terminal-alert-primary{color:var(--primary-color);border-color:var(--primary-color)}@media screen and (max-width:960px){label{display:block;width:100%}pre::-webkit-scrollbar{height:3px}}@media screen and (max-width:480px){form{width:100%}}@media only screen and (min-width:30em){.terminal-nav{flex-direction:row;align-items:center}.terminal-menu ul{flex-direction:row;justify-items:flex-end;align-items:center;justify-content:flex-end;margin-top:calc(var(--global-space) * 2)}.terminal-menu li{margin:0;margin-right:2em}.terminal-menu li:last-child{margin-right:0}}.terminal-media:not(:last-child){margin-bottom:1.25rem}.terminal-media-left{padding-right:var(--global-space)}.terminal-media-left,.terminal-media-right{display:table-cell;vertical-align:top}.terminal-media-right{padding-left:var(--global-space)}.terminal-media-body{display:table-cell;vertical-align:top}.terminal-media-heading{font-size:1em;font-weight:700}.terminal-media-content{margin-top:.3rem}.terminal-placeholder{background-color:var(--secondary-color);text-align:center;color:var(--font-color);font-size:1rem;border:1px solid var(--secondary-color)}figure>img{padding:0}.terminal-avatarholder{width:calc(var(--global-space) * 5);height:calc(var(--global-space) * 5)}.terminal-avatarholder img{padding:0}figure{margin:0}figure>figcaption{color:var(--secondary-color);text-align:center}.hljs{display:block;overflow-x:auto;padding:.5em;background:var(--block-background-color);color:var(--font-color)}.hljs-comment,.hljs-quote{color:var(--secondary-color)}.hljs-variable{color:var(--font-color)}.hljs-built_in,.hljs-keyword,.hljs-name,.hljs-selector-tag,.hljs-tag{color:var(--primary-color)}.hljs-addition,.hljs-attribute,.hljs-literal,.hljs-section,.hljs-string,.hljs-template-tag,.hljs-template-variable,.hljs-title,.hljs-type{color:var(--secondary-color)}.hljs-string{color:var(--secondary-color)}.hljs-deletion,.hljs-meta,.hljs-selector-attr,.hljs-selector-pseudo{color:var(--primary-color)}.hljs-doctag{color:var(--secondary-color)}.hljs-attr{color:var(--primary-color)}.hljs-bullet,.hljs-link,.hljs-symbol{color:var(--primary-color)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file diff --git a/content/posts/unpicking-aiken-air.md b/content/drafts/unpicking-aiken-air.md similarity index 100% rename from content/posts/unpicking-aiken-air.md rename to content/drafts/unpicking-aiken-air.md diff --git a/content/index.html b/content/index.html deleted file mode 100644 index e69de29..0000000 diff --git a/content/index.md b/content/index.md new file mode 100644 index 0000000..0e759e9 --- /dev/null +++ b/content/index.md @@ -0,0 +1,3 @@ +--- +title: Kompact.io +--- \ No newline at end of file diff --git a/content/posts/are-we-zk-cardano-yet.md b/content/posts/are-we-zk-cardano-yet.md new file mode 100644 index 0000000..75bbbd2 --- /dev/null +++ b/content/posts/are-we-zk-cardano-yet.md @@ -0,0 +1,109 @@ +--- +title: Are we zk-Cardano yet? +date: 2023-08-07 +--- + +Not so long ago Emurgo announced they were doing a Cardano centered hackathon. +It was a welcome prospect - very few similar such events seem to exist in the space. +Things went monotonically south ever since the announcement, but that's a different story. + +One particularly interesting quirk was that of the three "tracks" of the hackathon, +one was _Zero Knowledge_ (aka zk). +Why particularly interesting quirk? In some sense it is not surprising: +zk has been very trendy these last few years around blockchains. +However, building on Cardano is notoriously challenging. +Building with zk on a zk-native blockchain is itself a very steep learning curve. +So combining the two, zk on Cardano seemed... a bit mad. + +This post is borne out of a best effort of how far "zk on Cardano" can be pushed. + +## What is zk? + +There is no shortage of explanations describing what zk is +( _eg_ [by Vitalik](https://vitalik.ca/general/2021/01/26/snarks.html) or [a full mooc](https://zk-learning.org/) ). +There is also a reasonable breath to the field of zk that includes things like distributed compute. +Zk involves some really neat maths that lets you do some seemingly magical feats, +and pairs well with blockchain in extending what is functionally possible. +Let's stick to a simple and prototypical example. + +Suppose Alice and Bob are playing battleships. +The game begins with Alice and Bob placing their ships within their own coordinate grid. +They then take in terms picking coordinates to "bomb". +If they hit nothing, then their turn ends, but if they hit a ship then they guess again. +The winner is the first to sink all their opponent's ships. + +Alice knows Bob has a reputation of being a notorious liar; how can she enjoy the game? +Each guess she makes, Bob says gleefully shouts "Miss!". +She can't ask Bob to show he's not lying by revealing the actual locations of the ships. +She could ask Charlie to independently verify Bob's not lying, +but then what if Charlie is actually on team Bob and also lies. +Or Bob might suspect Charlie is actually on team Alice, slyly brought in to give could Alice some hints. + +Is there a way that Bob can prove to Alice that each guess is a miss, +but without revealing the locations of the ships either to Alice or anyone else? + +The answer is yes. +Using zk Bob can produce a proof each time Alice's guess misses if and only if it honestly does. +Alice can inspect each proof and verify Bob's response. +Alice can interrogate the proof as much as she wants, but she won't learn anything more than +her guess was a miss. + +There are multitude of different ways to do this, +but essentially it involves modeling the problem as a bunch of algebra +over finite fields - like a lot of cryptography. + +What's the snark of zk-snark? +Snark stands for _Succinct Non-Interactive Argument of Knowledge_. +And without saying anything more: it means that Alice has to do way less algebra than Bob. +In applications this is important, because Bob might not be able to lie anymore, +but he could still waste Alice's time. + + +## Sudoku snark + +Sudoku snark was the entrant to Emurgo hackathon. +The summary/ pitch/ story deck is [here](https://pub.kompact.io/sudoku-snark). +Links to associated repos [plutus-zk](https://github.com/waalge/plutus-zk) and [sudoku-snark](https://github.com/waalge/sudoku-snark). + +Just after the hackathon got underway there was a large PR merged into the main branch of plutus. +It's a mammoth PR that is the culmination of many many months of work. +In it were some fundamental primitives needed for running zk algos. + +The idea of the project was as follows: + +- write a validator implementing a zk algorithm with the new primitives +- write a program to generate the setup and proofs +- try to get a version of hydra running this newest version of plutus. + +Unsurprisingly to anyone who's hung around the Cardano repos long enough, +this final part is where things got stuck. +Things got as far as running a cluster of nodes in the Conway era supposedly with the latest plutus +but some unrelated changes seemed to thwart any chance of building transactions. + +The validator uses [groth16](https://eprint.iacr.org/2016/260.pdf). +In part because this was already mostly available from the plutus repo itself. +It is also the most obvious candidate to begin with. +It's relatively mature, relatively simple, can be implemented from the new primitives, +and, importantly in Cardano land, has small proof size. +(As far as I know, the smallest of comparable algos.) + +The program to generate the setup and proofs uses the arkworks framework. +Again this was initially inspired by a script from the IOG team. + +The choice of game, sudoku, was in turn inspired by an arkworks example. +It's not the most compelling of choices, but it did for now. + +The intended game play involved locking Ada at a utxo +spendable only if a player could provide proof you knew the solution. +And through the magic of zk, not disclosing to the competition the solution itself. +Other details were TBC: is it first and second prizes? are players whitelisted? + +## So are we zk-Cardano yet? + +We're close. + +There is potentially still quite a stretch between being in the plutus repo and being run on-chain. +The word on the street is that it might happen before the end of 2023. + +Before it's available on mainnet there will be versions the Cardano node available, +and so possibly plumb-able into hydra without causing oneself an aneurysm. diff --git a/content/posts/are-we-zk-cardano-yet.md.bak b/content/posts/are-we-zk-cardano-yet.md.bak new file mode 100644 index 0000000..41422b1 --- /dev/null +++ b/content/posts/are-we-zk-cardano-yet.md.bak @@ -0,0 +1,108 @@ +--- +title: Are we zk-Cardano yet? +date: 2023-08-07 +--- + +Not so long ago Emurgo announced they were doing a Cardano centered hackathon. +It was a welcome prospect - very few similar such events seem to exist in the space. +Things went monotonically south ever since the announcement, but that's a different story. + +One particularly interesting quirk was that of the three "tracks" of the hackathon, +one was _Zero Knowledge_ (aka zk). +Why particularly interesting quirk? In some sense it is not suprising: +zK has been very trendy these last few years around blockchains. +However, building on Cardano is notoriously challenging. +Building with zk on a zk-native blockchain is itself a very steep learning curve. +So combining the two, zk on Cardano seemed... a bit mad. + +This post is bourne out of a best effort of how far "zk on cardano" can be pushed. + +## What is zk? + +There is no shortage of explanations describing what zk is [TODO: Links]. +There is also a reasonable breath to the field of zk that includes things like distributed compute. +Zk involves some really neat maths that lets you do some seemingly magical feats, +and pairs well with blockchain in extending what is functionally possible. +Let's stick to a simple and prototypical example. + +Suppose Alice and Bob are playing battleships. +The game begins with Alice and Bob placing their ships within their own coordinate grid. +They then take in terms picking coordinates to "bomb". +If they hit nothing, then their turn ends, but if they hit a ship then they guess again. +The winner is the first to sink all their oponents ships. + +Alice knows Bob has a reputation of being a notorious liar; how can she enjoy the game? +Each guess she makes, Bob says gleefully shouts "Miss!". +She can't ask Bob to show he's not lying by revealing the actual locations of the ships. +She could ask Charlie to independently verify Bob's not lying, +but then what if Charlie is actually on team Bob and also lies. +Or Bob might suspect Charlie is actually on team Alice, slyly brought in to give could Alice some hints. + +Is there a way that Bob can prove to Alice that each guess is a miss, +but without revealing the locations of the ships either to Alice or anyone else? + +The answer is yes. +Using zk Bob can produce a proof each time Alice's guess misses if and only if it honestly does. +Alice can inspect each proof and verify Bob's response. +Alice can interogate the proof as much as she wants, but she won't learn anything more than +her guess was a miss. + +There are multiplitude of different ways to do this, +but essentially it involves modelling the problem as a bunch of algebra +over finite fields - like a lot of cryptography. + +What's the snark of zk-snark? +Snark stands for _Succinct Non-Interactive Argument of Knowledge_. +And without saying anything more: it means that Alice has to do way less algebra than Bob. +In applications this is important, because Bob might not be able to lie anymore, +but he could still waste Alice's time. + + +## Sudoku snark + +Sudoku snark was the entrant to Emurgo hackathon. +The summary/ pitch/ story deck is [here](https://pub.kompact.io/sudoku-snark). +Links to associated repos [plutus-zk]() and [sudoku-snark](). + +Just after the hackathon got underway there was a large PR merged into the main branch of plutus. +It's a mammoth PR that is the culmination of many many months of work. +In it were some fundamental primitives needed for running zk algos. + +The idea of the project was as follows: + +- write a validator implementing a zk algorithm with the new primitives +- write a programme to generate the setup and proofs +- try to get a version of hydra running this newest version of plutus. + +Unsurprisingly to anyone who's hung around the Cardano repos long enough, +this final part is where things got stuck. +Things got as far as running a cluster of nodes in the conway era supposedly with the latest plutus +but some unrelated changes seemed to thwart any chance of building transactions. + +The validator uses [groth16]. +In part because this was already mostly available from the plutus repo itself. +It is also the most obvious candidate to begin with. +It's relatively mature, relatively simple, can be implemented from the new primitives, +and, importantly in cardano land, has small proof size. +(As far as I know, the smallest of comparable algos.) + +The program to generate the setup and proofs uses the arkworks framework. +Again this was initially inspired by a script from the IOG team. + +The choice of game, sudoku, was in turn inspired by an arkworks example. +It's not the most compelling of choices, but it did for now. + +The intended game play involved locking ada at a utxo +spendable only if a player could provide proof you knew the solution. +And through the magic of zk, not disclosing to the competition the solution itself. +Other details were TBC: is it first and second prizes? are players whitelisted? + +## So are we zk-Cardano yet? + +We're close. + +There is potentially still quite a stretch between being in the plutus repo and being run on-chain. +The word on the street is that it might happen before the end of 2023. + +Before it's available on mainnet there will be versions the cardano node available, +and so possibly plumbable into hydra without causing oneself an aneurysm. diff --git a/kompact-landing.cabal b/kompact-landing.cabal index 2245200..b9159f5 100644 --- a/kompact-landing.cabal +++ b/kompact-landing.cabal @@ -8,5 +8,6 @@ executable site build-depends: base == 4.* , hakyll == 4.15.* , hip == 1.5.* + , filepath ghc-options: -threaded -rtsopts -with-rtsopts=-N default-language: Haskell2010 diff --git a/site.hs b/site.hs index c6a48d7..42bd966 100644 --- a/site.hs +++ b/site.hs @@ -2,70 +2,62 @@ {-# LANGUAGE OverloadedStrings #-} import Data.Monoid (mappend) import Hakyll +import System.FilePath (splitExtension, joinPath, splitDirectories, replaceExtension) -------------------------------------------------------------------------------- main :: IO () main = hakyll $ do match "content/favicon.png" $ do - route rmContentPrefix + route rmPrefix compile copyFileCompiler match "content/images/*" $ do - route rmContentPrefix + route rmPrefix compile copyFileCompiler match "content/scripts/*" $ do - route rmContentPrefix + route rmPrefix compile copyFileCompiler match "content/css/*" $ do - route rmContentPrefix + route rmPrefix compile compressCssCompiler match "content/fonts/*" $ do - route rmContentPrefix + route rmPrefix compile copyFileCompiler - match (fromList ["content/about.rst", "content/contact.markdown"]) $ do - route $ setExtension "html" - compile $ pandocCompiler - >>= loadAndApplyTemplate "templates/default.html" defaultContext - >>= relativizeUrls - - match "content/posts/*" $ do - route $ setExtension "html" + match "content/posts/*.md" $ do + route rmPrefixMd compile $ pandocCompiler >>= loadAndApplyTemplate "templates/post.html" postCtx >>= loadAndApplyTemplate "templates/default.html" postCtx >>= relativizeUrls - create ["archive.html"] $ do + create ["blog.html"] $ do route idRoute compile $ do - posts <- recentFirst =<< loadAll "content/posts/*" + posts <- recentFirst =<< loadAll "content/posts/*.md" let archiveCtx = listField "posts" postCtx (return posts) `mappend` - constField "title" "Archives" `mappend` + constField "title" "Blog" `mappend` defaultContext makeItem "" - >>= loadAndApplyTemplate "templates/archive.html" archiveCtx + >>= loadAndApplyTemplate "templates/blog.html" archiveCtx >>= loadAndApplyTemplate "templates/default.html" archiveCtx >>= relativizeUrls - match "content/index.html" $ do - route rmContentPrefix + match "content/index.md" $ do + route rmPrefixMd compile $ do - posts <- recentFirst =<< loadAll "content/posts/*" - let indexCtx = - listField "posts" postCtx (return posts) `mappend` - defaultContext + let indexCtx = defaultContext getResourceBody >>= applyAsTemplate indexCtx - >>= loadAndApplyTemplate "templates/default.html" indexCtx + >>= loadAndApplyTemplate "templates/index.html" indexCtx >>= relativizeUrls match "templates/*" $ compile templateBodyCompiler @@ -74,7 +66,16 @@ main = hakyll $ do -------------------------------------------------------------------------------- postCtx :: Context String postCtx = - dateField "date" "%B %e, %Y" `mappend` + dateField "date" "%Y-%m-%d" `mappend` defaultContext -rmContentPrefix = gsubRoute "content/" (const "") +setExtensionInner :: String -> FilePath -> FilePath +setExtensionInner = flip replaceExtension + +rmPrefixInner :: FilePath -> FilePath +rmPrefixInner = joinPath . tail . splitDirectories + +rmPrefix :: Routes +rmPrefix = customRoute $ rmPrefixInner . toFilePath + +rmPrefixMd = customRoute $ rmPrefixInner . setExtensionInner "html" . toFilePath diff --git a/templates/archive.html b/templates/archive.html deleted file mode 100644 index 80b148f..0000000 --- a/templates/archive.html +++ /dev/null @@ -1,2 +0,0 @@ -Here you can find all my previous posts: -$partial("templates/post-list.html")$ \ No newline at end of file diff --git a/templates/blog.html b/templates/blog.html new file mode 100644 index 0000000..cc59d11 --- /dev/null +++ b/templates/blog.html @@ -0,0 +1,12 @@ +
+
+ # blog +
+
+ A nascent initiative sharing some of the things happening at Kompact.io. +
+
+ +
+ $partial("templates/post-list.html")$ +
\ No newline at end of file diff --git a/templates/default.html b/templates/default.html index 26d03d6..fd0cb93 100644 --- a/templates/default.html +++ b/templates/default.html @@ -6,6 +6,7 @@ + @@ -13,18 +14,11 @@
$partial("templates/nav.html")$
- $partial("templates/hero.html")$ -
- $partial("templates/services.html")$ -
- $partial("templates/pricing.html")$ -
- $partial("templates/contact.html")$ + $body$
$partial("templates/footer.html")$ -
- $body$ + \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..820928b --- /dev/null +++ b/templates/index.html @@ -0,0 +1,30 @@ + + + + + + + + $title$ + + + + +
+
+ $partial("templates/nav.html")$ +
+ $partial("templates/hero.html")$ +
+ $partial("templates/services.html")$ +
+ $partial("templates/pricing.html")$ +
+ $partial("templates/contact.html")$ +
+ $partial("templates/footer.html")$ +
+
+ + + \ No newline at end of file diff --git a/templates/nav.html b/templates/nav.html index 89bdcc6..3245db8 100644 --- a/templates/nav.html +++ b/templates/nav.html @@ -1,25 +1,22 @@