Initial commit
3
landing/.eslintrc.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"extends": "next/core-web-vitals"
|
||||
}
|
||||
35
landing/.gitignore
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
165
landing/app/download/page.tsx
Normal file
@@ -0,0 +1,165 @@
|
||||
import { downloads } from "@/helpers/helpers";
|
||||
import type { Metadata } from "next";
|
||||
|
||||
import { generalMetadata } from "@/helpers/metadata";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generalMetadata,
|
||||
title: "FeedDeck - Download",
|
||||
};
|
||||
|
||||
export default function Download() {
|
||||
return (
|
||||
<main>
|
||||
<div
|
||||
className="py-8 px-4 mx-auto max-w-screen-xl lg:py-16 lg:px-6"
|
||||
style={{ minHeight: "calc(100vh - 108px)" }}
|
||||
>
|
||||
<div className="mx-auto max-w-screen-md text-center mb-8 lg:mb-12">
|
||||
<h2 className="mb-4 text-4xl tracking-tight font-extrabold">
|
||||
Available on all Platforms
|
||||
</h2>
|
||||
<p className="mb-5 font-light text-gray-400 sm:text-xl">
|
||||
FeedDeck is available on all platforms. Choose your favorite one and
|
||||
download the application now! You can also use FeedDeck in your
|
||||
browser.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col justify-center">
|
||||
<div className="flex flex-wrap justify-center gap-20">
|
||||
<IOS />
|
||||
<Android />
|
||||
<Web />
|
||||
<MacOS />
|
||||
<Windows />
|
||||
<Linux />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
const IOS = () => (
|
||||
<a href={downloads["ios"]} target="_blank" rel="noopener noreferrer">
|
||||
<div className="flex flex-col items-center justify-center p-8 rounded-lg hover:bg-secondary hover:text-onsecondary">
|
||||
<svg
|
||||
width="128px"
|
||||
height="128px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Apple" transform="matrix(9.14452,0,0,9.14452,290.423,-292.625)">
|
||||
<path d="M318.7,268.7C318.5,232 335.1,204.3 368.7,183.9C349.9,157 321.5,142.2 284,139.3C248.5,136.5 209.7,160 195.5,160C180.5,160 146.1,140.3 119.1,140.3C63.3,141.2 4,184.8 4,273.5C4,299.7 8.8,326.767 18.4,354.7C31.2,391.4 77.4,481.4 125.6,479.9C150.8,479.3 168.6,462 201.4,462C233.2,462 249.7,479.9 277.8,479.9C326.4,479.2 368.2,397.4 380.4,360.6C315.2,329.9 318.7,270.6 318.7,268.7ZM262.1,104.5C289.4,72.1 286.9,42.6 286.1,32C262,33.4 234.1,48.4 218.2,66.9C200.7,86.7 190.4,111.2 192.6,138.8C218.7,140.8 242.5,127.4 262.1,104.5Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<span className="pt-4 text-xl">iOS</span>
|
||||
</div>
|
||||
</a>
|
||||
);
|
||||
|
||||
const Android = () => (
|
||||
<a href={downloads["android"]} target="_blank" rel="noopener noreferrer">
|
||||
<div className="flex flex-col items-center justify-center p-8 rounded-lg hover:bg-secondary hover:text-onsecondary">
|
||||
<svg
|
||||
width="128px"
|
||||
height="128px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Android" transform="matrix(7.11111,0,0,7.11111,0,473.322)">
|
||||
<path d="M420.55,301.93C407.384,301.93 396.55,291.096 396.55,277.93C396.55,264.764 407.384,253.93 420.55,253.93C433.716,253.93 444.55,264.764 444.55,277.93C444.55,291.096 433.716,301.93 420.55,301.93M155.45,301.93C142.284,301.93 131.45,291.096 131.45,277.93C131.45,264.764 142.284,253.93 155.45,253.93C168.616,253.93 179.45,264.764 179.45,277.93C179.45,291.096 168.616,301.93 155.45,301.93M429.15,157.45L477.09,74.45C478.196,72.802 478.786,70.862 478.786,68.878C478.786,63.392 474.272,58.878 468.786,58.878C464.987,58.878 461.502,61.043 459.82,64.45L411.28,148.52C332.897,113.365 243.103,113.365 164.72,148.52L116.18,64.45C114.498,61.043 111.013,58.878 107.214,58.878C101.728,58.878 97.214,63.392 97.214,68.878C97.214,70.862 97.804,72.802 98.91,74.45L146.85,157.45C64.53,202.22 8.24,285.55 0,384L576,384C567.76,285.55 511.46,202.22 429.15,157.45" />
|
||||
</g>
|
||||
</svg>
|
||||
<span className="pt-4 text-xl">Android</span>
|
||||
</div>
|
||||
</a>
|
||||
);
|
||||
|
||||
const Web = () => (
|
||||
<a href={downloads["web"]} target="_blank" rel="noopener noreferrer">
|
||||
<div className="flex flex-col items-center justify-center p-8 rounded-lg hover:bg-secondary hover:text-onsecondary">
|
||||
<svg
|
||||
width="128px"
|
||||
height="128px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g
|
||||
id="Browser"
|
||||
transform="matrix(8.25806,0,0,8.25806,-66.0645,-66.0645)"
|
||||
>
|
||||
<path d="M274.69,274.69L237.31,237.31L166,346L274.69,274.69ZM256,8C119,8 8,119 8,256C8,393 119,504 256,504C393,504 504,393 504,256C504,119 393,8 256,8ZM411.85,182.79L426.63,176.66C427.599,176.26 428.637,176.053 429.686,176.053C432.918,176.053 435.846,178.012 437.08,181C437.484,181.972 437.692,183.015 437.692,184.068C437.692,187.298 435.735,190.225 432.75,191.46L418,197.57C413.946,199.248 409.229,197.293 407.55,193.24C405.869,189.194 407.808,184.481 411.85,182.79ZM314.43,94L320.55,79.22C322.241,75.178 326.954,73.239 331,74.92C335.053,76.599 337.008,81.316 335.33,85.37L329.2,100.15C327.521,104.203 322.804,106.158 318.75,104.48C315.766,103.245 313.81,100.318 313.81,97.088C313.81,96.028 314.021,94.978 314.43,94ZM256,60C260.389,60 264,63.611 264,68L264,84C264,88.389 260.389,92 256,92C251.611,92 248,88.389 248,84L248,68C248,63.611 251.611,60 256,60ZM181,74.92C181.972,74.516 183.015,74.308 184.068,74.308C187.298,74.308 190.225,76.265 191.46,79.25L197.57,94C198.012,95.01 198.24,96.101 198.24,97.204C198.24,101.593 194.628,105.204 190.24,105.204C186.954,105.204 183.988,103.18 182.79,100.12L176.66,85.34C175.003,81.291 176.959,76.596 181,74.92ZM117.42,117.41C120.523,114.309 125.627,114.309 128.73,117.41L140,128.72C143.081,131.82 143.081,136.9 140,140C136.897,143.101 131.793,143.101 128.69,140L117.38,128.69C114.307,125.582 114.32,120.502 117.41,117.41L117.42,117.41ZM60,256C60,251.611 63.611,248 68,248L84,248C88.389,248 92,251.611 92,256C92,260.389 88.389,264 84,264L68,264C63.611,264 60,260.389 60,256ZM100.15,329.21L85.37,335.34C84.401,335.74 83.363,335.947 82.314,335.947C79.082,335.947 76.154,333.988 74.92,331C74.516,330.028 74.308,328.985 74.308,327.932C74.308,324.702 76.265,321.775 79.25,320.54L94,314.43C98.054,312.752 102.771,314.707 104.45,318.76C106.131,322.806 104.192,327.519 100.15,329.21ZM104.48,193.21C103.253,196.212 100.317,198.184 97.074,198.184C96.019,198.184 94.974,197.975 94,197.57L79.22,191.45C75.178,189.759 73.239,185.046 74.92,181C76.599,176.947 81.316,174.992 85.37,176.67L100.15,182.8C104.198,184.479 106.151,189.189 104.48,193.24L104.48,193.21ZM197.57,418L191.45,432.78C190.214,435.766 187.286,437.723 184.055,437.723C179.665,437.723 176.052,434.11 176.052,429.72C176.052,428.67 176.259,427.63 176.66,426.66L182.79,411.88C183.988,408.82 186.954,406.796 190.24,406.796C194.628,406.796 198.24,410.407 198.24,414.796C198.24,415.899 198.012,416.99 197.57,418ZM264,444C264,448.389 260.389,452 256,452C251.611,452 248,448.389 248,444L248,428C248,423.611 251.611,420 256,420C260.389,420 264,423.611 264,428L264,444ZM331,437.08C330.028,437.484 328.985,437.692 327.932,437.692C324.702,437.692 321.775,435.735 320.54,432.75L314.43,418C312.752,413.946 314.707,409.229 318.76,407.55C322.814,405.872 327.531,407.827 329.21,411.88L335.34,426.66C336.997,430.709 335.041,435.404 331,437.08ZM394.58,394.59C391.477,397.691 386.373,397.691 383.27,394.59L372,383.28C368.919,380.18 368.919,375.1 372,372C375.103,368.899 380.207,368.899 383.31,372L394.62,383.31C397.693,386.418 397.68,391.498 394.59,394.59L394.58,394.59ZM286.25,286.25L110.34,401.66L225.75,225.75L401.66,110.34L286.25,286.25ZM437.08,331C435.401,335.053 430.684,337.008 426.63,335.33L411.85,329.2C407.797,327.521 405.842,322.804 407.52,318.75C408.755,315.766 411.682,313.81 414.912,313.81C415.972,313.81 417.022,314.021 418,314.43L432.78,320.55C436.822,322.241 438.761,326.954 437.08,331ZM444,264L428,264C423.611,264 420,260.389 420,256C420,251.611 423.611,248 428,248L444,248C448.389,248 452,251.611 452,256C452,260.389 448.389,264 444,264Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<span className="pt-4 text-xl">Web</span>
|
||||
</div>
|
||||
</a>
|
||||
);
|
||||
|
||||
const MacOS = () => (
|
||||
<a href={downloads["macos"]} target="_blank" rel="noopener noreferrer">
|
||||
<div className="flex flex-col items-center justify-center p-8 rounded-lg hover:bg-secondary hover:text-onsecondary">
|
||||
<svg
|
||||
width="128px"
|
||||
height="128px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Apple" transform="matrix(9.14452,0,0,9.14452,290.423,-292.625)">
|
||||
<path d="M318.7,268.7C318.5,232 335.1,204.3 368.7,183.9C349.9,157 321.5,142.2 284,139.3C248.5,136.5 209.7,160 195.5,160C180.5,160 146.1,140.3 119.1,140.3C63.3,141.2 4,184.8 4,273.5C4,299.7 8.8,326.767 18.4,354.7C31.2,391.4 77.4,481.4 125.6,479.9C150.8,479.3 168.6,462 201.4,462C233.2,462 249.7,479.9 277.8,479.9C326.4,479.2 368.2,397.4 380.4,360.6C315.2,329.9 318.7,270.6 318.7,268.7ZM262.1,104.5C289.4,72.1 286.9,42.6 286.1,32C262,33.4 234.1,48.4 218.2,66.9C200.7,86.7 190.4,111.2 192.6,138.8C218.7,140.8 242.5,127.4 262.1,104.5Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<span className="pt-4 text-xl">macOS</span>
|
||||
</div>
|
||||
</a>
|
||||
);
|
||||
|
||||
const Windows = () => (
|
||||
<a href={downloads["windows"]} target="_blank" rel="noopener noreferrer">
|
||||
<div className="flex flex-col items-center justify-center p-8 rounded-lg hover:bg-secondary hover:text-onsecondary">
|
||||
<svg
|
||||
width="128px"
|
||||
height="128px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Windows" transform="matrix(9.14286,0,0,9.14286,0,-292.571)">
|
||||
<path d="M0,93.7L183.6,68.4L183.6,245.8L0,245.8L0,93.7ZM0,418.3L183.6,443.6L183.6,268.4L0,268.4L0,418.3ZM203.8,446.3L448,480L448,268.4L203.8,268.4L203.8,446.3ZM203.8,65.7L203.8,245.8L448,245.8L448,32L203.8,65.7Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<span className="pt-4 text-xl">Windows</span>
|
||||
</div>
|
||||
</a>
|
||||
);
|
||||
|
||||
const Linux = () => (
|
||||
<a href={downloads["linux"]} target="_blank" rel="noopener noreferrer">
|
||||
<div className="flex flex-col items-center justify-center p-8 rounded-lg hover:bg-secondary hover:text-onsecondary">
|
||||
<svg
|
||||
width="128px"
|
||||
height="128px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Linux" transform="matrix(7.99933,0,0,7.99933,255.362,0.0023132)">
|
||||
<path d="M220.8,123.3C221.8,123.8 222.6,125 223.8,125C224.9,125 226.6,124.6 226.7,123.5C226.9,122.1 224.8,121.2 223.5,120.6C221.8,119.9 219.6,119.6 218,120.5C217.6,120.7 217.2,121.2 217.4,121.6C217.7,122.9 219.7,122.7 220.8,123.3ZM198.9,125C200.1,125 200.9,123.8 201.9,123.3C203,122.7 205,122.9 205.4,121.7C205.6,121.3 205.2,120.8 204.8,120.6C203.2,119.7 201,120 199.3,120.7C198,121.3 195.9,122.2 196.1,123.6C196.2,124.6 197.9,125.1 198.9,125ZM420,403.8C416.4,399.8 414.7,392.2 412.8,384.1C411,376 408.9,367.3 402.3,361.7C401,360.6 399.7,359.6 398.3,358.8C397,358 395.6,357.3 394.2,356.8C403.4,329.5 399.8,302.3 390.5,277.7C379.1,247.6 359.2,221.3 344,203.3C326.9,181.8 310.3,161.4 310.6,131.3C311.1,85.4 315.7,0.1 234.8,0C132.4,-0.2 158,103.4 156.9,135.2C155.2,158.6 150.5,177 134.4,199.9C115.5,222.4 88.9,258.7 76.3,296.6C70.3,314.5 67.5,332.7 70.1,349.9C63.6,355.7 58.7,364.6 53.5,370.1C49.3,374.4 43.2,376 36.5,378.4C29.8,380.8 22.5,384.4 18,392.9C15.9,396.8 15.2,401 15.2,405.3C15.2,409.2 15.8,413.2 16.4,417.1C17.6,425.2 18.9,432.8 17.2,437.9C12,452.3 11.3,462.3 15,469.6C18.8,476.9 26.4,480.1 35.1,481.9C52.4,485.5 75.9,484.6 94.4,494.4C114.2,504.8 134.3,508.5 150.3,504.8C161.9,502.2 171.4,495.2 176.2,484.6C188.7,484.5 202.5,479.2 224.5,478C239.4,476.8 258.1,483.3 279.6,482.1C280.2,484.4 281,486.7 282.1,488.8L282.1,488.9C290.4,505.6 305.9,513.2 322.4,511.9C339,510.6 356.5,500.9 370.7,484C384.3,467.6 406.7,460.8 421.6,451.8C429,447.3 435,441.7 435.5,433.5C435.9,425.3 431.1,416.2 420,403.8ZM223.7,87.3C233.5,65.1 257.9,65.5 267.7,86.9C274.2,101.1 271.3,117.8 263.4,127.3C261.8,126.5 257.5,124.7 250.8,122.4C251.9,121.2 253.9,119.7 254.7,117.8C259.5,106 254.5,90.8 245.6,90.5C238.3,90 231.7,101.3 233.8,113.5C229.7,111.5 224.4,110 220.8,109.1C219.8,102.2 220.5,94.5 223.7,87.3ZM183,75.8C193.1,75.8 203.8,90 202.1,109.3C198.6,110.3 195,111.8 191.9,113.9C193.1,105 188.6,93.8 182.3,94.3C173.9,95 172.5,115.5 180.5,122.4C181.5,123.2 182.4,122.2 174.6,127.9C159,113.3 164.1,75.8 183,75.8ZM169.4,136.5C175.6,131.9 183,126.5 183.5,126C188.2,121.6 197,111.8 211.4,111.8C218.5,111.8 227,114.1 237.3,120.7C243.6,124.8 248.6,125.1 259.9,130C268.3,133.5 273.6,139.7 270.4,148.2C267.8,155.3 259.4,162.6 247.7,166.3C236.6,169.9 227.9,182.3 209.5,181.2C205.6,181 202.5,180.2 199.9,179.1C191.9,175.6 187.7,168.7 179.9,164.1C171.3,159.3 166.7,153.7 165.2,148.8C163.8,143.9 165.2,139.8 169.4,136.5ZM172.7,470.5C170,505.6 128.8,504.9 97.4,488.5C67.5,472.7 28.8,482 20.9,466.6C18.5,461.9 18.5,453.9 23.5,440.2L23.5,440C25.9,432.4 24.1,424 22.9,416.1C21.7,408.3 21.1,401.1 23.8,396.1C27.3,389.4 32.3,387 38.6,384.8C48.9,381.1 50.4,381.4 58.2,374.9C63.7,369.2 67.7,362 72.5,356.9C77.6,351.4 82.5,348.8 90.2,350C98.3,351.2 105.3,356.8 112.1,366L131.7,401.6C141.2,421.5 174.8,450 172.7,470.5ZM171.3,444.6C167.2,438 161.7,431 156.9,425C164,425 171.1,422.8 173.6,416.1C175.9,409.9 173.6,401.2 166.2,391.2C152.7,373 127.9,358.7 127.9,358.7C114.4,350.3 106.8,340 103.3,328.8C99.8,317.6 100.3,305.5 103,293.6C108.2,270.7 121.6,248.4 130.2,234.4C132.5,232.7 131,237.6 121.5,255.2C113,271.3 97.1,308.5 118.9,337.6C119.5,316.9 124.4,295.8 132.7,276.1C144.7,248.7 170,201.2 172,163.4C173.1,164.2 176.6,166.6 178.2,167.5C182.8,170.2 186.3,174.2 190.8,177.8C203.2,187.8 219.3,187 233.2,179C239.4,175.5 244.4,171.5 249.1,170C259,166.9 266.9,161.4 271.4,155C279.1,185.4 297.1,229.3 308.6,250.7C314.7,262.1 326.9,286.2 332.2,315.3C335.5,315.2 339.2,315.7 343.1,316.7C356.9,281 331.4,242.5 319.8,231.8C315.1,227.2 314.9,225.2 317.2,225.3C329.8,236.5 346.4,259 352.4,284.3C355.2,295.9 355.7,308 352.8,320C369.2,326.8 388.7,337.9 383.5,354.8C381.3,354.7 380.3,354.8 379.3,354.8C382.5,344.7 375.4,337.2 356.5,328.7C336.9,320.1 320.5,320.1 318.2,341.2C306.1,345.4 299.9,355.9 296.8,368.5C294,379.7 293.2,393.2 292.4,408.4C291.9,416.1 288.8,426.4 285.6,437.4C253.5,460.3 208.9,470.3 171.3,444.6ZM428.7,433.1C427.8,449.9 387.5,453 365.5,479.6C352.3,495.3 336.1,504 321.9,505.1C307.7,506.2 295.4,500.3 288.2,485.8C283.5,474.7 285.8,462.7 289.3,449.5C293,435.3 298.5,420.7 299.2,408.9C300,393.7 300.9,380.4 303.4,370.2C306,359.9 310,353 317.1,349.1C317.4,348.9 317.8,348.8 318.1,348.6C318.9,361.8 325.4,375.2 336.9,378.1C349.5,381.4 367.6,370.6 375.3,361.8C384.3,361.5 391,360.9 397.9,366.9C407.8,375.4 405,397.2 415,408.5C425.6,420.1 429,428 428.7,433.1ZM173.3,148.7C175.3,150.6 178,153.2 181.3,155.8C187.9,161 197.1,166.4 208.6,166.4C220.2,166.4 231.1,160.5 240.4,155.6C245.3,153 251.3,148.6 255.2,145.2C259.1,141.8 261.1,138.9 258.3,138.6C255.5,138.3 255.7,141.2 252.3,143.7C247.9,146.9 242.6,151.1 238.4,153.5C231,157.7 218.9,163.7 208.5,163.7C198.1,163.7 189.8,158.9 183.6,154C180.5,151.5 177.9,149 175.9,147.1C174.4,145.7 174,142.5 171.6,142.2C170.2,142.1 169.8,145.9 173.3,148.7Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<span className="pt-4 text-xl">Linux</span>
|
||||
</div>
|
||||
</a>
|
||||
);
|
||||
BIN
landing/app/favicon.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
3
landing/app/globals.css
Normal file
@@ -0,0 +1,3 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
20
landing/app/layout.tsx
Normal file
@@ -0,0 +1,20 @@
|
||||
import Footer from "@/components/footer";
|
||||
import Header from "@/components/header";
|
||||
|
||||
import "./globals.css";
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body className="bg-background text-onbackground">
|
||||
<Header />
|
||||
{children}
|
||||
<Footer />
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
364
landing/app/page.tsx
Normal file
@@ -0,0 +1,364 @@
|
||||
import Image from "next/image";
|
||||
import dynamic from "next/dynamic";
|
||||
import type { Metadata } from "next";
|
||||
|
||||
const Download = dynamic(() => import("@/components/download"), { ssr: false });
|
||||
import { generalMetadata } from "@/helpers/metadata";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generalMetadata,
|
||||
title: "FeedDeck - Follow your RSS and Social Media Feeds",
|
||||
};
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<main>
|
||||
<div
|
||||
className="container p-8 mx-auto flex flex-wrap"
|
||||
style={{ minHeight: "calc(100vh - 108px)" }}
|
||||
>
|
||||
<div className="flex items-center w-full lg:w-1/2">
|
||||
<div className="max-w-2xl mb-8">
|
||||
<h1 className="text-4xl font-bold leading-snug tracking-tight lg:text-4xl lg:leading-tight xl:text-6xl xl:leading-tight">
|
||||
Follow your RSS and Social Media Feeds
|
||||
</h1>
|
||||
<p className="py-5 text-xl leading-normal text-gray-400 lg:text-xl xl:text-2xl">
|
||||
FeedDeck is an open source RSS and social media feed reader,
|
||||
inspired by TweetDeck. FeedDeck allows you to follow your favorite
|
||||
feeds in one place on all platforms.
|
||||
</p>
|
||||
|
||||
<div className="flex flex-col items-start space-y-3 sm:space-x-4 sm:space-y-0 sm:items-center sm:flex-row">
|
||||
<a
|
||||
href="https://app.feeddeck.app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-8 py-4 text-lg font-medium text-center text-onprimary bg-primary rounded-full"
|
||||
>
|
||||
Sign In
|
||||
</a>
|
||||
<Download />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center justify-center w-full lg:w-1/2">
|
||||
<div className="p-2 bg-secondary rounded-lg">
|
||||
<Image
|
||||
src="/hero-1.webp"
|
||||
width="616"
|
||||
height="616"
|
||||
className="object-cover"
|
||||
alt="Hero"
|
||||
loading="eager"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="features">
|
||||
<div className="flex flex-col justify-center text-onsecondary bg-secondary p-16">
|
||||
<div className="text-xl text-center">
|
||||
All your favorite feeds in one place
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-20 mt-10">
|
||||
<GitHub />
|
||||
<GoogleNews />
|
||||
<Mastodon />
|
||||
<Medium />
|
||||
<Nitter />
|
||||
<Reddit />
|
||||
<RSS />
|
||||
<StackOverflow />
|
||||
<Tumblr />
|
||||
<X />
|
||||
<YouTube />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Feature
|
||||
title="Deck View"
|
||||
description="View all your RSS and social media feeds in a deck layout."
|
||||
image="/feature-1.webp"
|
||||
/>
|
||||
<Feature
|
||||
title="Details View"
|
||||
description="View the details of all your RSS and social media items."
|
||||
image="/feature-2.webp"
|
||||
/>
|
||||
<Feature
|
||||
title="YouTube"
|
||||
description="Follow and view your favorite YouTube channels."
|
||||
image="/feature-3.webp"
|
||||
/>
|
||||
<Feature
|
||||
title="Podcasts"
|
||||
description="Follow and listen to your favorite podcasts, via the built-in podcast player."
|
||||
image="/feature-4.webp"
|
||||
/>
|
||||
<Feature
|
||||
title="GitHub"
|
||||
description="View your GitHub notifications and activities of your favorite repositories."
|
||||
image="/feature-5.webp"
|
||||
/>
|
||||
<Feature
|
||||
title="Available on all Platforms"
|
||||
description="The same experience on all your devices."
|
||||
image="/feature-6.webp"
|
||||
noBg={true}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div className="flex flex-col justify-center text-onsecondary bg-secondary p-16">
|
||||
<div className="flex flex-wrap justify-center gap-20 mt-10">
|
||||
<a
|
||||
href="https://app.feeddeck.app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-8 py-4 text-lg font-medium text-center text-onprimary bg-primary rounded-full"
|
||||
>
|
||||
Sign In
|
||||
</a>
|
||||
<Download />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
const Feature = (
|
||||
{ title, description, image, noBg }: {
|
||||
title: string;
|
||||
description: string;
|
||||
image: string;
|
||||
noBg?: boolean;
|
||||
},
|
||||
) => (
|
||||
<div className="container mx-auto flex flex-col justify-center p-16 items-center text-center">
|
||||
<div className="mb-2 text-4xl tracking-tight font-extrabold">
|
||||
{title}
|
||||
</div>
|
||||
<div className="mb-5 font-light text-gray-400 sm:text-xl">
|
||||
{description}
|
||||
</div>
|
||||
<div className={noBg ? "p-2 rounded-lg" : "p-2 bg-secondary rounded-lg"}>
|
||||
<Image
|
||||
src={image}
|
||||
width={0}
|
||||
height={0}
|
||||
style={{ width: "100%", height: "auto" }}
|
||||
className="object-cover"
|
||||
alt="Feature"
|
||||
loading="eager"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const GitHub = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="GitHub" transform="matrix(8.25806,0,0,8.25806,0,-14.8952)">
|
||||
<path d="M165.9,397.4C165.9,399.4 163.6,401 160.7,401C157.4,401.3 155.1,399.7 155.1,397.4C155.1,395.4 157.4,393.8 160.3,393.8C163.3,393.5 165.9,395.1 165.9,397.4ZM134.8,392.9C134.1,394.9 136.1,397.2 139.1,397.8C141.7,398.8 144.7,397.8 145.3,395.8C145.9,393.8 144,391.5 141,390.6C138.4,389.9 135.5,390.9 134.8,392.9ZM179,391.2C176.1,391.9 174.1,393.8 174.4,396.1C174.7,398.1 177.3,399.4 180.3,398.7C183.2,398 185.2,396.1 184.9,394.1C184.6,392.2 181.9,390.9 179,391.2ZM244.8,8C106.1,8 0,113.3 0,252C0,362.9 69.8,457.8 169.5,491.2C182.3,493.5 186.8,485.6 186.8,479.1C186.8,472.9 186.5,438.7 186.5,417.7C186.5,417.7 116.5,432.7 101.8,387.9C101.8,387.9 90.4,358.8 74,351.3C74,351.3 51.1,335.6 75.6,335.9C75.6,335.9 100.5,337.9 114.2,361.7C136.1,400.3 172.8,389.2 187.1,382.6C189.4,366.6 195.9,355.5 203.1,348.9C147.2,342.7 90.8,334.6 90.8,238.4C90.8,210.9 98.4,197.1 114.4,179.5C111.8,173 103.3,146.2 117,111.6C137.9,105.1 186,138.6 186,138.6C206,133 227.5,130.1 248.8,130.1C270.1,130.1 291.6,133 311.6,138.6C311.6,138.6 359.7,105 380.6,111.6C394.3,146.3 385.8,173 383.2,179.5C399.2,197.2 409,211 409,238.4C409,334.9 350.1,342.6 294.2,348.9C303.4,356.8 311.2,371.8 311.2,395.3C311.2,429 310.9,470.7 310.9,478.9C310.9,485.4 315.5,493.3 328.2,491C428.2,457.8 496,362.9 496,252C496,113.3 383.5,8 244.8,8ZM97.2,352.9C95.9,353.9 96.2,356.2 97.9,358.1C99.5,359.7 101.8,360.4 103.1,359.1C104.4,358.1 104.1,355.8 102.4,353.9C100.8,352.3 98.5,351.6 97.2,352.9ZM86.4,344.8C85.7,346.1 86.7,347.7 88.7,348.7C90.3,349.7 92.3,349.4 93,348C93.7,346.7 92.7,345.1 90.7,344.1C88.7,343.5 87.1,343.8 86.4,344.8ZM118.8,380.4C117.2,381.7 117.8,384.7 120.1,386.6C122.4,388.9 125.3,389.2 126.6,387.6C127.9,386.3 127.3,383.3 125.3,381.4C123.1,379.1 120.1,378.8 118.8,380.4ZM107.4,365.7C105.8,366.7 105.8,369.3 107.4,371.6C109,373.9 111.7,374.9 113,373.9C114.6,372.6 114.6,370 113,367.7C111.6,365.4 109,364.4 107.4,365.7Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">GitHub</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const GoogleNews = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g
|
||||
id="Google-News"
|
||||
transform="matrix(8.25806,0,0,8.25806,33.0323,-66.0645)"
|
||||
>
|
||||
<path d="M488,261.8C488,403.3 391.1,504 248,504C110.8,504 0,393.2 0,256C0,118.8 110.8,8 248,8C314.8,8 371,32.5 414.3,72.9L346.8,137.8C258.5,52.6 94.3,116.6 94.3,256C94.3,342.5 163.4,412.6 248,412.6C346.2,412.6 383,342.2 388.8,305.7L248,305.7L248,220.4L484.1,220.4C486.4,233.1 488,245.3 488,261.8Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">Google News</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const Mastodon = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Mastodon" transform="matrix(9.14139,0,0,9.14139,0.178535,-292.5)">
|
||||
<path d="M433,179.11C433,81.91 369.29,53.41 369.29,53.41C306.77,24.71 140.73,25.01 78.81,53.41C78.81,53.41 15.09,81.91 15.09,179.11C15.09,294.81 8.49,438.51 120.72,468.21C161.23,478.91 196.04,481.21 224.05,479.61C274.86,476.81 303.37,461.51 303.37,461.51L301.67,424.61C301.67,424.61 265.36,436.01 224.55,434.71C184.14,433.31 141.55,430.31 134.92,380.71C134.305,376.102 134.005,371.458 134.02,366.81C219.65,387.71 292.67,375.91 312.77,373.51C368.89,366.81 417.77,332.21 424,300.61C433.8,250.81 433,179.11 433,179.11ZM357.88,304.31L311.25,304.31L311.25,190.11C311.25,140.41 247.25,138.51 247.25,197.01L247.25,259.51L200.92,259.51L200.92,197C200.92,138.5 136.92,140.4 136.92,190.1L136.92,304.3L90.19,304.3C90.19,182.2 84.99,156.4 108.6,129.3C134.5,100.4 188.42,98.5 212.43,135.4L224.03,154.9L235.63,135.4C259.74,98.3 313.75,100.6 339.46,129.3C363.17,156.6 357.86,182.3 357.86,304.3L357.88,304.31Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">Mastodon</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const Medium = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Medium" transform="matrix(6.4,0,0,6.4,9.09495e-13,409.6)">
|
||||
<path d="M180.5,74.262C80.813,74.262 0,155.633 0,256C0,356.367 80.819,437.738 180.5,437.738C280.181,437.738 361,356.373 361,256C361,155.627 280.191,74.262 180.5,74.262ZM468.75,84.908C418.905,84.908 378.505,161.527 378.505,256.003C378.505,350.479 418.911,427.103 468.756,427.103C518.601,427.103 559.007,350.484 559.007,256.003L559,256.003C559,161.5 518.6,84.908 468.752,84.908L468.75,84.908ZM608.256,102.729C590.73,102.729 576.521,171.357 576.521,256.003C576.521,340.649 590.721,409.277 608.256,409.277C625.791,409.277 640,340.631 640,256C640,171.351 625.785,102.729 608.258,102.729L608.256,102.729Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">Medium</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const Nitter = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Nitter" transform="matrix(7.0137,0,0,7.0137,-289.9,-289.9)">
|
||||
<path d="M98.133,44.8L94.667,48.4L94.667,618.267L98.133,621.867L101.733,625.334L218.267,625.334L221.867,621.867L225.333,618.267L225.333,453.2C225.333,316.4 225.6,288 227.067,288C228.133,288 281.867,362.8 346.667,454.267C411.334,545.867 465.6,621.734 467.2,622.934C469.734,625.067 474.534,625.334 517.467,625.334L564.934,625.334L568.534,621.867L572,618.267L572,48.4L568.534,44.8L564.934,41.333L448.4,41.333L444.8,44.8L441.334,48.4L441.334,213.467C441.334,350.267 441.067,378.667 439.6,378.667C438.534,378.667 384.8,303.867 320,212.267C255.333,120.8 201.067,44.933 199.467,43.733C196.933,41.6 192.133,41.333 149.2,41.333L101.733,41.333L98.133,44.8ZM310,240.933C378.267,337.334 435.867,418.4 438.134,420.8C442,424.934 442.934,425.334 450.267,425.334C457.2,425.334 458.8,424.8 461.867,421.867L465.334,418.267L465.334,65.333L548,65.333L548,601.334L514.4,601.2L480.667,601.2L356.667,425.734C288.533,329.333 230.8,248.267 228.533,245.867C224.667,241.733 223.733,241.333 216.4,241.333C209.467,241.333 207.867,241.867 204.8,244.8L201.333,248.4L201.333,601.334L118.667,601.334L118.667,65.333L152.4,65.467L186,65.467L310,240.933Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">Nitter</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const Reddit = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Reddit" transform="matrix(8.63308,0,0,8.63308,-161.895,-161.638)">
|
||||
<path d="M440.3,203.5C425.3,203.5 412.1,209.7 402.4,219.4C366.7,194.7 318.6,178.8 265.3,177.1L293,52.3L381.2,72.1C381.2,93.7 398.8,111.3 420.4,111.3C442.4,111.3 460.1,93.2 460.1,71.6C460.1,50 442.5,31.9 420.4,31.9C405,31.9 391.7,41.2 385.1,53.9L287.7,32.3C282.8,31 278,34.5 276.7,39.4L246.3,177C193.4,179.2 145.8,195.1 110,219.8C100.3,209.7 86.6,203.5 71.6,203.5C16,203.5 -2.2,278.1 48.7,303.6C46.9,311.5 46.1,319.9 46.1,328.3C46.1,412.1 140.5,480 256.4,480C372.8,480 467.2,412.1 467.2,328.3C467.2,319.9 466.3,311.1 464.1,303.2C514,277.6 495.6,203.5 440.3,203.5ZM129.4,308.9C129.4,286.9 147,269.2 169.1,269.2C190.7,269.2 208.3,286.8 208.3,308.9C208.3,330.5 190.7,348.1 169.1,348.1C147.1,348.2 129.4,330.5 129.4,308.9ZM343.7,402.4C307.3,438.8 204.6,438.8 168.2,402.4C164.2,398.9 164.2,392.7 168.2,388.7C171.7,385.2 177.9,385.2 181.4,388.7C209.2,417.2 301.4,417.7 330.4,388.7C333.9,385.2 340.1,385.2 343.6,388.7C347.7,392.7 347.7,398.9 343.7,402.4ZM342.9,348.2C321.3,348.2 303.7,330.6 303.7,309C303.7,287 321.3,269.3 342.9,269.3C364.9,269.3 382.6,286.9 382.6,309C382.5,330.5 364.9,348.2 342.9,348.2Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">Reddit</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const RSS = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="RSS" transform="matrix(120.471,0,0,120.471,-722.824,-963.765)">
|
||||
<path d="M10.9,42C9.533,42 8.375,41.525 7.425,40.575C6.475,39.625 6,38.467 6,37.1C6,35.733 6.475,34.575 7.425,33.625C8.375,32.675 9.533,32.2 10.9,32.2C12.267,32.2 13.425,32.675 14.375,33.625C15.325,34.575 15.8,35.733 15.8,37.1C15.8,38.467 15.325,39.625 14.375,40.575C13.425,41.525 12.267,42 10.9,42ZM35.5,42C35.5,37.933 34.725,34.108 33.175,30.525C31.625,26.942 29.517,23.817 26.85,21.15C24.183,18.483 21.058,16.375 17.475,14.825C13.892,13.275 10.067,12.5 6,12.5L6,8C10.7,8 15.108,8.892 19.225,10.675C23.342,12.458 26.942,14.892 30.025,17.975C33.108,21.058 35.542,24.658 37.325,28.775C39.108,32.892 40,37.3 40,42L35.5,42ZM23.6,42C23.6,36.733 21.983,32.417 18.75,29.05C15.517,25.683 11.267,24 6,24L6,19.5C9.233,19.5 12.2,20.067 14.9,21.2C17.6,22.333 19.925,23.9 21.875,25.9C23.825,27.9 25.35,30.275 26.45,33.025C27.55,35.775 28.1,38.767 28.1,42L23.6,42Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">RSS</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const StackOverflow = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g
|
||||
id="StackOverflow"
|
||||
transform="matrix(9.14286,0,0,9.14286,292.571,-292.571)"
|
||||
>
|
||||
<path d="M290.7,311L95,269.7L86.8,309L282.5,350L290.7,311ZM341.7,224L188.2,95.7L162.7,126.5L316.2,254.8L341.7,224ZM310.5,263.7L129.2,179L112.5,215.5L293.7,300L310.5,263.7ZM262,32L230,56L349.3,216.3L381.3,192.3L262,32ZM282.5,360L82.5,360L82.5,399.7L282.5,399.7L282.5,360ZM322.2,440L42.7,440L42.7,320L2.7,320L2.7,480L362.2,480L362.2,320L322.2,320L322.2,440Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">StackOverflow</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const Tumblr = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="Tumblr" transform="matrix(8,0,0,8,768.07,1.42204e-13)">
|
||||
<path d="M309.8,480.3C296.2,494.8 259.8,512 212.4,512C91.6,512 65.4,423.2 65.4,371.4L65.4,227.4L17.9,227.4C12.4,227.4 7.9,222.9 7.9,217.4L7.9,149.4C7.9,142.2 12.4,135.8 19.2,133.4C81.2,111.6 100.7,57.4 103.5,16.3C104.3,5.3 110,-0 119.6,-0L190.5,-0C196,-0 200.5,4.5 200.5,10L200.5,125.2L283.5,125.2C289,125.2 293.5,129.6 293.5,135.1L293.5,216.8C293.5,222.3 289,226.8 283.5,226.8L200.1,226.8L200.1,360C200.1,394.2 223.8,413.6 268.1,395.8C272.9,393.9 277.1,392.6 280.8,393.6C284.3,394.5 286.6,397 288.2,401.5L310.2,465.8C312,470.8 313.5,476.4 309.8,480.3Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">Tumblr</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const X = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="X" transform="matrix(8.90048,0,0,8.90048,-238.533,-230.522)">
|
||||
<path d="M389.2,48L459.8,48L305.6,224.2L487,464L345,464L233.7,318.6L106.5,464L35.8,464L200.7,275.5L26.8,48L172.4,48L272.9,180.9L389.2,48ZM364.4,421.8L403.5,421.8L151.1,88L109.1,88L364.4,421.8Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">X</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const YouTube = () => (
|
||||
<div className="flex flex-col items-center justify-center">
|
||||
<svg
|
||||
width="32px"
|
||||
height="32px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="YouTube" transform="matrix(7.49999,0,0,7.49999,-111.997,128.002)">
|
||||
<path d="M549.655,124.083C543.374,100.433 524.868,81.807 501.371,75.486C458.781,64 288,64 288,64C288,64 117.22,64 74.629,75.486C51.132,81.808 32.626,100.433 26.345,124.083C14.933,166.95 14.933,256.388 14.933,256.388C14.933,256.388 14.933,345.826 26.345,388.693C32.626,412.343 51.132,430.193 74.629,436.514C117.22,448 288,448 288,448C288,448 458.78,448 501.371,436.514C524.868,430.193 543.374,412.343 549.655,388.693C561.067,345.826 561.067,256.388 561.067,256.388C561.067,256.388 561.067,166.95 549.655,124.083ZM232.145,337.591L232.145,175.185L374.884,256.39L232.145,337.591Z" />
|
||||
</g>
|
||||
</svg>
|
||||
<div className="pt-4">YouTube</div>
|
||||
</div>
|
||||
);
|
||||
153
landing/app/pricing/page.tsx
Normal file
@@ -0,0 +1,153 @@
|
||||
import { ReactNode } from "react";
|
||||
import type { Metadata } from "next";
|
||||
|
||||
import { generalMetadata } from "@/helpers/metadata";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generalMetadata,
|
||||
title: "FeedDeck - Pricing",
|
||||
};
|
||||
|
||||
export default function Pricing() {
|
||||
return (
|
||||
<main>
|
||||
<div
|
||||
className="py-8 px-4 mx-auto max-w-screen-xl lg:py-16 lg:px-6"
|
||||
style={{ minHeight: "calc(100vh - 108px)" }}
|
||||
>
|
||||
<div className="mx-auto max-w-screen-md text-center mb-8 lg:mb-12">
|
||||
<h2 className="mb-4 text-4xl tracking-tight font-extrabold">
|
||||
Follow your RSS and Social Media Feeds
|
||||
</h2>
|
||||
<p className="mb-5 font-light text-gray-400 sm:text-xl">
|
||||
Follow your favorite RSS and social media feeds in one place on all
|
||||
platforms for just 5€ per month or host it by yourself.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-8 lg:grid lg:grid-cols-3 sm:gap-6 xl:gap-10 lg:space-y-0">
|
||||
<div className="flex flex-col p-6 mx-auto max-w-lg text-center bg-secondary text-onsecondary rounded-lg xl:p-8">
|
||||
<h3 className="mb-4 text-2xl font-semibold">Trial</h3>
|
||||
<p className="font-light text-gray-400 sm:text-lg">
|
||||
Best option to try out FeedDeck as your next RSS and social media
|
||||
reader.
|
||||
</p>
|
||||
<div className="flex justify-center items-baseline my-8">
|
||||
<span className="mr-2 text-5xl font-extrabold">Free</span>
|
||||
</div>
|
||||
|
||||
<ul role="list" className="mb-8 space-y-4 text-left">
|
||||
<Feature>
|
||||
Up to <span className="font-semibold">10 sources</span>
|
||||
</Feature>
|
||||
<Feature>
|
||||
Try out FeedDeck for{" "}
|
||||
<span className="font-semibold">
|
||||
7 days
|
||||
</span>
|
||||
</Feature>
|
||||
<Feature>No credit card required</Feature>
|
||||
</ul>
|
||||
<a
|
||||
href="https://app.feeddeck.com"
|
||||
className="text-onprimary bg-primary font-medium rounded-full text-sm px-5 py-2.5 text-center"
|
||||
>
|
||||
Get Started
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col p-6 mx-auto max-w-lg text-center bg-secondary text-onsecondary rounded-lg xl:p-8">
|
||||
<h3 className="mb-4 text-2xl font-semibold">Premium</h3>
|
||||
<p className="font-light text-gray-400 sm:text-lg">
|
||||
The premium experience for just 5€ per month without any hidden
|
||||
fees.
|
||||
</p>
|
||||
<div className="flex justify-center items-baseline my-8">
|
||||
<span className="mr-2 text-5xl font-extrabold">5€</span>
|
||||
<span className="text-gray-400">
|
||||
/month
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<ul role="list" className="mb-8 space-y-4 text-left">
|
||||
<Feature>
|
||||
Up to <span className="font-semibold">1000 sources</span>
|
||||
</Feature>
|
||||
<Feature>
|
||||
Unlimited{" "}
|
||||
<span className="font-semibold">decks and columns</span>
|
||||
</Feature>
|
||||
<Feature>
|
||||
Available for{" "}
|
||||
<span className="font-semibold">
|
||||
mobile and desktop
|
||||
</span>
|
||||
</Feature>
|
||||
</ul>
|
||||
<a
|
||||
href="https://app.feeddeck.com"
|
||||
className="text-onprimary bg-primary font-medium rounded-full text-sm px-5 py-2.5 text-center"
|
||||
>
|
||||
Get Started
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col p-6 mx-auto max-w-lg text-center bg-secondary text-onsecondary rounded-lg xl:p-8">
|
||||
<h3 className="mb-4 text-2xl font-semibold">Self Hosted</h3>
|
||||
<p className="font-light text-gray-400 sm:text-lg">
|
||||
The full FeedDeck experience for hobbyist without any limitations.
|
||||
</p>
|
||||
<div className="flex justify-center items-baseline my-8">
|
||||
<span className="mr-2 text-5xl font-extrabold">Free</span>
|
||||
</div>
|
||||
|
||||
<ul role="list" className="mb-8 space-y-4 text-left">
|
||||
<Feature>Self hosted without any limitations</Feature>
|
||||
<Feature>
|
||||
Use our binaries or build it by yourself
|
||||
</Feature>
|
||||
<Feature>
|
||||
Support the development via{" "}
|
||||
<a
|
||||
className="underline"
|
||||
href="https://github.com/sponsors/ricoberger"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
donations
|
||||
</a>
|
||||
</Feature>
|
||||
</ul>
|
||||
<a
|
||||
href="https://github.com/feeddeck/feeddeck"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-onprimary bg-primary font-medium rounded-full text-sm px-5 py-2.5 text-center"
|
||||
>
|
||||
Documentation
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
const Feature = ({ children }: { children: ReactNode }) => (
|
||||
<li className="flex items-center space-x-3">
|
||||
<svg
|
||||
className="flex-shrink-0 w-5 h-5 text-primary"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 20 20"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
||||
clip-rule="evenodd"
|
||||
>
|
||||
</path>
|
||||
</svg>
|
||||
<span>{children}</span>
|
||||
</li>
|
||||
);
|
||||
168
landing/app/privacy-policy/page.tsx
Normal file
@@ -0,0 +1,168 @@
|
||||
import type { Metadata } from "next";
|
||||
|
||||
import { generalMetadata } from "@/helpers/metadata";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generalMetadata,
|
||||
title: "FeedDeck - Privacy Policy",
|
||||
};
|
||||
|
||||
export default function PrivacyPolicy() {
|
||||
return (
|
||||
<main>
|
||||
<div className="container p-8 mx-auto">
|
||||
<div className="max-w-screen-xl mx-auto">
|
||||
<h1 className="text-4xl font-bold">Privacy Policy</h1>
|
||||
<p className="py-4">
|
||||
Rico Berger built the FeedDeck app as a Commercial app. This SERVICE
|
||||
is provided by Rico Berger and is intended for use as is.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
This page is used to inform visitors regarding my policies with the
|
||||
collection, use, and disclosure of Personal Information if anyone
|
||||
decided to use my Service.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
If you choose to use my Service, then you agree to the collection
|
||||
and use of information in relation to this policy. The Personal
|
||||
Information that I collect is used for providing and improving the
|
||||
Service. I will not use or share your information with anyone except
|
||||
as described in this Privacy Policy.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
The terms used in this Privacy Policy have the same meanings as in
|
||||
our Terms and Conditions, which are accessible at FeedDeck unless
|
||||
otherwise defined in this Privacy Policy.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">
|
||||
Information Collection and Use
|
||||
</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
For a better experience, while using our Service, I may require you
|
||||
to provide us with certain personally identifiable information,
|
||||
including but not limited to your email address, first name, last
|
||||
name and credit card.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">Log Data</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
I want to inform you that whenever you use my Service, in a case of
|
||||
an error in the app I collect data and information (through
|
||||
third-party products) on your phone called Log Data. This Log Data
|
||||
may include information such as your device Internet Protocol
|
||||
("IP") address, device name, operating system version, the
|
||||
configuration of the app when utilizing my Service, the time and
|
||||
date of your use of the Service, and other statistics.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">Cookies</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
Cookies are files with a small amount of data that are commonly used
|
||||
as anonymous unique identifiers. These are sent to your browser from
|
||||
the websites that you visit and are stored on your device's
|
||||
internal memory.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
This Service does not use these "cookies" explicitly.
|
||||
However, the app may use third-party code and libraries that use
|
||||
"cookies" to collect information and improve their
|
||||
services. You have the option to either accept or refuse these
|
||||
cookies and know when a cookie is being sent to your device. If you
|
||||
choose to refuse our cookies, you may not be able to use some
|
||||
portions of this Service.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">Service Providers</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
I may employ third-party companies and individuals due to the
|
||||
following reasons:
|
||||
</p>
|
||||
<ul className="pl-16 list-disc">
|
||||
<li>To facilitate our Service;</li>
|
||||
<li>To provide the Service on our behalf;</li>
|
||||
<li>To perform Service-related services; or</li>
|
||||
<li>To assist us in analyzing how our Service is used.</li>
|
||||
</ul>
|
||||
<p className="py-4">
|
||||
I want to inform users of this Service that these third parties have
|
||||
access to their Personal Information. The reason is to perform the
|
||||
tasks assigned to them on our behalf. However, they are obligated
|
||||
not to disclose or use the information for any other purpose.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">Security</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
I value your trust in providing us your Personal Information, thus
|
||||
we are striving to use commercially acceptable means of protecting
|
||||
it. But remember that no method of transmission over the internet,
|
||||
or method of electronic storage is 100% secure and reliable, and I
|
||||
cannot guarantee its absolute security.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">Links to Other Sites</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
This Service may contain links to other sites. If you click on a
|
||||
third-party link, you will be directed to that site. Note that these
|
||||
external sites are not operated by me. Therefore, I strongly advise
|
||||
you to review the Privacy Policy of these websites. I have no
|
||||
control over and assume no responsibility for the content, privacy
|
||||
policies, or practices of any third-party sites or services.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">Children's Privacy</h2>
|
||||
</p>
|
||||
<div>
|
||||
<p className="py-4">
|
||||
I do not knowingly collect personally identifiable information
|
||||
from children. I encourage all children to never submit any
|
||||
personally identifiable information through the Application and/or
|
||||
Services. I encourage parents and legal guardians to monitor their
|
||||
children's Internet usage and to help enforce this Policy by
|
||||
instructing their children never to provide personally
|
||||
identifiable information through the Application and/or Services
|
||||
without their permission. If you have reason to believe that a
|
||||
child has provided personally identifiable information to us
|
||||
through the Application and/or Services, please contact us. You
|
||||
must also be at least 16 years of age to consent to the processing
|
||||
of your personally identifiable information in your country (in
|
||||
some countries we may allow your parent or guardian to do so on
|
||||
your behalf).
|
||||
</p>
|
||||
</div>{" "}
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">
|
||||
Changes to This Privacy Policy
|
||||
</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
I may update our Privacy Policy from time to time. Thus, you are
|
||||
advised to review this page periodically for any changes. I will
|
||||
notify you of any changes by posting the new Privacy Policy on this
|
||||
page.
|
||||
</p>
|
||||
<p className="py-4">This policy is effective as of 2023-06-22</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">Contact Us</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
If you have any questions or suggestions about my Privacy Policy, do
|
||||
not hesitate to contact me at{" "}
|
||||
<a
|
||||
className="underline"
|
||||
href="mailto:admin@feeddeck.app?subject=[Privacy Policy]"
|
||||
>
|
||||
admin@feeddeck.app
|
||||
</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
59
landing/app/support/page.tsx
Normal file
@@ -0,0 +1,59 @@
|
||||
import type { Metadata } from "next";
|
||||
|
||||
import { generalMetadata } from "@/helpers/metadata";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generalMetadata,
|
||||
title: "FeedDeck - Support",
|
||||
};
|
||||
|
||||
export default function Support() {
|
||||
return (
|
||||
<main>
|
||||
<div className="container p-8 mx-auto">
|
||||
<div className="max-w-screen-xl mx-auto">
|
||||
<h1 className="text-4xl font-bold">Support</h1>
|
||||
<p className="py-4">
|
||||
If you have problems or questions, please search through{" "}
|
||||
<a
|
||||
className="underline"
|
||||
href="https://github.com/feeddeck/feeddeck/issues"
|
||||
target="_blank"
|
||||
>
|
||||
existing open and closed GitHub Issues
|
||||
</a>{" "}
|
||||
for the answer first. If you find a relevant topic, please comment
|
||||
on the issue. If none of the issues are relevant, please add an
|
||||
issue to{" "}
|
||||
<a
|
||||
className="underline"
|
||||
href="https://github.com/feeddeck/feeddeck/issues"
|
||||
target="_blank"
|
||||
>
|
||||
GitHub issues
|
||||
</a>{" "}
|
||||
or start a new{" "}
|
||||
<a
|
||||
className="underline"
|
||||
href="https://github.com/feeddeck/feeddeck/discussions"
|
||||
target="_blank"
|
||||
>
|
||||
discussions
|
||||
</a>. Please use the issue templates and provide any relevant
|
||||
information.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
If you do not have an GitHub Account you can also contact me via
|
||||
{" "}
|
||||
<a
|
||||
className="underline"
|
||||
href="mailto:admin@feeddeck.app?subject=[Support]"
|
||||
>
|
||||
admin@feeddeck.app
|
||||
</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
132
landing/app/terms-and-conditions/page.tsx
Normal file
@@ -0,0 +1,132 @@
|
||||
import type { Metadata } from "next";
|
||||
|
||||
import { generalMetadata } from "@/helpers/metadata";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generalMetadata,
|
||||
title: "FeedDeck - Terms & Conditions",
|
||||
};
|
||||
|
||||
export default function TermsAndConditions() {
|
||||
return (
|
||||
<main>
|
||||
<div className="container p-8 mx-auto">
|
||||
<div className="max-w-screen-xl mx-auto">
|
||||
<h1 className="text-4xl font-bold">Terms & Conditions</h1>
|
||||
<p className="py-4">
|
||||
By downloading or using the app, these terms will automatically
|
||||
apply to you – you should make sure therefore that you read them
|
||||
carefully before using the app. You're not allowed to copy or
|
||||
modify the app, any part of the app, or our trademarks in any way.
|
||||
You're not allowed to attempt to extract the source code of the
|
||||
app, and you also shouldn't try to translate the app into other
|
||||
languages or make derivative versions. The app itself, and all the
|
||||
trademarks, copyright, database rights, and other intellectual
|
||||
property rights related to it, still belong to Rico Berger.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
Rico Berger is committed to ensuring that the app is as useful and
|
||||
efficient as possible. For that reason, we reserve the right to make
|
||||
changes to the app or to charge for its services, at any time and
|
||||
for any reason. We will never charge you for the app or its services
|
||||
without making it very clear to you exactly what you're paying
|
||||
for.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
The FeedDeck app stores and processes personal data that you have
|
||||
provided to us, to provide my Service. It's your responsibility
|
||||
to keep your phone and access to the app secure. We therefore
|
||||
recommend that you do not jailbreak or root your phone, which is the
|
||||
process of removing software restrictions and limitations imposed by
|
||||
the official operating system of your device. It could make your
|
||||
phone vulnerable to malware/viruses/malicious programs, compromise
|
||||
your phone's security features and it could mean that the
|
||||
FeedDeck app won't work properly or at all.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
You should be aware that there are certain things that Rico Berger
|
||||
will not take responsibility for. Certain functions of the app will
|
||||
require the app to have an active internet connection. The
|
||||
connection can be Wi-Fi or provided by your mobile network provider,
|
||||
but Rico Berger cannot take responsibility for the app not working
|
||||
at full functionality if you don't have access to Wi-Fi, and
|
||||
you don't have any of your data allowance left.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
If you're using the app outside of an area with Wi-Fi, you
|
||||
should remember that the terms of the agreement with your mobile
|
||||
network provider will still apply. As a result, you may be charged
|
||||
by your mobile provider for the cost of data for the duration of the
|
||||
connection while accessing the app, or other third-party charges. In
|
||||
using the app, you're accepting responsibility for any such
|
||||
charges, including roaming data charges if you use the app outside
|
||||
of your home territory (i.e. region or country) without turning off
|
||||
data roaming. If you are not the bill payer for the device on which
|
||||
you're using the app, please be aware that we assume that you
|
||||
have received permission from the bill payer for using the app.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
Along the same lines, Rico Berger cannot always take responsibility
|
||||
for the way you use the app i.e. You need to make sure that your
|
||||
device stays charged – if it runs out of battery and you can't
|
||||
turn it on to avail the Service, Rico Berger cannot accept
|
||||
responsibility.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
With respect to Rico Berger's responsibility for your use of
|
||||
the app, when you're using the app, it's important to bear
|
||||
in mind that although we endeavor to ensure that it is updated and
|
||||
correct at all times, we do rely on third parties to provide
|
||||
information to us so that we can make it available to you. Rico
|
||||
Berger accepts no liability for any loss, direct or indirect, you
|
||||
experience as a result of relying wholly on this functionality of
|
||||
the app.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
At some point, we may wish to update the app. The app is currently
|
||||
available on iOS – the requirements for the system(and for any
|
||||
additional systems we decide to extend the availability of the app
|
||||
to) may change, and you'll need to download the updates if you
|
||||
want to keep using the app. Rico Berger does not promise that it
|
||||
will always update the app so that it is relevant to you and/or
|
||||
works with the iOS version that you have installed on your device.
|
||||
However, you promise to always accept updates to the application
|
||||
when offered to you, We may also wish to stop providing the app, and
|
||||
may terminate use of it at any time without giving notice of
|
||||
termination to you. Unless we tell you otherwise, upon any
|
||||
termination, (a) the rights and licenses granted to you in these
|
||||
terms will end; (b) you must stop using the app, and (if needed)
|
||||
delete it from your device.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">
|
||||
Changes to This Terms and Conditions
|
||||
</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
I may update our Terms and Conditions from time to time. Thus, you
|
||||
are advised to review this page periodically for any changes. I will
|
||||
notify you of any changes by posting the new Terms and Conditions on
|
||||
this page.
|
||||
</p>
|
||||
<p className="py-4">
|
||||
These terms and conditions are effective as of 2023-06-22
|
||||
</p>
|
||||
<p className="py-4">
|
||||
<h2 className="text-xl font-bold">Contact Us</h2>
|
||||
</p>
|
||||
<p className="py-4">
|
||||
If you have any questions or suggestions about my Terms and
|
||||
Conditions, do not hesitate to contact me at{" "}
|
||||
<a
|
||||
className="underline"
|
||||
href="mailto:admin@feeddeck.app?subject=[Terms and Conditions]"
|
||||
>
|
||||
admin@feeddeck.app
|
||||
</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
31
landing/components/download.tsx
Normal file
@@ -0,0 +1,31 @@
|
||||
"use client";
|
||||
|
||||
import { getOSDownload, getOSLabel, getOSName } from "@/helpers/helpers";
|
||||
|
||||
export default function Download() {
|
||||
const osName = getOSName();
|
||||
const osLabel = getOSLabel(osName);
|
||||
const osDownload = getOSDownload(osName);
|
||||
|
||||
if (!osLabel) {
|
||||
return (
|
||||
<a
|
||||
href="/download"
|
||||
className="px-8 py-4 text-lg font-medium text-center text-onsecondary bg-secondary rounded-full border shadow border-black"
|
||||
>
|
||||
Download
|
||||
</a>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<a
|
||||
href={osDownload}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-8 py-4 text-lg font-medium text-center text-onsecondary bg-secondary rounded-full border shadow border-black"
|
||||
>
|
||||
Download for {osLabel}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
159
landing/components/footer.tsx
Normal file
@@ -0,0 +1,159 @@
|
||||
import Link from "next/link";
|
||||
import Image from "next/image";
|
||||
|
||||
export default function Footer() {
|
||||
const navigation = [
|
||||
{
|
||||
title: "Features",
|
||||
href: "/#features",
|
||||
isExternal: false,
|
||||
},
|
||||
{
|
||||
title: "Pricing",
|
||||
href: "/pricing",
|
||||
isExternal: false,
|
||||
},
|
||||
{
|
||||
title: "Download",
|
||||
href: "/download",
|
||||
isExternal: false,
|
||||
},
|
||||
];
|
||||
|
||||
const legal = [
|
||||
{
|
||||
title: "Support",
|
||||
href: "/support",
|
||||
isExternal: false,
|
||||
},
|
||||
{
|
||||
title: "Terms & Conditions",
|
||||
href: "/terms-and-conditions",
|
||||
isExternal: false,
|
||||
},
|
||||
{
|
||||
title: "Privacy Policy",
|
||||
href: "/privacy-policy",
|
||||
isExternal: false,
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div className="relative">
|
||||
<div className="container p-8 mx-auto xl:px-0">
|
||||
<div className="grid max-w-screen-xl grid-cols-1 gap-10 pt-10 mx-auto mt-5 lg:grid-cols-5">
|
||||
<div className="lg:col-span-2">
|
||||
<div>
|
||||
<Link
|
||||
href="/"
|
||||
className="flex items-center space-x-2 text-2xl font-medium"
|
||||
>
|
||||
<Image
|
||||
src="/logo.svg"
|
||||
alt="N"
|
||||
width="32"
|
||||
height="32"
|
||||
className="w-8 rounded-full"
|
||||
/>
|
||||
<span>FeedDeck</span>
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="max-w-md mt-4 text-gray-400">
|
||||
FeedDeck is an open source RSS and social media feed reader,
|
||||
inspired by TweetDeck. FeedDeck allows you to follow your favorite
|
||||
feeds in one place on all platforms.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div className="flex flex-wrap w-full -mt-2 -ml-3 lg:ml-0">
|
||||
{navigation.map((item, index) => (
|
||||
<Link
|
||||
key={index}
|
||||
href={item.href}
|
||||
target={item.isExternal ? "_blank" : undefined}
|
||||
rel={item.isExternal ? "noopener noreferrer" : undefined}
|
||||
className="w-full px-4 py-2 rounded-md hover:text-primary focus:text-primary"
|
||||
>
|
||||
{item.title}
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div className="flex flex-wrap w-full -mt-2 -ml-3 lg:ml-0">
|
||||
{legal.map((item, index) => (
|
||||
<Link
|
||||
key={index}
|
||||
href={item.href}
|
||||
target={item.isExternal ? "_blank" : undefined}
|
||||
rel={item.isExternal ? "noopener noreferrer" : undefined}
|
||||
className="w-full px-4 py-2 rounded-md hover:text-primary focus:text-primary"
|
||||
>
|
||||
{item.title}
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div>Follow us</div>
|
||||
<div className="flex mt-5 space-x-5 text-gray-500">
|
||||
<a
|
||||
href="https://x.com/feeddeckapp"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<span className="sr-only">X</span>
|
||||
<X />
|
||||
</a>
|
||||
<a
|
||||
href="https://github.com/feeddeck/feeddeck"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<span className="sr-only">GitHub</span>
|
||||
<GitHub />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="my-10 text-sm text-center text-gray-400">
|
||||
Copyright © {new Date().getFullYear()}{" "}
|
||||
Rico Berger. All rights reserved.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const X = () => (
|
||||
<svg
|
||||
width="24px"
|
||||
height="24px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="X" transform="matrix(8.90048,0,0,8.90048,-238.533,-230.522)">
|
||||
<path d="M389.2,48L459.8,48L305.6,224.2L487,464L345,464L233.7,318.6L106.5,464L35.8,464L200.7,275.5L26.8,48L172.4,48L272.9,180.9L389.2,48ZM364.4,421.8L403.5,421.8L151.1,88L109.1,88L364.4,421.8Z" />
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
|
||||
const GitHub = () => (
|
||||
<svg
|
||||
width="24px"
|
||||
height="24px"
|
||||
viewBox="0 0 4096 4096"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<g id="GitHub" transform="matrix(8.25806,0,0,8.25806,0,-14.8952)">
|
||||
<path d="M165.9,397.4C165.9,399.4 163.6,401 160.7,401C157.4,401.3 155.1,399.7 155.1,397.4C155.1,395.4 157.4,393.8 160.3,393.8C163.3,393.5 165.9,395.1 165.9,397.4ZM134.8,392.9C134.1,394.9 136.1,397.2 139.1,397.8C141.7,398.8 144.7,397.8 145.3,395.8C145.9,393.8 144,391.5 141,390.6C138.4,389.9 135.5,390.9 134.8,392.9ZM179,391.2C176.1,391.9 174.1,393.8 174.4,396.1C174.7,398.1 177.3,399.4 180.3,398.7C183.2,398 185.2,396.1 184.9,394.1C184.6,392.2 181.9,390.9 179,391.2ZM244.8,8C106.1,8 0,113.3 0,252C0,362.9 69.8,457.8 169.5,491.2C182.3,493.5 186.8,485.6 186.8,479.1C186.8,472.9 186.5,438.7 186.5,417.7C186.5,417.7 116.5,432.7 101.8,387.9C101.8,387.9 90.4,358.8 74,351.3C74,351.3 51.1,335.6 75.6,335.9C75.6,335.9 100.5,337.9 114.2,361.7C136.1,400.3 172.8,389.2 187.1,382.6C189.4,366.6 195.9,355.5 203.1,348.9C147.2,342.7 90.8,334.6 90.8,238.4C90.8,210.9 98.4,197.1 114.4,179.5C111.8,173 103.3,146.2 117,111.6C137.9,105.1 186,138.6 186,138.6C206,133 227.5,130.1 248.8,130.1C270.1,130.1 291.6,133 311.6,138.6C311.6,138.6 359.7,105 380.6,111.6C394.3,146.3 385.8,173 383.2,179.5C399.2,197.2 409,211 409,238.4C409,334.9 350.1,342.6 294.2,348.9C303.4,356.8 311.2,371.8 311.2,395.3C311.2,429 310.9,470.7 310.9,478.9C310.9,485.4 315.5,493.3 328.2,491C428.2,457.8 496,362.9 496,252C496,113.3 383.5,8 244.8,8ZM97.2,352.9C95.9,353.9 96.2,356.2 97.9,358.1C99.5,359.7 101.8,360.4 103.1,359.1C104.4,358.1 104.1,355.8 102.4,353.9C100.8,352.3 98.5,351.6 97.2,352.9ZM86.4,344.8C85.7,346.1 86.7,347.7 88.7,348.7C90.3,349.7 92.3,349.4 93,348C93.7,346.7 92.7,345.1 90.7,344.1C88.7,343.5 87.1,343.8 86.4,344.8ZM118.8,380.4C117.2,381.7 117.8,384.7 120.1,386.6C122.4,388.9 125.3,389.2 126.6,387.6C127.9,386.3 127.3,383.3 125.3,381.4C123.1,379.1 120.1,378.8 118.8,380.4ZM107.4,365.7C105.8,366.7 105.8,369.3 107.4,371.6C109,373.9 111.7,374.9 113,373.9C114.6,372.6 114.6,370 113,367.7C111.6,365.4 109,364.4 107.4,365.7Z" />
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
139
landing/components/header.tsx
Normal file
@@ -0,0 +1,139 @@
|
||||
"use client";
|
||||
|
||||
import Link from "next/link";
|
||||
import Image from "next/image";
|
||||
import { Disclosure } from "@headlessui/react";
|
||||
|
||||
export default function Header() {
|
||||
const navigation = [
|
||||
{
|
||||
title: "Features",
|
||||
href: "/#features",
|
||||
isExternal: false,
|
||||
},
|
||||
{
|
||||
title: "Pricing",
|
||||
href: "/pricing",
|
||||
isExternal: false,
|
||||
},
|
||||
{
|
||||
title: "Download",
|
||||
href: "/download",
|
||||
isExternal: false,
|
||||
},
|
||||
{
|
||||
title: "GitHub",
|
||||
href: "https://github.com/feeddeck/feeddeck",
|
||||
isExternal: true,
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div className="w-full">
|
||||
<nav className="container relative flex flex-wrap items-center justify-between p-8 mx-auto lg:justify-between xl:px-0">
|
||||
<Disclosure>
|
||||
{({ open }) => (
|
||||
<>
|
||||
<div className="flex flex-wrap items-center justify-between w-full lg:w-auto">
|
||||
<Link href="/">
|
||||
<span className="flex items-center space-x-2 text-2xl font-medium">
|
||||
<span>
|
||||
<Image
|
||||
src="/logo.svg"
|
||||
alt="N"
|
||||
width="32"
|
||||
height="32"
|
||||
className="w-8 rounded-full"
|
||||
/>
|
||||
</span>
|
||||
<span>FeedDeck</span>
|
||||
</span>
|
||||
</Link>
|
||||
|
||||
<Disclosure.Button
|
||||
aria-label="Toggle Menu"
|
||||
className="px-2 py-1 ml-auto rounded-md lg:hidden hover:text-primary focus:text-primary"
|
||||
>
|
||||
<svg
|
||||
className="w-6 h-6 fill-current"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
{open && (
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M18.278 16.864a1 1 0 0 1-1.414 1.414l-4.829-4.828-4.828 4.828a1 1 0 0 1-1.414-1.414l4.828-4.829-4.828-4.828a1 1 0 0 1 1.414-1.414l4.829 4.828 4.828-4.828a1 1 0 1 1 1.414 1.414l-4.828 4.829 4.828 4.828z"
|
||||
/>
|
||||
)}
|
||||
{!open && (
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
d="M4 5h16a1 1 0 0 1 0 2H4a1 1 0 1 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2z"
|
||||
/>
|
||||
)}
|
||||
</svg>
|
||||
</Disclosure.Button>
|
||||
|
||||
<Disclosure.Panel className="flex flex-wrap w-full my-5 lg:hidden">
|
||||
<>
|
||||
{navigation.map((item, index) => (
|
||||
<Link
|
||||
key={index}
|
||||
href={item.href}
|
||||
target={item.isExternal ? "_blank" : undefined}
|
||||
rel={item.isExternal
|
||||
? "noopener noreferrer"
|
||||
: undefined}
|
||||
className="w-full px-4 py-2 -ml-4 hover:text-primary focus:text-primary"
|
||||
>
|
||||
{item.title}
|
||||
</Link>
|
||||
))}
|
||||
|
||||
<Link
|
||||
href="https://app.feeddeck.app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="w-full px-6 py-2 mt-3 font-medium text-center text-onprimary bg-primary rounded-full lg:ml-5"
|
||||
>
|
||||
Sign In
|
||||
</Link>
|
||||
</>
|
||||
</Disclosure.Panel>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</Disclosure>
|
||||
|
||||
<div className="hidden text-center lg:flex lg:items-center">
|
||||
<ul className="items-center justify-end flex-1 pt-6 list-none lg:pt-0 lg:flex">
|
||||
{navigation.map((item, index) => (
|
||||
<li className="mr-3 nav__item" key={index}>
|
||||
<Link
|
||||
href={item.href}
|
||||
target={item.isExternal ? "_blank" : undefined}
|
||||
rel={item.isExternal ? "noopener noreferrer" : undefined}
|
||||
className="inline-block px-4 py-2 text-lg font-normal no-underline hover:text-primary focus:text-primary"
|
||||
>
|
||||
{item.title}
|
||||
</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="hidden mr-3 space-x-4 lg:flex nav__item">
|
||||
<Link
|
||||
href="https://app.feeddeck.app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-6 py-2 font-medium text-onprimary bg-primary rounded-full md:ml-5"
|
||||
>
|
||||
Sign In
|
||||
</Link>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
67
landing/helpers/helpers.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
type TPlatform = "ios" | "android";
|
||||
type TOS = "ios" | "android" | "macos" | "windows" | "linux";
|
||||
|
||||
export const downloads = {
|
||||
"ios": "https://github.com/feeddeck/feeddeck",
|
||||
"android": "https://github.com/feeddeck/feeddeck",
|
||||
"web": "https://app.feeddeck.app",
|
||||
"macos": "https://github.com/feeddeck/feeddeck",
|
||||
"windows": "https://github.com/feeddeck/feeddeck",
|
||||
"linux": "https://github.com/feeddeck/feeddeck",
|
||||
};
|
||||
|
||||
const getPlatform = (): TPlatform | undefined => {
|
||||
const userAgent =
|
||||
typeof navigator === "undefined" || typeof window === "undefined"
|
||||
? ""
|
||||
: navigator.userAgent || navigator.vendor || (window as any).opera || "";
|
||||
|
||||
if (/android/i.test(userAgent)) return "android";
|
||||
|
||||
if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) {
|
||||
return "ios";
|
||||
}
|
||||
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const getOSName = (): TOS | undefined => {
|
||||
const os = getPlatform();
|
||||
if (os === "ios" || os === "android") return os;
|
||||
|
||||
const platform = navigator?.userAgentData?.platform.toLowerCase().trim() ||
|
||||
navigator?.platform.toLowerCase().trim();
|
||||
|
||||
if (platform.startsWith("mac")) return "macos";
|
||||
if (platform.startsWith("win")) return "windows";
|
||||
if (platform.startsWith("linux")) return "linux";
|
||||
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const getOSLabel = (os?: TOS): string | undefined => {
|
||||
switch (os) {
|
||||
case "android":
|
||||
return "Android";
|
||||
|
||||
case "ios":
|
||||
return "iOS";
|
||||
|
||||
case "linux":
|
||||
return "Linux";
|
||||
|
||||
case "macos":
|
||||
return "macOS";
|
||||
|
||||
case "windows":
|
||||
return "Windows";
|
||||
|
||||
default:
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
|
||||
export const getOSDownload = (os?: TOS): string | undefined => {
|
||||
if (!os) return undefined;
|
||||
return downloads[os];
|
||||
};
|
||||
106
landing/helpers/metadata.ts
Normal file
@@ -0,0 +1,106 @@
|
||||
import type { Metadata } from "next";
|
||||
|
||||
export const generalMetadata: Metadata = {
|
||||
description: "Follow your RSS and Social Media Feeds",
|
||||
applicationName: "FeedDeck",
|
||||
authors: {
|
||||
name: "Rico Berger",
|
||||
},
|
||||
keywords: ["FeedDeck", "RSS", "Social Media", "Feeds"],
|
||||
themeColor: "#1f2229",
|
||||
metadataBase: process.env.NEXT_PUBLIC_METADATA_BASE
|
||||
? new URL(process.env.NEXT_PUBLIC_METADATA_BASE)
|
||||
: process.env.NODE_ENV === "development"
|
||||
? new URL("http://localhost:3000")
|
||||
: new URL("https://feeddeck.app"),
|
||||
icons: [
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "57x57",
|
||||
url: "/apple-icon-57x57.png",
|
||||
},
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "60x60",
|
||||
url: "/apple-icon-60x60.png",
|
||||
},
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "72x72",
|
||||
url: "/apple-icon-72x72.png",
|
||||
},
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "76x76",
|
||||
url: "/apple-icon-76x76.png",
|
||||
},
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "114x114",
|
||||
url: "/apple-icon-114x114.png",
|
||||
},
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "120x120",
|
||||
url: "/apple-icon-120x120.png",
|
||||
},
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "144x144",
|
||||
url: "/apple-icon-144x144.png",
|
||||
},
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "152x152",
|
||||
url: "/apple-icon-152x152.png",
|
||||
},
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "180x180",
|
||||
url: "/apple-icon-180x180.png",
|
||||
},
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/png",
|
||||
sizes: "192x192",
|
||||
url: "/android-icon-192x192.png",
|
||||
},
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/png",
|
||||
sizes: "32x32",
|
||||
url: "/favicon-32x32.png",
|
||||
},
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/png",
|
||||
sizes: "96x96",
|
||||
url: "/favicon-96x96.png",
|
||||
},
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/png",
|
||||
sizes: "16x16",
|
||||
url: "/favicon-16x16.png",
|
||||
},
|
||||
],
|
||||
manifest: "/manifest.json",
|
||||
openGraph: {
|
||||
title: "FeedDeck",
|
||||
siteName: "FeedDeck",
|
||||
description: "Follow your RSS and Social Media Feeds",
|
||||
images: {
|
||||
url: "/og.png",
|
||||
},
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
site: "@feeddeck",
|
||||
creator: "@feeddeck",
|
||||
title: "FeedDeck",
|
||||
description: "Follow your RSS and Social Media Feeds",
|
||||
images: {
|
||||
url: "/og.png",
|
||||
},
|
||||
},
|
||||
};
|
||||
9
landing/next.config.js
Normal file
@@ -0,0 +1,9 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
output: "export",
|
||||
images: {
|
||||
unoptimized: true,
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = nextConfig;
|
||||
4177
landing/package-lock.json
generated
Normal file
26
landing/package.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "landing",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@headlessui/react": "^1.7.15",
|
||||
"@types/node": "20.3.1",
|
||||
"@types/react": "18.2.13",
|
||||
"@types/react-dom": "18.2.6",
|
||||
"autoprefixer": "10.4.14",
|
||||
"eslint": "8.43.0",
|
||||
"eslint-config-next": "13.4.6",
|
||||
"next": "13.4.6",
|
||||
"postcss": "8.4.24",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0",
|
||||
"tailwindcss": "3.3.2",
|
||||
"typescript": "5.1.3"
|
||||
}
|
||||
}
|
||||
6
landing/postcss.config.js
Normal file
@@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
};
|
||||
BIN
landing/public/android-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
landing/public/apple-icon-114x114.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
landing/public/apple-icon-120x120.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
landing/public/apple-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
landing/public/apple-icon-152x152.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
landing/public/apple-icon-180x180.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
landing/public/apple-icon-57x57.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
landing/public/apple-icon-60x60.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
landing/public/apple-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
landing/public/apple-icon-76x76.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
landing/public/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 622 B |
BIN
landing/public/favicon-256x256.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
landing/public/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
landing/public/favicon-96x96.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
landing/public/favicon.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
landing/public/feature-1.webp
Normal file
|
After Width: | Height: | Size: 575 KiB |
BIN
landing/public/feature-2.webp
Normal file
|
After Width: | Height: | Size: 383 KiB |
BIN
landing/public/feature-3.webp
Normal file
|
After Width: | Height: | Size: 354 KiB |
BIN
landing/public/feature-4.webp
Normal file
|
After Width: | Height: | Size: 321 KiB |
BIN
landing/public/feature-5.webp
Normal file
|
After Width: | Height: | Size: 370 KiB |
BIN
landing/public/feature-6.webp
Normal file
|
After Width: | Height: | Size: 180 KiB |
BIN
landing/public/hero-1.webp
Normal file
|
After Width: | Height: | Size: 851 KiB |
12
landing/public/logo.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 4096 4096" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g id="icon-ios">
|
||||
<g id="bg" transform="matrix(15.1952,0,0,14.3931,-4855.96,-6812.52)">
|
||||
<rect x="319.572" y="473.317" width="269.559" height="284.58" style="fill:rgb(73,211,180);"/>
|
||||
</g>
|
||||
<g id="fg" transform="matrix(13.9727,0,0,13.446,-2873.3,-2822.71)">
|
||||
<path d="M443.567,272.226C438.383,276.258 434.063,278.274 430.607,278.274C423.695,278.274 416.783,274.146 409.871,265.89L369.263,293.826C362.927,298.434 359.759,304.194 359.759,311.106L359.759,429.186L359.471,429.474C359.471,432.354 358.559,435.234 356.735,438.114C354.911,440.994 352.943,442.434 350.831,442.434L350.255,442.434L350.255,439.554L347.951,442.722C345.071,442.53 337.583,439.17 325.487,432.642L325.487,432.93C313.199,425.826 302.927,422.274 294.671,422.274C286.223,422.274 278.447,425.442 271.343,431.778C268.079,434.658 265.439,438.162 263.423,442.29C261.407,446.418 260.111,451.266 259.535,456.834C263.759,451.842 268.943,449.058 275.087,448.482C276.239,448.482 277.007,448.386 277.391,448.194L277.967,448.194C282.191,448.194 290.351,450.594 302.447,455.394C308.207,457.698 315.215,458.85 323.471,458.85C334.991,458.85 347.471,455.778 360.911,449.634C376.271,442.53 385.871,434.082 389.711,424.29C390.287,422.946 390.575,421.602 390.575,420.258L390.863,370.722L410.735,370.722L410.735,431.778L421.391,431.778L421.391,301.314C425.231,300.354 428.687,298.482 431.759,295.698C434.831,292.914 437.807,289.314 440.687,284.898C443.183,281.058 444.431,278.274 444.431,276.546L444.719,276.258C444.719,275.49 444.911,274.53 445.295,273.378L443.567,272.226ZM356.015,297.282C350.447,298.242 345.503,299.874 341.183,302.178C336.863,304.482 332.975,307.266 329.519,310.53C321.647,317.634 317.711,326.562 317.711,337.314L317.711,338.754L317.999,339.042L317.999,340.194C317.231,340.194 316.655,340.098 316.271,339.906L313.679,339.906C298.127,339.906 290.351,347.874 290.351,363.81C290.351,368.418 291.695,372.498 294.383,376.05C297.071,379.602 300.719,381.378 305.327,381.378L305.327,379.362L305.039,379.074L305.039,377.922L304.751,377.634C304.751,373.218 308.015,371.01 314.543,371.01L316.559,371.01L317.135,371.298L318.287,371.298L318.287,413.634C318.095,414.018 317.951,414.498 317.855,415.074C317.759,415.65 317.615,416.13 317.423,416.514C317.039,417.282 316.703,418.194 316.415,419.25C316.127,420.306 315.887,421.026 315.695,421.41L318.575,421.41L319.151,421.122L319.727,421.122L320.015,420.834C322.703,420.834 326.351,419.202 330.959,415.938C344.399,407.106 351.119,396.93 351.119,385.41L351.119,310.818C351.119,308.706 351.647,306.45 352.703,304.05C353.759,301.65 355.055,300.162 356.591,299.586L356.015,297.282ZM375.023,266.754C370.415,270.978 365.231,273.09 359.471,273.09C351.407,273.09 345.647,272.226 342.191,270.498L341.615,270.498L341.327,270.21C338.063,269.634 335.375,269.106 333.263,268.626C331.151,268.146 329.615,267.81 328.655,267.618L325.775,267.618C320.207,267.042 317.231,266.562 316.847,266.178L314.831,267.042C298.319,267.426 286.799,273.186 280.271,284.322C277.391,289.314 275.951,293.73 275.951,297.57L275.951,300.162C282.671,295.938 286.991,293.826 288.911,293.826L290.063,293.826L290.351,293.538C294.767,293.538 302.063,294.594 312.239,296.706C321.839,298.818 329.039,299.874 333.839,299.874L334.127,300.162L335.279,300.162C344.687,300.162 353.615,297.09 362.063,290.946C371.087,284.418 376.079,276.642 377.039,267.618L375.023,266.754ZM409.583,301.89C409.775,301.89 409.919,301.938 410.015,302.034C410.111,302.13 410.351,302.082 410.735,301.89L410.735,340.482L390.863,340.482L390.863,294.402C397.967,299.394 404.207,301.89 409.583,301.89Z" style="fill:rgb(31,34,41);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
41
landing/public/manifest.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "App",
|
||||
"icons": [
|
||||
{
|
||||
"src": "\/android-icon-36x36.png",
|
||||
"sizes": "36x36",
|
||||
"type": "image\/png",
|
||||
"density": "0.75"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-48x48.png",
|
||||
"sizes": "48x48",
|
||||
"type": "image\/png",
|
||||
"density": "1.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-72x72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image\/png",
|
||||
"density": "1.5"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-96x96.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image\/png",
|
||||
"density": "2.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-144x144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image\/png",
|
||||
"density": "3.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image\/png",
|
||||
"density": "4.0"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
landing/public/og.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
21
landing/tailwind.config.js
Normal file
@@ -0,0 +1,21 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: [
|
||||
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
|
||||
"./components/**/*.{js,ts,jsx,tsx,mdx}",
|
||||
"./app/**/*.{js,ts,jsx,tsx,mdx}",
|
||||
],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
primary: "#49d3b4",
|
||||
onprimary: "#1f2229",
|
||||
secondary: "#353a46",
|
||||
onsecondary: "#e2e4e9",
|
||||
background: "#1f2229",
|
||||
onbackground: "#e2e4e9",
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [],
|
||||
};
|
||||
34
landing/tsconfig.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "node",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
"name": "next"
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"@/*": ["./*"]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"next-env.d.ts",
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
".next/types/**/*.ts",
|
||||
"typings.d.ts"
|
||||
],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
47
landing/typings.d.ts
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
// The following typings are required to use "navigator?.userAgentData?.platform" to detect the operating system of the
|
||||
// client.
|
||||
//
|
||||
// Source: https://github.com/lukewarlow/user-agent-data-types
|
||||
// WICG Spec: https://wicg.github.io/ua-client-hints
|
||||
|
||||
declare interface Navigator extends NavigatorUA {}
|
||||
declare interface WorkerNavigator extends NavigatorUA {}
|
||||
|
||||
// https://wicg.github.io/ua-client-hints/#navigatorua
|
||||
declare interface NavigatorUA {
|
||||
readonly userAgentData?: NavigatorUAData;
|
||||
}
|
||||
|
||||
// https://wicg.github.io/ua-client-hints/#dictdef-navigatoruabrandversion
|
||||
interface NavigatorUABrandVersion {
|
||||
readonly brand: string;
|
||||
readonly version: string;
|
||||
}
|
||||
|
||||
// https://wicg.github.io/ua-client-hints/#dictdef-uadatavalues
|
||||
interface UADataValues {
|
||||
readonly brands?: NavigatorUABrandVersion[];
|
||||
readonly mobile?: boolean;
|
||||
readonly platform?: string;
|
||||
readonly architecture?: string;
|
||||
readonly bitness?: string;
|
||||
readonly model?: string;
|
||||
readonly platformVersion?: string;
|
||||
/** @deprecated in favour of fullVersionList */
|
||||
readonly uaFullVersion?: string;
|
||||
readonly fullVersionList?: NavigatorUABrandVersion[];
|
||||
readonly wow64?: boolean;
|
||||
}
|
||||
|
||||
// https://wicg.github.io/ua-client-hints/#dictdef-ualowentropyjson
|
||||
interface UALowEntropyJSON {
|
||||
readonly brands: NavigatorUABrandVersion[];
|
||||
readonly mobile: boolean;
|
||||
readonly platform: string;
|
||||
}
|
||||
|
||||
// https://wicg.github.io/ua-client-hints/#navigatoruadata
|
||||
interface NavigatorUAData extends UALowEntropyJSON {
|
||||
getHighEntropyValues(hints: string[]): Promise<UADataValues>;
|
||||
toJSON(): UALowEntropyJSON;
|
||||
}
|
||||