diff --git a/astro.config.mts b/astro.config.mts index ee8f6a7..0d51f9c 100644 --- a/astro.config.mts +++ b/astro.config.mts @@ -2,29 +2,22 @@ import { defineConfig } from "astro/config"; import icon from "astro-icon"; import mdx from "@astrojs/mdx"; import tailwind from "@astrojs/tailwind"; -import remarkCapitalizeTitles, { - DEFAULT_CAPITALIZATIONS, -} from "@fujocoded/remark-capitalize-titles"; +import remarkCapitalizeTitles, { DEFAULT_CAPITALIZATIONS } from "@fujocoded/remark-capitalize-titles"; import rehypeSlug from "rehype-slug"; import rehypeAutolinkHeadings from "rehype-autolink-headings"; - import metaTags from "astro-meta-tags"; +import react from "@astrojs/react"; + // https://astro.build/config export default defineConfig({ - integrations: [icon(), tailwind(), mdx(), metaTags()], + integrations: [icon(), tailwind(), mdx(), metaTags(), react()], markdown: { - remarkPlugins: [ - [remarkCapitalizeTitles, { special: DEFAULT_CAPITALIZATIONS }], - ], - rehypePlugins: [ - rehypeSlug, - [ - rehypeAutolinkHeadings, - { - behavior: "wrap", - }, - ], - ], - }, -}); + remarkPlugins: [[remarkCapitalizeTitles, { + special: DEFAULT_CAPITALIZATIONS + }]], + rehypePlugins: [rehypeSlug, [rehypeAutolinkHeadings, { + behavior: "wrap" + }]] + } +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6723aa2..32004c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,16 +10,23 @@ "dependencies": { "@astrojs/check": "^0.7.0", "@astrojs/mdx": "^3.0.0", + "@astrojs/react": "^3.6.2", "@astrojs/tailwind": "^5.1.0", "@fujocoded/remark-capitalize-titles": "^0.0.7", "@fujocoded/zod-transform-socials": "^0.0.11", "@iconify-json/logos": "^1.1.42", + "@paypal/paypal-js": "^8.1.0", "@tailwindcss/typography": "^0.5.10", + "@types/react": "^18.3.4", + "@types/react-dom": "^18.3.0", "astro": "^4.8.5", "astro-icon": "^1.1.0", "astro-meta-tags": "^0.2.2", "interactjs": "^1.10.26", "marked": "^12.0.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.2.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "tailwindcss": "^3.4.1", @@ -638,6 +645,24 @@ "node": "^18.17.1 || ^20.3.0 || >=21.0.0" } }, + "node_modules/@astrojs/react": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.6.2.tgz", + "integrity": "sha512-fK29lYI7zK/KG4ZBy956x4dmauZcZ18osFkuyGa8r3gmmCQa2NZ9XNu9WaVYEUm0j89f4Gii4tbxLoyM8nk2MA==", + "dependencies": { + "@vitejs/plugin-react": "^4.3.1", + "ultrahtml": "^1.5.3" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + }, + "peerDependencies": { + "@types/react": "^17.0.50 || ^18.0.21", + "@types/react-dom": "^17.0.17 || ^18.0.6", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0-beta" + } + }, "node_modules/@astrojs/tailwind": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-5.1.0.tgz", @@ -835,9 +860,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "engines": { "node": ">=6.9.0" } @@ -958,6 +983,34 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", @@ -2083,6 +2136,14 @@ "node": ">= 8" } }, + "node_modules/@paypal/paypal-js": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@paypal/paypal-js/-/paypal-js-8.1.0.tgz", + "integrity": "sha512-f64bom5xYwmxyeKPJUFS/XpM0tXojQEgjRIADPqe1R9WmK+PFqL4SEkT85cGU0ZXLVx4EGbjwREHhqEOR+OstA==", + "dependencies": { + "promise-polyfill": "^8.3.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2403,6 +2464,28 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/react": { + "version": "18.3.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz", + "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/tar": { "version": "6.1.11", "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.11.tgz", @@ -2431,6 +2514,24 @@ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, "node_modules/@volar/kit": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.2.4.tgz", @@ -3612,6 +3713,11 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5116,6 +5222,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -7066,6 +7183,11 @@ "node": ">=6" } }, + "node_modules/promise-polyfill": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz", + "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==" + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -7128,6 +7250,45 @@ } ] }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-icons": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", + "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -7531,6 +7692,14 @@ "suf-log": "^2.5.3" } }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -8201,6 +8370,11 @@ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==" }, + "node_modules/ultrahtml": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", + "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", diff --git a/package.json b/package.json index 054b7db..c816750 100644 --- a/package.json +++ b/package.json @@ -12,16 +12,23 @@ "dependencies": { "@astrojs/check": "^0.7.0", "@astrojs/mdx": "^3.0.0", + "@astrojs/react": "^3.6.2", "@astrojs/tailwind": "^5.1.0", "@fujocoded/remark-capitalize-titles": "^0.0.7", "@fujocoded/zod-transform-socials": "^0.0.11", "@iconify-json/logos": "^1.1.42", + "@paypal/paypal-js": "^8.1.0", "@tailwindcss/typography": "^0.5.10", + "@types/react": "^18.3.4", + "@types/react-dom": "^18.3.0", "astro": "^4.8.5", "astro-icon": "^1.1.0", "astro-meta-tags": "^0.2.2", "interactjs": "^1.10.26", "marked": "^12.0.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.2.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "tailwindcss": "^3.4.1", diff --git a/src/components/Faqs.astro b/src/components/Faqs.astro new file mode 100644 index 0000000..5a362c1 --- /dev/null +++ b/src/components/Faqs.astro @@ -0,0 +1,109 @@ +--- +import { Icon } from "astro-icon/components"; +import { getCollection } from "astro:content"; +const faqs = await getCollection("faqs", (faq) => faq.data.draft !== true); + +const faqEntries = await Promise.all( + faqs + .sort((f1, f2) => f1.data.order - f2.data.order) + .map(async (faq) => ({ + title: faq.data.title, + slug: faq.slug, + success: faq.data.success, + Content: (await faq.render()).Content, + })), +); + +interface Props { + successOnly?: boolean; +} + +const { successOnly } = Astro.props; +--- + +
+ { + faqEntries.map((faq) => ( +
+ + + + + + + {} +
+ )) + } +
+ + + + diff --git a/src/components/StripeButton.astro b/src/components/StripeButton.astro new file mode 100644 index 0000000..4778c82 --- /dev/null +++ b/src/components/StripeButton.astro @@ -0,0 +1,52 @@ +--- +import { SiApplepay, SiGooglepay } from "react-icons/si"; + +import { SlCreditCard } from "react-icons/sl"; + +const getLinkForQuantity = (quantity: number) => { + switch (quantity) { + case 3: + return "https://buy.stripe.com/aEUdU57TyfI872oaEK"; + case 8: + return "https://buy.stripe.com/bIY9DP5Lq53ucmIaEN"; + case 25: + return "https://buy.stripe.com/28obLX0r69jKcmI6oy"; + case 15: + return "https://buy.stripe.com/8wM5nz0r653u2M814c"; + default: + throw new Error("Invalid payment amount"); + } +}; +interface Props { + quantity: number; +} +const { quantity } = Astro.props; +--- + + + + + Pay with Stripe + + + diff --git a/src/components/SupportTierCard.astro b/src/components/SupportTierCard.astro new file mode 100644 index 0000000..b60165a --- /dev/null +++ b/src/components/SupportTierCard.astro @@ -0,0 +1,191 @@ +--- +import { SlClose } from "react-icons/sl"; +import type { TierType } from "./TiersDisplay.astro"; +import StripeButton from "./StripeButton.astro"; +import { Image } from "astro:assets"; +import type { ImageMetadata } from "astro"; + +type Props = TierType; + +const { dollarsPerMonth, imageUrl, tagline, perks, name } = Astro.props; +const id = name.replaceAll(" ", "-"); + +const images = import.meta.glob<{ default: ImageMetadata }>( + "/src/images/support-us/*.{jpeg,jpg,png,gif}", +); +if (!images[imageUrl]) + throw new Error( + `"${imageUrl}" does not exist in glob: "/src/images/support-us/*.{jpeg,jpg,png,gif}"`, + ); +--- + + diff --git a/src/components/TiersDisplay.astro b/src/components/TiersDisplay.astro new file mode 100644 index 0000000..2e9173c --- /dev/null +++ b/src/components/TiersDisplay.astro @@ -0,0 +1,125 @@ +--- +import SupportTierCard from "./SupportTierCard.astro"; + +export type TierType = { + name: string; + imageUrl: string; + dollarsPerMonth: number; + tagline: string; + perks: { description: string }[]; +}; + +const TIERS: TierType[] = [ + { + name: "a nice egg", + dollarsPerMonth: 3, + tagline: "Can you offer me a nice egg in this high-inflation time?", + imageUrl: "/src/images/support-us/egg.png", + perks: [ + { + description: + "Support my work on a more open, more decentralized, and (above all) more fun web", + }, + + { + description: + "Help me bring more underrepresented people into coding and open source", + }, + { + description: + "Ensure the creation of more fandom-oriented Ethical Chaos™", + }, + { + description: "Access to $upporters-only posts, polls, streams and code", + }, + { + description: "Periodic discounts on merch", + }, + ], + }, + { + name: "specialty coffee & boba", + dollarsPerMonth: 8, + imageUrl: "/src/images/support-us/coffee-and-boba.png", + tagline: "I mean, it's a latte, Michael. What could it cost?", + perks: [ + { + description: "All previous perks, plus...", + }, + { + description: "Comments on $upporters-only posts", + }, + { + description: "Send in priority questions for Q&A days", + }, + { + description: "Alpha access to unreleased sites and services", + }, + ], + }, + { + name: "almond butter toast", + dollarsPerMonth: 15, + imageUrl: "/src/images/support-us/almond-toast.png", + tagline: "Frankly, my dear, I don't like avocado.", + perks: [ + { + description: "All previous perks, plus...", + }, + { + description: `Second-wave "dibs" on releases of limited-edition or discounted, one-off merchandise`, + }, + { + description: + "Feature your blorbo on the $ponsors blorbos wall (upcoming)", + }, + { + description: `Even deeper "Behind the Scenes" access to early-release screenshots and documents`, + }, + ], + }, + { + name: "subsidized massage", + dollarsPerMonth: 25, + imageUrl: "/src/images/support-us/massage.png", + tagline: `"It's like one of my Silicon Valley start ups!"`, + perks: [ + { + description: "All previous perks, plus...", + }, + { + description: `Priority "dibs" on releases of limited-edition or discounted, one-off merchandise`, + }, + { + description: + "Feature your blorbo on the $ponsors blorbos wall (upcoming), but bigger", + }, + { + description: + "Support Ms Boba's continued health by adding $3/month to her massage fund", + }, + ], + }, +]; +--- + +
+ {TIERS.map((tier) => )} + +

+
+
diff --git a/src/content/config.ts b/src/content/config.ts
index 6869e65..f388eda 100644
--- a/src/content/config.ts
+++ b/src/content/config.ts
@@ -5,6 +5,15 @@ import { collection as imagesCollection } from "./images/_config.ts";
 import { collection as sponsorsCollection } from "./sponsors/_config.ts";
 import { updates } from "./updates/_config.ts";
 
+import { defineCollection, z } from "astro:content";
+
+const FaqSchema = z.object({
+  title: z.string(),
+  order: z.number(),
+  draft: z.boolean().optional(),
+  success: z.boolean().default(false),
+});
+
 export const collections = {
   team: teamCollection,
   updates,
@@ -12,4 +21,8 @@ export const collections = {
   projects: projectsCollection,
   images: imagesCollection,
   sponsors: sponsorsCollection,
+  faqs: defineCollection({
+    type: "content",
+    schema: FaqSchema,
+  }),
 };
diff --git a/src/content/faqs/bobaboard-subscription.md b/src/content/faqs/bobaboard-subscription.md
new file mode 100644
index 0000000..42657bb
--- /dev/null
+++ b/src/content/faqs/bobaboard-subscription.md
@@ -0,0 +1,17 @@
+---
+title: Can't I just support you by buying a premium BobaBoard account?
+order: 1000
+---
+
+

+ While BobaBoard is the main project I work on, I work on a lot more + than BobaBoard. It's important that I continue doing so for the + long-term success of our goals. +

+

+ Even more importantly, there are many reasons why tying my ability to + survive to the success of the social software I build is a bad, bad + idea. While this might end up being its own blog post at some point, + for now I ask you trust me: if you want to see more of what I do, + please donate to me directly. +

diff --git a/src/content/faqs/cancelling.md b/src/content/faqs/cancelling.md new file mode 100644 index 0000000..d67ddeb --- /dev/null +++ b/src/content/faqs/cancelling.md @@ -0,0 +1,11 @@ +--- +title: How do I cancel? +order: 700 +success: true +--- + +You can log in to your PayPal account to manage all your +subscriptions. For Stripe, [click here](https://billing.stripe.com/p/login/7sI9E470ibQt0A8dQQ) for the customer portal. + +In case of any issue, contact me at any time at +essential.randomn3ss@gmail.com. diff --git a/src/content/faqs/favorite-support.md b/src/content/faqs/favorite-support.md new file mode 100644 index 0000000..a776c5c --- /dev/null +++ b/src/content/faqs/favorite-support.md @@ -0,0 +1,8 @@ +--- +title: Which support mode do you prefer? +order: 500 +--- + +If you love (moderate) adventure, joining my attempt at [a self-hosted support +tool](#donate) is very appreciated. Alternatively, +[Patreon](https://www.patreon.com/essentialrandomness) is a very popular option. diff --git a/src/content/faqs/icons-design.md b/src/content/faqs/icons-design.md new file mode 100644 index 0000000..a6ff83e --- /dev/null +++ b/src/content/faqs/icons-design.md @@ -0,0 +1,7 @@ +--- +title: Who designed these beautiful icons? +order: 1100 +--- + +My amazing friend SKUMSUCK +generously created them for me. diff --git a/src/content/faqs/not-working.md b/src/content/faqs/not-working.md new file mode 100644 index 0000000..f62d514 --- /dev/null +++ b/src/content/faqs/not-working.md @@ -0,0 +1,14 @@ +--- +title: Help! Something isn't working! +order: 850 +success: true +--- + +Thanks for letting me know. This is a very experimental page, and +things might break unexpectedly. Please do let me know what went wrong +by contacting me at +essential.randomn3ss@gmail.com. + +In the meantime you can also donate through +Patreon or +Ko-fi. diff --git a/src/content/faqs/old-plan.md b/src/content/faqs/old-plan.md new file mode 100644 index 0000000..c9abc96 --- /dev/null +++ b/src/content/faqs/old-plan.md @@ -0,0 +1,20 @@ +--- +title: What if I'm currently on the old $5/month plan? +order: 800 +--- + +

+ You can keep that, and be automatically enrolled in the "almond + butter toast" support tier as a thank you for donating before it + was cool. +

+

+ If you wish to up your amount, you can cancel that subscription and + create a new one. As long as it's using the same email, I'll + make a note to leave you at least as "almond butter toast", + regardless of amount. +

+

+ In case of any issue, contact me at any time at + essential.randomn3ss@gmail.com. +

diff --git a/src/content/faqs/secure-payment.md b/src/content/faqs/secure-payment.md new file mode 100644 index 0000000..837b45d --- /dev/null +++ b/src/content/faqs/secure-payment.md @@ -0,0 +1,7 @@ +--- +title: Is my payment info secure? +order: 600 +--- + +Yes. I'm selling subscriptions through Stripe and PayPal links, +which means your credit card information never leaves those sites. diff --git a/src/content/faqs/splitting-your-time.md b/src/content/faqs/splitting-your-time.md new file mode 100644 index 0000000..23d39a1 --- /dev/null +++ b/src/content/faqs/splitting-your-time.md @@ -0,0 +1,25 @@ +--- +title: How are you splitting your time these days? What am I supporting? +order: 100 +--- + +As my [projects page](/projects) hopefully conveys, I work on an ecle + +These days (early 2024), I'm proritizing the following projects: + +1. **Shipping FujoGuide Volume 0:** not only [a succesful + Kickstarter](https://www.kickstarter.com/projects/essential-randomness/the-fujoshi-guide-to-web-development) + deserves a successful delivery, but making Git+GitHub accessible to a new + public will redefine who can be building the web of tomorrow +2. **Secret WIP project:** Not ready to talk about it yet, but it fits nicely + with everything else :) +3. **My Own Worksona:** My professional online presence, including this website. + In 2024, I must start bringing in enough money so I can continue empowering + myself and others to build towards a better future for the web +4. **BobaBoard Community Handoff:** [BobaBoard](https://www.bobaboard.com) (the + main project I've worked on since 2020) is ready to leave its cozy nest and + be embraced by the broader web. To that end, I'm helping transition the + project from being led by me to being led by its own community. + +Your support buys you early access to news about these projects (and beyond), as well as my +eternal gratitude. Refer to the tier cards for more info! diff --git a/src/content/faqs/tos.md b/src/content/faqs/tos.md new file mode 100644 index 0000000..c148c1a --- /dev/null +++ b/src/content/faqs/tos.md @@ -0,0 +1,6 @@ +--- +title: Are there terms of service for $upporters? +order: 105 +--- + +There sure are! Make sure to read them on the [Terms of Service page](/support-us/terms-of-service)! diff --git a/src/images/support-us/almond-toast.png b/src/images/support-us/almond-toast.png new file mode 100644 index 0000000..fe7eff9 Binary files /dev/null and b/src/images/support-us/almond-toast.png differ diff --git a/src/images/support-us/coffee-and-boba.png b/src/images/support-us/coffee-and-boba.png new file mode 100644 index 0000000..f4a7d30 Binary files /dev/null and b/src/images/support-us/coffee-and-boba.png differ diff --git a/src/images/support-us/egg.png b/src/images/support-us/egg.png new file mode 100644 index 0000000..70e67ca Binary files /dev/null and b/src/images/support-us/egg.png differ diff --git a/src/images/support-us/header-kofi.png b/src/images/support-us/header-kofi.png new file mode 100644 index 0000000..19dce6a Binary files /dev/null and b/src/images/support-us/header-kofi.png differ diff --git a/src/images/support-us/header.png b/src/images/support-us/header.png new file mode 100644 index 0000000..9e655a9 Binary files /dev/null and b/src/images/support-us/header.png differ diff --git a/src/images/support-us/massage.png b/src/images/support-us/massage.png new file mode 100644 index 0000000..0385503 Binary files /dev/null and b/src/images/support-us/massage.png differ diff --git a/src/images/support-us/og-image.png b/src/images/support-us/og-image.png new file mode 100644 index 0000000..2395de6 Binary files /dev/null and b/src/images/support-us/og-image.png differ diff --git a/src/images/support-us/thenks-suporter.png b/src/images/support-us/thenks-suporter.png new file mode 100644 index 0000000..70d62dd Binary files /dev/null and b/src/images/support-us/thenks-suporter.png differ diff --git a/src/pages/support.astro b/src/pages/support.astro deleted file mode 100644 index ce3bb9c..0000000 --- a/src/pages/support.astro +++ /dev/null @@ -1,39 +0,0 @@ ---- -import Layout from "../layouts/Layout.astro"; -import { Image } from "astro:assets"; -import bobawip_color from "../images/bobawip_color.png"; -import backerkit_just_launched from "../images/campaign/backerkit-just-launched.png"; - -const description = - "FujoCoded LLC is building a new online storefront to support our projects. Help us build something exciting by backing us on Backerkit!"; ---- - - - - diff --git a/src/pages/support/index.astro b/src/pages/support/index.astro new file mode 100644 index 0000000..52bf4ce --- /dev/null +++ b/src/pages/support/index.astro @@ -0,0 +1,293 @@ +--- +import Faqs from "../../components/Faqs.astro"; +import TiersDisplay from "../../components/TiersDisplay.astro"; +import Layout from "../../layouts/Layout.astro"; +import { SiPatreon } from "react-icons/si"; +import { SiKofi } from "react-icons/si"; +--- + + +
+

Support Us

+
+ + {`Remake + +

What I do (with your support)

+
+ My projects focus on: + +
    +
  • + “A more fun, more social web” for fandom and other niche + online communities +
  • +
  • + Approachable, beginner-to-intermediate technical education targeted at historically marginalized internet dwellers +
  • +
  • + More accessible open source development, with a + focus on open and decentralized technologies +
  • +
+ +

+ You can read more about them on the projects page, and support them on + Patreon, + Ko-fi, or on one + of the self-hosted tiers below. +

+
+
+ +
+ +
+

FAQs

+ +
+
+ + + + + diff --git a/src/pages/support/success.astro b/src/pages/support/success.astro new file mode 100644 index 0000000..1fcc283 --- /dev/null +++ b/src/pages/support/success.astro @@ -0,0 +1,84 @@ +--- +import Faqs from "../../components/Faqs.astro"; +import Layout from "../../layouts/Layout.astro"; +import thenksSupporterImg from "../../images/support-us/thenks-suporter.png"; +import { Image } from "astro:assets"; +--- + + +
+
+ + {`Remake + +

Thank you!

+

+ You will soon receive an email asking you to confirm your subscription + to my newsletter. Unless explicitly cancelled (see FAQs), your paid membership will remain active regardless of whether you + choose to susbscribe. +

+

+ The newsletter is the only way to access supporters-only content at + this time. I'm working to make the experience more special, and to create a supporters-only + area directly on this site. Until then, if you have questions, suggestions, + or need help, write me at any time and we'll figure it out together! +

+ +

+ Want to help even more? Go back to the support page and share it with a friend! +

+
+
+

Still-relevant FAQs

+ +
+ + +
+
diff --git a/src/pages/support/terms-of-service.mdx b/src/pages/support/terms-of-service.mdx new file mode 100644 index 0000000..a71738f --- /dev/null +++ b/src/pages/support/terms-of-service.mdx @@ -0,0 +1,133 @@ +--- +layout: ../../layouts/Layout.astro +title: "Essential Randomness — Support Me – Terms of Service" +description: "Terms of service for $upporters!" +preview: "src/images/support-us/og-image.png" +--- + +
+ +# Ms Boba Subscriber TOS + +## I. Coverage and Definitions + +These terms of service are only applicable to essentialrandomness site, personal +newsletter, and any events run through the subscription service. By subscribing +to essentialrandomness, you agree to the terms laid out here. Some services, +products, and events that are offered through this subscription may utilize +third party platforms and services. In these cases, you understand that to +access, utilize, or attend, you will be subject to the terms laid out by the +platform or service used. + +Direct payments on essentialrandomness are handled using +[Stripe](https://stripe.com/privacy) or +[Paypal](https://www.paypal.com/us/legalhub/useragreement-full). + +Any disputes relating to these services or this agreement are governed under +California state law. + +By subscribing, you consent to receiving emails. See [opt +out](#iii-opt-out) and [privacy policy](#v-privacy-policy) for +more information. + +These terms are subject to change at any time. + +## Definitions + +- **Subscriber:** you +- **Third Party:** Any service or platform not owned or + managed by Ms Boba, aka essentialrandomness. + +## II. Services + +The primary offer here is access to Ms Boba's content and work itself. Through +subscribing or supporting through other listed means (unless stated otherwise), +what you receive in return _is_ access to Ms Boba's knowledge and skillset. This +includes but is not limited to exclusive or non-exclusive access to Ms Boba's +blogs, newsletters, streams, coding repos, and other digital media. In some (but +not all) cases, supporters may also receive early or limited access to some +items. While Ms Boba may offer services, products, and events in return for your +subscription, there is no guarantee that anything specific will materialize. + +Any current offers to subscribers and projects actively being worked on by Ms +Boba will be available to view on +[Projects](https://www.essentialrandomness.com/projects) and by reading her +[Blog](https://www.essentialrandomness.com/posts). + +## III. Opt-out + +Any purchases made are subject to the terms laid out by the platform the +purchase was made on. + +Subscribers can opt out of services at any time by canceling payment through +their chosen service. If a service already paid for is not desired, it can be +opted out by contacting Ms Boba. Ms Boba is not responsible for anything missed +by the subscriber during the Opt-out periods. + +## IV. Non-Payment + +Non-payment for services or a lapse in payment can result in subscription +cancellation. Ms Boba is not responsible for anything missed by the subscriber +during the non-payment periods. + +## V. Privacy Policy + +Data collected from subscribers is limited to data collected by the platforms +that provide payment and subscription services (PayPal, Stripe, Patreon and Ko-fi), +as well as Buttondown, our newsletter provider. + +These may include: + +- Names, email addresses, physical addresses +- Card numbers or banking information (for recurring payments or user profiles) +- Information tied to accounts on thirds parties used to subscribe and purchase + from Ms Boba +- Orders and transactions history + +Ms Boba is not responsible for the management or protection of +publicly accessible information. The data collected is used only to: + +- Fulfill services offered (send emails with what’s offered for the subscription + tier) +- Alert subscriber of changes to service agreements or services offered + +### Who can access subscriber data? + +- Ms Boba +- 3rd parties helping Ms Boba with legal compliance (e.g. accountant) +- Law enforcement, as required by law + +Subscriber data may also be accessed by 3rd parties helping Ms Boba with data +entry and processing, for example to help match subscription data across +services, or debug issues with automations. In this case, effort will be taken to +restrict access to the minimum amount of time necessary, and provide as limited +access as possible. + +This privacy policy is only subject to services offered through +essentialrandomness and does not extend off site or to third party services. The +subscriber should refer to the off site or third party service’s privacy policy +when utilizing them. This includes payment processing through +[Stripe](https://stripe.com/privacy) and +[Paypal](https://www.paypal.com/us/legalhub/privacy-full). + +### How can I delete subscriber data? + +To completely delete your subscriber data, you can [contact Ms +Boba](mailto:essential.randomn3ss@gmail.com). Note that the deletion of +data will make it impossible to continue accessing services. Once the request +is received, data will be erased within 30 days. + +## VI. Termination of Agreement + +You may end your agreement with essentialrandomness at any point through +canceling your subscription. + +Ms Boba reserves the right to cancel your subscription any time at her sole +discretion. + +## VII. Warranty + +No warranty is provided and subscribers accept any products, services, or events +"as is". + +
diff --git a/tsconfig.json b/tsconfig.json index bcbf8b5..2752547 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,7 @@ { - "extends": "astro/tsconfigs/strict" + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "react" + }, }