├── .dockerignore ├── .editorconfig ├── .env.example ├── .eslintignore ├── .eslintrc.js ├── .example.env ├── .gitattributes ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc.js ├── .stackblitzrc ├── .trunk ├── .gitignore ├── configs │ ├── .hadolint.yaml │ ├── .markdownlint.yaml │ ├── .yamllint.yaml │ └── svgo.config.js └── trunk.yaml ├── .vscode ├── astrowind │ └── config-schema.json ├── extensions.json ├── launch.json └── settings.json ├── Dockerfile ├── LICENSE.md ├── README.md ├── astro.config.mjs ├── docker-compose.yaml ├── netlify.toml ├── package-lock.json ├── package.json ├── public ├── .well-known │ ├── lnurlp │ │ ├── bitkarrot │ │ ├── soc │ │ └── xenonfun │ └── nostr.json ├── _headers ├── decapcms │ ├── config.yml │ └── index.html ├── images │ ├── Bitcoin_Lightbulb_Effect.jpg │ ├── electric_bitcoin.jpg │ ├── electric_bitcoin.png │ ├── electric_bitcoin.webp │ ├── events2.jpg │ ├── external-link.png │ ├── icon-orange-transparent.png │ ├── lnbitslogo.svg │ ├── logo-circular-transparent.png │ ├── logodark.png │ ├── nostr.png │ ├── prfeedback.png │ ├── sat-symbol │ │ ├── Satoshi-regular-black.png │ │ ├── Satoshi-regular-elipse-black-grey.png │ │ ├── Satoshi-regular-elipse-black.png │ │ ├── Satoshi-regular-elipse.png │ │ ├── Satoshi-regular-white-trans.png │ │ └── Satoshi-regular-white.png │ ├── supporters │ │ ├── Sphinx-Logo-V1.png │ │ ├── alby_logo.png │ │ ├── csys.png │ │ ├── darkalby.png │ │ ├── light_lngames.png │ │ ├── lightalby.png │ │ ├── lightlngames.png │ │ ├── logo-stak.svg │ │ └── staksquare.png │ └── xkcd.png └── robots.txt ├── sandbox.config.json ├── src ├── assets │ ├── favicons │ │ ├── apple-touch-icon-astro.png │ │ ├── apple-touch-icon.png │ │ ├── favicon.ico │ │ ├── favicon.svg │ │ └── favicon_bw.svg │ ├── images │ │ ├── caos.jpg │ │ ├── default.jpg │ │ ├── default.png │ │ ├── electricbitcoin.jpg │ │ ├── electricbitcoin.png │ │ ├── hero-image.png │ │ └── laptops.avif │ └── styles │ │ └── tailwind.css ├── components │ ├── CorpForm.svelte │ ├── CustomStyles.astro │ ├── DonateForm.svelte │ ├── Favicons.astro │ ├── IndivForm.svelte │ ├── Logo.astro │ ├── blog │ │ ├── Grid.astro │ │ ├── GridItem.astro │ │ ├── Headline.astro │ │ ├── List.astro │ │ ├── ListItem.astro │ │ ├── Pagination.astro │ │ ├── SinglePost.astro │ │ ├── Tags.astro │ │ └── ToBlogLink.astro │ ├── common │ │ ├── Analytics.astro │ │ ├── ApplyColorMode.astro │ │ ├── BasicScripts.astro │ │ ├── CommonMeta.astro │ │ ├── Image.astro │ │ ├── Metadata.astro │ │ ├── SiteVerification.astro │ │ ├── SocialShare.astro │ │ ├── SplitbeeAnalytics.astro │ │ ├── ToggleMenu.astro │ │ ├── ToggleTheme.astro │ │ └── YoutubeVideo.astro │ ├── ui │ │ ├── Background.astro │ │ ├── Button.astro │ │ ├── DListItem.astro │ │ ├── Form.astro │ │ ├── Headline.astro │ │ ├── ItemGrid.astro │ │ ├── ItemGrid2.astro │ │ ├── Timeline.astro │ │ └── WidgetWrapper.astro │ └── widgets │ │ ├── Announcement.astro │ │ ├── BlogHighlightedPosts.astro │ │ ├── BlogLatestPosts.astro │ │ ├── Brands.astro │ │ ├── CallToAction.astro │ │ ├── Contact.astro │ │ ├── Content.astro │ │ ├── FAQs.astro │ │ ├── Features.astro │ │ ├── Features2.astro │ │ ├── Features3.astro │ │ ├── Footer.astro │ │ ├── Header.astro │ │ ├── Hero.astro │ │ ├── Hero2.astro │ │ ├── HeroText.astro │ │ ├── Note.astro │ │ ├── Pricing.astro │ │ ├── Stats.astro │ │ ├── Steps.astro │ │ ├── Steps2.astro │ │ └── Testimonials.astro ├── config.mjs ├── config.yaml ├── content │ ├── config.ts │ └── post │ │ ├── 2024Q2_update.md │ │ ├── Apr_2024_Contributors.md │ │ ├── BloggingOnNostr.md │ │ ├── Dec_2023_Collaborators.md │ │ ├── Environment_Setup.md │ │ ├── FOSS_best_practices.md │ │ ├── Feb_2024_Contributors.md │ │ ├── Jan_2024_Contributors.md │ │ ├── Mar_2024_Contributors.md │ │ ├── May_2024_Contributors.md │ │ ├── Nov_2023_Collaborators.md │ │ ├── Oct_2023_Collaborators.md │ │ ├── _images │ │ ├── BloggingBitcoinAvatar.png │ │ ├── Build_The_Future.webp │ │ ├── November.jpg │ │ ├── april.png │ │ ├── august.jpg │ │ ├── bitcoin_community_growth.png │ │ ├── cityscape.webp │ │ ├── code_image.jpg │ │ ├── december.jph.webp │ │ ├── do-more.jpg │ │ ├── env-setup.webp │ │ ├── events.png │ │ ├── february.jpeg │ │ ├── foss.jpg │ │ ├── git.png │ │ ├── january.png │ │ ├── july.jpg │ │ ├── june.jpg │ │ ├── lightningfaucet.webp │ │ ├── lightningfaucet2.webp │ │ ├── lnprisms │ │ │ ├── lnprisms-lnbits1.webp │ │ │ ├── lnprisms-lnbits2.webp │ │ │ ├── lnprisms-lnbits3.webp │ │ │ ├── lnprisms-lnbits4.webp │ │ │ └── lnprisms.webp │ │ ├── march.jpeg │ │ ├── may.png │ │ ├── nostrich.webp │ │ ├── october.jpg │ │ ├── opensource.jpg │ │ ├── purpleimg.webp │ │ ├── september.png │ │ ├── testnet-lightning.png │ │ └── tools.jpg │ │ ├── about.md │ │ ├── common_git_issues.md │ │ ├── crafting_your_story.md │ │ ├── create_value.md │ │ ├── events.md │ │ ├── first_pr.md │ │ ├── git_basics.md │ │ ├── lightning-prisms.md │ │ ├── lightningfaucets.md │ │ ├── mentors.md │ │ ├── not_one_vertical.md │ │ ├── resources.md │ │ ├── testnet_how_to.md │ │ ├── unwritten_rules_foss.md │ │ └── why-nostr-wins.md ├── data.js ├── env.d.ts ├── icons │ ├── btc.svg │ ├── btcpay-logo.svg │ ├── faucet-drip.svg │ ├── lnbits.svg │ ├── nostr_logo_prpl.svg │ └── nostr_logo_prpl_wht_rnd.svg ├── layouts │ ├── LandingLayout.astro │ ├── Layout.astro │ ├── MarkdownLayout.astro │ └── PageLayout.astro ├── navigation.js ├── pages │ ├── 404.astro │ ├── Corp.astro │ ├── Indiv.astro │ ├── [...blog] │ │ ├── [...page].astro │ │ ├── [category] │ │ │ └── [...page].astro │ │ ├── [tag] │ │ │ └── [...page].astro │ │ └── index.astro │ ├── api │ │ ├── donate.js │ │ ├── get_invoice.js │ │ └── new-user.js │ ├── discord.astro │ ├── donate.astro │ ├── index.astro │ ├── join-us.astro │ ├── landing │ │ ├── click-through.astro │ │ ├── lead-generation.astro │ │ ├── pre-launch.astro │ │ ├── product.astro │ │ ├── sales.astro │ │ └── subscription.astro │ ├── privacy.md │ ├── rss.xml.ts │ ├── services.astro │ ├── supporters.astro │ ├── terms.md │ └── thankyou.astro ├── types.d.ts └── utils │ ├── blog.ts │ ├── config.ts │ ├── directories.ts │ ├── frontmatter.mjs │ ├── images-optimization.ts │ ├── images.ts │ ├── permalinks.ts │ ├── tasks.mjs │ └── utils.ts ├── svelte.config.js ├── tailwind.config.cjs ├── tsconfig.json ├── vercel.json └── vscode.tailwind.json /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | Dockerfile 4 | docker-compose.yml 5 | .git 6 | .gitignore 7 | README.md 8 | LICENSE 9 | 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | charset = utf-8 8 | end_of_line = lf 9 | indent_size = 2 10 | indent_style = space 11 | insert_final_newline = true 12 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # server side, DO NOT expose to client 2 | SUPABASE_URL='' 3 | SUPABASE_KEY='' 4 | PAYLINK_URL='your url here' 5 | 6 | # client side, public and available anywhere, uses PUBLIC prefix 7 | PUBLIC_INDIV_FEE=100000 8 | PUBLIC_CORP_FEE=300000 9 | 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .github 4 | types.generated.d.ts -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /** @type {import("eslint").Linter.Config} */ 2 | module.exports = { 3 | env: { 4 | node: true, 5 | es2022: true, 6 | browser: true, 7 | }, 8 | extends: ['eslint:recommended', 'plugin:astro/recommended'], 9 | parser: '@typescript-eslint/parser', 10 | parserOptions: { 11 | tsconfigRootDir: __dirname, 12 | ecmaVersion: 'latest', 13 | sourceType: 'module', 14 | }, 15 | rules: {}, 16 | overrides: [ 17 | { 18 | files: ['*.js'], 19 | rules: { 20 | 'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'], 21 | }, 22 | }, 23 | { 24 | files: ['*.astro'], 25 | parser: 'astro-eslint-parser', 26 | parserOptions: { 27 | parser: '@typescript-eslint/parser', 28 | extraFileExtensions: ['.astro'], 29 | }, 30 | rules: { 31 | 'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'], 32 | }, 33 | }, 34 | { 35 | files: ['*.ts'], 36 | parser: '@typescript-eslint/parser', 37 | extends: ['plugin:@typescript-eslint/recommended'], 38 | rules: { 39 | '@typescript-eslint/no-unused-vars': [ 40 | 'error', 41 | { argsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_' }, 42 | ], 43 | '@typescript-eslint/no-non-null-assertion': 'off', 44 | }, 45 | }, 46 | { 47 | // Define the configuration for ` 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/images/Bitcoin_Lightbulb_Effect.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/Bitcoin_Lightbulb_Effect.jpg -------------------------------------------------------------------------------- /public/images/electric_bitcoin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/electric_bitcoin.jpg -------------------------------------------------------------------------------- /public/images/electric_bitcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/electric_bitcoin.png -------------------------------------------------------------------------------- /public/images/electric_bitcoin.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/electric_bitcoin.webp -------------------------------------------------------------------------------- /public/images/events2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/events2.jpg -------------------------------------------------------------------------------- /public/images/external-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/external-link.png -------------------------------------------------------------------------------- /public/images/icon-orange-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/icon-orange-transparent.png -------------------------------------------------------------------------------- /public/images/logo-circular-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/logo-circular-transparent.png -------------------------------------------------------------------------------- /public/images/logodark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/logodark.png -------------------------------------------------------------------------------- /public/images/nostr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/nostr.png -------------------------------------------------------------------------------- /public/images/prfeedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/prfeedback.png -------------------------------------------------------------------------------- /public/images/sat-symbol/Satoshi-regular-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/sat-symbol/Satoshi-regular-black.png -------------------------------------------------------------------------------- /public/images/sat-symbol/Satoshi-regular-elipse-black-grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/sat-symbol/Satoshi-regular-elipse-black-grey.png -------------------------------------------------------------------------------- /public/images/sat-symbol/Satoshi-regular-elipse-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/sat-symbol/Satoshi-regular-elipse-black.png -------------------------------------------------------------------------------- /public/images/sat-symbol/Satoshi-regular-elipse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/sat-symbol/Satoshi-regular-elipse.png -------------------------------------------------------------------------------- /public/images/sat-symbol/Satoshi-regular-white-trans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/sat-symbol/Satoshi-regular-white-trans.png -------------------------------------------------------------------------------- /public/images/sat-symbol/Satoshi-regular-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/sat-symbol/Satoshi-regular-white.png -------------------------------------------------------------------------------- /public/images/supporters/Sphinx-Logo-V1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/supporters/Sphinx-Logo-V1.png -------------------------------------------------------------------------------- /public/images/supporters/alby_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/supporters/alby_logo.png -------------------------------------------------------------------------------- /public/images/supporters/csys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/supporters/csys.png -------------------------------------------------------------------------------- /public/images/supporters/darkalby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/supporters/darkalby.png -------------------------------------------------------------------------------- /public/images/supporters/light_lngames.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/supporters/light_lngames.png -------------------------------------------------------------------------------- /public/images/supporters/lightalby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/supporters/lightalby.png -------------------------------------------------------------------------------- /public/images/supporters/lightlngames.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/supporters/lightlngames.png -------------------------------------------------------------------------------- /public/images/supporters/staksquare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/supporters/staksquare.png -------------------------------------------------------------------------------- /public/images/xkcd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/public/images/xkcd.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: -------------------------------------------------------------------------------- /sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "infiniteLoopProtection": true, 3 | "hardReloadOnChange": false, 4 | "view": "browser", 5 | "template": "node", 6 | "container": { 7 | "port": 3000, 8 | "startScript": "start", 9 | "node": "18" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/assets/favicons/apple-touch-icon-astro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/favicons/apple-touch-icon-astro.png -------------------------------------------------------------------------------- /src/assets/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /src/assets/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/favicons/favicon.ico -------------------------------------------------------------------------------- /src/assets/favicons/favicon_bw.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.14, written by Peter Selinger 2001-2017 9 | 10 | 12 | 25 | 29 | 34 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/assets/images/caos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/images/caos.jpg -------------------------------------------------------------------------------- /src/assets/images/default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/images/default.jpg -------------------------------------------------------------------------------- /src/assets/images/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/images/default.png -------------------------------------------------------------------------------- /src/assets/images/electricbitcoin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/images/electricbitcoin.jpg -------------------------------------------------------------------------------- /src/assets/images/electricbitcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/images/electricbitcoin.png -------------------------------------------------------------------------------- /src/assets/images/hero-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/images/hero-image.png -------------------------------------------------------------------------------- /src/assets/images/laptops.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plebnet-dev/website/dee3ff11a3df722ba5bef5f357de8adcc0ea1dc1/src/assets/images/laptops.avif -------------------------------------------------------------------------------- /src/assets/styles/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer utilities { 6 | .bg-page { 7 | background-color: var(--aw-color-bg-page); 8 | } 9 | .bg-dark { 10 | background-color: var(--aw-color-bg-page-dark); 11 | } 12 | .bg-light { 13 | background-color: var(--aw-color-bg-page); 14 | } 15 | .text-page { 16 | color: var(--aw-color-text-page); 17 | } 18 | .text-muted { 19 | color: var(--aw-color-text-muted); 20 | } 21 | } 22 | 23 | @layer components { 24 | .btn { 25 | @apply inline-flex items-center justify-center rounded-full border-gray-400 border bg-transparent font-medium text-center text-base text-page leading-snug transition py-3.5 px-6 md:px-8 ease-in duration-200 focus:ring-blue-500 focus:ring-offset-blue-200 focus:ring-2 focus:ring-offset-2 hover:bg-gray-100 hover:border-gray-600 dark:text-slate-300 dark:border-slate-500 dark:hover:bg-slate-800 dark:hover:border-slate-800 cursor-pointer; 26 | } 27 | 28 | .btn-primary { 29 | @apply btn font-semibold bg-primary text-white border-primary hover:bg-secondary hover:border-secondary hover:text-white dark:text-white dark:bg-primary dark:border-primary dark:hover:border-secondary dark:hover:bg-secondary; 30 | } 31 | 32 | .btn-secondary { 33 | @apply btn; 34 | } 35 | 36 | .btn-tertiary { 37 | @apply btn border-none shadow-none text-muted hover:text-gray-900 dark:text-gray-400 dark:hover:text-white; 38 | } 39 | } 40 | 41 | #header.scroll > div:first-child { 42 | @apply bg-page md:bg-white/90 md:backdrop-blur-md; 43 | box-shadow: 0 0.375rem 1.5rem 0 rgb(140 152 164 / 13%); 44 | } 45 | .dark #header.scroll > div:first-child, 46 | #header.scroll.dark > div:first-child { 47 | @apply bg-page md:bg-[#030621e6] border-b border-gray-500/20; 48 | box-shadow: none; 49 | } 50 | /* #header.scroll > div:last-child { 51 | @apply py-3; 52 | } */ 53 | 54 | #header.expanded nav { 55 | position: fixed; 56 | top: 70px; 57 | left: 0; 58 | right: 0; 59 | bottom: 70px !important; 60 | padding: 0 5px; 61 | } 62 | 63 | .dropdown:hover .dropdown-menu { 64 | display: block; 65 | } 66 | 67 | [astro-icon].icon-light > * { 68 | stroke-width: 1.2; 69 | } 70 | 71 | [astro-icon].icon-bold > * { 72 | stroke-width: 2.4; 73 | } 74 | 75 | [data-aw-toggle-menu] path { 76 | @apply transition; 77 | } 78 | [data-aw-toggle-menu].expanded g > path:first-child { 79 | @apply -rotate-45 translate-y-[15px] translate-x-[-3px]; 80 | } 81 | 82 | [data-aw-toggle-menu].expanded g > path:last-child { 83 | @apply rotate-45 translate-y-[-8px] translate-x-[14px]; 84 | } 85 | 86 | /* To deprecated */ 87 | 88 | .dd *:first-child { 89 | margin-top: 0; 90 | } 91 | -------------------------------------------------------------------------------- /src/components/CustomStyles.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import '@fontsource-variable/inter'; 3 | 4 | // 'DM Sans' 5 | // Nunito 6 | // Dosis 7 | // Outfit 8 | // Roboto 9 | // Literata 10 | // 'IBM Plex Sans' 11 | // Karla 12 | // Poppins 13 | // 'Fira Sans' 14 | // 'Libre Franklin' 15 | // Inconsolata 16 | // Raleway 17 | // Oswald 18 | // 'Space Grotesk' 19 | // Urbanist 20 | --- 21 | 22 | 61 | -------------------------------------------------------------------------------- /src/components/Favicons.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import favIcon from '~/assets/favicons/favicon.ico'; 3 | import favIconSvg from '~/assets/favicons/favicon.svg'; 4 | import appleTouchIcon from '~/assets/favicons/apple-touch-icon.png'; 5 | --- 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/components/Logo.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { SITE } from '~/utils/config'; 3 | --- 4 | plebnet.dev logo 5 | 6 | {SITE?.name} 7 | 8 | -------------------------------------------------------------------------------- /src/components/blog/Grid.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Item from '~/components/blog/GridItem.astro'; 3 | import type { Post } from '~/types'; 4 | 5 | export interface Props { 6 | posts: Array; 7 | } 8 | 9 | const { posts } = Astro.props; 10 | --- 11 | 12 |
13 | {posts.map((post) => )} 14 |
15 | -------------------------------------------------------------------------------- /src/components/blog/GridItem.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { APP_BLOG } from '~/utils/config'; 3 | import type { Post } from '~/types'; 4 | 5 | import Image from '~/components/common/Image.astro'; 6 | 7 | import { findImage } from '~/utils/images'; 8 | import { getPermalink } from '~/utils/permalinks'; 9 | 10 | 11 | export interface Props { 12 | post: Post; 13 | } 14 | 15 | const { post } = Astro.props; 16 | const image = (await findImage(post.image)); 17 | --- 18 | 19 |
20 |
21 | { 22 | image && ( 23 | 24 | {post.title} 36 | 37 | ) 38 | } 39 |
40 |

41 | { 42 | !APP_BLOG?.post?.isEnabled ? ( 43 | post.title 44 | ) : ( 45 | 49 | {post.title} 50 | 51 | ) 52 | } 53 |

54 |

{post.excerpt}

55 |
56 | -------------------------------------------------------------------------------- /src/components/blog/Headline.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { title = await Astro.slots.render('default'), subtitle = await Astro.slots.render('subtitle') } = Astro.props; 3 | --- 4 | 5 |
6 |

7 | { 8 | subtitle && ( 9 |
10 | ) 11 | } 12 |

13 | -------------------------------------------------------------------------------- /src/components/blog/List.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Item from '~/components/blog/ListItem.astro'; 3 | import type { Post } from '~/types'; 4 | 5 | export interface Props { 6 | posts: Array; 7 | } 8 | 9 | const { posts } = Astro.props; 10 | --- 11 | 12 | 21 | -------------------------------------------------------------------------------- /src/components/blog/ListItem.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import type { ImageMetadata } from 'astro'; 3 | import { Icon } from 'astro-icon/components'; 4 | import Image from '~/components/common/Image.astro'; 5 | import PostTags from '~/components/blog/Tags.astro'; 6 | 7 | import { APP_BLOG } from '~/utils/config'; 8 | import type { Post } from '~/types'; 9 | 10 | import { getPermalink } from '~/utils/permalinks'; 11 | import { findImage } from '~/utils/images'; 12 | import { getFormattedDate } from '~/utils/utils'; 13 | 14 | export interface Props { 15 | post: Post; 16 | } 17 | 18 | const { post } = Astro.props; 19 | const image = (await findImage(post.image)) as ImageMetadata | undefined; 20 | 21 | const link = APP_BLOG?.post?.isEnabled ? getPermalink(post.permalink, 'post') : ''; 22 | --- 23 | 24 |
25 | { 26 | image && ( 27 | 28 | 43 | 44 | ) 45 | } 46 |
47 |
48 |
49 | 50 | 51 | 52 | { 53 | post.author && ( 54 | <> 55 | {' '} 56 | ·{' '} 57 | 58 | {post.author.replaceAll('-', ' ')} 59 | 60 | ) 61 | } 62 | { 63 | post.category && ( 64 | <> 65 | {' '} 66 | ·{' '} 67 | 68 | {post.category.replaceAll('-', ' ')} 69 | 70 | 71 | ) 72 | } 73 | 74 | 75 |
76 |

77 | { 78 | link ? ( 79 | 80 | {post.title} 81 | 82 | ) : ( 83 | post.title 84 | ) 85 | } 86 |

87 |
88 | 89 | {post.excerpt &&

{post.excerpt}

} 90 |
91 | 92 |
93 |
94 |
95 | -------------------------------------------------------------------------------- /src/components/blog/Pagination.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | import { getPermalink } from '~/utils/permalinks'; 4 | import Button from '~/components/ui/Button.astro'; 5 | 6 | export interface Props { 7 | prevUrl?: string; 8 | nextUrl?: string; 9 | prevText?: string; 10 | nextText?: string; 11 | } 12 | 13 | const { prevUrl, nextUrl, prevText = 'Newer posts', nextText = 'Older posts' } = Astro.props; 14 | --- 15 | 16 | { 17 | (prevUrl || nextUrl) && ( 18 |
19 |
20 | 28 | 29 | 33 |
34 |
35 | ) 36 | } 37 | -------------------------------------------------------------------------------- /src/components/blog/Tags.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getPermalink } from '~/utils/permalinks'; 3 | 4 | import { APP_BLOG } from '~/utils/config'; 5 | import type { Post } from '~/types'; 6 | 7 | export interface Props { 8 | tags: Post['tags']; 9 | class?: string; 10 | title?: string | undefined; 11 | isCategory?: boolean; 12 | } 13 | 14 | const { tags, class: className = 'text-sm', title = undefined, isCategory = false } = Astro.props; 15 | --- 16 | 17 | { 18 | tags && Array.isArray(tags) && ( 19 | <> 20 | <> 21 | {title !== undefined && {title}} 22 | 23 | 39 | 40 | ) 41 | } 42 | -------------------------------------------------------------------------------- /src/components/blog/ToBlogLink.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | import { getBlogPermalink } from '~/utils/permalinks'; 4 | import { I18N } from '~/utils/config'; 5 | import Button from '~/components/ui/Button.astro'; 6 | 7 | const { textDirection } = I18N; 8 | --- 9 | 10 |
11 | 20 |
21 | -------------------------------------------------------------------------------- /src/components/common/Analytics.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { GoogleAnalytics } from '@astrolib/analytics'; 3 | import { ANALYTICS } from '~/utils/config'; 4 | --- 5 | 6 | { 7 | ANALYTICS?.vendors?.googleAnalytics?.id ? ( 8 | 9 | ) : null 10 | } 11 | -------------------------------------------------------------------------------- /src/components/common/ApplyColorMode.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { UI } from "~/utils/config"; 3 | 4 | // TODO: This code is temporary 5 | --- 6 | 7 | 34 | -------------------------------------------------------------------------------- /src/components/common/CommonMeta.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getAsset } from '~/utils/permalinks'; 3 | --- 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/components/common/Image.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { findImage } from '~/utils/images'; 3 | import { 4 | getImagesOptimized, 5 | astroAsseetsOptimizer, 6 | unpicOptimizer, 7 | type ImageProps, 8 | type AttributesProps 9 | } from '~/utils/images-optimization'; 10 | 11 | type Props = ImageProps; 12 | type ImageType = { 13 | src: string; 14 | attributes: AttributesProps; 15 | } 16 | 17 | const props = Astro.props; 18 | 19 | if (props.alt === undefined || props.alt === null) { 20 | throw new Error(); 21 | } 22 | 23 | if (typeof props.width === 'string') { 24 | props.width = parseInt(props.width); 25 | } 26 | 27 | if (typeof props.height === 'string') { 28 | props.height = parseInt(props.height); 29 | } 30 | 31 | if (!props.loading) { 32 | props.loading = 'lazy'; 33 | } 34 | 35 | if (!props.decoding) { 36 | props.decoding = 'async'; 37 | } 38 | 39 | const _image = await findImage(props.src); 40 | 41 | let image: ImageType | undefined = undefined; 42 | 43 | if (_image !== null && typeof _image === 'object') { 44 | image = await getImagesOptimized(_image, props, astroAsseetsOptimizer); 45 | } else if (typeof _image === 'string' && (_image.startsWith('http://') || _image.startsWith('https://'))) { 46 | image = await getImagesOptimized(_image, props, unpicOptimizer); 47 | } else if (_image) { 48 | image = await getImagesOptimized(_image, props); 49 | } 50 | --- 51 | 52 | {!image ? : } 53 | -------------------------------------------------------------------------------- /src/components/common/Metadata.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import merge from 'lodash.merge'; 3 | import { AstroSeo } from '@astrolib/seo'; 4 | 5 | import type { Props as AstroSeoProps } from '@astrolib/seo'; 6 | 7 | import { SITE, METADATA, I18N } from '~/utils/config'; 8 | import type { MetaData } from '~/types'; 9 | import { getCanonical } from '~/utils/permalinks'; 10 | 11 | import { adaptOpenGraphImages } from '~/utils/images'; 12 | 13 | export interface Props extends MetaData { 14 | dontUseTitleTemplate?: boolean; 15 | } 16 | 17 | const { 18 | title, 19 | ignoreTitleTemplate = false, 20 | canonical = String(getCanonical(String(Astro.url.pathname))), 21 | robots = {}, 22 | description, 23 | openGraph = {}, 24 | twitter = {}, 25 | } = Astro.props; 26 | 27 | const seoProps: AstroSeoProps = merge( 28 | { 29 | title: '', 30 | titleTemplate: '%s', 31 | canonical: canonical, 32 | noindex: true, 33 | nofollow: true, 34 | description: undefined, 35 | openGraph: { 36 | url: canonical, 37 | site_name: SITE?.name, 38 | images: [], 39 | locale: I18N?.language || 'en', 40 | type: 'website', 41 | }, 42 | twitter: { 43 | cardType: openGraph?.images?.length ? 'summary_large_image' : 'summary', 44 | }, 45 | }, 46 | { 47 | title: METADATA?.title?.default, 48 | titleTemplate: METADATA?.title?.template, 49 | noindex: typeof METADATA?.robots?.index !== 'undefined' ? !METADATA.robots.index : undefined, 50 | nofollow: typeof METADATA?.robots?.follow !== 'undefined' ? !METADATA.robots.follow : undefined, 51 | description: METADATA?.description, 52 | openGraph: METADATA?.openGraph, 53 | twitter: METADATA?.twitter, 54 | }, 55 | { 56 | title: title, 57 | titleTemplate: ignoreTitleTemplate ? '%s' : undefined, 58 | canonical: canonical, 59 | noindex: typeof robots?.index !== 'undefined' ? !robots.index : undefined, 60 | nofollow: typeof robots?.follow !== 'undefined' ? !robots.follow : undefined, 61 | description: description, 62 | openGraph: { url: canonical, ...openGraph }, 63 | twitter: twitter, 64 | } 65 | ); 66 | --- 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /src/components/common/SiteVerification.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { SITE } from "~/utils/config"; 3 | --- 4 | 5 | {SITE.googleSiteVerificationId && } -------------------------------------------------------------------------------- /src/components/common/SocialShare.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | 4 | export interface Props { 5 | text: string; 6 | url: string | URL; 7 | class?: string; 8 | } 9 | 10 | const { text, url, class: className = 'inline-block' } = Astro.props; 11 | --- 12 | 13 |
14 | Share: 15 | 21 | 27 | 33 | 39 | 45 |
46 | -------------------------------------------------------------------------------- /src/components/common/SplitbeeAnalytics.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { doNotTrack = true, noCookieMode = false, url = 'https://cdn.splitbee.io/sb.js' } = Astro.props; 3 | --- 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/components/common/ToggleMenu.astro: -------------------------------------------------------------------------------- 1 | --- 2 | export interface Props { 3 | label?: string; 4 | class?: string; 5 | } 6 | 7 | const { 8 | label = 'Toggle Menu', 9 | class: 10 | className = "flex flex-col h-12 w-12 rounded justify-center items-center cursor-pointer group", 11 | } = Astro.props; 12 | --- 13 | 14 | 35 | -------------------------------------------------------------------------------- /src/components/common/ToggleTheme.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | 4 | import { UI } from '~/utils/config'; 5 | 6 | export interface Props { 7 | label?: string; 8 | class?: string; 9 | iconClass?: string; 10 | iconName?: string; 11 | } 12 | 13 | const { 14 | label = 'Toggle between Dark and Light mode', 15 | class: 16 | className = 'text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5 inline-flex items-center', 17 | iconClass = 'w-6 h-6', 18 | iconName = 'tabler:sun', 19 | } = Astro.props; 20 | --- 21 | 22 | { 23 | !(UI.theme && UI.theme.endsWith(':only')) && ( 24 | 27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /src/components/ui/Background.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { isDark = false } = Astro.props; 3 | --- 4 | 5 |
6 | 7 |
8 | -------------------------------------------------------------------------------- /src/components/ui/Button.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | import { twMerge } from 'tailwind-merge'; 4 | import type { CallToAction } from '~/types'; 5 | 6 | const { 7 | variant = 'secondary', 8 | target, 9 | text = Astro.slots.render('default'), 10 | icon = '', 11 | class: className = '', 12 | type, 13 | ...rest 14 | } = Astro.props as CallToAction; 15 | 16 | const variants = { 17 | primary: 'btn-primary', 18 | secondary: 'btn-secondary', 19 | tertiary: 'btn btn-tertiary', 20 | link: 'cursor-pointer hover:text-primary', 21 | }; 22 | --- 23 | 24 | { 25 | type === 'button' || type === 'submit' || type === 'reset' ? ( 26 | 30 | ) : ( 31 | 36 | 37 | {icon && } 38 | 39 | ) 40 | } 41 | -------------------------------------------------------------------------------- /src/components/ui/DListItem.astro: -------------------------------------------------------------------------------- 1 | --- 2 | // component: DListItem 3 | // 4 | // Mimics the html 'dl' (description list) 5 | // 6 | // The 'dt' item is the item 'term' and is inserted into an 'h6' tag. 7 | // Caller needs to style the 'h6' tag appropriately. 8 | // 9 | // You can put pretty much any content you want between the open and 10 | // closing tags - it's simply contained in an enclosing div with a 11 | // margin left. No need for 'dd' items. 12 | // 13 | const { 14 | dt 15 | } = Astro.props; 16 | interface Props { 17 | dt:string 18 | } 19 | 20 | const content:string = await Astro.slots.render('default'); 21 | --- 22 |
23 |
-------------------------------------------------------------------------------- /src/components/ui/Form.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import type { Form } from '~/types'; 3 | import Button from '~/components/ui/Button.astro'; 4 | 5 | const { inputs, textarea, disclaimer, button = 'Contact us', description = '' } = Astro.props as Form; 6 | --- 7 | 8 |
9 | { 10 | inputs && 11 | inputs.map( 12 | ({ type = 'text', name, label = '', autocomplete = 'on', placeholder = '' }) => 13 | name && ( 14 |
15 | {label && ( 16 | 19 | )} 20 | 28 |
29 | ) 30 | ) 31 | } 32 | 33 | { 34 | textarea && ( 35 |
36 | 39 |