diff --git a/apps/lumeweb.com/astro.config.mjs b/apps/lumeweb.com/astro.config.mjs index b941edbaa..d794ff0d8 100644 --- a/apps/lumeweb.com/astro.config.mjs +++ b/apps/lumeweb.com/astro.config.mjs @@ -1,13 +1,43 @@ import react from "@astrojs/react"; import sitemap from "@astrojs/sitemap"; +import astroLlmsTxt from "@4hse/astro-llms-txt"; import { defineConfig } from "astro/config"; import tailwindcss from "@tailwindcss/vite"; // https://astro.build/config export default defineConfig({ - integrations: [react(), sitemap()], - + integrations: [ + react(), + sitemap(), + astroLlmsTxt({ + title: 'Lume Web', + description: 'A platform, network and experience that allows you to control and own your online web.', + details: 'Lume Web is building infrastructure for the open, user-owned web. We provide tools and services that respect privacy, resist censorship, and put users in control of their digital lives.', + notes: '- This content is auto-generated from the official source.', + docSet: [ + { + title: 'Complete site', + description: 'The full Lume Web documentation', + url: '/llms-full.txt', + include: ['**'], + promote: ['index.astro'], + }, + { + title: 'Small site', + description: 'Index of key pages', + url: '/llms-small.txt', + include: ['**'], + onlyStructure: true, + promote: ['index.astro'], + }, + ], + pageSeparator: '\n\n---\n\n', + }), + ], + server: { + allowedHosts: true, + }, outDir: "./dist", site: "https://lumeweb.com", diff --git a/apps/lumeweb.com/package.json b/apps/lumeweb.com/package.json index f2070b2f1..5e726b264 100644 --- a/apps/lumeweb.com/package.json +++ b/apps/lumeweb.com/package.json @@ -6,14 +6,16 @@ "scripts": { "dev": "astro dev", "build": "astro build", - "preview": "astro preview" + "preview": "astro preview --host" }, "devDependencies": { + "@4hse/astro-llms-txt": "^1.0.4", "@astrojs/react": "catalog:", "@astrojs/sitemap": "^3.7.0", "@types/react": "catalog:", "@types/react-dom": "catalog:", "astro": "catalog:", + "astro-seo": "^1.1.0", "qrcode": "catalog:", "react": "catalog:", "react-dom": "catalog:", @@ -21,7 +23,10 @@ }, "dependencies": { "@tailwindcss/vite": "catalog:", - "tailwindcss": "catalog:websites" + "clsx": "catalog:", + "tailwind-merge": "catalog:", + "tailwindcss": "catalog:websites", + "zod": "catalog:" }, "repository": { "type": "git", diff --git a/apps/lumeweb.com/src/assets/contribute-bg.png b/apps/lumeweb.com/src/assets/contribute-bg.png deleted file mode 100644 index f0d52426a..000000000 Binary files a/apps/lumeweb.com/src/assets/contribute-bg.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/cto-avatar.png b/apps/lumeweb.com/src/assets/cto-avatar.png deleted file mode 100644 index dfb985f14..000000000 Binary files a/apps/lumeweb.com/src/assets/cto-avatar.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/donate-gfx-right.png b/apps/lumeweb.com/src/assets/donate-gfx-right.png deleted file mode 100644 index b07c92968..000000000 Binary files a/apps/lumeweb.com/src/assets/donate-gfx-right.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/whatsweb3-jumbotron-bg.png b/apps/lumeweb.com/src/assets/hero-background.png similarity index 100% rename from apps/lumeweb.com/src/assets/whatsweb3-jumbotron-bg.png rename to apps/lumeweb.com/src/assets/hero-background.png diff --git a/apps/lumeweb.com/src/assets/donate-jumbotron-bg.png b/apps/lumeweb.com/src/assets/hero-bg-2.png similarity index 100% rename from apps/lumeweb.com/src/assets/donate-jumbotron-bg.png rename to apps/lumeweb.com/src/assets/hero-bg-2.png diff --git a/apps/lumeweb.com/src/assets/double-brand-bg.png b/apps/lumeweb.com/src/assets/hero-bg-3.png similarity index 100% rename from apps/lumeweb.com/src/assets/double-brand-bg.png rename to apps/lumeweb.com/src/assets/hero-bg-3.png diff --git a/apps/lumeweb.com/src/assets/home-gfx-left.png b/apps/lumeweb.com/src/assets/home-gfx-left.png deleted file mode 100644 index c3f6b2b6d..000000000 Binary files a/apps/lumeweb.com/src/assets/home-gfx-left.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/main-donate-bg.png b/apps/lumeweb.com/src/assets/main-donate-bg.png deleted file mode 100644 index d2e46907a..000000000 Binary files a/apps/lumeweb.com/src/assets/main-donate-bg.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/main-page-hero.png b/apps/lumeweb.com/src/assets/main-page-hero.png deleted file mode 100644 index bbb4181e0..000000000 Binary files a/apps/lumeweb.com/src/assets/main-page-hero.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/main-page-hero@0.5x.png b/apps/lumeweb.com/src/assets/main-page-hero@0.5x.png deleted file mode 100644 index 145e61c28..000000000 Binary files a/apps/lumeweb.com/src/assets/main-page-hero@0.5x.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/main-page-hero@0.75x.png b/apps/lumeweb.com/src/assets/main-page-hero@0.75x.png deleted file mode 100644 index 38e14c26d..000000000 Binary files a/apps/lumeweb.com/src/assets/main-page-hero@0.75x.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/main-vision-bg.png b/apps/lumeweb.com/src/assets/main-vision-bg.png deleted file mode 100644 index eca97062a..000000000 Binary files a/apps/lumeweb.com/src/assets/main-vision-bg.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/main-what-bg.png b/apps/lumeweb.com/src/assets/main-what-bg.png deleted file mode 100644 index ee4561e65..000000000 Binary files a/apps/lumeweb.com/src/assets/main-what-bg.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/meme-1-small.png b/apps/lumeweb.com/src/assets/meme-1-small.png deleted file mode 100644 index 35c43ec82..000000000 Binary files a/apps/lumeweb.com/src/assets/meme-1-small.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/meme-1.png b/apps/lumeweb.com/src/assets/meme-1.png deleted file mode 100644 index 155502580..000000000 Binary files a/apps/lumeweb.com/src/assets/meme-1.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/meme-2-small.png b/apps/lumeweb.com/src/assets/meme-2-small.png deleted file mode 100644 index f266a7996..000000000 Binary files a/apps/lumeweb.com/src/assets/meme-2-small.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/meme-2.png b/apps/lumeweb.com/src/assets/meme-2.png deleted file mode 100644 index ea835b903..000000000 Binary files a/apps/lumeweb.com/src/assets/meme-2.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/meme-3-small.png b/apps/lumeweb.com/src/assets/meme-3-small.png deleted file mode 100644 index 7ac140181..000000000 Binary files a/apps/lumeweb.com/src/assets/meme-3-small.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/meme-3.png b/apps/lumeweb.com/src/assets/meme-3.png deleted file mode 100644 index 549aab90b..000000000 Binary files a/apps/lumeweb.com/src/assets/meme-3.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/meme-4-small.png b/apps/lumeweb.com/src/assets/meme-4-small.png deleted file mode 100644 index c0e293fb4..000000000 Binary files a/apps/lumeweb.com/src/assets/meme-4-small.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/meme-4.png b/apps/lumeweb.com/src/assets/meme-4.png deleted file mode 100644 index 2b157b023..000000000 Binary files a/apps/lumeweb.com/src/assets/meme-4.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/new-world-bg.png b/apps/lumeweb.com/src/assets/new-world-bg.png deleted file mode 100644 index a9054ae4c..000000000 Binary files a/apps/lumeweb.com/src/assets/new-world-bg.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/single-brand-bg-1.png b/apps/lumeweb.com/src/assets/single-brand-bg-1.png deleted file mode 100644 index 35c44da96..000000000 Binary files a/apps/lumeweb.com/src/assets/single-brand-bg-1.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/single-brand-bg-2.png b/apps/lumeweb.com/src/assets/single-brand-bg-2.png deleted file mode 100644 index df3a5350d..000000000 Binary files a/apps/lumeweb.com/src/assets/single-brand-bg-2.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/unifying-bg.png b/apps/lumeweb.com/src/assets/unifying-bg.png deleted file mode 100644 index 0a8647e33..000000000 Binary files a/apps/lumeweb.com/src/assets/unifying-bg.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/vision-jumbotron-bg.png b/apps/lumeweb.com/src/assets/vision-jumbotron-bg.png deleted file mode 100644 index 860eacac2..000000000 Binary files a/apps/lumeweb.com/src/assets/vision-jumbotron-bg.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/web3-myth.png b/apps/lumeweb.com/src/assets/web3-myth.png deleted file mode 100644 index b0dbb71b1..000000000 Binary files a/apps/lumeweb.com/src/assets/web3-myth.png and /dev/null differ diff --git a/apps/lumeweb.com/src/assets/why-bg-2.png b/apps/lumeweb.com/src/assets/why-bg-2.png deleted file mode 100644 index 0377b5f35..000000000 Binary files a/apps/lumeweb.com/src/assets/why-bg-2.png and /dev/null differ diff --git a/apps/lumeweb.com/src/components/Donate/How.astro b/apps/lumeweb.com/src/components/Donate/How.astro deleted file mode 100644 index 7320b6082..000000000 --- a/apps/lumeweb.com/src/components/Donate/How.astro +++ /dev/null @@ -1,53 +0,0 @@ ---- -import Button from "../ui/Button.astro"; -import FeaturedGroup from "../ui/FeaturedGroup.astro"; ---- - - - -
-
-
- -
-
diff --git a/apps/lumeweb.com/src/components/Donate/Jumbotron.astro b/apps/lumeweb.com/src/components/Donate/Jumbotron.astro deleted file mode 100644 index 34d63e4e2..000000000 --- a/apps/lumeweb.com/src/components/Donate/Jumbotron.astro +++ /dev/null @@ -1,18 +0,0 @@ ---- -import backgroundSrc from "/src/assets/donate-jumbotron-bg.png"; ---- - -
- -

- Lume is
people-powered. -

-
diff --git a/apps/lumeweb.com/src/components/Donate/Legal.astro b/apps/lumeweb.com/src/components/Donate/Legal.astro deleted file mode 100644 index 30adf84dc..000000000 --- a/apps/lumeweb.com/src/components/Donate/Legal.astro +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/apps/lumeweb.com/src/components/Donate/Methods/Methods.astro b/apps/lumeweb.com/src/components/Donate/Methods/Methods.astro deleted file mode 100644 index 855dafbaa..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/Methods.astro +++ /dev/null @@ -1,379 +0,0 @@ ---- -import QRCode from "qrcode"; - -const currencies = []; - -const addCurrency = async (id, title, address, mainColor) => { - currencies.push({ - id: id, - title: title, - address: address, - mainColor, - svgLogo: await import(`./icons/${id}.svg?raw`), - qrSmall: await QRCode.toDataURL(address, { - version: 6, - scale: 1, - margin: 1, - }), - qrLarge: await QRCode.toDataURL(address, { - version: 6, - scale: 7, - margin: 2, - }), - }); -}; - -await addCurrency( - "bitcoin", - "Bitcoin (BTC)", - "bc1q9xq2w4w2hjc240rs6mf0g8gpzz3rmcz4h77a2a", - "#f7931a" -); -await addCurrency( - "litecoin", - "Litecoin (LTC)", - "ltc1qgk6fc4u6grqyhfzw208477ze35vrr5tcwhq8zq", - "#345d9d" -); -await addCurrency( - "ethereum", - "Ethereum (ETH, USDT/USDC, ERC20)", - "0x63cd2C691632720Ff2ABDD0b6AABA2466D3Fe468", - "#8c8c8c" -); -await addCurrency( - "polygon", - "Polygon (MATIC)", - "0x63cd2C691632720Ff2ABDD0b6AABA2466D3Fe468", - "#8247e5" -); -await addCurrency( - "solana", - "Solana (SOL)", - "4nMRucCuqttipwQXm31vBgoaxDW6o25TnD8fj1imviCu", - "#dc1fff" -); -await addCurrency( - "cardano", - "Cardano (ADA)", - "addr1q9jd69s53pdy9j567a27ac6uvc2966x0rjz2l9sxy4y5w8383jl87mrdf6uuk9ja7lmagm2p4vw30sa42kjylxxrdufqucgst6", - "#0033ad" -); -await addCurrency( - "siacoin", - "Siacoin (SC)", - "7506caa950cdddbaec8f465937b50324e942ac6f5280a053662e58e3cc8bdb543ab88ccd5c23", - "#20ee82" -); -await addCurrency( - "monero", - "Monero (XMR)", - "48A33fSyFo9YAiux3KHKVBagPGvqmcr2h4oy5pufJn6NUWyZsPF6PAufmrET3gLJjsLwxfU7HU9xe8mEeCqtHqvZN3Ly12h", - "#f26822" -); -await addCurrency( - "handshake", - "Handshake (HNS)", - "hs1qe67ak3j2u4yrq0qnfs2hmycxqdvaf9v5rjsxzy", - "#fff" -); -await addCurrency( - "cosmos", - "Cosmos (ATOM)", - "cosmos1pvy8zyzqwz2r2jl9j9d3zrfmg6dqc5hyhj6d5z", - "#6f7390" -); -await addCurrency( - "secret", - "Secret (SCRT)", - "secret18377vc3af588ggauhrpuyfd954lmmu05xqhf0y", - "#fff" -); -await addCurrency( - "algorand", - "Algorand (ALGO)", - "3QBE5TZ63TF5W7V2QRJWRB72M7INQLA3RZW4XHD3ISRE7CRYCVNU4EEVAE", - "#fff" -); ---- - - -
-
-

Donate Cryptocurrency

-
- { - currencies.map((currency) => ( -
-
-
- -
-

{currency.title}

- -
-
-
-
- )) - } -
-
-
-

Donate Fiat

-
- - - - -
-
-

- If you are interested in donating through other means, please get in touch - with us to discuss. If there is a cryptocurrency you wish to contribute with - that we have not listed, please let me know! -

-
- - - - diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/algorand.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/algorand.svg deleted file mode 100644 index 4273af5a7..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/algorand.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/bitcoin.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/bitcoin.svg deleted file mode 100644 index 46595c320..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/bitcoin.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/cardano.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/cardano.svg deleted file mode 100644 index 0baa777ea..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/cardano.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/cosmos.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/cosmos.svg deleted file mode 100644 index 6108d4f5a..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/cosmos.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/ethereum.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/ethereum.svg deleted file mode 100644 index 3f0e216a3..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/ethereum.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/handshake.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/handshake.svg deleted file mode 100644 index c11b041ec..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/handshake.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/litecoin.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/litecoin.svg deleted file mode 100644 index 749a3cdaa..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/litecoin.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/monero.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/monero.svg deleted file mode 100644 index 2d2587d3a..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/monero.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/polygon.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/polygon.svg deleted file mode 100644 index 6f4f2e289..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/polygon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/secret.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/secret.svg deleted file mode 100644 index b2279f16a..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/secret.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/siacoin.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/siacoin.svg deleted file mode 100644 index b0bcbcc50..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/siacoin.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Methods/icons/solana.svg b/apps/lumeweb.com/src/components/Donate/Methods/icons/solana.svg deleted file mode 100644 index fc6b7daf7..000000000 --- a/apps/lumeweb.com/src/components/Donate/Methods/icons/solana.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Donate/Why.astro b/apps/lumeweb.com/src/components/Donate/Why.astro deleted file mode 100644 index a4e3260df..000000000 --- a/apps/lumeweb.com/src/components/Donate/Why.astro +++ /dev/null @@ -1,33 +0,0 @@ ---- -import Button from "../ui/Button.astro"; -import FeaturedGroup from "../ui/FeaturedGroup.astro"; -import backgroud from "/src/assets/why-bg-2.png"; ---- - -
- -
- -
  • You believe the internet should be free and open for everyone, regardless of political beliefs.
  • -
  • You want a neutral web accessible to everyday people.
  • -
  • You believe your data should be private and secure unless you choose to share it.
  • -
  • You want to ensure that you or someone else can’t be censored or “de-platformed.”
  • -
  • You think people should have free access to information no matter how they choose to access it.
  • -
  • You believe in handling web abuse using legal and social means instead of censorship and restriction.
  • - `, - `Every single day you use the Internet, your data is sold to companies to pay for your usage. Help us break the pattern by funding the creation of free and open-source Web3 tools.`, - ]} - /> -
    -
    diff --git a/apps/lumeweb.com/src/components/Home/CTO.astro b/apps/lumeweb.com/src/components/Home/CTO.astro deleted file mode 100644 index 21fd5eda9..000000000 --- a/apps/lumeweb.com/src/components/Home/CTO.astro +++ /dev/null @@ -1,32 +0,0 @@ ---- -import avatar from "/src/assets/cto-avatar.png"; -import abstractBg from "/src/assets/single-brand-bg-1.png"; ---- - -
    -
    -

    - Community-Powered -

    -

    - Building the open, user-owned web you deserve -

    -

    - Right now, Lume has only one full-time developer, a few freelancers, and - limited helper staff! We need help from developers, fundraisers, funders, - and contributors to bring the new internet to the masses. -

    -
    - -
    -
    Derrick Hammer
    -

    CTO

    -
    -
    -
    -
    - -
    -
    diff --git a/apps/lumeweb.com/src/components/Home/Meme.astro b/apps/lumeweb.com/src/components/Home/Meme.astro deleted file mode 100644 index 56b32dd12..000000000 --- a/apps/lumeweb.com/src/components/Home/Meme.astro +++ /dev/null @@ -1,34 +0,0 @@ ---- -import web3myth from "/src/assets/web3-myth.png"; ---- - -
    -
    -
    -

    Busting the Web3 Myth: Embracing True Openness

    -

    - Time to Walk the Talk -

    -

    - - Let's have a heart-to-heart about Web3. There's a myth that needs to be cleared up. Some folks claim it's all about being wide open, but the reality is a bit more nuanced. -

    -

    - Not every Web3 service walks the talk. Censorship can actually find its way into blockchains too. It's a surprising twist, but it's something we need to fix.

    -

    - But hold up – we're not here to point fingers. We're here to set things straight. It's about acknowledging the facts and rolling up our sleeves. Together, we're pushing for actual openness and the kind of decentralization that counts. It's not about fancy words; it's about action. -

    -

    - So, let's dive in and make Web3 what it's meant to be – no myths, just reality. Join us – it's time to turn talk into a true, open web for all. -

    -
    - Web 1 -
    -
    diff --git a/apps/lumeweb.com/src/components/Home/Message.astro b/apps/lumeweb.com/src/components/Home/Message.astro deleted file mode 100644 index 5be7a9485..000000000 --- a/apps/lumeweb.com/src/components/Home/Message.astro +++ /dev/null @@ -1,17 +0,0 @@ ---- ---- - -
    -

    - A message from Derrick -

    -

    - Some of the world's largest online threats right now are censorship of - speech and money. Web3 represents unifying many legos to create a truly - user-owned web. Decentralization is a means to an end, not the end itself. The - true goal is that you are in control of your personal web, and no one else. -

    -
    diff --git a/apps/lumeweb.com/src/components/Home/PoweredBy.astro b/apps/lumeweb.com/src/components/Home/PoweredBy.astro deleted file mode 100644 index e0c4cc874..000000000 --- a/apps/lumeweb.com/src/components/Home/PoweredBy.astro +++ /dev/null @@ -1,39 +0,0 @@ ---- -import svgSia from "/src/assets/icons/sia.svg?raw"; -import svgHns from "/src/assets/icons/hns.svg?raw"; -import svgOsi from "/src/assets/icons/osi.svg?raw"; ---- - -
    -

    - Powered By -

    -
    - - - - - - - - - -
    -
    diff --git a/apps/lumeweb.com/src/components/Home/Socials.astro b/apps/lumeweb.com/src/components/Home/Socials.astro deleted file mode 100644 index 825437bda..000000000 --- a/apps/lumeweb.com/src/components/Home/Socials.astro +++ /dev/null @@ -1,42 +0,0 @@ ---- -import svgGit from "/src/assets/icons/git.svg?raw"; -import svgGithub from "/src/assets/icons/github.svg?raw"; -import svgDiscord from "/src/assets/icons/discord.svg?raw"; -import svgTwitter from "/src/assets/icons/twitter.svg?raw"; ---- - -
    -

    - Get in touch -

    -
    - - - - - - - - - - - - -
    -
    diff --git a/apps/lumeweb.com/src/components/Home/Typewriter/Typewriter.astro b/apps/lumeweb.com/src/components/Home/Typewriter/Typewriter.astro deleted file mode 100644 index d3d8f133b..000000000 --- a/apps/lumeweb.com/src/components/Home/Typewriter/Typewriter.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import TypewriterContent from "./TypewriterContent.jsx"; ---- - -
    -

    - -

    -
    diff --git a/apps/lumeweb.com/src/components/Home/Typewriter/TypewriterContent.jsx b/apps/lumeweb.com/src/components/Home/Typewriter/TypewriterContent.jsx deleted file mode 100644 index 6f0c22e5d..000000000 --- a/apps/lumeweb.com/src/components/Home/Typewriter/TypewriterContent.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import Typewriter from "typewriter-effect"; - -const HeaderContent = () => { - var - headerStrings = [ - 'Access to the web
    for the masses', - 'An open web
    for business', - 'Web3 for the masses', - 'Web3 for you' - ], - randomString = headerStrings[Math.floor(Math.random() * headerStrings.length)], - words = randomString.split(' '); - - return ( - _' }} onInit={(typewriter) => { - typewriter - .changeDelay(50) - .typeString(randomString.substring(0, randomString.lastIndexOf(' ')) + ' ') - .start(); - typewriter - .typeString('' + words[words.length - 1] + '') - }} /> - ); -}; - -export default HeaderContent; diff --git a/apps/lumeweb.com/src/components/Home/Vision.astro b/apps/lumeweb.com/src/components/Home/Vision.astro deleted file mode 100644 index 68c6d7cab..000000000 --- a/apps/lumeweb.com/src/components/Home/Vision.astro +++ /dev/null @@ -1,31 +0,0 @@ -
    -

    - Our Vision -

    -

    - Enable an open, censorship-resistant web -

    -

    - Web3 is the next evolution of the internet that combines many legos from - past decades. -

    -

    - Benefits include internet freedom, privacy, and ownership over your personal web. -

    -

    - Join us in shaping tomorrow's digital world. Unite with Web3 and lets connect. -

    -

    - We are actively building, so if you want to understand the problems we are solving and are asking "What is - Lume?" ... -

    - -
    diff --git a/apps/lumeweb.com/src/components/Home/Web3.astro b/apps/lumeweb.com/src/components/Home/Web3.astro deleted file mode 100644 index f3df3749c..000000000 --- a/apps/lumeweb.com/src/components/Home/Web3.astro +++ /dev/null @@ -1,45 +0,0 @@ ---- -import gfxLeft from "/src/assets/home-gfx-left.png"; ---- - -
    -
    -
    - -
    -
    -
    -

    - What is the Web? -

    -

    - Why Web3 matters -

    -

    - Web3 often gets mixed up with other terms/buzz words such as "crypto" or - "defi". However, the current web you use now is often referred to insiders - as "web2". -

    -

    - While Web3 can include many decentralized services, it symbolizes the - multiverse, or the entirety of all decentralized & P2P networks. Some may - refer to this as the "metaverse", or even "dweb", but we can agree to - disagree 😉. -

    -

    - Having access to web3 is important so you are in control of what you are able to do. -

    - -
    -
    diff --git a/apps/lumeweb.com/src/components/Home/WebComparison.astro b/apps/lumeweb.com/src/components/Home/WebComparison.astro deleted file mode 100644 index af79f6b02..000000000 --- a/apps/lumeweb.com/src/components/Home/WebComparison.astro +++ /dev/null @@ -1,175 +0,0 @@ ---- -import meme1 from "/src/assets/meme-1.png"; -import meme2 from "/src/assets/meme-2.png"; -import meme3 from "/src/assets/meme-3.png"; -import meme4 from "/src/assets/meme-4.png"; -import meme1Small from "/src/assets/meme-1-small.png"; -import meme2Small from "/src/assets/meme-2-small.png"; -import meme3Small from "/src/assets/meme-3-small.png"; -import meme4Small from "/src/assets/meme-4-small.png"; ---- - -
    -

    - Web3's Current Path -

    - - - - - - -
    -

    Web1

    -

    - Web1 is probably best remembered by geeks as chat rooms and IRC (which - still exist to this day, but only to power users). To normal users it was - the age of AOL dial-up and similar networks where you got web, email, - shopping, and chat all in one place.. -

    - -
    -
    -

    Web2

    -

    - Web2 since evolved with the web browser and we got better gaming, online - apps, video streaming and calling and much, much more. However, it also - got quickly captured by Silicon Valley and what some refer to as the "tech - bros". -

    -

    - So despite the innovation that occurred, it has turned into a top-down - system where only a few geeks/CEO's and their investors control your entire - web. -

    -

    - This also excludes the wider internet infrastructure of domains and ISP's - (internet providers and hosting), who also play a part in controlling your - web, be it for your "safety", or other reasons. -

    - -
    -
    -

    Crypto/DeFi

    -

    - We get the birth of Bitcoin and all of the innovation that followed. While - BTC and a handful of other chains have remained decentralized both in - operation, and access, the innovation over time has caused things to - re-centralize. -

    -

    - This is due to several factors including big money coming in, pushing - greed, hype, and "FOMO". The invention of several new logos's causing this - to only get worse, creating a classic "boom" and "bust". Human nature - tends to be greedy, so over time, money overrode principles. -

    -

    - Many development teams prioritized inventing new ideas and "shipping" them - to users, while selling them "tokens" to exit at their expense, all while - knowing none of what they created was truly decentralized. -

    -

    - It became one large crypto casino. -

    - -
    -
    -

    Web3

    -

    - What to say about Web3? Honestly... upfront it appeared to get used as a - new buzz word to replace "DeFi". Terms like "Web3" and "Metaverse" have - many different meanings to many people. It is intended to include more - than just money and trading, and yet every blockchain-based system that - can be labeled "web3" still builds onto of the same centralized - crypto/defi infrastructure. -

    -

    - The end result is an ecosystem that promotes and wants to be - decentralized, but where money overrules ideology, ethos, and principles. This - is in part due to who's bankrolling it all, and thus the incentives to build - make it more about the money then about freedom. -

    -

    - There needs to be a balance here between free markets/money and public - goods/infra, and so far things are way out of wack and need to be fixed. -

    - -
    - -
    diff --git a/apps/lumeweb.com/src/components/Layout/Footer.astro b/apps/lumeweb.com/src/components/Layout/Footer.astro index 6725c4a9b..5536a4382 100644 --- a/apps/lumeweb.com/src/components/Layout/Footer.astro +++ b/apps/lumeweb.com/src/components/Layout/Footer.astro @@ -1,16 +1,23 @@ --- -import logo from "/src/assets/lume-logo.png"; +import logo from "@/assets/lume-logo.png"; +import { getEntry } from "astro:content"; +import { getContactEmail } from "@/data/collections"; + +const contactEmail = await getContactEmail(); + +const navigation = await getEntry("navigation", "main"); +const footerData = navigation.data.footer; --- + ))} + \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Layout/JoinCommunity.astro b/apps/lumeweb.com/src/components/Layout/JoinCommunity.astro index 73ba8fdcf..3005ddf98 100644 --- a/apps/lumeweb.com/src/components/Layout/JoinCommunity.astro +++ b/apps/lumeweb.com/src/components/Layout/JoinCommunity.astro @@ -1,8 +1,18 @@ --- -import svgGit from "/src/assets/icons/git.svg?raw"; -import svgGithub from "/src/assets/icons/github.svg?raw"; -import svgDiscord from "/src/assets/icons/discord.svg?raw"; -import svgTwitter from "/src/assets/icons/twitter.svg?raw"; +import svgGit from "@/assets/icons/git.svg?raw"; +import svgGithub from "@/assets/icons/github.svg?raw"; +import svgDiscord from "@/assets/icons/discord.svg?raw"; +import svgTwitter from "@/assets/icons/twitter.svg?raw"; +import { getCollection } from "astro:content"; + +const socials = await getCollection("socials"); + +const iconMap: Record = { + git: svgGit, + github: svgGithub, + discord: svgDiscord, + twitter: svgTwitter, +}; ---
    - - - - - - - - - - - - - - - + {socials.map((social) => ( + + + + ))}
    diff --git a/apps/lumeweb.com/src/components/Layout/Navbar.astro b/apps/lumeweb.com/src/components/Layout/Navbar.astro index 38f425279..c4c9db809 100644 --- a/apps/lumeweb.com/src/components/Layout/Navbar.astro +++ b/apps/lumeweb.com/src/components/Layout/Navbar.astro @@ -1,48 +1,43 @@ --- -import logo from "/src/assets/lume-logo.png"; -const { view } = Astro.props; +import logo from "@/assets/lume-logo.png"; +import { getEntry } from "astro:content"; -function getActiveClass(linkView) { - return view === linkView ? "border-b border-white" : ""; +const currentPath = Astro.url.pathname; +const navigation = await getEntry("navigation", "main"); +const navbarItems = navigation.data.navbar; + +function getActiveClass(href: string): string { + if (href.startsWith("http")) return ""; + const linkPath = href.endsWith("/") ? href : href + "/"; + const currentPathWithSlash = currentPath.endsWith("/") ? currentPath : currentPath + "/"; + return currentPathWithSlash === linkPath ? "border-b border-white" : ""; } --- - \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/Vision/Grid.astro b/apps/lumeweb.com/src/components/Vision/Grid.astro deleted file mode 100644 index 4a41b872a..000000000 --- a/apps/lumeweb.com/src/components/Vision/Grid.astro +++ /dev/null @@ -1,56 +0,0 @@ ---- -import GridCell from "../ui/GridCell.astro"; -import GridContainer from "../ui/GridContainer.astro"; - -const features = [ - { - title: "Decentralized Websites", - badge: "goal" as const, - description: - "You should be able to gain access to any website on any network, in a secure and decentralized way", - }, - { - title: "Decentralized Publishing", - badge: "idea" as const, - description: - "You should be able to easily publish a blog or any other basic website for personal or professional use", - }, - { - title: "Website Building Tools", - badge: "idea" as const, - description: - "You should be able to easily build a website that targets the decentralized web", - }, - { - title: "eCommerce", - badge: "idea" as const, - description: - "You should be be able to buy or sell in a free market without censorship or politics blocking your ability to transact", - }, - { - title: "Earn a Living", - badge: "idea" as const, - description: - "You should be able to monetize your content or skills, without a middleman or gatekeeper. You should be able to be free to live your best life by having access to an open market so that you are never chained down or restricted", - }, -]; ---- - -
    - -
    -

    - Freedom.
    Privacy. Ownership. -

    -
    - { - features.map((feature) => ( - - )) - } -
    -
    diff --git a/apps/lumeweb.com/src/components/Vision/Jumbotron.astro b/apps/lumeweb.com/src/components/Vision/Jumbotron.astro deleted file mode 100644 index 230b88aa3..000000000 --- a/apps/lumeweb.com/src/components/Vision/Jumbotron.astro +++ /dev/null @@ -1,18 +0,0 @@ ---- -import backgroundSrc from "/src/assets/vision-jumbotron-bg.png"; ---- - -
    - -

    - Easy access to an open, user-owned web. -

    -
    diff --git a/apps/lumeweb.com/src/components/Vision/NoVc.astro b/apps/lumeweb.com/src/components/Vision/NoVc.astro deleted file mode 100644 index e70f0e235..000000000 --- a/apps/lumeweb.com/src/components/Vision/NoVc.astro +++ /dev/null @@ -1,26 +0,0 @@ ---- -import Button from "../ui/Button.astro"; -import FeaturedGroup from "../ui/FeaturedGroup.astro"; -import background from "/src/assets/double-brand-bg.png"; ---- - -
    - -
    - very aware of the projects that have come before us and whom have made similar promises. We are also doing our best to learn from their mistakes and failures.", - "The key difference that we see big picture is you need both an economy and decentralized/P2P networks, because running the internet is not free, and someone always has to foot the bill.", - "Blockchain finally makes this possible.", - "Having a pragmatic view on mass adoption without compromising on principles is needed to make progress on a user-owned web.", - ]} - /> -
    -
    diff --git a/apps/lumeweb.com/src/components/Vision/Unify.astro b/apps/lumeweb.com/src/components/Vision/Unify.astro deleted file mode 100644 index 67821a505..000000000 --- a/apps/lumeweb.com/src/components/Vision/Unify.astro +++ /dev/null @@ -1,23 +0,0 @@ ---- -import unifyBg from "/src/assets/unifying-bg.png"; -import FeaturedGroup from "../ui/FeaturedGroup.astro"; ---- - -
    - many "crypto", "defi", "web3", "P2P", and "dWeb" projects - that have all taken hundreds of different approaches to innovate. However, - they all have the same broad ethos in common, and they all need an easy means - to access them in one place, but in a censorship-resistant way.`, - `We have a very ambitious vision, and this requires all "tribes" to work together enough for the benefit of the end user.`, - `Below are some of the ideas we are aiming for, and some we would like to tackle eventually.`, - ]} - /> - -
    diff --git a/apps/lumeweb.com/src/components/What/Contribute.astro b/apps/lumeweb.com/src/components/What/Contribute.astro deleted file mode 100644 index 62c135e21..000000000 --- a/apps/lumeweb.com/src/components/What/Contribute.astro +++ /dev/null @@ -1,38 +0,0 @@ ---- -import FeaturedGroup from "../ui/FeaturedGroup.astro"; -import mario from "/src/assets/mario-level-up.gif"; -import background from "/src/assets/contribute-bg.png"; -import Button from "../ui/Button.astro"; ---- - -
    -
    - well as your money?`, - `Blockchain itself is more than just money, and so is Web3, and by - extension P2P networks.`, - `So help us in our goals to level-up Web3.`, - ]} - /> - Mario Level Up -
    -
    diff --git a/apps/lumeweb.com/src/components/What/Grid.astro b/apps/lumeweb.com/src/components/What/Grid.astro deleted file mode 100644 index 11bbdbf42..000000000 --- a/apps/lumeweb.com/src/components/What/Grid.astro +++ /dev/null @@ -1,47 +0,0 @@ ---- -import GridCell from "../ui/GridCell.astro"; -import GridContainer from "../ui/GridContainer.astro"; - -const features = [ - { - title: "Access the markets, aka DeFi", - description: - "Web3 commonly get mixed up with DeFi, however, while you should be able to access any decentralized website or network, access to DeFi to manage your money is critical as well.", - }, - { - title: "NFT's... Anywhere", - description: - "You should be able to access your favorite NFT's anywhere, any time, any place. They are yours and no one should be able to tell you otherwise.", - }, - { - title: "Access any decentralized or P2P network", - description: - "The basics of Web3 is the sum of all the open networks and ecosystems. You should be able to access and visit any of these places. You can compare this to accessing things on Google, Facebook, Apple, or other networks/platforms that are generally walled gardens in the current web system.", - }, - { - title: "Publish Freely", - description: - 'A core tenant of Web3 is censorship-resistance. You should be able to freely post controversial (or even things others just don\'t want to hear) information, such as news, blogging, or video. You should be allowed to openly debate, educate, inform, or entertain without getting "de-platformed".', - }, - { - title: "Socialize and Discover Freely", - description: - "While you have the ability to post, you should also have the ability to read.", - }, - { - title: "Own your web. Own your identity.", - description: - "You should be able to have your private data be and stay private unless you choose otherwise. This is achieved with your online web3 account, which serves as your identity and means of encrypting everything you do. If you want to share you can, but your data is yours, no one else's.", - }, -]; ---- - -
    - - { - features.map((feature) => ( - - )) - } - -
    diff --git a/apps/lumeweb.com/src/components/What/Jumbotron.astro b/apps/lumeweb.com/src/components/What/Jumbotron.astro deleted file mode 100644 index 6f2554a41..000000000 --- a/apps/lumeweb.com/src/components/What/Jumbotron.astro +++ /dev/null @@ -1,19 +0,0 @@ ---- -import backgroundSrc from "/src/assets/whatsweb3-jumbotron-bg.png"; ---- - -
    - -

    - An evolved, user-owned web where you have access to the world in a way only - you control. -

    -
    diff --git a/apps/lumeweb.com/src/components/What/NewWorld.astro b/apps/lumeweb.com/src/components/What/NewWorld.astro deleted file mode 100644 index 1f40d9844..000000000 --- a/apps/lumeweb.com/src/components/What/NewWorld.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import FeaturedGroup from "../ui/FeaturedGroup.astro"; -import backgroundSrc from "/src/assets/new-world-bg.png"; ---- - -
    -
    - -
    -
    - and freedom of economy.", - ]} - /> -
    -
    diff --git a/apps/lumeweb.com/src/components/donate/donate.tsx b/apps/lumeweb.com/src/components/donate/donate.tsx new file mode 100644 index 000000000..7ec63a7f8 --- /dev/null +++ b/apps/lumeweb.com/src/components/donate/donate.tsx @@ -0,0 +1,257 @@ +import React, { useState, useEffect, useRef } from "react"; +import type { CryptoCurrency, FiatPlatform } from "@/data/types"; + +interface DonateProps { + cryptoCurrencies: CryptoCurrency[]; + fiatPlatforms: FiatPlatform[]; + contactEmail: string; +} + +function CryptoCard({ currency }: { currency: CryptoCurrency }) { + const [copied, setCopied] = useState(false); + const timeoutRef = useRef(null); + + useEffect(() => { + return () => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + }; + }, []); + + const copyAddress = () => { + navigator.clipboard.writeText(currency.address); + setCopied(true); + + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + + timeoutRef.current = setTimeout(() => setCopied(false), 2000); + }; + + return ( +
    +
    +

    + {currency.name} +

    + + {currency.symbol} + +
    +
    + + {currency.address} + + +
    +
    + ); +} + +function FiatCard({ platform }: { platform: FiatPlatform }) { + if (platform.id === "paypal") { + return ( +
    + + +
    + ); + } + + return ( + + + {platform.name} + + + ); +} + +export function Donate({ cryptoCurrencies, fiatPlatforms, contactEmail }: DonateProps) { + return ( +
    + {/* Hero */} +
    +

    + Fund the open web +

    +

    + Public goods don't fund themselves. Help us build tools that respect users and resist censorship. +

    + + Make a donation + +
    + + {/* Why */} +
    +
    +

    + Why your support matters +

    +
    +
    +

    + No venture capital +

    +

    + We haven't taken VC money. No investors demanding returns means no pressure to compromise on privacy or build surveillance features. +

    +
    +
    +

    + Open source +

    +

    + Everything we build is free and open. Your donation funds public infrastructure that anyone can use and improve. +

    +
    +
    +

    + Long-term focus +

    +

    + We're not chasing hype cycles. We're building for the next decade of an open, user-owned internet. +

    +
    +
    +

    + Community-driven +

    +

    + Your voice matters. Donors and contributors shape our priorities through GitHub, Discord, and open discussion. +

    +
    +
    +
    +
    + + {/* Methods */} +
    +
    +

    + How to donate +

    + + {/* Crypto */} +
    +

    + Cryptocurrency +

    +
    + {cryptoCurrencies.map((currency) => ( + + ))} +
    +
    + + {/* Fiat */} +
    +

    + Fiat & Platforms +

    +
    + {fiatPlatforms.map((platform) => ( + + ))} +
    +
    +
    +
    + + {/* Other */} +
    +
    +

    + Other ways to give +

    +

    + If you are interested in donating through other means, please get in touch with us to discuss. If there is a cryptocurrency you wish to contribute with that we have not listed, please let us know! +

    + + Get in touch + +
    +
    + + {/* Legal */} +
    +
    +

    + Tax & Legal +

    +
    +

    + + Donations are not tax-deductible under US regulations for our current incorporation status. + +

    +

    + All payments are nondeductible donations and do not create any implied service contract or obligation for Hammer Technologies LLC to render services. +

    +

    + For large corporate donations, please consult a CPA to understand the tax implications. +

    +

    + If you're interested in receiving services from Lume,{' '} + + view our Services page + + . +

    +
    +
    +
    +
    + ); +} + +export default Donate; diff --git a/apps/lumeweb.com/src/components/hero.tsx b/apps/lumeweb.com/src/components/hero.tsx new file mode 100644 index 000000000..7c293f777 --- /dev/null +++ b/apps/lumeweb.com/src/components/hero.tsx @@ -0,0 +1,142 @@ +import React from "react"; +import { cn } from "@/components/ui/lib/utils"; + +export interface HeroButton { + label: string; + url: string; + variant?: "primary" | "secondary"; +} + +export interface HeroProps { + backgroundImage?: string; + blur?: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl"; + opacity?: "25" | "50" | "75" | "100"; + minHeight?: "none" | "sm" | "md" | "lg" | "xl"; + bgPosition?: "auto" | "center" | "top" | "bottom" | "left" | "right"; + children?: React.ReactNode; +} + +export function Hero({ backgroundImage, blur = "sm", opacity = "50", minHeight = "lg", bgPosition = "center", children }: HeroProps) { + const minHeightClasses = { + none: "", + sm: "min-h-[40vh]", + md: "min-h-[60vh]", + lg: "min-h-[80vh]", + xl: "min-h-[100vh]", + }; + + const bgPositionClasses = { + auto: "", + center: "top-[50px] left-1/2 -translate-x-1/2", + top: "top-0 left-1/2 -translate-x-1/2", + bottom: "bottom-0 left-1/2 -translate-x-1/2", + left: "top-1/2 left-0 -translate-y-1/2", + right: "top-1/2 right-0 -translate-y-1/2", + }; + + return ( +
    + {/* Subtle overlay layer */} +
    + + {backgroundImage && ( + + )} + +
    + {children} +
    +
    + ); +} + +export interface HeroContentProps { + title?: string; + titleSize?: "sm" | "md" | "lg"; + tagline?: string; + emphasis?: string; + buttons?: HeroButton[]; +} + +const defaultButtons: HeroButton[] = [ + { label: "Explore Ecosystem", url: "/projects", variant: "primary" }, + { label: "Join Community", url: "#community", variant: "secondary" }, +]; + +export function HeroContent({ + title = "An open web for everyone.", + titleSize = "lg", + tagline, + emphasis, + buttons = defaultButtons, +}: HeroContentProps) { + const titleClasses = { + sm: "text-3xl md:text-5xl", + md: "text-4xl md:text-6xl", + lg: "text-5xl md:text-7xl lg:text-8xl", + }; + + return ( +
    +

    + {title} +

    + + {emphasis ? ( +

    + Freedom. {emphasis}. Ownership. +

    + ) : tagline ? ( +

    + {tagline} +

    + ) : null} + + {buttons.length > 0 && ( +
    + {buttons.map((button) => ( + + {button.label} + + ))} +
    + )} +
    + ); +} + +export function HomepageHero({ backgroundImage, minHeight, blur, opacity, bgPosition, buttons, title, titleSize, emphasis, tagline }: HeroProps & HeroContentProps) { + return ( + + 0 ? buttons : undefined} + /> + + ); +} + +export default HomepageHero; \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/home/community.tsx b/apps/lumeweb.com/src/components/home/community.tsx new file mode 100644 index 000000000..a80fb9655 --- /dev/null +++ b/apps/lumeweb.com/src/components/home/community.tsx @@ -0,0 +1,129 @@ +import React from "react"; + +import gitSvg from "@/assets/icons/git.svg?raw"; +import githubSvg from "@/assets/icons/github.svg?raw"; +import discordSvg from "@/assets/icons/discord.svg?raw"; +import twitterSvg from "@/assets/icons/twitter.svg?raw"; +import type { CommunityProject, Social } from "@/data/types"; + +const ICONS = { + git: gitSvg, + github: githubSvg, + discord: discordSvg, + twitter: twitterSvg, +} as const; + +interface SocialProps { + social: Social; + index: number; +} + +function Social({ social, index }: SocialProps) { + const mtClass = index === 0 ? "-mt-1" : index === 2 ? "mt-1" : ""; + const svg = ICONS[social.icon as keyof typeof ICONS] || githubSvg; + + return ( + + ); +} + +interface CommunityProps { + socials?: Social[]; + projects?: CommunityProject[]; +} + +export function Community({ socials = [], projects = [] }: CommunityProps) { + return ( +
    +
    + {/* Values */} +
    +

    + Our values +

    +

    + Everything we build is guided by these principles. They're not marketing—they're the foundation. +

    +
    + +
    + {VALUES.map((value) => ( +
    +
    + + {value.title[0]} + +
    +

    + {value.title} +

    +

    + {value.description} +

    +
    + ))} +
    + + {/* Get Involved */} +
    +
    +
    + ); +} + +const VALUES = [ + { + title: "Freedom", + description: "The web should be open and accessible to all. No gatekeepers, no permission required.", + }, + { + title: "Privacy", + description: "Your data is yours. End-to-end encryption, no tracking, no surveillance capitalism.", + }, + { + title: "Ownership", + description: "You own what you create. Digital property rights are human rights.", + }, +]; + +export default Community; \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/home/message.tsx b/apps/lumeweb.com/src/components/home/message.tsx new file mode 100644 index 000000000..ee28d20a5 --- /dev/null +++ b/apps/lumeweb.com/src/components/home/message.tsx @@ -0,0 +1,21 @@ +import React from "react"; + +export function Message() { + return ( +
    +
    +

    + Some of the world's largest online threats right now are censorship of + speech and money. Web3 represents unifying many legos to create a truly + user-owned web. Decentralization is a means to an end, not the end itself. The + true goal is that you are in control of your personal web, and no one else. +

    +
    +
    + ); +} + +export default Message; \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/home/powered-by.tsx b/apps/lumeweb.com/src/components/home/powered-by.tsx new file mode 100644 index 000000000..4efba6656 --- /dev/null +++ b/apps/lumeweb.com/src/components/home/powered-by.tsx @@ -0,0 +1,49 @@ +import React from "react"; + +import siaSvg from "@/assets/icons/sia.svg?raw"; +import hnsSvg from "@/assets/icons/hns.svg?raw"; +import osiSvg from "@/assets/icons/osi.svg?raw"; + +const LOGOS = [ + { name: "Sia", href: "https://sia.tech", svg: siaSvg }, + { name: "Handshake", href: "https://handshake.org", svg: hnsSvg }, + { name: "OSI", href: "https://opensource.org/osd/", svg: osiSvg }, +]; + +interface LogoProps { + name: string; + href: string; + svg: string; +} + +function Logo({ name, href, svg }: LogoProps) { + return ( + + ); +} + +export function PoweredBy() { + return ( +
    +
    +
    +

    + Powered By +

    +
    + {LOGOS.map((logo) => ( + + ))} +
    +
    +
    +
    + ); +} + +export default PoweredBy; \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/home/services.tsx b/apps/lumeweb.com/src/components/home/services.tsx new file mode 100644 index 000000000..9644f2dd0 --- /dev/null +++ b/apps/lumeweb.com/src/components/home/services.tsx @@ -0,0 +1,68 @@ +import React from "react"; +import type { Service, ServiceLink } from "@/data/types"; + +interface ServicesProps { + services: Service[]; +} + +interface ServiceCardProps { + service: Service; +} + +function ServiceCard({ service }: ServiceCardProps) { + return ( +
    +

    + {service.name} +

    +

    + {service.description} +

    +
      + {service.features.slice(0, 3).map((feature, index) => ( +
    • • {feature}
    • + ))} +
    +
    + {service.links.map((link) => ( + + {link.text} + + ))} +
    +
    + ); +} + +export function Services({ services }: ServicesProps) { + return ( +
    +
    +
    +

    + Services +

    +

    + Infrastructure that respects users. No surveillance, no vendor lock-in, no rent-seeking. +

    +
    + +
    + {services.map((service) => ( + + ))} +
    +
    +
    + ); +} + +export default Services; \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/principles/principles.tsx b/apps/lumeweb.com/src/components/principles/principles.tsx new file mode 100644 index 000000000..063f21315 --- /dev/null +++ b/apps/lumeweb.com/src/components/principles/principles.tsx @@ -0,0 +1,93 @@ +import React from "react"; + +const PRINCIPLES = [ + { + title: "Your data, your rules", + description: "You own your information. We won't sell it, trade it, or use it to manipulate you.", + }, + { + title: "You matter more than metrics", + description: "We don't chase engagement or addiction. We build tools that give you control.", + }, + { + title: "The internet should work for everyone", + description: "Access isn't a luxury. We build for real people, not just tech insiders.", + }, + { + title: "Privacy isn't optional—it's built in", + description: "Encryption isn't an upsell. It's how we treat every interaction by default.", + }, + { + title: "We won't censor your voice", + description: "Your speech is yours. We don't bow to advertisers, governments, or pressure groups.", + }, + { + title: "Community-funded, not venture-backed", + description: "The open web is infrastructure for everyone. It runs on community support, not investor returns.", + }, + { + title: "We help, we don't harvest", + description: "We create things that help you. Not systems that trap you and extract value.", + }, + { + title: "Technology that defends civil rights", + description: "Freedom and privacy aren't given—they're defended. We build systems that protect your rights by design.", + }, +]; + +export function Principles() { + return ( +
    +
    +
    +

    + Our Principles +

    +

    + Simple beliefs that guide everything we build. +

    +
    + +
    + {PRINCIPLES.map((principle, index) => ( +
    +
    + + {String(index + 1).padStart(2, "0")} + +
    +

    + {principle.title} +

    +

    + {principle.description} +

    +
    +
    +
    + ))} +
    + +
    +

    + These principles are derived from web3ready.org, where you'll find the original principles with deep reasoning. +

    + + Read the full manifesto + + + + +
    +
    +
    + ); +} + +export default Principles; \ No newline at end of file diff --git a/apps/lumeweb.com/src/components/ui/GridCell.astro b/apps/lumeweb.com/src/components/ui/GridCell.astro index 6550a1166..f71f9fdc5 100644 --- a/apps/lumeweb.com/src/components/ui/GridCell.astro +++ b/apps/lumeweb.com/src/components/ui/GridCell.astro @@ -1,6 +1,6 @@ --- -import flagSvg from "/src/assets/icons/flag.svg?raw"; -import starSvg from "/src/assets/icons/star.svg?raw"; +import flagSvg from "@/assets/icons/flag.svg?raw"; +import starSvg from "@/assets/icons/star.svg?raw"; export interface Props { title: string; description: string; diff --git a/apps/lumeweb.com/src/components/ui/lib/utils.ts b/apps/lumeweb.com/src/components/ui/lib/utils.ts new file mode 100644 index 000000000..373983e34 --- /dev/null +++ b/apps/lumeweb.com/src/components/ui/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} \ No newline at end of file diff --git a/apps/lumeweb.com/src/content.config.ts b/apps/lumeweb.com/src/content.config.ts new file mode 100644 index 000000000..0ac528665 --- /dev/null +++ b/apps/lumeweb.com/src/content.config.ts @@ -0,0 +1,197 @@ +import { defineCollection, z } from 'astro:content'; +import { file } from 'astro/loaders'; +import { + parseJsonProperty, + parsePropertyRecordToArray, + parseStringPropertyRecordToArray, + parseContactEmail, + parseWrapWithId, +} from './data/parsers'; + +/** + * Helper to parse a JSON file and extract a specific property as an array + */ +const parseJsonArrayProperty = (property: string) => + parseJsonProperty(property); + +// ============ Services ============ + +const ServiceLinkSchema = z.object({ + text: z.string(), + url: z.string(), + style: z.enum(['primary', 'secondary']), +}); + +const ServiceSchema = z.object({ + id: z.string(), + name: z.string(), + tagline: z.string(), + description: z.string(), + features: z.array(z.string()), + links: z.array(ServiceLinkSchema), +}); + +const UpcomingServicesSchema = z.object({ + tagline: z.string(), + description: z.string(), + features: z.array(z.string()), +}); + +const services = defineCollection({ + loader: file('src/data/services.json', { + parser: parseJsonArrayProperty('services'), + }), + schema: ServiceSchema, +}); + +// ============ Socials ============ + +const SocialSchema = z.object({ + id: z.string(), + name: z.string(), + url: z.string(), + title: z.string(), + icon: z.string(), +}); + +const socials = defineCollection({ + loader: file('src/data/socials.json', { + parser: parseJsonArrayProperty('socials'), + }), + schema: SocialSchema, +}); + +const communitySections = defineCollection({ + loader: file('src/data/socials.json', { + parser: parsePropertyRecordToArray('community'), + }), + schema: z.object({ + id: z.string(), + url: z.string(), + label: z.string(), + description: z.string().optional(), + }), +}); + +// ============ Contacts ============ + +const contactEmails = defineCollection({ + loader: file('src/data/contacts.json', { + parser: parseContactEmail('email', 'contact'), + }), + schema: z.object({ + id: z.string(), + email: z.string(), + label: z.string(), + description: z.string().optional(), + }), +}); + +const contactSocials = defineCollection({ + loader: file('src/data/contacts.json', { + parser: parseStringPropertyRecordToArray('socials'), + }), + schema: z.object({ + id: z.string(), + url: z.string(), + }), +}); + +// ============ Community ============ + +const CommunityProjectSchema = z.object({ + id: z.string(), + name: z.string(), + description: z.string(), + features: z.array(z.string()), + links: z.array( + z.object({ + text: z.string(), + url: z.string(), + style: z.enum(['primary', 'secondary']), + }) + ), +}); + +const community = defineCollection({ + loader: file('src/data/community.json', { + parser: parseJsonArrayProperty('projects'), + }), + schema: CommunityProjectSchema, +}); + +// ============ Donations ============ + +const CryptoCurrencySchema = z.object({ + id: z.string(), + name: z.string(), + symbol: z.string(), + address: z.string(), + color: z.string(), +}); + +const FiatPlatformSchema = z.object({ + id: z.string(), + name: z.string(), + url: z.string(), + icon: z.string(), + backgroundColor: z.string(), + borderColor: z.string(), + hostedButtonId: z.string().optional(), +}); + +const cryptoCurrencies = defineCollection({ + loader: file('src/data/donations.json', { + parser: parseJsonArrayProperty('cryptocurrencies'), + }), + schema: CryptoCurrencySchema, +}); + +const fiatPlatforms = defineCollection({ + loader: file('src/data/donations.json', { + parser: parseJsonArrayProperty('fiatPlatforms'), + }), + schema: FiatPlatformSchema, +}); + +// ============ Navigation ============ + +const NavigationItemSchema = z.object({ + label: z.string(), + href: z.string(), + view: z.string().optional(), + external: z.boolean().optional(), +}); + +const FooterColumnSchema = z.object({ + title: z.string(), + items: z.array(NavigationItemSchema), +}); + +const FooterSchema = z.object({ + columns: z.array(FooterColumnSchema), +}); + +const NavigationSchema = z.object({ + navbar: z.array(NavigationItemSchema), + footer: FooterSchema, +}); + +const navigation = defineCollection({ + loader: file('src/data/navigation.json', { + parser: parseWrapWithId('main'), + }), + schema: NavigationSchema, +}); + +export const collections = { + services, + socials, + communitySections, + contactEmails, + contactSocials, + community, + cryptoCurrencies, + fiatPlatforms, + navigation, +}; diff --git a/apps/lumeweb.com/src/data/collections.ts b/apps/lumeweb.com/src/data/collections.ts new file mode 100644 index 000000000..4347b7c4c --- /dev/null +++ b/apps/lumeweb.com/src/data/collections.ts @@ -0,0 +1,30 @@ +import { getCollection } from 'astro:content'; +import type { ContactEmailEntry } from './parsers'; + +const CONTACT_ID = 'contact' as const; + +/** + * Fetch the contact email entry from the contactEmails collection + * @returns The contact email entry + * @throws Error if contact email is not found + */ +export async function getContactEmailEntry(): Promise { + const contactEmails = await getCollection('contactEmails'); + const contact = contactEmails.find(entry => entry.id === CONTACT_ID); + + if (!contact) { + throw new Error(`Contact email with id "${CONTACT_ID}" not found`); + } + + return contact; +} + +/** + * Fetch the contact email from the contactEmails collection + * @returns The contact email address + * @throws Error if contact email is not found + */ +export async function getContactEmail(): Promise { + const contact = await getContactEmailEntry(); + return contact.data.email; +} diff --git a/apps/lumeweb.com/src/data/community.json b/apps/lumeweb.com/src/data/community.json new file mode 100644 index 000000000..6cd9013a9 --- /dev/null +++ b/apps/lumeweb.com/src/data/community.json @@ -0,0 +1 @@ +{"projects": [{"id": "portal-framework", "name": "Portal", "description": "A complete web3 hosting platform with built-in decentralized storage, authentication, and file uploads.", "features": ["Plugin architecture", "Multi-protocol support", "Open source (MIT licensed)"], "links": [{"text": "View Documentation", "url": "https://docs.lumeweb.com/", "style": "primary"}, {"text": "GitHub", "url": "https://github.com/LumeWeb/portal", "style": "secondary"}]}, {"id": "web3ready", "name": "web3ready", "description": "A philosophical foundation for the open web. Principles for building user-owned digital infrastructure.", "features": ["CC0 licensed", "Community-owned principles", "Fork and adapt freely"], "links": [{"text": "Read Manifesto", "url": "https://web3ready.org", "style": "primary"}, {"text": "GitHub", "url": "https://github.com/LumeWeb/web3ready", "style": "secondary"}]}]} diff --git a/apps/lumeweb.com/src/data/community.ts b/apps/lumeweb.com/src/data/community.ts new file mode 100644 index 000000000..fbbaa41f3 --- /dev/null +++ b/apps/lumeweb.com/src/data/community.ts @@ -0,0 +1,31 @@ +import { z } from "zod"; +import communityDataRaw from "./community.json"; + +export const CommunityProjectSchema = z.object({ + id: z.string(), + name: z.string(), + description: z.string(), + features: z.array(z.string()), + links: z.array( + z.object({ + text: z.string(), + url: z.string(), + style: z.enum(["primary", "secondary"]), + }) + ), +}); + +export const CommunityDataSchema = z.object({ + projects: z.array(CommunityProjectSchema), +}); + +export type CommunityProject = z.infer; + +// Validate and export data +const parsedResult = CommunityDataSchema.safeParse(communityDataRaw as unknown); + +export const communityProjects: CommunityProject[] = parsedResult.success ? parsedResult.data.projects : []; + +if (!parsedResult.success) { + console.error('Invalid community data:', parsedResult.error); +} \ No newline at end of file diff --git a/apps/lumeweb.com/src/data/contacts.json b/apps/lumeweb.com/src/data/contacts.json new file mode 100644 index 000000000..2975f4d54 --- /dev/null +++ b/apps/lumeweb.com/src/data/contacts.json @@ -0,0 +1,15 @@ +{ + "email": { + "contact": { + "email": "contact@lumeweb.com", + "label": "Contact", + "description": "General inquiries and donations" + } + }, + "socials": { + "github": "https://github.com/LumeWeb", + "git": "https://git.lumeweb.com", + "discord": "https://discord.gg/qpC8ADp3rS", + "twitter": "https://twitter.com/lumeweb3" + } +} diff --git a/apps/lumeweb.com/src/data/donations.json b/apps/lumeweb.com/src/data/donations.json new file mode 100644 index 000000000..388dda600 --- /dev/null +++ b/apps/lumeweb.com/src/data/donations.json @@ -0,0 +1,81 @@ +{ + "cryptocurrencies": [ + { + "id": "bitcoin", + "name": "Bitcoin", + "symbol": "BTC", + "address": "bc1q9xq2w4w2hjc240rs6mf0g8gpzz3rmcz4h77a2a", + "color": "#f7931a" + }, + { + "id": "ethereum", + "name": "Ethereum", + "symbol": "ETH, USDT, USDC", + "address": "0x63cd2C691632720Ff2ABDD0b6AABA2466D3Fe468", + "color": "#627eea" + }, + { + "id": "solana", + "name": "Solana", + "symbol": "SOL", + "address": "4nMRucCuqttipwQXm31vBgoaxDW6o25TnD8fj1imviCu", + "color": "#9945ff" + }, + { + "id": "monero", + "name": "Monero", + "symbol": "XMR", + "address": "48A33fSyFo9YAiux3KHKVBagPGvqmcr2h4oy5pufJn6NUWyZsPF6PAufmrET3gLJjsLwxfU7HU9xe8mEeCqtHqvZN3Ly12h", + "color": "#ff6600" + }, + { + "id": "sia", + "name": "Siacoin", + "symbol": "SC", + "address": "621a2d502fe62de595eeaf4141432c6713331f2f152fa4f7e0d7a721e3abdceb", + "color": "#20ee82" + }, + { + "id": "handshake", + "name": "Handshake", + "symbol": "HNS", + "address": "hs1qe67ak3j2u4yrq0qnfs2hmycxqdvaf9v5rjsxzy", + "color": "#ffffff" + } + ], + "fiatPlatforms": [ + { + "id": "github", + "name": "GitHub Sponsors", + "url": "https://github.com/sponsors/LumeWeb", + "icon": "github", + "backgroundColor": "#000000", + "borderColor": "#24292e" + }, + { + "id": "patreon", + "name": "Patreon", + "url": "https://www.patreon.com/bePatron?u=71702133", + "icon": "patreon", + "backgroundColor": "#ff424d", + "borderColor": "#ff424d" + }, + { + "id": "liberapay", + "name": "Liberapay", + "url": "https://liberapay.com/lumeweb/donate", + "icon": "liberapay", + "backgroundColor": "#f6c915", + "borderColor": "#f6c915" + }, + { + "id": "paypal", + "name": "PayPal", + "url": "https://www.paypal.com/donate", + "icon": "paypal", + "backgroundColor": "#0070e0", + "borderColor": "#0070e0", + "hostedButtonId": "LKDLTQQRQV2U8" + } + ] +} diff --git a/apps/lumeweb.com/src/data/navigation.json b/apps/lumeweb.com/src/data/navigation.json new file mode 100644 index 000000000..8d1ee78af --- /dev/null +++ b/apps/lumeweb.com/src/data/navigation.json @@ -0,0 +1,45 @@ +{ + "id": "main", + "navbar": [ + { "label": "Home", "href": "/" }, + { "label": "Principles", "href": "/principles" }, + { "label": "Services", "href": "/services" }, + { "label": "Community Projects", "href": "/projects" }, + { "label": "Donate", "href": "/donate" }, + { "label": "Manifesto", "href": "https://web3ready.org", "external": true } + ], + "footer": { + "columns": [ + { + "title": "About", + "items": [ + { "label": "Home", "href": "/" }, + { "label": "Principles", "href": "/principles" }, + { "label": "Services", "href": "/services" }, + { "label": "Community Projects", "href": "/projects" } + ] + }, + { + "title": "Community", + "items": [ + { "label": "GitHub", "href": "https://github.com/LumeWeb" }, + { "label": "Discord", "href": "https://discord.gg/qpC8ADp3rS" }, + { "label": "Twitter", "href": "https://twitter.com/lumeweb3" } + ] + }, + { + "title": "Resources", + "items": [ + { "label": "Documentation", "href": "https://docs.lumeweb.com" }, + { "label": "Manifesto", "href": "https://web3ready.org" } + ] + }, + { + "title": "Support", + "items": [ + { "label": "Donate", "href": "/donate" } + ] + } + ] + } +} diff --git a/apps/lumeweb.com/src/data/parsers.ts b/apps/lumeweb.com/src/data/parsers.ts new file mode 100644 index 000000000..efb92fc9f --- /dev/null +++ b/apps/lumeweb.com/src/data/parsers.ts @@ -0,0 +1,129 @@ +import type { ParserFunction } from 'astro/loaders'; + +/** + * Type for a record entry with an id field + */ +export type IdRecord = { id: string } & T; + +/** + * Type for a contact email entry + */ +export type ContactEmailEntry = { + id: string; + email: string; + label: string; + description?: string; +}; + +/** + * Interface for a URL record entry + */ +export interface UrlRecordEntry { + id: string; + url: string; +} + +/** + * Type for a content collection item with data property + */ +export type CollectionItem = { data: T }; + +/** + * Find a social entry by ID from a collection + */ +export const findSocialById = (socials: Array>, id: string): string | undefined => { + return socials.find(s => s.id === id)?.data.url; +}; + +/** + * Extract data array from a content collection + */ +export const extractCollectionData = (collection: Array>): T[] => { + return collection.map(item => item.data); +}; + +/** + * Parse a JSON file and extract a specific property + */ +export const parseJsonProperty = + (property: string): ParserFunction => + (text) => + JSON.parse(text)[property]; + +/** + * Parse a JSON file with nested properties + */ +export const parseNestedJsonProperty = + (...properties: string[]): ParserFunction => + (text) => + properties.reduce((obj, prop) => obj[prop], JSON.parse(text)); + +/** + * Parse a JSON file and wrap it with an id key + * @param id - The id to use for wrapping + */ +export const parseWrapWithId = + (id: string): ParserFunction> => + (text) => ({ [id]: JSON.parse(text) }); + +/** + * Convert a record object to an array with id keys + */ +export const parseRecordToArray = + >(): ParserFunction< + Array> + > => + (text) => { + const record = JSON.parse(text) as Record; + return Object.entries(record).map(([key, value]) => ({ + id: key, + ...(typeof value === 'object' && value !== null ? value : { value }), + })); + }; + +/** + * Parse a JSON file, extract a specific property (object), and convert to array with id + * @param property - The property name to extract from JSON + */ +export const parsePropertyRecordToArray = >( + property: string +): ParserFunction>> => { + return (text: string) => { + const record = JSON.parse(text)[property] as Record; + return Object.entries(record).map(([key, value]) => ({ + id: key, + ...value, + })); + }; +}; + +/** + * Parse a JSON file, extract a string record, and convert to {id, url} array + * @param property - The property name to extract from JSON + */ +export const parseStringPropertyRecordToArray = ( + property: string +): ParserFunction> => { + return (text: string) => { + const record = JSON.parse(text)[property] as Record; + return Object.entries(record).map(([key, value]) => ({ + id: key, + url: value, + })); + }; +}; + +/** + * Parse a JSON file, extract a nested contact email property, and wrap in array with id + * @param parentProperty - The parent property name (e.g., "email") + * @param contactId - The id to use for the contact entry + */ +export const parseContactEmail = ( + parentProperty: string, + contactId: string +): ParserFunction> => { + return (text: string) => { + const data = JSON.parse(text); + return [{ id: contactId, ...data[parentProperty][contactId] as { email: string; label: string; description?: string } }]; + }; +}; diff --git a/apps/lumeweb.com/src/data/schema.ts b/apps/lumeweb.com/src/data/schema.ts new file mode 100644 index 000000000..bb8461396 --- /dev/null +++ b/apps/lumeweb.com/src/data/schema.ts @@ -0,0 +1,109 @@ +import { z } from "zod"; +import servicesDataRaw from "./services.json"; +import socialsDataRaw from "./socials.json"; +import contactsDataRaw from "./contacts.json"; + +// ============ Services ============ + +export const ServiceLinkSchema = z.object({ + text: z.string(), + url: z.string(), + style: z.enum(["primary", "secondary"]), +}); + +export const ServiceSchema = z.object({ + id: z.string(), + name: z.string(), + tagline: z.string(), + description: z.string(), + features: z.array(z.string()), + links: z.array(ServiceLinkSchema), +}); + +export const UpcomingServicesSchema = z.object({ + tagline: z.string(), + description: z.string(), + features: z.array(z.string()), +}); + +export const ServicesDataSchema = z.object({ + services: z.array(ServiceSchema), + upcoming: UpcomingServicesSchema.nullable(), +}); + +export type ServiceLink = z.infer; +export type Service = z.infer; +export type UpcomingServices = z.infer; +export type ServicesData = z.infer; + +// ============ Socials ============ + +export const SocialSchema = z.object({ + id: z.string(), + name: z.string(), + url: z.string(), + title: z.string(), + icon: z.string(), +}); + +export const CommunitySectionSchema = z.object({ + url: z.string(), + label: z.string(), + description: z.string().optional(), +}); + +export const SocialsDataSchema = z.object({ + socials: z.array(SocialSchema), + community: z.record(z.string(), CommunitySectionSchema), +}); + +export type Social = z.infer; +export type CommunitySection = z.infer; +export type SocialsData = z.infer; + +// ============ Contacts ============ + +export const ContactEmailSchema = z.object({ + email: z.string(), + label: z.string(), + description: z.string().optional(), +}); + +export const ContactEmailSectionSchema = z.object({ + support: ContactEmailSchema.optional(), +}); + +export const ContactsDataSchema = z.object({ + email: ContactEmailSectionSchema, + socials: z.record(z.string(), z.string()), +}); + +export type ContactEmail = z.infer; +export type ContactEmailSection = z.infer; +export type ContactsData = z.infer; + +// ============ Exports ============ + +const servicesParsedResult = ServicesDataSchema.safeParse(servicesDataRaw as unknown); +export const services: Service[] = servicesParsedResult.success ? servicesParsedResult.data.services : []; +export const upcomingServices: UpcomingServices | null = servicesParsedResult.success ? servicesParsedResult.data.upcoming : null; + +if (!servicesParsedResult.success) { + console.error('Invalid services data:', servicesParsedResult.error); +} + +const socialsParsedResult = SocialsDataSchema.safeParse(socialsDataRaw as unknown); +export const socials: Social[] = socialsParsedResult.success ? socialsParsedResult.data.socials : []; +export const communitySections: Record = socialsParsedResult.success ? socialsParsedResult.data.community : {}; + +if (!socialsParsedResult.success) { + console.error('Invalid socials data:', socialsParsedResult.error); +} + +const contactsParsedResult = ContactsDataSchema.safeParse(contactsDataRaw as unknown); +export const contactEmails: ContactEmailSection = contactsParsedResult.success ? contactsParsedResult.data.email : {}; +export const contactSocials: Record = contactsParsedResult.success ? contactsParsedResult.data.socials : {}; + +if (!contactsParsedResult.success) { + console.error('Invalid contacts data:', contactsParsedResult.error); +} diff --git a/apps/lumeweb.com/src/data/services.json b/apps/lumeweb.com/src/data/services.json new file mode 100644 index 000000000..e9961b251 --- /dev/null +++ b/apps/lumeweb.com/src/data/services.json @@ -0,0 +1,21 @@ +{ + "services": [ + { + "id": "pinner", + "name": "Pinner", + "tagline": "Decentralized storage pinning service powered by the Sia network.", + "description": "Keep your data available without running your own infrastructure.", + "features": [ + "Private (zero-knowledge) or public storage", + "Simple pricing", + "No data mining, no complexity", + "Open standards, leave anytime" + ], + "links": [ + { "text": "Start Storing →", "url": "https://pinner.xyz", "style": "primary" }, + { "text": "Documentation", "url": "https://docs.pinner.xyz", "style": "secondary" } + ] + } + ], + "upcoming": null +} diff --git a/apps/lumeweb.com/src/data/services.ts b/apps/lumeweb.com/src/data/services.ts new file mode 100644 index 000000000..2b13e66e4 --- /dev/null +++ b/apps/lumeweb.com/src/data/services.ts @@ -0,0 +1,2 @@ +// Re-export from schema.ts which contains the validation and exports +export * from "./schema"; \ No newline at end of file diff --git a/apps/lumeweb.com/src/data/socials.json b/apps/lumeweb.com/src/data/socials.json new file mode 100644 index 000000000..6db78264e --- /dev/null +++ b/apps/lumeweb.com/src/data/socials.json @@ -0,0 +1,20 @@ +{ + "socials": [ + { "id": "github", "name": "GitHub", "url": "https://github.com/LumeWeb", "title": "GitHub", "icon": "github" }, + { "id": "git", "name": "Git", "url": "https://git.lumeweb.com", "title": "Git", "icon": "git" }, + { "id": "discord", "name": "Discord", "url": "https://discord.gg/qpC8ADp3rS", "title": "Discord", "icon": "discord" }, + { "id": "twitter", "name": "Twitter", "url": "https://twitter.com/lumeweb3", "title": "Twitter", "icon": "twitter" } + ], + "community": { + "github": { + "url": "https://github.com/LumeWeb", + "label": "View on GitHub", + "description": "Help improve Lume by contributing to the project" + }, + "discord": { + "url": "https://discord.gg/qpC8ADp3rS", + "label": "Join Discord →", + "description": "Get support, share ideas, and connect with other users" + } + } +} diff --git a/apps/lumeweb.com/src/data/types.ts b/apps/lumeweb.com/src/data/types.ts new file mode 100644 index 000000000..65e63c36a --- /dev/null +++ b/apps/lumeweb.com/src/data/types.ts @@ -0,0 +1,52 @@ +/** + * Shared types for data collections + */ + +export interface ServiceLink { + text: string; + url: string; + style: 'primary' | 'secondary'; +} + +export interface Service { + id: string; + name: string; + tagline: string; + description: string; + features: string[]; + links: ServiceLink[]; +} + +export interface CommunityProject { + id: string; + name: string; + description: string; + features: string[]; + links: ServiceLink[]; +} + +export interface Social { + id: string; + name: string; + url: string; + title: string; + icon: string; +} + +export interface CryptoCurrency { + id: string; + name: string; + symbol: string; + address: string; + color: string; +} + +export interface FiatPlatform { + id: string; + name: string; + url: string; + icon: string; + backgroundColor: string; + borderColor: string; + hostedButtonId?: string; +} diff --git a/apps/lumeweb.com/src/layouts/Layout.astro b/apps/lumeweb.com/src/layouts/Layout.astro index 69d8f2e5f..6fe7b2f0a 100644 --- a/apps/lumeweb.com/src/layouts/Layout.astro +++ b/apps/lumeweb.com/src/layouts/Layout.astro @@ -1,76 +1,70 @@ --- -import "../styles/tailwind.css"; -import "../styles/global.scss"; -import opengraph from "/src/assets/opengraph.png"; -import Navbar from "../components/Layout/Navbar.astro"; -import Footer from "../components/Layout/Footer.astro"; -import JoinCommunity from "../components/Layout/JoinCommunity.astro"; +import "@/styles/tailwind.css"; +import opengraph from "@/assets/opengraph.png"; +import Navbar from "@/components/Layout/Navbar.astro"; +import Footer from "@/components/Layout/Footer.astro"; +import JoinCommunity from "@/components/Layout/JoinCommunity.astro"; +import { SEO } from "astro-seo"; export interface Props { - view: string; title: string; } -const { view, title } = Astro.props; +const { title } = Astro.props; const description = "A platform, network and experience that allows you to control and own your online web, and access all of the possibilities Web3 has to offer. Join the open web."; -const url = "https://lumeweb.com"; +const canonicalURL = Astro.url.href; +const imageURL = new URL(opengraph.src, Astro.url).href; --- - {title} - - - - - - - - - - - - - - - - - - - + - - -
    + + +
    - {view !== "home" && } + {Astro.url.pathname !== "/" && }