From 3b048294573472db96a4e23b2211946ab636a8da Mon Sep 17 00:00:00 2001 From: Tommy Date: Thu, 21 Jul 2022 11:22:12 -0400 Subject: [PATCH] Switch to Netlify Signed-off-by: Tommy --- .firebaserc | 5 -- .github/workflows/firebase-hosting-merge.yml | 36 --------- .../firebase-hosting-pull-request.yml | 47 ------------ .github/workflows/pull-request-receiver.yml | 31 -------- .gitignore | 74 ++----------------- .hugo_build.lock | 0 config.yml | 5 +- content/about.md | 5 +- content/code.md | 2 + content/donate.md | 2 + content/privacy.md | 9 ++- content/search.md | 2 +- firebase.json | 57 -------------- layouts/partials/post_nav_links.html | 19 +++++ netlify.toml | 16 ++++ ...s_de1a7f5f1c8c46959803c429bb697ff0.content | 3 - ...scss_de1a7f5f1c8c46959803c429bb697ff0.json | 1 - static/.well-known/mta-sts.txt | 4 + 18 files changed, 62 insertions(+), 256 deletions(-) delete mode 100644 .firebaserc delete mode 100644 .github/workflows/firebase-hosting-merge.yml delete mode 100644 .github/workflows/firebase-hosting-pull-request.yml delete mode 100644 .github/workflows/pull-request-receiver.yml delete mode 100644 .hugo_build.lock delete mode 100644 firebase.json create mode 100644 layouts/partials/post_nav_links.html create mode 100644 netlify.toml delete mode 100644 resources/_gen/assets/scss/scss/main.scss_de1a7f5f1c8c46959803c429bb697ff0.content delete mode 100644 resources/_gen/assets/scss/scss/main.scss_de1a7f5f1c8c46959803c429bb697ff0.json create mode 100644 static/.well-known/mta-sts.txt diff --git a/.firebaserc b/.firebaserc deleted file mode 100644 index 22bc8ea..0000000 --- a/.firebaserc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "projects": { - "default": "privsec-356523" - } -} diff --git a/.github/workflows/firebase-hosting-merge.yml b/.github/workflows/firebase-hosting-merge.yml deleted file mode 100644 index 5cf5985..0000000 --- a/.github/workflows/firebase-hosting-merge.yml +++ /dev/null @@ -1,36 +0,0 @@ -# This file was auto-generated by the Firebase CLI -# https://github.com/firebase/firebase-tools - -name: Deploy to Firebase Hosting on merge -'on': - push: - branches: - - main -jobs: - Build_and_Deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - submodules: true # Fetch Hugo themes (true OR recursive) - fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - - #- name: Fecth External Blog - # run: ./external-blogs.sh - - - name: Hugo setup - uses: peaceiris/actions-hugo@v2 - with: - hugo-version: 'latest' - - - name: Build - run: hugo --minify - - - name: Deploy - uses: FirebaseExtended/action-hosting-deploy@v0 - with: - repoToken: '${{ secrets.GITHUB_TOKEN }}' - firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_PRIVSEC_356523 }}' - channelId: live - projectId: privsec-356523 diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml deleted file mode 100644 index 34ecf03..0000000 --- a/.github/workflows/firebase-hosting-pull-request.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Deploy to Firebase Hosting on PR -on: - workflow_run: - workflows: ["Build Hugo site on PR"] - types: - - completed - -jobs: - Preview: - runs-on: ubuntu-latest - if: > - ${{ github.event.workflow_run.event == 'pull_request' && - github.event.workflow_run.conclusion == 'success' }} - steps: - - name: Download artifact - uses: actions/github-script@v3.1.0 - with: - script: | - var artifacts = await github.actions.listWorkflowRunArtifacts({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: ${{github.event.workflow_run.id }}, - }); - var matchArtifact = artifacts.data.artifacts.filter((artifact) => { - return artifact.name == "hugo" - })[0]; - var download = await github.actions.downloadArtifact({ - owner: context.repo.owner, - repo: context.repo.repo, - artifact_id: matchArtifact.id, - archive_format: 'zip', - }); - var fs = require('fs'); - fs.writeFileSync('${{github.workspace}}/hugo.zip', Buffer.from(download.data)); - - - name: Unzip artifact - run: unzip hugo.zip - - - name: Remove artifact zip - run: rm hugo.zip - - - name: Deploy to Firebase - uses: FirebaseExtended/action-hosting-deploy@v0 - with: - repoToken: '${{ secrets.GITHUB_TOKEN }}' - firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_PRIVSEC_356523 }}' - projectId: privsec-356523 \ No newline at end of file diff --git a/.github/workflows/pull-request-receiver.yml b/.github/workflows/pull-request-receiver.yml deleted file mode 100644 index f1dd0a3..0000000 --- a/.github/workflows/pull-request-receiver.yml +++ /dev/null @@ -1,31 +0,0 @@ -# This file was auto-generated by the Firebase CLI -# https://github.com/firebase/firebase-tools - -name: Build Hugo site on PR -'on': pull_request -jobs: - Build_Hugo_Site: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - submodules: true # Fetch Hugo themes (true OR recursive) - fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - - #- name: Fecth External Blog - # run: ./external-blogs.sh - - - name: Hugo setup - uses: peaceiris/actions-hugo@v2 - with: - hugo-version: 'latest' - - - name: Build Hugo site - run: hugo --minify - - - name: Upload artifact - uses: actions/upload-artifact@v2 - with: - name: hugo - path: . diff --git a/.gitignore b/.gitignore index 51f2146..1c007d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,69 +1,7 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -firebase-debug.log* -firebase-debug.*.log* - -# Firebase cache -.firebase/ - -# Firebase config - -# Uncomment this if you'd like others to create their own Firebase project. -# For a team working on the same Firebase project(s), it is recommended to leave -# it commented so all members can deploy to the same project(s) in .firebaserc. -# .firebaserc - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - # Ignore .DS_Store files (macOS) -.DS_Store \ No newline at end of file +.DS_Store + +# Ignore Hugo generated files +public/ +resources/ +.hugo_build.lock \ No newline at end of file diff --git a/.hugo_build.lock b/.hugo_build.lock deleted file mode 100644 index e69de29..0000000 diff --git a/config.yml b/config.yml index fb6bc9c..fbc3c77 100644 --- a/config.yml +++ b/config.yml @@ -1,6 +1,5 @@ baseURL: "https://privsec.dev" title: PrivSec.dev -paginate: 5 theme: PaperMod enableRobotsTXT: true @@ -55,6 +54,8 @@ params: url: "https://github.com/PrivSec-dev" - name: matrix url: "https://matrix.to/#/#privsec:arcticfoxes.net" + - name: twitter + url: "https://twitter.com/privsec_dev" - name: email url: "mailto:contact@privsec.dev" - name: rss @@ -136,4 +137,4 @@ privacy: simple: false youtube: disable: false - privacyEnhanced: true \ No newline at end of file + privacyEnhanced: true diff --git a/content/about.md b/content/about.md index 32ef58b..8fc8468 100644 --- a/content/about.md +++ b/content/about.md @@ -1,11 +1,12 @@ --- title: "About Us" +date: 2022-07-16 +lastmod: 2022-07-21 --- PrivSec.dev is made by a group of enthusiastic individuals looking to provide practical privacy and security advice for the end user. We are security researchers, developers, system administrators... generally people with technical knowledge and work in the field. -We focus on in-depth system configuration, security analysis, and software/hardware recommendations. Our site is based on technical merits, not ideologies and politics. - +Just stick with Windows, Google Chrome, don't use 2FA. --- ### Tommy diff --git a/content/code.md b/content/code.md index 0301d00..5c817e1 100644 --- a/content/code.md +++ b/content/code.md @@ -1,5 +1,7 @@ --- title: "Code of Conflict" +date: 2022-07-18 +lastmod: 2022-07-21 --- The development effort of PrivSec.dev is a very personal process compared to “traditional” ways of developing a community website. Your recommendations and ideas behind it will be carefully reviewed, often resulting in critique and criticism. Know that this happens because everyone involved wants to see the best possible solution for the overall success of PrivSec.dev. diff --git a/content/donate.md b/content/donate.md index f5827c1..4d39170 100644 --- a/content/donate.md +++ b/content/donate.md @@ -1,5 +1,7 @@ --- title: "Donate" +date: 2022-07-16 +las --- The domain costs us $12/year to renew from Google. We got our repository hosted for free on GitHub. We got our site hosted for free with Firebase. It costs Tommy ~$20/month to run the mail server, but that server is used for a bunch of his projects, not just PrivSec, and we doubt it will be used that much anyways. The point is, this website does not cost much to run, and as such we will not be accepting donation as a project. diff --git a/content/privacy.md b/content/privacy.md index 332b7dd..6af4a49 100644 --- a/content/privacy.md +++ b/content/privacy.md @@ -1,5 +1,7 @@ --- title: "Privacy Policy" +date: 2022-07-18 +lastmod: 2022-07-21 --- PrivSec.dev as a project does not collect any personal information. We do not log your IPs, collect your fingerprints, or run any sort of analytics on you. In sort, we do not care who you are, what you do, or how you are using our website. It is none of our business. @@ -12,9 +14,9 @@ Services like Disqus, Instagram, and Google Analytics are disabled. We do link t ## Hosting Provider -We use Google Domains, Google DNS, and Google Firebase Hosting to run our website. We turn Google Analytics off for our project, so it should not collect any data on you. +We use Google Domains, Google DNS. We host our website on Netlify. We turn Netlify Analytics off for our project, so we do not have any information about you. We do not use Netlify assets optimization, so nothing is hosted on CloudFront. -For the Privacy Policy of Firebase Hosting, please check out [this link](https://firebase.google.com/support/privacy). +Netlify does store your IP address and access logs for less than 30 days. Please check out [this link](https://www.netlify.com/gdpr-ccpa/) for their policy regarding this. Their general privacy policy can be found [here](https://www.netlify.com/gdpr-ccpa/). ## Git Repository @@ -32,4 +34,5 @@ Direct or private messages with individuals are end to end encrypted by default. ## Email -Our mail server is hosted by Tommy on his own Dedicated Server colocated in the United Kingdom. Many of us use our @privsec.dev email as an alias and forward it to another email provider. The privacy of your emails with us is the same as with any other person you communicate with using this protocol - the hosting providers can read all of your conversations with us unless you are using PGP, and even when you use PGP there is no metadata protection. \ No newline at end of file +Our mail server is hosted by Tommy on his own Dedicated Server colocated in the United Kingdom. Many of us use our @privsec.dev email as an alias and forward it to another email provider. The privacy of your emails with us is the same as with any other person you communicate with using this protocol - the hosting providers can read all of your conversations with us unless you are using PGP, and even when you use PGP there is no metadata protection. + diff --git a/content/search.md b/content/search.md index 3d2fadc..2f41765 100644 --- a/content/search.md +++ b/content/search.md @@ -3,6 +3,6 @@ title: "Search" # in any language you want layout: "search" # is necessary # url: "/archive" # description: "Description for Search" -summary: "search" +summary: "Search" placeholder: "Enter your search query" --- \ No newline at end of file diff --git a/firebase.json b/firebase.json deleted file mode 100644 index 9d4f62e..0000000 --- a/firebase.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "hosting": { - "public": "public", - "headers": [ - { - "source": "*", - "headers": [ - { - "key": "Content-Security-Policy", - "value": "block-all-mixed-content; form-action 'none'; frame-ancestors 'self'" - }, - { - "key": "X-Content-Type-Options", - "value": "nosniff" - }, - { - "key": "Referrer-Policy", - "value": "no-referrer" - }, - { - "key": "Cross-Origin-Opener-Policy", - "value": "same-origin" - }, - { - "key": "Cross-Origin-Embedder-Policy", - "value": "require-corp" - }, - { - "key": "X-Frame-Options", - "value": "DENY" - }, - { - "key": "X-XSS-Protection", - "value": "0" - }, - { - "key": "Permissions-Policy", - "value": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), clipboard-read=(), clipboard-write=(), display-capture=(), document-domain=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), sync-xhr=(), usb=(), xr-spatial-tracking=()" - }, - { - "key": "Cross-Origin-Resource-Policy", - "value": "same-origin" - }, - { - "key": "Expect-CT", - "value": "enforce, max-age=63072000" - } - ] - } - ], - "ignore": [ - "firebase.json", - "**/.*", - "**/node_modules/**" - ] - } -} diff --git a/layouts/partials/post_nav_links.html b/layouts/partials/post_nav_links.html new file mode 100644 index 0000000..eb7f2b9 --- /dev/null +++ b/layouts/partials/post_nav_links.html @@ -0,0 +1,19 @@ +{{- $pages := where site.RegularPages.ByTitle "Type" "in" site.Params.mainSections }} +{{- if and (gt (len $pages) 1) (in $pages . ) }} + +{{- end }} \ No newline at end of file diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..243fa17 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,16 @@ +[[headers]] + for = "/*" + [headers.values] + Strict-Transport-Security = "max-age=63072000; includeSubDomains; preload" + Content-Security-Policy = "default-src 'self'; script-src 'self' 'unsafe-inline'; form-action 'none'; frame-ancestors 'none'; block-all-mixed-content; base-uri 'none'" + X-Content-Type-Options = "nosniff" + Referrer-Policy = "no-referrer" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Embedder-Policy = "require-corp" + X-Frame-Options = "DENY" + X-XSS-Protection = "0" + Permissions-Policy = "accelerometer=(), autoplay=(), camera=(), clipboard-read=(), clipboard-write=(), display-capture=(), document-domain=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), xr-spatial-tracking=()" + Cross-Origin-Resource-Policy = "same-origin" + +[context.deploy-preview] +command = "hugo -b $DEPLOY_PRIME_URL" diff --git a/resources/_gen/assets/scss/scss/main.scss_de1a7f5f1c8c46959803c429bb697ff0.content b/resources/_gen/assets/scss/scss/main.scss_de1a7f5f1c8c46959803c429bb697ff0.content deleted file mode 100644 index 690d3d5..0000000 --- a/resources/_gen/assets/scss/scss/main.scss_de1a7f5f1c8c46959803c429bb697ff0.content +++ /dev/null @@ -1,3 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */::-webkit-scrollbar{width:8px;height:8px;background:#212020}::-webkit-scrollbar-thumb{background:#888}::-webkit-scrollbar-thumb:hover{background:#dcdcdc}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-display:auto;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-display:auto;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-display:auto;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}code[class*="language-"],pre[class*="language-"]{color:white;background:none;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em black;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*="language-"],:not(pre)>code[class*="language-"]{background:#141414}pre[class*="language-"]{border-radius:.5em;border:0.3em solid #545454;box-shadow:1px 1px .5em black inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*="language-"]::-moz-selection{background:#27292a}pre[class*="language-"]::selection{background:#27292a}pre[class*="language-"]::-moz-selection,pre[class*="language-"] ::-moz-selection,code[class*="language-"]::-moz-selection,code[class*="language-"] ::-moz-selection{text-shadow:none;background:rgba(237,237,237,0.15)}pre[class*="language-"]::selection,pre[class*="language-"] ::selection,code[class*="language-"]::selection,code[class*="language-"] ::selection{text-shadow:none;background:rgba(237,237,237,0.15)}:not(pre)>code[class*="language-"]{border-radius:.3em;border:0.13em solid #545454;box-shadow:1px 1px .3em -.1em black inset;padding:.15em .2em .05em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#787878}.token.punctuation{opacity:.7}.token.namespace{opacity:.7}.token.tag,.token.boolean,.token.number,.token.deleted{color:#cf694a}.token.keyword,.token.property,.token.selector,.token.constant,.token.symbol,.token.builtin{color:#f9ee9a}.token.attr-name,.token.attr-value,.token.string,.token.char,.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable,.token.inserted{color:#919e6b}.token.atrule{color:#7386a5}.token.regex,.token.important{color:#e9c163}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}pre[data-line]{padding:1em 0 1em 3em;position:relative}.language-markup .token.tag,.language-markup .token.attr-name,.language-markup .token.punctuation{color:#ad895c}.token{position:relative;z-index:1}.line-highlight{background:rgba(84,84,84,0.25);background:linear-gradient(to right, rgba(84,84,84,0.1) 70%, rgba(84,84,84,0));border-bottom:1px dashed #545454;border-top:1px dashed #545454;left:0;line-height:inherit;margin-top:0.75em;padding:inherit 0;pointer-events:none;position:absolute;right:0;white-space:pre;z-index:0}.line-highlight:before,.line-highlight[data-end]:after{background-color:#8794a6;border-radius:999px;box-shadow:0 1px white;color:#f5f2f0;content:attr(data-start);font:bold 65%/1.5 sans-serif;left:.6em;min-width:1em;padding:0 .5em;position:absolute;text-align:center;text-shadow:none;top:.4em;vertical-align:.3em}.line-highlight[data-end]:after{bottom:.4em;content:attr(data-end);top:auto}pre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:rgba(153,122,102,0.08);background:linear-gradient(to right, rgba(153,122,102,0.1) 70%, rgba(153,122,102,0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:rgba(153,122,102,0.4);color:#f5f2f0;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128,128,128,0.2)}pre[class*="language-"].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*="language-"].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar .toolbar-item{display:inline-block}div.code-toolbar>.toolbar a{cursor:pointer}div.code-toolbar>.toolbar button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar a,div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em}div.code-toolbar>.toolbar a:hover,div.code-toolbar>.toolbar a:focus,div.code-toolbar>.toolbar button:hover,div.code-toolbar>.toolbar button:focus,div.code-toolbar>.toolbar span:hover,div.code-toolbar>.toolbar span:focus{color:inherit;text-decoration:none}:root{--phoneWidth: (max-width: 684px);--tabletWidth: (max-width: 900px)}@font-face{font-family:'Inter';font-style:normal;font-display:auto;font-weight:400;src:url("../fonts/Inter-Regular.woff2") format("woff2"),url("../fonts/Inter-Regular.woff") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-display:auto;font-weight:400;src:url("../fonts/Inter-Italic.woff2") format("woff2"),url("../fonts/Inter-Italic.woff") format("woff")}@font-face{font-family:'Inter';font-style:normal;font-display:auto;font-weight:600;src:url("../fonts/Inter-Medium.woff2") format("woff2"),url("../fonts/Inter-Medium.woff") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-display:auto;font-weight:600;src:url("../fonts/Inter-MediumItalic.woff2") format("woff2"),url("../fonts/Inter-MediumItalic.woff") format("woff")}@font-face{font-family:'Inter';font-style:normal;font-display:auto;font-weight:800;src:url("../fonts/Inter-Bold.woff2") format("woff2"),url("../fonts/Inter-Bold.woff") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-display:auto;font-weight:800;src:url("../fonts/Inter-BoldItalic.woff2") format("woff2"),url("../fonts/Inter-BoldItalic.woff") format("woff")}.button-container{display:table;margin-left:auto;margin-right:auto}button,.button,a.button{position:relative;display:flex;align-items:center;justify-content:center;padding:8px 18px;margin-bottom:5px;text-decoration:none;text-align:center;font-weight:500;border-radius:8px;border:1px solid transparent;appearance:none;cursor:pointer;outline:none;background:#fafafa}@media (prefers-color-scheme: dark){button,.button,a.button{background:#1b1c1d;color:inherit}}@media (prefers-color-scheme: light){button,.button,a.button{background:#fafafa}}[data-theme=dark] button,[data-theme=dark] .button,[data-theme=dark] a.button{background:#1b1c1d;color:inherit}[data-theme=light] button,[data-theme=light] .button,[data-theme=light] a.button{background:#fafafa}button.outline,.button.outline,a.button.outline{background:transparent;box-shadow:none;padding:8px 18px;border-color:#eaeaea}@media (prefers-color-scheme: dark){button.outline,.button.outline,a.button.outline{border-color:#3b3d42;color:inherit}}@media (prefers-color-scheme: light){button.outline,.button.outline,a.button.outline{border-color:#eaeaea}}[data-theme=dark] button.outline,[data-theme=dark] .button.outline,[data-theme=dark] a.button.outline{border-color:#3b3d42;color:inherit}[data-theme=light] button.outline,[data-theme=light] .button.outline,[data-theme=light] a.button.outline{border-color:#eaeaea}button.outline :hover,.button.outline :hover,a.button.outline :hover{transform:none;box-shadow:none}button.primary,.button.primary,a.button.primary{box-shadow:0 4px 6px rgba(50,50,93,0.11),0 1px 3px rgba(0,0,0,0.08)}button.primary:hover,.button.primary:hover,a.button.primary:hover{box-shadow:0 2px 6px rgba(50,50,93,0.21),0 1px 3px rgba(0,0,0,0.08)}button.link,.button.link,a.button.link{background:none;font-size:1rem}button.small,.button.small,a.button.small{font-size:.8rem}button.wide,.button.wide,a.button.wide{min-width:200px;padding:14px 24px}.code-toolbar{margin-bottom:20px}.code-toolbar .toolbar-item a{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:3px 8px;margin-bottom:5px;text-decoration:none;text-align:center;font-size:13px;font-weight:500;border-radius:8px;border:1px solid transparent;appearance:none;cursor:pointer;outline:none;background:#eaeaea}@media (prefers-color-scheme: dark){.code-toolbar .toolbar-item a{background:#3b3d42;color:inherit}}@media (prefers-color-scheme: light){.code-toolbar .toolbar-item a{background:#eaeaea}}[data-theme=dark] .code-toolbar .toolbar-item a{background:#3b3d42;color:inherit}[data-theme=light] .code-toolbar .toolbar-item a{background:#eaeaea}.header{display:flex;align-items:center;justify-content:center;position:relative;padding:20px;background:#fafafa}@media (prefers-color-scheme: dark){.header{background:#1b1c1d}}@media (prefers-color-scheme: light){.header{background:#fafafa}}[data-theme=dark] .header{background:#1b1c1d}[data-theme=light] .header{background:#fafafa}.header__right{display:flex;flex-direction:row;align-items:center}@media (max-width: 684px){.header__right{flex-direction:row-reverse}}.header__inner{display:flex;align-items:center;justify-content:space-between;margin:0 auto;width:760px;max-width:100%}.theme-toggle{display:flex;align-items:center;justify-content:center;line-height:1;cursor:pointer}.theme-toggler{fill:currentColor}.not-selectable{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.logo{display:flex;align-items:center;text-decoration:none;font-weight:bold;font-display:auto;font-family:monospace, monospace}.logo img{height:44px}.logo__mark{margin-right:5px}.logo__text{font-size:1.125rem}.logo__cursor{display:inline-block;width:10px;height:1rem;background:#fe5186;margin-left:5px;border-radius:1px;animation:cursor 1s infinite}@media (prefers-reduced-motion: reduce){.logo__cursor{animation:none}}@keyframes cursor{0%{opacity:0}50%{opacity:1}100%{opacity:0}}.menu{z-index:9999;background:#fafafa}@media (prefers-color-scheme: dark){.menu{background:#1b1c1d}}@media (prefers-color-scheme: light){.menu{background:#fafafa}}[data-theme=dark] .menu{background:#1b1c1d}[data-theme=light] .menu{background:#fafafa}@media (max-width: 684px){.menu{position:absolute;top:50px;right:0;border:none;margin:0;padding:10px}}.menu__inner{display:flex;align-items:center;justify-content:flex-start;max-width:100%;margin:0 auto;padding:0 15px;font-size:1rem;list-style:none}.menu__inner li{margin:0 12px}@media (max-width: 684px){.menu__inner{flex-direction:column;align-items:flex-start;padding:0}.menu__inner li{margin:0;padding:5px}}.menu-trigger{width:24px;height:24px;fill:currentColor;margin-left:10px;cursor:pointer;display:none}@media (max-width: 684px){.menu-trigger{display:block}}.menu a{display:inline-block;margin-right:15px;text-decoration:none}.menu a:hover{text-decoration:underline}.menu a:last-of-type{margin-right:0}.submenu{background:#fafafa}@media (prefers-color-scheme: dark){.submenu{background:#1b1c1d}}@media (prefers-color-scheme: light){.submenu{background:#fafafa}}[data-theme=dark] .submenu{background:#1b1c1d}[data-theme=light] .submenu{background:#fafafa}.submenu ul{list-style-type:none;margin:0;padding:0;overflow:hidden}.submenu li a,.submenu .dropbtn{display:inline-block;text-decoration:none}.submenu li.dropdown{display:inline-block}.submenu .dropdown-content{display:none;position:absolute;background:#1b1c1d}@media (prefers-color-scheme: light){.submenu .dropdown-content{background:#fafafa}}[data-theme=dark] .submenu .dropdown-content{background:#1b1c1d}[data-theme=light] .submenu .dropdown-content{background:#fafafa}.submenu .dropdown-content a{padding:12px 20px;text-decoration:none;display:block;text-align:left}.submenu .dropdown-content a:hover{background:#1b1c1d}@media (prefers-color-scheme: light){.submenu .dropdown-content a:hover{background:#fafafa}}[data-theme=dark] .submenu .dropdown-content a:hover{background:#1b1c1d}[data-theme=light] .submenu .dropdown-content a:hover{background:#fafafa}.submenu .dropdown:hover .dropdown-content{display:block}html{box-sizing:border-box;line-height:1.6;letter-spacing:0.06em;scroll-behavior:smooth}*,*:before,*:after{box-sizing:inherit}body{margin:0;padding:0;font-family:Inter, -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", Helvetica, Arial, sans-serif;font-display:auto;font-size:1rem;line-height:1.54;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;font-feature-settings:"liga", "tnum", "case", "calt", "zero", "ss01", "locl";-webkit-overflow-scrolling:touch;-webkit-text-size-adjust:100%;display:flex;min-height:100vh;flex-direction:column;background-color:#fff;color:#222}@media (max-width: 684px){body{font-size:1rem}}@media (prefers-color-scheme: dark){body{background-color:#232425;color:#a9a9b3}}@media (prefers-color-scheme: light){body{background-color:#fff;color:#222}}[data-theme=dark] body{background-color:#232425;color:#a9a9b3}[data-theme=light] body{background-color:#fff;color:#222}h2,h3,h4,h5,h6{display:flex;align-items:center;line-height:1.3}h1{font-size:2.625rem}h2{font-size:1.625rem;margin-top:2.5em}h3{font-size:1.375rem}h4{font-size:1.125rem}@media (max-width: 684px){h1{font-size:2rem}h2{font-size:1.4rem}h3{font-size:1.15rem}h4{font-size:1.125rem}}a{color:inherit}img{display:block;max-width:100%}img.left{margin-right:auto}img.center{margin-left:auto;margin-right:auto}img.right{margin-left:auto}img.circle{border-radius:50%;max-width:25%;margin:auto}figure{display:table;max-width:100%;margin:25px 0}figure.left{margin-right:auto}figure.left-floated{margin-right:auto;float:left}figure.left-floated img{margin:20px 20px 20px 0}figure.center{margin-left:auto;margin-right:auto}figure.right{margin-left:auto}figure.right-floated{margin-left:auto;float:right}figure.right-floated img{margin:20px 0 20px 20px}figure.rounded img{border-radius:50%}figure figcaption{font-size:14px;margin-top:5px;opacity:0.8}figure figcaption.left{text-align:left}figure figcaption.center{text-align:center}figure figcaption.right{text-align:right}em,i,strong{color:#000}@media (prefers-color-scheme: dark){em,i,strong{color:#fff}}@media (prefers-color-scheme: light){em,i,strong{color:#000}}[data-theme=dark] em,[data-theme=dark] i,[data-theme=dark] strong{color:white}[data-theme=light] em,[data-theme=light] i,[data-theme=light] strong{color:black}code{font-family:Consolas, Monaco, Andale Mono, Ubuntu Mono, monospace;font-display:auto;font-feature-settings:normal;padding:1px 6px;margin:0 2px;border-radius:5px;font-size:0.95rem;background:#eaeaea}@media (prefers-color-scheme: dark){code{background:#3b3d42}}@media (prefers-color-scheme: light){code{background:#eaeaea}}[data-theme=dark] code{background:#3b3d42}[data-theme=light] code{background:#eaeaea}pre{padding:10px 10px 10px 20px;border-radius:8px;font-size:0.95rem;overflow:auto}[data-theme=dark] pre{background-color:#3b3d42}[data-theme=light] pre{background-color:#eaeaea}@media (max-width: 684px){pre{white-space:pre-wrap;word-wrap:break-word}}pre code{background:none !important;margin:0;padding:0;font-size:inherit;color:#ccc}@media (prefers-color-scheme: dark){pre code{color:inherit}}@media (prefers-color-scheme: light){pre code{color:#ccc}}[data-theme=dark] pre code{color:inherit}[data-theme=light] pre code{color:#ccc}blockquote{border-left:3px solid #3eb0ef;margin:40px;padding:10px 20px}@media (max-width: 684px){blockquote{margin:10px;padding:10px}}blockquote:before{content:"”";font-family:Georgia, serif;font-display:auto;font-size:3.875rem;position:absolute;left:-40px;top:-20px}blockquote p:first-of-type{margin-top:0}blockquote p:last-of-type{margin-bottom:0}ul,ol{margin-left:40px;padding:0}@media (max-width: 684px){ul,ol{margin-left:20px}}ol ol{list-style-type:lower-alpha}.container{flex:1 auto;display:flex;flex-direction:column;justify-content:center;text-align:center}.content{display:flex;flex-direction:column;flex:1 auto;align-items:center;justify-content:center;margin:0}@media (max-width: 684px){.content{margin-top:0}}hr{width:100%;border:none;height:1px;background:#dcdcdc}@media (prefers-color-scheme: dark){hr{background:#4e4e57}}@media (prefers-color-scheme: light){hr{background:#dcdcdc}}[data-theme=dark] hr{background:#4e4e57}[data-theme=light] hr{background:#dcdcdc}.hidden{display:none}@media (max-width: 684px){.hide-on-phone{display:none}}@media (max-width: 900px){.hide-on-tablet{display:none}}.screen-reader-text{border:0;clip:rect(1px, 1px, 1px, 1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute !important;width:1px;word-wrap:normal !important}.screen-reader-text:focus{background-color:#f1f1f1;border-radius:3px;box-shadow:0 0 2px 2px rgba(0,0,0,0.6);clip:auto !important;clip-path:none;color:#21759b;display:block;font-size:14px;font-size:0.875rem;font-weight:bold;height:auto;width:auto;top:5px;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;z-index:100000}.background-image{background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:center center}.highlight{margin:30px auto}.posts{width:100%;max-width:800px;text-align:left;padding:20px;margin:20px auto}@media (max-width: 900px){.posts{max-width:660px}}.posts:not(:last-of-type){border-bottom:1px solid #dcdcdc}@media (prefers-color-scheme: dark){.posts:not(:last-of-type){border-bottom:1px solid #4e4e57}}@media (prefers-color-scheme: light){.posts:not(:last-of-type){border-bottom:1px solid #dcdcdc}}[data-theme=dark] .posts:not(:last-of-type){border-bottom:1px solid #4e4e57}[data-theme=light] .posts:not(:last-of-type){border-bottom:1px solid #dcdcdc}.posts-group{display:flex;margin-bottom:1.9em;line-height:normal}@media (max-width: 900px){.posts-group{display:block}}.posts-list{flex-grow:1;margin:0;padding:0;list-style:none}.posts .post-title{font-size:1rem;margin:5px 0 5px 0}.posts .post-year{padding-top:6px;margin-right:1.8em;font-size:1.6em;opacity:.6}@media (max-width: 900px){.posts .post-year{margin:-6px 0 4px}}.posts .post-item{border-bottom:1px grey dashed}.posts .post-item a{display:flex;justify-content:space-between;align-items:baseline;padding:12px 0;text-decoration:none}.posts .post-day{flex-shrink:0;margin-left:1em;opacity:.6}.post{width:100%;max-width:800px;text-align:left;padding:20px;margin:20px auto}@media (max-width: 900px){.post{max-width:600px}}.post-date:after{content:'—'}.post-title{font-size:2.625rem;margin:0 0 20px}@media (max-width: 684px){.post-title{font-size:2rem}}.post-title a{text-decoration:none}.post-tags{display:block;margin-bottom:20px;font-size:1rem;opacity:0.5}.post-tags a{text-decoration:none}.post-content{margin-top:30px}.post-cover{border-radius:8px;margin:40px -50px;width:860px;max-width:860px;overflow:hidden}@media (max-width: 900px){.post-cover{margin:20px 0;width:100%}}.post-excerpt{color:grey;font-style:italic}.post-info{margin-top:30px;font-size:0.8rem;line-height:normal;opacity:.6}.post-info p{margin:0.8em 0}.post-info a:hover{border-bottom:1px solid white}.post-info svg{margin-right:0.8em}.post-info .tag{margin-right:0.5em}.post-info .tag::before{content:"#"}.post-info .feather{display:inline-block;vertical-align:-.125em;width:1em;height:1em}.post-audio{display:flex;justify-content:center;align-items:center;padding-top:20px}.post-audio audio{width:90%}.post .flag{border-radius:50%;margin:0 5px}.pagination{margin-top:20px}.pagination__title{display:flex;text-align:center;position:relative;margin:20px 0}.pagination__title-h{text-align:center;margin:0 auto;padding:5px 10px;font-size:0.8rem;text-transform:uppercase;text-decoration:none;letter-spacing:0.1em;z-index:1;background:#fff;color:#999}@media (prefers-color-scheme: dark){.pagination__title-h{background:#232425;color:#b3b3bd}}@media (prefers-color-scheme: light){.pagination__title-h{background:#fff;color:#999}}[data-theme=dark] .pagination__title-h{background:#232425;color:#b3b3bd}[data-theme=light] .pagination__title-h{background:#fff;color:#999}.pagination__title hr{position:absolute;left:0;right:0;width:100%;margin-top:15px;z-index:0}.pagination__buttons{display:flex;align-items:center;justify-content:center}.pagination__buttons a{text-decoration:none;font-weight:bold}.button{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;font-weight:600;border-radius:8px;max-width:40%;padding:0;cursor:pointer;appearance:none;background:#eaeaea}@media (prefers-color-scheme: dark){.button{background:#3b3d42}}@media (prefers-color-scheme: light){.button{background:#eaeaea}}[data-theme=dark] .button{background:#3b3d42}[data-theme=light] .button{background:#eaeaea}.button+.button{margin-left:10px}.button a{display:flex;padding:8px 16px;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button.next .button__icon{margin-left:8px}.button.previous .button__icon{margin-right:8px}.footer{padding:40px 20px;flex-grow:0;color:#999}.footer__inner{display:flex;align-items:center;justify-content:center;margin:0 auto;width:760px;max-width:100%}@media (max-width: 900px){.footer__inner{flex-direction:column}}.footer__content{display:flex;flex-direction:row;align-items:center;font-size:1rem;color:#999}@media (max-width: 900px){.footer__content{flex-direction:column;margin-top:10px}}.footer__content>*:not(:last-child)::after{content:"•";padding:0 5px}@media (max-width: 900px){.footer__content>*:not(:last-child)::after{content:"";padding:0}}.footer__content>*:last-child{padding:0 0px}@media (max-width: 900px){.footer__content>*:last-child{padding:0}}.sharing-buttons{display:flex;flex-wrap:wrap;justify-content:space-between}.sharing-buttons .resp-sharing-button__icon,.sharing-buttons .resp-sharing-button__link{display:inline-block}.sharing-buttons .resp-sharing-button__link{text-decoration:none;margin:0.5em}.sharing-buttons .resp-sharing-button{border-radius:5px;transition:25ms ease-out;padding:0.5em 0.75em;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.sharing-buttons .resp-sharing-button__icon svg{width:1em;height:1em;margin-right:0.4em;vertical-align:top}.sharing-buttons .resp-sharing-button--small svg{margin:0;vertical-align:middle}.post-content table{border-collapse:collapse;margin:25px auto;font-size:0.9em;min-width:400px;max-width:100%}.post-content table th,.post-content table td{padding:12px 15px;border:1px solid #dcdcdc}@media (prefers-color-scheme: dark){.post-content table th,.post-content table td{border:1px solid #4e4e57}}@media (prefers-color-scheme: light){.post-content table th,.post-content table td{border:1px solid #dcdcdc}}[data-theme=dark] .post-content table th,[data-theme=dark] .post-content table td{border:1px solid #4e4e57}[data-theme=light] .post-content table th,[data-theme=light] .post-content table td{border:1px solid #dcdcdc}.post-content table thead tr{text-align:left;background-color:#dcdcdc;color:#222}@media (prefers-color-scheme: dark){.post-content table thead tr{background-color:#4e4e57;color:#a9a9b3}}@media (prefers-color-scheme: light){.post-content table thead tr{background-color:#dcdcdc;color:#222}}[data-theme=dark] .post-content table thead tr{background-color:#4e4e57;color:#a9a9b3}[data-theme=light] .post-content table thead tr{background-color:#dcdcdc;color:#222}.post-content table tbody tr{border:1px solid #dcdcdc}@media (prefers-color-scheme: dark){.post-content table tbody tr{border:1px solid #4e4e57}}@media (prefers-color-scheme: light){.post-content table tbody tr{border:1px solid #dcdcdc}}[data-theme=dark] .post-content table tbody tr{border:1px solid #4e4e57}[data-theme=light] .post-content table tbody tr{border:1px solid #dcdcdc}.btn-404 svg{vertical-align:middle;display:inline-block;margin-right:5px}.btn-404 a{margin:0 10px} - -/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/scss/main.scss_de1a7f5f1c8c46959803c429bb697ff0.json b/resources/_gen/assets/scss/scss/main.scss_de1a7f5f1c8c46959803c429bb697ff0.json deleted file mode 100644 index 8b1079e..0000000 --- a/resources/_gen/assets/scss/scss/main.scss_de1a7f5f1c8c46959803c429bb697ff0.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"main.4e5c639214707eff609bb55fe49e183dee42258a73bc90e4cc7b0a84f900798a.css","MediaType":"text/css","Data":{"Integrity":"sha256-TlxjkhRwfv9gm7Vf5J4YPe5CJYpzvJDkzHsKhPkAeYo="}} \ No newline at end of file diff --git a/static/.well-known/mta-sts.txt b/static/.well-known/mta-sts.txt new file mode 100644 index 0000000..a861061 --- /dev/null +++ b/static/.well-known/mta-sts.txt @@ -0,0 +1,4 @@ +version: STSv1 +mode: enforce +mx: mail.tommytran.io +max_age: 604800 \ No newline at end of file